From 71f20823ffcccf35f47a39379ba9501c08e430a3 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Fri, 31 May 2024 16:01:40 +0200 Subject: [PATCH 01/55] first-init --- src/for_2D_build/common/data_type.h | 1 + src/for_2D_build/geometries/level_set_2d.cpp | 298 ++++++++++----- .../meshes/mesh_with_data_packages.hpp | 342 +++++++++-------- src/for_3D_build/common/data_type.h | 1 + src/for_3D_build/geometries/level_set_3d.cpp | 267 ++++++++----- .../meshes/mesh_with_data_packages.hpp | 356 ++++++++++-------- src/shared/common/sph_data_containers.h | 4 +- src/shared/geometries/level_set.cpp | 98 +---- src/shared/geometries/level_set.h | 17 +- src/shared/meshes/mesh_with_data_packages.h | 321 ++++++---------- src/shared/variables/base_variable.h | 28 ++ 11 files changed, 939 insertions(+), 794 deletions(-) diff --git a/src/for_2D_build/common/data_type.h b/src/for_2D_build/common/data_type.h index f85144b0d6..43118fd7d7 100644 --- a/src/for_2D_build/common/data_type.h +++ b/src/for_2D_build/common/data_type.h @@ -42,6 +42,7 @@ using AngularVecd = Real; using Rotation = Rotation2d; using BoundingBox = BaseBoundingBox; using Transform = BaseTransform; +using Neighbourhood = std::array, 3>; template using PackageDataMatrix = std::array, array_size>; diff --git a/src/for_2D_build/geometries/level_set_2d.cpp b/src/for_2D_build/geometries/level_set_2d.cpp index a17c7210f6..9dbb84c924 100644 --- a/src/for_2D_build/geometries/level_set_2d.cpp +++ b/src/for_2D_build/geometries/level_set_2d.cpp @@ -22,15 +22,15 @@ LevelSet::LevelSet(BoundingBox tentative_bounds, Real data_spacing, finishDataPackages(); } //=================================================================================================// -void LevelSet::initializeDataForSingularPackage(LevelSetDataPackage *data_pkg, Real far_field_level_set) +void LevelSet::initializeDataForSingularPackage(const size_t package_index, Real far_field_level_set) { - auto &phi = data_pkg->getPackageData(phi_); - auto &near_interface_id = data_pkg->getPackageData(near_interface_id_); - auto &phi_gradient = data_pkg->getPackageData(phi_gradient_); - auto &kernel_weight = data_pkg->getPackageData(kernel_weight_); - auto &kernel_gradient = data_pkg->getPackageData(kernel_gradient_); + auto &phi = phi_.DataField()[package_index]; + auto &near_interface_id = near_interface_id_.DataField()[package_index]; + auto &phi_gradient = phi_gradient_.DataField()[package_index]; + auto &kernel_weight = kernel_weight_.DataField()[package_index]; + auto &kernel_gradient = kernel_gradient_.DataField()[package_index]; - data_pkg->for_each_data( + for_each_cell_data( [&](int i, int j) { phi[i][j] = far_field_level_set; @@ -49,20 +49,105 @@ void LevelSet::finishDataPackages() tagACellIsInnerPackage(Arrayi(i, j)); }); + initializeIndexMesh(); + initializeNeighbourhood(); + resizeMeshVariableData(); mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), [&](size_t i, size_t j) { - initializePackageAddressesInACell(Arrayi(i, j)); + Arrayi cell_index = Arrayi(i, j); + if(isInnerDataPackage(cell_index)) + { + initializeBasicDataForAPackage(Arrayi(i, j), PackageIndexFromCellIndex(cell_index), shape_); + } }); updateLevelSetGradient(); updateKernelIntegrals(); } //=================================================================================================// +// void LevelSet::initializeDataInACell(const Arrayi &cell_index) +// { +// Vecd cell_position = CellPositionFromIndex(cell_index); +// Real signed_distance = shape_.findSignedDistance(cell_position); +// Vecd normal_direction = shape_.findNormalDirection(cell_position); +// Real measure = (signed_distance * normal_direction).cwiseAbs().maxCoeff(); +// if (measure < grid_spacing_) +// { +// assignCore(cell_index); +// } +// else +// { +// size_t package_index = shape_.checkContain(cell_position) ? 0 : 1; +// assignSingular(cell_index); +// assignDataPackageIndex(cell_index, package_index); +// } +// } +// //=================================================================================================// +// void LevelSet::tagACellIsInnerPackage(const Arrayi &cell_index) +// { +// if (isInnerPackage(cell_index)) +// { +// if (!isCoreDataPackage(cell_index)) +// { +// assignInner(cell_index); +// } +// } +// } +//=================================================================================================// +void LevelSet::updateKernelIntegrals() +{ + mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), + [&](size_t i, size_t j) + { + Arrayi cell_index = Arrayi(i, j); + if (isInnerDataPackage(cell_index)){ + assignByPosition( + kernel_weight_, cell_index, [&](const Vecd &position) -> Real + { return computeKernelIntegral(position); }); + assignByPosition( + kernel_gradient_, cell_index, [&](const Vecd &position) -> Vecd + { return computeKernelGradientIntegral(position); }); + } + }); +} +//=================================================================================================// +void LevelSet::initializeIndexMesh() +{ + mesh_for(MeshRange(Arrayi::Zero(), all_cells_), + [&](size_t i, size_t j) + { + Arrayi cell_index = Arrayi(i, j); + if (isInnerDataPackage(cell_index)) + { + assignDataPackageIndex(Arrayi(i, j), num_grid_pkgs_++); + } + }); +} +//=================================================================================================// +void LevelSet::initializeNeighbourhood() +{ + neighbourhood_ = new Neighbourhood[num_grid_pkgs_]; + mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), + [&](size_t i, size_t j) + { + Arrayi cell_index = Arrayi(i, j); + if (isInnerDataPackage(cell_index)) + { + Neighbourhood ¤t = neighbourhood_[PackageIndexFromCellIndex(cell_index)]; + for(int l = -1; l < 2; l++) + for(int m = -1; m < 2; m++) + { + current[l+1][m+1] = PackageIndexFromCellIndex(cell_index+Arrayi(l, m)); + } + } + }); +} +//=================================================================================================// bool LevelSet::isWithinCorePackage(Vecd position) { Arrayi cell_index = CellIndexFromPosition(position); - return data_pkg_addrs_[cell_index[0]][cell_index[1]]->isCorePackage(); + return isCoreDataPackage(cell_index); } //=============================================================================================// bool LevelSet::isInnerPackage(const Arrayi &cell_index) @@ -72,63 +157,75 @@ bool LevelSet::isInnerPackage(const Arrayi &cell_index) all_cells_.min(cell_index + 2 * Array2i::Ones()), [&](int l, int m) { - return data_pkg_addrs_[l][m]->isCorePackage(); + return isCoreDataPackage(Arrayi(l, m)); }); } //=================================================================================================// void LevelSet::diffuseLevelSetSign() { - package_parallel_for( - inner_data_pkgs_, - [&](LevelSetDataPackage *data_pkg) - { - auto &phi_addrs = data_pkg->getPackageDataAddress(phi_); - auto &near_interface_id_addrs = data_pkg->getPackageDataAddress(near_interface_id_); + package_parallel_for([&](size_t package_index) + { + auto phi_data = phi_.DataField(); + auto near_interface_id_data = near_interface_id_.DataField(); + auto &neighbourhood = neighbourhood_[package_index]; - data_pkg->for_each_addrs( - [&](int i, int j) - { - // near interface cells are not considered - if (abs(*near_interface_id_addrs[i][j]) > 1) + for_each_cell_data( + [&](int i, int j) { - mesh_find_if2d<-1, 2>( - [&](int l, int m) -> bool - { - int near_interface_id = *near_interface_id_addrs[i + l][j + m]; - bool is_found = abs(near_interface_id) == 1; - if (is_found) + // near interface cells are not considered + if (abs(near_interface_id_data[package_index][i][j]) > 1) + { + mesh_find_if2d<-1, 2>( + [&](int l, int m) -> bool { - Real phi_0 = *phi_addrs[i][j]; - *near_interface_id_addrs[i][j] = near_interface_id; - *phi_addrs[i][j] = near_interface_id == 1 ? fabs(phi_0) : -fabs(phi_0); - } - return is_found; - }); - } - }); - }); + NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i+l, j+m), neighbourhood); + int near_interface_id = near_interface_id_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]]; + bool is_found = abs(near_interface_id) == 1; + if (is_found) + { + Real phi_0 = phi_data[package_index][i][j]; + near_interface_id_data[package_index][i][j] = near_interface_id; + phi_data[package_index][i][j] = near_interface_id == 1 ? fabs(phi_0) : -fabs(phi_0); + } + return is_found; + }); + } + }); + }); } //=============================================================================================// void LevelSet::reinitializeLevelSet() { - package_parallel_for( - inner_data_pkgs_, - [&](LevelSetDataPackage *data_pkg) + // mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), + // [&](size_t i, size_t j) + // { + // Arrayi cell_index = Arrayi(i, j); + // if (isInnerDataPackage(cell_index)){ + // size_t package_index = PackageIndexFromCellIndex(cell_index); + package_parallel_for([&](size_t package_index) { - auto &phi_addrs = data_pkg->getPackageDataAddress(phi_); - auto &near_interface_id_addrs = data_pkg->getPackageDataAddress(near_interface_id_); + auto phi_data = phi_.DataField(); + auto &phi_addrs = phi_data[package_index]; + auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; + auto &neighbourhood = neighbourhood_[package_index]; - data_pkg->for_each_addrs( + for_each_cell_data( [&](int i, int j) { // only reinitialize non cut cells - if (*near_interface_id_addrs[i][j] != 0) + if (near_interface_id_addrs[i][j] != 0) { - Real phi_0 = *phi_addrs[i][j]; + Real phi_0 = phi_addrs[i][j]; Real sign = phi_0 / sqrt(phi_0 * phi_0 + data_spacing_ * data_spacing_); - Real dv_x = upwindDifference(sign, *phi_addrs[i + 1][j] - phi_0, phi_0 - *phi_addrs[i - 1][j]); - Real dv_y = upwindDifference(sign, *phi_addrs[i][j + 1] - phi_0, phi_0 - *phi_addrs[i][j - 1]); - *phi_addrs[i][j] -= 0.5 * sign * (Vec2d(dv_x, dv_y).norm() - data_spacing_); + NeighbourIndex x1 = NeighbourIndexShift(Arrayi(i+1, j), neighbourhood); + NeighbourIndex x2 = NeighbourIndexShift(Arrayi(i-1, j), neighbourhood); + NeighbourIndex y1 = NeighbourIndexShift(Arrayi(i, j+1), neighbourhood); + NeighbourIndex y2 = NeighbourIndexShift(Arrayi(i, j-1), neighbourhood); + Real dv_x = upwindDifference(sign, phi_data[x1.first][x1.second[0]][x1.second[1]] - phi_0, + phi_0 - phi_data[x2.first][x2.second[0]][x2.second[1]]); + Real dv_y = upwindDifference(sign, phi_data[y1.first][y1.second[0]][y1.second[1]] - phi_0, + phi_0 - phi_data[y2.first][y2.second[0]][y2.second[1]]); + phi_addrs[i][j] -= 0.5 * sign * (Vec2d(dv_x, dv_y).norm() - data_spacing_); } }); }); @@ -138,26 +235,31 @@ void LevelSet::markNearInterface(Real small_shift_factor) { Real small_shift = small_shift_factor * data_spacing_; - package_parallel_for( - inner_data_pkgs_, - [&](LevelSetDataPackage *data_pkg) + // mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), + // [&](size_t i, size_t j) + // { + // Arrayi cell_index = Arrayi(i, j); + // if (isInnerDataPackage(cell_index)){ + // size_t package_index = PackageIndexFromCellIndex(cell_index); + package_parallel_for([&](size_t package_index) { - auto &phi_addrs = data_pkg->getPackageDataAddress(phi_); - auto &near_interface_id_addrs = data_pkg->getPackageDataAddress(near_interface_id_); + auto &phi_addrs = phi_.DataField()[package_index]; + auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; + auto neighbourhood = neighbourhood_[package_index]; // corner averages, note that the first row and first column are not used - LevelSetDataPackage::PackageTemporaryData corner_averages; - mesh_for_each2d<1, pkg_addrs_size>( + PackageTemporaryData corner_averages; + mesh_for_each2d<0, pkg_size + 1>( [&](int i, int j) { - corner_averages[i][j] = data_pkg->CornerAverage(phi_addrs, Arrayi(i, j), Arrayi(-1, -1)); + corner_averages[i][j] = CornerAverage(phi_, Arrayi(i, j), Arrayi(-1, -1), neighbourhood); }); - data_pkg->for_each_addrs( + for_each_cell_data( [&](int i, int j) { // first assume far cells - Real phi_0 = *phi_addrs[i][j]; + Real phi_0 = phi_addrs[i][j]; int near_interface_id = phi_0 > 0.0 ? 2 : -2; if (fabs(phi_0) < small_shift) { @@ -183,35 +285,48 @@ void LevelSet::markNearInterface(Real small_shift_factor) }); } // assign this to package - *near_interface_id_addrs[i][j] = near_interface_id; + near_interface_id_addrs[i][j] = near_interface_id; }); }); } //=================================================================================================// -void LevelSet::initializeBasicDataForAPackage(LevelSetDataPackage *data_pkg, Shape &shape) +void LevelSet::initializeBasicDataForAPackage(const Arrayi &cell_index, const size_t package_index, Shape &shape) { - auto &phi = data_pkg->getPackageData(phi_); - auto &near_interface_id = data_pkg->getPackageData(near_interface_id_); - data_pkg->for_each_data( + // size_t package_index = PackageIndexFromCellIndex(cell_index); + auto &phi = phi_.DataField()[package_index]; + auto &near_interface_id = near_interface_id_.DataField()[package_index]; + for_each_cell_data( [&](int i, int j) { - Vec2d position = data_pkg->DataPositionFromIndex(Vec2d(i, j)); + Vec2d position = DataPositionFromIndex(cell_index, Vec2d(i, j)); phi[i][j] = shape.findSignedDistance(position); near_interface_id[i][j] = phi[i][j] < 0.0 ? -2 : 2; }); } //=================================================================================================// -void LevelSet::redistanceInterfaceForAPackage(LevelSetDataPackage *core_data_pkg) +void LevelSet::redistanceInterface() +{ + mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), + [&](size_t i, size_t j) + { + Arrayi cell_index = Arrayi(i, j); + if (isCoreDataPackage(cell_index)) + { + redistanceInterfaceForAPackage(PackageIndexFromCellIndex(cell_index)); + } + }); +} +//=================================================================================================// +void LevelSet::redistanceInterfaceForAPackage(const size_t package_index) { - int l = (int)core_data_pkg->CellIndexOnMesh()[0]; - int m = (int)core_data_pkg->CellIndexOnMesh()[1]; - auto &phi_addrs = core_data_pkg->getPackageDataAddress(phi_); - auto &near_interface_id_addrs = core_data_pkg->getPackageDataAddress(near_interface_id_); + auto phi_data = phi_.DataField(); + auto near_interface_id_data = near_interface_id_.DataField(); + auto &neighbourhood = neighbourhood_[package_index]; - core_data_pkg->for_each_addrs( + for_each_cell_data( [&](int i, int j) { - int near_interface_id = *near_interface_id_addrs[i][j]; + int near_interface_id = near_interface_id_data[package_index][i][j]; if (near_interface_id == 0) { bool positive_band = false; @@ -219,7 +334,8 @@ void LevelSet::redistanceInterfaceForAPackage(LevelSetDataPackage *core_data_pkg mesh_for_each2d<-1, 2>( [&](int r, int s) { - int neighbor_near_interface_id = *near_interface_id_addrs[i + r][j + s]; + NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i+r, j+s), neighbourhood); + int neighbor_near_interface_id = near_interface_id_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]]; if (neighbor_near_interface_id >= 1) positive_band = true; if (neighbor_near_interface_id <= -1) @@ -231,25 +347,23 @@ void LevelSet::redistanceInterfaceForAPackage(LevelSetDataPackage *core_data_pkg mesh_for_each2d<-4, 5>( [&](int x, int y) { - std::pair x_pair = CellShiftAndDataIndex(i + x); - std::pair y_pair = CellShiftAndDataIndex(j + y); - LevelSetDataPackage *neighbor_pkg = data_pkg_addrs_[l + x_pair.first][m + y_pair.first]; - auto &neighbor_phi = neighbor_pkg->getPackageData(phi_); - auto &neighbor_phi_gradient = neighbor_pkg->getPackageData(phi_gradient_); - auto &neighbor_near_interface_id = neighbor_pkg->getPackageData(near_interface_id_); - if (neighbor_near_interface_id[x_pair.second][y_pair.second] >= 1) + NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i+x, j+y), neighbourhood); + auto &neighbor_phi = phi_.DataField()[neighbour_index.first]; + auto &neighbor_phi_gradient = phi_gradient_.DataField()[neighbour_index.first]; + auto &neighbor_near_interface_id = near_interface_id_.DataField()[neighbour_index.first]; + if (neighbor_near_interface_id[neighbour_index.second[0]][neighbour_index.second[1]] >= 1) { - Real phi_p_ = neighbor_phi[x_pair.second][y_pair.second]; - Vecd norm_to_face = neighbor_phi_gradient[x_pair.second][y_pair.second]; + Real phi_p_ = neighbor_phi[neighbour_index.second[0]][neighbour_index.second[1]]; + Vecd norm_to_face = neighbor_phi_gradient[neighbour_index.second[0]][neighbour_index.second[1]]; norm_to_face /= norm_to_face.norm() + TinyReal; min_distance_p = SMIN(min_distance_p, (Vecd((Real)x, (Real)y) * data_spacing_ + phi_p_ * norm_to_face).norm()); } }); - *phi_addrs[i][j] = -min_distance_p; + phi_data[package_index][i][j] = -min_distance_p; // this immediate switch of near interface id // does not intervening with the identification of unresolved interface // based on the assumption that positive false_and negative bands are not close to each other - *near_interface_id_addrs[i][j] = -1; + near_interface_id_data[package_index][i][j] = -1; } if (negative_band == false) { @@ -257,25 +371,23 @@ void LevelSet::redistanceInterfaceForAPackage(LevelSetDataPackage *core_data_pkg mesh_for_each2d<-4, 5>( [&](int x, int y) { - std::pair x_pair = CellShiftAndDataIndex(i + x); - std::pair y_pair = CellShiftAndDataIndex(j + y); - LevelSetDataPackage *neighbor_pkg = data_pkg_addrs_[l + x_pair.first][m + y_pair.first]; - auto &neighbor_phi = neighbor_pkg->getPackageData(phi_); - auto &neighbor_phi_gradient = neighbor_pkg->getPackageData(phi_gradient_); - auto &neighbor_near_interface_id = neighbor_pkg->getPackageData(near_interface_id_); - if (neighbor_near_interface_id[x_pair.second][y_pair.second] <= -1) + NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i+x, j+y), neighbourhood); + auto &neighbor_phi = phi_.DataField()[neighbour_index.first]; + auto &neighbor_phi_gradient = phi_gradient_.DataField()[neighbour_index.first]; + auto &neighbor_near_interface_id = near_interface_id_.DataField()[neighbour_index.first]; + if (neighbor_near_interface_id[neighbour_index.second[0]][neighbour_index.second[1]] <= -1) { - Real phi_n_ = neighbor_phi[x_pair.second][y_pair.second]; - Vecd norm_to_face = neighbor_phi_gradient[x_pair.second][y_pair.second]; + Real phi_n_ = neighbor_phi[neighbour_index.second[0]][neighbour_index.second[1]]; + Vecd norm_to_face = neighbor_phi_gradient[neighbour_index.second[0]][neighbour_index.second[1]]; norm_to_face /= norm_to_face.norm() + TinyReal; min_distance_n = SMIN(min_distance_n, (Vecd((Real)x, (Real)y) * data_spacing_ - phi_n_ * norm_to_face).norm()); } }); - *phi_addrs[i][j] = min_distance_n; + phi_data[package_index][i][j] = min_distance_n; // this immediate switch of near interface id // does not intervening with the identification of unresolved interface // based on the assumption that positive false_and negative bands are not close to each other - *near_interface_id_addrs[i][j] = 1; + near_interface_id_data[package_index][i][j] = 1; } } }); diff --git a/src/for_2D_build/meshes/mesh_with_data_packages.hpp b/src/for_2D_build/meshes/mesh_with_data_packages.hpp index 6c4b08f55a..1c835bd566 100644 --- a/src/for_2D_build/meshes/mesh_with_data_packages.hpp +++ b/src/for_2D_build/meshes/mesh_with_data_packages.hpp @@ -13,10 +13,64 @@ namespace SPH { //=================================================================================================// -template +template +template +DataType MeshWithGridDataPackages:: + DataValueFromGlobalIndex(MeshVariable &mesh_variable, + const Arrayi &global_grid_index) +{ + Arrayi cell_index_on_mesh_ = Arrayi::Zero(); + Arrayi local_data_index = Arrayi::Zero(); + for (int n = 0; n != 2; n++) + { + size_t cell_index_in_this_direction = global_grid_index[n] / pkg_size; + cell_index_on_mesh_[n] = cell_index_in_this_direction; + local_data_index[n] = global_grid_index[n] - cell_index_in_this_direction * pkg_size; + } + size_t package_index = PackageIndexFromCellIndex(cell_index_on_mesh_); + auto &data = mesh_variable.DataField()[package_index]; + return data[local_data_index[0]][local_data_index[1]]; +} +//=================================================================================================// +template +void MeshWithGridDataPackages::allocateIndexDataMatrix() +{ + Allocate2dArray(data_pkg_idx_, all_cells_); +} +//=================================================================================================// +template +void MeshWithGridDataPackages::deleteIndexDataMatrix() +{ + Delete2dArray(data_pkg_idx_, all_cells_); +} +//=================================================================================================// +template +void MeshWithGridDataPackages::allocateMetaDataMatrix() +{ + Allocate2dArray(meta_data_mesh_, all_cells_); +} +//=================================================================================================// +template +void MeshWithGridDataPackages::deleteMetaDataMatrix() +{ + Delete2dArray(meta_data_mesh_, all_cells_); +} +//=================================================================================================// +template +template +DataType MeshWithGridDataPackages:: + probeMesh(MeshVariable &mesh_variable, const Vecd &position) +{ + Arrayi grid_index = CellIndexFromPosition(position); + size_t package_index = PackageIndexFromCellIndex(grid_index); + return isInnerDataPackage(grid_index) ? probeDataPackage(mesh_variable, package_index, grid_index, position) + : mesh_variable.DataField()[package_index][0][0]; +} +//=================================================================================================// +template template -void GridDataPackage:: - for_each_data(const FunctionOnData &function) +void MeshWithGridDataPackages:: + for_each_cell_data(const FunctionOnData &function) { for (int i = 0; i != pkg_size; ++i) for (int j = 0; j != pkg_size; ++j) @@ -25,199 +79,175 @@ void GridDataPackage:: } } //=================================================================================================// -template -template -void GridDataPackage:: - for_each_addrs(const FunctionOnAddress &function) +template +void MeshWithGridDataPackages:: + assignDataPackageIndex(const Arrayi &cell_index, const size_t package_index) { - for (int i = pkg_addrs_buffer; i != pkg_ops_end; ++i) - for (int j = pkg_addrs_buffer; j != pkg_ops_end; ++j) - { - function(i, j); - } + MetaData &metadata = meta_data_mesh_[cell_index[0]][cell_index[1]]; + metadata.second = package_index; } //=================================================================================================// -template -template -DataType GridDataPackage:: - probeDataPackage(PackageDataAddress &pkg_data_addrs, const Vecd &position) +template +size_t MeshWithGridDataPackages:: + PackageIndexFromCellIndex(const Arrayi &cell_index) { - Arrayi grid_idx = CellIndexFromPosition(position); - Vecd grid_pos = GridPositionFromIndex(grid_idx); - Vecd alpha = (position - grid_pos) / grid_spacing_; - Vecd beta = Vecd::Ones() - alpha; - - DataType bilinear = *pkg_data_addrs[grid_idx[0]][grid_idx[1]] * beta[0] * beta[1] + - *pkg_data_addrs[grid_idx[0] + 1][grid_idx[1]] * alpha[0] * beta[1] + - *pkg_data_addrs[grid_idx[0]][grid_idx[1] + 1] * beta[0] * alpha[1] + - *pkg_data_addrs[grid_idx[0] + 1][grid_idx[1] + 1] * alpha[0] * alpha[1]; - - return bilinear; + MetaData &metadata = meta_data_mesh_[cell_index[0]][cell_index[1]]; + return metadata.second; } //=================================================================================================// -template -template -void GridDataPackage:: - computeGradient(const MeshVariable &in_variable, - const MeshVariable &out_variable) +template +void MeshWithGridDataPackages:: + assignCategoryOnMetaDataMesh(const Arrayi &cell_index, const int category) +{ + MetaData &metadata = meta_data_mesh_[cell_index[0]][cell_index[1]]; + metadata.first = category; +} +//=================================================================================================// +template +bool MeshWithGridDataPackages:: + isSingularDataPackage(const Arrayi &cell_index) +{ + MetaData &metadata = meta_data_mesh_[cell_index[0]][cell_index[1]]; + return metadata.first == 0; +} +//=================================================================================================// +template +bool MeshWithGridDataPackages:: + isInnerDataPackage(const Arrayi &cell_index) +{ + MetaData &metadata = meta_data_mesh_[cell_index[0]][cell_index[1]]; + return metadata.first != 0; +} +//=================================================================================================// +template +bool MeshWithGridDataPackages:: + isCoreDataPackage(const Arrayi &cell_index) { - auto &in_variable_addrs = getPackageDataAddress(in_variable); - auto &out_variable_addrs = getPackageDataAddress(out_variable); + MetaData &metadata = meta_data_mesh_[cell_index[0]][cell_index[1]]; + return metadata.first == 2; +} +//=================================================================================================// +template +std::pair MeshWithGridDataPackages:: + NeighbourIndexShift(const Arrayi shift_index, const Neighbourhood &neighbour) +{ + std::pair result; + Arrayi neighbour_index = (shift_index + pkg_size * Arrayi::Ones()) / pkg_size; + result.first = neighbour[neighbour_index[0]][neighbour_index[1]]; + result.second = (shift_index + pkg_size * Arrayi::Ones()) - neighbour_index * pkg_size; - for_each_addrs( - [&](int i, int j) - { - Real dphidx = (*in_variable_addrs[i + 1][j] - *in_variable_addrs[i - 1][j]); - Real dphidy = (*in_variable_addrs[i][j + 1] - *in_variable_addrs[i][j - 1]); - *out_variable_addrs[i][j] = 0.5 * Vecd(dphidx, dphidy) / grid_spacing_; - }); + return result; } //=================================================================================================// -template +template template -void GridDataPackage:: - assignByPosition(const MeshVariable &mesh_variable, +void MeshWithGridDataPackages:: + assignByPosition(MeshVariable &mesh_variable, + const Arrayi cell_index, const FunctionByPosition &function_by_position) { - auto &pkg_data = getPackageData(mesh_variable); + size_t package_index = PackageIndexFromCellIndex(cell_index); + auto &pkg_data = mesh_variable.DataField()[package_index]; for (int i = 0; i != pkg_size; ++i) for (int j = 0; j != pkg_size; ++j) { - Vec2d position = DataPositionFromIndex(Vec2d(i, j)); + Vec2d position = DataPositionFromIndex(cell_index, Vec2d(i, j)); pkg_data[i][j] = function_by_position(position); } } //=================================================================================================// -template -template -void GridDataPackage::AssignSingularPackageDataAddress:: -operator()(DataContainerAssemble &all_pkg_data, - DataContainerAssemble &all_pkg_data_addrs) +template +template +void MeshWithGridDataPackages:: + computeGradient(MeshVariable &in_variable, + MeshVariable &out_variable, + const size_t package_index) { - constexpr int type_index = DataTypeIndex::value; - for (size_t l = 0; l != std::get(all_pkg_data).size(); ++l) - { - PackageData &pkg_data = std::get(all_pkg_data)[l]; - PackageDataAddress &pkg_data_addrs = std::get(all_pkg_data_addrs)[l]; - for (int i = 0; i != pkg_addrs_size; ++i) - for (int j = 0; j != pkg_addrs_size; ++j) - { - pkg_data_addrs[i][j] = &pkg_data[0][0]; - } - } + auto in_variable_data = in_variable.DataField(); + auto out_variable_data = out_variable.DataField(); + + auto &neighbourhood = neighbourhood_[package_index]; + auto &pkg_data = out_variable_data[package_index]; + + for_each_cell_data( + [&](int i, int j) + { + std::pair x1 = NeighbourIndexShift(Arrayi(i+1, j), neighbourhood); + std::pair x2 = NeighbourIndexShift(Arrayi(i-1, j), neighbourhood); + std::pair y1 = NeighbourIndexShift(Arrayi(i, j+1), neighbourhood); + std::pair y2 = NeighbourIndexShift(Arrayi(i, j-1), neighbourhood); + Real dphidx = (in_variable_data[x1.first][x1.second[0]][x1.second[1]] - + in_variable_data[x2.first][x2.second[0]][x2.second[1]]); + Real dphidy = (in_variable_data[y1.first][y1.second[0]][y1.second[1]] - + in_variable_data[y2.first][y2.second[0]][y2.second[1]]); + + pkg_data[i][j] = 0.5 * Vecd(dphidx, dphidy) / data_spacing_; + }); } //=================================================================================================// -template +template template -DataType GridDataPackage:: - CornerAverage(PackageDataAddress &pkg_data_addrs, Arrayi addrs_index, Arrayi corner_direction) +DataType MeshWithGridDataPackages:: + CornerAverage(MeshVariable &mesh_variable, Arrayi addrs_index, Arrayi corner_direction, Neighbourhood &neighbourhood) { DataType average = ZeroData::value; + auto mesh_variable_data = mesh_variable.DataField(); for (int i = 0; i != 2; ++i) for (int j = 0; j != 2; ++j) { int x_index = addrs_index[0] + i * corner_direction[0]; int y_index = addrs_index[1] + j * corner_direction[1]; - average += *pkg_data_addrs[x_index][y_index]; + NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(x_index, y_index), neighbourhood); + average += mesh_variable_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]]; } return average * 0.25; } //=================================================================================================// -template -template -void GridDataPackage::AssignPackageDataAddress:: -operator()(DataContainerAssemble &all_pkg_data_addrs, - const Arrayi &addrs_index, - DataContainerAssemble &all_pkg_data, - const Arrayi &data_index) -{ - constexpr int type_index = DataTypeIndex::value; - for (size_t l = 0; l != std::get(all_pkg_data).size(); ++l) - { - PackageData &pkg_data = std::get(all_pkg_data)[l]; - PackageDataAddress &pkg_data_addrs = std::get(all_pkg_data_addrs)[l]; - pkg_data_addrs[addrs_index[0]][addrs_index[1]] = &pkg_data[data_index[0]][data_index[1]]; - } -} -//=================================================================================================// -template -template -DataType MeshWithGridDataPackages:: - DataValueFromGlobalIndex(const MeshVariable &mesh_variable, - const Arrayi &global_grid_index) +template +template +DataType MeshWithGridDataPackages:: + probeDataPackage(MeshVariable &mesh_variable, size_t package_index, const Arrayi cell_index, const Vecd &position) { - Arrayi cell_index_on_mesh_ = Arrayi::Zero(); - Arrayi local_data_index = Arrayi::Zero(); - for (int n = 0; n != 2; n++) - { - size_t cell_index_in_this_direction = global_grid_index[n] / pkg_size; - cell_index_on_mesh_[n] = cell_index_in_this_direction; - local_data_index[n] = global_grid_index[n] - cell_index_in_this_direction * pkg_size; - } - auto &data = data_pkg_addrs_[cell_index_on_mesh_[0]][cell_index_on_mesh_[1]]->getPackageData(mesh_variable); - return data[local_data_index[0]][local_data_index[1]]; + Arrayi grid_idx = LocalGridIndexFromPosition(cell_index, position); + Vecd grid_pos = GridPositionFromLocalGridIndex(cell_index, grid_idx); + Vecd alpha = (position - grid_pos) / grid_spacing_; + Vecd beta = Vecd::Ones() - alpha; + + auto &neighbourhood = neighbourhood_[package_index]; + auto mesh_variable_data = mesh_variable.DataField(); + NeighbourIndex neighbour_index_1 = NeighbourIndexShift(Arrayi(grid_idx[0], grid_idx[1]), neighbourhood); + NeighbourIndex neighbour_index_2 = NeighbourIndexShift(Arrayi(grid_idx[0]+1, grid_idx[1]), neighbourhood); + NeighbourIndex neighbour_index_3 = NeighbourIndexShift(Arrayi(grid_idx[0], grid_idx[1]+1), neighbourhood); + NeighbourIndex neighbour_index_4 = NeighbourIndexShift(Arrayi(grid_idx[0]+1, grid_idx[1]+1), neighbourhood); + + DataType bilinear = mesh_variable_data[neighbour_index_1.first][neighbour_index_1.second[0]][neighbour_index_1.second[1]] * beta[0] * beta[1] + + mesh_variable_data[neighbour_index_2.first][neighbour_index_2.second[0]][neighbour_index_2.second[1]] * alpha[0] * beta[1] + + mesh_variable_data[neighbour_index_3.first][neighbour_index_3.second[0]][neighbour_index_3.second[1]] * beta[0] * alpha[1] + + mesh_variable_data[neighbour_index_4.first][neighbour_index_4.second[0]][neighbour_index_4.second[1]] * alpha[0] * alpha[1]; + + return bilinear; } //=================================================================================================// -template -void MeshWithGridDataPackages:: - initializePackageAddressesInACell(const Arrayi &cell_index) -{ - int i = cell_index[0]; - int j = cell_index[1]; - - GridDataPackageType *data_pkg = data_pkg_addrs_[i][j]; - if (data_pkg->isInnerPackage()) - { - for (int l = 0; l != pkg_addrs_size; ++l) - for (int m = 0; m != pkg_addrs_size; ++m) +template +template +void MeshWithGridDataPackages:: + package_parallel_for(const FunctionOnData &function) +{ + // for(size_t i = 2; i < num_grid_pkgs_; i++){ + // // size_t package_index = neighbourhood_[i][1][1]; + // // printf("now parallel for package %zu\n", package_index); + // function(i); + // } + parallel_for( + IndexRange(2, num_grid_pkgs_), + [&](const IndexRange &r) + { + for (size_t i = r.begin(); i != r.end(); ++i) { - std::pair x_pair = CellShiftAndDataIndex(l); - std::pair y_pair = CellShiftAndDataIndex(m); - data_pkg->assignPackageDataAddress( - Arrayi(l, m), - data_pkg_addrs_[i + x_pair.first][j + y_pair.first], - Arrayi(x_pair.second, y_pair.second)); + function(i); } - } -} -//=================================================================================================// -template -void MeshWithGridDataPackages::allocateMeshDataMatrix() -{ - Allocate2dArray(data_pkg_addrs_, all_cells_); -} -//=================================================================================================// -template -void MeshWithGridDataPackages::deleteMeshDataMatrix() -{ - Delete2dArray(data_pkg_addrs_, all_cells_); -} -//=================================================================================================// -template -void MeshWithGridDataPackages:: - assignDataPackageAddress(const Arrayi &cell_index, GridDataPackageType *data_pkg) -{ - data_pkg_addrs_[cell_index[0]][cell_index[1]] = data_pkg; -} -//=================================================================================================// -template -GridDataPackageType *MeshWithGridDataPackages:: - DataPackageFromCellIndex(const Arrayi &cell_index) -{ - return data_pkg_addrs_[cell_index[0]][cell_index[1]]; -} -//=================================================================================================// -template -template -DataType MeshWithGridDataPackages:: - probeMesh(const MeshVariable &mesh_variable, const Vecd &position) -{ - Arrayi grid_index = CellIndexFromPosition(position); - GridDataPackageType *data_pkg = data_pkg_addrs_[grid_index[0]][grid_index[1]]; - auto &pkg_data_addrs = data_pkg->getPackageDataAddress(mesh_variable); - return data_pkg->isInnerPackage() ? data_pkg->GridDataPackageType:: - template probeDataPackage(pkg_data_addrs, position) - : *pkg_data_addrs[0][0]; + }, + ap); } //=================================================================================================// } // namespace SPH diff --git a/src/for_3D_build/common/data_type.h b/src/for_3D_build/common/data_type.h index 283d00f13d..c068642acc 100644 --- a/src/for_3D_build/common/data_type.h +++ b/src/for_3D_build/common/data_type.h @@ -41,6 +41,7 @@ using AngularVecd = Vec3d; using Rotation = Rotation3d; using BoundingBox = BaseBoundingBox; using Transform = BaseTransform; +using Neighbourhood = std::array, 3>, 3>; template using PackageDataMatrix = std::array, array_size>, array_size>; diff --git a/src/for_3D_build/geometries/level_set_3d.cpp b/src/for_3D_build/geometries/level_set_3d.cpp index b524349843..60d7678afc 100644 --- a/src/for_3D_build/geometries/level_set_3d.cpp +++ b/src/for_3D_build/geometries/level_set_3d.cpp @@ -22,15 +22,15 @@ LevelSet::LevelSet(BoundingBox tentative_bounds, Real data_spacing, finishDataPackages(); } //=================================================================================================// -void LevelSet::initializeDataForSingularPackage(LevelSetDataPackage *data_pkg, Real far_field_level_set) +void LevelSet::initializeDataForSingularPackage(const size_t package_index, Real far_field_level_set) { - auto &phi = data_pkg->getPackageData(phi_); - auto &near_interface_id = data_pkg->getPackageData(near_interface_id_); - auto &phi_gradient = data_pkg->getPackageData(phi_gradient_); - auto &kernel_weight = data_pkg->getPackageData(kernel_weight_); - auto &kernel_gradient = data_pkg->getPackageData(kernel_gradient_); + auto &phi = phi_.DataField()[package_index]; + auto &near_interface_id = near_interface_id_.DataField()[package_index]; + auto &phi_gradient = phi_gradient_.DataField()[package_index]; + auto &kernel_weight = kernel_weight_.DataField()[package_index]; + auto &kernel_gradient = kernel_gradient_.DataField()[package_index]; - data_pkg->for_each_data( + for_each_cell_data( [&](int i, int j, int k) { phi[i][j][k] = far_field_level_set; @@ -49,20 +49,106 @@ void LevelSet::finishDataPackages() tagACellIsInnerPackage(Arrayi(i, j, k)); }); + initializeIndexMesh(); + initializeNeighbourhood(); + resizeMeshVariableData(); mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), - [&](size_t i, size_t j, size_t k) - { - initializePackageAddressesInACell(Arrayi(i, j, k)); - }); + [&](size_t i, size_t j, size_t k) + { + Arrayi cell_index = Arrayi(i, j, k); + if(isInnerDataPackage(cell_index)) + { + initializeBasicDataForAPackage(Arrayi(i, j, k), PackageIndexFromCellIndex(cell_index), shape_); + } + }); updateLevelSetGradient(); updateKernelIntegrals(); } //=================================================================================================// +// void LevelSet::initializeDataInACell(const Arrayi &cell_index) +// { +// Vecd cell_position = CellPositionFromIndex(cell_index); +// Real signed_distance = shape_.findSignedDistance(cell_position); +// Vecd normal_direction = shape_.findNormalDirection(cell_position); +// Real measure = (signed_distance * normal_direction).cwiseAbs().maxCoeff(); +// if (measure < grid_spacing_) +// { +// assignCore(cell_index); +// } +// else +// { +// size_t package_index = shape_.checkContain(cell_position) ? 0 : 1; +// assignSingular(cell_index); +// assignDataPackageIndex(cell_index, package_index); +// } +// } +// //=================================================================================================// +// void LevelSet::tagACellIsInnerPackage(const Arrayi &cell_index) +// { +// if (isInnerPackage(cell_index)) +// { +// if (!isCoreDataPackage(cell_index)) +// { +// assignInner(cell_index); +// } +// } +// } +//=================================================================================================// +void LevelSet::updateKernelIntegrals() +{ + mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), + [&](size_t i, size_t j, size_t k) + { + Arrayi cell_index = Arrayi(i, j, k); + if (isInnerPackage(cell_index)){ + assignByPosition( + kernel_weight_, cell_index, [&](const Vecd &position) -> Real + { return computeKernelIntegral(position); }); + assignByPosition( + kernel_gradient_, cell_index, [&](const Vecd &position) -> Vecd + { return computeKernelGradientIntegral(position); }); + } + }); +} +//=================================================================================================// +void LevelSet::initializeIndexMesh() +{ + mesh_for(MeshRange(Arrayi::Zero(), all_cells_), + [&](size_t i, size_t j, size_t k) + { + Arrayi cell_index = Arrayi(i, j, k); + if (isInnerDataPackage(cell_index)) + { + assignDataPackageIndex(Arrayi(i, j, k), num_grid_pkgs_++); + } + }); +} +//=================================================================================================// +void LevelSet::initializeNeighbourhood() +{ + neighbourhood_ = new Neighbourhood[num_grid_pkgs_]; + mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), + [&](size_t i, size_t j, size_t k) + { + Arrayi cell_index = Arrayi(i, j, k); + if (isInnerDataPackage(cell_index)) + { + Neighbourhood ¤t = neighbourhood_[PackageIndexFromCellIndex(cell_index)]; + for(int l = -1; l < 2; l++) + for(int m = -1; m < 2; m++) + for(int n = -1; n < 2; n++) + { + current[l+1][m+1][n+1] = PackageIndexFromCellIndex(cell_index+Arrayi(l, m, n)); + } + } + }); +} +//=================================================================================================// bool LevelSet::isWithinCorePackage(Vecd position) { Arrayi cell_index = CellIndexFromPosition(position); - return data_pkg_addrs_[cell_index[0]][cell_index[1]][cell_index[2]]->isCorePackage(); + return isCoreDataPackage(cell_index); } //=============================================================================================// bool LevelSet::isInnerPackage(const Arrayi &cell_index) @@ -72,35 +158,35 @@ bool LevelSet::isInnerPackage(const Arrayi &cell_index) all_cells_.min(cell_index + 2 * Array3i::Ones()), [&](int l, int m, int n) { - return data_pkg_addrs_[l][m][n]->isCorePackage(); + return isCoreDataPackage(Arrayi(l, m, n)); }); } //=================================================================================================// void LevelSet::diffuseLevelSetSign() { - package_parallel_for( - inner_data_pkgs_, - [&](LevelSetDataPackage *data_pkg) + package_parallel_for([&](size_t package_index) { - auto &phi_addrs = data_pkg->getPackageDataAddress(phi_); - auto &near_interface_id_addrs = data_pkg->getPackageDataAddress(near_interface_id_); + auto phi_data = phi_.DataField(); + auto near_interface_id_data = near_interface_id_.DataField(); + auto &neighbourhood = neighbourhood_[package_index]; - data_pkg->for_each_addrs( + for_each_cell_data( [&](int i, int j, int k) { // near interface cells are not considered - if (abs(*near_interface_id_addrs[i][j][k]) > 1) + if (abs(near_interface_id_data[package_index][i][j][k]) > 1) { mesh_find_if3d<-1, 2>( [&](int l, int m, int n) -> bool { - int near_interface_id = *near_interface_id_addrs[i + l][j + m][k + n]; + NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i+l, j+m, k+n), neighbourhood); + int near_interface_id = near_interface_id_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; bool is_found = abs(near_interface_id) == 1; if (is_found) { - Real phi_0 = *phi_addrs[i][j][k]; - *near_interface_id_addrs[i][j][k] = near_interface_id; - *phi_addrs[i][j][k] = near_interface_id == 1 ? fabs(phi_0) : -fabs(phi_0); + Real phi_0 = phi_data[package_index][i][j][k]; + near_interface_id_data[package_index][i][j][k] = near_interface_id; + phi_data[package_index][i][j][k] = near_interface_id == 1 ? fabs(phi_0) : -fabs(phi_0); } return is_found; }); @@ -111,25 +197,31 @@ void LevelSet::diffuseLevelSetSign() //=============================================================================================// void LevelSet::reinitializeLevelSet() { - package_parallel_for( - inner_data_pkgs_, - [&](LevelSetDataPackage *data_pkg) + package_parallel_for([&](size_t package_index) { - auto &phi_addrs = data_pkg->getPackageDataAddress(phi_); - auto &near_interface_id_addrs_ = data_pkg->getPackageDataAddress(near_interface_id_); + auto phi_data = phi_.DataField(); + auto &phi_addrs = phi_data[package_index]; + auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; + auto &neighbourhood = neighbourhood_[package_index]; - data_pkg->for_each_addrs( + for_each_cell_data( [&](int i, int j, int k) { // only reinitialize non cut cells - if (*near_interface_id_addrs_[i][j][k] != 0) + if (near_interface_id_addrs[i][j][k] != 0) { - Real phi_0 = *phi_addrs[i][j][k]; + Real phi_0 = phi_addrs[i][j][k]; Real sign = phi_0 / sqrt(phi_0 * phi_0 + data_spacing_ * data_spacing_); - Real dv_x = upwindDifference(sign, *phi_addrs[i + 1][j][k] - phi_0, phi_0 - *phi_addrs[i - 1][j][k]); - Real dv_y = upwindDifference(sign, *phi_addrs[i][j + 1][k] - phi_0, phi_0 - *phi_addrs[i][j - 1][k]); - Real dv_z = upwindDifference(sign, *phi_addrs[i][j][k + 1] - phi_0, phi_0 - *phi_addrs[i][j][k - 1]); - *phi_addrs[i][j][k] -= 0.3 * sign * (Vec3d(dv_x, dv_y, dv_z).norm() - data_spacing_); + NeighbourIndex x1 = NeighbourIndexShift(Arrayi(i+1, j, k), neighbourhood); + NeighbourIndex x2 = NeighbourIndexShift(Arrayi(i-1, j, k), neighbourhood); + NeighbourIndex y1 = NeighbourIndexShift(Arrayi(i, j+1, k), neighbourhood); + NeighbourIndex y2 = NeighbourIndexShift(Arrayi(i, j-1, k), neighbourhood); + NeighbourIndex z1 = NeighbourIndexShift(Arrayi(i, j, k+1), neighbourhood); + NeighbourIndex z2 = NeighbourIndexShift(Arrayi(i, j, k-1), neighbourhood); + Real dv_x = upwindDifference(sign, phi_data[x1.first][x1.second[0]][x1.second[1]][x1.second[2]] - phi_0, phi_0 - phi_data[x2.first][x2.second[0]][x2.second[1]][x2.second[2]]); + Real dv_y = upwindDifference(sign, phi_data[y1.first][y1.second[0]][y1.second[1]][y1.second[2]] - phi_0, phi_0 - phi_data[y2.first][y2.second[0]][y2.second[1]][y2.second[2]]); + Real dv_z = upwindDifference(sign, phi_data[z1.first][z1.second[0]][z1.second[1]][z1.second[2]] - phi_0, phi_0 - phi_data[z2.first][z2.second[0]][z2.second[1]][z2.second[2]]); + phi_addrs[i][j][k] -= 0.3 * sign * (Vec3d(dv_x, dv_y, dv_z).norm() - data_spacing_); } }); }); @@ -139,26 +231,25 @@ void LevelSet::markNearInterface(Real small_shift_factor) { Real small_shift = small_shift_factor * data_spacing_; - package_parallel_for( - inner_data_pkgs_, - [&](LevelSetDataPackage *data_pkg) + package_parallel_for([&](size_t package_index) { - auto &phi_addrs = data_pkg->getPackageDataAddress(phi_); - auto &near_interface_id_addrs = data_pkg->getPackageDataAddress(near_interface_id_); + auto &phi_addrs = phi_.DataField()[package_index]; + auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; + auto neighbourhood = neighbourhood_[package_index]; // corner averages, note that the first row and first column are not used - LevelSetDataPackage::PackageTemporaryData corner_averages; - mesh_for_each3d<1, pkg_addrs_size>( + PackageTemporaryData corner_averages; + mesh_for_each3d<0, pkg_size+1>( [&](int i, int j, int k) { - corner_averages[i][j][k] = data_pkg->CornerAverage(phi_addrs, Arrayi(i, j, k), Arrayi(-1, -1, -1)); + corner_averages[i][j][k] = CornerAverage(phi_, Arrayi(i, j, k), Arrayi(-1, -1, -1), neighbourhood); }); - data_pkg->for_each_addrs( + for_each_cell_data( [&](int i, int j, int k) { // first assume far cells - Real phi_0 = *phi_addrs[i][j][k]; + Real phi_0 = phi_addrs[i][j][k]; int near_interface_id = phi_0 > 0.0 ? 2 : -2; if (fabs(phi_0) < small_shift) { @@ -184,36 +275,47 @@ void LevelSet::markNearInterface(Real small_shift_factor) }); } // assign this is to package - *near_interface_id_addrs[i][j][k] = near_interface_id; + near_interface_id_addrs[i][j][k] = near_interface_id; }); }); } //=================================================================================================// -void LevelSet::initializeBasicDataForAPackage(LevelSetDataPackage *data_pkg, Shape &shape) +void LevelSet::initializeBasicDataForAPackage(const Arrayi &cell_index, const size_t package_index, Shape &shape) { - auto &phi = data_pkg->getPackageData(phi_); - auto &near_interface_id = data_pkg->getPackageData(near_interface_id_); - data_pkg->for_each_data( + auto &phi = phi_.DataField()[package_index]; + auto &near_interface_id = near_interface_id_.DataField()[package_index]; + for_each_cell_data( [&](int i, int j, int k) { - Vec3d position = data_pkg->DataPositionFromIndex(Vec3d(i, j, k)); + Vec3d position = DataPositionFromIndex(cell_index, Vec3d(i, j, k)); phi[i][j][k] = shape.findSignedDistance(position); near_interface_id[i][j][k] = phi[i][j][k] < 0.0 ? -2 : 2; }); } //=================================================================================================// -void LevelSet::redistanceInterfaceForAPackage(LevelSetDataPackage *core_data_pkg) +void LevelSet::redistanceInterface() +{ + mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), + [&](size_t i, size_t j, size_t k) + { + Arrayi cell_index = Arrayi(i, j, k); + if (isCoreDataPackage(cell_index)) + { + redistanceInterfaceForAPackage(PackageIndexFromCellIndex(cell_index)); + } + }); +} +//=================================================================================================// +void LevelSet::redistanceInterfaceForAPackage(const size_t package_index) { - int l = (int)core_data_pkg->CellIndexOnMesh()[0]; - int m = (int)core_data_pkg->CellIndexOnMesh()[1]; - int n = (int)core_data_pkg->CellIndexOnMesh()[2]; - auto &phi_addrs = core_data_pkg->getPackageDataAddress(phi_); - auto &near_interface_id_addrs = core_data_pkg->getPackageDataAddress(near_interface_id_); + auto phi_data = phi_.DataField(); + auto near_interface_id_data = near_interface_id_.DataField(); + auto &neighbourhood = neighbourhood_[package_index]; - core_data_pkg->for_each_addrs( + for_each_cell_data( [&](int i, int j, int k) { - int near_interface_id = *near_interface_id_addrs[i][j][k]; + int near_interface_id = near_interface_id_data[package_index][i][j][k]; if (near_interface_id == 0) { bool positive_band = false; @@ -221,7 +323,8 @@ void LevelSet::redistanceInterfaceForAPackage(LevelSetDataPackage *core_data_pkg mesh_for_each3d<-1, 2>( [&](int r, int s, int t) { - int neighbor_near_interface_id = *near_interface_id_addrs[i + r][j + s][k + t]; + NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i+r, j+s, k+t), neighbourhood); + int neighbor_near_interface_id = near_interface_id_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; if (neighbor_near_interface_id >= 1) positive_band = true; if (neighbor_near_interface_id <= -1) @@ -233,26 +336,23 @@ void LevelSet::redistanceInterfaceForAPackage(LevelSetDataPackage *core_data_pkg mesh_for_each3d<-4, 5>( [&](int x, int y, int z) { - std::pair x_pair = CellShiftAndDataIndex(i + x); - std::pair y_pair = CellShiftAndDataIndex(j + y); - std::pair z_pair = CellShiftAndDataIndex(k + z); - LevelSetDataPackage *neighbor_pkg = data_pkg_addrs_[l + x_pair.first][m + y_pair.first][n + z_pair.first]; - auto &neighbor_phi = neighbor_pkg->getPackageData(phi_); - auto &neighbor_phi_gradient = neighbor_pkg->getPackageData(phi_gradient_); - auto &neighbor_near_interface_id = neighbor_pkg->getPackageData(near_interface_id_); - if (neighbor_near_interface_id[x_pair.second][y_pair.second][z_pair.second] >= 1) + NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i+x, j+y, k+z), neighbourhood); + auto &neighbor_phi = phi_.DataField()[neighbour_index.first]; + auto &neighbor_phi_gradient = phi_gradient_.DataField()[neighbour_index.first]; + auto &neighbor_near_interface_id = near_interface_id_.DataField()[neighbour_index.first]; + if (neighbor_near_interface_id[neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]] >= 1) { - Real phi_p_ = neighbor_phi[x_pair.second][y_pair.second][z_pair.second]; - Vecd norm_to_face = neighbor_phi_gradient[x_pair.second][y_pair.second][z_pair.second]; + Real phi_p_ = neighbor_phi[neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; + Vecd norm_to_face = neighbor_phi_gradient[neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; norm_to_face /= norm_to_face.norm() + TinyReal; min_distance_p = SMIN(min_distance_p, (Vecd((Real)x, (Real)y, Real(z)) * data_spacing_ + phi_p_ * norm_to_face).norm()); } }); - *phi_addrs[i][j][k] = -min_distance_p; + phi_data[package_index][i][j][k] = -min_distance_p; // this immediate switch of near interface id // does not intervening with the identification of unresolved interface // based on the assumption that positive false_and negative bands are not close to each other - *near_interface_id_addrs[i][j][k] = -1; + near_interface_id_data[package_index][i][j][k] = -1; } if (negative_band == false) { @@ -260,26 +360,23 @@ void LevelSet::redistanceInterfaceForAPackage(LevelSetDataPackage *core_data_pkg mesh_for_each3d<-4, 5>( [&](int x, int y, int z) { - std::pair x_pair = CellShiftAndDataIndex(i + x); - std::pair y_pair = CellShiftAndDataIndex(j + y); - std::pair z_pair = CellShiftAndDataIndex(k + z); - LevelSetDataPackage *neighbor_pkg = data_pkg_addrs_[l + x_pair.first][m + y_pair.first][n + z_pair.first]; - auto &neighbor_phi = neighbor_pkg->getPackageData(phi_); - auto &neighbor_phi_gradient = neighbor_pkg->getPackageData(phi_gradient_); - auto &neighbor_near_interface_id = neighbor_pkg->getPackageData(near_interface_id_); - if (neighbor_near_interface_id[x_pair.second][y_pair.second][z_pair.second] <= -1) + NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i+x, j+y, k+z), neighbourhood); + auto &neighbor_phi = phi_.DataField()[neighbour_index.first]; + auto &neighbor_phi_gradient = phi_gradient_.DataField()[neighbour_index.first]; + auto &neighbor_near_interface_id = near_interface_id_.DataField()[neighbour_index.first]; + if (neighbor_near_interface_id[neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]] <= -1) { - Real phi_n_ = neighbor_phi[x_pair.second][y_pair.second][z_pair.second]; - Vecd norm_to_face = neighbor_phi_gradient[x_pair.second][y_pair.second][z_pair.second]; + Real phi_n_ = neighbor_phi[neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; + Vecd norm_to_face = neighbor_phi_gradient[neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; norm_to_face /= norm_to_face.norm() + TinyReal; min_distance_n = SMIN(min_distance_n, (Vecd((Real)x, (Real)y, Real(z)) * data_spacing_ - phi_n_ * norm_to_face).norm()); } }); - *phi_addrs[i][j][k] = min_distance_n; + phi_data[package_index][i][j][k] = min_distance_n; // this immediate switch of near interface id // does not intervening with the identification of unresolved interface // based on the assumption that positive false_and negative bands are not close to each other - *near_interface_id_addrs[i][j][k] = 1; + near_interface_id_data[package_index][i][j][k] = 1; } } }); diff --git a/src/for_3D_build/meshes/mesh_with_data_packages.hpp b/src/for_3D_build/meshes/mesh_with_data_packages.hpp index 5c62ad7f70..ffd4868527 100644 --- a/src/for_3D_build/meshes/mesh_with_data_packages.hpp +++ b/src/for_3D_build/meshes/mesh_with_data_packages.hpp @@ -12,10 +12,66 @@ namespace SPH { //=================================================================================================// -template +template +template +DataType MeshWithGridDataPackages:: + DataValueFromGlobalIndex(MeshVariable &mesh_variable, + const Arrayi &global_grid_index) +{ + Arrayi cell_index_on_mesh_ = Arrayi::Zero(); + Arrayi local_data_index = Arrayi::Zero(); + for (int n = 0; n != 3; n++) + { + size_t cell_index_in_this_direction = global_grid_index[n] / pkg_size; + cell_index_on_mesh_[n] = cell_index_in_this_direction; + local_data_index[n] = global_grid_index[n] - cell_index_in_this_direction * pkg_size; + } + size_t package_index = PackageIndexFromCellIndex(cell_index_on_mesh_); + auto &data = mesh_variable.DataField()[package_index]; + // auto &data = data_pkg_addrs_[cell_index_on_mesh_[0]][cell_index_on_mesh_[1]][cell_index_on_mesh_[2]] + // ->getPackageData(mesh_variable); + return data[local_data_index[0]][local_data_index[1]][local_data_index[2]]; +} +//=================================================================================================// +template +void MeshWithGridDataPackages::allocateIndexDataMatrix() +{ + Allocate3dArray(data_pkg_idx_, all_cells_); +} +//=================================================================================================// +template +void MeshWithGridDataPackages::deleteIndexDataMatrix() +{ + Delete3dArray(data_pkg_idx_, all_cells_); +} +//=================================================================================================// +template +void MeshWithGridDataPackages::allocateMetaDataMatrix() +{ + Allocate3dArray(meta_data_mesh_, all_cells_); +} +//=================================================================================================// +template +void MeshWithGridDataPackages::deleteMetaDataMatrix() +{ + Delete3dArray(meta_data_mesh_, all_cells_); +} +//=================================================================================================// +template +template +DataType MeshWithGridDataPackages:: + probeMesh(MeshVariable &mesh_variable, const Vecd &position) +{ + Arrayi grid_index = CellIndexFromPosition(position); + size_t package_index = PackageIndexFromCellIndex(grid_index); + return isInnerDataPackage(grid_index) ? probeDataPackage(mesh_variable, package_index, grid_index, position) + : mesh_variable.DataField()[package_index][0][0][0]; +} +//=================================================================================================// +template template -void GridDataPackage:: - for_each_data(const FunctionOnData &function) +void MeshWithGridDataPackages:: + for_each_cell_data(const FunctionOnData &function) { for (int i = 0; i != pkg_size; ++i) for (int j = 0; j != pkg_size; ++j) @@ -25,119 +81,124 @@ void GridDataPackage:: } } //=================================================================================================// -template -template -void GridDataPackage:: - for_each_addrs(const FunctionOnAddress &function) +template +void MeshWithGridDataPackages:: + assignDataPackageIndex(const Arrayi &cell_index, const size_t package_index) { - for (int i = pkg_addrs_buffer; i != pkg_ops_end; ++i) - for (int j = pkg_addrs_buffer; j != pkg_ops_end; ++j) - for (int k = pkg_addrs_buffer; k != pkg_ops_end; ++k) - { - function(i, j, k); - } + MetaData &metadata = meta_data_mesh_[cell_index[0]][cell_index[1]][cell_index[2]]; + metadata.second = package_index; } //=================================================================================================// -template -template -DataType GridDataPackage:: - probeDataPackage(PackageDataAddress &pkg_data_addrs, const Vecd &position) +template +size_t MeshWithGridDataPackages:: + PackageIndexFromCellIndex(const Arrayi &cell_index) { - Arrayi grid_idx = CellIndexFromPosition(position); - Vecd grid_pos = GridPositionFromIndex(grid_idx); - Vecd alpha = (position - grid_pos) / grid_spacing_; - Vecd beta = Vecd::Ones() - alpha; - - DataType bilinear_1 = *pkg_data_addrs[grid_idx[0]][grid_idx[1]][grid_idx[2]] * beta[0] * beta[1] + - *pkg_data_addrs[grid_idx[0] + 1][grid_idx[1]][grid_idx[2]] * alpha[0] * beta[1] + - *pkg_data_addrs[grid_idx[0]][grid_idx[1] + 1][grid_idx[2]] * beta[0] * alpha[1] + - *pkg_data_addrs[grid_idx[0] + 1][grid_idx[1] + 1][grid_idx[2]] * alpha[0] * alpha[1]; - DataType bilinear_2 = *pkg_data_addrs[grid_idx[0]][grid_idx[1]][grid_idx[2] + 1] * beta[0] * beta[1] + - *pkg_data_addrs[grid_idx[0] + 1][grid_idx[1]][grid_idx[2] + 1] * alpha[0] * beta[1] + - *pkg_data_addrs[grid_idx[0]][grid_idx[1] + 1][grid_idx[2] + 1] * beta[0] * alpha[1] + - *pkg_data_addrs[grid_idx[0] + 1][grid_idx[1] + 1][grid_idx[2] + 1] * alpha[0] * alpha[1]; - return bilinear_1 * beta[2] + bilinear_2 * alpha[2]; + MetaData &metadata = meta_data_mesh_[cell_index[0]][cell_index[1]][cell_index[2]]; + return metadata.second; } //=================================================================================================// -template -template -void GridDataPackage:: - computeGradient(const MeshVariable &in_variable, - const MeshVariable &out_variable) +template +void MeshWithGridDataPackages:: + assignCategoryOnMetaDataMesh(const Arrayi &cell_index, const int category) { - auto &in_variable_addrs = getPackageDataAddress(in_variable); - auto &out_variable_addrs = getPackageDataAddress(out_variable); + MetaData &metadata = meta_data_mesh_[cell_index[0]][cell_index[1]][cell_index[2]]; + metadata.first = category; +} +//=================================================================================================// +template +bool MeshWithGridDataPackages:: + isSingularDataPackage(const Arrayi &cell_index) +{ + MetaData &metadata = meta_data_mesh_[cell_index[0]][cell_index[1]][cell_index[2]]; + return metadata.first == 0; +} +//=================================================================================================// +template +bool MeshWithGridDataPackages:: + isInnerDataPackage(const Arrayi &cell_index) +{ + MetaData &metadata = meta_data_mesh_[cell_index[0]][cell_index[1]][cell_index[2]]; + return metadata.first != 0; +} +//=================================================================================================// +template +bool MeshWithGridDataPackages:: + isCoreDataPackage(const Arrayi &cell_index) +{ + MetaData &metadata = meta_data_mesh_[cell_index[0]][cell_index[1]][cell_index[2]]; + return metadata.first == 2; +} +//=================================================================================================// +template +std::pair MeshWithGridDataPackages:: + NeighbourIndexShift(const Arrayi shift_index, const Neighbourhood &neighbour) +{ + std::pair result; + Arrayi neighbour_index = (shift_index + pkg_size * Arrayi::Ones()) / pkg_size; + result.first = neighbour[neighbour_index[0]][neighbour_index[1]][neighbour_index[2]]; + result.second = (shift_index + pkg_size * Arrayi::Ones()) - neighbour_index * pkg_size; - for_each_addrs( - [&](int i, int j, int k) - { - Real dphidx = (*in_variable_addrs[i + 1][j][k] - *in_variable_addrs[i - 1][j][k]); - Real dphidy = (*in_variable_addrs[i][j + 1][k] - *in_variable_addrs[i][j - 1][k]); - Real dphidz = (*in_variable_addrs[i][j][k + 1] - *in_variable_addrs[i][j][k - 1]); - *out_variable_addrs[i][j][k] = 0.5 * Vecd(dphidx, dphidy, dphidz) / grid_spacing_; - }); + return result; } //=================================================================================================// -template +template template -void GridDataPackage:: - assignByPosition(const MeshVariable &mesh_variable, +void MeshWithGridDataPackages:: + assignByPosition(MeshVariable &mesh_variable, + const Arrayi cell_index, const FunctionByPosition &function_by_position) { - auto &pkg_data = getPackageData(mesh_variable); + size_t package_index = PackageIndexFromCellIndex(cell_index); + auto &pkg_data = mesh_variable.DataField()[package_index]; + // auto &pkg_data = getPackageData(mesh_variable); for (int i = 0; i != pkg_size; ++i) for (int j = 0; j != pkg_size; ++j) for (int k = 0; k != pkg_size; ++k) { - Vec3d position = DataPositionFromIndex(Vec3d(i, j, k)); + Vec3d position = DataPositionFromIndex(cell_index, Vec3d(i, j)); pkg_data[i][j][k] = function_by_position(position); } } //=================================================================================================// -template -template -void GridDataPackage::AssignSingularPackageDataAddress:: -operator()(DataContainerAssemble &all_pkg_data, - DataContainerAssemble &all_pkg_data_addrs) +template +template +void MeshWithGridDataPackages:: + computeGradient(MeshVariable &in_variable, + MeshVariable &out_variable, + const size_t package_index) { - constexpr int type_index = DataTypeIndex::value; - for (size_t l = 0; l != std::get(all_pkg_data).size(); ++l) - { - PackageData &pkg_data = std::get(all_pkg_data)[l]; - PackageDataAddress &pkg_data_addrs = std::get(all_pkg_data_addrs)[l]; - for (int i = 0; i != pkg_addrs_size; ++i) - for (int j = 0; j != pkg_addrs_size; ++j) - for (int k = 0; k != pkg_addrs_size; ++k) - { - pkg_data_addrs[i][j][k] = &pkg_data[0][0][0]; - } - } -} -//=================================================================================================// -template -template -void GridDataPackage::AssignPackageDataAddress:: -operator()(DataContainerAssemble &all_pkg_data_addrs, - const Arrayi &addrs_index, - DataContainerAssemble &all_pkg_data, - const Arrayi &data_index) -{ - constexpr int type_index = DataTypeIndex::value; - for (size_t l = 0; l != std::get(all_pkg_data).size(); ++l) - { - PackageData &pkg_data = std::get(all_pkg_data)[l]; - PackageDataAddress &pkg_data_addrs = std::get(all_pkg_data_addrs)[l]; - pkg_data_addrs[addrs_index[0]][addrs_index[1]][addrs_index[2]] = - &pkg_data[data_index[0]][data_index[1]][data_index[2]]; - } + auto in_variable_data = in_variable.DataField(); + auto out_variable_data = out_variable.DataField(); + + auto &neighbourhood = neighbourhood_[package_index]; + auto &pkg_data = out_variable_data[package_index]; + + for_each_cell_data( + [&](int i, int j, int k) + { + std::pair x1 = NeighbourIndexShift(Arrayi(i+1, j, k), neighbourhood); + std::pair x2 = NeighbourIndexShift(Arrayi(i-1, j, k), neighbourhood); + std::pair y1 = NeighbourIndexShift(Arrayi(i, j+1, k), neighbourhood); + std::pair y2 = NeighbourIndexShift(Arrayi(i, j-1, k), neighbourhood); + std::pair z1 = NeighbourIndexShift(Arrayi(i, j, k+1), neighbourhood); + std::pair z2 = NeighbourIndexShift(Arrayi(i, j, k-1), neighbourhood); + Real dphidx = (in_variable_data[x1.first][x1.second[0]][x1.second[1]][x1.second[2]] - + in_variable_data[x2.first][x2.second[0]][x2.second[1]][x2.second[2]]); + Real dphidy = (in_variable_data[y1.first][y1.second[0]][y1.second[1]][y1.second[2]] - + in_variable_data[y2.first][y2.second[0]][y2.second[1]][y2.second[2]]); + Real dphidz = (in_variable_data[z1.first][z1.second[0]][z1.second[1]][z1.second[2]] - + in_variable_data[z2.first][z2.second[0]][z2.second[1]][z2.second[2]]); + pkg_data[i][j][k] = 0.5 * Vecd(dphidx, dphidy, dphidz) / data_spacing_; + }); } //=================================================================================================// -template +template template -DataType GridDataPackage:: - CornerAverage(PackageDataAddress &pkg_data_addrs, Arrayi addrs_index, Arrayi corner_direction) +DataType MeshWithGridDataPackages:: + CornerAverage(MeshVariable &mesh_variable, Arrayi addrs_index, Arrayi corner_direction, Neighbourhood &neighbourhood) { DataType average = ZeroData::value; + auto mesh_variable_data = mesh_variable.DataField(); for (int i = 0; i != 2; ++i) for (int j = 0; j != 2; ++j) for (int k = 0; k != 2; ++k) @@ -145,94 +206,55 @@ DataType GridDataPackage:: int x_index = addrs_index[0] + i * corner_direction[0]; int y_index = addrs_index[1] + j * corner_direction[1]; int z_index = addrs_index[2] + k * corner_direction[2]; - average += *pkg_data_addrs[x_index][y_index][z_index]; + NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(x_index, y_index, z_index), neighbourhood); + average += mesh_variable_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; } return average * 0.125; } //=================================================================================================// -template -template -DataType MeshWithGridDataPackages:: - DataValueFromGlobalIndex(const MeshVariable &mesh_variable, - const Arrayi &global_grid_index) -{ - Arrayi cell_index_on_mesh_ = Arrayi::Zero(); - Arrayi local_data_index = Arrayi::Zero(); - for (int n = 0; n != 3; n++) - { - size_t cell_index_in_this_direction = global_grid_index[n] / pkg_size; - cell_index_on_mesh_[n] = cell_index_in_this_direction; - local_data_index[n] = global_grid_index[n] - cell_index_in_this_direction * pkg_size; - } - auto &data = data_pkg_addrs_[cell_index_on_mesh_[0]][cell_index_on_mesh_[1]][cell_index_on_mesh_[2]] - ->getPackageData(mesh_variable); - return data[local_data_index[0]][local_data_index[1]][local_data_index[2]]; -} -//=================================================================================================// -template -void MeshWithGridDataPackages:: - initializePackageAddressesInACell(const Arrayi &cell_index) +template +template +DataType MeshWithGridDataPackages:: + probeDataPackage(MeshVariable &mesh_variable, size_t package_index, const Arrayi cell_index, const Vecd &position) { - int i = cell_index[0]; - int j = cell_index[1]; - int k = cell_index[2]; + Arrayi grid_idx = LocalGridIndexFromPosition(cell_index, position); + Vecd grid_pos = GridPositionFromLocalGridIndex(cell_index, grid_idx); + Vecd alpha = (position - grid_pos) / grid_spacing_; + Vecd beta = Vecd::Ones() - alpha; - GridDataPackageType *data_pkg = data_pkg_addrs_[i][j][k]; - if (data_pkg->isInnerPackage()) - { - for (int l = 0; l != pkg_addrs_size; ++l) - for (int m = 0; m != pkg_addrs_size; ++m) - for (int n = 0; n != pkg_addrs_size; ++n) - { - std::pair x_pair = CellShiftAndDataIndex(l); - std::pair y_pair = CellShiftAndDataIndex(m); - std::pair z_pair = CellShiftAndDataIndex(n); + auto &neighbourhood = neighbourhood_[package_index]; + auto mesh_variable_data = mesh_variable.DataField(); + NeighbourIndex neighbour_index_1 = NeighbourIndexShift(Arrayi(grid_idx[0], grid_idx[1], grid_idx[2]), neighbourhood); + NeighbourIndex neighbour_index_2 = NeighbourIndexShift(Arrayi(grid_idx[0]+1, grid_idx[1], grid_idx[2]), neighbourhood); + NeighbourIndex neighbour_index_3 = NeighbourIndexShift(Arrayi(grid_idx[0], grid_idx[1]+1, grid_idx[2]), neighbourhood); + NeighbourIndex neighbour_index_4 = NeighbourIndexShift(Arrayi(grid_idx[0]+1, grid_idx[1]+1, grid_idx[2]), neighbourhood); - data_pkg->assignPackageDataAddress( - Arrayi(l, m, n), - data_pkg_addrs_[i + x_pair.first][j + y_pair.first][k + z_pair.first], - Arrayi(x_pair.second, y_pair.second, z_pair.second)); - } - } -} -//=================================================================================================// -template -void MeshWithGridDataPackages::allocateMeshDataMatrix() -{ - Allocate3dArray(data_pkg_addrs_, all_cells_); -} -//=================================================================================================// -template -void MeshWithGridDataPackages::deleteMeshDataMatrix() -{ - Delete3dArray(data_pkg_addrs_, all_cells_); -} -//=================================================================================================// -template -void MeshWithGridDataPackages:: - assignDataPackageAddress(const Arrayi &cell_index, GridDataPackageType *data_pkg) -{ - data_pkg_addrs_[cell_index[0]][cell_index[1]][cell_index[2]] = data_pkg; + DataType bilinear_1 = mesh_variable_data[neighbour_index_1.first][neighbour_index_1.second[0]][neighbour_index_1.second[1]][neighbour_index_1.second[2]] * beta[0] * beta[1] + + mesh_variable_data[neighbour_index_2.first][neighbour_index_2.second[0]][neighbour_index_2.second[1]][neighbour_index_2.second[2]] * alpha[0] * beta[1] + + mesh_variable_data[neighbour_index_3.first][neighbour_index_3.second[0]][neighbour_index_3.second[1]][neighbour_index_3.second[2]] * beta[0] * alpha[1] + + mesh_variable_data[neighbour_index_4.first][neighbour_index_4.second[0]][neighbour_index_4.second[1]][neighbour_index_4.second[2]] * alpha[0] * alpha[1]; + + neighbour_index_1 = NeighbourIndexShift(Arrayi(grid_idx[0], grid_idx[1], grid_idx[2]+1), neighbourhood); + neighbour_index_2 = NeighbourIndexShift(Arrayi(grid_idx[0]+1, grid_idx[1], grid_idx[2]+1), neighbourhood); + neighbour_index_3 = NeighbourIndexShift(Arrayi(grid_idx[0], grid_idx[1]+1, grid_idx[2]+1), neighbourhood); + neighbour_index_4 = NeighbourIndexShift(Arrayi(grid_idx[0]+1, grid_idx[1]+1, grid_idx[2]+1), neighbourhood); + + DataType bilinear_2 = mesh_variable_data[neighbour_index_1.first][neighbour_index_1.second[0]][neighbour_index_1.second[1]][neighbour_index_1.second[2]] * beta[0] * beta[1] + + mesh_variable_data[neighbour_index_2.first][neighbour_index_2.second[0]][neighbour_index_2.second[1]][neighbour_index_2.second[2]] * alpha[0] * beta[1] + + mesh_variable_data[neighbour_index_3.first][neighbour_index_3.second[0]][neighbour_index_3.second[1]][neighbour_index_3.second[2]] * beta[0] * alpha[1] + + mesh_variable_data[neighbour_index_4.first][neighbour_index_4.second[0]][neighbour_index_4.second[1]][neighbour_index_4.second[2]] * alpha[0] * alpha[1]; + return bilinear_1 * beta[2] + bilinear_2 * alpha[2]; } //=================================================================================================// -template -GridDataPackageType *MeshWithGridDataPackages:: - DataPackageFromCellIndex(const Arrayi &cell_index) +template +template +void MeshWithGridDataPackages:: + package_parallel_for(const FunctionOnData &function) { - return data_pkg_addrs_[cell_index[0]][cell_index[1]][cell_index[2]]; -} -//=================================================================================================// -template -template -DataType MeshWithGridDataPackages:: - probeMesh(const MeshVariable &mesh_variable, const Vecd &position) -{ - Arrayi index = CellIndexFromPosition(position); - GridDataPackageType *data_pkg = data_pkg_addrs_[index[0]][index[1]][index[2]]; - auto &pkg_data_addrs = data_pkg->getPackageDataAddress(mesh_variable); - return data_pkg->isInnerPackage() ? data_pkg->GridDataPackageType:: - template probeDataPackage(pkg_data_addrs, position) - : *pkg_data_addrs[0][0][0]; + for(int i = 2; i < num_grid_pkgs_; i++){ + size_t package_index = neighbourhood_[i][1][1][1]; + function(package_index); + } } //=================================================================================================// } // namespace SPH diff --git a/src/shared/common/sph_data_containers.h b/src/shared/common/sph_data_containers.h index 4fab20e19c..d597b3a324 100644 --- a/src/shared/common/sph_data_containers.h +++ b/src/shared/common/sph_data_containers.h @@ -75,8 +75,8 @@ typedef DataContainerAddressAssemble ParticleVariables; typedef DataContainerAddressAssemble SingleVariables; /** Generalized mesh data type */ -template -using MeshVariable = DiscreteVariable; +// template +// using MeshVariable = DiscreteVariable; typedef DataContainerAddressAssemble MeshVariableAssemble; } // namespace SPH diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index 5948517fef..c42995c583 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -31,7 +31,7 @@ Real BaseLevelSet::CutCellVolumeFraction(Real phi, const Vecd &phi_gradient, Rea //=================================================================================================// LevelSet::LevelSet(BoundingBox tentative_bounds, Real data_spacing, size_t buffer_size, Shape &shape, SPHAdaptation &sph_adaptation) - : MeshWithGridDataPackages>(tentative_bounds, data_spacing, buffer_size), + : MeshWithGridDataPackages<4>(tentative_bounds, data_spacing, buffer_size), BaseLevelSet(shape, sph_adaptation), global_h_ratio_(sph_adaptation.ReferenceSpacing() / data_spacing), phi_(*registerMeshVariable("Levelset")), @@ -42,36 +42,15 @@ LevelSet::LevelSet(BoundingBox tentative_bounds, Real data_spacing, size_t buffe kernel_(*sph_adaptation.getKernel()) { Real far_field_distance = grid_spacing_ * (Real)buffer_width_; - initializeASingularDataPackage( - all_mesh_variables_, [&](LevelSetDataPackage *data_pkg) - { initializeDataForSingularPackage(data_pkg, -far_field_distance); }); - initializeASingularDataPackage( - all_mesh_variables_, [&](LevelSetDataPackage *data_pkg) - { initializeDataForSingularPackage(data_pkg, far_field_distance); }); -} -//=================================================================================================// -void LevelSet::initializeAddressesInACell(const Arrayi &cell_index) -{ - initializePackageAddressesInACell(cell_index); + initializeDataForSingularPackage(0, -far_field_distance); + initializeDataForSingularPackage(1, far_field_distance); } //=================================================================================================// void LevelSet::updateLevelSetGradient() { - package_parallel_for(inner_data_pkgs_, [&](LevelSetDataPackage *data_pkg) - { data_pkg->computeGradient(phi_, phi_gradient_); }); -} -//=================================================================================================// -void LevelSet::updateKernelIntegrals() -{ - package_parallel_for(inner_data_pkgs_, - [&](LevelSetDataPackage *data_pkg) + package_parallel_for([&](size_t package_index) { - data_pkg->assignByPosition( - kernel_weight_, [&](const Vecd &position) -> Real - { return computeKernelIntegral(position); }); - data_pkg->assignByPosition( - kernel_gradient_, [&](const Vecd &position) -> Vecd - { return computeKernelGradientIntegral(position); }); + computeGradient(phi_, phi_gradient_, package_index); }); } //=================================================================================================// @@ -110,19 +89,6 @@ Vecd LevelSet::probeKernelGradientIntegral(const Vecd &position, Real h_ratio) return probeMesh(kernel_gradient_, position); } //=================================================================================================// -void LevelSet::redistanceInterface() -{ - package_parallel_for( - inner_data_pkgs_, - [&](LevelSetDataPackage *data_pkg) - { - if (data_pkg->isCorePackage()) - { - redistanceInterfaceForAPackage(data_pkg); - } - }); -} -//=================================================================================================// void LevelSet::cleanInterface(Real small_shift_factor) { markNearInterface(small_shift_factor); @@ -163,49 +129,27 @@ void LevelSet::initializeDataInACell(const Arrayi &cell_index) Real measure = (signed_distance * normal_direction).cwiseAbs().maxCoeff(); if (measure < grid_spacing_) { - LevelSetDataPackage *new_data_pkg = - createDataPackage( - all_mesh_variables_, cell_index, - [&](LevelSetDataPackage *new_data_pkg) - { - initializeBasicDataForAPackage(new_data_pkg, shape_); - }); - new_data_pkg->setCorePackage(); - core_data_pkgs_.push_back(new_data_pkg); + assignCore(cell_index); } else { - LevelSetDataPackage *singular_data_pkg = - shape_.checkContain(cell_position) - ? singular_data_pkgs_addrs_[0] - : singular_data_pkgs_addrs_[1]; - assignDataPackageAddress(cell_index, singular_data_pkg); + size_t package_index = shape_.checkContain(cell_position) ? 0 : 1; + assignSingular(cell_index); + assignDataPackageIndex(cell_index, package_index); } } -//=============================================================================================// +//=================================================================================================// void LevelSet::tagACellIsInnerPackage(const Arrayi &cell_index) { if (isInnerPackage(cell_index)) { - LevelSetDataPackage *current_data_pkg = DataPackageFromCellIndex(cell_index); - if (current_data_pkg->isCorePackage()) + if (!isCoreDataPackage(cell_index)) { - inner_data_pkgs_.push_back(current_data_pkg); - } - else - { - LevelSetDataPackage *new_data_pkg = createDataPackage( - all_mesh_variables_, cell_index, - [&](LevelSetDataPackage *new_data_pkg) - { - initializeBasicDataForAPackage(new_data_pkg, shape_); - }); - new_data_pkg->setInnerPackage(); - inner_data_pkgs_.push_back(new_data_pkg); + assignInner(cell_index); } } } -//=============================================================================================// +//=================================================================================================// Real LevelSet::upwindDifference(Real sign, Real df_p, Real df_n) { if (sign * df_p >= 0.0 && sign * df_n >= 0.0) @@ -229,10 +173,9 @@ Real LevelSet::upwindDifference(Real sign, Real df_p, Real df_n) void RefinedLevelSet::initializeDataInACellFromCoarse(const Arrayi &cell_index) { Vecd cell_position = CellPositionFromIndex(cell_index); - LevelSetDataPackage *singular_data_pkg = coarse_mesh_.probeSignedDistance(cell_position) < 0.0 - ? singular_data_pkgs_addrs_[0] - : singular_data_pkgs_addrs_[1]; - assignDataPackageAddress(cell_index, singular_data_pkg); + size_t package_index = coarse_mesh_.probeSignedDistance(cell_position) < 0.0 ? 0 : 1; + assignSingular(cell_index); + assignDataPackageIndex(cell_index, package_index); if (coarse_mesh_.isWithinCorePackage(cell_position)) { Real signed_distance = shape_.findSignedDistance(cell_position); @@ -240,14 +183,7 @@ void RefinedLevelSet::initializeDataInACellFromCoarse(const Arrayi &cell_index) Real measure = (signed_distance * normal_direction).cwiseAbs().maxCoeff(); if (measure < grid_spacing_) { - LevelSetDataPackage *new_data_pkg = createDataPackage( - all_mesh_variables_, cell_index, - [&](LevelSetDataPackage *new_data_pkg) - { - initializeBasicDataForAPackage(new_data_pkg, shape_); - }); - new_data_pkg->setCorePackage(); // core package - core_data_pkgs_.push_back(new_data_pkg); + assignCore(cell_index); } } } diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index 8fd7a55397..e33e98f331 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -74,12 +74,12 @@ class BaseLevelSet : public BaseMeshField * but within the data package, the data is grid-based. * Note that the level set data is initialized after the constructor. */ -class LevelSet : public MeshWithGridDataPackages>, +class LevelSet : public MeshWithGridDataPackages<4>, public BaseLevelSet { public: - typedef GridDataPackage<4, 1> LevelSetDataPackage; - ConcurrentVec core_data_pkgs_; /**< packages near to zero level set. */ + // typedef GridDataPackage<4, 1> LevelSetDataPackage; + // ConcurrentVec core_data_pkgs_; /**< packages near to zero level set. */ Real global_h_ratio_; /** This constructor only initialize far field. */ @@ -109,21 +109,22 @@ class LevelSet : public MeshWithGridDataPackages>, MeshVariable &kernel_gradient_; Kernel &kernel_; - void initializeDataForSingularPackage(LevelSetDataPackage *data_pkg, Real far_field_level_set); - void initializeBasicDataForAPackage(LevelSetDataPackage *data_pkg, Shape &shape); - void redistanceInterfaceForAPackage(LevelSetDataPackage *core_data_pkg); + void initializeDataForSingularPackage(const size_t package_index, Real far_field_level_set); + void initializeBasicDataForAPackage(const Arrayi &cell_index, const size_t package_index, Shape &shape); + void redistanceInterfaceForAPackage(const size_t package_index); void finishDataPackages(); void reinitializeLevelSet(); void markNearInterface(Real small_shift_factor); void redistanceInterface(); void diffuseLevelSetSign(); - void updateLevelSetGradient(); void updateKernelIntegrals(); bool isInnerPackage(const Arrayi &cell_index); void initializeDataInACell(const Arrayi &cell_index); - void initializeAddressesInACell(const Arrayi &cell_index); void tagACellIsInnerPackage(const Arrayi &cell_index); + void initializeIndexMesh(); + void initializeNeighbourhood(); + void updateLevelSetGradient(); // upwind algorithm choosing candidate difference by the sign Real upwindDifference(Real sign, Real df_p, Real df_n); diff --git a/src/shared/meshes/mesh_with_data_packages.h b/src/shared/meshes/mesh_with_data_packages.h index 19432d6505..5baebf7293 100644 --- a/src/shared/meshes/mesh_with_data_packages.h +++ b/src/shared/meshes/mesh_with_data_packages.h @@ -50,21 +50,21 @@ void package_for(const ConcurrentVec &data_pkgs, local_function(data_pkgs[i]); }; /** Iterator on a collection of mesh data packages. parallel computing. */ -template -void package_parallel_for(const ConcurrentVec &data_pkgs, - const LocalFunction &local_function, Args &&...args) -{ - parallel_for( - IndexRange(0, data_pkgs.size()), - [&](const IndexRange &r) - { - for (size_t i = r.begin(); i != r.end(); ++i) - { - local_function(data_pkgs[i]); - } - }, - ap); -}; +// template +// void package_parallel_for(const ConcurrentVec &data_pkgs, +// const LocalFunction &local_function, Args &&...args) +// { +// parallel_for( +// IndexRange(0, data_pkgs.size()), +// [&](const IndexRange &r) +// { +// for (size_t i = r.begin(); i != r.end(); ++i) +// { +// local_function(data_pkgs[i]); +// } +// }, +// ap); +// }; /** * @class BaseDataPackage @@ -92,135 +92,6 @@ class BaseDataPackage int state_indicator_; }; -/** - * @class GridDataPackage - * @brief Abstract base class for a grid-based data package - * whose data are defined on the grids of a small mesh patch. - * Note that, pkg_addrs_size = pkg_size + 2 * pkg_addrs_buffer; - * Also note that, while the mesh_lower_bound_ locates the first data address, - * the DataLowerBound() locates the first data for initialization. - * Also note that, as a inner package is contained in a background mesh cell, - * it will be constructed based on the grid position (lower-left corner) of the cell. - */ -template -class GridDataPackage : public BaseDataPackage, public BaseMesh -{ - public: - static constexpr int pkg_size = PKG_SIZE; - static constexpr int pkg_addrs_size = PKG_SIZE + ADDRS_BUFFER * 2; - static constexpr int pkg_addrs_buffer = ADDRS_BUFFER; - static constexpr int pkg_ops_end = PKG_SIZE + pkg_addrs_buffer; - template - using PackageData = PackageDataMatrix; - template - using PackageDataAddress = PackageDataMatrix; - /** Matrix data for temporary usage. Note that it is array with pkg_addrs_size. */ - template - using PackageTemporaryData = PackageDataMatrix; - - /** Default constructor for singular package */ - GridDataPackage() : BaseDataPackage(), BaseMesh(pkg_addrs_size * Arrayi::Ones()){}; - /** Constructor for inner package */ - GridDataPackage(const Vecd &container_lower_bound, Real data_spacing) - : BaseDataPackage(), - BaseMesh(container_lower_bound - data_spacing * Vecd::Ones() * ((Real)pkg_addrs_buffer - 0.5), - data_spacing, pkg_addrs_size * Arrayi::Ones()){}; - virtual ~GridDataPackage(){}; - Vecd DataPositionFromIndex(const Vecd &data_index) { return DataLowerBound() + data_index * grid_spacing_; }; - /** void (non_value_returning) function iterate on all data points by value, - * for function only involving the data itself. */ - template - void for_each_data(const FunctionOnData &function); - /** void (non_value_returning) function iterate on all data points by address, - * for function involving operations on data neighbors. */ - template - void for_each_addrs(const FunctionOnAddress &function); - /** access specific package data with mesh variable */ - template - PackageData &getPackageData(const MeshVariable &mesh_variable) - { - constexpr int type_index = DataTypeIndex::value; - return std::get(all_pkg_data_)[mesh_variable.IndexInContainer()]; - }; - /** access specific package data address with mesh variable */ - template - PackageDataAddress &getPackageDataAddress(const MeshVariable &mesh_variable) - { - constexpr int type_index = DataTypeIndex::value; - return std::get(all_pkg_data_addrs_)[mesh_variable.IndexInContainer()]; - }; - /** probe by applying bi and tri-linear interpolation within the package. */ - template - DataType probeDataPackage(PackageDataAddress &pkg_data_addrs, const Vecd &position); - /** assign value to data package according to the position of data */ - template - void assignByPosition(const MeshVariable &mesh_variable, - const FunctionByPosition &function_by_position); - /** compute gradient transform within data package */ - template - void computeGradient(const MeshVariable &in_variable, - const MeshVariable &out_variable); - /** obtain averaged value at a corner of a data cell */ - template - DataType CornerAverage(PackageDataAddress &pkg_data_addrs, - Arrayi addrs_index, Arrayi corner_direction); - - protected: - DataContainerAssemble all_pkg_data_; - DataContainerAssemble all_pkg_data_addrs_; - - /** lower bound coordinate for the data as reference */ - Vecd DataLowerBound() { return mesh_lower_bound_ + grid_spacing_ * Vecd::Ones() * (Real)pkg_addrs_buffer; }; - /** allocate memory for all package data */ - template - struct AllVariablesAllocation - { - void operator()(DataContainerAssemble &all_pkg_data, - DataContainerAssemble &all_pkg_data_addrs, - const MeshVariableAssemble &all_mesh_variables_) - { - constexpr int type_index = DataTypeIndex::value; - size_t total_variables = std::get(all_mesh_variables_).size(); - std::get(all_pkg_data).resize(total_variables); - std::get(all_pkg_data_addrs).resize(total_variables); - }; - }; - DataAssembleOperation allocate_all_variables_; - /** set the initial package data address for singular data package */ - template - struct AssignSingularPackageDataAddress - { - void operator()(DataContainerAssemble &all_pkg_data, - DataContainerAssemble &all_pkg_data_addrs); - }; - DataAssembleOperation assign_singular_pkg_data_addrs_; - /** assign address for all package data when the package is an inner one */ - template - struct AssignPackageDataAddress - { - void operator()(DataContainerAssemble &all_pkg_data_addrs, - const Arrayi &addrs_index, - DataContainerAssemble &all_pkg_data, - const Arrayi &data_index); - }; - DataAssembleOperation assign_pkg_data_addrs_; - - public: - void allocateAllVariables(const MeshVariableAssemble &all_mesh_variables_) - { - allocate_all_variables_(all_pkg_data_, all_pkg_data_addrs_, all_mesh_variables_); - }; - - void assignSingularPackageDataAddress() - { - assign_singular_pkg_data_addrs_(all_pkg_data_, all_pkg_data_addrs_); - }; - - void assignPackageDataAddress(const Arrayi &addrs_index, GridDataPackage *src_pkg, const Arrayi &data_index) - { - assign_pkg_data_addrs_(all_pkg_data_addrs_, addrs_index, src_pkg->all_pkg_data_, data_index); - }; -}; /** * @class MeshWithGridDataPackages @@ -238,7 +109,8 @@ class GridDataPackage : public BaseDataPackage, public BaseMesh * All these data packages are indexed by a concurrent vector inner_data_pkgs_. * Note that a data package should be not near the mesh bound, otherwise one will encounter the error "out of range". */ -template +// template +template class MeshWithGridDataPackages : public Mesh { private: @@ -247,34 +119,42 @@ class MeshWithGridDataPackages : public Mesh public: template explicit MeshWithGridDataPackages(BoundingBox tentative_bounds, Real data_spacing, size_t buffer_size) - : Mesh(tentative_bounds, GridDataPackageType::pkg_size * data_spacing, buffer_size), + : Mesh(tentative_bounds, pkg_size * data_spacing, buffer_size), data_spacing_(data_spacing), global_mesh_(this->mesh_lower_bound_ + 0.5 * data_spacing * Vecd::Ones(), data_spacing, this->all_cells_ * pkg_size) { - allocateMeshDataMatrix(); + allocateIndexDataMatrix(); + allocateMetaDataMatrix(); + }; + virtual ~MeshWithGridDataPackages() + { + deleteIndexDataMatrix(); + deleteMetaDataMatrix(); + delete[] neighbourhood_; }; - virtual ~MeshWithGridDataPackages() { deleteMeshDataMatrix(); }; /** spacing between the data, which is 1/ pkg_size of this grid spacing */ virtual Real DataSpacing() override { return data_spacing_; }; protected: MeshVariableAssemble all_mesh_variables_; /**< all mesh variables on this mesh. */ - MyMemoryPool data_pkg_pool_; /**< memory pool for all packages in the mesh. */ - MeshDataMatrix data_pkg_addrs_; /**< Address of data packages. */ - ConcurrentVec inner_data_pkgs_; /**< Inner data packages which is able to carry out spatial operations. */ - /** Singular data packages. provided for far field condition with usually only two values. - * For example, when level set is considered. The first value for inner far-field and second for outer far-field */ - StdVec singular_data_pkgs_addrs_; - static constexpr int pkg_size = GridDataPackageType::pkg_size; /**< the size of the data package matrix*/ - static constexpr int pkg_addrs_buffer = GridDataPackageType::pkg_addrs_buffer; /**< the size of address buffer, a value less than the package size. */ - static constexpr int pkg_ops_end = GridDataPackageType::pkg_ops_end; /**< the size of operation loops. */ - static constexpr int pkg_addrs_size = GridDataPackageType::pkg_addrs_size; /**< the size of address matrix in the data packages. */ + static constexpr int pkg_size = PKG_SIZE; /**< the size of the data package matrix*/ const Real data_spacing_; /**< spacing of data in the data packages*/ - std::mutex mutex_my_pool; /**< mutex exclusion for memory pool */ BaseMesh global_mesh_; /**< the mesh for the locations of all possible data points. */ + size_t num_grid_pkgs_ = 2; + MeshDataMatrix data_pkg_idx_; + using MetaData = std::pair; /**< stores the metadata for each cell: (int)singular0/inner1/core2, (size_t)package data index*/ + MeshDataMatrix meta_data_mesh_; + Neighbourhood* neighbourhood_; + template + using PackageData = PackageDataMatrix; + using NeighbourIndex = std::pair; + template + using PackageTemporaryData = PackageDataMatrix; - void allocateMeshDataMatrix(); /**< allocate memories for addresses of data packages. */ - void deleteMeshDataMatrix(); /**< delete memories for addresses of data packages. */ + void allocateIndexDataMatrix(); /**< allocate memories for addresses of data packages. */ + void allocateMetaDataMatrix(); /**< allocate memories for addresses of data packages. */ + void deleteIndexDataMatrix(); /**< delete memories for addresses of data packages. */ + void deleteMetaDataMatrix(); /**< delete memories for addresses of data packages. */ template MeshVariable *registerMeshVariable(const std::string &variable_name) @@ -291,56 +171,93 @@ class MeshWithGridDataPackages : public Mesh return variable; }; - template - void initializeASingularDataPackage( - const DataContainerAddressAssemble &all_mesh_variables_, - const InitializeSingularData &initialize_singular_data) + /** This function probe a mesh value */ + template + DataType probeMesh(MeshVariable &mesh_variable, const Vecd &position); + /** This function find the value of data from its index from global mesh. */ + template + DataType DataValueFromGlobalIndex(MeshVariable &mesh_variable, + const Arrayi &global_grid_index); + + /** resize all mesh variable data field (initially only singular data) */ + template + struct ResizeMeshVariableData { - GridDataPackageType *new_data_pkg = data_pkg_pool_.malloc(); - new_data_pkg->allocateAllVariables(all_mesh_variables_); - initialize_singular_data(new_data_pkg); - new_data_pkg->assignSingularPackageDataAddress(); - singular_data_pkgs_addrs_.push_back(new_data_pkg); + void operator()(MeshVariableAssemble &all_mesh_variables_, + const size_t num_grid_pkgs_) + { + constexpr int type_index = DataTypeIndex::value; + for (size_t l = 0; l != std::get(all_mesh_variables_).size(); ++l) + { + MeshVariable *variable = std::get(all_mesh_variables_)[l]; + variable->allocateAllMeshVariableData(num_grid_pkgs_); + } + } }; + DataAssembleOperation resize_mesh_variable_data_; + + void resizeMeshVariableData() + { + resize_mesh_variable_data_(all_mesh_variables_, num_grid_pkgs_); + } + + /** void (non_value_returning) function iterate on all data points by value, + * for function only involving the data itself. */ + template + void for_each_cell_data(const FunctionOnData &function); + + void assignDataPackageIndex(const Arrayi &cell_index, const size_t package_index); + size_t PackageIndexFromCellIndex(const Arrayi &cell_index); + void assignCategoryOnMetaDataMesh(const Arrayi &cell_index, const int category); + void assignSingular(const Arrayi &cell_index) { assignCategoryOnMetaDataMesh(cell_index, 0); }; + void assignInner(const Arrayi &cell_index) { assignCategoryOnMetaDataMesh(cell_index, 1); }; + void assignCore(const Arrayi &cell_index) { assignCategoryOnMetaDataMesh(cell_index, 2); }; + bool isSingularDataPackage(const Arrayi &cell_index); + bool isInnerDataPackage(const Arrayi &cell_index); + bool isCoreDataPackage(const Arrayi &cell_index); - template - GridDataPackageType *createDataPackage( - const DataContainerAddressAssemble &all_mesh_variables_, - const Arrayi &cell_index, - const InitializePackageData &initialize_package_data) + std::pair NeighbourIndexShift(const Arrayi shift_index, const Neighbourhood &neighbour); + Vecd DataPositionFromIndex(Arrayi cell_index, Vecd data_index) { - mutex_my_pool.lock(); Vecd cell_position = CellPositionFromIndex(cell_index); Vecd grid_position = GridPositionFromCellPosition(cell_position); - GridDataPackageType *new_data_pkg = data_pkg_pool_.malloc(grid_position, data_spacing_); - mutex_my_pool.unlock(); - new_data_pkg->allocateAllVariables(all_mesh_variables_); - initialize_package_data(new_data_pkg); - new_data_pkg->setCellIndexOnMesh(cell_index); - assignDataPackageAddress(cell_index, new_data_pkg); - return new_data_pkg; - }; + return grid_position + data_spacing_ * (0.5 * Vecd::Ones() + data_index); + } + template + void assignByPosition(MeshVariable &mesh_variable, + const Arrayi cell_index, + const FunctionByPosition &function_by_position); + template + void computeGradient(MeshVariable &in_variable, + MeshVariable &out_variable, + const size_t package_index); + template + DataType CornerAverage(MeshVariable &mesh_variable, + Arrayi addrs_index, Arrayi corner_direction, + Neighbourhood &neighbourhood); + template + DataType probeDataPackage(MeshVariable &mesh_variable, size_t package_index, const Arrayi cell_index, const Vecd &position); - void assignDataPackageAddress(const Arrayi &cell_index, GridDataPackageType *data_pkg); - /** Return data package with given cell index. */ - GridDataPackageType *DataPackageFromCellIndex(const Arrayi &cell_index); - void initializePackageAddressesInACell(const Arrayi &cell_index); - /** Find related cell index and data index for a data package address matrix */ - std::pair CellShiftAndDataIndex(int data_addrs_index_component) + Vecd CellMeshLowerBound(const Arrayi cell_index) { - std::pair shift_and_index; - int signed_date_index = data_addrs_index_component - pkg_addrs_buffer; - shift_and_index.first = (signed_date_index + pkg_size) / pkg_size - 1; - shift_and_index.second = signed_date_index - shift_and_index.first * pkg_size; - return shift_and_index; + return mesh_lower_bound_ + cell_index.cast().matrix() * grid_spacing_ + 0.5 * Vecd::Ones() * data_spacing_; } - /** This function probe a mesh value */ - template - DataType probeMesh(const MeshVariable &mesh_variable, const Vecd &position); - /** This function find the value of data from its index from global mesh. */ - template - DataType DataValueFromGlobalIndex(const MeshVariable &mesh_variable, - const Arrayi &global_grid_index); + Arrayi LocalGridIndexFromPosition(const Arrayi cell_index, const Vecd &position) + { + Vecd cell_mesh_lower_bound = CellMeshLowerBound(cell_index); + return floor((position - cell_mesh_lower_bound).array() / data_spacing_) + .template cast() + .max(Arrayi::Zero()) + .min((pkg_size-1) * Arrayi::Ones()); + } + Vecd GridPositionFromLocalGridIndex(const Arrayi cell_index, const Arrayi grid_index) + { + Vecd cell_mesh_lower_bound = CellMeshLowerBound(cell_index); + return cell_mesh_lower_bound + grid_index.cast().matrix() * data_spacing_; + } + + template + void package_parallel_for(const FunctionOnData &function); }; } // namespace SPH #endif // MESH_WITH_DATA_PACKAGES_H diff --git a/src/shared/variables/base_variable.h b/src/shared/variables/base_variable.h index d63da3e8d0..2173685e8f 100644 --- a/src/shared/variables/base_variable.h +++ b/src/shared/variables/base_variable.h @@ -31,6 +31,8 @@ #define BASE_VARIABLES_H #include "base_data_package.h" +#include +#include namespace SPH { @@ -73,6 +75,32 @@ class DiscreteVariable : public BaseVariable size_t index_in_container_; }; +template +class MeshVariable : public BaseVariable +{ + public: + using PackageData = PackageDataMatrix; + MeshVariable(const std::string &name, size_t index) + : BaseVariable(name), + index_in_container_(index){ data_field_ = new PackageData[2]; }; + virtual ~MeshVariable(){ delete[] data_field_; }; + + size_t IndexInContainer() const { return index_in_container_; }; + // void setDataField(PackageData* mesh_data){ data_field_ = mesh_data; }; + PackageData* DataField(){ return data_field_; }; + void allocateAllMeshVariableData(const size_t size){ + PackageData* temp = new PackageData[size]; + std::memcpy(temp, data_field_, 2 * sizeof(PackageData)); + // delete[] temp; + delete[] data_field_; + data_field_ = temp; + } + + private: + size_t index_in_container_; + PackageData* data_field_; +}; + template class VariableType> VariableType *findVariableByName(DataContainerAddressAssemble &assemble, const std::string &name) From dbf812625efa7f60dfee765143fe57b46a8b632c Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Sun, 2 Jun 2024 21:51:38 +0200 Subject: [PATCH 02/55] 2d/3d shared combined --- src/for_2D_build/geometries/level_set_2d.cpp | 140 ++++++++++--------- src/for_3D_build/geometries/level_set_3d.cpp | 77 +++++----- src/shared/geometries/level_set.cpp | 37 ++++- src/shared/meshes/mesh_with_data_packages.h | 2 + 4 files changed, 149 insertions(+), 107 deletions(-) diff --git a/src/for_2D_build/geometries/level_set_2d.cpp b/src/for_2D_build/geometries/level_set_2d.cpp index 9dbb84c924..c82ec14fab 100644 --- a/src/for_2D_build/geometries/level_set_2d.cpp +++ b/src/for_2D_build/geometries/level_set_2d.cpp @@ -52,15 +52,20 @@ void LevelSet::finishDataPackages() initializeIndexMesh(); initializeNeighbourhood(); resizeMeshVariableData(); - mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), - [&](size_t i, size_t j) - { - Arrayi cell_index = Arrayi(i, j); - if(isInnerDataPackage(cell_index)) - { - initializeBasicDataForAPackage(Arrayi(i, j), PackageIndexFromCellIndex(cell_index), shape_); - } - }); + // mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), + // [&](size_t i, size_t j) + // { + // Arrayi cell_index = Arrayi(i, j); + // if(isInnerDataPackage(cell_index)) + // { + // initializeBasicDataForAPackage(Arrayi(i, j), PackageIndexFromCellIndex(cell_index), shape_); + // } + // }); + package_parallel_for( + [&](size_t package_index) + { + initializeBasicDataForAPackage(meta_data_cell_[package_index].first, package_index, shape_); + }); updateLevelSetGradient(); updateKernelIntegrals(); @@ -95,22 +100,20 @@ void LevelSet::finishDataPackages() // } // } //=================================================================================================// -void LevelSet::updateKernelIntegrals() -{ - mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), - [&](size_t i, size_t j) - { - Arrayi cell_index = Arrayi(i, j); - if (isInnerDataPackage(cell_index)){ - assignByPosition( - kernel_weight_, cell_index, [&](const Vecd &position) -> Real - { return computeKernelIntegral(position); }); - assignByPosition( - kernel_gradient_, cell_index, [&](const Vecd &position) -> Vecd - { return computeKernelGradientIntegral(position); }); - } - }); -} +// void LevelSet::updateKernelIntegrals() +// { +// package_parallel_for( +// [&](size_t package_index) +// { +// Arrayi cell_index = meta_data_cell_[package_index].first; +// assignByPosition( +// kernel_weight_, cell_index, [&](const Vecd &position) -> Real +// { return computeKernelIntegral(position); }); +// assignByPosition( +// kernel_gradient_, cell_index, [&](const Vecd &position) -> Vecd +// { return computeKernelGradientIntegral(position); }); +// }); +// } //=================================================================================================// void LevelSet::initializeIndexMesh() { @@ -128,6 +131,7 @@ void LevelSet::initializeIndexMesh() void LevelSet::initializeNeighbourhood() { neighbourhood_ = new Neighbourhood[num_grid_pkgs_]; + meta_data_cell_ = new std::pair[num_grid_pkgs_]; mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), [&](size_t i, size_t j) { @@ -135,6 +139,9 @@ void LevelSet::initializeNeighbourhood() if (isInnerDataPackage(cell_index)) { Neighbourhood ¤t = neighbourhood_[PackageIndexFromCellIndex(cell_index)]; + std::pair &metadata = meta_data_cell_[PackageIndexFromCellIndex(cell_index)]; + metadata.first = cell_index; + metadata.second = isCoreDataPackage(cell_index) ? 1 : 0; for(int l = -1; l < 2; l++) for(int m = -1; m < 2; m++) { @@ -163,35 +170,36 @@ bool LevelSet::isInnerPackage(const Arrayi &cell_index) //=================================================================================================// void LevelSet::diffuseLevelSetSign() { - package_parallel_for([&](size_t package_index) - { - auto phi_data = phi_.DataField(); - auto near_interface_id_data = near_interface_id_.DataField(); - auto &neighbourhood = neighbourhood_[package_index]; + package_parallel_for( + [&](size_t package_index) + { + auto phi_data = phi_.DataField(); + auto near_interface_id_data = near_interface_id_.DataField(); + auto &neighbourhood = neighbourhood_[package_index]; - for_each_cell_data( - [&](int i, int j) + for_each_cell_data( + [&](int i, int j) + { + // near interface cells are not considered + if (abs(near_interface_id_data[package_index][i][j]) > 1) { - // near interface cells are not considered - if (abs(near_interface_id_data[package_index][i][j]) > 1) - { - mesh_find_if2d<-1, 2>( - [&](int l, int m) -> bool + mesh_find_if2d<-1, 2>( + [&](int l, int m) -> bool + { + NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i+l, j+m), neighbourhood); + int near_interface_id = near_interface_id_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]]; + bool is_found = abs(near_interface_id) == 1; + if (is_found) { - NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i+l, j+m), neighbourhood); - int near_interface_id = near_interface_id_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]]; - bool is_found = abs(near_interface_id) == 1; - if (is_found) - { - Real phi_0 = phi_data[package_index][i][j]; - near_interface_id_data[package_index][i][j] = near_interface_id; - phi_data[package_index][i][j] = near_interface_id == 1 ? fabs(phi_0) : -fabs(phi_0); - } - return is_found; - }); - } - }); - }); + Real phi_0 = phi_data[package_index][i][j]; + near_interface_id_data[package_index][i][j] = near_interface_id; + phi_data[package_index][i][j] = near_interface_id == 1 ? fabs(phi_0) : -fabs(phi_0); + } + return is_found; + }); + } + }); + }); } //=============================================================================================// void LevelSet::reinitializeLevelSet() @@ -202,7 +210,8 @@ void LevelSet::reinitializeLevelSet() // Arrayi cell_index = Arrayi(i, j); // if (isInnerDataPackage(cell_index)){ // size_t package_index = PackageIndexFromCellIndex(cell_index); - package_parallel_for([&](size_t package_index) + package_parallel_for( + [&](size_t package_index) { auto phi_data = phi_.DataField(); auto &phi_addrs = phi_data[package_index]; @@ -241,7 +250,8 @@ void LevelSet::markNearInterface(Real small_shift_factor) // Arrayi cell_index = Arrayi(i, j); // if (isInnerDataPackage(cell_index)){ // size_t package_index = PackageIndexFromCellIndex(cell_index); - package_parallel_for([&](size_t package_index) + package_parallel_for( + [&](size_t package_index) { auto &phi_addrs = phi_.DataField()[package_index]; auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; @@ -304,18 +314,18 @@ void LevelSet::initializeBasicDataForAPackage(const Arrayi &cell_index, const si }); } //=================================================================================================// -void LevelSet::redistanceInterface() -{ - mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), - [&](size_t i, size_t j) - { - Arrayi cell_index = Arrayi(i, j); - if (isCoreDataPackage(cell_index)) - { - redistanceInterfaceForAPackage(PackageIndexFromCellIndex(cell_index)); - } - }); -} +// void LevelSet::redistanceInterface() +// { +// package_parallel_for( +// [&](size_t package_index) +// { +// std::pair &metadata = meta_data_cell_[package_index]; +// if (metadata.second == 1) +// { +// redistanceInterfaceForAPackage(PackageIndexFromCellIndex(metadata.first)); +// } +// }); +// } //=================================================================================================// void LevelSet::redistanceInterfaceForAPackage(const size_t package_index) { diff --git a/src/for_3D_build/geometries/level_set_3d.cpp b/src/for_3D_build/geometries/level_set_3d.cpp index 60d7678afc..ebf0988c1d 100644 --- a/src/for_3D_build/geometries/level_set_3d.cpp +++ b/src/for_3D_build/geometries/level_set_3d.cpp @@ -52,15 +52,11 @@ void LevelSet::finishDataPackages() initializeIndexMesh(); initializeNeighbourhood(); resizeMeshVariableData(); - mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), - [&](size_t i, size_t j, size_t k) - { - Arrayi cell_index = Arrayi(i, j, k); - if(isInnerDataPackage(cell_index)) - { - initializeBasicDataForAPackage(Arrayi(i, j, k), PackageIndexFromCellIndex(cell_index), shape_); - } - }); + package_parallel_for( + [&](size_t package_index) + { + initializeBasicDataForAPackage(meta_data_cell_[package_index].first, package_index, shape_); + }); updateLevelSetGradient(); updateKernelIntegrals(); @@ -95,22 +91,22 @@ void LevelSet::finishDataPackages() // } // } //=================================================================================================// -void LevelSet::updateKernelIntegrals() -{ - mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), - [&](size_t i, size_t j, size_t k) - { - Arrayi cell_index = Arrayi(i, j, k); - if (isInnerPackage(cell_index)){ - assignByPosition( - kernel_weight_, cell_index, [&](const Vecd &position) -> Real - { return computeKernelIntegral(position); }); - assignByPosition( - kernel_gradient_, cell_index, [&](const Vecd &position) -> Vecd - { return computeKernelGradientIntegral(position); }); - } - }); -} +// void LevelSet::updateKernelIntegrals() +// { +// mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), +// [&](size_t i, size_t j, size_t k) +// { +// Arrayi cell_index = Arrayi(i, j, k); +// if (isInnerPackage(cell_index)){ +// assignByPosition( +// kernel_weight_, cell_index, [&](const Vecd &position) -> Real +// { return computeKernelIntegral(position); }); +// assignByPosition( +// kernel_gradient_, cell_index, [&](const Vecd &position) -> Vecd +// { return computeKernelGradientIntegral(position); }); +// } +// }); +// } //=================================================================================================// void LevelSet::initializeIndexMesh() { @@ -128,6 +124,7 @@ void LevelSet::initializeIndexMesh() void LevelSet::initializeNeighbourhood() { neighbourhood_ = new Neighbourhood[num_grid_pkgs_]; + meta_data_cell_ = new std::pair[num_grid_pkgs_]; mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), [&](size_t i, size_t j, size_t k) { @@ -135,6 +132,9 @@ void LevelSet::initializeNeighbourhood() if (isInnerDataPackage(cell_index)) { Neighbourhood ¤t = neighbourhood_[PackageIndexFromCellIndex(cell_index)]; + std::pair &metadata = meta_data_cell_[PackageIndexFromCellIndex(cell_index)]; + metadata.first = cell_index; + metadata.second = isCoreDataPackage(cell_index) ? 1 : 0; for(int l = -1; l < 2; l++) for(int m = -1; m < 2; m++) for(int n = -1; n < 2; n++) @@ -197,7 +197,8 @@ void LevelSet::diffuseLevelSetSign() //=============================================================================================// void LevelSet::reinitializeLevelSet() { - package_parallel_for([&](size_t package_index) + package_parallel_for( + [&](size_t package_index) { auto phi_data = phi_.DataField(); auto &phi_addrs = phi_data[package_index]; @@ -293,18 +294,18 @@ void LevelSet::initializeBasicDataForAPackage(const Arrayi &cell_index, const si }); } //=================================================================================================// -void LevelSet::redistanceInterface() -{ - mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), - [&](size_t i, size_t j, size_t k) - { - Arrayi cell_index = Arrayi(i, j, k); - if (isCoreDataPackage(cell_index)) - { - redistanceInterfaceForAPackage(PackageIndexFromCellIndex(cell_index)); - } - }); -} +// void LevelSet::redistanceInterface() +// { +// mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), +// [&](size_t i, size_t j, size_t k) +// { +// Arrayi cell_index = Arrayi(i, j, k); +// if (isCoreDataPackage(cell_index)) +// { +// redistanceInterfaceForAPackage(PackageIndexFromCellIndex(cell_index)); +// } +// }); +// } //=================================================================================================// void LevelSet::redistanceInterfaceForAPackage(const size_t package_index) { diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index c42995c583..eb5c79ea84 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -48,10 +48,26 @@ LevelSet::LevelSet(BoundingBox tentative_bounds, Real data_spacing, size_t buffe //=================================================================================================// void LevelSet::updateLevelSetGradient() { - package_parallel_for([&](size_t package_index) - { - computeGradient(phi_, phi_gradient_, package_index); - }); + package_parallel_for( + [&](size_t package_index) + { + computeGradient(phi_, phi_gradient_, package_index); + }); +} +//=================================================================================================// +void LevelSet::updateKernelIntegrals() +{ + package_parallel_for( + [&](size_t package_index) + { + Arrayi cell_index = meta_data_cell_[package_index].first; + assignByPosition( + kernel_weight_, cell_index, [&](const Vecd &position) -> Real + { return computeKernelIntegral(position); }); + assignByPosition( + kernel_gradient_, cell_index, [&](const Vecd &position) -> Vecd + { return computeKernelGradientIntegral(position); }); + }); } //=================================================================================================// Vecd LevelSet::probeNormalDirection(const Vecd &position) @@ -89,6 +105,19 @@ Vecd LevelSet::probeKernelGradientIntegral(const Vecd &position, Real h_ratio) return probeMesh(kernel_gradient_, position); } //=================================================================================================// +void LevelSet::redistanceInterface() +{ + package_parallel_for( + [&](size_t package_index) + { + std::pair &metadata = meta_data_cell_[package_index]; + if (metadata.second == 1) + { + redistanceInterfaceForAPackage(PackageIndexFromCellIndex(metadata.first)); + } + }); +} +//=================================================================================================// void LevelSet::cleanInterface(Real small_shift_factor) { markNearInterface(small_shift_factor); diff --git a/src/shared/meshes/mesh_with_data_packages.h b/src/shared/meshes/mesh_with_data_packages.h index 5baebf7293..a9979b8d02 100644 --- a/src/shared/meshes/mesh_with_data_packages.h +++ b/src/shared/meshes/mesh_with_data_packages.h @@ -131,6 +131,7 @@ class MeshWithGridDataPackages : public Mesh deleteIndexDataMatrix(); deleteMetaDataMatrix(); delete[] neighbourhood_; + delete[] meta_data_cell_; }; /** spacing between the data, which is 1/ pkg_size of this grid spacing */ virtual Real DataSpacing() override { return data_spacing_; }; @@ -145,6 +146,7 @@ class MeshWithGridDataPackages : public Mesh using MetaData = std::pair; /**< stores the metadata for each cell: (int)singular0/inner1/core2, (size_t)package data index*/ MeshDataMatrix meta_data_mesh_; Neighbourhood* neighbourhood_; + std::pair *meta_data_cell_; template using PackageData = PackageDataMatrix; using NeighbourIndex = std::pair; From fcbd0909d9d997769940f3da7bc1474f7024a558 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Mon, 3 Jun 2024 12:53:22 +0200 Subject: [PATCH 03/55] sync --- src/for_2D_build/geometries/level_set_2d.cpp | 80 +------------------ .../meshes/mesh_with_data_packages.hpp | 36 +-------- src/for_3D_build/geometries/level_set_3d.cpp | 67 ++-------------- .../meshes/mesh_with_data_packages.hpp | 28 +------ src/shared/meshes/mesh_with_data_packages.h | 71 +++++++++------- 5 files changed, 48 insertions(+), 234 deletions(-) diff --git a/src/for_2D_build/geometries/level_set_2d.cpp b/src/for_2D_build/geometries/level_set_2d.cpp index c82ec14fab..0cbed9964e 100644 --- a/src/for_2D_build/geometries/level_set_2d.cpp +++ b/src/for_2D_build/geometries/level_set_2d.cpp @@ -52,15 +52,6 @@ void LevelSet::finishDataPackages() initializeIndexMesh(); initializeNeighbourhood(); resizeMeshVariableData(); - // mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), - // [&](size_t i, size_t j) - // { - // Arrayi cell_index = Arrayi(i, j); - // if(isInnerDataPackage(cell_index)) - // { - // initializeBasicDataForAPackage(Arrayi(i, j), PackageIndexFromCellIndex(cell_index), shape_); - // } - // }); package_parallel_for( [&](size_t package_index) { @@ -71,50 +62,6 @@ void LevelSet::finishDataPackages() updateKernelIntegrals(); } //=================================================================================================// -// void LevelSet::initializeDataInACell(const Arrayi &cell_index) -// { -// Vecd cell_position = CellPositionFromIndex(cell_index); -// Real signed_distance = shape_.findSignedDistance(cell_position); -// Vecd normal_direction = shape_.findNormalDirection(cell_position); -// Real measure = (signed_distance * normal_direction).cwiseAbs().maxCoeff(); -// if (measure < grid_spacing_) -// { -// assignCore(cell_index); -// } -// else -// { -// size_t package_index = shape_.checkContain(cell_position) ? 0 : 1; -// assignSingular(cell_index); -// assignDataPackageIndex(cell_index, package_index); -// } -// } -// //=================================================================================================// -// void LevelSet::tagACellIsInnerPackage(const Arrayi &cell_index) -// { -// if (isInnerPackage(cell_index)) -// { -// if (!isCoreDataPackage(cell_index)) -// { -// assignInner(cell_index); -// } -// } -// } -//=================================================================================================// -// void LevelSet::updateKernelIntegrals() -// { -// package_parallel_for( -// [&](size_t package_index) -// { -// Arrayi cell_index = meta_data_cell_[package_index].first; -// assignByPosition( -// kernel_weight_, cell_index, [&](const Vecd &position) -> Real -// { return computeKernelIntegral(position); }); -// assignByPosition( -// kernel_gradient_, cell_index, [&](const Vecd &position) -> Vecd -// { return computeKernelGradientIntegral(position); }); -// }); -// } -//=================================================================================================// void LevelSet::initializeIndexMesh() { mesh_for(MeshRange(Arrayi::Zero(), all_cells_), @@ -204,12 +151,6 @@ void LevelSet::diffuseLevelSetSign() //=============================================================================================// void LevelSet::reinitializeLevelSet() { - // mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), - // [&](size_t i, size_t j) - // { - // Arrayi cell_index = Arrayi(i, j); - // if (isInnerDataPackage(cell_index)){ - // size_t package_index = PackageIndexFromCellIndex(cell_index); package_parallel_for( [&](size_t package_index) { @@ -244,12 +185,6 @@ void LevelSet::markNearInterface(Real small_shift_factor) { Real small_shift = small_shift_factor * data_spacing_; - // mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), - // [&](size_t i, size_t j) - // { - // Arrayi cell_index = Arrayi(i, j); - // if (isInnerDataPackage(cell_index)){ - // size_t package_index = PackageIndexFromCellIndex(cell_index); package_parallel_for( [&](size_t package_index) { @@ -308,25 +243,12 @@ void LevelSet::initializeBasicDataForAPackage(const Arrayi &cell_index, const si for_each_cell_data( [&](int i, int j) { - Vec2d position = DataPositionFromIndex(cell_index, Vec2d(i, j)); + Vec2d position = GridPositionFromLocalGridIndex(cell_index, Array2i(i, j)); phi[i][j] = shape.findSignedDistance(position); near_interface_id[i][j] = phi[i][j] < 0.0 ? -2 : 2; }); } //=================================================================================================// -// void LevelSet::redistanceInterface() -// { -// package_parallel_for( -// [&](size_t package_index) -// { -// std::pair &metadata = meta_data_cell_[package_index]; -// if (metadata.second == 1) -// { -// redistanceInterfaceForAPackage(PackageIndexFromCellIndex(metadata.first)); -// } -// }); -// } -//=================================================================================================// void LevelSet::redistanceInterfaceForAPackage(const size_t package_index) { auto phi_data = phi_.DataField(); diff --git a/src/for_2D_build/meshes/mesh_with_data_packages.hpp b/src/for_2D_build/meshes/mesh_with_data_packages.hpp index 1c835bd566..747508ed3b 100644 --- a/src/for_2D_build/meshes/mesh_with_data_packages.hpp +++ b/src/for_2D_build/meshes/mesh_with_data_packages.hpp @@ -33,18 +33,6 @@ DataType MeshWithGridDataPackages:: } //=================================================================================================// template -void MeshWithGridDataPackages::allocateIndexDataMatrix() -{ - Allocate2dArray(data_pkg_idx_, all_cells_); -} -//=================================================================================================// -template -void MeshWithGridDataPackages::deleteIndexDataMatrix() -{ - Delete2dArray(data_pkg_idx_, all_cells_); -} -//=================================================================================================// -template void MeshWithGridDataPackages::allocateMetaDataMatrix() { Allocate2dArray(meta_data_mesh_, all_cells_); @@ -151,7 +139,7 @@ void MeshWithGridDataPackages:: for (int i = 0; i != pkg_size; ++i) for (int j = 0; j != pkg_size; ++j) { - Vec2d position = DataPositionFromIndex(cell_index, Vec2d(i, j)); + Vec2d position = GridPositionFromLocalGridIndex(cell_index, Arrayi(i, j)); pkg_data[i][j] = function_by_position(position); } } @@ -228,28 +216,6 @@ DataType MeshWithGridDataPackages:: return bilinear; } //=================================================================================================// -template -template -void MeshWithGridDataPackages:: - package_parallel_for(const FunctionOnData &function) -{ - // for(size_t i = 2; i < num_grid_pkgs_; i++){ - // // size_t package_index = neighbourhood_[i][1][1]; - // // printf("now parallel for package %zu\n", package_index); - // function(i); - // } - parallel_for( - IndexRange(2, num_grid_pkgs_), - [&](const IndexRange &r) - { - for (size_t i = r.begin(); i != r.end(); ++i) - { - function(i); - } - }, - ap); -} -//=================================================================================================// } // namespace SPH //=================================================================================================// #endif // MESH_WITH_DATA_PACKAGES_2D_HPP \ No newline at end of file diff --git a/src/for_3D_build/geometries/level_set_3d.cpp b/src/for_3D_build/geometries/level_set_3d.cpp index ebf0988c1d..5848dce1a2 100644 --- a/src/for_3D_build/geometries/level_set_3d.cpp +++ b/src/for_3D_build/geometries/level_set_3d.cpp @@ -62,52 +62,6 @@ void LevelSet::finishDataPackages() updateKernelIntegrals(); } //=================================================================================================// -// void LevelSet::initializeDataInACell(const Arrayi &cell_index) -// { -// Vecd cell_position = CellPositionFromIndex(cell_index); -// Real signed_distance = shape_.findSignedDistance(cell_position); -// Vecd normal_direction = shape_.findNormalDirection(cell_position); -// Real measure = (signed_distance * normal_direction).cwiseAbs().maxCoeff(); -// if (measure < grid_spacing_) -// { -// assignCore(cell_index); -// } -// else -// { -// size_t package_index = shape_.checkContain(cell_position) ? 0 : 1; -// assignSingular(cell_index); -// assignDataPackageIndex(cell_index, package_index); -// } -// } -// //=================================================================================================// -// void LevelSet::tagACellIsInnerPackage(const Arrayi &cell_index) -// { -// if (isInnerPackage(cell_index)) -// { -// if (!isCoreDataPackage(cell_index)) -// { -// assignInner(cell_index); -// } -// } -// } -//=================================================================================================// -// void LevelSet::updateKernelIntegrals() -// { -// mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), -// [&](size_t i, size_t j, size_t k) -// { -// Arrayi cell_index = Arrayi(i, j, k); -// if (isInnerPackage(cell_index)){ -// assignByPosition( -// kernel_weight_, cell_index, [&](const Vecd &position) -> Real -// { return computeKernelIntegral(position); }); -// assignByPosition( -// kernel_gradient_, cell_index, [&](const Vecd &position) -> Vecd -// { return computeKernelGradientIntegral(position); }); -// } -// }); -// } -//=================================================================================================// void LevelSet::initializeIndexMesh() { mesh_for(MeshRange(Arrayi::Zero(), all_cells_), @@ -164,7 +118,8 @@ bool LevelSet::isInnerPackage(const Arrayi &cell_index) //=================================================================================================// void LevelSet::diffuseLevelSetSign() { - package_parallel_for([&](size_t package_index) + package_parallel_for( + [&](size_t package_index) { auto phi_data = phi_.DataField(); auto near_interface_id_data = near_interface_id_.DataField(); @@ -232,7 +187,8 @@ void LevelSet::markNearInterface(Real small_shift_factor) { Real small_shift = small_shift_factor * data_spacing_; - package_parallel_for([&](size_t package_index) + package_parallel_for( + [&](size_t package_index) { auto &phi_addrs = phi_.DataField()[package_index]; auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; @@ -288,25 +244,12 @@ void LevelSet::initializeBasicDataForAPackage(const Arrayi &cell_index, const si for_each_cell_data( [&](int i, int j, int k) { - Vec3d position = DataPositionFromIndex(cell_index, Vec3d(i, j, k)); + Vec3d position = GridPositionFromLocalGridIndex(cell_index, Array3i(i, j, k)); phi[i][j][k] = shape.findSignedDistance(position); near_interface_id[i][j][k] = phi[i][j][k] < 0.0 ? -2 : 2; }); } //=================================================================================================// -// void LevelSet::redistanceInterface() -// { -// mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), -// [&](size_t i, size_t j, size_t k) -// { -// Arrayi cell_index = Arrayi(i, j, k); -// if (isCoreDataPackage(cell_index)) -// { -// redistanceInterfaceForAPackage(PackageIndexFromCellIndex(cell_index)); -// } -// }); -// } -//=================================================================================================// void LevelSet::redistanceInterfaceForAPackage(const size_t package_index) { auto phi_data = phi_.DataField(); diff --git a/src/for_3D_build/meshes/mesh_with_data_packages.hpp b/src/for_3D_build/meshes/mesh_with_data_packages.hpp index ffd4868527..863cbfb09c 100644 --- a/src/for_3D_build/meshes/mesh_with_data_packages.hpp +++ b/src/for_3D_build/meshes/mesh_with_data_packages.hpp @@ -28,24 +28,10 @@ DataType MeshWithGridDataPackages:: } size_t package_index = PackageIndexFromCellIndex(cell_index_on_mesh_); auto &data = mesh_variable.DataField()[package_index]; - // auto &data = data_pkg_addrs_[cell_index_on_mesh_[0]][cell_index_on_mesh_[1]][cell_index_on_mesh_[2]] - // ->getPackageData(mesh_variable); return data[local_data_index[0]][local_data_index[1]][local_data_index[2]]; } //=================================================================================================// template -void MeshWithGridDataPackages::allocateIndexDataMatrix() -{ - Allocate3dArray(data_pkg_idx_, all_cells_); -} -//=================================================================================================// -template -void MeshWithGridDataPackages::deleteIndexDataMatrix() -{ - Delete3dArray(data_pkg_idx_, all_cells_); -} -//=================================================================================================// -template void MeshWithGridDataPackages::allocateMetaDataMatrix() { Allocate3dArray(meta_data_mesh_, all_cells_); @@ -150,12 +136,11 @@ void MeshWithGridDataPackages:: { size_t package_index = PackageIndexFromCellIndex(cell_index); auto &pkg_data = mesh_variable.DataField()[package_index]; - // auto &pkg_data = getPackageData(mesh_variable); for (int i = 0; i != pkg_size; ++i) for (int j = 0; j != pkg_size; ++j) for (int k = 0; k != pkg_size; ++k) { - Vec3d position = DataPositionFromIndex(cell_index, Vec3d(i, j)); + Vec3d position = GridPositionFromLocalGridIndex(cell_index, Arrayi(i, j)); pkg_data[i][j][k] = function_by_position(position); } } @@ -246,17 +231,6 @@ DataType MeshWithGridDataPackages:: return bilinear_1 * beta[2] + bilinear_2 * alpha[2]; } //=================================================================================================// -template -template -void MeshWithGridDataPackages:: - package_parallel_for(const FunctionOnData &function) -{ - for(int i = 2; i < num_grid_pkgs_; i++){ - size_t package_index = neighbourhood_[i][1][1][1]; - function(package_index); - } -} -//=================================================================================================// } // namespace SPH //=================================================================================================// #endif // MESH_WITH_DATA_PACKAGES_3D_HPP \ No newline at end of file diff --git a/src/shared/meshes/mesh_with_data_packages.h b/src/shared/meshes/mesh_with_data_packages.h index a9979b8d02..50dcddc329 100644 --- a/src/shared/meshes/mesh_with_data_packages.h +++ b/src/shared/meshes/mesh_with_data_packages.h @@ -123,12 +123,10 @@ class MeshWithGridDataPackages : public Mesh data_spacing_(data_spacing), global_mesh_(this->mesh_lower_bound_ + 0.5 * data_spacing * Vecd::Ones(), data_spacing, this->all_cells_ * pkg_size) { - allocateIndexDataMatrix(); allocateMetaDataMatrix(); }; virtual ~MeshWithGridDataPackages() { - deleteIndexDataMatrix(); deleteMetaDataMatrix(); delete[] neighbourhood_; delete[] meta_data_cell_; @@ -137,26 +135,24 @@ class MeshWithGridDataPackages : public Mesh virtual Real DataSpacing() override { return data_spacing_; }; protected: - MeshVariableAssemble all_mesh_variables_; /**< all mesh variables on this mesh. */ - static constexpr int pkg_size = PKG_SIZE; /**< the size of the data package matrix*/ - const Real data_spacing_; /**< spacing of data in the data packages*/ - BaseMesh global_mesh_; /**< the mesh for the locations of all possible data points. */ - size_t num_grid_pkgs_ = 2; - MeshDataMatrix data_pkg_idx_; - using MetaData = std::pair; /**< stores the metadata for each cell: (int)singular0/inner1/core2, (size_t)package data index*/ - MeshDataMatrix meta_data_mesh_; - Neighbourhood* neighbourhood_; - std::pair *meta_data_cell_; + MeshVariableAssemble all_mesh_variables_; /**< all mesh variables on this mesh. */ + static constexpr int pkg_size = PKG_SIZE; /**< the size of the data package matrix*/ + const Real data_spacing_; /**< spacing of data in the data packages*/ + BaseMesh global_mesh_; /**< the mesh for the locations of all possible data points. */ + size_t num_grid_pkgs_ = 2; /**< the number of all distinct packages, initially only 2 singular packages. */ + using MetaData = std::pair; /**< stores the metadata for each cell: (int)singular0/inner1/core2, (size_t)package data index*/ + MeshDataMatrix meta_data_mesh_; /**< metadata for all cells. */ + Neighbourhood* neighbourhood_; /**< 3*3(*3) array to store indicies of neighbourhood cells. */ + std::pair *meta_data_cell_; /**< metadata for each occupied cell: (arrayi)cell index, (int)core1/inner0. */ + using NeighbourIndex = std::pair; /**< stores shifted neighbour info: (size_t)package index, (arrayi)local grid index. */ template using PackageData = PackageDataMatrix; - using NeighbourIndex = std::pair; + /** Matrix data for temporary usage. */ template using PackageTemporaryData = PackageDataMatrix; - void allocateIndexDataMatrix(); /**< allocate memories for addresses of data packages. */ - void allocateMetaDataMatrix(); /**< allocate memories for addresses of data packages. */ - void deleteIndexDataMatrix(); /**< delete memories for addresses of data packages. */ - void deleteMetaDataMatrix(); /**< delete memories for addresses of data packages. */ + void allocateMetaDataMatrix(); /**< allocate memories for metadata of data packages. */ + void deleteMetaDataMatrix(); /**< delete memories for metadata of data packages. */ template MeshVariable *registerMeshVariable(const std::string &variable_name) @@ -181,7 +177,7 @@ class MeshWithGridDataPackages : public Mesh DataType DataValueFromGlobalIndex(MeshVariable &mesh_variable, const Arrayi &global_grid_index); - /** resize all mesh variable data field (initially only singular data) */ + /** resize all mesh variable data field with `num_grid_pkgs_` size(initially only singular data) */ template struct ResizeMeshVariableData { @@ -203,8 +199,7 @@ class MeshWithGridDataPackages : public Mesh resize_mesh_variable_data_(all_mesh_variables_, num_grid_pkgs_); } - /** void (non_value_returning) function iterate on all data points by value, - * for function only involving the data itself. */ + /** void (non_value_returning) function iterate on all data points by value. */ template void for_each_cell_data(const FunctionOnData &function); @@ -219,31 +214,31 @@ class MeshWithGridDataPackages : public Mesh bool isCoreDataPackage(const Arrayi &cell_index); std::pair NeighbourIndexShift(const Arrayi shift_index, const Neighbourhood &neighbour); - Vecd DataPositionFromIndex(Arrayi cell_index, Vecd data_index) - { - Vecd cell_position = CellPositionFromIndex(cell_index); - Vecd grid_position = GridPositionFromCellPosition(cell_position); - return grid_position + data_spacing_ * (0.5 * Vecd::Ones() + data_index); - } + /** assign value to data package according to the position of data */ template void assignByPosition(MeshVariable &mesh_variable, - const Arrayi cell_index, - const FunctionByPosition &function_by_position); + const Arrayi cell_index, + const FunctionByPosition &function_by_position); + /** compute gradient transform within data package at `package_index` */ template void computeGradient(MeshVariable &in_variable, - MeshVariable &out_variable, - const size_t package_index); + MeshVariable &out_variable, + const size_t package_index); + /** obtain averaged value at a corner of a data cell */ template DataType CornerAverage(MeshVariable &mesh_variable, Arrayi addrs_index, Arrayi corner_direction, Neighbourhood &neighbourhood); + /** probe by applying bi and tri-linear interpolation within the package. */ template DataType probeDataPackage(MeshVariable &mesh_variable, size_t package_index, const Arrayi cell_index, const Vecd &position); + /** return the lower grid position of the cell_index mesh. */ Vecd CellMeshLowerBound(const Arrayi cell_index) { return mesh_lower_bound_ + cell_index.cast().matrix() * grid_spacing_ + 0.5 * Vecd::Ones() * data_spacing_; } + /** return the grid index from its position and the index of the cell it belongs to. */ Arrayi LocalGridIndexFromPosition(const Arrayi cell_index, const Vecd &position) { Vecd cell_mesh_lower_bound = CellMeshLowerBound(cell_index); @@ -252,14 +247,28 @@ class MeshWithGridDataPackages : public Mesh .max(Arrayi::Zero()) .min((pkg_size-1) * Arrayi::Ones()); } + /** return the grid position from its local grid index and the index of the cell it belongs to. */ Vecd GridPositionFromLocalGridIndex(const Arrayi cell_index, const Arrayi grid_index) { Vecd cell_mesh_lower_bound = CellMeshLowerBound(cell_index); return cell_mesh_lower_bound + grid_index.cast().matrix() * data_spacing_; } + /** Iterator on a collection of mesh data packages. parallel computing. */ template - void package_parallel_for(const FunctionOnData &function); + void package_parallel_for(const FunctionOnData &function) + { + parallel_for( + IndexRange(2, num_grid_pkgs_), + [&](const IndexRange &r) + { + for (size_t i = r.begin(); i != r.end(); ++i) + { + function(i); + } + }, + ap); + } }; } // namespace SPH #endif // MESH_WITH_DATA_PACKAGES_H From 47badeb8183a8196e04dd0b2105adc8ba8126bc4 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Sun, 16 Jun 2024 12:34:37 +0200 Subject: [PATCH 04/55] sync changes --- src/for_2D_build/common/data_type.h | 2 +- src/for_2D_build/geometries/level_set_2d.cpp | 92 +++++++++--------- .../meshes/mesh_with_data_packages.hpp | 50 +++++----- src/for_3D_build/common/data_type.h | 2 +- src/for_3D_build/geometries/level_set_3d.cpp | 96 ++++++++++--------- .../meshes/mesh_with_data_packages.hpp | 70 +++++++------- src/shared/geometries/level_set.cpp | 22 ++--- src/shared/geometries/level_set.h | 2 +- src/shared/meshes/base_mesh.cpp | 7 +- src/shared/meshes/base_mesh.h | 2 + src/shared/meshes/mesh_with_data_packages.h | 56 ++++++----- .../particle_dynamics_algorithms.h | 2 +- src/shared/variables/base_variable.h | 19 ++-- 13 files changed, 213 insertions(+), 209 deletions(-) diff --git a/src/for_2D_build/common/data_type.h b/src/for_2D_build/common/data_type.h index 43118fd7d7..917f61f2da 100644 --- a/src/for_2D_build/common/data_type.h +++ b/src/for_2D_build/common/data_type.h @@ -42,7 +42,7 @@ using AngularVecd = Real; using Rotation = Rotation2d; using BoundingBox = BaseBoundingBox; using Transform = BaseTransform; -using Neighbourhood = std::array, 3>; +using CellNeighborhood = std::array, 3>; template using PackageDataMatrix = std::array, array_size>; diff --git a/src/for_2D_build/geometries/level_set_2d.cpp b/src/for_2D_build/geometries/level_set_2d.cpp index 0cbed9964e..1417071e37 100644 --- a/src/for_2D_build/geometries/level_set_2d.cpp +++ b/src/for_2D_build/geometries/level_set_2d.cpp @@ -50,8 +50,13 @@ void LevelSet::finishDataPackages() }); initializeIndexMesh(); - initializeNeighbourhood(); + initializeCellNeighborhood(); resizeMeshVariableData(); + + Real far_field_distance = grid_spacing_ * (Real)buffer_width_; + initializeDataForSingularPackage(0, -far_field_distance); + initializeDataForSingularPackage(1, far_field_distance); + package_parallel_for( [&](size_t package_index) { @@ -65,37 +70,38 @@ void LevelSet::finishDataPackages() void LevelSet::initializeIndexMesh() { mesh_for(MeshRange(Arrayi::Zero(), all_cells_), - [&](size_t i, size_t j) - { - Arrayi cell_index = Arrayi(i, j); - if (isInnerDataPackage(cell_index)) - { - assignDataPackageIndex(Arrayi(i, j), num_grid_pkgs_++); - } - }); + [&](size_t i, size_t j) + { + Arrayi cell_index = Arrayi(i, j); + if (isInnerDataPackage(cell_index)) + { + assignDataPackageIndex(Arrayi(i, j), num_grid_pkgs_); + num_grid_pkgs_++; + } + }); } //=================================================================================================// -void LevelSet::initializeNeighbourhood() +void LevelSet::initializeCellNeighborhood() { - neighbourhood_ = new Neighbourhood[num_grid_pkgs_]; + cell_neighborhood_ = new CellNeighborhood[num_grid_pkgs_]; meta_data_cell_ = new std::pair[num_grid_pkgs_]; mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), - [&](size_t i, size_t j) - { - Arrayi cell_index = Arrayi(i, j); - if (isInnerDataPackage(cell_index)) - { - Neighbourhood ¤t = neighbourhood_[PackageIndexFromCellIndex(cell_index)]; - std::pair &metadata = meta_data_cell_[PackageIndexFromCellIndex(cell_index)]; - metadata.first = cell_index; - metadata.second = isCoreDataPackage(cell_index) ? 1 : 0; - for(int l = -1; l < 2; l++) - for(int m = -1; m < 2; m++) - { - current[l+1][m+1] = PackageIndexFromCellIndex(cell_index+Arrayi(l, m)); - } - } - }); + [&](size_t i, size_t j) + { + Arrayi cell_index = Arrayi(i, j); + if (isInnerDataPackage(cell_index)) + { + CellNeighborhood ¤t = cell_neighborhood_[PackageIndexFromCellIndex(cell_index)]; + std::pair &metadata = meta_data_cell_[PackageIndexFromCellIndex(cell_index)]; + metadata.first = cell_index; + metadata.second = isCoreDataPackage(cell_index) ? 1 : 0; + for (int l = -1; l < 2; l++) + for (int m = -1; m < 2; m++) + { + current[l + 1][m + 1] = PackageIndexFromCellIndex(cell_index + Arrayi(l, m)); + } + } + }); } //=================================================================================================// bool LevelSet::isWithinCorePackage(Vecd position) @@ -122,7 +128,7 @@ void LevelSet::diffuseLevelSetSign() { auto phi_data = phi_.DataField(); auto near_interface_id_data = near_interface_id_.DataField(); - auto &neighbourhood = neighbourhood_[package_index]; + auto &neighborhood = cell_neighborhood_[package_index]; for_each_cell_data( [&](int i, int j) @@ -133,7 +139,7 @@ void LevelSet::diffuseLevelSetSign() mesh_find_if2d<-1, 2>( [&](int l, int m) -> bool { - NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i+l, j+m), neighbourhood); + NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i + l, j + m), neighborhood); int near_interface_id = near_interface_id_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]]; bool is_found = abs(near_interface_id) == 1; if (is_found) @@ -157,7 +163,7 @@ void LevelSet::reinitializeLevelSet() auto phi_data = phi_.DataField(); auto &phi_addrs = phi_data[package_index]; auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; - auto &neighbourhood = neighbourhood_[package_index]; + auto &neighborhood = cell_neighborhood_[package_index]; for_each_cell_data( [&](int i, int j) @@ -167,14 +173,14 @@ void LevelSet::reinitializeLevelSet() { Real phi_0 = phi_addrs[i][j]; Real sign = phi_0 / sqrt(phi_0 * phi_0 + data_spacing_ * data_spacing_); - NeighbourIndex x1 = NeighbourIndexShift(Arrayi(i+1, j), neighbourhood); - NeighbourIndex x2 = NeighbourIndexShift(Arrayi(i-1, j), neighbourhood); - NeighbourIndex y1 = NeighbourIndexShift(Arrayi(i, j+1), neighbourhood); - NeighbourIndex y2 = NeighbourIndexShift(Arrayi(i, j-1), neighbourhood); + NeighbourIndex x1 = NeighbourIndexShift(Arrayi(i + 1, j), neighborhood); + NeighbourIndex x2 = NeighbourIndexShift(Arrayi(i - 1, j), neighborhood); + NeighbourIndex y1 = NeighbourIndexShift(Arrayi(i, j + 1), neighborhood); + NeighbourIndex y2 = NeighbourIndexShift(Arrayi(i, j - 1), neighborhood); Real dv_x = upwindDifference(sign, phi_data[x1.first][x1.second[0]][x1.second[1]] - phi_0, - phi_0 - phi_data[x2.first][x2.second[0]][x2.second[1]]); + phi_0 - phi_data[x2.first][x2.second[0]][x2.second[1]]); Real dv_y = upwindDifference(sign, phi_data[y1.first][y1.second[0]][y1.second[1]] - phi_0, - phi_0 - phi_data[y2.first][y2.second[0]][y2.second[1]]); + phi_0 - phi_data[y2.first][y2.second[0]][y2.second[1]]); phi_addrs[i][j] -= 0.5 * sign * (Vec2d(dv_x, dv_y).norm() - data_spacing_); } }); @@ -190,14 +196,14 @@ void LevelSet::markNearInterface(Real small_shift_factor) { auto &phi_addrs = phi_.DataField()[package_index]; auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; - auto neighbourhood = neighbourhood_[package_index]; + auto neighborhood = cell_neighborhood_[package_index]; // corner averages, note that the first row and first column are not used PackageTemporaryData corner_averages; mesh_for_each2d<0, pkg_size + 1>( [&](int i, int j) { - corner_averages[i][j] = CornerAverage(phi_, Arrayi(i, j), Arrayi(-1, -1), neighbourhood); + corner_averages[i][j] = CornerAverage(phi_, Arrayi(i, j), Arrayi(-1, -1), neighborhood); }); for_each_cell_data( @@ -243,7 +249,7 @@ void LevelSet::initializeBasicDataForAPackage(const Arrayi &cell_index, const si for_each_cell_data( [&](int i, int j) { - Vec2d position = GridPositionFromLocalGridIndex(cell_index, Array2i(i, j)); + Vec2d position = DataPositionFromIndex(cell_index, Array2i(i, j)); phi[i][j] = shape.findSignedDistance(position); near_interface_id[i][j] = phi[i][j] < 0.0 ? -2 : 2; }); @@ -253,7 +259,7 @@ void LevelSet::redistanceInterfaceForAPackage(const size_t package_index) { auto phi_data = phi_.DataField(); auto near_interface_id_data = near_interface_id_.DataField(); - auto &neighbourhood = neighbourhood_[package_index]; + auto &neighborhood = cell_neighborhood_[package_index]; for_each_cell_data( [&](int i, int j) @@ -266,7 +272,7 @@ void LevelSet::redistanceInterfaceForAPackage(const size_t package_index) mesh_for_each2d<-1, 2>( [&](int r, int s) { - NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i+r, j+s), neighbourhood); + NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i + r, j + s), neighborhood); int neighbor_near_interface_id = near_interface_id_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]]; if (neighbor_near_interface_id >= 1) positive_band = true; @@ -279,7 +285,7 @@ void LevelSet::redistanceInterfaceForAPackage(const size_t package_index) mesh_for_each2d<-4, 5>( [&](int x, int y) { - NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i+x, j+y), neighbourhood); + NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i + x, j + y), neighborhood); auto &neighbor_phi = phi_.DataField()[neighbour_index.first]; auto &neighbor_phi_gradient = phi_gradient_.DataField()[neighbour_index.first]; auto &neighbor_near_interface_id = near_interface_id_.DataField()[neighbour_index.first]; @@ -303,7 +309,7 @@ void LevelSet::redistanceInterfaceForAPackage(const size_t package_index) mesh_for_each2d<-4, 5>( [&](int x, int y) { - NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i+x, j+y), neighbourhood); + NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i + x, j + y), neighborhood); auto &neighbor_phi = phi_.DataField()[neighbour_index.first]; auto &neighbor_phi_gradient = phi_gradient_.DataField()[neighbour_index.first]; auto &neighbor_near_interface_id = near_interface_id_.DataField()[neighbour_index.first]; diff --git a/src/for_2D_build/meshes/mesh_with_data_packages.hpp b/src/for_2D_build/meshes/mesh_with_data_packages.hpp index 747508ed3b..726f7496d8 100644 --- a/src/for_2D_build/meshes/mesh_with_data_packages.hpp +++ b/src/for_2D_build/meshes/mesh_with_data_packages.hpp @@ -49,10 +49,10 @@ template DataType MeshWithGridDataPackages:: probeMesh(MeshVariable &mesh_variable, const Vecd &position) { - Arrayi grid_index = CellIndexFromPosition(position); - size_t package_index = PackageIndexFromCellIndex(grid_index); - return isInnerDataPackage(grid_index) ? probeDataPackage(mesh_variable, package_index, grid_index, position) - : mesh_variable.DataField()[package_index][0][0]; + Arrayi cell_index = CellIndexFromPosition(position); + size_t package_index = PackageIndexFromCellIndex(cell_index); + return isInnerDataPackage(cell_index) ? probeDataPackage(mesh_variable, package_index, cell_index, position) + : mesh_variable.DataField()[package_index][0][0]; } //=================================================================================================// template @@ -117,7 +117,7 @@ bool MeshWithGridDataPackages:: //=================================================================================================// template std::pair MeshWithGridDataPackages:: - NeighbourIndexShift(const Arrayi shift_index, const Neighbourhood &neighbour) + NeighbourIndexShift(const Arrayi shift_index, const CellNeighborhood &neighbour) { std::pair result; Arrayi neighbour_index = (shift_index + pkg_size * Arrayi::Ones()) / pkg_size; @@ -131,7 +131,7 @@ template template void MeshWithGridDataPackages:: assignByPosition(MeshVariable &mesh_variable, - const Arrayi cell_index, + const Arrayi &cell_index, const FunctionByPosition &function_by_position) { size_t package_index = PackageIndexFromCellIndex(cell_index); @@ -139,7 +139,7 @@ void MeshWithGridDataPackages:: for (int i = 0; i != pkg_size; ++i) for (int j = 0; j != pkg_size; ++j) { - Vec2d position = GridPositionFromLocalGridIndex(cell_index, Arrayi(i, j)); + Vec2d position = DataPositionFromIndex(cell_index, Arrayi(i, j)); pkg_data[i][j] = function_by_position(position); } } @@ -154,19 +154,19 @@ void MeshWithGridDataPackages:: auto in_variable_data = in_variable.DataField(); auto out_variable_data = out_variable.DataField(); - auto &neighbourhood = neighbourhood_[package_index]; + auto &neighborhood = cell_neighborhood_[package_index]; auto &pkg_data = out_variable_data[package_index]; for_each_cell_data( [&](int i, int j) { - std::pair x1 = NeighbourIndexShift(Arrayi(i+1, j), neighbourhood); - std::pair x2 = NeighbourIndexShift(Arrayi(i-1, j), neighbourhood); - std::pair y1 = NeighbourIndexShift(Arrayi(i, j+1), neighbourhood); - std::pair y2 = NeighbourIndexShift(Arrayi(i, j-1), neighbourhood); - Real dphidx = (in_variable_data[x1.first][x1.second[0]][x1.second[1]] - + std::pair x1 = NeighbourIndexShift(Arrayi(i + 1, j), neighborhood); + std::pair x2 = NeighbourIndexShift(Arrayi(i - 1, j), neighborhood); + std::pair y1 = NeighbourIndexShift(Arrayi(i, j + 1), neighborhood); + std::pair y2 = NeighbourIndexShift(Arrayi(i, j - 1), neighborhood); + Real dphidx = (in_variable_data[x1.first][x1.second[0]][x1.second[1]] - in_variable_data[x2.first][x2.second[0]][x2.second[1]]); - Real dphidy = (in_variable_data[y1.first][y1.second[0]][y1.second[1]] - + Real dphidy = (in_variable_data[y1.first][y1.second[0]][y1.second[1]] - in_variable_data[y2.first][y2.second[0]][y2.second[1]]); pkg_data[i][j] = 0.5 * Vecd(dphidx, dphidy) / data_spacing_; @@ -176,7 +176,7 @@ void MeshWithGridDataPackages:: template template DataType MeshWithGridDataPackages:: - CornerAverage(MeshVariable &mesh_variable, Arrayi addrs_index, Arrayi corner_direction, Neighbourhood &neighbourhood) + CornerAverage(MeshVariable &mesh_variable, Arrayi addrs_index, Arrayi corner_direction, CellNeighborhood &neighborhood) { DataType average = ZeroData::value; auto mesh_variable_data = mesh_variable.DataField(); @@ -185,7 +185,7 @@ DataType MeshWithGridDataPackages:: { int x_index = addrs_index[0] + i * corner_direction[0]; int y_index = addrs_index[1] + j * corner_direction[1]; - NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(x_index, y_index), neighbourhood); + NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(x_index, y_index), neighborhood); average += mesh_variable_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]]; } return average * 0.25; @@ -194,19 +194,19 @@ DataType MeshWithGridDataPackages:: template template DataType MeshWithGridDataPackages:: - probeDataPackage(MeshVariable &mesh_variable, size_t package_index, const Arrayi cell_index, const Vecd &position) + probeDataPackage(MeshVariable &mesh_variable, size_t package_index, const Arrayi &cell_index, const Vecd &position) { - Arrayi grid_idx = LocalGridIndexFromPosition(cell_index, position); - Vecd grid_pos = GridPositionFromLocalGridIndex(cell_index, grid_idx); - Vecd alpha = (position - grid_pos) / grid_spacing_; + Arrayi data_index = DataIndexFromPosition(cell_index, position); + Vecd data_position = DataPositionFromIndex(cell_index, data_index); + Vecd alpha = (position - data_position) / data_spacing_; Vecd beta = Vecd::Ones() - alpha; - auto &neighbourhood = neighbourhood_[package_index]; + auto &neighborhood = cell_neighborhood_[package_index]; auto mesh_variable_data = mesh_variable.DataField(); - NeighbourIndex neighbour_index_1 = NeighbourIndexShift(Arrayi(grid_idx[0], grid_idx[1]), neighbourhood); - NeighbourIndex neighbour_index_2 = NeighbourIndexShift(Arrayi(grid_idx[0]+1, grid_idx[1]), neighbourhood); - NeighbourIndex neighbour_index_3 = NeighbourIndexShift(Arrayi(grid_idx[0], grid_idx[1]+1), neighbourhood); - NeighbourIndex neighbour_index_4 = NeighbourIndexShift(Arrayi(grid_idx[0]+1, grid_idx[1]+1), neighbourhood); + NeighbourIndex neighbour_index_1 = NeighbourIndexShift(Arrayi(data_index[0], data_index[1]), neighborhood); + NeighbourIndex neighbour_index_2 = NeighbourIndexShift(Arrayi(data_index[0] + 1, data_index[1]), neighborhood); + NeighbourIndex neighbour_index_3 = NeighbourIndexShift(Arrayi(data_index[0], data_index[1] + 1), neighborhood); + NeighbourIndex neighbour_index_4 = NeighbourIndexShift(Arrayi(data_index[0] + 1, data_index[1] + 1), neighborhood); DataType bilinear = mesh_variable_data[neighbour_index_1.first][neighbour_index_1.second[0]][neighbour_index_1.second[1]] * beta[0] * beta[1] + mesh_variable_data[neighbour_index_2.first][neighbour_index_2.second[0]][neighbour_index_2.second[1]] * alpha[0] * beta[1] + diff --git a/src/for_3D_build/common/data_type.h b/src/for_3D_build/common/data_type.h index c068642acc..680a06dbf7 100644 --- a/src/for_3D_build/common/data_type.h +++ b/src/for_3D_build/common/data_type.h @@ -41,7 +41,7 @@ using AngularVecd = Vec3d; using Rotation = Rotation3d; using BoundingBox = BaseBoundingBox; using Transform = BaseTransform; -using Neighbourhood = std::array, 3>, 3>; +using CellNeighborhood = std::array, 3>, 3>; template using PackageDataMatrix = std::array, array_size>, array_size>; diff --git a/src/for_3D_build/geometries/level_set_3d.cpp b/src/for_3D_build/geometries/level_set_3d.cpp index 5848dce1a2..29f8f4e1f0 100644 --- a/src/for_3D_build/geometries/level_set_3d.cpp +++ b/src/for_3D_build/geometries/level_set_3d.cpp @@ -50,8 +50,13 @@ void LevelSet::finishDataPackages() }); initializeIndexMesh(); - initializeNeighbourhood(); + initializeCellNeighborhood(); resizeMeshVariableData(); + + Real far_field_distance = grid_spacing_ * (Real)buffer_width_; + initializeDataForSingularPackage(0, -far_field_distance); + initializeDataForSingularPackage(1, far_field_distance); + package_parallel_for( [&](size_t package_index) { @@ -65,38 +70,39 @@ void LevelSet::finishDataPackages() void LevelSet::initializeIndexMesh() { mesh_for(MeshRange(Arrayi::Zero(), all_cells_), - [&](size_t i, size_t j, size_t k) - { - Arrayi cell_index = Arrayi(i, j, k); - if (isInnerDataPackage(cell_index)) - { - assignDataPackageIndex(Arrayi(i, j, k), num_grid_pkgs_++); - } - }); + [&](size_t i, size_t j, size_t k) + { + Arrayi cell_index = Arrayi(i, j, k); + if (isInnerDataPackage(cell_index)) + { + assignDataPackageIndex(Arrayi(i, j, k), num_grid_pkgs_); + num_grid_pkgs_++; + } + }); } //=================================================================================================// -void LevelSet::initializeNeighbourhood() +void LevelSet::initializeCellNeighborhood() { - neighbourhood_ = new Neighbourhood[num_grid_pkgs_]; + cell_neighborhood_ = new CellNeighborhood[num_grid_pkgs_]; meta_data_cell_ = new std::pair[num_grid_pkgs_]; mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), - [&](size_t i, size_t j, size_t k) - { - Arrayi cell_index = Arrayi(i, j, k); - if (isInnerDataPackage(cell_index)) - { - Neighbourhood ¤t = neighbourhood_[PackageIndexFromCellIndex(cell_index)]; - std::pair &metadata = meta_data_cell_[PackageIndexFromCellIndex(cell_index)]; - metadata.first = cell_index; - metadata.second = isCoreDataPackage(cell_index) ? 1 : 0; - for(int l = -1; l < 2; l++) - for(int m = -1; m < 2; m++) - for(int n = -1; n < 2; n++) - { - current[l+1][m+1][n+1] = PackageIndexFromCellIndex(cell_index+Arrayi(l, m, n)); - } - } - }); + [&](size_t i, size_t j, size_t k) + { + Arrayi cell_index = Arrayi(i, j, k); + if (isInnerDataPackage(cell_index)) + { + CellNeighborhood ¤t = cell_neighborhood_[PackageIndexFromCellIndex(cell_index)]; + std::pair &metadata = meta_data_cell_[PackageIndexFromCellIndex(cell_index)]; + metadata.first = cell_index; + metadata.second = isCoreDataPackage(cell_index) ? 1 : 0; + for (int l = -1; l < 2; l++) + for (int m = -1; m < 2; m++) + for (int n = -1; n < 2; n++) + { + current[l + 1][m + 1][n + 1] = PackageIndexFromCellIndex(cell_index + Arrayi(l, m, n)); + } + } + }); } //=================================================================================================// bool LevelSet::isWithinCorePackage(Vecd position) @@ -123,7 +129,7 @@ void LevelSet::diffuseLevelSetSign() { auto phi_data = phi_.DataField(); auto near_interface_id_data = near_interface_id_.DataField(); - auto &neighbourhood = neighbourhood_[package_index]; + auto &neighborhood = cell_neighborhood_[package_index]; for_each_cell_data( [&](int i, int j, int k) @@ -134,7 +140,7 @@ void LevelSet::diffuseLevelSetSign() mesh_find_if3d<-1, 2>( [&](int l, int m, int n) -> bool { - NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i+l, j+m, k+n), neighbourhood); + NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i + l, j + m, k + n), neighborhood); int near_interface_id = near_interface_id_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; bool is_found = abs(near_interface_id) == 1; if (is_found) @@ -158,7 +164,7 @@ void LevelSet::reinitializeLevelSet() auto phi_data = phi_.DataField(); auto &phi_addrs = phi_data[package_index]; auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; - auto &neighbourhood = neighbourhood_[package_index]; + auto &neighborhood = cell_neighborhood_[package_index]; for_each_cell_data( [&](int i, int j, int k) @@ -168,12 +174,12 @@ void LevelSet::reinitializeLevelSet() { Real phi_0 = phi_addrs[i][j][k]; Real sign = phi_0 / sqrt(phi_0 * phi_0 + data_spacing_ * data_spacing_); - NeighbourIndex x1 = NeighbourIndexShift(Arrayi(i+1, j, k), neighbourhood); - NeighbourIndex x2 = NeighbourIndexShift(Arrayi(i-1, j, k), neighbourhood); - NeighbourIndex y1 = NeighbourIndexShift(Arrayi(i, j+1, k), neighbourhood); - NeighbourIndex y2 = NeighbourIndexShift(Arrayi(i, j-1, k), neighbourhood); - NeighbourIndex z1 = NeighbourIndexShift(Arrayi(i, j, k+1), neighbourhood); - NeighbourIndex z2 = NeighbourIndexShift(Arrayi(i, j, k-1), neighbourhood); + NeighbourIndex x1 = NeighbourIndexShift(Arrayi(i + 1, j, k), neighborhood); + NeighbourIndex x2 = NeighbourIndexShift(Arrayi(i - 1, j, k), neighborhood); + NeighbourIndex y1 = NeighbourIndexShift(Arrayi(i, j + 1, k), neighborhood); + NeighbourIndex y2 = NeighbourIndexShift(Arrayi(i, j - 1, k), neighborhood); + NeighbourIndex z1 = NeighbourIndexShift(Arrayi(i, j, k + 1), neighborhood); + NeighbourIndex z2 = NeighbourIndexShift(Arrayi(i, j, k - 1), neighborhood); Real dv_x = upwindDifference(sign, phi_data[x1.first][x1.second[0]][x1.second[1]][x1.second[2]] - phi_0, phi_0 - phi_data[x2.first][x2.second[0]][x2.second[1]][x2.second[2]]); Real dv_y = upwindDifference(sign, phi_data[y1.first][y1.second[0]][y1.second[1]][y1.second[2]] - phi_0, phi_0 - phi_data[y2.first][y2.second[0]][y2.second[1]][y2.second[2]]); Real dv_z = upwindDifference(sign, phi_data[z1.first][z1.second[0]][z1.second[1]][z1.second[2]] - phi_0, phi_0 - phi_data[z2.first][z2.second[0]][z2.second[1]][z2.second[2]]); @@ -192,14 +198,14 @@ void LevelSet::markNearInterface(Real small_shift_factor) { auto &phi_addrs = phi_.DataField()[package_index]; auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; - auto neighbourhood = neighbourhood_[package_index]; + auto neighborhood = cell_neighborhood_[package_index]; // corner averages, note that the first row and first column are not used PackageTemporaryData corner_averages; - mesh_for_each3d<0, pkg_size+1>( + mesh_for_each3d<0, pkg_size + 1>( [&](int i, int j, int k) { - corner_averages[i][j][k] = CornerAverage(phi_, Arrayi(i, j, k), Arrayi(-1, -1, -1), neighbourhood); + corner_averages[i][j][k] = CornerAverage(phi_, Arrayi(i, j, k), Arrayi(-1, -1, -1), neighborhood); }); for_each_cell_data( @@ -244,7 +250,7 @@ void LevelSet::initializeBasicDataForAPackage(const Arrayi &cell_index, const si for_each_cell_data( [&](int i, int j, int k) { - Vec3d position = GridPositionFromLocalGridIndex(cell_index, Array3i(i, j, k)); + Vec3d position = DataPositionFromIndex(cell_index, Array3i(i, j, k)); phi[i][j][k] = shape.findSignedDistance(position); near_interface_id[i][j][k] = phi[i][j][k] < 0.0 ? -2 : 2; }); @@ -254,7 +260,7 @@ void LevelSet::redistanceInterfaceForAPackage(const size_t package_index) { auto phi_data = phi_.DataField(); auto near_interface_id_data = near_interface_id_.DataField(); - auto &neighbourhood = neighbourhood_[package_index]; + auto &neighborhood = cell_neighborhood_[package_index]; for_each_cell_data( [&](int i, int j, int k) @@ -267,7 +273,7 @@ void LevelSet::redistanceInterfaceForAPackage(const size_t package_index) mesh_for_each3d<-1, 2>( [&](int r, int s, int t) { - NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i+r, j+s, k+t), neighbourhood); + NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i + r, j + s, k + t), neighborhood); int neighbor_near_interface_id = near_interface_id_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; if (neighbor_near_interface_id >= 1) positive_band = true; @@ -280,7 +286,7 @@ void LevelSet::redistanceInterfaceForAPackage(const size_t package_index) mesh_for_each3d<-4, 5>( [&](int x, int y, int z) { - NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i+x, j+y, k+z), neighbourhood); + NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i + x, j + y, k + z), neighborhood); auto &neighbor_phi = phi_.DataField()[neighbour_index.first]; auto &neighbor_phi_gradient = phi_gradient_.DataField()[neighbour_index.first]; auto &neighbor_near_interface_id = near_interface_id_.DataField()[neighbour_index.first]; @@ -304,7 +310,7 @@ void LevelSet::redistanceInterfaceForAPackage(const size_t package_index) mesh_for_each3d<-4, 5>( [&](int x, int y, int z) { - NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i+x, j+y, k+z), neighbourhood); + NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i + x, j + y, k + z), neighborhood); auto &neighbor_phi = phi_.DataField()[neighbour_index.first]; auto &neighbor_phi_gradient = phi_gradient_.DataField()[neighbour_index.first]; auto &neighbor_near_interface_id = near_interface_id_.DataField()[neighbour_index.first]; diff --git a/src/for_3D_build/meshes/mesh_with_data_packages.hpp b/src/for_3D_build/meshes/mesh_with_data_packages.hpp index 863cbfb09c..60417b9b5f 100644 --- a/src/for_3D_build/meshes/mesh_with_data_packages.hpp +++ b/src/for_3D_build/meshes/mesh_with_data_packages.hpp @@ -48,10 +48,10 @@ template DataType MeshWithGridDataPackages:: probeMesh(MeshVariable &mesh_variable, const Vecd &position) { - Arrayi grid_index = CellIndexFromPosition(position); - size_t package_index = PackageIndexFromCellIndex(grid_index); - return isInnerDataPackage(grid_index) ? probeDataPackage(mesh_variable, package_index, grid_index, position) - : mesh_variable.DataField()[package_index][0][0][0]; + Arrayi cell_index = CellIndexFromPosition(position); + size_t package_index = PackageIndexFromCellIndex(cell_index); + return isInnerDataPackage(cell_index) ? probeDataPackage(mesh_variable, package_index, cell_index, position) + : mesh_variable.DataField()[package_index][0][0][0]; } //=================================================================================================// template @@ -117,7 +117,7 @@ bool MeshWithGridDataPackages:: //=================================================================================================// template std::pair MeshWithGridDataPackages:: - NeighbourIndexShift(const Arrayi shift_index, const Neighbourhood &neighbour) + NeighbourIndexShift(const Arrayi shift_index, const CellNeighborhood &neighbour) { std::pair result; Arrayi neighbour_index = (shift_index + pkg_size * Arrayi::Ones()) / pkg_size; @@ -131,7 +131,7 @@ template template void MeshWithGridDataPackages:: assignByPosition(MeshVariable &mesh_variable, - const Arrayi cell_index, + const Arrayi &cell_index, const FunctionByPosition &function_by_position) { size_t package_index = PackageIndexFromCellIndex(cell_index); @@ -140,7 +140,7 @@ void MeshWithGridDataPackages:: for (int j = 0; j != pkg_size; ++j) for (int k = 0; k != pkg_size; ++k) { - Vec3d position = GridPositionFromLocalGridIndex(cell_index, Arrayi(i, j)); + Vec3d position = DataPositionFromIndex(cell_index, Arrayi(i, j)); pkg_data[i][j][k] = function_by_position(position); } } @@ -155,23 +155,23 @@ void MeshWithGridDataPackages:: auto in_variable_data = in_variable.DataField(); auto out_variable_data = out_variable.DataField(); - auto &neighbourhood = neighbourhood_[package_index]; + auto &neighborhood = cell_neighborhood_[package_index]; auto &pkg_data = out_variable_data[package_index]; for_each_cell_data( [&](int i, int j, int k) { - std::pair x1 = NeighbourIndexShift(Arrayi(i+1, j, k), neighbourhood); - std::pair x2 = NeighbourIndexShift(Arrayi(i-1, j, k), neighbourhood); - std::pair y1 = NeighbourIndexShift(Arrayi(i, j+1, k), neighbourhood); - std::pair y2 = NeighbourIndexShift(Arrayi(i, j-1, k), neighbourhood); - std::pair z1 = NeighbourIndexShift(Arrayi(i, j, k+1), neighbourhood); - std::pair z2 = NeighbourIndexShift(Arrayi(i, j, k-1), neighbourhood); - Real dphidx = (in_variable_data[x1.first][x1.second[0]][x1.second[1]][x1.second[2]] - + std::pair x1 = NeighbourIndexShift(Arrayi(i + 1, j, k), neighborhood); + std::pair x2 = NeighbourIndexShift(Arrayi(i - 1, j, k), neighborhood); + std::pair y1 = NeighbourIndexShift(Arrayi(i, j + 1, k), neighborhood); + std::pair y2 = NeighbourIndexShift(Arrayi(i, j - 1, k), neighborhood); + std::pair z1 = NeighbourIndexShift(Arrayi(i, j, k + 1), neighborhood); + std::pair z2 = NeighbourIndexShift(Arrayi(i, j, k - 1), neighborhood); + Real dphidx = (in_variable_data[x1.first][x1.second[0]][x1.second[1]][x1.second[2]] - in_variable_data[x2.first][x2.second[0]][x2.second[1]][x2.second[2]]); - Real dphidy = (in_variable_data[y1.first][y1.second[0]][y1.second[1]][y1.second[2]] - + Real dphidy = (in_variable_data[y1.first][y1.second[0]][y1.second[1]][y1.second[2]] - in_variable_data[y2.first][y2.second[0]][y2.second[1]][y2.second[2]]); - Real dphidz = (in_variable_data[z1.first][z1.second[0]][z1.second[1]][z1.second[2]] - + Real dphidz = (in_variable_data[z1.first][z1.second[0]][z1.second[1]][z1.second[2]] - in_variable_data[z2.first][z2.second[0]][z2.second[1]][z2.second[2]]); pkg_data[i][j][k] = 0.5 * Vecd(dphidx, dphidy, dphidz) / data_spacing_; }); @@ -180,7 +180,7 @@ void MeshWithGridDataPackages:: template template DataType MeshWithGridDataPackages:: - CornerAverage(MeshVariable &mesh_variable, Arrayi addrs_index, Arrayi corner_direction, Neighbourhood &neighbourhood) + CornerAverage(MeshVariable &mesh_variable, Arrayi addrs_index, Arrayi corner_direction, CellNeighborhood &neighborhood) { DataType average = ZeroData::value; auto mesh_variable_data = mesh_variable.DataField(); @@ -191,7 +191,7 @@ DataType MeshWithGridDataPackages:: int x_index = addrs_index[0] + i * corner_direction[0]; int y_index = addrs_index[1] + j * corner_direction[1]; int z_index = addrs_index[2] + k * corner_direction[2]; - NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(x_index, y_index, z_index), neighbourhood); + NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(x_index, y_index, z_index), neighborhood); average += mesh_variable_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; } return average * 0.125; @@ -200,29 +200,29 @@ DataType MeshWithGridDataPackages:: template template DataType MeshWithGridDataPackages:: - probeDataPackage(MeshVariable &mesh_variable, size_t package_index, const Arrayi cell_index, const Vecd &position) + probeDataPackage(MeshVariable &mesh_variable, size_t package_index, const Arrayi &cell_index, const Vecd &position) { - Arrayi grid_idx = LocalGridIndexFromPosition(cell_index, position); - Vecd grid_pos = GridPositionFromLocalGridIndex(cell_index, grid_idx); - Vecd alpha = (position - grid_pos) / grid_spacing_; + Arrayi data_index = DataIndexFromPosition(cell_index, position); + Vecd data_position = DataPositionFromIndex(cell_index, data_index); + Vecd alpha = (position - data_position) / data_spacing_; Vecd beta = Vecd::Ones() - alpha; - auto &neighbourhood = neighbourhood_[package_index]; + auto &neighborhood = cell_neighborhood_[package_index]; auto mesh_variable_data = mesh_variable.DataField(); - NeighbourIndex neighbour_index_1 = NeighbourIndexShift(Arrayi(grid_idx[0], grid_idx[1], grid_idx[2]), neighbourhood); - NeighbourIndex neighbour_index_2 = NeighbourIndexShift(Arrayi(grid_idx[0]+1, grid_idx[1], grid_idx[2]), neighbourhood); - NeighbourIndex neighbour_index_3 = NeighbourIndexShift(Arrayi(grid_idx[0], grid_idx[1]+1, grid_idx[2]), neighbourhood); - NeighbourIndex neighbour_index_4 = NeighbourIndexShift(Arrayi(grid_idx[0]+1, grid_idx[1]+1, grid_idx[2]), neighbourhood); + NeighbourIndex neighbour_index_1 = NeighbourIndexShift(Arrayi(data_index[0], data_index[1], data_index[2]), neighborhood); + NeighbourIndex neighbour_index_2 = NeighbourIndexShift(Arrayi(data_index[0] + 1, data_index[1], data_index[2]), neighborhood); + NeighbourIndex neighbour_index_3 = NeighbourIndexShift(Arrayi(data_index[0], data_index[1] + 1, data_index[2]), neighborhood); + NeighbourIndex neighbour_index_4 = NeighbourIndexShift(Arrayi(data_index[0] + 1, data_index[1] + 1, data_index[2]), neighborhood); DataType bilinear_1 = mesh_variable_data[neighbour_index_1.first][neighbour_index_1.second[0]][neighbour_index_1.second[1]][neighbour_index_1.second[2]] * beta[0] * beta[1] + - mesh_variable_data[neighbour_index_2.first][neighbour_index_2.second[0]][neighbour_index_2.second[1]][neighbour_index_2.second[2]] * alpha[0] * beta[1] + - mesh_variable_data[neighbour_index_3.first][neighbour_index_3.second[0]][neighbour_index_3.second[1]][neighbour_index_3.second[2]] * beta[0] * alpha[1] + - mesh_variable_data[neighbour_index_4.first][neighbour_index_4.second[0]][neighbour_index_4.second[1]][neighbour_index_4.second[2]] * alpha[0] * alpha[1]; + mesh_variable_data[neighbour_index_2.first][neighbour_index_2.second[0]][neighbour_index_2.second[1]][neighbour_index_2.second[2]] * alpha[0] * beta[1] + + mesh_variable_data[neighbour_index_3.first][neighbour_index_3.second[0]][neighbour_index_3.second[1]][neighbour_index_3.second[2]] * beta[0] * alpha[1] + + mesh_variable_data[neighbour_index_4.first][neighbour_index_4.second[0]][neighbour_index_4.second[1]][neighbour_index_4.second[2]] * alpha[0] * alpha[1]; - neighbour_index_1 = NeighbourIndexShift(Arrayi(grid_idx[0], grid_idx[1], grid_idx[2]+1), neighbourhood); - neighbour_index_2 = NeighbourIndexShift(Arrayi(grid_idx[0]+1, grid_idx[1], grid_idx[2]+1), neighbourhood); - neighbour_index_3 = NeighbourIndexShift(Arrayi(grid_idx[0], grid_idx[1]+1, grid_idx[2]+1), neighbourhood); - neighbour_index_4 = NeighbourIndexShift(Arrayi(grid_idx[0]+1, grid_idx[1]+1, grid_idx[2]+1), neighbourhood); + neighbour_index_1 = NeighbourIndexShift(Arrayi(data_index[0], data_index[1], data_index[2] + 1), neighborhood); + neighbour_index_2 = NeighbourIndexShift(Arrayi(data_index[0] + 1, data_index[1], data_index[2] + 1), neighborhood); + neighbour_index_3 = NeighbourIndexShift(Arrayi(data_index[0], data_index[1] + 1, data_index[2] + 1), neighborhood); + neighbour_index_4 = NeighbourIndexShift(Arrayi(data_index[0] + 1, data_index[1] + 1, data_index[2] + 1), neighborhood); DataType bilinear_2 = mesh_variable_data[neighbour_index_1.first][neighbour_index_1.second[0]][neighbour_index_1.second[1]][neighbour_index_1.second[2]] * beta[0] * beta[1] + mesh_variable_data[neighbour_index_2.first][neighbour_index_2.second[0]][neighbour_index_2.second[1]][neighbour_index_2.second[2]] * alpha[0] * beta[1] + diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index eb5c79ea84..461941d3fd 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -39,18 +39,12 @@ LevelSet::LevelSet(BoundingBox tentative_bounds, Real data_spacing, size_t buffe phi_gradient_(*registerMeshVariable("LevelsetGradient")), kernel_weight_(*registerMeshVariable("KernelWeight")), kernel_gradient_(*registerMeshVariable("KernelGradient")), - kernel_(*sph_adaptation.getKernel()) -{ - Real far_field_distance = grid_spacing_ * (Real)buffer_width_; - initializeDataForSingularPackage(0, -far_field_distance); - initializeDataForSingularPackage(1, far_field_distance); -} + kernel_(*sph_adaptation.getKernel()) {} //=================================================================================================// void LevelSet::updateLevelSetGradient() { package_parallel_for( - [&](size_t package_index) - { + [&](size_t package_index) { computeGradient(phi_, phi_gradient_, package_index); }); } @@ -58,15 +52,12 @@ void LevelSet::updateLevelSetGradient() void LevelSet::updateKernelIntegrals() { package_parallel_for( - [&](size_t package_index) - { + [&](size_t package_index) { Arrayi cell_index = meta_data_cell_[package_index].first; assignByPosition( - kernel_weight_, cell_index, [&](const Vecd &position) -> Real - { return computeKernelIntegral(position); }); + kernel_weight_, cell_index, [&](const Vecd &position) -> Real { return computeKernelIntegral(position); }); assignByPosition( - kernel_gradient_, cell_index, [&](const Vecd &position) -> Vecd - { return computeKernelGradientIntegral(position); }); + kernel_gradient_, cell_index, [&](const Vecd &position) -> Vecd { return computeKernelGradientIntegral(position); }); }); } //=================================================================================================// @@ -108,8 +99,7 @@ Vecd LevelSet::probeKernelGradientIntegral(const Vecd &position, Real h_ratio) void LevelSet::redistanceInterface() { package_parallel_for( - [&](size_t package_index) - { + [&](size_t package_index) { std::pair &metadata = meta_data_cell_[package_index]; if (metadata.second == 1) { diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index e33e98f331..5652c5c969 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -123,7 +123,7 @@ class LevelSet : public MeshWithGridDataPackages<4>, void initializeDataInACell(const Arrayi &cell_index); void tagACellIsInnerPackage(const Arrayi &cell_index); void initializeIndexMesh(); - void initializeNeighbourhood(); + void initializeCellNeighborhood(); void updateLevelSetGradient(); // upwind algorithm choosing candidate difference by the sign diff --git a/src/shared/meshes/base_mesh.cpp b/src/shared/meshes/base_mesh.cpp index f3731926c7..ddd7278f17 100644 --- a/src/shared/meshes/base_mesh.cpp +++ b/src/shared/meshes/base_mesh.cpp @@ -28,9 +28,14 @@ Arrayi BaseMesh::CellIndexFromPosition(const Vecd &position) .min(all_grid_points_ - 2 * Arrayi::Ones()); } //=================================================================================================// +Vecd BaseMesh::CellLowerCorner(const Arrayi &cell_index) +{ + return mesh_lower_bound_ + cell_index.cast().matrix() * grid_spacing_; +} +//=================================================================================================// Vecd BaseMesh::CellPositionFromIndex(const Arrayi &cell_index) { - return mesh_lower_bound_ + (cell_index.cast().matrix() + 0.5 * Vecd::Ones()) * grid_spacing_; + return CellLowerCorner(cell_index) + 0.5 * Vecd::Ones() * grid_spacing_; } //=================================================================================================// Vecd BaseMesh::GridPositionFromIndex(const Arrayi &grid_index) diff --git a/src/shared/meshes/base_mesh.h b/src/shared/meshes/base_mesh.h index a14495744d..47581f35cd 100644 --- a/src/shared/meshes/base_mesh.h +++ b/src/shared/meshes/base_mesh.h @@ -82,6 +82,8 @@ class BaseMesh Arrayi CellIndexFromPosition(const Vecd &position); /** Given the cell index, return the cell position. */ Vecd CellPositionFromIndex(const Arrayi &cell_index); + /** Given the cell index, return the position of its lower corner. */ + Vecd CellLowerCorner(const Arrayi &cell_index); /** Given the index, return the grid position. */ Vecd GridPositionFromIndex(const Arrayi &grid_index); /** Transfer 1D int to mesh index. */ diff --git a/src/shared/meshes/mesh_with_data_packages.h b/src/shared/meshes/mesh_with_data_packages.h index 50dcddc329..ec286ec785 100644 --- a/src/shared/meshes/mesh_with_data_packages.h +++ b/src/shared/meshes/mesh_with_data_packages.h @@ -92,7 +92,6 @@ class BaseDataPackage int state_indicator_; }; - /** * @class MeshWithGridDataPackages * @brief Abstract class for mesh with grid-based data packages. @@ -121,30 +120,30 @@ class MeshWithGridDataPackages : public Mesh explicit MeshWithGridDataPackages(BoundingBox tentative_bounds, Real data_spacing, size_t buffer_size) : Mesh(tentative_bounds, pkg_size * data_spacing, buffer_size), data_spacing_(data_spacing), - global_mesh_(this->mesh_lower_bound_ + 0.5 * data_spacing * Vecd::Ones(), data_spacing, this->all_cells_ * pkg_size) + global_mesh_(mesh_lower_bound_ + 0.5 * data_spacing * Vecd::Ones(), data_spacing, all_cells_ * pkg_size) { allocateMetaDataMatrix(); }; virtual ~MeshWithGridDataPackages() { deleteMetaDataMatrix(); - delete[] neighbourhood_; + delete[] cell_neighborhood_; delete[] meta_data_cell_; }; /** spacing between the data, which is 1/ pkg_size of this grid spacing */ virtual Real DataSpacing() override { return data_spacing_; }; protected: - MeshVariableAssemble all_mesh_variables_; /**< all mesh variables on this mesh. */ - static constexpr int pkg_size = PKG_SIZE; /**< the size of the data package matrix*/ - const Real data_spacing_; /**< spacing of data in the data packages*/ - BaseMesh global_mesh_; /**< the mesh for the locations of all possible data points. */ - size_t num_grid_pkgs_ = 2; /**< the number of all distinct packages, initially only 2 singular packages. */ - using MetaData = std::pair; /**< stores the metadata for each cell: (int)singular0/inner1/core2, (size_t)package data index*/ - MeshDataMatrix meta_data_mesh_; /**< metadata for all cells. */ - Neighbourhood* neighbourhood_; /**< 3*3(*3) array to store indicies of neighbourhood cells. */ - std::pair *meta_data_cell_; /**< metadata for each occupied cell: (arrayi)cell index, (int)core1/inner0. */ - using NeighbourIndex = std::pair; /**< stores shifted neighbour info: (size_t)package index, (arrayi)local grid index. */ + MeshVariableAssemble all_mesh_variables_; /**< all mesh variables on this mesh. */ + static constexpr int pkg_size = PKG_SIZE; /**< the size of the data package matrix*/ + const Real data_spacing_; /**< spacing of data in the data packages*/ + BaseMesh global_mesh_; /**< the mesh for the locations of all possible data points. */ + size_t num_grid_pkgs_ = 2; /**< the number of all distinct packages, initially only 2 singular packages. */ + using MetaData = std::pair; /**< stores the metadata for each cell: (int)singular0/inner1/core2, (size_t)package data index*/ + MeshDataMatrix meta_data_mesh_; /**< metadata for all cells. */ + CellNeighborhood *cell_neighborhood_; /**< 3*3(*3) array to store indicies of neighborhood cells. */ + std::pair *meta_data_cell_; /**< metadata for each occupied cell: (arrayi)cell index, (int)core1/inner0. */ + using NeighbourIndex = std::pair; /**< stores shifted neighbour info: (size_t)package index, (arrayi)local grid index. */ template using PackageData = PackageDataMatrix; /** Matrix data for temporary usage. */ @@ -213,11 +212,11 @@ class MeshWithGridDataPackages : public Mesh bool isInnerDataPackage(const Arrayi &cell_index); bool isCoreDataPackage(const Arrayi &cell_index); - std::pair NeighbourIndexShift(const Arrayi shift_index, const Neighbourhood &neighbour); + std::pair NeighbourIndexShift(const Arrayi shift_index, const CellNeighborhood &neighbour); /** assign value to data package according to the position of data */ template void assignByPosition(MeshVariable &mesh_variable, - const Arrayi cell_index, + const Arrayi &cell_index, const FunctionByPosition &function_by_position); /** compute gradient transform within data package at `package_index` */ template @@ -227,31 +226,30 @@ class MeshWithGridDataPackages : public Mesh /** obtain averaged value at a corner of a data cell */ template DataType CornerAverage(MeshVariable &mesh_variable, - Arrayi addrs_index, Arrayi corner_direction, - Neighbourhood &neighbourhood); + Arrayi addrs_index, Arrayi corner_direction, + CellNeighborhood &neighborhood); /** probe by applying bi and tri-linear interpolation within the package. */ template - DataType probeDataPackage(MeshVariable &mesh_variable, size_t package_index, const Arrayi cell_index, const Vecd &position); + DataType probeDataPackage(MeshVariable &mesh_variable, size_t package_index, const Arrayi &cell_index, const Vecd &position); - /** return the lower grid position of the cell_index mesh. */ - Vecd CellMeshLowerBound(const Arrayi cell_index) + /** return the position of the lower bound data in a cell. */ + Vecd DataLowerBoundInCell(const Arrayi &cell_index) { - return mesh_lower_bound_ + cell_index.cast().matrix() * grid_spacing_ + 0.5 * Vecd::Ones() * data_spacing_; + return CellLowerCorner(cell_index) + 0.5 * data_spacing_ * Vecd::Ones(); } + /** return the grid index from its position and the index of the cell it belongs to. */ - Arrayi LocalGridIndexFromPosition(const Arrayi cell_index, const Vecd &position) + Arrayi DataIndexFromPosition(const Arrayi &cell_index, const Vecd &position) { - Vecd cell_mesh_lower_bound = CellMeshLowerBound(cell_index); - return floor((position - cell_mesh_lower_bound).array() / data_spacing_) + return floor((position - DataLowerBoundInCell(cell_index)).array() / data_spacing_) .template cast() .max(Arrayi::Zero()) - .min((pkg_size-1) * Arrayi::Ones()); + .min((pkg_size - 1) * Arrayi::Ones()); } - /** return the grid position from its local grid index and the index of the cell it belongs to. */ - Vecd GridPositionFromLocalGridIndex(const Arrayi cell_index, const Arrayi grid_index) + /** return the position of data from its local grid index and the index of the cell it belongs to. */ + Vecd DataPositionFromIndex(const Arrayi &cell_index, const Arrayi &data_index) { - Vecd cell_mesh_lower_bound = CellMeshLowerBound(cell_index); - return cell_mesh_lower_bound + grid_index.cast().matrix() * data_spacing_; + return DataLowerBoundInCell(cell_index) + data_index.cast().matrix() * data_spacing_; } /** Iterator on a collection of mesh data packages. parallel computing. */ diff --git a/src/shared/particle_dynamics/particle_dynamics_algorithms.h b/src/shared/particle_dynamics/particle_dynamics_algorithms.h index 9098ec1d11..15e2f8f365 100644 --- a/src/shared/particle_dynamics/particle_dynamics_algorithms.h +++ b/src/shared/particle_dynamics/particle_dynamics_algorithms.h @@ -133,7 +133,7 @@ class ReduceDynamics : public LocalDynamicsType, template ReduceDynamics(DynamicsIdentifier &identifier, Args &&...args) : LocalDynamicsType(identifier, std::forward(args)...), - BaseDynamics(identifier.getSPHBody()){}; + BaseDynamics(identifier.getSPHBody()){}; virtual ~ReduceDynamics(){}; std::string QuantityName() { return this->quantity_name_; }; diff --git a/src/shared/variables/base_variable.h b/src/shared/variables/base_variable.h index 2173685e8f..04cca1a84e 100644 --- a/src/shared/variables/base_variable.h +++ b/src/shared/variables/base_variable.h @@ -81,24 +81,21 @@ class MeshVariable : public BaseVariable public: using PackageData = PackageDataMatrix; MeshVariable(const std::string &name, size_t index) - : BaseVariable(name), - index_in_container_(index){ data_field_ = new PackageData[2]; }; - virtual ~MeshVariable(){ delete[] data_field_; }; + : BaseVariable(name), index_in_container_(index), + data_field_(nullptr){}; + virtual ~MeshVariable() { delete[] data_field_; }; size_t IndexInContainer() const { return index_in_container_; }; // void setDataField(PackageData* mesh_data){ data_field_ = mesh_data; }; - PackageData* DataField(){ return data_field_; }; - void allocateAllMeshVariableData(const size_t size){ - PackageData* temp = new PackageData[size]; - std::memcpy(temp, data_field_, 2 * sizeof(PackageData)); - // delete[] temp; - delete[] data_field_; - data_field_ = temp; + PackageData *DataField() { return data_field_; }; + void allocateAllMeshVariableData(const size_t size) + { + data_field_ = new PackageData[size]; } private: size_t index_in_container_; - PackageData* data_field_; + PackageData *data_field_; }; template class VariableType> From 920845be52b37d74abdde994ff611a26147a4325 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Sun, 23 Jun 2024 00:06:50 +0200 Subject: [PATCH 05/55] gradient wrap --- src/for_2D_build/geometries/level_set_2d.cpp | 3 +- .../meshes/mesh_with_data_packages.hpp | 1 + src/for_3D_build/geometries/level_set_3d.cpp | 2 +- src/shared/geometries/level_set.h | 4 + src/shared/meshes/all_mesh_dynamics.cpp | 69 ++++++++ src/shared/meshes/all_mesh_dynamics.h | 111 ++++++++++++ src/shared/meshes/mesh_dynamics.h | 133 ++++++++++++++ src/shared/meshes/mesh_local_dynamics.cpp | 127 +++++++++++++ src/shared/meshes/mesh_local_dynamics.h | 167 ++++++++++++++++++ src/shared/meshes/mesh_with_data_packages.h | 34 ++-- 10 files changed, 637 insertions(+), 14 deletions(-) create mode 100644 src/shared/meshes/all_mesh_dynamics.cpp create mode 100644 src/shared/meshes/all_mesh_dynamics.h create mode 100644 src/shared/meshes/mesh_dynamics.h create mode 100644 src/shared/meshes/mesh_local_dynamics.cpp create mode 100644 src/shared/meshes/mesh_local_dynamics.h diff --git a/src/for_2D_build/geometries/level_set_2d.cpp b/src/for_2D_build/geometries/level_set_2d.cpp index 1417071e37..f6b3de9a1f 100644 --- a/src/for_2D_build/geometries/level_set_2d.cpp +++ b/src/for_2D_build/geometries/level_set_2d.cpp @@ -62,8 +62,7 @@ void LevelSet::finishDataPackages() { initializeBasicDataForAPackage(meta_data_cell_[package_index].first, package_index, shape_); }); - - updateLevelSetGradient(); + update_level_set_gradient.exec(); updateKernelIntegrals(); } //=================================================================================================// diff --git a/src/for_2D_build/meshes/mesh_with_data_packages.hpp b/src/for_2D_build/meshes/mesh_with_data_packages.hpp index 726f7496d8..587fb60dc9 100644 --- a/src/for_2D_build/meshes/mesh_with_data_packages.hpp +++ b/src/for_2D_build/meshes/mesh_with_data_packages.hpp @@ -169,6 +169,7 @@ void MeshWithGridDataPackages:: Real dphidy = (in_variable_data[y1.first][y1.second[0]][y1.second[1]] - in_variable_data[y2.first][y2.second[0]][y2.second[1]]); + // printf("dphidx = %f, dphidy = %f, data_spacing_ = \n", dphidx, dphidy); pkg_data[i][j] = 0.5 * Vecd(dphidx, dphidy) / data_spacing_; }); } diff --git a/src/for_3D_build/geometries/level_set_3d.cpp b/src/for_3D_build/geometries/level_set_3d.cpp index 29f8f4e1f0..842a1ea89d 100644 --- a/src/for_3D_build/geometries/level_set_3d.cpp +++ b/src/for_3D_build/geometries/level_set_3d.cpp @@ -63,7 +63,7 @@ void LevelSet::finishDataPackages() initializeBasicDataForAPackage(meta_data_cell_[package_index].first, package_index, shape_); }); - updateLevelSetGradient(); + update_level_set_gradient.exec(); updateKernelIntegrals(); } //=================================================================================================// diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index 5652c5c969..8bd9db4f4f 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -32,6 +32,8 @@ #include "adaptation.h" #include "base_geometry.h" #include "mesh_with_data_packages.hpp" +#include "mesh_dynamics.h" +#include "mesh_local_dynamics.h" namespace SPH { @@ -108,6 +110,7 @@ class LevelSet : public MeshWithGridDataPackages<4>, MeshVariable &kernel_weight_; MeshVariable &kernel_gradient_; Kernel &kernel_; + MeshWithGridDataPackages<4> &mesh_data_ = *this; void initializeDataForSingularPackage(const size_t package_index, Real far_field_level_set); void initializeBasicDataForAPackage(const Arrayi &cell_index, const size_t package_index, Shape &shape); @@ -125,6 +128,7 @@ class LevelSet : public MeshWithGridDataPackages<4>, void initializeIndexMesh(); void initializeCellNeighborhood(); void updateLevelSetGradient(); + MeshInnerDynamics update_level_set_gradient{mesh_data_}; // upwind algorithm choosing candidate difference by the sign Real upwindDifference(Real sign, Real df_p, Real df_n); diff --git a/src/shared/meshes/all_mesh_dynamics.cpp b/src/shared/meshes/all_mesh_dynamics.cpp new file mode 100644 index 0000000000..36fa08b76a --- /dev/null +++ b/src/shared/meshes/all_mesh_dynamics.cpp @@ -0,0 +1,69 @@ +/* ------------------------------------------------------------------------- * + * SPHinXsys * + * ------------------------------------------------------------------------- * + * SPHinXsys (pronunciation: s'finksis) is an acronym from Smoothed Particle * + * Hydrodynamics for industrial compleX systems. It provides C++ APIs for * + * physical accurate simulation and aims to model coupled industrial dynamic * + * systems including fluid, solid, multi-body dynamics and beyond with SPH * + * (smoothed particle hydrodynamics), a meshless computational method using * + * particle discretization. * + * * + * SPHinXsys is partially funded by German Research Foundation * + * (Deutsche Forschungsgemeinschaft) DFG HU1527/6-1, HU1527/10-1, * + * HU1527/12-1 and HU1527/12-4. * + * * + * Portions copyright (c) 2017-2023 Technical University of Munich and * + * the authors' affiliations. * + * * + * Licensed under the Apache License, Version 2.0 (the "License"); you may * + * not use this file except in compliance with the License. You may obtain a * + * copy of the License at http://www.apache.org/licenses/LICENSE-2.0. * + * * + * ------------------------------------------------------------------------- */ +/** + * @file base_relax_dynamics.h + * @brief This is the classes of particle relaxation in order to produce body fitted + * initial particle distribution. + * @author Chi Zhang and Xiangyu Hu + */ + +#include "all_mesh_dynamics.h" + +#include "all_body_relations.h" +#include "all_particle_dynamics.h" +#include "base_kernel.h" +#include "base_particles.hpp" +#include "cell_linked_list.h" + +namespace SPH +{ +//=================================================================================================// +// void DefineShapeOnMeshWithGridDataPackages::exec() +// { +// initialize_data_in_a_cell.exec(); +// tag_a_cell_is_inner_package.exec(); +// initialize_index_mesh.exec(); +// initialize_cell_neighborhood.exec(); +// mesh_data_.resizeMeshVariableData(); +// } +//=================================================================================================// +// void CleanInterface::exec() +// { +// mark_near_interface.exec(); +// redistance_interface.exec(); +// reinitialize_level_set.exec(); +// update_level_set_gradient.exec(); +// update_kernel_integrals.exec(); +// } +//=================================================================================================// +// void CorrectTopology::exec() +// { +// mark_near_interface.exec(); +// for (size_t i = 0; i != 10; ++i) +// diffuse_level_set_sign.exec(); +// update_level_set_gradient.exec(); +// update_kernel_integrals.exec(); +// } +//=================================================================================================// +} // namespace SPH +//=================================================================================================// diff --git a/src/shared/meshes/all_mesh_dynamics.h b/src/shared/meshes/all_mesh_dynamics.h new file mode 100644 index 0000000000..2e7af73baa --- /dev/null +++ b/src/shared/meshes/all_mesh_dynamics.h @@ -0,0 +1,111 @@ +/* ------------------------------------------------------------------------- * + * SPHinXsys * + * ------------------------------------------------------------------------- * + * SPHinXsys (pronunciation: s'finksis) is an acronym from Smoothed Particle * + * Hydrodynamics for industrial compleX systems. It provides C++ APIs for * + * physical accurate simulation and aims to model coupled industrial dynamic * + * systems including fluid, solid, multi-body dynamics and beyond with SPH * + * (smoothed particle hydrodynamics), a meshless computational method using * + * particle discretization. * + * * + * SPHinXsys is partially funded by German Research Foundation * + * (Deutsche Forschungsgemeinschaft) DFG HU1527/6-1, HU1527/10-1, * + * HU1527/12-1 and HU1527/12-4. * + * * + * Portions copyright (c) 2017-2023 Technical University of Munich and * + * the authors' affiliations. * + * * + * Licensed under the Apache License, Version 2.0 (the "License"); you may * + * not use this file except in compliance with the License. You may obtain a * + * copy of the License at http://www.apache.org/licenses/LICENSE-2.0. * + * * + * ------------------------------------------------------------------------- */ +/** + * @file all_mesh_dynamics.h + * @brief This is for the base classes of particle dynamics, which describe the + * interaction between particles. These interactions are used to define + * differential operators for surface forces or fluxes in continuum mechanics + * @author Chi Zhang and Xiangyu Hu + */ + +#ifndef ALL_MESH_DYNAMICS_H +#define ALL_MESH_DYNAMICS_H + +#include "mesh_dynamics.h" +#include "mesh_local_dynamics.h" +#include "all_body_relations.h" +#include "base_body.h" +#include "base_data_package.h" +#include "neighborhood.h" +#include "sph_data_containers.h" + +#include + +using namespace std::placeholders; + +namespace SPH +{ +// class DefineShapeOnMeshWithGridDataPackages +// : BaseMeshDynamics +// { +// public: +// explicit DefineShapeOnMeshWithGridDataPackages(MeshWithGridDataPackages &mesh_data, Shape &shape) +// : BaseMeshDynamics(mesh_data), +// shape_(shape){}; +// virtual ~DefineShapeOnMeshWithGridDataPackages(){}; + +// virtual void exec() override; + +// private: +// Shape &shape_; + +// MeshAllDynamics initialize_data_in_a_cell(mesh_data_, shape_); +// MeshAllDynamics tag_a_cell_is_inner_package(mesh_data_); +// MeshInnerDynamics initialize_index_mesh(mesh_data_); +// MeshInnerDynamics initialize_cell_neighborhood(mesh_data_); + +// bool isInnerPackage(); +// }; + +// class CleanInterface +// : BaseMeshDynamics +// { +// public: +// explicit CleanInterface(MeshWithGridDataPackages &mesh_data, Real small_shift_factor) +// : BaseMeshDynamics(mesh_data), +// small_shift_factor_(small_shift_factor){}; +// virtual ~CleanInterface(){}; + +// virtual void exec() override; + +// private: +// Real small_shift_factor_; + +// MeshInnerDynamics mark_near_interface(small_shift_factor_); +// MeshCoreDynamics redistance_interface; +// MeshInnerDynamics reinitialize_level_set; +// MeshInnerDynamics update_level_set_gradient; +// MeshInnerDynamics update_kernel_integrals; +// } + +// class CorrectTopology +// : BaseMeshDynamics +// { +// public: +// explicit CorrectTopology(MeshWithGridDataPackages &mesh_data, Real small_shift_factor) +// : BaseMeshDynamics(mesh_data), +// small_shift_factor_(small_shift_factor){}; +// virtual ~CorrectTopology(){}; + +// virtual void exec() override; + +// private: +// Real small_shift_factor_; + +// MeshInnerDynamics mark_near_interface(small_shift_factor_); +// MeshInnerDynamics diffuse_level_set_sign(); +// MeshInnerDynamics update_level_set_gradient; +// MeshInnerDynamics update_kernel_integrals; +// } +} // namespace SPH +#endif // ALL_MESH_DYNAMICS_H \ No newline at end of file diff --git a/src/shared/meshes/mesh_dynamics.h b/src/shared/meshes/mesh_dynamics.h new file mode 100644 index 0000000000..ab0b70c506 --- /dev/null +++ b/src/shared/meshes/mesh_dynamics.h @@ -0,0 +1,133 @@ +/* ------------------------------------------------------------------------- * + * SPHinXsys * + * ------------------------------------------------------------------------- * + * SPHinXsys (pronunciation: s'finksis) is an acronym from Smoothed Particle * + * Hydrodynamics for industrial compleX systems. It provides C++ APIs for * + * physical accurate simulation and aims to model coupled industrial dynamic * + * systems including fluid, solid, multi-body dynamics and beyond with SPH * + * (smoothed particle hydrodynamics), a meshless computational method using * + * particle discretization. * + * * + * SPHinXsys is partially funded by German Research Foundation * + * (Deutsche Forschungsgemeinschaft) DFG HU1527/6-1, HU1527/10-1, * + * HU1527/12-1 and HU1527/12-4. * + * * + * Portions copyright (c) 2017-2023 Technical University of Munich and * + * the authors' affiliations. * + * * + * Licensed under the Apache License, Version 2.0 (the "License"); you may * + * not use this file except in compliance with the License. You may obtain a * + * copy of the License at http://www.apache.org/licenses/LICENSE-2.0. * + * * + * ------------------------------------------------------------------------- */ +/** + * @file mesh_dynamics.h + * @brief This is for the base classes of particle dynamics, which describe the + * interaction between particles. These interactions are used to define + * differential operators for surface forces or fluxes in continuum mechanics + * @author Chi Zhang and Xiangyu Hu + */ + +#ifndef MESH_DYNAMICS_H +#define MESH_DYNAMICS_H + +#include "mesh_local_dynamics.h" +#include "mesh_with_data_packages.hpp" + +#include + +using namespace std::placeholders; + +namespace SPH +{ +/** + * @class BaseMeshDynamics + * @brief The base class for all mesh dynamics + * This class contains only the interface functions available + * for all dynamics. An specific implementation should be realized. + */ +template +class BaseMeshDynamics +{ + public: + BaseMeshDynamics(MeshWithGridDataPackages<4> &mesh_data) + : mesh_data_(mesh_data){}; + virtual ~BaseMeshDynamics(){}; + + /** There is the interface functions for computing. */ + virtual ReturnType exec() = 0; + + protected: + MeshWithGridDataPackages<4> &mesh_data_; +}; + +/** + * @class MeshAllDynamics + * @brief Mesh dynamics for all cell on the mesh + */ +// template +// class MeshAllDynamics : public LocalDynamicsType, public BaseMeshDynamics +// { +// public: +// template +// MeshAllDynamics(MeshWithGridDataPackages &mesh_data, Args &&...args) +// : LocalDynamicsType(mesh_data, std::forward(args)...), +// BaseMeshDynamics(mesh_data){}; +// virtual ~MeshAllDynamics(){}; + +// //[todo] 2d/3d different version +// virtual void exec(); +// }; + +/** + * @class MeshInnerDynamics + * @brief Mesh dynamics for only inner cells on the mesh + */ +template +class MeshInnerDynamics : public LocalDynamicsType, public BaseMeshDynamics +{ + public: + template + MeshInnerDynamics(MeshWithGridDataPackages<4> &mesh_data, Args &&...args) + : LocalDynamicsType(mesh_data, std::forward(args)...), + BaseMeshDynamics(mesh_data){}; + virtual ~MeshInnerDynamics(){}; + + virtual void exec() override + { + mesh_data_.package_parallel_for( + [&](size_t package_index) + { + this->update(package_index); + } + ); + }; +}; + +/** + * @class MeshCoreDynamics + * @brief Mesh dynamics for only core cells on the mesh + */ +// template +// class MeshCoreDynamics : public LocalDynamicsType, public BaseMeshDynamics +// { +// public: +// template +// MeshCoreDynamics(DynamicsIdentifier &identifier, Args &&...args) +// : LocalDynamicsType(identifier, std::forward(args)...), +// BaseMeshDynamics(identifier){}; +// virtual ~MeshCoreDynamics(){}; + +// virtual void exec() override +// { +// package_parallel_for( +// [&](size_t package_index) +// { +// if(isCoreDataPackage(package_index)) +// update(package_index); +// } +// ); +// }; +// }; +} // namespace SPH +#endif // MESH_DYNAMICS_H \ No newline at end of file diff --git a/src/shared/meshes/mesh_local_dynamics.cpp b/src/shared/meshes/mesh_local_dynamics.cpp new file mode 100644 index 0000000000..9ab1405d44 --- /dev/null +++ b/src/shared/meshes/mesh_local_dynamics.cpp @@ -0,0 +1,127 @@ +/* ------------------------------------------------------------------------- * + * SPHinXsys * + * ------------------------------------------------------------------------- * + * SPHinXsys (pronunciation: s'finksis) is an acronym from Smoothed Particle * + * Hydrodynamics for industrial compleX systems. It provides C++ APIs for * + * physical accurate simulation and aims to model coupled industrial dynamic * + * systems including fluid, solid, multi-body dynamics and beyond with SPH * + * (smoothed particle hydrodynamics), a meshless computational method using * + * particle discretization. * + * * + * SPHinXsys is partially funded by German Research Foundation * + * (Deutsche Forschungsgemeinschaft) DFG HU1527/6-1, HU1527/10-1, * + * HU1527/12-1 and HU1527/12-4. * + * * + * Portions copyright (c) 2017-2023 Technical University of Munich and * + * the authors' affiliations. * + * * + * Licensed under the Apache License, Version 2.0 (the "License"); you may * + * not use this file except in compliance with the License. You may obtain a * + * copy of the License at http://www.apache.org/licenses/LICENSE-2.0. * + * * + * ------------------------------------------------------------------------- */ +/** + * @file base_relax_dynamics.h + * @brief This is the classes of particle relaxation in order to produce body fitted + * initial particle distribution. + * @author Chi Zhang and Xiangyu Hu + */ + +#include "mesh_local_dynamics.h" + +#include "all_body_relations.h" +#include "all_particle_dynamics.h" +#include "base_kernel.h" +#include "base_particles.hpp" +#include "cell_linked_list.h" + +namespace SPH +{ +//=================================================================================================// +// void InitializeDataInACell::update() +// { +// Vecd cell_position = CellPositionFromIndex(cell_index); +// Real signed_distance = shape_.findSignedDistance(cell_position); +// Vecd normal_direction = shape_.findNormalDirection(cell_position); +// Real measure = (signed_distance * normal_direction).cwiseAbs().maxCoeff(); +// if (measure < grid_spacing_) +// { +// mesh_data_.assignCore(cell_index); +// } +// else +// { +// size_t package_index = shape_.checkContain(cell_position) ? 0 : 1; +// mesh_data_.assignSingular(cell_index); +// mesh_data_.assignDataPackageIndex(cell_index, package_index); +// } +// } +//=================================================================================================// +// void TagACellIsInnerPackage::update() +// { +// if (isInnerPackage(cell_index)) +// { +// if (!isCoreDataPackage(cell_index)) +// { +// assignInner(cell_index); +// } +// } +// } +//=================================================================================================// +// void InitializeIndexMesh::update() +// { + +// } +//=================================================================================================// +// void InitializeCellNeighborhood::update() +// { + +// } +//=================================================================================================// +void UpdateLevelSetGradient::update(size_t package_index) +{ + mesh_data_.computeGradient(phi_, phi_gradient_, package_index); +} +//=================================================================================================// +// Real UpdateKernelIntegrals::computeKernelIntegral(const Vecd &position) +// { + +// } +//=================================================================================================// +// Vecd UpdateKernelIntegrals::computeKernelGradientIntegral(const Vecd &position) +// { + +// } +//=================================================================================================// +// void UpdateKernelIntegrals::update(size_t package_index) +// { +// Arrayi cell_index = meta_data_cell_[package_index].first; +// assignByPosition( +// kernel_weight_, cell_index, [&](const Vecd &position) -> Real +// { return computeKernelIntegral(position); }); +// assignByPosition( +// kernel_gradient_, cell_index, [&](const Vecd &position) -> Vecd +// { return computeKernelGradientIntegral(position); }); +// } +//=================================================================================================// +// void ReinitializeLevelSet::update() +// { + +// } +//=================================================================================================// +// void MarkNearInterface::update() +// { + +// } +//=================================================================================================// +// void RedistanceInterface::update() +// { + +// } +//=================================================================================================// +// void DiffuseLevelSetSign::update() +// { + +// } +//=================================================================================================// +} // namespace SPH +//=================================================================================================// diff --git a/src/shared/meshes/mesh_local_dynamics.h b/src/shared/meshes/mesh_local_dynamics.h new file mode 100644 index 0000000000..92e836de18 --- /dev/null +++ b/src/shared/meshes/mesh_local_dynamics.h @@ -0,0 +1,167 @@ +/* ------------------------------------------------------------------------- * + * SPHinXsys * + * ------------------------------------------------------------------------- * + * SPHinXsys (pronunciation: s'finksis) is an acronym from Smoothed Particle * + * Hydrodynamics for industrial compleX systems. It provides C++ APIs for * + * physical accurate simulation and aims to model coupled industrial dynamic * + * systems including fluid, solid, multi-body dynamics and beyond with SPH * + * (smoothed particle hydrodynamics), a meshless computational method using * + * particle discretization. * + * * + * SPHinXsys is partially funded by German Research Foundation * + * (Deutsche Forschungsgemeinschaft) DFG HU1527/6-1, HU1527/10-1, * + * HU1527/12-1 and HU1527/12-4. * + * * + * Portions copyright (c) 2017-2023 Technical University of Munich and * + * the authors' affiliations. * + * * + * Licensed under the Apache License, Version 2.0 (the "License"); you may * + * not use this file except in compliance with the License. You may obtain a * + * copy of the License at http://www.apache.org/licenses/LICENSE-2.0. * + * * + * ------------------------------------------------------------------------- */ +/** + * @file base_relax_dynamics.h + * @brief This is the classes of particle relaxation in order to produce body fitted + * initial particle distribution. + * @author Chi Zhang and Xiangyu Hu + */ + +#ifndef MESH_LOCAL_DYNAMICS_H +#define MESH_LOCAL_DYNAMICS_H + +#include "base_variable.h" +#include "mesh_with_data_packages.hpp" + +namespace SPH +{ +// using MeshData = MeshWithGridDataPackages<4>; +/** + * @class BaseMeshLocalDynamics + * @brief The base class for all mesh local particle dynamics. + */ +class BaseMeshLocalDynamics +{ + public: + explicit BaseMeshLocalDynamics(MeshWithGridDataPackages<4> &mesh_data) + : mesh_data_(mesh_data){}; + virtual ~BaseMeshLocalDynamics(){}; + + virtual void update(size_t package_index) = 0; + protected: + MeshWithGridDataPackages<4> &mesh_data_; +}; + +// class InitializeDataInACell : public BaseMeshLocalDynamics +// { +// public: +// explicit InitializeDataInACell(MeshWithGridDataPackages &mesh_data, Shape &shape) +// : BaseMeshLocalDynamics(mesh_data), +// shape_(shape){}; +// virtual ~InitializeDataInACell(){}; + +// void update(); + +// private: +// Shape &shape_; +// }; + +// class TagACellIsInnerPackage +// : public BaseMeshLocalDynamics +// { +// public: +// explicit TagACellIsInnerPackage(MeshWithGridDataPackages &mesh_data){}; +// virtual ~TagACellIsInnerPackage(){}; + +// void update(); +// }; + +// class InitializeIndexMesh +// : public BaseMeshLocalDynamics +// { +// public: +// explicit InitializeIndexMesh(MeshWithGridDataPackages &mesh_data){}; +// virtual ~InitializeIndexMesh(){}; + +// void update(); +// }; + +// class InitializeCellNeighborhood +// : public BaseMeshLocalDynamics +// { +// public: +// explicit InitializeCellNeighborhood(MeshWithGridDataPackages &mesh_data){}; +// virtual ~InitializeCellNeighborhood(){}; + +// void update(); +// }; + +class UpdateLevelSetGradient : public BaseMeshLocalDynamics +{ + public: + explicit UpdateLevelSetGradient(MeshWithGridDataPackages<4> &mesh_data) + : BaseMeshLocalDynamics(mesh_data), + phi_(*mesh_data.getMeshVariable("Levelset")), + phi_gradient_(*mesh_data.getMeshVariable("LevelsetGradient")){}; + virtual ~UpdateLevelSetGradient(){}; + + void update(size_t package_index); + + private: + MeshVariable &phi_; + MeshVariable &phi_gradient_; +}; + +// class UpdateKernelIntegrals +// : public BaseMeshLocalDynamics +// { +// public: +// explicit UpdateKernelIntegrals(MeshWithGridDataPackages &mesh_data){}; +// virtual ~UpdateKernelIntegrals(){}; + +// void update(size_t package_index); + +// private: +// Real computeKernelIntegral(const Vecd &position); +// Vecd computeKernelGradientIntegral(const Vecd &position); +// }; +// class ReinitializeLevelSet +// : public BaseMeshLocalDynamics +// { +// public: +// explicit ReinitializeLevelSet(MeshWithGridDataPackages &mesh_data){}; +// virtual ~ReinitializeLevelSet(){}; + +// void update(size_t package_index); +// }; +// class MarkNearInterface +// : public BaseMeshLocalDynamics +// { +// public: +// explicit MarkNearInterface(MeshWithGridDataPackages &mesh_data){}; +// virtual ~MarkNearInterface(){}; + +// void update(size_t package_index); +// }; +// class RedistanceInterface +// : public BaseMeshLocalDynamics +// { +// public: +// explicit RedistanceInterface(MeshWithGridDataPackages &mesh_data){}; +// virtual ~RedistanceInterface(){}; + +// void update(size_t package_index); +// }; +// class DiffuseLevelSetSign +// : public BaseMeshLocalDynamics +// { +// public: +// explicit DiffuseLevelSetSign(MeshWithGridDataPackages &mesh_data){}; +// virtual ~DiffuseLevelSetSign(){}; + +// void update(size_t package_index); +// }; + +// } // namespace mesh_dynamics +} // namespace SPH +#endif // MESH_LOCAL_DYNAMICS_H diff --git a/src/shared/meshes/mesh_with_data_packages.h b/src/shared/meshes/mesh_with_data_packages.h index ec286ec785..c902e50c3e 100644 --- a/src/shared/meshes/mesh_with_data_packages.h +++ b/src/shared/meshes/mesh_with_data_packages.h @@ -193,11 +193,6 @@ class MeshWithGridDataPackages : public Mesh }; DataAssembleOperation resize_mesh_variable_data_; - void resizeMeshVariableData() - { - resize_mesh_variable_data_(all_mesh_variables_, num_grid_pkgs_); - } - /** void (non_value_returning) function iterate on all data points by value. */ template void for_each_cell_data(const FunctionOnData &function); @@ -218,11 +213,6 @@ class MeshWithGridDataPackages : public Mesh void assignByPosition(MeshVariable &mesh_variable, const Arrayi &cell_index, const FunctionByPosition &function_by_position); - /** compute gradient transform within data package at `package_index` */ - template - void computeGradient(MeshVariable &in_variable, - MeshVariable &out_variable, - const size_t package_index); /** obtain averaged value at a corner of a data cell */ template DataType CornerAverage(MeshVariable &mesh_variable, @@ -237,7 +227,6 @@ class MeshWithGridDataPackages : public Mesh { return CellLowerCorner(cell_index) + 0.5 * data_spacing_ * Vecd::Ones(); } - /** return the grid index from its position and the index of the cell it belongs to. */ Arrayi DataIndexFromPosition(const Arrayi &cell_index, const Vecd &position) { @@ -252,6 +241,23 @@ class MeshWithGridDataPackages : public Mesh return DataLowerBoundInCell(cell_index) + data_index.cast().matrix() * data_spacing_; } + public: + void resizeMeshVariableData() + { + resize_mesh_variable_data_(all_mesh_variables_, num_grid_pkgs_); + } + + template + MeshVariable *getMeshVariable(const std::string &variable_name) + { + return findVariableByName(all_mesh_variables_, variable_name); + } + + /** compute gradient transform within data package at `package_index` */ + template + void computeGradient(MeshVariable &in_variable, + MeshVariable &out_variable, + const size_t package_index); /** Iterator on a collection of mesh data packages. parallel computing. */ template void package_parallel_for(const FunctionOnData &function) @@ -267,6 +273,12 @@ class MeshWithGridDataPackages : public Mesh }, ap); } + + template + void testGradient(MeshVariable &in_variable, + MeshVariable &out_variable){ + printf("test gradient\n"); + } }; } // namespace SPH #endif // MESH_WITH_DATA_PACKAGES_H From 288b13b65c0d8b47d6150c9df633e3a9917b5783 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Sun, 23 Jun 2024 00:08:25 +0200 Subject: [PATCH 06/55] initializeDataInACell wrap --- src/for_2D_build/geometries/level_set_2d.cpp | 7 +--- .../meshes/mesh_with_data_packages.hpp | 13 +++++++ src/for_3D_build/geometries/level_set_3d.cpp | 7 +--- .../meshes/mesh_with_data_packages.hpp | 13 +++++++ src/shared/geometries/level_set.h | 1 + src/shared/meshes/mesh_dynamics.h | 31 +++++++++------ src/shared/meshes/mesh_local_dynamics.cpp | 38 +++++++++---------- src/shared/meshes/mesh_local_dynamics.h | 31 ++++++++------- src/shared/meshes/mesh_with_data_packages.h | 11 ++++-- 9 files changed, 91 insertions(+), 61 deletions(-) diff --git a/src/for_2D_build/geometries/level_set_2d.cpp b/src/for_2D_build/geometries/level_set_2d.cpp index f6b3de9a1f..d22e6667d6 100644 --- a/src/for_2D_build/geometries/level_set_2d.cpp +++ b/src/for_2D_build/geometries/level_set_2d.cpp @@ -13,12 +13,7 @@ LevelSet::LevelSet(BoundingBox tentative_bounds, Real data_spacing, Shape &shape, SPHAdaptation &sph_adaptation) : LevelSet(tentative_bounds, data_spacing, 4, shape, sph_adaptation) { - mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), - [&](size_t i, size_t j) - { - initializeDataInACell(Arrayi(i, j)); - }); - + initialize_data_in_a_cell.exec(); finishDataPackages(); } //=================================================================================================// diff --git a/src/for_2D_build/meshes/mesh_with_data_packages.hpp b/src/for_2D_build/meshes/mesh_with_data_packages.hpp index 587fb60dc9..f82983a515 100644 --- a/src/for_2D_build/meshes/mesh_with_data_packages.hpp +++ b/src/for_2D_build/meshes/mesh_with_data_packages.hpp @@ -8,6 +8,7 @@ #define MESH_WITH_DATA_PACKAGES_2D_HPP #include "mesh_with_data_packages.h" +#include "mesh_iterators.hpp" //=================================================================================================// namespace SPH @@ -217,6 +218,18 @@ DataType MeshWithGridDataPackages:: return bilinear; } //=================================================================================================// +template +template +void MeshWithGridDataPackages:: + grid_parallel_for(const FunctionOnData &function) +{ + mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), + [&](size_t i, size_t j) + { + function(Arrayi(i, j)); + }); +} +//=================================================================================================// } // namespace SPH //=================================================================================================// #endif // MESH_WITH_DATA_PACKAGES_2D_HPP \ No newline at end of file diff --git a/src/for_3D_build/geometries/level_set_3d.cpp b/src/for_3D_build/geometries/level_set_3d.cpp index 842a1ea89d..d69c6f8630 100644 --- a/src/for_3D_build/geometries/level_set_3d.cpp +++ b/src/for_3D_build/geometries/level_set_3d.cpp @@ -13,12 +13,7 @@ LevelSet::LevelSet(BoundingBox tentative_bounds, Real data_spacing, Shape &shape, SPHAdaptation &sph_adaptation) : LevelSet(tentative_bounds, data_spacing, 4, shape, sph_adaptation) { - mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), - [&](size_t i, size_t j, size_t k) - { - initializeDataInACell(Arrayi(i, j, k)); - }); - + initialize_data_in_a_cell.exec(); finishDataPackages(); } //=================================================================================================// diff --git a/src/for_3D_build/meshes/mesh_with_data_packages.hpp b/src/for_3D_build/meshes/mesh_with_data_packages.hpp index 60417b9b5f..a91caade14 100644 --- a/src/for_3D_build/meshes/mesh_with_data_packages.hpp +++ b/src/for_3D_build/meshes/mesh_with_data_packages.hpp @@ -8,6 +8,7 @@ #define MESH_WITH_DATA_PACKAGES_3D_HPP #include "mesh_with_data_packages.h" +#include "mesh_iterators.hpp" namespace SPH { @@ -231,6 +232,18 @@ DataType MeshWithGridDataPackages:: return bilinear_1 * beta[2] + bilinear_2 * alpha[2]; } //=================================================================================================// +template +template +void MeshWithGridDataPackages:: + grid_parallel_for(const FunctionOnData &function) +{ + mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), + [&](size_t i, size_t j, size_t k) + { + function(Arrayi(i, j, k)); + }); +} +//=================================================================================================// } // namespace SPH //=================================================================================================// #endif // MESH_WITH_DATA_PACKAGES_3D_HPP \ No newline at end of file diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index 8bd9db4f4f..c09a524ea0 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -124,6 +124,7 @@ class LevelSet : public MeshWithGridDataPackages<4>, void updateKernelIntegrals(); bool isInnerPackage(const Arrayi &cell_index); void initializeDataInACell(const Arrayi &cell_index); + MeshAllDynamics initialize_data_in_a_cell{mesh_data_, shape_}; void tagACellIsInnerPackage(const Arrayi &cell_index); void initializeIndexMesh(); void initializeCellNeighborhood(); diff --git a/src/shared/meshes/mesh_dynamics.h b/src/shared/meshes/mesh_dynamics.h index ab0b70c506..718a2a4835 100644 --- a/src/shared/meshes/mesh_dynamics.h +++ b/src/shared/meshes/mesh_dynamics.h @@ -65,19 +65,26 @@ class BaseMeshDynamics * @class MeshAllDynamics * @brief Mesh dynamics for all cell on the mesh */ -// template -// class MeshAllDynamics : public LocalDynamicsType, public BaseMeshDynamics -// { -// public: -// template -// MeshAllDynamics(MeshWithGridDataPackages &mesh_data, Args &&...args) -// : LocalDynamicsType(mesh_data, std::forward(args)...), -// BaseMeshDynamics(mesh_data){}; -// virtual ~MeshAllDynamics(){}; +template +class MeshAllDynamics : public LocalDynamicsType, public BaseMeshDynamics +{ + public: + template + MeshAllDynamics(MeshWithGridDataPackages<4> &mesh_data, Args &&...args) + : LocalDynamicsType(mesh_data, std::forward(args)...), + BaseMeshDynamics(mesh_data){}; + virtual ~MeshAllDynamics(){}; -// //[todo] 2d/3d different version -// virtual void exec(); -// }; + virtual void exec() override + { + mesh_data_.grid_parallel_for( + [&](Arrayi cell_index) + { + this->update(cell_index); + } + ); + }; +}; /** * @class MeshInnerDynamics diff --git a/src/shared/meshes/mesh_local_dynamics.cpp b/src/shared/meshes/mesh_local_dynamics.cpp index 9ab1405d44..2f61622e45 100644 --- a/src/shared/meshes/mesh_local_dynamics.cpp +++ b/src/shared/meshes/mesh_local_dynamics.cpp @@ -38,23 +38,23 @@ namespace SPH { //=================================================================================================// -// void InitializeDataInACell::update() -// { -// Vecd cell_position = CellPositionFromIndex(cell_index); -// Real signed_distance = shape_.findSignedDistance(cell_position); -// Vecd normal_direction = shape_.findNormalDirection(cell_position); -// Real measure = (signed_distance * normal_direction).cwiseAbs().maxCoeff(); -// if (measure < grid_spacing_) -// { -// mesh_data_.assignCore(cell_index); -// } -// else -// { -// size_t package_index = shape_.checkContain(cell_position) ? 0 : 1; -// mesh_data_.assignSingular(cell_index); -// mesh_data_.assignDataPackageIndex(cell_index, package_index); -// } -// } +void InitializeDataInACell::update(const Arrayi &cell_index) +{ + Vecd cell_position = mesh_data_.CellPositionFromIndex(cell_index); + Real signed_distance = shape_.findSignedDistance(cell_position); + Vecd normal_direction = shape_.findNormalDirection(cell_position); + Real measure = (signed_distance * normal_direction).cwiseAbs().maxCoeff(); + if (measure < grid_spacing_) + { + mesh_data_.assignCore(cell_index); + } + else + { + size_t package_index = shape_.checkContain(cell_position) ? 0 : 1; + mesh_data_.assignSingular(cell_index); + mesh_data_.assignDataPackageIndex(cell_index, package_index); + } +} //=================================================================================================// // void TagACellIsInnerPackage::update() // { @@ -77,9 +77,9 @@ namespace SPH // } //=================================================================================================// -void UpdateLevelSetGradient::update(size_t package_index) +void UpdateLevelSetGradient::update(const size_t &index) { - mesh_data_.computeGradient(phi_, phi_gradient_, package_index); + mesh_data_.computeGradient(phi_, phi_gradient_, index); } //=================================================================================================// // Real UpdateKernelIntegrals::computeKernelIntegral(const Vecd &position) diff --git a/src/shared/meshes/mesh_local_dynamics.h b/src/shared/meshes/mesh_local_dynamics.h index 92e836de18..be84c82d8a 100644 --- a/src/shared/meshes/mesh_local_dynamics.h +++ b/src/shared/meshes/mesh_local_dynamics.h @@ -32,6 +32,7 @@ #include "base_variable.h" #include "mesh_with_data_packages.hpp" +#include "base_geometry.h" namespace SPH { @@ -40,6 +41,7 @@ namespace SPH * @class BaseMeshLocalDynamics * @brief The base class for all mesh local particle dynamics. */ +template class BaseMeshLocalDynamics { public: @@ -47,24 +49,25 @@ class BaseMeshLocalDynamics : mesh_data_(mesh_data){}; virtual ~BaseMeshLocalDynamics(){}; - virtual void update(size_t package_index) = 0; + virtual void update(const IndexType &index) = 0; protected: MeshWithGridDataPackages<4> &mesh_data_; }; -// class InitializeDataInACell : public BaseMeshLocalDynamics -// { -// public: -// explicit InitializeDataInACell(MeshWithGridDataPackages &mesh_data, Shape &shape) -// : BaseMeshLocalDynamics(mesh_data), -// shape_(shape){}; -// virtual ~InitializeDataInACell(){}; +class InitializeDataInACell : public BaseMeshLocalDynamics +{ + public: + explicit InitializeDataInACell(MeshWithGridDataPackages<4> &mesh_data, Shape &shape) + : BaseMeshLocalDynamics(mesh_data), + shape_(shape){}; + virtual ~InitializeDataInACell(){}; -// void update(); + void update(const Arrayi &index); -// private: -// Shape &shape_; -// }; + private: + Shape &shape_; + Real grid_spacing_ = mesh_data_.GridSpacing(); +}; // class TagACellIsInnerPackage // : public BaseMeshLocalDynamics @@ -96,7 +99,7 @@ class BaseMeshLocalDynamics // void update(); // }; -class UpdateLevelSetGradient : public BaseMeshLocalDynamics +class UpdateLevelSetGradient : public BaseMeshLocalDynamics { public: explicit UpdateLevelSetGradient(MeshWithGridDataPackages<4> &mesh_data) @@ -105,7 +108,7 @@ class UpdateLevelSetGradient : public BaseMeshLocalDynamics phi_gradient_(*mesh_data.getMeshVariable("LevelsetGradient")){}; virtual ~UpdateLevelSetGradient(){}; - void update(size_t package_index); + void update(const size_t &index); private: MeshVariable &phi_; diff --git a/src/shared/meshes/mesh_with_data_packages.h b/src/shared/meshes/mesh_with_data_packages.h index c902e50c3e..7c545fee59 100644 --- a/src/shared/meshes/mesh_with_data_packages.h +++ b/src/shared/meshes/mesh_with_data_packages.h @@ -132,6 +132,7 @@ class MeshWithGridDataPackages : public Mesh }; /** spacing between the data, which is 1/ pkg_size of this grid spacing */ virtual Real DataSpacing() override { return data_spacing_; }; + Real GridSpacing() { return grid_spacing_; }; protected: MeshVariableAssemble all_mesh_variables_; /**< all mesh variables on this mesh. */ @@ -197,12 +198,8 @@ class MeshWithGridDataPackages : public Mesh template void for_each_cell_data(const FunctionOnData &function); - void assignDataPackageIndex(const Arrayi &cell_index, const size_t package_index); size_t PackageIndexFromCellIndex(const Arrayi &cell_index); void assignCategoryOnMetaDataMesh(const Arrayi &cell_index, const int category); - void assignSingular(const Arrayi &cell_index) { assignCategoryOnMetaDataMesh(cell_index, 0); }; - void assignInner(const Arrayi &cell_index) { assignCategoryOnMetaDataMesh(cell_index, 1); }; - void assignCore(const Arrayi &cell_index) { assignCategoryOnMetaDataMesh(cell_index, 2); }; bool isSingularDataPackage(const Arrayi &cell_index); bool isInnerDataPackage(const Arrayi &cell_index); bool isCoreDataPackage(const Arrayi &cell_index); @@ -242,6 +239,12 @@ class MeshWithGridDataPackages : public Mesh } public: + void assignSingular(const Arrayi &cell_index) { assignCategoryOnMetaDataMesh(cell_index, 0); }; + void assignInner(const Arrayi &cell_index) { assignCategoryOnMetaDataMesh(cell_index, 1); }; + void assignCore(const Arrayi &cell_index) { assignCategoryOnMetaDataMesh(cell_index, 2); }; + void assignDataPackageIndex(const Arrayi &cell_index, const size_t package_index); + template + void grid_parallel_for(const FunctionOnData &function); void resizeMeshVariableData() { resize_mesh_variable_data_(all_mesh_variables_, num_grid_pkgs_); From 3c9feebdbadbf45f142b77d7a64ecb66ddf72dd4 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Sun, 4 Aug 2024 23:01:11 +0200 Subject: [PATCH 07/55] (2d) separate index&category --- .../meshes/mesh_local_dynamics_2d.cpp | 99 +++++++++++++++++ .../meshes/mesh_with_data_packages.hpp | 42 +++++-- .../meshes/mesh_local_dynamics_3d.cpp | 103 ++++++++++++++++++ .../meshes/mesh_with_data_packages.hpp | 24 ++++ src/shared/meshes/mesh_with_data_packages.h | 10 ++ 5 files changed, 266 insertions(+), 12 deletions(-) create mode 100644 src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp create mode 100644 src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp diff --git a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp new file mode 100644 index 0000000000..73e8d9c125 --- /dev/null +++ b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp @@ -0,0 +1,99 @@ +#include "mesh_local_dynamics.h" + +#include "mesh_iterators.h" + +namespace SPH +{ +//=============================================================================================// +// void InitializeCellNeighborhood::update(const size_t &package_index) +// { +// Arrayi cell_index = mesh_data_.CellIndexFromPackageSortIndex(package_index); +// CellNeighborhood ¤t = mesh_data_.getCellNeighborhoodForWrite(package_index); +// std::pair &metadata = mesh_data_.getMetaDataCellForWrite(package_index); +// metadata.first = cell_index; +// metadata.second = mesh_data_.isCoreDataPackage(cell_index) ? 1 : 0; +// for (int l = -1; l < 2; l++) +// for (int m = -1; m < 2; m++) +// { +// current[l + 1][m + 1] = mesh_data_.PackageIndexFromCellIndex(cell_index + Arrayi(l, m)); +// }; +// } +//=============================================================================================// +// void InitializeBasicDataForAPackage::update(const size_t &package_index) +// { +// auto &phi = phi_.DataField()[package_index]; +// auto &near_interface_id = near_interface_id_.DataField()[package_index]; +// Arrayi cell_index = mesh_data_.CellIndexFromPackageSortIndex(package_index); +// mesh_data_.for_each_cell_data( +// [&](int i, int j) +// { +// Vec2d position = mesh_data_.DataPositionFromIndex(cell_index, Array2i(i, j)); +// phi[i][j] = shape_.findSignedDistance(position); +// near_interface_id[i][j] = phi[i][j] < 0.0 ? -2 : 2; +// }); +// } +//=============================================================================================// +// Real UpdateKernelIntegrals::computeKernelIntegral(const Vecd &position) +// { +// Real phi = probeSignedDistance(position); +// Real cutoff_radius = kernel_.CutOffRadius(global_h_ratio_); +// Real threshold = cutoff_radius + data_spacing_; // consider that interface's half width is the data spacing + +// Real integral(0); +// if (fabs(phi) < threshold) +// { +// Arrayi global_index_ = mesh_data_.CellIndexFromPositionOnGlobalMesh(position); +// mesh_for_each2d<-3, 4>( +// [&](int i, int j) +// { +// Arrayi neighbor_index = Arrayi(global_index_[0] + i, global_index_[1] + j); +// Real phi_neighbor = mesh_data_.DataValueFromGlobalIndex(phi_, neighbor_index); +// if (phi_neighbor > -data_spacing_) +// { +// Vecd phi_gradient = mesh_data_.DataValueFromGlobalIndex(phi_gradient_, neighbor_index); +// Vecd integral_position = mesh_data_.GridPositionFromIndexOnGlobalMesh(neighbor_index); +// Vecd displacement = position - integral_position; +// Real distance = displacement.norm(); +// if (distance < cutoff_radius) +// integral += kernel_.W(global_h_ratio_, distance, displacement) * +// CutCellVolumeFraction(phi_neighbor, phi_gradient, data_spacing_); +// } +// }); +// } +// return phi > threshold ? 1.0 : integral * data_spacing_ * data_spacing_; +// } +//=============================================================================================// +// Vecd UpdateKernelIntegrals::computeKernelGradientIntegral(const Vecd &position) +// { +// Real phi = probeSignedDistance(position); +// Real cutoff_radius = kernel_.CutOffRadius(global_h_ratio_); +// Real threshold = cutoff_radius + data_spacing_; + +// Vecd integral = Vecd::Zero(); +// if (fabs(phi) < threshold) +// { +// Arrayi global_index_ = mesh_data_.CellIndexFromPositionOnGlobalMesh(position); +// mesh_for_each2d<-3, 4>( +// [&](int i, int j) +// { +// Arrayi neighbor_index = Arrayi(global_index_[0] + i, global_index_[1] + j); +// Real phi_neighbor = mesh_data_.DataValueFromGlobalIndex(phi_, neighbor_index); +// if (phi_neighbor > -data_spacing_) +// { +// Vecd phi_gradient = mesh_data_.DataValueFromGlobalIndex(phi_gradient_, neighbor_index); +// Vecd integral_position = mesh_data_.GridPositionFromIndexOnGlobalMesh(neighbor_index); +// Vecd displacement = position - integral_position; +// Real distance = displacement.norm(); +// if (distance < cutoff_radius) +// integral += kernel_.dW(global_h_ratio_, distance, displacement) * +// CutCellVolumeFraction(phi_neighbor, phi_gradient, data_spacing_) * +// displacement / (distance + TinyReal); +// } +// }); +// } + +// return integral * data_spacing_ * data_spacing_; +// } +//=============================================================================================// +} // namespace SPH +//=============================================================================================// \ No newline at end of file diff --git a/src/for_2D_build/meshes/mesh_with_data_packages.hpp b/src/for_2D_build/meshes/mesh_with_data_packages.hpp index f82983a515..e706271c09 100644 --- a/src/for_2D_build/meshes/mesh_with_data_packages.hpp +++ b/src/for_2D_build/meshes/mesh_with_data_packages.hpp @@ -46,6 +46,30 @@ void MeshWithGridDataPackages::deleteMetaDataMatrix() } //=================================================================================================// template +void MeshWithGridDataPackages::allocateIndexDataMatrix() +{ + Allocate2dArray(index_data_mesh_, all_cells_); +} +//=================================================================================================// +template +void MeshWithGridDataPackages::deleteIndexDataMatrix() +{ + Delete2dArray(index_data_mesh_, all_cells_); +} +//=================================================================================================// +template +void MeshWithGridDataPackages::allocateCategoryDataMatrix() +{ + Allocate2dArray(category_data_mesh_, all_cells_); +} +//=================================================================================================// +template +void MeshWithGridDataPackages::deleteCategoryDataMatrix() +{ + Delete2dArray(category_data_mesh_, all_cells_); +} +//=================================================================================================// +template template DataType MeshWithGridDataPackages:: probeMesh(MeshVariable &mesh_variable, const Vecd &position) @@ -72,48 +96,42 @@ template void MeshWithGridDataPackages:: assignDataPackageIndex(const Arrayi &cell_index, const size_t package_index) { - MetaData &metadata = meta_data_mesh_[cell_index[0]][cell_index[1]]; - metadata.second = package_index; + index_data_mesh_[cell_index[0]][cell_index[1]] = package_index; } //=================================================================================================// template size_t MeshWithGridDataPackages:: PackageIndexFromCellIndex(const Arrayi &cell_index) { - MetaData &metadata = meta_data_mesh_[cell_index[0]][cell_index[1]]; - return metadata.second; + return index_data_mesh_[cell_index[0]][cell_index[1]]; } //=================================================================================================// template void MeshWithGridDataPackages:: assignCategoryOnMetaDataMesh(const Arrayi &cell_index, const int category) { - MetaData &metadata = meta_data_mesh_[cell_index[0]][cell_index[1]]; - metadata.first = category; + category_data_mesh_[cell_index[0]][cell_index[1]] = category; } //=================================================================================================// template bool MeshWithGridDataPackages:: isSingularDataPackage(const Arrayi &cell_index) { - MetaData &metadata = meta_data_mesh_[cell_index[0]][cell_index[1]]; - return metadata.first == 0; + return category_data_mesh_[cell_index[0]][cell_index[1]] == 0; } //=================================================================================================// template bool MeshWithGridDataPackages:: isInnerDataPackage(const Arrayi &cell_index) { - MetaData &metadata = meta_data_mesh_[cell_index[0]][cell_index[1]]; - return metadata.first != 0; + return category_data_mesh_[cell_index[0]][cell_index[1]] != 0; } //=================================================================================================// template bool MeshWithGridDataPackages:: isCoreDataPackage(const Arrayi &cell_index) { - MetaData &metadata = meta_data_mesh_[cell_index[0]][cell_index[1]]; - return metadata.first == 2; + return category_data_mesh_[cell_index[0]][cell_index[1]] == 2; } //=================================================================================================// template diff --git a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp new file mode 100644 index 0000000000..8a9404de06 --- /dev/null +++ b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp @@ -0,0 +1,103 @@ +#include "mesh_local_dynamics.h" + +namespace SPH +{ +//=============================================================================================// +// void InitializeCellNeighborhood::update(const size_t &package_index) +// { +// Arrayi cell_index = mesh_data_.CellIndexFromPackageSortIndex(package_index); +// CellNeighborhood ¤t = mesh_data_.getCellNeighborhoodForWrite(package_index); +// std::pair &metadata = mesh_data_.getMetaDataCellForWrite(package_index); +// metadata.first = cell_index; +// metadata.second = mesh_data_.isCoreDataPackage(cell_index) ? 1 : 0; +// for (int l = -1; l < 2; l++) +// for (int m = -1; m < 2; m++) +// for (int n = -1; n < 2; n++) +// { +// current[l + 1][m + 1][n + 1] = mesh_data_.PackageIndexFromCellIndex(cell_index + Arrayi(l, m, n)); +// }; +// } +//=============================================================================================// +// void InitializeBasicDataForAPackage::update(const size_t &package_index) +// { +// auto &phi = phi_.DataField()[package_index]; +// auto &near_interface_id = near_interface_id_.DataField()[package_index]; +// Arrayi cell_index = mesh_data_.CellIndexFromPackageSortIndex(package_index); +// mesh_data_.for_each_cell_data( +// [&](int i, int j, int k) +// { +// Vec3d position = mesh_data_.DataPositionFromIndex(cell_index, Array3i(i, j, k)); +// phi[i][j][k] = shape_.findSignedDistance(position); +// near_interface_id[i][j][k] = phi[i][j][k] < 0.0 ? -2 : 2; +// }); +// } +//=============================================================================================// +// Real UpdateKernelIntegrals::computeKernelIntegral(const Vecd &position) +// { +// Real phi = probeSignedDistance(position); +// Real cutoff_radius = kernel_.CutOffRadius(global_h_ratio_); +// Real threshold = cutoff_radius + data_spacing_; // consider that interface's half width is the data spacing + +// Real integral(0); +// if (fabs(phi) < threshold) +// { +// Arrayi global_index_ = mesh_data_.CellIndexFromPositionOnGlobalMesh(position); +// mesh_for_each3d<-3, 4>( +// [&](int i, int j, int k) +// { +// Arrayi neighbor_index = Arrayi(global_index_[0] + i, global_index_[1] + j, global_index_[2] + k); +// Real phi_neighbor = mesh_data_.DataValueFromGlobalIndex(phi_, neighbor_index); +// if (phi_neighbor > -data_spacing_) +// { +// Vecd phi_gradient = mesh_data_.DataValueFromGlobalIndex(phi_gradient_, neighbor_index); +// Vecd integral_position = mesh_data_.GridPositionFromIndexOnGlobalMesh(neighbor_index); +// Vecd displacement = position - integral_position; +// Real distance = displacement.norm(); +// if (distance < cutoff_radius) +// integral += kernel_.W(global_h_ratio_, distance, displacement) * +// CutCellVolumeFraction(phi_neighbor, phi_gradient, data_spacing_); +// } +// }); +// } +// return phi > threshold ? 1.0 : integral * data_spacing_ * data_spacing_; +// } +//=============================================================================================// +// Vecd UpdateKernelIntegrals::computeKernelGradientIntegral(const Vecd &position) +// { +// Real phi = probeSignedDistance(position); +// Real cutoff_radius = kernel_.CutOffRadius(global_h_ratio_); +// Real threshold = cutoff_radius + data_spacing_; + +// Vecd integral = Vecd::Zero(); +// if (fabs(phi) < threshold) +// { +// Arrayi global_index_ = mesh_data_.CellIndexFromPositionOnGlobalMesh(position); +// mesh_for_each3d<-3, 4>( +// [&](int i, int j, int k) +// { +// Arrayi neighbor_index = Arrayi(global_index_[0] + i, global_index_[1] + j, global_index_[2] + k); +// Real phi_neighbor = mesh_data_.DataValueFromGlobalIndex(phi_, neighbor_index); +// if (phi_neighbor > -data_spacing_) +// { +// Vecd phi_gradient = mesh_data_.DataValueFromGlobalIndex(phi_gradient_, neighbor_index); +// Vecd integral_position = mesh_data_.GridPositionFromIndexOnGlobalMesh(neighbor_index); +// Vecd displacement = position - integral_position; +// Real distance = displacement.norm(); +// if (distance < cutoff_radius) +// integral += kernel_.dW(global_h_ratio_, distance, displacement) * +// CutCellVolumeFraction(phi_neighbor, phi_gradient, data_spacing_) * +// displacement / (distance + TinyReal); +// } +// }); +// } + +// return integral * data_spacing_ * data_spacing_; +// } +//=============================================================================================// +// void DiffuseLevelSetSign::update(const size_t &package_index) +// { +// printf("this is the execution of DiffuseLevelSetSign\n"); +// } +//=============================================================================================// +} // namespace SPH +//=============================================================================================// \ No newline at end of file diff --git a/src/for_3D_build/meshes/mesh_with_data_packages.hpp b/src/for_3D_build/meshes/mesh_with_data_packages.hpp index a91caade14..ffed273c5f 100644 --- a/src/for_3D_build/meshes/mesh_with_data_packages.hpp +++ b/src/for_3D_build/meshes/mesh_with_data_packages.hpp @@ -45,6 +45,30 @@ void MeshWithGridDataPackages::deleteMetaDataMatrix() } //=================================================================================================// template +void MeshWithGridDataPackages::allocateIndexDataMatrix() +{ + Allocate3dArray(index_data_mesh_, all_cells_); +} +//=================================================================================================// +template +void MeshWithGridDataPackages::deleteIndexDataMatrix() +{ + Delete3dArray(index_data_mesh_, all_cells_); +} +//=================================================================================================// +template +void MeshWithGridDataPackages::allocateCategoryDataMatrix() +{ + Allocate3dArray(category_data_mesh_, all_cells_); +} +//=================================================================================================// +template +void MeshWithGridDataPackages::deleteCategoryDataMatrix() +{ + Delete3dArray(category_data_mesh_, all_cells_); +} +//=================================================================================================// +template template DataType MeshWithGridDataPackages:: probeMesh(MeshVariable &mesh_variable, const Vecd &position) diff --git a/src/shared/meshes/mesh_with_data_packages.h b/src/shared/meshes/mesh_with_data_packages.h index 7c545fee59..0baf36cb77 100644 --- a/src/shared/meshes/mesh_with_data_packages.h +++ b/src/shared/meshes/mesh_with_data_packages.h @@ -123,10 +123,14 @@ class MeshWithGridDataPackages : public Mesh global_mesh_(mesh_lower_bound_ + 0.5 * data_spacing * Vecd::Ones(), data_spacing, all_cells_ * pkg_size) { allocateMetaDataMatrix(); + allocateIndexDataMatrix(); + allocateCategoryDataMatrix(); }; virtual ~MeshWithGridDataPackages() { deleteMetaDataMatrix(); + deleteIndexDataMatrix(); + deleteCategoryDataMatrix(); delete[] cell_neighborhood_; delete[] meta_data_cell_; }; @@ -142,6 +146,8 @@ class MeshWithGridDataPackages : public Mesh size_t num_grid_pkgs_ = 2; /**< the number of all distinct packages, initially only 2 singular packages. */ using MetaData = std::pair; /**< stores the metadata for each cell: (int)singular0/inner1/core2, (size_t)package data index*/ MeshDataMatrix meta_data_mesh_; /**< metadata for all cells. */ + MeshDataMatrix index_data_mesh_; /**< metadata for all cells. */ + MeshDataMatrix category_data_mesh_; /**< metadata for all cells. */ CellNeighborhood *cell_neighborhood_; /**< 3*3(*3) array to store indicies of neighborhood cells. */ std::pair *meta_data_cell_; /**< metadata for each occupied cell: (arrayi)cell index, (int)core1/inner0. */ using NeighbourIndex = std::pair; /**< stores shifted neighbour info: (size_t)package index, (arrayi)local grid index. */ @@ -153,6 +159,10 @@ class MeshWithGridDataPackages : public Mesh void allocateMetaDataMatrix(); /**< allocate memories for metadata of data packages. */ void deleteMetaDataMatrix(); /**< delete memories for metadata of data packages. */ + void allocateIndexDataMatrix(); /**< allocate memories for metadata of data packages. */ + void deleteIndexDataMatrix(); /**< delete memories for metadata of data packages. */ + void allocateCategoryDataMatrix(); /**< allocate memories for metadata of data packages. */ + void deleteCategoryDataMatrix(); /**< delete memories for metadata of data packages. */ template MeshVariable *registerMeshVariable(const std::string &variable_name) From b7604607802a6a2df0d4036c6bf72bc63661b9a5 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Sun, 4 Aug 2024 23:04:39 +0200 Subject: [PATCH 08/55] (3d) changed --- .../meshes/mesh_with_data_packages.hpp | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/for_3D_build/meshes/mesh_with_data_packages.hpp b/src/for_3D_build/meshes/mesh_with_data_packages.hpp index ffed273c5f..9ac53a5cc3 100644 --- a/src/for_3D_build/meshes/mesh_with_data_packages.hpp +++ b/src/for_3D_build/meshes/mesh_with_data_packages.hpp @@ -96,48 +96,42 @@ template void MeshWithGridDataPackages:: assignDataPackageIndex(const Arrayi &cell_index, const size_t package_index) { - MetaData &metadata = meta_data_mesh_[cell_index[0]][cell_index[1]][cell_index[2]]; - metadata.second = package_index; + index_data_mesh_[cell_index[0]][cell_index[1]][cell_index[2]] = package_index; } //=================================================================================================// template size_t MeshWithGridDataPackages:: PackageIndexFromCellIndex(const Arrayi &cell_index) { - MetaData &metadata = meta_data_mesh_[cell_index[0]][cell_index[1]][cell_index[2]]; - return metadata.second; + return index_data_mesh_[cell_index[0]][cell_index[1]][cell_index[2]]; } //=================================================================================================// template void MeshWithGridDataPackages:: assignCategoryOnMetaDataMesh(const Arrayi &cell_index, const int category) { - MetaData &metadata = meta_data_mesh_[cell_index[0]][cell_index[1]][cell_index[2]]; - metadata.first = category; + category_data_mesh_[cell_index[0]][cell_index[1]][cell_index[2]] = category; } //=================================================================================================// template bool MeshWithGridDataPackages:: isSingularDataPackage(const Arrayi &cell_index) { - MetaData &metadata = meta_data_mesh_[cell_index[0]][cell_index[1]][cell_index[2]]; - return metadata.first == 0; + return category_data_mesh_[cell_index[0]][cell_index[1]][cell_index[2]] == 0; } //=================================================================================================// template bool MeshWithGridDataPackages:: isInnerDataPackage(const Arrayi &cell_index) { - MetaData &metadata = meta_data_mesh_[cell_index[0]][cell_index[1]][cell_index[2]]; - return metadata.first != 0; + return category_data_mesh_[cell_index[0]][cell_index[1]][cell_index[2]] != 0; } //=================================================================================================// template bool MeshWithGridDataPackages:: isCoreDataPackage(const Arrayi &cell_index) { - MetaData &metadata = meta_data_mesh_[cell_index[0]][cell_index[1]][cell_index[2]]; - return metadata.first == 2; + return category_data_mesh_[cell_index[0]][cell_index[1]][cell_index[2]] == 2; } //=================================================================================================// template From ceb9d13d03a9d3b2fb92f78876264881c324d988 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Mon, 5 Aug 2024 09:34:15 +0200 Subject: [PATCH 09/55] (2d) initialize index mesh --- src/for_2D_build/geometries/level_set_2d.cpp | 23 +++++++++++-------- .../meshes/mesh_with_data_packages.hpp | 19 ++++----------- .../meshes/mesh_with_data_packages.hpp | 12 ---------- src/shared/geometries/level_set.cpp | 7 +++++- src/shared/meshes/mesh_local_dynamics.cpp | 11 +++++++++ src/shared/meshes/mesh_local_dynamics.h | 4 ++++ src/shared/meshes/mesh_with_data_packages.h | 14 ++++------- 7 files changed, 45 insertions(+), 45 deletions(-) diff --git a/src/for_2D_build/geometries/level_set_2d.cpp b/src/for_2D_build/geometries/level_set_2d.cpp index d22e6667d6..e04e5f8a00 100644 --- a/src/for_2D_build/geometries/level_set_2d.cpp +++ b/src/for_2D_build/geometries/level_set_2d.cpp @@ -5,6 +5,7 @@ #include "base_particle_dynamics.h" #include "base_particles.h" #include "mesh_iterators.hpp" +#include "tbb/parallel_sort.h" namespace SPH { @@ -44,6 +45,12 @@ void LevelSet::finishDataPackages() tagACellIsInnerPackage(Arrayi(i, j)); }); + parallel_sort(occupied_data_pkgs_.begin(), occupied_data_pkgs_.end(), + [](const std::pair& a, const std::pair& b) + { + return a.first < b.first; + }); + initializeIndexMesh(); initializeCellNeighborhood(); resizeMeshVariableData(); @@ -63,15 +70,13 @@ void LevelSet::finishDataPackages() //=================================================================================================// void LevelSet::initializeIndexMesh() { - mesh_for(MeshRange(Arrayi::Zero(), all_cells_), - [&](size_t i, size_t j) + num_grid_pkgs_ = occupied_data_pkgs_.size() + 2; + package_parallel_for( + [&](size_t package_index) { - Arrayi cell_index = Arrayi(i, j); - if (isInnerDataPackage(cell_index)) - { - assignDataPackageIndex(Arrayi(i, j), num_grid_pkgs_); - num_grid_pkgs_++; - } + size_t sort_index = occupied_data_pkgs_[package_index-2].first; + Arrayi cell_index = Arrayi(sort_index / all_cells_[1], sort_index % all_cells_[1]); //[notion] there might be problems + assignDataPackageIndex(cell_index, package_index); }); } //=================================================================================================// @@ -101,7 +106,7 @@ void LevelSet::initializeCellNeighborhood() bool LevelSet::isWithinCorePackage(Vecd position) { Arrayi cell_index = CellIndexFromPosition(position); - return isCoreDataPackage(cell_index); + return isInnerDataPackage(cell_index); } //=============================================================================================// bool LevelSet::isInnerPackage(const Arrayi &cell_index) diff --git a/src/for_2D_build/meshes/mesh_with_data_packages.hpp b/src/for_2D_build/meshes/mesh_with_data_packages.hpp index e706271c09..7cf268c342 100644 --- a/src/for_2D_build/meshes/mesh_with_data_packages.hpp +++ b/src/for_2D_build/meshes/mesh_with_data_packages.hpp @@ -34,18 +34,6 @@ DataType MeshWithGridDataPackages:: } //=================================================================================================// template -void MeshWithGridDataPackages::allocateMetaDataMatrix() -{ - Allocate2dArray(meta_data_mesh_, all_cells_); -} -//=================================================================================================// -template -void MeshWithGridDataPackages::deleteMetaDataMatrix() -{ - Delete2dArray(meta_data_mesh_, all_cells_); -} -//=================================================================================================// -template void MeshWithGridDataPackages::allocateIndexDataMatrix() { Allocate2dArray(index_data_mesh_, all_cells_); @@ -117,20 +105,23 @@ template bool MeshWithGridDataPackages:: isSingularDataPackage(const Arrayi &cell_index) { - return category_data_mesh_[cell_index[0]][cell_index[1]] == 0; + return index_data_mesh_[cell_index[0]][cell_index[1]] < 2; } //=================================================================================================// template bool MeshWithGridDataPackages:: isInnerDataPackage(const Arrayi &cell_index) { - return category_data_mesh_[cell_index[0]][cell_index[1]] != 0; + return index_data_mesh_[cell_index[0]][cell_index[1]] > 1; } //=================================================================================================// template bool MeshWithGridDataPackages:: isCoreDataPackage(const Arrayi &cell_index) { + // size_t package_index = PackageIndexFromCellIndex(cell_index); + // return meta_data_cell_[package_index].second == 1; + return category_data_mesh_[cell_index[0]][cell_index[1]] == 2; } //=================================================================================================// diff --git a/src/for_3D_build/meshes/mesh_with_data_packages.hpp b/src/for_3D_build/meshes/mesh_with_data_packages.hpp index 9ac53a5cc3..3324a5dd03 100644 --- a/src/for_3D_build/meshes/mesh_with_data_packages.hpp +++ b/src/for_3D_build/meshes/mesh_with_data_packages.hpp @@ -33,18 +33,6 @@ DataType MeshWithGridDataPackages:: } //=================================================================================================// template -void MeshWithGridDataPackages::allocateMetaDataMatrix() -{ - Allocate3dArray(meta_data_mesh_, all_cells_); -} -//=================================================================================================// -template -void MeshWithGridDataPackages::deleteMetaDataMatrix() -{ - Delete3dArray(meta_data_mesh_, all_cells_); -} -//=================================================================================================// -template void MeshWithGridDataPackages::allocateIndexDataMatrix() { Allocate3dArray(index_data_mesh_, all_cells_); diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index 461941d3fd..efb14d5ba0 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -162,9 +162,14 @@ void LevelSet::tagACellIsInnerPackage(const Arrayi &cell_index) { if (isInnerPackage(cell_index)) { - if (!isCoreDataPackage(cell_index)) + if (!isInnerDataPackage(cell_index)) { assignInner(cell_index); + std::pair occupied; + occupied.first = cell_index[0] * all_cells_[1] + cell_index[1]; //2d version try implement, 3d separation needed + occupied.second = 0; + + mesh_data_.registerOccupied(occupied); } } } diff --git a/src/shared/meshes/mesh_local_dynamics.cpp b/src/shared/meshes/mesh_local_dynamics.cpp index 2f61622e45..1f315fb057 100644 --- a/src/shared/meshes/mesh_local_dynamics.cpp +++ b/src/shared/meshes/mesh_local_dynamics.cpp @@ -47,6 +47,12 @@ void InitializeDataInACell::update(const Arrayi &cell_index) if (measure < grid_spacing_) { mesh_data_.assignCore(cell_index); + std::pair occupied; + occupied.first = SortIndexFromCellIndex(cell_index); + occupied.second = 1; + + mesh_data_.assignDataPackageIndex(cell_index, 2); + mesh_data_.registerOccupied(occupied); } else { @@ -56,6 +62,11 @@ void InitializeDataInACell::update(const Arrayi &cell_index) } } //=================================================================================================// +size_t InitializeDataInACell::SortIndexFromCellIndex(const Arrayi &cell_index) +{ + return cell_index[0] * all_cells_[1] + cell_index[1]; +} +//=================================================================================================// // void TagACellIsInnerPackage::update() // { // if (isInnerPackage(cell_index)) diff --git a/src/shared/meshes/mesh_local_dynamics.h b/src/shared/meshes/mesh_local_dynamics.h index be84c82d8a..91377e8a69 100644 --- a/src/shared/meshes/mesh_local_dynamics.h +++ b/src/shared/meshes/mesh_local_dynamics.h @@ -59,6 +59,7 @@ class InitializeDataInACell : public BaseMeshLocalDynamics public: explicit InitializeDataInACell(MeshWithGridDataPackages<4> &mesh_data, Shape &shape) : BaseMeshLocalDynamics(mesh_data), + all_cells_(mesh_data.AllCells()), shape_(shape){}; virtual ~InitializeDataInACell(){}; @@ -67,6 +68,9 @@ class InitializeDataInACell : public BaseMeshLocalDynamics private: Shape &shape_; Real grid_spacing_ = mesh_data_.GridSpacing(); + Arrayi all_cells_; + + size_t SortIndexFromCellIndex(const Arrayi &cell_index); }; // class TagACellIsInnerPackage diff --git a/src/shared/meshes/mesh_with_data_packages.h b/src/shared/meshes/mesh_with_data_packages.h index 0baf36cb77..1894e049c7 100644 --- a/src/shared/meshes/mesh_with_data_packages.h +++ b/src/shared/meshes/mesh_with_data_packages.h @@ -122,13 +122,11 @@ class MeshWithGridDataPackages : public Mesh data_spacing_(data_spacing), global_mesh_(mesh_lower_bound_ + 0.5 * data_spacing * Vecd::Ones(), data_spacing, all_cells_ * pkg_size) { - allocateMetaDataMatrix(); allocateIndexDataMatrix(); allocateCategoryDataMatrix(); }; virtual ~MeshWithGridDataPackages() { - deleteMetaDataMatrix(); deleteIndexDataMatrix(); deleteCategoryDataMatrix(); delete[] cell_neighborhood_; @@ -140,6 +138,7 @@ class MeshWithGridDataPackages : public Mesh protected: MeshVariableAssemble all_mesh_variables_; /**< all mesh variables on this mesh. */ + ConcurrentVec> occupied_data_pkgs_; /**< (size_t)sort_index, (int)core1/inner0. */ static constexpr int pkg_size = PKG_SIZE; /**< the size of the data package matrix*/ const Real data_spacing_; /**< spacing of data in the data packages*/ BaseMesh global_mesh_; /**< the mesh for the locations of all possible data points. */ @@ -157,8 +156,6 @@ class MeshWithGridDataPackages : public Mesh template using PackageTemporaryData = PackageDataMatrix; - void allocateMetaDataMatrix(); /**< allocate memories for metadata of data packages. */ - void deleteMetaDataMatrix(); /**< delete memories for metadata of data packages. */ void allocateIndexDataMatrix(); /**< allocate memories for metadata of data packages. */ void deleteIndexDataMatrix(); /**< delete memories for metadata of data packages. */ void allocateCategoryDataMatrix(); /**< allocate memories for metadata of data packages. */ @@ -287,11 +284,10 @@ class MeshWithGridDataPackages : public Mesh ap); } - template - void testGradient(MeshVariable &in_variable, - MeshVariable &out_variable){ - printf("test gradient\n"); - } + void registerOccupied(std::pair &occupied) + { + occupied_data_pkgs_.push_back(occupied); + } }; } // namespace SPH #endif // MESH_WITH_DATA_PACKAGES_H From d7b6b0c4a1d93b1791cf37b71a7b38944422af50 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Mon, 5 Aug 2024 09:51:35 +0200 Subject: [PATCH 10/55] (2d) category check reimplement --- src/for_2D_build/geometries/level_set_2d.cpp | 35 +++++++++---------- .../meshes/mesh_with_data_packages.hpp | 6 ++-- 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/src/for_2D_build/geometries/level_set_2d.cpp b/src/for_2D_build/geometries/level_set_2d.cpp index e04e5f8a00..7f761d7af2 100644 --- a/src/for_2D_build/geometries/level_set_2d.cpp +++ b/src/for_2D_build/geometries/level_set_2d.cpp @@ -71,11 +71,10 @@ void LevelSet::finishDataPackages() void LevelSet::initializeIndexMesh() { num_grid_pkgs_ = occupied_data_pkgs_.size() + 2; - package_parallel_for( - [&](size_t package_index) + package_parallel_for([&](size_t package_index) { size_t sort_index = occupied_data_pkgs_[package_index-2].first; - Arrayi cell_index = Arrayi(sort_index / all_cells_[1], sort_index % all_cells_[1]); //[notion] there might be problems + Arrayi cell_index = Arrayi(sort_index / all_cells_[1], sort_index % all_cells_[1]); //[notion] there might be problems, 3d implementation needed assignDataPackageIndex(cell_index, package_index); }); } @@ -84,22 +83,20 @@ void LevelSet::initializeCellNeighborhood() { cell_neighborhood_ = new CellNeighborhood[num_grid_pkgs_]; meta_data_cell_ = new std::pair[num_grid_pkgs_]; - mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), - [&](size_t i, size_t j) + package_parallel_for( + [&](size_t package_index) { - Arrayi cell_index = Arrayi(i, j); - if (isInnerDataPackage(cell_index)) - { - CellNeighborhood ¤t = cell_neighborhood_[PackageIndexFromCellIndex(cell_index)]; - std::pair &metadata = meta_data_cell_[PackageIndexFromCellIndex(cell_index)]; - metadata.first = cell_index; - metadata.second = isCoreDataPackage(cell_index) ? 1 : 0; - for (int l = -1; l < 2; l++) - for (int m = -1; m < 2; m++) - { - current[l + 1][m + 1] = PackageIndexFromCellIndex(cell_index + Arrayi(l, m)); - } - } + size_t sort_index = occupied_data_pkgs_[package_index-2].first; + Arrayi cell_index = Arrayi(sort_index / all_cells_[1], sort_index % all_cells_[1]); //[notion] there might be problems, 3d implementation needed + CellNeighborhood ¤t = cell_neighborhood_[package_index]; + std::pair &metadata = meta_data_cell_[package_index]; + metadata.first = cell_index; + metadata.second = occupied_data_pkgs_[package_index-2].second; + for (int l = -1; l < 2; l++) + for (int m = -1; m < 2; m++) + { + current[l + 1][m + 1] = PackageIndexFromCellIndex(cell_index + Arrayi(l, m)); + } }); } //=================================================================================================// @@ -116,7 +113,7 @@ bool LevelSet::isInnerPackage(const Arrayi &cell_index) all_cells_.min(cell_index + 2 * Array2i::Ones()), [&](int l, int m) { - return isCoreDataPackage(Arrayi(l, m)); + return isInnerDataPackage(Arrayi(l, m)); //actually a core test here, because only core pkgs are assigned }); } //=================================================================================================// diff --git a/src/for_2D_build/meshes/mesh_with_data_packages.hpp b/src/for_2D_build/meshes/mesh_with_data_packages.hpp index 7cf268c342..74ed7db24b 100644 --- a/src/for_2D_build/meshes/mesh_with_data_packages.hpp +++ b/src/for_2D_build/meshes/mesh_with_data_packages.hpp @@ -119,10 +119,10 @@ template bool MeshWithGridDataPackages:: isCoreDataPackage(const Arrayi &cell_index) { - // size_t package_index = PackageIndexFromCellIndex(cell_index); - // return meta_data_cell_[package_index].second == 1; + size_t package_index = PackageIndexFromCellIndex(cell_index); + return meta_data_cell_[package_index].second == 1; - return category_data_mesh_[cell_index[0]][cell_index[1]] == 2; + // return category_data_mesh_[cell_index[0]][cell_index[1]] == 2; } //=================================================================================================// template From c9bcd6491615e26e93b2c7cf297c41b93c4283f5 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Mon, 5 Aug 2024 09:55:12 +0200 Subject: [PATCH 11/55] (2d) delete assign --- src/shared/geometries/level_set.cpp | 1 - src/shared/meshes/mesh_local_dynamics.cpp | 2 -- 2 files changed, 3 deletions(-) diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index efb14d5ba0..d051eb58bf 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -164,7 +164,6 @@ void LevelSet::tagACellIsInnerPackage(const Arrayi &cell_index) { if (!isInnerDataPackage(cell_index)) { - assignInner(cell_index); std::pair occupied; occupied.first = cell_index[0] * all_cells_[1] + cell_index[1]; //2d version try implement, 3d separation needed occupied.second = 0; diff --git a/src/shared/meshes/mesh_local_dynamics.cpp b/src/shared/meshes/mesh_local_dynamics.cpp index 1f315fb057..a1fe1eb663 100644 --- a/src/shared/meshes/mesh_local_dynamics.cpp +++ b/src/shared/meshes/mesh_local_dynamics.cpp @@ -46,7 +46,6 @@ void InitializeDataInACell::update(const Arrayi &cell_index) Real measure = (signed_distance * normal_direction).cwiseAbs().maxCoeff(); if (measure < grid_spacing_) { - mesh_data_.assignCore(cell_index); std::pair occupied; occupied.first = SortIndexFromCellIndex(cell_index); occupied.second = 1; @@ -57,7 +56,6 @@ void InitializeDataInACell::update(const Arrayi &cell_index) else { size_t package_index = shape_.checkContain(cell_position) ? 0 : 1; - mesh_data_.assignSingular(cell_index); mesh_data_.assignDataPackageIndex(cell_index, package_index); } } From a688ad95084fa0b331ca10269167b47547bd6b0e Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Mon, 5 Aug 2024 10:27:06 +0200 Subject: [PATCH 12/55] (wrapped) tag inner --- src/for_2D_build/geometries/level_set_2d.cpp | 12 ++++----- .../meshes/mesh_local_dynamics_2d.cpp | 11 ++++++++ .../meshes/mesh_local_dynamics_3d.cpp | 11 ++++++++ src/shared/geometries/level_set.h | 4 ++- src/shared/meshes/mesh_local_dynamics.cpp | 24 ++++++++++------- src/shared/meshes/mesh_local_dynamics.h | 26 ++++++++++++------- src/shared/meshes/mesh_with_data_packages.h | 5 ++-- 7 files changed, 65 insertions(+), 28 deletions(-) diff --git a/src/for_2D_build/geometries/level_set_2d.cpp b/src/for_2D_build/geometries/level_set_2d.cpp index 7f761d7af2..22bc5c4ee1 100644 --- a/src/for_2D_build/geometries/level_set_2d.cpp +++ b/src/for_2D_build/geometries/level_set_2d.cpp @@ -39,11 +39,12 @@ void LevelSet::initializeDataForSingularPackage(const size_t package_index, Real //=================================================================================================// void LevelSet::finishDataPackages() { - mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), - [&](size_t i, size_t j) - { - tagACellIsInnerPackage(Arrayi(i, j)); - }); + // mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), + // [&](size_t i, size_t j) + // { + // tagACellIsInnerPackage(Arrayi(i, j)); + // }); + tag_a_cell_is_inner_package.exec(); parallel_sort(occupied_data_pkgs_.begin(), occupied_data_pkgs_.end(), [](const std::pair& a, const std::pair& b) @@ -239,7 +240,6 @@ void LevelSet::markNearInterface(Real small_shift_factor) //=================================================================================================// void LevelSet::initializeBasicDataForAPackage(const Arrayi &cell_index, const size_t package_index, Shape &shape) { - // size_t package_index = PackageIndexFromCellIndex(cell_index); auto &phi = phi_.DataField()[package_index]; auto &near_interface_id = near_interface_id_.DataField()[package_index]; for_each_cell_data( diff --git a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp index 73e8d9c125..e78bc6d344 100644 --- a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp +++ b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp @@ -5,6 +5,17 @@ namespace SPH { //=============================================================================================// +bool TagACellIsInnerPackage::isInnerPackage(const Arrayi &cell_index) +{ + return mesh_any_of( + Array2i::Zero().max(cell_index - Array2i::Ones()), + all_cells_.min(cell_index + 2 * Array2i::Ones()), + [&](int l, int m) + { + return mesh_data_.isInnerDataPackage(Arrayi(l, m)); //actually a core test here, because only core pkgs are assigned + }); +} +//=============================================================================================// // void InitializeCellNeighborhood::update(const size_t &package_index) // { // Arrayi cell_index = mesh_data_.CellIndexFromPackageSortIndex(package_index); diff --git a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp index 8a9404de06..72c98f4541 100644 --- a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp +++ b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp @@ -3,6 +3,17 @@ namespace SPH { //=============================================================================================// +bool TagACellIsInnerPackage::isInnerPackage(const Arrayi &cell_index) +{ + return mesh_any_of( + Array3i::Zero().max(cell_index - Array3i::Ones()), + all_cells_.min(cell_index + 2 * Array3i::Ones()), + [&](int l, int m, int n) + { + return mesh_data_.isInnerDataPackage(Arrayi(l, m, n)); + }); +} +//=============================================================================================// // void InitializeCellNeighborhood::update(const size_t &package_index) // { // Arrayi cell_index = mesh_data_.CellIndexFromPackageSortIndex(package_index); diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index c09a524ea0..b3fec1e3aa 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -124,11 +124,13 @@ class LevelSet : public MeshWithGridDataPackages<4>, void updateKernelIntegrals(); bool isInnerPackage(const Arrayi &cell_index); void initializeDataInACell(const Arrayi &cell_index); - MeshAllDynamics initialize_data_in_a_cell{mesh_data_, shape_}; void tagACellIsInnerPackage(const Arrayi &cell_index); void initializeIndexMesh(); void initializeCellNeighborhood(); void updateLevelSetGradient(); + MeshAllDynamics initialize_data_in_a_cell{mesh_data_, shape_}; + MeshAllDynamics tag_a_cell_is_inner_package{mesh_data_}; + MeshInnerDynamics update_level_set_gradient{mesh_data_}; // upwind algorithm choosing candidate difference by the sign diff --git a/src/shared/meshes/mesh_local_dynamics.cpp b/src/shared/meshes/mesh_local_dynamics.cpp index a1fe1eb663..9de52bee3a 100644 --- a/src/shared/meshes/mesh_local_dynamics.cpp +++ b/src/shared/meshes/mesh_local_dynamics.cpp @@ -65,16 +65,20 @@ size_t InitializeDataInACell::SortIndexFromCellIndex(const Arrayi &cell_index) return cell_index[0] * all_cells_[1] + cell_index[1]; } //=================================================================================================// -// void TagACellIsInnerPackage::update() -// { -// if (isInnerPackage(cell_index)) -// { -// if (!isCoreDataPackage(cell_index)) -// { -// assignInner(cell_index); -// } -// } -// } +void TagACellIsInnerPackage::update(const Arrayi &cell_index) +{ + if (isInnerPackage(cell_index)) + { + if (!mesh_data_.isInnerDataPackage(cell_index)) + { + std::pair occupied; + occupied.first = cell_index[0] * all_cells_[1] + cell_index[1]; //2d version try implement, 3d separation needed + occupied.second = 0; + + mesh_data_.registerOccupied(occupied); + } + } +} //=================================================================================================// // void InitializeIndexMesh::update() // { diff --git a/src/shared/meshes/mesh_local_dynamics.h b/src/shared/meshes/mesh_local_dynamics.h index 91377e8a69..bb6c467923 100644 --- a/src/shared/meshes/mesh_local_dynamics.h +++ b/src/shared/meshes/mesh_local_dynamics.h @@ -36,7 +36,8 @@ namespace SPH { -// using MeshData = MeshWithGridDataPackages<4>; +using MeshWithGridDataPackagesType = MeshWithGridDataPackages<4>; + /** * @class BaseMeshLocalDynamics * @brief The base class for all mesh local particle dynamics. @@ -73,15 +74,22 @@ class InitializeDataInACell : public BaseMeshLocalDynamics size_t SortIndexFromCellIndex(const Arrayi &cell_index); }; -// class TagACellIsInnerPackage -// : public BaseMeshLocalDynamics -// { -// public: -// explicit TagACellIsInnerPackage(MeshWithGridDataPackages &mesh_data){}; -// virtual ~TagACellIsInnerPackage(){}; +class TagACellIsInnerPackage : public BaseMeshLocalDynamics +{ + public: + explicit TagACellIsInnerPackage(MeshWithGridDataPackagesType &mesh_data) + : BaseMeshLocalDynamics(mesh_data), + all_cells_(mesh_data.AllCells()){}; + virtual ~TagACellIsInnerPackage(){}; -// void update(); -// }; + void update(const Arrayi &index); + + private: + Arrayi all_cells_; + + //[notion] 3d implementation needed + bool isInnerPackage(const Arrayi &cell_index); +}; // class InitializeIndexMesh // : public BaseMeshLocalDynamics diff --git a/src/shared/meshes/mesh_with_data_packages.h b/src/shared/meshes/mesh_with_data_packages.h index 1894e049c7..78d850bafd 100644 --- a/src/shared/meshes/mesh_with_data_packages.h +++ b/src/shared/meshes/mesh_with_data_packages.h @@ -208,7 +208,6 @@ class MeshWithGridDataPackages : public Mesh size_t PackageIndexFromCellIndex(const Arrayi &cell_index); void assignCategoryOnMetaDataMesh(const Arrayi &cell_index, const int category); bool isSingularDataPackage(const Arrayi &cell_index); - bool isInnerDataPackage(const Arrayi &cell_index); bool isCoreDataPackage(const Arrayi &cell_index); std::pair NeighbourIndexShift(const Arrayi shift_index, const CellNeighborhood &neighbour); @@ -245,10 +244,12 @@ class MeshWithGridDataPackages : public Mesh return DataLowerBoundInCell(cell_index) + data_index.cast().matrix() * data_spacing_; } - public: void assignSingular(const Arrayi &cell_index) { assignCategoryOnMetaDataMesh(cell_index, 0); }; void assignInner(const Arrayi &cell_index) { assignCategoryOnMetaDataMesh(cell_index, 1); }; void assignCore(const Arrayi &cell_index) { assignCategoryOnMetaDataMesh(cell_index, 2); }; + + public: + bool isInnerDataPackage(const Arrayi &cell_index); void assignDataPackageIndex(const Arrayi &cell_index, const size_t package_index); template void grid_parallel_for(const FunctionOnData &function); From 1fc2f3e59d97632320386991eee7b8a0037a40fe Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Mon, 5 Aug 2024 10:40:16 +0200 Subject: [PATCH 13/55] (2d) initialize index --- src/for_2D_build/geometries/level_set_2d.cpp | 3 +-- .../meshes/mesh_local_dynamics_3d.cpp | 2 +- src/shared/meshes/mesh_local_dynamics.cpp | 10 +++++---- src/shared/meshes/mesh_local_dynamics.h | 21 +++++++++++-------- src/shared/meshes/mesh_with_data_packages.h | 4 +++- 5 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/for_2D_build/geometries/level_set_2d.cpp b/src/for_2D_build/geometries/level_set_2d.cpp index 22bc5c4ee1..b881872a30 100644 --- a/src/for_2D_build/geometries/level_set_2d.cpp +++ b/src/for_2D_build/geometries/level_set_2d.cpp @@ -51,7 +51,7 @@ void LevelSet::finishDataPackages() { return a.first < b.first; }); - + num_grid_pkgs_ = occupied_data_pkgs_.size() + 2; initializeIndexMesh(); initializeCellNeighborhood(); resizeMeshVariableData(); @@ -71,7 +71,6 @@ void LevelSet::finishDataPackages() //=================================================================================================// void LevelSet::initializeIndexMesh() { - num_grid_pkgs_ = occupied_data_pkgs_.size() + 2; package_parallel_for([&](size_t package_index) { size_t sort_index = occupied_data_pkgs_[package_index-2].first; diff --git a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp index 72c98f4541..949698515d 100644 --- a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp +++ b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp @@ -10,7 +10,7 @@ bool TagACellIsInnerPackage::isInnerPackage(const Arrayi &cell_index) all_cells_.min(cell_index + 2 * Array3i::Ones()), [&](int l, int m, int n) { - return mesh_data_.isInnerDataPackage(Arrayi(l, m, n)); + return mesh_data_.isInnerDataPackage(Arrayi(l, m, n)); //actually a core test here, because only core pkgs are assigned }); } //=============================================================================================// diff --git a/src/shared/meshes/mesh_local_dynamics.cpp b/src/shared/meshes/mesh_local_dynamics.cpp index 9de52bee3a..3967ddb1a7 100644 --- a/src/shared/meshes/mesh_local_dynamics.cpp +++ b/src/shared/meshes/mesh_local_dynamics.cpp @@ -80,10 +80,12 @@ void TagACellIsInnerPackage::update(const Arrayi &cell_index) } } //=================================================================================================// -// void InitializeIndexMesh::update() -// { - -// } +void InitializeIndexMesh::update(const size_t &package_index) +{ + size_t sort_index = mesh_data_.occupied_data_pkgs_[package_index-2].first; + Arrayi cell_index = Arrayi(sort_index / all_cells_[1], sort_index % all_cells_[1]); //[notion] there might be problems, 3d implementation needed + mesh_data_.assignDataPackageIndex(cell_index, package_index); +} //=================================================================================================// // void InitializeCellNeighborhood::update() // { diff --git a/src/shared/meshes/mesh_local_dynamics.h b/src/shared/meshes/mesh_local_dynamics.h index bb6c467923..6e3287c078 100644 --- a/src/shared/meshes/mesh_local_dynamics.h +++ b/src/shared/meshes/mesh_local_dynamics.h @@ -87,19 +87,22 @@ class TagACellIsInnerPackage : public BaseMeshLocalDynamics private: Arrayi all_cells_; - //[notion] 3d implementation needed bool isInnerPackage(const Arrayi &cell_index); }; -// class InitializeIndexMesh -// : public BaseMeshLocalDynamics -// { -// public: -// explicit InitializeIndexMesh(MeshWithGridDataPackages &mesh_data){}; -// virtual ~InitializeIndexMesh(){}; +class InitializeIndexMesh : public BaseMeshLocalDynamics +{ + public: + explicit InitializeIndexMesh(MeshWithGridDataPackagesType &mesh_data) + : BaseMeshLocalDynamics(mesh_data), + all_cells_(mesh_data.AllCells()){}; + virtual ~InitializeIndexMesh(){}; -// void update(); -// }; + void update(const size_t &index); + + private: + Arrayi all_cells_; +}; // class InitializeCellNeighborhood // : public BaseMeshLocalDynamics diff --git a/src/shared/meshes/mesh_with_data_packages.h b/src/shared/meshes/mesh_with_data_packages.h index 78d850bafd..097d8231c9 100644 --- a/src/shared/meshes/mesh_with_data_packages.h +++ b/src/shared/meshes/mesh_with_data_packages.h @@ -136,9 +136,11 @@ class MeshWithGridDataPackages : public Mesh virtual Real DataSpacing() override { return data_spacing_; }; Real GridSpacing() { return grid_spacing_; }; + public: + ConcurrentVec> occupied_data_pkgs_; /**< (size_t)sort_index, (int)core1/inner0. */ + protected: MeshVariableAssemble all_mesh_variables_; /**< all mesh variables on this mesh. */ - ConcurrentVec> occupied_data_pkgs_; /**< (size_t)sort_index, (int)core1/inner0. */ static constexpr int pkg_size = PKG_SIZE; /**< the size of the data package matrix*/ const Real data_spacing_; /**< spacing of data in the data packages*/ BaseMesh global_mesh_; /**< the mesh for the locations of all possible data points. */ From 3213abdf338defff109074fdab6b21767637c15b Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Mon, 5 Aug 2024 10:48:14 +0200 Subject: [PATCH 14/55] (2d wrapped) inni index --- src/for_2D_build/geometries/level_set_2d.cpp | 4 +++- src/shared/geometries/level_set.h | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/for_2D_build/geometries/level_set_2d.cpp b/src/for_2D_build/geometries/level_set_2d.cpp index b881872a30..f44aa0e68b 100644 --- a/src/for_2D_build/geometries/level_set_2d.cpp +++ b/src/for_2D_build/geometries/level_set_2d.cpp @@ -52,10 +52,12 @@ void LevelSet::finishDataPackages() return a.first < b.first; }); num_grid_pkgs_ = occupied_data_pkgs_.size() + 2; - initializeIndexMesh(); + initialize_index_mesh.exec(); + // initializeIndexMesh(); initializeCellNeighborhood(); resizeMeshVariableData(); + Real far_field_distance = grid_spacing_ * (Real)buffer_width_; initializeDataForSingularPackage(0, -far_field_distance); initializeDataForSingularPackage(1, far_field_distance); diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index b3fec1e3aa..13b5e076ae 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -131,6 +131,7 @@ class LevelSet : public MeshWithGridDataPackages<4>, MeshAllDynamics initialize_data_in_a_cell{mesh_data_, shape_}; MeshAllDynamics tag_a_cell_is_inner_package{mesh_data_}; + MeshInnerDynamics initialize_index_mesh{mesh_data_}; MeshInnerDynamics update_level_set_gradient{mesh_data_}; // upwind algorithm choosing candidate difference by the sign From cc79359d6fcb35617b19c6ba3ecbc293c0e95a14 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Mon, 5 Aug 2024 12:39:58 +0200 Subject: [PATCH 15/55] (2d wrapped) except kernel --- src/for_2D_build/geometries/level_set_2d.cpp | 23 ++++--- .../meshes/mesh_local_dynamics_2d.cpp | 46 ++++++++++---- .../meshes/mesh_local_dynamics_3d.cpp | 61 +++++++++++-------- src/shared/geometries/level_set.h | 2 + src/shared/meshes/mesh_local_dynamics.cpp | 14 ++++- src/shared/meshes/mesh_local_dynamics.h | 46 +++++++++++--- src/shared/meshes/mesh_with_data_packages.h | 25 ++++---- 7 files changed, 145 insertions(+), 72 deletions(-) diff --git a/src/for_2D_build/geometries/level_set_2d.cpp b/src/for_2D_build/geometries/level_set_2d.cpp index f44aa0e68b..777ca018ff 100644 --- a/src/for_2D_build/geometries/level_set_2d.cpp +++ b/src/for_2D_build/geometries/level_set_2d.cpp @@ -52,9 +52,12 @@ void LevelSet::finishDataPackages() return a.first < b.first; }); num_grid_pkgs_ = occupied_data_pkgs_.size() + 2; + cell_neighborhood_ = new CellNeighborhood[num_grid_pkgs_]; + meta_data_cell_ = new std::pair[num_grid_pkgs_]; initialize_index_mesh.exec(); + initialize_cell_neighborhood.exec(); // initializeIndexMesh(); - initializeCellNeighborhood(); + // initializeCellNeighborhood(); resizeMeshVariableData(); @@ -62,11 +65,12 @@ void LevelSet::finishDataPackages() initializeDataForSingularPackage(0, -far_field_distance); initializeDataForSingularPackage(1, far_field_distance); - package_parallel_for( - [&](size_t package_index) - { - initializeBasicDataForAPackage(meta_data_cell_[package_index].first, package_index, shape_); - }); + // package_parallel_for( + // [&](size_t package_index) + // { + // initializeBasicDataForAPackage(meta_data_cell_[package_index].first, package_index, shape_); + // }); + initialize_basic_data_for_a_package.exec(); update_level_set_gradient.exec(); updateKernelIntegrals(); } @@ -83,10 +87,9 @@ void LevelSet::initializeIndexMesh() //=================================================================================================// void LevelSet::initializeCellNeighborhood() { - cell_neighborhood_ = new CellNeighborhood[num_grid_pkgs_]; - meta_data_cell_ = new std::pair[num_grid_pkgs_]; - package_parallel_for( - [&](size_t package_index) + // cell_neighborhood_ = new CellNeighborhood[num_grid_pkgs_]; + // meta_data_cell_ = new std::pair[num_grid_pkgs_]; + package_parallel_for([&](size_t package_index) { size_t sort_index = occupied_data_pkgs_[package_index-2].first; Arrayi cell_index = Arrayi(sort_index / all_cells_[1], sort_index % all_cells_[1]); //[notion] there might be problems, 3d implementation needed diff --git a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp index e78bc6d344..67b0a618eb 100644 --- a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp +++ b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp @@ -30,19 +30,39 @@ bool TagACellIsInnerPackage::isInnerPackage(const Arrayi &cell_index) // }; // } //=============================================================================================// -// void InitializeBasicDataForAPackage::update(const size_t &package_index) -// { -// auto &phi = phi_.DataField()[package_index]; -// auto &near_interface_id = near_interface_id_.DataField()[package_index]; -// Arrayi cell_index = mesh_data_.CellIndexFromPackageSortIndex(package_index); -// mesh_data_.for_each_cell_data( -// [&](int i, int j) -// { -// Vec2d position = mesh_data_.DataPositionFromIndex(cell_index, Array2i(i, j)); -// phi[i][j] = shape_.findSignedDistance(position); -// near_interface_id[i][j] = phi[i][j] < 0.0 ? -2 : 2; -// }); -// } +void InitializeCellNeighborhood::update(const size_t &package_index) +{ + size_t sort_index = mesh_data_.occupied_data_pkgs_[package_index-2].first; + Arrayi cell_index = Arrayi(sort_index / all_cells_[1], sort_index % all_cells_[1]); //[notion] there might be problems, 3d implementation needed + CellNeighborhood ¤t = mesh_data_.cell_neighborhood_[package_index]; + std::pair &metadata = mesh_data_.meta_data_cell_[package_index]; + metadata.first = cell_index; + metadata.second = mesh_data_.occupied_data_pkgs_[package_index-2].second; + for (int l = -1; l < 2; l++) + for (int m = -1; m < 2; m++) + { + current[l + 1][m + 1] = mesh_data_.PackageIndexFromCellIndex(cell_index + Arrayi(l, m)); + } +} +//=============================================================================================// +void InitializeBasicDataForAPackage::update(const size_t &package_index) +{ + auto &phi = phi_.DataField()[package_index]; + auto &near_interface_id = near_interface_id_.DataField()[package_index]; + Arrayi cell_index = CellIndexFromSortIndex(package_index); + mesh_data_.for_each_cell_data( + [&](int i, int j) + { + Vec2d position = mesh_data_.DataPositionFromIndex(cell_index, Array2i(i, j)); + phi[i][j] = shape_.findSignedDistance(position); + near_interface_id[i][j] = phi[i][j] < 0.0 ? -2 : 2; + }); +} +//=============================================================================================// +Arrayi InitializeBasicDataForAPackage::CellIndexFromSortIndex(const size_t &sort_index) +{ + return Array2i(sort_index / all_cells_[1], sort_index % all_cells_[1]); +} //=============================================================================================// // Real UpdateKernelIntegrals::computeKernelIntegral(const Vecd &position) // { diff --git a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp index 949698515d..e18390eac5 100644 --- a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp +++ b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp @@ -14,34 +14,41 @@ bool TagACellIsInnerPackage::isInnerPackage(const Arrayi &cell_index) }); } //=============================================================================================// -// void InitializeCellNeighborhood::update(const size_t &package_index) -// { -// Arrayi cell_index = mesh_data_.CellIndexFromPackageSortIndex(package_index); -// CellNeighborhood ¤t = mesh_data_.getCellNeighborhoodForWrite(package_index); -// std::pair &metadata = mesh_data_.getMetaDataCellForWrite(package_index); -// metadata.first = cell_index; -// metadata.second = mesh_data_.isCoreDataPackage(cell_index) ? 1 : 0; -// for (int l = -1; l < 2; l++) -// for (int m = -1; m < 2; m++) -// for (int n = -1; n < 2; n++) -// { -// current[l + 1][m + 1][n + 1] = mesh_data_.PackageIndexFromCellIndex(cell_index + Arrayi(l, m, n)); -// }; -// } +void InitializeCellNeighborhood::update(const size_t &package_index) +{ + size_t sort_index = mesh_data_.occupied_data_pkgs_[package_index-2].first; + Arrayi cell_index = Arrayi(sort_index / all_cells_[1], sort_index % all_cells_[1]); //[notion] there might be problems, 3d implementation needed + CellNeighborhood ¤t = mesh_data_.cell_neighborhood_[package_index]; + std::pair &metadata = mesh_data_.meta_data_cell_[package_index]; + metadata.first = cell_index; + metadata.second = mesh_data_.occupied_data_pkgs_[package_index-2].second; + for (int l = -1; l < 2; l++) + for (int m = -1; m < 2; m++) + for (int n = -1; n < 2; n++) + { + current[l + 1][m + 1][n + 1] = mesh_data_.PackageIndexFromCellIndex(cell_index + Arrayi(l, m, n)); + } +} //=============================================================================================// -// void InitializeBasicDataForAPackage::update(const size_t &package_index) -// { -// auto &phi = phi_.DataField()[package_index]; -// auto &near_interface_id = near_interface_id_.DataField()[package_index]; -// Arrayi cell_index = mesh_data_.CellIndexFromPackageSortIndex(package_index); -// mesh_data_.for_each_cell_data( -// [&](int i, int j, int k) -// { -// Vec3d position = mesh_data_.DataPositionFromIndex(cell_index, Array3i(i, j, k)); -// phi[i][j][k] = shape_.findSignedDistance(position); -// near_interface_id[i][j][k] = phi[i][j][k] < 0.0 ? -2 : 2; -// }); -// } +void InitializeBasicDataForAPackage::update(const size_t &package_index) +{ + // auto &phi = phi_.DataField()[package_index]; + // auto &near_interface_id = near_interface_id_.DataField()[package_index]; + // Arrayi cell_index = mesh_data_.CellIndexFromPackageSortIndex(package_index); + // mesh_data_.for_each_cell_data( + // [&](int i, int j, int k) + // { + // Vec3d position = mesh_data_.DataPositionFromIndex(cell_index, Array3i(i, j, k)); + // phi[i][j][k] = shape_.findSignedDistance(position); + // near_interface_id[i][j][k] = phi[i][j][k] < 0.0 ? -2 : 2; + // }); + printf("not implemented yet"); +} +//=============================================================================================// +Arrayi InitializeBasicDataForAPackage::CellIndexFromSortIndex(const size_t &sort_index) +{ + return Array3i(sort_index / all_cells_[1], sort_index % all_cells_[1], sort_index % all_cells_[1]); //[notion] not implemented yet +} //=============================================================================================// // Real UpdateKernelIntegrals::computeKernelIntegral(const Vecd &position) // { diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index 13b5e076ae..5a77c38f47 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -132,6 +132,8 @@ class LevelSet : public MeshWithGridDataPackages<4>, MeshAllDynamics tag_a_cell_is_inner_package{mesh_data_}; MeshInnerDynamics initialize_index_mesh{mesh_data_}; + MeshInnerDynamics initialize_cell_neighborhood{mesh_data_}; + MeshInnerDynamics initialize_basic_data_for_a_package{mesh_data_, shape_}; MeshInnerDynamics update_level_set_gradient{mesh_data_}; // upwind algorithm choosing candidate difference by the sign diff --git a/src/shared/meshes/mesh_local_dynamics.cpp b/src/shared/meshes/mesh_local_dynamics.cpp index 3967ddb1a7..171bd9adae 100644 --- a/src/shared/meshes/mesh_local_dynamics.cpp +++ b/src/shared/meshes/mesh_local_dynamics.cpp @@ -87,9 +87,19 @@ void InitializeIndexMesh::update(const size_t &package_index) mesh_data_.assignDataPackageIndex(cell_index, package_index); } //=================================================================================================// -// void InitializeCellNeighborhood::update() +// void InitializeCellNeighborhood::update(const size_t &package_index) // { - +// size_t sort_index = mesh_data_.occupied_data_pkgs_[package_index-2].first; +// Arrayi cell_index = Arrayi(sort_index / all_cells_[1], sort_index % all_cells_[1]); //[notion] there might be problems, 3d implementation needed +// CellNeighborhood ¤t = cell_neighborhood_[package_index]; +// std::pair &metadata = meta_data_cell_[package_index]; +// metadata.first = cell_index; +// metadata.second = mesh_data_.occupied_data_pkgs_[package_index-2].second; +// for (int l = -1; l < 2; l++) +// for (int m = -1; m < 2; m++) +// { +// current[l + 1][m + 1] = mesh_data_.PackageIndexFromCellIndex(cell_index + Arrayi(l, m)); +// } // } //=================================================================================================// void UpdateLevelSetGradient::update(const size_t &index) diff --git a/src/shared/meshes/mesh_local_dynamics.h b/src/shared/meshes/mesh_local_dynamics.h index 6e3287c078..d14895c2e3 100644 --- a/src/shared/meshes/mesh_local_dynamics.h +++ b/src/shared/meshes/mesh_local_dynamics.h @@ -104,15 +104,45 @@ class InitializeIndexMesh : public BaseMeshLocalDynamics Arrayi all_cells_; }; -// class InitializeCellNeighborhood -// : public BaseMeshLocalDynamics -// { -// public: -// explicit InitializeCellNeighborhood(MeshWithGridDataPackages &mesh_data){}; -// virtual ~InitializeCellNeighborhood(){}; +class InitializeCellNeighborhood : public BaseMeshLocalDynamics +{ + public: + explicit InitializeCellNeighborhood(MeshWithGridDataPackagesType &mesh_data) + : BaseMeshLocalDynamics(mesh_data), + // cell_neighborhood_(mesh_data.getCellNeighborhood()), + // meta_data_cell_(mesh_data.getMetaDataCell()), + all_cells_(mesh_data.AllCells()){}; + virtual ~InitializeCellNeighborhood(){}; -// void update(); -// }; + void update(const size_t &index); + + private: + Arrayi all_cells_; + // CellNeighborhood* cell_neighborhood_; + // std::pair* meta_data_cell_; +}; + +class InitializeBasicDataForAPackage : public BaseMeshLocalDynamics +{ + public: + explicit InitializeBasicDataForAPackage(MeshWithGridDataPackagesType &mesh_data, Shape &shape) + : BaseMeshLocalDynamics(mesh_data), + shape_(shape), + all_cells_(mesh_data.AllCells()), + phi_(*mesh_data.getMeshVariable("Levelset")), + near_interface_id_(*mesh_data.getMeshVariable("NearInterfaceID")){}; + virtual ~InitializeBasicDataForAPackage(){}; + + void update(const size_t &index); + + private: + Shape &shape_; + Arrayi all_cells_; + MeshVariable &phi_; + MeshVariable &near_interface_id_; + + Arrayi CellIndexFromSortIndex(const size_t &sort_index); +}; class UpdateLevelSetGradient : public BaseMeshLocalDynamics { diff --git a/src/shared/meshes/mesh_with_data_packages.h b/src/shared/meshes/mesh_with_data_packages.h index 097d8231c9..232c9cc709 100644 --- a/src/shared/meshes/mesh_with_data_packages.h +++ b/src/shared/meshes/mesh_with_data_packages.h @@ -135,9 +135,12 @@ class MeshWithGridDataPackages : public Mesh /** spacing between the data, which is 1/ pkg_size of this grid spacing */ virtual Real DataSpacing() override { return data_spacing_; }; Real GridSpacing() { return grid_spacing_; }; - + // CellNeighborhood* getCellNeighborhood() { return cell_neighborhood_; }; + // std::pair* getMetaDataCell() { return meta_data_cell_; }; public: ConcurrentVec> occupied_data_pkgs_; /**< (size_t)sort_index, (int)core1/inner0. */ + CellNeighborhood *cell_neighborhood_; /**< 3*3(*3) array to store indicies of neighborhood cells. */ + std::pair *meta_data_cell_; /**< metadata for each occupied cell: (arrayi)cell index, (int)core1/inner0. */ protected: MeshVariableAssemble all_mesh_variables_; /**< all mesh variables on this mesh. */ @@ -149,8 +152,6 @@ class MeshWithGridDataPackages : public Mesh MeshDataMatrix meta_data_mesh_; /**< metadata for all cells. */ MeshDataMatrix index_data_mesh_; /**< metadata for all cells. */ MeshDataMatrix category_data_mesh_; /**< metadata for all cells. */ - CellNeighborhood *cell_neighborhood_; /**< 3*3(*3) array to store indicies of neighborhood cells. */ - std::pair *meta_data_cell_; /**< metadata for each occupied cell: (arrayi)cell index, (int)core1/inner0. */ using NeighbourIndex = std::pair; /**< stores shifted neighbour info: (size_t)package index, (arrayi)local grid index. */ template using PackageData = PackageDataMatrix; @@ -203,11 +204,7 @@ class MeshWithGridDataPackages : public Mesh }; DataAssembleOperation resize_mesh_variable_data_; - /** void (non_value_returning) function iterate on all data points by value. */ - template - void for_each_cell_data(const FunctionOnData &function); - size_t PackageIndexFromCellIndex(const Arrayi &cell_index); void assignCategoryOnMetaDataMesh(const Arrayi &cell_index, const int category); bool isSingularDataPackage(const Arrayi &cell_index); bool isCoreDataPackage(const Arrayi &cell_index); @@ -240,19 +237,23 @@ class MeshWithGridDataPackages : public Mesh .max(Arrayi::Zero()) .min((pkg_size - 1) * Arrayi::Ones()); } - /** return the position of data from its local grid index and the index of the cell it belongs to. */ - Vecd DataPositionFromIndex(const Arrayi &cell_index, const Arrayi &data_index) - { - return DataLowerBoundInCell(cell_index) + data_index.cast().matrix() * data_spacing_; - } void assignSingular(const Arrayi &cell_index) { assignCategoryOnMetaDataMesh(cell_index, 0); }; void assignInner(const Arrayi &cell_index) { assignCategoryOnMetaDataMesh(cell_index, 1); }; void assignCore(const Arrayi &cell_index) { assignCategoryOnMetaDataMesh(cell_index, 2); }; public: + /** return the position of data from its local grid index and the index of the cell it belongs to. */ + Vecd DataPositionFromIndex(const Arrayi &cell_index, const Arrayi &data_index) + { + return DataLowerBoundInCell(cell_index) + data_index.cast().matrix() * data_spacing_; + } + /** void (non_value_returning) function iterate on all data points by value. */ + template + void for_each_cell_data(const FunctionOnData &function); bool isInnerDataPackage(const Arrayi &cell_index); void assignDataPackageIndex(const Arrayi &cell_index, const size_t package_index); + size_t PackageIndexFromCellIndex(const Arrayi &cell_index); template void grid_parallel_for(const FunctionOnData &function); void resizeMeshVariableData() From 9fb3c9f03c05daabccbbf87023461f8b42ffc5b9 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Mon, 5 Aug 2024 13:24:02 +0200 Subject: [PATCH 16/55] (wrap) finish package --- src/for_2D_build/geometries/level_set_2d.cpp | 3 +- .../meshes/mesh_local_dynamics_2d.cpp | 114 +++++++++--------- .../meshes/mesh_local_dynamics_3d.cpp | 114 +++++++++--------- src/shared/geometries/level_set.h | 3 +- src/shared/meshes/mesh_local_dynamics.cpp | 35 ++---- src/shared/meshes/mesh_local_dynamics.h | 51 ++++++-- src/shared/meshes/mesh_with_data_packages.h | 36 ++++-- 7 files changed, 192 insertions(+), 164 deletions(-) diff --git a/src/for_2D_build/geometries/level_set_2d.cpp b/src/for_2D_build/geometries/level_set_2d.cpp index 777ca018ff..be7d96c119 100644 --- a/src/for_2D_build/geometries/level_set_2d.cpp +++ b/src/for_2D_build/geometries/level_set_2d.cpp @@ -72,7 +72,8 @@ void LevelSet::finishDataPackages() // }); initialize_basic_data_for_a_package.exec(); update_level_set_gradient.exec(); - updateKernelIntegrals(); + // updateKernelIntegrals(); + update_kernel_integrals.exec(); } //=================================================================================================// void LevelSet::initializeIndexMesh() diff --git a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp index 67b0a618eb..7afd0e0d5a 100644 --- a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp +++ b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp @@ -64,67 +64,67 @@ Arrayi InitializeBasicDataForAPackage::CellIndexFromSortIndex(const size_t &sort return Array2i(sort_index / all_cells_[1], sort_index % all_cells_[1]); } //=============================================================================================// -// Real UpdateKernelIntegrals::computeKernelIntegral(const Vecd &position) -// { -// Real phi = probeSignedDistance(position); -// Real cutoff_radius = kernel_.CutOffRadius(global_h_ratio_); -// Real threshold = cutoff_radius + data_spacing_; // consider that interface's half width is the data spacing +Real UpdateKernelIntegrals::computeKernelIntegral(const Vecd &position) +{ + Real phi = probeSignedDistance(position); + Real cutoff_radius = kernel_.CutOffRadius(global_h_ratio_); + Real threshold = cutoff_radius + data_spacing_; // consider that interface's half width is the data spacing -// Real integral(0); -// if (fabs(phi) < threshold) -// { -// Arrayi global_index_ = mesh_data_.CellIndexFromPositionOnGlobalMesh(position); -// mesh_for_each2d<-3, 4>( -// [&](int i, int j) -// { -// Arrayi neighbor_index = Arrayi(global_index_[0] + i, global_index_[1] + j); -// Real phi_neighbor = mesh_data_.DataValueFromGlobalIndex(phi_, neighbor_index); -// if (phi_neighbor > -data_spacing_) -// { -// Vecd phi_gradient = mesh_data_.DataValueFromGlobalIndex(phi_gradient_, neighbor_index); -// Vecd integral_position = mesh_data_.GridPositionFromIndexOnGlobalMesh(neighbor_index); -// Vecd displacement = position - integral_position; -// Real distance = displacement.norm(); -// if (distance < cutoff_radius) -// integral += kernel_.W(global_h_ratio_, distance, displacement) * -// CutCellVolumeFraction(phi_neighbor, phi_gradient, data_spacing_); -// } -// }); -// } -// return phi > threshold ? 1.0 : integral * data_spacing_ * data_spacing_; -// } + Real integral(0); + if (fabs(phi) < threshold) + { + Arrayi global_index_ = mesh_data_.CellIndexFromPositionOnGlobalMesh(position); + mesh_for_each2d<-3, 4>( + [&](int i, int j) + { + Arrayi neighbor_index = Arrayi(global_index_[0] + i, global_index_[1] + j); + Real phi_neighbor = mesh_data_.DataValueFromGlobalIndex(phi_, neighbor_index); + if (phi_neighbor > -data_spacing_) + { + Vecd phi_gradient = mesh_data_.DataValueFromGlobalIndex(phi_gradient_, neighbor_index); + Vecd integral_position = mesh_data_.GridPositionFromIndexOnGlobalMesh(neighbor_index); + Vecd displacement = position - integral_position; + Real distance = displacement.norm(); + if (distance < cutoff_radius) + integral += kernel_.W(global_h_ratio_, distance, displacement) * + CutCellVolumeFraction(phi_neighbor, phi_gradient, data_spacing_); + } + }); + } + return phi > threshold ? 1.0 : integral * data_spacing_ * data_spacing_; +} //=============================================================================================// -// Vecd UpdateKernelIntegrals::computeKernelGradientIntegral(const Vecd &position) -// { -// Real phi = probeSignedDistance(position); -// Real cutoff_radius = kernel_.CutOffRadius(global_h_ratio_); -// Real threshold = cutoff_radius + data_spacing_; +Vecd UpdateKernelIntegrals::computeKernelGradientIntegral(const Vecd &position) +{ + Real phi = probeSignedDistance(position); + Real cutoff_radius = kernel_.CutOffRadius(global_h_ratio_); + Real threshold = cutoff_radius + data_spacing_; -// Vecd integral = Vecd::Zero(); -// if (fabs(phi) < threshold) -// { -// Arrayi global_index_ = mesh_data_.CellIndexFromPositionOnGlobalMesh(position); -// mesh_for_each2d<-3, 4>( -// [&](int i, int j) -// { -// Arrayi neighbor_index = Arrayi(global_index_[0] + i, global_index_[1] + j); -// Real phi_neighbor = mesh_data_.DataValueFromGlobalIndex(phi_, neighbor_index); -// if (phi_neighbor > -data_spacing_) -// { -// Vecd phi_gradient = mesh_data_.DataValueFromGlobalIndex(phi_gradient_, neighbor_index); -// Vecd integral_position = mesh_data_.GridPositionFromIndexOnGlobalMesh(neighbor_index); -// Vecd displacement = position - integral_position; -// Real distance = displacement.norm(); -// if (distance < cutoff_radius) -// integral += kernel_.dW(global_h_ratio_, distance, displacement) * -// CutCellVolumeFraction(phi_neighbor, phi_gradient, data_spacing_) * -// displacement / (distance + TinyReal); -// } -// }); -// } + Vecd integral = Vecd::Zero(); + if (fabs(phi) < threshold) + { + Arrayi global_index_ = mesh_data_.CellIndexFromPositionOnGlobalMesh(position); + mesh_for_each2d<-3, 4>( + [&](int i, int j) + { + Arrayi neighbor_index = Arrayi(global_index_[0] + i, global_index_[1] + j); + Real phi_neighbor = mesh_data_.DataValueFromGlobalIndex(phi_, neighbor_index); + if (phi_neighbor > -data_spacing_) + { + Vecd phi_gradient = mesh_data_.DataValueFromGlobalIndex(phi_gradient_, neighbor_index); + Vecd integral_position = mesh_data_.GridPositionFromIndexOnGlobalMesh(neighbor_index); + Vecd displacement = position - integral_position; + Real distance = displacement.norm(); + if (distance < cutoff_radius) + integral += kernel_.dW(global_h_ratio_, distance, displacement) * + CutCellVolumeFraction(phi_neighbor, phi_gradient, data_spacing_) * + displacement / (distance + TinyReal); + } + }); + } -// return integral * data_spacing_ * data_spacing_; -// } + return integral * data_spacing_ * data_spacing_; +} //=============================================================================================// } // namespace SPH //=============================================================================================// \ No newline at end of file diff --git a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp index e18390eac5..83d86f4341 100644 --- a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp +++ b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp @@ -50,67 +50,67 @@ Arrayi InitializeBasicDataForAPackage::CellIndexFromSortIndex(const size_t &sort return Array3i(sort_index / all_cells_[1], sort_index % all_cells_[1], sort_index % all_cells_[1]); //[notion] not implemented yet } //=============================================================================================// -// Real UpdateKernelIntegrals::computeKernelIntegral(const Vecd &position) -// { -// Real phi = probeSignedDistance(position); -// Real cutoff_radius = kernel_.CutOffRadius(global_h_ratio_); -// Real threshold = cutoff_radius + data_spacing_; // consider that interface's half width is the data spacing +Real UpdateKernelIntegrals::computeKernelIntegral(const Vecd &position) +{ + Real phi = probeSignedDistance(position); + Real cutoff_radius = kernel_.CutOffRadius(global_h_ratio_); + Real threshold = cutoff_radius + data_spacing_; // consider that interface's half width is the data spacing -// Real integral(0); -// if (fabs(phi) < threshold) -// { -// Arrayi global_index_ = mesh_data_.CellIndexFromPositionOnGlobalMesh(position); -// mesh_for_each3d<-3, 4>( -// [&](int i, int j, int k) -// { -// Arrayi neighbor_index = Arrayi(global_index_[0] + i, global_index_[1] + j, global_index_[2] + k); -// Real phi_neighbor = mesh_data_.DataValueFromGlobalIndex(phi_, neighbor_index); -// if (phi_neighbor > -data_spacing_) -// { -// Vecd phi_gradient = mesh_data_.DataValueFromGlobalIndex(phi_gradient_, neighbor_index); -// Vecd integral_position = mesh_data_.GridPositionFromIndexOnGlobalMesh(neighbor_index); -// Vecd displacement = position - integral_position; -// Real distance = displacement.norm(); -// if (distance < cutoff_radius) -// integral += kernel_.W(global_h_ratio_, distance, displacement) * -// CutCellVolumeFraction(phi_neighbor, phi_gradient, data_spacing_); -// } -// }); -// } -// return phi > threshold ? 1.0 : integral * data_spacing_ * data_spacing_; -// } + Real integral(0); + if (fabs(phi) < threshold) + { + Arrayi global_index_ = mesh_data_.CellIndexFromPositionOnGlobalMesh(position); + mesh_for_each3d<-3, 4>( + [&](int i, int j, int k) + { + Arrayi neighbor_index = Arrayi(global_index_[0] + i, global_index_[1] + j, global_index_[2] + k); + Real phi_neighbor = mesh_data_.DataValueFromGlobalIndex(phi_, neighbor_index); + if (phi_neighbor > -data_spacing_) + { + Vecd phi_gradient = mesh_data_.DataValueFromGlobalIndex(phi_gradient_, neighbor_index); + Vecd integral_position = mesh_data_.GridPositionFromIndexOnGlobalMesh(neighbor_index); + Vecd displacement = position - integral_position; + Real distance = displacement.norm(); + if (distance < cutoff_radius) + integral += kernel_.W(global_h_ratio_, distance, displacement) * + CutCellVolumeFraction(phi_neighbor, phi_gradient, data_spacing_); + } + }); + } + return phi > threshold ? 1.0 : integral * data_spacing_ * data_spacing_; +} //=============================================================================================// -// Vecd UpdateKernelIntegrals::computeKernelGradientIntegral(const Vecd &position) -// { -// Real phi = probeSignedDistance(position); -// Real cutoff_radius = kernel_.CutOffRadius(global_h_ratio_); -// Real threshold = cutoff_radius + data_spacing_; +Vecd UpdateKernelIntegrals::computeKernelGradientIntegral(const Vecd &position) +{ + Real phi = probeSignedDistance(position); + Real cutoff_radius = kernel_.CutOffRadius(global_h_ratio_); + Real threshold = cutoff_radius + data_spacing_; -// Vecd integral = Vecd::Zero(); -// if (fabs(phi) < threshold) -// { -// Arrayi global_index_ = mesh_data_.CellIndexFromPositionOnGlobalMesh(position); -// mesh_for_each3d<-3, 4>( -// [&](int i, int j, int k) -// { -// Arrayi neighbor_index = Arrayi(global_index_[0] + i, global_index_[1] + j, global_index_[2] + k); -// Real phi_neighbor = mesh_data_.DataValueFromGlobalIndex(phi_, neighbor_index); -// if (phi_neighbor > -data_spacing_) -// { -// Vecd phi_gradient = mesh_data_.DataValueFromGlobalIndex(phi_gradient_, neighbor_index); -// Vecd integral_position = mesh_data_.GridPositionFromIndexOnGlobalMesh(neighbor_index); -// Vecd displacement = position - integral_position; -// Real distance = displacement.norm(); -// if (distance < cutoff_radius) -// integral += kernel_.dW(global_h_ratio_, distance, displacement) * -// CutCellVolumeFraction(phi_neighbor, phi_gradient, data_spacing_) * -// displacement / (distance + TinyReal); -// } -// }); -// } + Vecd integral = Vecd::Zero(); + if (fabs(phi) < threshold) + { + Arrayi global_index_ = mesh_data_.CellIndexFromPositionOnGlobalMesh(position); + mesh_for_each3d<-3, 4>( + [&](int i, int j, int k) + { + Arrayi neighbor_index = Arrayi(global_index_[0] + i, global_index_[1] + j, global_index_[2] + k); + Real phi_neighbor = mesh_data_.DataValueFromGlobalIndex(phi_, neighbor_index); + if (phi_neighbor > -data_spacing_) + { + Vecd phi_gradient = mesh_data_.DataValueFromGlobalIndex(phi_gradient_, neighbor_index); + Vecd integral_position = mesh_data_.GridPositionFromIndexOnGlobalMesh(neighbor_index); + Vecd displacement = position - integral_position; + Real distance = displacement.norm(); + if (distance < cutoff_radius) + integral += kernel_.dW(global_h_ratio_, distance, displacement) * + CutCellVolumeFraction(phi_neighbor, phi_gradient, data_spacing_) * + displacement / (distance + TinyReal); + } + }); + } -// return integral * data_spacing_ * data_spacing_; -// } + return integral * data_spacing_ * data_spacing_; +} //=============================================================================================// // void DiffuseLevelSetSign::update(const size_t &package_index) // { diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index 5a77c38f47..8e345cf9f9 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -102,6 +102,7 @@ class LevelSet : public MeshWithGridDataPackages<4>, bool isWithinCorePackage(Vecd position); Real computeKernelIntegral(const Vecd &position); Vecd computeKernelGradientIntegral(const Vecd &position); + Kernel &kernel_; protected: MeshVariable &phi_; @@ -109,7 +110,6 @@ class LevelSet : public MeshWithGridDataPackages<4>, MeshVariable &phi_gradient_; MeshVariable &kernel_weight_; MeshVariable &kernel_gradient_; - Kernel &kernel_; MeshWithGridDataPackages<4> &mesh_data_ = *this; void initializeDataForSingularPackage(const size_t package_index, Real far_field_level_set); @@ -135,6 +135,7 @@ class LevelSet : public MeshWithGridDataPackages<4>, MeshInnerDynamics initialize_cell_neighborhood{mesh_data_}; MeshInnerDynamics initialize_basic_data_for_a_package{mesh_data_, shape_}; MeshInnerDynamics update_level_set_gradient{mesh_data_}; + MeshInnerDynamics update_kernel_integrals{mesh_data_, kernel_, global_h_ratio_}; // upwind algorithm choosing candidate difference by the sign Real upwindDifference(Real sign, Real df_p, Real df_n); diff --git a/src/shared/meshes/mesh_local_dynamics.cpp b/src/shared/meshes/mesh_local_dynamics.cpp index 171bd9adae..6bbff2cc7f 100644 --- a/src/shared/meshes/mesh_local_dynamics.cpp +++ b/src/shared/meshes/mesh_local_dynamics.cpp @@ -87,21 +87,6 @@ void InitializeIndexMesh::update(const size_t &package_index) mesh_data_.assignDataPackageIndex(cell_index, package_index); } //=================================================================================================// -// void InitializeCellNeighborhood::update(const size_t &package_index) -// { -// size_t sort_index = mesh_data_.occupied_data_pkgs_[package_index-2].first; -// Arrayi cell_index = Arrayi(sort_index / all_cells_[1], sort_index % all_cells_[1]); //[notion] there might be problems, 3d implementation needed -// CellNeighborhood ¤t = cell_neighborhood_[package_index]; -// std::pair &metadata = meta_data_cell_[package_index]; -// metadata.first = cell_index; -// metadata.second = mesh_data_.occupied_data_pkgs_[package_index-2].second; -// for (int l = -1; l < 2; l++) -// for (int m = -1; m < 2; m++) -// { -// current[l + 1][m + 1] = mesh_data_.PackageIndexFromCellIndex(cell_index + Arrayi(l, m)); -// } -// } -//=================================================================================================// void UpdateLevelSetGradient::update(const size_t &index) { mesh_data_.computeGradient(phi_, phi_gradient_, index); @@ -117,16 +102,16 @@ void UpdateLevelSetGradient::update(const size_t &index) // } //=================================================================================================// -// void UpdateKernelIntegrals::update(size_t package_index) -// { -// Arrayi cell_index = meta_data_cell_[package_index].first; -// assignByPosition( -// kernel_weight_, cell_index, [&](const Vecd &position) -> Real -// { return computeKernelIntegral(position); }); -// assignByPosition( -// kernel_gradient_, cell_index, [&](const Vecd &position) -> Vecd -// { return computeKernelGradientIntegral(position); }); -// } +void UpdateKernelIntegrals::update(const size_t &package_index) +{ + Arrayi cell_index = mesh_data_.meta_data_cell_[package_index].first; + mesh_data_.assignByPosition( + kernel_weight_, cell_index, [&](const Vecd &position) -> Real + { return computeKernelIntegral(position); }); + mesh_data_.assignByPosition( + kernel_gradient_, cell_index, [&](const Vecd &position) -> Vecd + { return computeKernelGradientIntegral(position); }); +} //=================================================================================================// // void ReinitializeLevelSet::update() // { diff --git a/src/shared/meshes/mesh_local_dynamics.h b/src/shared/meshes/mesh_local_dynamics.h index d14895c2e3..26bd4cf324 100644 --- a/src/shared/meshes/mesh_local_dynamics.h +++ b/src/shared/meshes/mesh_local_dynamics.h @@ -33,6 +33,7 @@ #include "base_variable.h" #include "mesh_with_data_packages.hpp" #include "base_geometry.h" +#include "base_kernel.h" namespace SPH { @@ -160,19 +161,47 @@ class UpdateLevelSetGradient : public BaseMeshLocalDynamics MeshVariable &phi_gradient_; }; -// class UpdateKernelIntegrals -// : public BaseMeshLocalDynamics -// { -// public: -// explicit UpdateKernelIntegrals(MeshWithGridDataPackages &mesh_data){}; -// virtual ~UpdateKernelIntegrals(){}; +class UpdateKernelIntegrals : public BaseMeshLocalDynamics +{ + public: + explicit UpdateKernelIntegrals(MeshWithGridDataPackagesType &mesh_data, Kernel &kernel, Real global_h_ratio) + : BaseMeshLocalDynamics(mesh_data), + phi_(*mesh_data.getMeshVariable("Levelset")), + phi_gradient_(*mesh_data.getMeshVariable("LevelsetGradient")), + kernel_weight_(*mesh_data.getMeshVariable("KernelWeight")), + kernel_gradient_(*mesh_data.getMeshVariable("KernelGradient")), + kernel_(kernel), + data_spacing_(mesh_data.DataSpacing()), + global_h_ratio_(global_h_ratio){}; + virtual ~UpdateKernelIntegrals(){}; -// void update(size_t package_index); + void update(const size_t &package_index); -// private: -// Real computeKernelIntegral(const Vecd &position); -// Vecd computeKernelGradientIntegral(const Vecd &position); -// }; + private: + MeshVariable &phi_; + MeshVariable &phi_gradient_; + MeshVariable &kernel_weight_; + MeshVariable &kernel_gradient_; + Kernel &kernel_; + Real data_spacing_; + Real global_h_ratio_; + + Real probeSignedDistance(const Vecd &position) { return mesh_data_.probeMesh(phi_, position); }; + Real computeKernelIntegral(const Vecd &position); + Vecd computeKernelGradientIntegral(const Vecd &position); + + Real CutCellVolumeFraction(Real phi, const Vecd &phi_gradient, Real data_spacing) + { + Real squared_norm_inv = 1.0 / (phi_gradient.squaredNorm() + TinyReal); + Real volume_fraction(0); + for (size_t i = 0; i != Dimensions; ++i) + { + volume_fraction += phi_gradient[i] * phi_gradient[i] * squared_norm_inv * + Heaviside(phi / (ABS(phi_gradient[i]) + TinyReal), 0.5 * data_spacing); + } + return volume_fraction; + } +}; // class ReinitializeLevelSet // : public BaseMeshLocalDynamics // { diff --git a/src/shared/meshes/mesh_with_data_packages.h b/src/shared/meshes/mesh_with_data_packages.h index 232c9cc709..ab3ff8a261 100644 --- a/src/shared/meshes/mesh_with_data_packages.h +++ b/src/shared/meshes/mesh_with_data_packages.h @@ -179,13 +179,7 @@ class MeshWithGridDataPackages : public Mesh return variable; }; - /** This function probe a mesh value */ - template - DataType probeMesh(MeshVariable &mesh_variable, const Vecd &position); - /** This function find the value of data from its index from global mesh. */ - template - DataType DataValueFromGlobalIndex(MeshVariable &mesh_variable, - const Arrayi &global_grid_index); + /** resize all mesh variable data field with `num_grid_pkgs_` size(initially only singular data) */ template @@ -210,11 +204,7 @@ class MeshWithGridDataPackages : public Mesh bool isCoreDataPackage(const Arrayi &cell_index); std::pair NeighbourIndexShift(const Arrayi shift_index, const CellNeighborhood &neighbour); - /** assign value to data package according to the position of data */ - template - void assignByPosition(MeshVariable &mesh_variable, - const Arrayi &cell_index, - const FunctionByPosition &function_by_position); + /** obtain averaged value at a corner of a data cell */ template DataType CornerAverage(MeshVariable &mesh_variable, @@ -243,6 +233,18 @@ class MeshWithGridDataPackages : public Mesh void assignCore(const Arrayi &cell_index) { assignCategoryOnMetaDataMesh(cell_index, 2); }; public: + /** This function find the value of data from its index from global mesh. */ + template + DataType DataValueFromGlobalIndex(MeshVariable &mesh_variable, + const Arrayi &global_grid_index); + /** assign value to data package according to the position of data */ + template + void assignByPosition(MeshVariable &mesh_variable, + const Arrayi &cell_index, + const FunctionByPosition &function_by_position); + /** This function probe a mesh value */ + template + DataType probeMesh(MeshVariable &mesh_variable, const Vecd &position); /** return the position of data from its local grid index and the index of the cell it belongs to. */ Vecd DataPositionFromIndex(const Arrayi &cell_index, const Arrayi &data_index) { @@ -292,6 +294,16 @@ class MeshWithGridDataPackages : public Mesh { occupied_data_pkgs_.push_back(occupied); } + + Arrayi CellIndexFromPositionOnGlobalMesh(const Vecd &position) + { + return global_mesh_.CellIndexFromPosition(position); + } + + Vecd GridPositionFromIndexOnGlobalMesh(const Arrayi &cell_index) + { + return global_mesh_.GridPositionFromIndex(cell_index); + } }; } // namespace SPH #endif // MESH_WITH_DATA_PACKAGES_H From 536e46a79941ec64297c7ea91b1f8d6446176a54 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Sun, 11 Aug 2024 21:04:00 +0200 Subject: [PATCH 17/55] (2d wrapped) diffuse --- src/for_2D_build/geometries/level_set_2d.cpp | 72 ++++++++----------- .../meshes/mesh_local_dynamics_2d.cpp | 31 ++++++++ .../meshes/mesh_local_dynamics_3d.cpp | 8 +-- src/shared/geometries/level_set.h | 1 + src/shared/meshes/mesh_local_dynamics.h | 22 +++--- src/shared/meshes/mesh_with_data_packages.h | 2 +- 6 files changed, 81 insertions(+), 55 deletions(-) diff --git a/src/for_2D_build/geometries/level_set_2d.cpp b/src/for_2D_build/geometries/level_set_2d.cpp index be7d96c119..f06a4e9739 100644 --- a/src/for_2D_build/geometries/level_set_2d.cpp +++ b/src/for_2D_build/geometries/level_set_2d.cpp @@ -39,11 +39,6 @@ void LevelSet::initializeDataForSingularPackage(const size_t package_index, Real //=================================================================================================// void LevelSet::finishDataPackages() { - // mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), - // [&](size_t i, size_t j) - // { - // tagACellIsInnerPackage(Arrayi(i, j)); - // }); tag_a_cell_is_inner_package.exec(); parallel_sort(occupied_data_pkgs_.begin(), occupied_data_pkgs_.end(), @@ -56,8 +51,6 @@ void LevelSet::finishDataPackages() meta_data_cell_ = new std::pair[num_grid_pkgs_]; initialize_index_mesh.exec(); initialize_cell_neighborhood.exec(); - // initializeIndexMesh(); - // initializeCellNeighborhood(); resizeMeshVariableData(); @@ -65,14 +58,8 @@ void LevelSet::finishDataPackages() initializeDataForSingularPackage(0, -far_field_distance); initializeDataForSingularPackage(1, far_field_distance); - // package_parallel_for( - // [&](size_t package_index) - // { - // initializeBasicDataForAPackage(meta_data_cell_[package_index].first, package_index, shape_); - // }); initialize_basic_data_for_a_package.exec(); update_level_set_gradient.exec(); - // updateKernelIntegrals(); update_kernel_integrals.exec(); } //=================================================================================================// @@ -125,36 +112,37 @@ bool LevelSet::isInnerPackage(const Arrayi &cell_index) //=================================================================================================// void LevelSet::diffuseLevelSetSign() { - package_parallel_for( - [&](size_t package_index) - { - auto phi_data = phi_.DataField(); - auto near_interface_id_data = near_interface_id_.DataField(); - auto &neighborhood = cell_neighborhood_[package_index]; + diffuse_level_set_sign.exec(); + // package_parallel_for( + // [&](size_t package_index) + // { + // auto phi_data = phi_.DataField(); + // auto near_interface_id_data = near_interface_id_.DataField(); + // auto &neighborhood = cell_neighborhood_[package_index]; - for_each_cell_data( - [&](int i, int j) - { - // near interface cells are not considered - if (abs(near_interface_id_data[package_index][i][j]) > 1) - { - mesh_find_if2d<-1, 2>( - [&](int l, int m) -> bool - { - NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i + l, j + m), neighborhood); - int near_interface_id = near_interface_id_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]]; - bool is_found = abs(near_interface_id) == 1; - if (is_found) - { - Real phi_0 = phi_data[package_index][i][j]; - near_interface_id_data[package_index][i][j] = near_interface_id; - phi_data[package_index][i][j] = near_interface_id == 1 ? fabs(phi_0) : -fabs(phi_0); - } - return is_found; - }); - } - }); - }); + // for_each_cell_data( + // [&](int i, int j) + // { + // // near interface cells are not considered + // if (abs(near_interface_id_data[package_index][i][j]) > 1) + // { + // mesh_find_if2d<-1, 2>( + // [&](int l, int m) -> bool + // { + // NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i + l, j + m), neighborhood); + // int near_interface_id = near_interface_id_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]]; + // bool is_found = abs(near_interface_id) == 1; + // if (is_found) + // { + // Real phi_0 = phi_data[package_index][i][j]; + // near_interface_id_data[package_index][i][j] = near_interface_id; + // phi_data[package_index][i][j] = near_interface_id == 1 ? fabs(phi_0) : -fabs(phi_0); + // } + // return is_found; + // }); + // } + // }); + // }); } //=============================================================================================// void LevelSet::reinitializeLevelSet() diff --git a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp index 7afd0e0d5a..f59b26cfdb 100644 --- a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp +++ b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp @@ -126,5 +126,36 @@ Vecd UpdateKernelIntegrals::computeKernelGradientIntegral(const Vecd &position) return integral * data_spacing_ * data_spacing_; } //=============================================================================================// +void DiffuseLevelSetSign::update(const size_t &package_index) +{ + auto phi_data = phi_.DataField(); + auto near_interface_id_data = near_interface_id_.DataField(); + auto &neighborhood = mesh_data_.cell_neighborhood_[package_index]; + + mesh_data_.for_each_cell_data( + [&](int i, int j) + { + // near interface cells are not considered + if (abs(near_interface_id_data[package_index][i][j]) > 1) + { + mesh_find_if2d<-1, 2>( + [&](int l, int m) -> bool + { + using NeighbourIndex = std::pair; /**< stores shifted neighbour info: (size_t)package index, (arrayi)local grid index. */ + NeighbourIndex neighbour_index = mesh_data_.NeighbourIndexShift(Arrayi(i + l, j + m), neighborhood); + int near_interface_id = near_interface_id_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]]; + bool is_found = abs(near_interface_id) == 1; + if (is_found) + { + Real phi_0 = phi_data[package_index][i][j]; + near_interface_id_data[package_index][i][j] = near_interface_id; + phi_data[package_index][i][j] = near_interface_id == 1 ? fabs(phi_0) : -fabs(phi_0); + } + return is_found; + }); + } + }); +} +//=============================================================================================// } // namespace SPH //=============================================================================================// \ No newline at end of file diff --git a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp index 83d86f4341..3b9662277d 100644 --- a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp +++ b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp @@ -112,10 +112,10 @@ Vecd UpdateKernelIntegrals::computeKernelGradientIntegral(const Vecd &position) return integral * data_spacing_ * data_spacing_; } //=============================================================================================// -// void DiffuseLevelSetSign::update(const size_t &package_index) -// { -// printf("this is the execution of DiffuseLevelSetSign\n"); -// } +void DiffuseLevelSetSign::update(const size_t &package_index) +{ + printf("this is the execution of DiffuseLevelSetSign\n"); +} //=============================================================================================// } // namespace SPH //=============================================================================================// \ No newline at end of file diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index 8e345cf9f9..663d368b62 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -136,6 +136,7 @@ class LevelSet : public MeshWithGridDataPackages<4>, MeshInnerDynamics initialize_basic_data_for_a_package{mesh_data_, shape_}; MeshInnerDynamics update_level_set_gradient{mesh_data_}; MeshInnerDynamics update_kernel_integrals{mesh_data_, kernel_, global_h_ratio_}; + MeshInnerDynamics diffuse_level_set_sign{mesh_data_}; // upwind algorithm choosing candidate difference by the sign Real upwindDifference(Real sign, Real df_p, Real df_n); diff --git a/src/shared/meshes/mesh_local_dynamics.h b/src/shared/meshes/mesh_local_dynamics.h index 26bd4cf324..3ccd4f048a 100644 --- a/src/shared/meshes/mesh_local_dynamics.h +++ b/src/shared/meshes/mesh_local_dynamics.h @@ -229,15 +229,21 @@ class UpdateKernelIntegrals : public BaseMeshLocalDynamics // void update(size_t package_index); // }; -// class DiffuseLevelSetSign -// : public BaseMeshLocalDynamics -// { -// public: -// explicit DiffuseLevelSetSign(MeshWithGridDataPackages &mesh_data){}; -// virtual ~DiffuseLevelSetSign(){}; +class DiffuseLevelSetSign : public BaseMeshLocalDynamics +{ + public: + explicit DiffuseLevelSetSign(MeshWithGridDataPackagesType &mesh_data) + : BaseMeshLocalDynamics(mesh_data), + phi_(*mesh_data.getMeshVariable("Levelset")), + near_interface_id_(*mesh_data.getMeshVariable("NearInterfaceID")){}; + virtual ~DiffuseLevelSetSign(){}; -// void update(size_t package_index); -// }; + void update(const size_t &package_index); + + private: + MeshVariable &phi_; + MeshVariable &near_interface_id_; +}; // } // namespace mesh_dynamics } // namespace SPH diff --git a/src/shared/meshes/mesh_with_data_packages.h b/src/shared/meshes/mesh_with_data_packages.h index ab3ff8a261..b5d602c020 100644 --- a/src/shared/meshes/mesh_with_data_packages.h +++ b/src/shared/meshes/mesh_with_data_packages.h @@ -203,7 +203,6 @@ class MeshWithGridDataPackages : public Mesh bool isSingularDataPackage(const Arrayi &cell_index); bool isCoreDataPackage(const Arrayi &cell_index); - std::pair NeighbourIndexShift(const Arrayi shift_index, const CellNeighborhood &neighbour); /** obtain averaged value at a corner of a data cell */ template @@ -233,6 +232,7 @@ class MeshWithGridDataPackages : public Mesh void assignCore(const Arrayi &cell_index) { assignCategoryOnMetaDataMesh(cell_index, 2); }; public: + std::pair NeighbourIndexShift(const Arrayi shift_index, const CellNeighborhood &neighbour); /** This function find the value of data from its index from global mesh. */ template DataType DataValueFromGlobalIndex(MeshVariable &mesh_variable, From 709b1897462de07c8793b624b3da996ac48c9597 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Sun, 11 Aug 2024 21:19:54 +0200 Subject: [PATCH 18/55] (2d wrapped) reinitialize --- src/for_2D_build/geometries/level_set_2d.cpp | 55 ++++++++++--------- .../meshes/mesh_local_dynamics_2d.cpp | 29 ++++++++++ .../meshes/mesh_local_dynamics_3d.cpp | 5 ++ src/shared/geometries/level_set.h | 1 + src/shared/meshes/mesh_local_dynamics.h | 47 +++++++++++++--- 5 files changed, 102 insertions(+), 35 deletions(-) diff --git a/src/for_2D_build/geometries/level_set_2d.cpp b/src/for_2D_build/geometries/level_set_2d.cpp index f06a4e9739..614bb9adf1 100644 --- a/src/for_2D_build/geometries/level_set_2d.cpp +++ b/src/for_2D_build/geometries/level_set_2d.cpp @@ -147,34 +147,35 @@ void LevelSet::diffuseLevelSetSign() //=============================================================================================// void LevelSet::reinitializeLevelSet() { - package_parallel_for( - [&](size_t package_index) - { - auto phi_data = phi_.DataField(); - auto &phi_addrs = phi_data[package_index]; - auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; - auto &neighborhood = cell_neighborhood_[package_index]; + reinitialize_level_set.exec(); + // package_parallel_for( + // [&](size_t package_index) + // { + // auto phi_data = phi_.DataField(); + // auto &phi_addrs = phi_data[package_index]; + // auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; + // auto &neighborhood = cell_neighborhood_[package_index]; - for_each_cell_data( - [&](int i, int j) - { - // only reinitialize non cut cells - if (near_interface_id_addrs[i][j] != 0) - { - Real phi_0 = phi_addrs[i][j]; - Real sign = phi_0 / sqrt(phi_0 * phi_0 + data_spacing_ * data_spacing_); - NeighbourIndex x1 = NeighbourIndexShift(Arrayi(i + 1, j), neighborhood); - NeighbourIndex x2 = NeighbourIndexShift(Arrayi(i - 1, j), neighborhood); - NeighbourIndex y1 = NeighbourIndexShift(Arrayi(i, j + 1), neighborhood); - NeighbourIndex y2 = NeighbourIndexShift(Arrayi(i, j - 1), neighborhood); - Real dv_x = upwindDifference(sign, phi_data[x1.first][x1.second[0]][x1.second[1]] - phi_0, - phi_0 - phi_data[x2.first][x2.second[0]][x2.second[1]]); - Real dv_y = upwindDifference(sign, phi_data[y1.first][y1.second[0]][y1.second[1]] - phi_0, - phi_0 - phi_data[y2.first][y2.second[0]][y2.second[1]]); - phi_addrs[i][j] -= 0.5 * sign * (Vec2d(dv_x, dv_y).norm() - data_spacing_); - } - }); - }); + // for_each_cell_data( + // [&](int i, int j) + // { + // // only reinitialize non cut cells + // if (near_interface_id_addrs[i][j] != 0) + // { + // Real phi_0 = phi_addrs[i][j]; + // Real sign = phi_0 / sqrt(phi_0 * phi_0 + data_spacing_ * data_spacing_); + // NeighbourIndex x1 = NeighbourIndexShift(Arrayi(i + 1, j), neighborhood); + // NeighbourIndex x2 = NeighbourIndexShift(Arrayi(i - 1, j), neighborhood); + // NeighbourIndex y1 = NeighbourIndexShift(Arrayi(i, j + 1), neighborhood); + // NeighbourIndex y2 = NeighbourIndexShift(Arrayi(i, j - 1), neighborhood); + // Real dv_x = upwindDifference(sign, phi_data[x1.first][x1.second[0]][x1.second[1]] - phi_0, + // phi_0 - phi_data[x2.first][x2.second[0]][x2.second[1]]); + // Real dv_y = upwindDifference(sign, phi_data[y1.first][y1.second[0]][y1.second[1]] - phi_0, + // phi_0 - phi_data[y2.first][y2.second[0]][y2.second[1]]); + // phi_addrs[i][j] -= 0.5 * sign * (Vec2d(dv_x, dv_y).norm() - data_spacing_); + // } + // }); + // }); } //=================================================================================================// void LevelSet::markNearInterface(Real small_shift_factor) diff --git a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp index f59b26cfdb..dd2ee11f8f 100644 --- a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp +++ b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp @@ -126,6 +126,35 @@ Vecd UpdateKernelIntegrals::computeKernelGradientIntegral(const Vecd &position) return integral * data_spacing_ * data_spacing_; } //=============================================================================================// +void ReinitializeLevelSet::update(const size_t &package_index) +{ + auto phi_data = phi_.DataField(); + auto &phi_addrs = phi_data[package_index]; + auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; + auto &neighborhood = mesh_data_.cell_neighborhood_[package_index]; + + mesh_data_.for_each_cell_data( + [&](int i, int j) + { + // only reinitialize non cut cells + if (near_interface_id_addrs[i][j] != 0) + { + Real phi_0 = phi_addrs[i][j]; + Real sign = phi_0 / sqrt(phi_0 * phi_0 + data_spacing_ * data_spacing_); + using NeighbourIndex = std::pair; /**< stores shifted neighbour info: (size_t)package index, (arrayi)local grid index. */ + NeighbourIndex x1 = mesh_data_.NeighbourIndexShift(Arrayi(i + 1, j), neighborhood); + NeighbourIndex x2 = mesh_data_.NeighbourIndexShift(Arrayi(i - 1, j), neighborhood); + NeighbourIndex y1 = mesh_data_.NeighbourIndexShift(Arrayi(i, j + 1), neighborhood); + NeighbourIndex y2 = mesh_data_.NeighbourIndexShift(Arrayi(i, j - 1), neighborhood); + Real dv_x = upwindDifference(sign, phi_data[x1.first][x1.second[0]][x1.second[1]] - phi_0, + phi_0 - phi_data[x2.first][x2.second[0]][x2.second[1]]); + Real dv_y = upwindDifference(sign, phi_data[y1.first][y1.second[0]][y1.second[1]] - phi_0, + phi_0 - phi_data[y2.first][y2.second[0]][y2.second[1]]); + phi_addrs[i][j] -= 0.5 * sign * (Vec2d(dv_x, dv_y).norm() - data_spacing_); + } + }); +} +//=============================================================================================// void DiffuseLevelSetSign::update(const size_t &package_index) { auto phi_data = phi_.DataField(); diff --git a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp index 3b9662277d..45cee9a519 100644 --- a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp +++ b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp @@ -112,6 +112,11 @@ Vecd UpdateKernelIntegrals::computeKernelGradientIntegral(const Vecd &position) return integral * data_spacing_ * data_spacing_; } //=============================================================================================// +void ReinitializeLevelSet::update(const size_t &package_index) +{ + printf("this is the execution of DiffuseLevelSetSign\n"); +} +//=============================================================================================// void DiffuseLevelSetSign::update(const size_t &package_index) { printf("this is the execution of DiffuseLevelSetSign\n"); diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index 663d368b62..1d858d183d 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -137,6 +137,7 @@ class LevelSet : public MeshWithGridDataPackages<4>, MeshInnerDynamics update_level_set_gradient{mesh_data_}; MeshInnerDynamics update_kernel_integrals{mesh_data_, kernel_, global_h_ratio_}; MeshInnerDynamics diffuse_level_set_sign{mesh_data_}; + MeshInnerDynamics reinitialize_level_set{mesh_data_}; // upwind algorithm choosing candidate difference by the sign Real upwindDifference(Real sign, Real df_p, Real df_n); diff --git a/src/shared/meshes/mesh_local_dynamics.h b/src/shared/meshes/mesh_local_dynamics.h index 3ccd4f048a..855e50a671 100644 --- a/src/shared/meshes/mesh_local_dynamics.h +++ b/src/shared/meshes/mesh_local_dynamics.h @@ -202,15 +202,46 @@ class UpdateKernelIntegrals : public BaseMeshLocalDynamics return volume_fraction; } }; -// class ReinitializeLevelSet -// : public BaseMeshLocalDynamics -// { -// public: -// explicit ReinitializeLevelSet(MeshWithGridDataPackages &mesh_data){}; -// virtual ~ReinitializeLevelSet(){}; -// void update(size_t package_index); -// }; +class ReinitializeLevelSet : public BaseMeshLocalDynamics +{ + public: + explicit ReinitializeLevelSet(MeshWithGridDataPackagesType &mesh_data) + : BaseMeshLocalDynamics(mesh_data), + data_spacing_(mesh_data.DataSpacing()), + phi_(*mesh_data.getMeshVariable("Levelset")), + near_interface_id_(*mesh_data.getMeshVariable("NearInterfaceID")){}; + virtual ~ReinitializeLevelSet(){}; + + void update(const size_t &package_index); + + private: + MeshVariable &phi_; + MeshVariable &near_interface_id_; + + Real data_spacing_; + + Real upwindDifference(Real sign, Real df_p, Real df_n) + { + if (sign * df_p >= 0.0 && sign * df_n >= 0.0) + return df_n; + if (sign * df_p <= 0.0 && sign * df_n <= 0.0) + return df_p; + if (sign * df_p > 0.0 && sign * df_n < 0.0) + return 0.0; + + Real df = df_p; + if (sign * df_p < 0.0 && sign * df_n > 0.0) + { + Real ss = sign * (fabs(df_p) - fabs(df_n)) / (df_p - df_n); + if (ss > 0.0) + df = df_n; + } + + return df; + } +}; + // class MarkNearInterface // : public BaseMeshLocalDynamics // { From 30080501c2ebc6c3d35403f70ab34ef3e59bcac6 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Mon, 12 Aug 2024 00:36:16 +0200 Subject: [PATCH 19/55] (uncomplete) diffuse - input real --- .../meshes/mesh_local_dynamics_2d.cpp | 50 +++++++++++++++++++ .../meshes/mesh_local_dynamics_3d.cpp | 5 ++ src/shared/geometries/level_set.h | 1 + src/shared/meshes/mesh_local_dynamics.h | 27 +++++++--- src/shared/meshes/mesh_with_data_packages.h | 10 ++-- 5 files changed, 80 insertions(+), 13 deletions(-) diff --git a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp index dd2ee11f8f..c8f76e6969 100644 --- a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp +++ b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp @@ -155,6 +155,56 @@ void ReinitializeLevelSet::update(const size_t &package_index) }); } //=============================================================================================// +void MarkNearInterface::update(const size_t &package_index) +{ + auto &phi_addrs = phi_.DataField()[package_index]; + auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; + auto neighborhood = mesh_data_.cell_neighborhood_[package_index]; + + // corner averages, note that the first row and first column are not used + // template + // using PackageTemporaryData = PackageDataMatrix; //[notion] the pkg_size should be replaced + PackageDataMatrix corner_averages; + mesh_for_each2d<0, 5>( //[notion] same pkg_size problem above + [&](int i, int j) + { + corner_averages[i][j] = mesh_data_.CornerAverage(phi_, Arrayi(i, j), Arrayi(-1, -1), neighborhood); + }); + + mesh_data_.for_each_cell_data( + [&](int i, int j) + { + // first assume far cells + Real phi_0 = phi_addrs[i][j]; + int near_interface_id = phi_0 > 0.0 ? 2 : -2; + if (fabs(phi_0) < small_shift) + { + near_interface_id = 0; + Real phi_average_0 = corner_averages[i][j]; + // find outer cut cells by comparing the sign of corner averages + mesh_for_each2d<0, 2>( + [&](int l, int m) + { + Real phi_average = corner_averages[i + l][j + m]; + if ((phi_average_0 - small_shift) * (phi_average - small_shift) < 0.0) + near_interface_id = 1; + if ((phi_average_0 + small_shift) * (phi_average + small_shift) < 0.0) + near_interface_id = -1; + }); + // find zero cut cells by comparing the sign of corner averages + mesh_for_each2d<0, 2>( + [&](int l, int m) + { + Real phi_average = corner_averages[i + l][j + m]; + if (phi_average_0 * phi_average < 0.0) + near_interface_id = 0; + }); + } + // assign this to package + near_interface_id_addrs[i][j] = near_interface_id; + }); +} +//=============================================================================================// void DiffuseLevelSetSign::update(const size_t &package_index) { auto phi_data = phi_.DataField(); diff --git a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp index 45cee9a519..60720838aa 100644 --- a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp +++ b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp @@ -117,6 +117,11 @@ void ReinitializeLevelSet::update(const size_t &package_index) printf("this is the execution of DiffuseLevelSetSign\n"); } //=============================================================================================// +void MarkNearInterface::update(const size_t &package_index) +{ + printf("this is the execution of DiffuseLevelSetSign\n"); +} +//=============================================================================================// void DiffuseLevelSetSign::update(const size_t &package_index) { printf("this is the execution of DiffuseLevelSetSign\n"); diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index 1d858d183d..c2e8759ebb 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -138,6 +138,7 @@ class LevelSet : public MeshWithGridDataPackages<4>, MeshInnerDynamics update_kernel_integrals{mesh_data_, kernel_, global_h_ratio_}; MeshInnerDynamics diffuse_level_set_sign{mesh_data_}; MeshInnerDynamics reinitialize_level_set{mesh_data_}; + // MeshInnerDynamics mark_near_interface{mesh_data_}; // upwind algorithm choosing candidate difference by the sign Real upwindDifference(Real sign, Real df_p, Real df_n); diff --git a/src/shared/meshes/mesh_local_dynamics.h b/src/shared/meshes/mesh_local_dynamics.h index 855e50a671..40ff806cc6 100644 --- a/src/shared/meshes/mesh_local_dynamics.h +++ b/src/shared/meshes/mesh_local_dynamics.h @@ -34,6 +34,7 @@ #include "mesh_with_data_packages.hpp" #include "base_geometry.h" #include "base_kernel.h" +#include "data_type.h" namespace SPH { @@ -242,15 +243,25 @@ class ReinitializeLevelSet : public BaseMeshLocalDynamics } }; -// class MarkNearInterface -// : public BaseMeshLocalDynamics -// { -// public: -// explicit MarkNearInterface(MeshWithGridDataPackages &mesh_data){}; -// virtual ~MarkNearInterface(){}; +class MarkNearInterface : public BaseMeshLocalDynamics +{ + public: + explicit MarkNearInterface(MeshWithGridDataPackagesType &mesh_data, Real small_shift_factor) + : BaseMeshLocalDynamics(mesh_data), + small_shift(small_shift_factor * mesh_data.DataSpacing()), + phi_(*mesh_data.getMeshVariable("Levelset")), + near_interface_id_(*mesh_data.getMeshVariable("NearInterfaceID")){}; + virtual ~MarkNearInterface(){}; + + void update(const size_t &package_index); + + private: + MeshVariable &phi_; + MeshVariable &near_interface_id_; + + Real small_shift; +}; -// void update(size_t package_index); -// }; // class RedistanceInterface // : public BaseMeshLocalDynamics // { diff --git a/src/shared/meshes/mesh_with_data_packages.h b/src/shared/meshes/mesh_with_data_packages.h index b5d602c020..ee0baead28 100644 --- a/src/shared/meshes/mesh_with_data_packages.h +++ b/src/shared/meshes/mesh_with_data_packages.h @@ -204,11 +204,6 @@ class MeshWithGridDataPackages : public Mesh bool isCoreDataPackage(const Arrayi &cell_index); - /** obtain averaged value at a corner of a data cell */ - template - DataType CornerAverage(MeshVariable &mesh_variable, - Arrayi addrs_index, Arrayi corner_direction, - CellNeighborhood &neighborhood); /** probe by applying bi and tri-linear interpolation within the package. */ template DataType probeDataPackage(MeshVariable &mesh_variable, size_t package_index, const Arrayi &cell_index, const Vecd &position); @@ -232,6 +227,11 @@ class MeshWithGridDataPackages : public Mesh void assignCore(const Arrayi &cell_index) { assignCategoryOnMetaDataMesh(cell_index, 2); }; public: + /** obtain averaged value at a corner of a data cell */ + template + DataType CornerAverage(MeshVariable &mesh_variable, + Arrayi addrs_index, Arrayi corner_direction, + CellNeighborhood &neighborhood); std::pair NeighbourIndexShift(const Arrayi shift_index, const CellNeighborhood &neighbour); /** This function find the value of data from its index from global mesh. */ template From f9eb719778b6f21c9d3ee1e9c41535b589376de4 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Mon, 12 Aug 2024 01:01:41 +0200 Subject: [PATCH 20/55] (2d wrapped) redistance --- .../meshes/mesh_local_dynamics_2d.cpp | 77 +++++++++++++++++++ .../meshes/mesh_local_dynamics_3d.cpp | 5 ++ src/shared/geometries/level_set.cpp | 17 ++-- src/shared/geometries/level_set.h | 1 + src/shared/meshes/mesh_dynamics.h | 43 ++++++----- src/shared/meshes/mesh_local_dynamics.h | 31 +++++--- 6 files changed, 136 insertions(+), 38 deletions(-) diff --git a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp index c8f76e6969..7f5194f50c 100644 --- a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp +++ b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp @@ -205,6 +205,83 @@ void MarkNearInterface::update(const size_t &package_index) }); } //=============================================================================================// +void RedistanceInterface::update(const size_t &package_index) +{ + auto phi_data = phi_.DataField(); + auto near_interface_id_data = near_interface_id_.DataField(); + auto &neighborhood = mesh_data_.cell_neighborhood_[package_index]; + using NeighbourIndex = std::pair; /**< stores shifted neighbour info: (size_t)package index, (arrayi)local grid index. */ + + mesh_data_.for_each_cell_data( + [&](int i, int j) + { + int near_interface_id = near_interface_id_data[package_index][i][j]; + if (near_interface_id == 0) + { + bool positive_band = false; + bool negative_band = false; + mesh_for_each2d<-1, 2>( + [&](int r, int s) + { + NeighbourIndex neighbour_index = mesh_data_.NeighbourIndexShift(Arrayi(i + r, j + s), neighborhood); + int neighbor_near_interface_id = near_interface_id_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]]; + if (neighbor_near_interface_id >= 1) + positive_band = true; + if (neighbor_near_interface_id <= -1) + negative_band = true; + }); + if (positive_band == false) + { + Real min_distance_p = 5.0 * data_spacing_; + mesh_for_each2d<-4, 5>( + [&](int x, int y) + { + NeighbourIndex neighbour_index = mesh_data_.NeighbourIndexShift(Arrayi(i + x, j + y), neighborhood); + auto &neighbor_phi = phi_.DataField()[neighbour_index.first]; + auto &neighbor_phi_gradient = phi_gradient_.DataField()[neighbour_index.first]; + auto &neighbor_near_interface_id = near_interface_id_.DataField()[neighbour_index.first]; + if (neighbor_near_interface_id[neighbour_index.second[0]][neighbour_index.second[1]] >= 1) + { + Real phi_p_ = neighbor_phi[neighbour_index.second[0]][neighbour_index.second[1]]; + Vecd norm_to_face = neighbor_phi_gradient[neighbour_index.second[0]][neighbour_index.second[1]]; + norm_to_face /= norm_to_face.norm() + TinyReal; + min_distance_p = SMIN(min_distance_p, (Vecd((Real)x, (Real)y) * data_spacing_ + phi_p_ * norm_to_face).norm()); + } + }); + phi_data[package_index][i][j] = -min_distance_p; + // this immediate switch of near interface id + // does not intervening with the identification of unresolved interface + // based on the assumption that positive false_and negative bands are not close to each other + near_interface_id_data[package_index][i][j] = -1; + } + if (negative_band == false) + { + Real min_distance_n = 5.0 * data_spacing_; + mesh_for_each2d<-4, 5>( + [&](int x, int y) + { + NeighbourIndex neighbour_index = mesh_data_.NeighbourIndexShift(Arrayi(i + x, j + y), neighborhood); + auto &neighbor_phi = phi_.DataField()[neighbour_index.first]; + auto &neighbor_phi_gradient = phi_gradient_.DataField()[neighbour_index.first]; + auto &neighbor_near_interface_id = near_interface_id_.DataField()[neighbour_index.first]; + if (neighbor_near_interface_id[neighbour_index.second[0]][neighbour_index.second[1]] <= -1) + { + Real phi_n_ = neighbor_phi[neighbour_index.second[0]][neighbour_index.second[1]]; + Vecd norm_to_face = neighbor_phi_gradient[neighbour_index.second[0]][neighbour_index.second[1]]; + norm_to_face /= norm_to_face.norm() + TinyReal; + min_distance_n = SMIN(min_distance_n, (Vecd((Real)x, (Real)y) * data_spacing_ - phi_n_ * norm_to_face).norm()); + } + }); + phi_data[package_index][i][j] = min_distance_n; + // this immediate switch of near interface id + // does not intervening with the identification of unresolved interface + // based on the assumption that positive false_and negative bands are not close to each other + near_interface_id_data[package_index][i][j] = 1; + } + } + }); +} +//=============================================================================================// void DiffuseLevelSetSign::update(const size_t &package_index) { auto phi_data = phi_.DataField(); diff --git a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp index 60720838aa..85b2e5eb77 100644 --- a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp +++ b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp @@ -122,6 +122,11 @@ void MarkNearInterface::update(const size_t &package_index) printf("this is the execution of DiffuseLevelSetSign\n"); } //=============================================================================================// +void RedistanceInterface::update(const size_t &package_index) +{ + printf("this is the execution of DiffuseLevelSetSign\n"); +} +//=============================================================================================// void DiffuseLevelSetSign::update(const size_t &package_index) { printf("this is the execution of DiffuseLevelSetSign\n"); diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index d051eb58bf..8ffba11bb9 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -98,14 +98,15 @@ Vecd LevelSet::probeKernelGradientIntegral(const Vecd &position, Real h_ratio) //=================================================================================================// void LevelSet::redistanceInterface() { - package_parallel_for( - [&](size_t package_index) { - std::pair &metadata = meta_data_cell_[package_index]; - if (metadata.second == 1) - { - redistanceInterfaceForAPackage(PackageIndexFromCellIndex(metadata.first)); - } - }); + redistance_interface.exec(); + // package_parallel_for( + // [&](size_t package_index) { + // std::pair &metadata = meta_data_cell_[package_index]; + // if (metadata.second == 1) + // { + // redistanceInterfaceForAPackage(PackageIndexFromCellIndex(metadata.first)); + // } + // }); } //=================================================================================================// void LevelSet::cleanInterface(Real small_shift_factor) diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index c2e8759ebb..315f596844 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -138,6 +138,7 @@ class LevelSet : public MeshWithGridDataPackages<4>, MeshInnerDynamics update_kernel_integrals{mesh_data_, kernel_, global_h_ratio_}; MeshInnerDynamics diffuse_level_set_sign{mesh_data_}; MeshInnerDynamics reinitialize_level_set{mesh_data_}; + MeshCoreDynamics redistance_interface{mesh_data_}; // MeshInnerDynamics mark_near_interface{mesh_data_}; // upwind algorithm choosing candidate difference by the sign diff --git a/src/shared/meshes/mesh_dynamics.h b/src/shared/meshes/mesh_dynamics.h index 718a2a4835..ad3270bfb1 100644 --- a/src/shared/meshes/mesh_dynamics.h +++ b/src/shared/meshes/mesh_dynamics.h @@ -115,26 +115,29 @@ class MeshInnerDynamics : public LocalDynamicsType, public BaseMeshDynamics -// class MeshCoreDynamics : public LocalDynamicsType, public BaseMeshDynamics -// { -// public: -// template -// MeshCoreDynamics(DynamicsIdentifier &identifier, Args &&...args) -// : LocalDynamicsType(identifier, std::forward(args)...), -// BaseMeshDynamics(identifier){}; -// virtual ~MeshCoreDynamics(){}; +template +class MeshCoreDynamics : public LocalDynamicsType, public BaseMeshDynamics +{ + public: + template + MeshCoreDynamics(DynamicsIdentifier &identifier, Args &&...args) + : LocalDynamicsType(identifier, std::forward(args)...), + BaseMeshDynamics(identifier){}; + virtual ~MeshCoreDynamics(){}; -// virtual void exec() override -// { -// package_parallel_for( -// [&](size_t package_index) -// { -// if(isCoreDataPackage(package_index)) -// update(package_index); -// } -// ); -// }; -// }; + virtual void exec() override + { + mesh_data_.package_parallel_for( + [&](size_t package_index) + { + std::pair &metadata = mesh_data_.meta_data_cell_[package_index]; + if (metadata.second == 1) + { + this->update(package_index); + } + } + ); + }; +}; } // namespace SPH #endif // MESH_DYNAMICS_H \ No newline at end of file diff --git a/src/shared/meshes/mesh_local_dynamics.h b/src/shared/meshes/mesh_local_dynamics.h index 40ff806cc6..de5d7e42d5 100644 --- a/src/shared/meshes/mesh_local_dynamics.h +++ b/src/shared/meshes/mesh_local_dynamics.h @@ -262,15 +262,27 @@ class MarkNearInterface : public BaseMeshLocalDynamics Real small_shift; }; -// class RedistanceInterface -// : public BaseMeshLocalDynamics -// { -// public: -// explicit RedistanceInterface(MeshWithGridDataPackages &mesh_data){}; -// virtual ~RedistanceInterface(){}; - -// void update(size_t package_index); -// }; +class RedistanceInterface : public BaseMeshLocalDynamics +{ + public: + explicit RedistanceInterface(MeshWithGridDataPackagesType &mesh_data) + : BaseMeshLocalDynamics(mesh_data), + data_spacing_(mesh_data.DataSpacing()), + phi_(*mesh_data.getMeshVariable("Levelset")), + near_interface_id_(*mesh_data.getMeshVariable("NearInterfaceID")), + phi_gradient_(*mesh_data.getMeshVariable("LevelsetGradient")){}; + virtual ~RedistanceInterface(){}; + + void update(const size_t &package_index); + + private: + MeshVariable &phi_; + MeshVariable &phi_gradient_; + MeshVariable &near_interface_id_; + + Real data_spacing_; +}; + class DiffuseLevelSetSign : public BaseMeshLocalDynamics { public: @@ -287,6 +299,5 @@ class DiffuseLevelSetSign : public BaseMeshLocalDynamics MeshVariable &near_interface_id_; }; -// } // namespace mesh_dynamics } // namespace SPH #endif // MESH_LOCAL_DYNAMICS_H From 0c84f0d0730966af849d351181e8ca9efc39e1c8 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Mon, 12 Aug 2024 01:19:33 +0200 Subject: [PATCH 21/55] (2d wrapped) all --- src/for_2D_build/geometries/level_set_2d.cpp | 97 ++++++++++---------- src/shared/geometries/level_set.h | 2 +- src/shared/meshes/mesh_local_dynamics.h | 6 +- 3 files changed, 54 insertions(+), 51 deletions(-) diff --git a/src/for_2D_build/geometries/level_set_2d.cpp b/src/for_2D_build/geometries/level_set_2d.cpp index 614bb9adf1..618634b879 100644 --- a/src/for_2D_build/geometries/level_set_2d.cpp +++ b/src/for_2D_build/geometries/level_set_2d.cpp @@ -180,56 +180,57 @@ void LevelSet::reinitializeLevelSet() //=================================================================================================// void LevelSet::markNearInterface(Real small_shift_factor) { - Real small_shift = small_shift_factor * data_spacing_; - - package_parallel_for( - [&](size_t package_index) - { - auto &phi_addrs = phi_.DataField()[package_index]; - auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; - auto neighborhood = cell_neighborhood_[package_index]; + // Real small_shift = small_shift_factor * data_spacing_; + mark_near_interface.setSmallShiftFactor(small_shift_factor); + mark_near_interface.exec(); + // package_parallel_for( + // [&](size_t package_index) + // { + // auto &phi_addrs = phi_.DataField()[package_index]; + // auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; + // auto neighborhood = cell_neighborhood_[package_index]; - // corner averages, note that the first row and first column are not used - PackageTemporaryData corner_averages; - mesh_for_each2d<0, pkg_size + 1>( - [&](int i, int j) - { - corner_averages[i][j] = CornerAverage(phi_, Arrayi(i, j), Arrayi(-1, -1), neighborhood); - }); + // // corner averages, note that the first row and first column are not used + // PackageTemporaryData corner_averages; + // mesh_for_each2d<0, pkg_size + 1>( + // [&](int i, int j) + // { + // corner_averages[i][j] = CornerAverage(phi_, Arrayi(i, j), Arrayi(-1, -1), neighborhood); + // }); - for_each_cell_data( - [&](int i, int j) - { - // first assume far cells - Real phi_0 = phi_addrs[i][j]; - int near_interface_id = phi_0 > 0.0 ? 2 : -2; - if (fabs(phi_0) < small_shift) - { - near_interface_id = 0; - Real phi_average_0 = corner_averages[i][j]; - // find outer cut cells by comparing the sign of corner averages - mesh_for_each2d<0, 2>( - [&](int l, int m) - { - Real phi_average = corner_averages[i + l][j + m]; - if ((phi_average_0 - small_shift) * (phi_average - small_shift) < 0.0) - near_interface_id = 1; - if ((phi_average_0 + small_shift) * (phi_average + small_shift) < 0.0) - near_interface_id = -1; - }); - // find zero cut cells by comparing the sign of corner averages - mesh_for_each2d<0, 2>( - [&](int l, int m) - { - Real phi_average = corner_averages[i + l][j + m]; - if (phi_average_0 * phi_average < 0.0) - near_interface_id = 0; - }); - } - // assign this to package - near_interface_id_addrs[i][j] = near_interface_id; - }); - }); + // for_each_cell_data( + // [&](int i, int j) + // { + // // first assume far cells + // Real phi_0 = phi_addrs[i][j]; + // int near_interface_id = phi_0 > 0.0 ? 2 : -2; + // if (fabs(phi_0) < small_shift) + // { + // near_interface_id = 0; + // Real phi_average_0 = corner_averages[i][j]; + // // find outer cut cells by comparing the sign of corner averages + // mesh_for_each2d<0, 2>( + // [&](int l, int m) + // { + // Real phi_average = corner_averages[i + l][j + m]; + // if ((phi_average_0 - small_shift) * (phi_average - small_shift) < 0.0) + // near_interface_id = 1; + // if ((phi_average_0 + small_shift) * (phi_average + small_shift) < 0.0) + // near_interface_id = -1; + // }); + // // find zero cut cells by comparing the sign of corner averages + // mesh_for_each2d<0, 2>( + // [&](int l, int m) + // { + // Real phi_average = corner_averages[i + l][j + m]; + // if (phi_average_0 * phi_average < 0.0) + // near_interface_id = 0; + // }); + // } + // // assign this to package + // near_interface_id_addrs[i][j] = near_interface_id; + // }); + // }); } //=================================================================================================// void LevelSet::initializeBasicDataForAPackage(const Arrayi &cell_index, const size_t package_index, Shape &shape) diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index 315f596844..242b11b4d2 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -138,8 +138,8 @@ class LevelSet : public MeshWithGridDataPackages<4>, MeshInnerDynamics update_kernel_integrals{mesh_data_, kernel_, global_h_ratio_}; MeshInnerDynamics diffuse_level_set_sign{mesh_data_}; MeshInnerDynamics reinitialize_level_set{mesh_data_}; + MeshInnerDynamics mark_near_interface{mesh_data_}; MeshCoreDynamics redistance_interface{mesh_data_}; - // MeshInnerDynamics mark_near_interface{mesh_data_}; // upwind algorithm choosing candidate difference by the sign Real upwindDifference(Real sign, Real df_p, Real df_n); diff --git a/src/shared/meshes/mesh_local_dynamics.h b/src/shared/meshes/mesh_local_dynamics.h index de5d7e42d5..3034d105e6 100644 --- a/src/shared/meshes/mesh_local_dynamics.h +++ b/src/shared/meshes/mesh_local_dynamics.h @@ -246,20 +246,22 @@ class ReinitializeLevelSet : public BaseMeshLocalDynamics class MarkNearInterface : public BaseMeshLocalDynamics { public: - explicit MarkNearInterface(MeshWithGridDataPackagesType &mesh_data, Real small_shift_factor) + explicit MarkNearInterface(MeshWithGridDataPackagesType &mesh_data) : BaseMeshLocalDynamics(mesh_data), - small_shift(small_shift_factor * mesh_data.DataSpacing()), + data_spacing_(mesh_data.DataSpacing()), phi_(*mesh_data.getMeshVariable("Levelset")), near_interface_id_(*mesh_data.getMeshVariable("NearInterfaceID")){}; virtual ~MarkNearInterface(){}; void update(const size_t &package_index); + void setSmallShiftFactor(Real small_shift_factor){ small_shift = data_spacing_ * small_shift_factor; }; private: MeshVariable &phi_; MeshVariable &near_interface_id_; Real small_shift; + Real data_spacing_; }; class RedistanceInterface : public BaseMeshLocalDynamics From 616a54f9c3b257fce15bdda9c3e8c36a30977983 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Mon, 12 Aug 2024 03:04:57 +0200 Subject: [PATCH 22/55] (full)sortIndex --- .../meshes/mesh_local_dynamics_2d.cpp | 10 ++++++++++ .../meshes/mesh_local_dynamics_3d.cpp | 10 ++++++++++ src/shared/meshes/mesh_local_dynamics.cpp | 7 +------ src/shared/meshes/mesh_local_dynamics.h | 15 +++++++-------- 4 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp index 7f5194f50c..11e7902af5 100644 --- a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp +++ b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp @@ -5,6 +5,16 @@ namespace SPH { //=============================================================================================// +size_t InitializeDataInACell::SortIndexFromCellIndex(const Arrayi &cell_index) +{ + return cell_index[0] * all_cells_[1] + cell_index[1]; +} +//=============================================================================================// +size_t TagACellIsInnerPackage::SortIndexFromCellIndex(const Arrayi &cell_index) +{ + return cell_index[0] * all_cells_[1] + cell_index[1]; +} +//=============================================================================================// bool TagACellIsInnerPackage::isInnerPackage(const Arrayi &cell_index) { return mesh_any_of( diff --git a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp index 85b2e5eb77..35745d7752 100644 --- a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp +++ b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp @@ -3,6 +3,16 @@ namespace SPH { //=============================================================================================// +size_t InitializeDataInACell::SortIndexFromCellIndex(const Arrayi &cell_index) +{ + return cell_index[0] * all_cells_[1] * all_cells_[2] + cell_index[1] * all_cells_[2] + cell_index[2]; +} +//=============================================================================================// +size_t TagACellIsInnerPackage::SortIndexFromCellIndex(const Arrayi &cell_index) +{ + return cell_index[0] * all_cells_[1] * all_cells_[2] + cell_index[1] * all_cells_[2] + cell_index[2]; +} +//=============================================================================================// bool TagACellIsInnerPackage::isInnerPackage(const Arrayi &cell_index) { return mesh_any_of( diff --git a/src/shared/meshes/mesh_local_dynamics.cpp b/src/shared/meshes/mesh_local_dynamics.cpp index 6bbff2cc7f..2e7b7955f6 100644 --- a/src/shared/meshes/mesh_local_dynamics.cpp +++ b/src/shared/meshes/mesh_local_dynamics.cpp @@ -60,11 +60,6 @@ void InitializeDataInACell::update(const Arrayi &cell_index) } } //=================================================================================================// -size_t InitializeDataInACell::SortIndexFromCellIndex(const Arrayi &cell_index) -{ - return cell_index[0] * all_cells_[1] + cell_index[1]; -} -//=================================================================================================// void TagACellIsInnerPackage::update(const Arrayi &cell_index) { if (isInnerPackage(cell_index)) @@ -72,7 +67,7 @@ void TagACellIsInnerPackage::update(const Arrayi &cell_index) if (!mesh_data_.isInnerDataPackage(cell_index)) { std::pair occupied; - occupied.first = cell_index[0] * all_cells_[1] + cell_index[1]; //2d version try implement, 3d separation needed + occupied.first = SortIndexFromCellIndex(cell_index); occupied.second = 0; mesh_data_.registerOccupied(occupied); diff --git a/src/shared/meshes/mesh_local_dynamics.h b/src/shared/meshes/mesh_local_dynamics.h index 3034d105e6..b52e69a9e6 100644 --- a/src/shared/meshes/mesh_local_dynamics.h +++ b/src/shared/meshes/mesh_local_dynamics.h @@ -49,12 +49,16 @@ class BaseMeshLocalDynamics { public: explicit BaseMeshLocalDynamics(MeshWithGridDataPackages<4> &mesh_data) - : mesh_data_(mesh_data){}; + : mesh_data_(mesh_data), + all_cells_(mesh_data.AllCells()), + grid_spacing_(mesh_data.GridSpacing()){}; virtual ~BaseMeshLocalDynamics(){}; virtual void update(const IndexType &index) = 0; protected: MeshWithGridDataPackages<4> &mesh_data_; + Arrayi all_cells_; + Real grid_spacing_; }; class InitializeDataInACell : public BaseMeshLocalDynamics @@ -62,7 +66,6 @@ class InitializeDataInACell : public BaseMeshLocalDynamics public: explicit InitializeDataInACell(MeshWithGridDataPackages<4> &mesh_data, Shape &shape) : BaseMeshLocalDynamics(mesh_data), - all_cells_(mesh_data.AllCells()), shape_(shape){}; virtual ~InitializeDataInACell(){}; @@ -70,8 +73,6 @@ class InitializeDataInACell : public BaseMeshLocalDynamics private: Shape &shape_; - Real grid_spacing_ = mesh_data_.GridSpacing(); - Arrayi all_cells_; size_t SortIndexFromCellIndex(const Arrayi &cell_index); }; @@ -80,16 +81,14 @@ class TagACellIsInnerPackage : public BaseMeshLocalDynamics { public: explicit TagACellIsInnerPackage(MeshWithGridDataPackagesType &mesh_data) - : BaseMeshLocalDynamics(mesh_data), - all_cells_(mesh_data.AllCells()){}; + : BaseMeshLocalDynamics(mesh_data){}; virtual ~TagACellIsInnerPackage(){}; void update(const Arrayi &index); private: - Arrayi all_cells_; - bool isInnerPackage(const Arrayi &cell_index); + size_t SortIndexFromCellIndex(const Arrayi &cell_index); }; class InitializeIndexMesh : public BaseMeshLocalDynamics From c01dc4f7d7d21c3ad6ffd9e43dd75febf136ea70 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Mon, 12 Aug 2024 05:03:39 +0200 Subject: [PATCH 23/55] merge levelset init 2d/3d --- src/for_2D_build/geometries/level_set_2d.cpp | 150 ---------------- .../meshes/mesh_local_dynamics_2d.cpp | 33 ++-- src/for_3D_build/geometries/level_set_3d.cpp | 169 ++---------------- .../meshes/mesh_local_dynamics_3d.cpp | 52 ++++-- src/shared/geometries/level_set.cpp | 103 +++++------ src/shared/geometries/level_set.h | 20 +-- src/shared/meshes/mesh_local_dynamics.cpp | 32 +--- src/shared/meshes/mesh_local_dynamics.h | 95 +++------- 8 files changed, 149 insertions(+), 505 deletions(-) diff --git a/src/for_2D_build/geometries/level_set_2d.cpp b/src/for_2D_build/geometries/level_set_2d.cpp index 618634b879..ec4dc8ca16 100644 --- a/src/for_2D_build/geometries/level_set_2d.cpp +++ b/src/for_2D_build/geometries/level_set_2d.cpp @@ -10,14 +10,6 @@ namespace SPH { //=================================================================================================// -LevelSet::LevelSet(BoundingBox tentative_bounds, Real data_spacing, - Shape &shape, SPHAdaptation &sph_adaptation) - : LevelSet(tentative_bounds, data_spacing, 4, shape, sph_adaptation) -{ - initialize_data_in_a_cell.exec(); - finishDataPackages(); -} -//=================================================================================================// void LevelSet::initializeDataForSingularPackage(const size_t package_index, Real far_field_level_set) { auto &phi = phi_.DataField()[package_index]; @@ -37,78 +29,11 @@ void LevelSet::initializeDataForSingularPackage(const size_t package_index, Real }); } //=================================================================================================// -void LevelSet::finishDataPackages() -{ - tag_a_cell_is_inner_package.exec(); - - parallel_sort(occupied_data_pkgs_.begin(), occupied_data_pkgs_.end(), - [](const std::pair& a, const std::pair& b) - { - return a.first < b.first; - }); - num_grid_pkgs_ = occupied_data_pkgs_.size() + 2; - cell_neighborhood_ = new CellNeighborhood[num_grid_pkgs_]; - meta_data_cell_ = new std::pair[num_grid_pkgs_]; - initialize_index_mesh.exec(); - initialize_cell_neighborhood.exec(); - resizeMeshVariableData(); - - - Real far_field_distance = grid_spacing_ * (Real)buffer_width_; - initializeDataForSingularPackage(0, -far_field_distance); - initializeDataForSingularPackage(1, far_field_distance); - - initialize_basic_data_for_a_package.exec(); - update_level_set_gradient.exec(); - update_kernel_integrals.exec(); -} -//=================================================================================================// -void LevelSet::initializeIndexMesh() -{ - package_parallel_for([&](size_t package_index) - { - size_t sort_index = occupied_data_pkgs_[package_index-2].first; - Arrayi cell_index = Arrayi(sort_index / all_cells_[1], sort_index % all_cells_[1]); //[notion] there might be problems, 3d implementation needed - assignDataPackageIndex(cell_index, package_index); - }); -} -//=================================================================================================// -void LevelSet::initializeCellNeighborhood() -{ - // cell_neighborhood_ = new CellNeighborhood[num_grid_pkgs_]; - // meta_data_cell_ = new std::pair[num_grid_pkgs_]; - package_parallel_for([&](size_t package_index) - { - size_t sort_index = occupied_data_pkgs_[package_index-2].first; - Arrayi cell_index = Arrayi(sort_index / all_cells_[1], sort_index % all_cells_[1]); //[notion] there might be problems, 3d implementation needed - CellNeighborhood ¤t = cell_neighborhood_[package_index]; - std::pair &metadata = meta_data_cell_[package_index]; - metadata.first = cell_index; - metadata.second = occupied_data_pkgs_[package_index-2].second; - for (int l = -1; l < 2; l++) - for (int m = -1; m < 2; m++) - { - current[l + 1][m + 1] = PackageIndexFromCellIndex(cell_index + Arrayi(l, m)); - } - }); -} -//=================================================================================================// bool LevelSet::isWithinCorePackage(Vecd position) { Arrayi cell_index = CellIndexFromPosition(position); return isInnerDataPackage(cell_index); } -//=============================================================================================// -bool LevelSet::isInnerPackage(const Arrayi &cell_index) -{ - return mesh_any_of( - Array2i::Zero().max(cell_index - Array2i::Ones()), - all_cells_.min(cell_index + 2 * Array2i::Ones()), - [&](int l, int m) - { - return isInnerDataPackage(Arrayi(l, m)); //actually a core test here, because only core pkgs are assigned - }); -} //=================================================================================================// void LevelSet::diffuseLevelSetSign() { @@ -233,19 +158,6 @@ void LevelSet::markNearInterface(Real small_shift_factor) // }); } //=================================================================================================// -void LevelSet::initializeBasicDataForAPackage(const Arrayi &cell_index, const size_t package_index, Shape &shape) -{ - auto &phi = phi_.DataField()[package_index]; - auto &near_interface_id = near_interface_id_.DataField()[package_index]; - for_each_cell_data( - [&](int i, int j) - { - Vec2d position = DataPositionFromIndex(cell_index, Array2i(i, j)); - phi[i][j] = shape.findSignedDistance(position); - near_interface_id[i][j] = phi[i][j] < 0.0 ? -2 : 2; - }); -} -//=================================================================================================// void LevelSet::redistanceInterfaceForAPackage(const size_t package_index) { auto phi_data = phi_.DataField(); @@ -434,68 +346,6 @@ void LevelSet::writeMeshFieldToPlt(std::ofstream &output_file) } } //=============================================================================================// -Real LevelSet::computeKernelIntegral(const Vecd &position) -{ - Real phi = probeSignedDistance(position); - Real cutoff_radius = kernel_.CutOffRadius(global_h_ratio_); - Real threshold = cutoff_radius + data_spacing_; // consider that interface's half width is the data spacing - - Real integral(0); - if (fabs(phi) < threshold) - { - Arrayi global_index_ = global_mesh_.CellIndexFromPosition(position); - mesh_for_each2d<-3, 4>( - [&](int i, int j) - { - Arrayi neighbor_index = Arrayi(global_index_[0] + i, global_index_[1] + j); - Real phi_neighbor = DataValueFromGlobalIndex(phi_, neighbor_index); - if (phi_neighbor > -data_spacing_) - { - Vecd phi_gradient = DataValueFromGlobalIndex(phi_gradient_, neighbor_index); - Vecd integral_position = global_mesh_.GridPositionFromIndex(neighbor_index); - Vecd displacement = position - integral_position; - Real distance = displacement.norm(); - if (distance < cutoff_radius) - integral += kernel_.W(global_h_ratio_, distance, displacement) * - CutCellVolumeFraction(phi_neighbor, phi_gradient, data_spacing_); - } - }); - } - return phi > threshold ? 1.0 : integral * data_spacing_ * data_spacing_; -} -//=============================================================================================// -Vecd LevelSet::computeKernelGradientIntegral(const Vecd &position) -{ - Real phi = probeSignedDistance(position); - Real cutoff_radius = kernel_.CutOffRadius(global_h_ratio_); - Real threshold = cutoff_radius + data_spacing_; - - Vecd integral = Vecd::Zero(); - if (fabs(phi) < threshold) - { - Arrayi global_index_ = global_mesh_.CellIndexFromPosition(position); - mesh_for_each2d<-3, 4>( - [&](int i, int j) - { - Arrayi neighbor_index = Arrayi(global_index_[0] + i, global_index_[1] + j); - Real phi_neighbor = DataValueFromGlobalIndex(phi_, neighbor_index); - if (phi_neighbor > -data_spacing_) - { - Vecd phi_gradient = DataValueFromGlobalIndex(phi_gradient_, neighbor_index); - Vecd integral_position = global_mesh_.GridPositionFromIndex(neighbor_index); - Vecd displacement = position - integral_position; - Real distance = displacement.norm(); - if (distance < cutoff_radius) - integral += kernel_.dW(global_h_ratio_, distance, displacement) * - CutCellVolumeFraction(phi_neighbor, phi_gradient, data_spacing_) * - displacement / (distance + TinyReal); - } - }); - } - - return integral * data_spacing_ * data_spacing_; -} -//=============================================================================================// RefinedLevelSet::RefinedLevelSet(BoundingBox tentative_bounds, LevelSet &coarse_level_set, Shape &shape, SPHAdaptation &sph_adaptation) : RefinedMesh(tentative_bounds, coarse_level_set, 4, shape, sph_adaptation) diff --git a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp index 11e7902af5..5cc31e8203 100644 --- a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp +++ b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp @@ -26,19 +26,21 @@ bool TagACellIsInnerPackage::isInnerPackage(const Arrayi &cell_index) }); } //=============================================================================================// -// void InitializeCellNeighborhood::update(const size_t &package_index) -// { -// Arrayi cell_index = mesh_data_.CellIndexFromPackageSortIndex(package_index); -// CellNeighborhood ¤t = mesh_data_.getCellNeighborhoodForWrite(package_index); -// std::pair &metadata = mesh_data_.getMetaDataCellForWrite(package_index); -// metadata.first = cell_index; -// metadata.second = mesh_data_.isCoreDataPackage(cell_index) ? 1 : 0; -// for (int l = -1; l < 2; l++) -// for (int m = -1; m < 2; m++) -// { -// current[l + 1][m + 1] = mesh_data_.PackageIndexFromCellIndex(cell_index + Arrayi(l, m)); -// }; -// } +Arrayi InitializeIndexMesh::CellIndexFromSortIndex(const size_t &sort_index) +{ + Array2i cell_index; + cell_index[0] = sort_index / all_cells_[1]; + cell_index[1] = sort_index % all_cells_[1]; + return cell_index; +} +//=============================================================================================// +Arrayi InitializeCellNeighborhood::CellIndexFromSortIndex(const size_t &sort_index) +{ + Array2i cell_index; + cell_index[0] = sort_index / all_cells_[1]; + cell_index[1] = sort_index % all_cells_[1]; + return cell_index; +} //=============================================================================================// void InitializeCellNeighborhood::update(const size_t &package_index) { @@ -71,7 +73,10 @@ void InitializeBasicDataForAPackage::update(const size_t &package_index) //=============================================================================================// Arrayi InitializeBasicDataForAPackage::CellIndexFromSortIndex(const size_t &sort_index) { - return Array2i(sort_index / all_cells_[1], sort_index % all_cells_[1]); + Array2i cell_index; + cell_index[0] = sort_index / all_cells_[1]; + cell_index[1] = sort_index % all_cells_[1]; + return cell_index; } //=============================================================================================// Real UpdateKernelIntegrals::computeKernelIntegral(const Vecd &position) diff --git a/src/for_3D_build/geometries/level_set_3d.cpp b/src/for_3D_build/geometries/level_set_3d.cpp index d69c6f8630..5a20a00b57 100644 --- a/src/for_3D_build/geometries/level_set_3d.cpp +++ b/src/for_3D_build/geometries/level_set_3d.cpp @@ -5,18 +5,11 @@ #include "base_particle_dynamics.h" #include "base_particles.h" #include "mesh_iterators.hpp" +#include "tbb/parallel_sort.h" namespace SPH { //=================================================================================================// -LevelSet::LevelSet(BoundingBox tentative_bounds, Real data_spacing, - Shape &shape, SPHAdaptation &sph_adaptation) - : LevelSet(tentative_bounds, data_spacing, 4, shape, sph_adaptation) -{ - initialize_data_in_a_cell.exec(); - finishDataPackages(); -} -//=================================================================================================// void LevelSet::initializeDataForSingularPackage(const size_t package_index, Real far_field_level_set) { auto &phi = phi_.DataField()[package_index]; @@ -36,87 +29,12 @@ void LevelSet::initializeDataForSingularPackage(const size_t package_index, Real }); } //=================================================================================================// -void LevelSet::finishDataPackages() -{ - mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), - [&](size_t i, size_t j, size_t k) - { - tagACellIsInnerPackage(Arrayi(i, j, k)); - }); - - initializeIndexMesh(); - initializeCellNeighborhood(); - resizeMeshVariableData(); - - Real far_field_distance = grid_spacing_ * (Real)buffer_width_; - initializeDataForSingularPackage(0, -far_field_distance); - initializeDataForSingularPackage(1, far_field_distance); - - package_parallel_for( - [&](size_t package_index) - { - initializeBasicDataForAPackage(meta_data_cell_[package_index].first, package_index, shape_); - }); - - update_level_set_gradient.exec(); - updateKernelIntegrals(); -} -//=================================================================================================// -void LevelSet::initializeIndexMesh() -{ - mesh_for(MeshRange(Arrayi::Zero(), all_cells_), - [&](size_t i, size_t j, size_t k) - { - Arrayi cell_index = Arrayi(i, j, k); - if (isInnerDataPackage(cell_index)) - { - assignDataPackageIndex(Arrayi(i, j, k), num_grid_pkgs_); - num_grid_pkgs_++; - } - }); -} -//=================================================================================================// -void LevelSet::initializeCellNeighborhood() -{ - cell_neighborhood_ = new CellNeighborhood[num_grid_pkgs_]; - meta_data_cell_ = new std::pair[num_grid_pkgs_]; - mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), - [&](size_t i, size_t j, size_t k) - { - Arrayi cell_index = Arrayi(i, j, k); - if (isInnerDataPackage(cell_index)) - { - CellNeighborhood ¤t = cell_neighborhood_[PackageIndexFromCellIndex(cell_index)]; - std::pair &metadata = meta_data_cell_[PackageIndexFromCellIndex(cell_index)]; - metadata.first = cell_index; - metadata.second = isCoreDataPackage(cell_index) ? 1 : 0; - for (int l = -1; l < 2; l++) - for (int m = -1; m < 2; m++) - for (int n = -1; n < 2; n++) - { - current[l + 1][m + 1][n + 1] = PackageIndexFromCellIndex(cell_index + Arrayi(l, m, n)); - } - } - }); -} -//=================================================================================================// bool LevelSet::isWithinCorePackage(Vecd position) { Arrayi cell_index = CellIndexFromPosition(position); return isCoreDataPackage(cell_index); } //=============================================================================================// -bool LevelSet::isInnerPackage(const Arrayi &cell_index) -{ - return mesh_any_of( - Array3i::Zero().max(cell_index - Array3i::Ones()), - all_cells_.min(cell_index + 2 * Array3i::Ones()), - [&](int l, int m, int n) - { - return isCoreDataPackage(Arrayi(l, m, n)); - }); -} -//=================================================================================================// void LevelSet::diffuseLevelSetSign() { package_parallel_for( @@ -238,18 +156,18 @@ void LevelSet::markNearInterface(Real small_shift_factor) }); } //=================================================================================================// -void LevelSet::initializeBasicDataForAPackage(const Arrayi &cell_index, const size_t package_index, Shape &shape) -{ - auto &phi = phi_.DataField()[package_index]; - auto &near_interface_id = near_interface_id_.DataField()[package_index]; - for_each_cell_data( - [&](int i, int j, int k) - { - Vec3d position = DataPositionFromIndex(cell_index, Array3i(i, j, k)); - phi[i][j][k] = shape.findSignedDistance(position); - near_interface_id[i][j][k] = phi[i][j][k] < 0.0 ? -2 : 2; - }); -} +// void LevelSet::initializeBasicDataForAPackage(const Arrayi &cell_index, const size_t package_index, Shape &shape) +// { +// auto &phi = phi_.DataField()[package_index]; +// auto &near_interface_id = near_interface_id_.DataField()[package_index]; +// for_each_cell_data( +// [&](int i, int j, int k) +// { +// Vec3d position = DataPositionFromIndex(cell_index, Array3i(i, j, k)); +// phi[i][j][k] = shape.findSignedDistance(position); +// near_interface_id[i][j][k] = phi[i][j][k] < 0.0 ? -2 : 2; +// }); +// } //=================================================================================================// void LevelSet::redistanceInterfaceForAPackage(const size_t package_index) { @@ -435,67 +353,6 @@ void LevelSet::writeMeshFieldToPlt(std::ofstream &output_file) } } //=============================================================================================// -Real LevelSet::computeKernelIntegral(const Vecd &position) -{ - Real phi = probeSignedDistance(position); - Real cutoff_radius = kernel_.CutOffRadius(global_h_ratio_); - Real threshold = cutoff_radius + data_spacing_; - - Real integral(0); - if (fabs(phi) < threshold) - { - Arrayi global_index_ = global_mesh_.CellIndexFromPosition(position); - mesh_for_each3d<-3, 4>( - [&](int i, int j, int k) - { - Arrayi neighbor_index = Arrayi(global_index_[0] + i, global_index_[1] + j, global_index_[2] + k); - Real phi_neighbor = DataValueFromGlobalIndex(phi_, neighbor_index); - if (phi_neighbor > -data_spacing_) - { - Vecd phi_gradient = DataValueFromGlobalIndex(phi_gradient_, neighbor_index); - Vecd integral_position = global_mesh_.GridPositionFromIndex(neighbor_index); - Vecd displacement = position - integral_position; - Real distance = displacement.norm(); - if (distance < cutoff_radius) - integral += kernel_.W(global_h_ratio_, distance, displacement) * - CutCellVolumeFraction(phi_neighbor, phi_gradient, data_spacing_); - } - }); - } - return phi > threshold ? 1.0 : integral * data_spacing_ * data_spacing_ * data_spacing_; -} -//=============================================================================================// -Vecd LevelSet::computeKernelGradientIntegral(const Vecd &position) -{ - Real phi = probeSignedDistance(position); - Real cutoff_radius = kernel_.CutOffRadius(global_h_ratio_); - Real threshold = cutoff_radius + data_spacing_; - - Vecd integral = Vecd::Zero(); - if (fabs(phi) < threshold) - { - Arrayi global_index_ = global_mesh_.CellIndexFromPosition(position); - mesh_for_each3d<-3, 4>( - [&](int i, int j, int k) - { - Arrayi neighbor_index = Arrayi(global_index_[0] + i, global_index_[1] + j, global_index_[2] + k); - Real phi_neighbor = DataValueFromGlobalIndex(phi_, neighbor_index); - if (phi_neighbor > -data_spacing_) - { - Vecd phi_gradient = DataValueFromGlobalIndex(phi_gradient_, neighbor_index); - Vecd integral_position = global_mesh_.GridPositionFromIndex(neighbor_index); - Vecd displacement = position - integral_position; - Real distance = displacement.norm(); - if (distance < cutoff_radius) - integral += kernel_.dW(global_h_ratio_, distance, displacement) * - CutCellVolumeFraction(phi_neighbor, phi_gradient, data_spacing_) * - displacement / (distance + TinyReal); - } - }); - } - return integral * data_spacing_ * data_spacing_ * data_spacing_; -} -//=============================================================================================// RefinedLevelSet::RefinedLevelSet(BoundingBox tentative_bounds, LevelSet &coarse_level_set, Shape &shape, SPHAdaptation &sph_adaptation) : RefinedMesh(tentative_bounds, coarse_level_set, 4, shape, sph_adaptation) diff --git a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp index 35745d7752..bb90d293c1 100644 --- a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp +++ b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp @@ -1,5 +1,7 @@ #include "mesh_local_dynamics.h" +#include "mesh_iterators.h" + namespace SPH { //=============================================================================================// @@ -24,10 +26,30 @@ bool TagACellIsInnerPackage::isInnerPackage(const Arrayi &cell_index) }); } //=============================================================================================// +Arrayi InitializeIndexMesh::CellIndexFromSortIndex(const size_t &sort_index) +{ + Array3i cell_index; + cell_index[0] = sort_index / (all_cells_[1] * all_cells_[2]); + cell_index[1] = (sort_index / all_cells_[2]) % all_cells_[1]; + cell_index[2] = sort_index % all_cells_[2]; + + return cell_index; +} +//=============================================================================================// +Arrayi InitializeCellNeighborhood::CellIndexFromSortIndex(const size_t &sort_index) +{ + Array3i cell_index; + cell_index[0] = sort_index / (all_cells_[1] * all_cells_[2]); + cell_index[1] = (sort_index / all_cells_[2]) % all_cells_[1]; + cell_index[2] = sort_index % all_cells_[2]; + + return cell_index; +} +//=============================================================================================// void InitializeCellNeighborhood::update(const size_t &package_index) { size_t sort_index = mesh_data_.occupied_data_pkgs_[package_index-2].first; - Arrayi cell_index = Arrayi(sort_index / all_cells_[1], sort_index % all_cells_[1]); //[notion] there might be problems, 3d implementation needed + Arrayi cell_index = CellIndexFromSortIndex(sort_index); CellNeighborhood ¤t = mesh_data_.cell_neighborhood_[package_index]; std::pair &metadata = mesh_data_.meta_data_cell_[package_index]; metadata.first = cell_index; @@ -42,22 +64,26 @@ void InitializeCellNeighborhood::update(const size_t &package_index) //=============================================================================================// void InitializeBasicDataForAPackage::update(const size_t &package_index) { - // auto &phi = phi_.DataField()[package_index]; - // auto &near_interface_id = near_interface_id_.DataField()[package_index]; - // Arrayi cell_index = mesh_data_.CellIndexFromPackageSortIndex(package_index); - // mesh_data_.for_each_cell_data( - // [&](int i, int j, int k) - // { - // Vec3d position = mesh_data_.DataPositionFromIndex(cell_index, Array3i(i, j, k)); - // phi[i][j][k] = shape_.findSignedDistance(position); - // near_interface_id[i][j][k] = phi[i][j][k] < 0.0 ? -2 : 2; - // }); - printf("not implemented yet"); + auto &phi = phi_.DataField()[package_index]; + auto &near_interface_id = near_interface_id_.DataField()[package_index]; + Arrayi cell_index = CellIndexFromSortIndex(package_index); + mesh_data_.for_each_cell_data( + [&](int i, int j, int k) + { + Vec3d position = mesh_data_.DataPositionFromIndex(cell_index, Array3i(i, j, k)); + phi[i][j][k] = shape_.findSignedDistance(position); + near_interface_id[i][j][k] = phi[i][j][k] < 0.0 ? -2 : 2; + }); } //=============================================================================================// Arrayi InitializeBasicDataForAPackage::CellIndexFromSortIndex(const size_t &sort_index) { - return Array3i(sort_index / all_cells_[1], sort_index % all_cells_[1], sort_index % all_cells_[1]); //[notion] not implemented yet + Array3i cell_index; + cell_index[0] = sort_index / (all_cells_[1] * all_cells_[2]); + cell_index[1] = (sort_index / all_cells_[2]) % all_cells_[1]; + cell_index[2] = sort_index % all_cells_[2]; + + return cell_index; } //=============================================================================================// Real UpdateKernelIntegrals::computeKernelIntegral(const Vecd &position) diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index 8ffba11bb9..00545aab4b 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -2,6 +2,7 @@ #include "adaptation.h" #include "base_kernel.h" +#include "tbb/parallel_sort.h" namespace SPH { @@ -41,24 +42,39 @@ LevelSet::LevelSet(BoundingBox tentative_bounds, Real data_spacing, size_t buffe kernel_gradient_(*registerMeshVariable("KernelGradient")), kernel_(*sph_adaptation.getKernel()) {} //=================================================================================================// -void LevelSet::updateLevelSetGradient() +LevelSet::LevelSet(BoundingBox tentative_bounds, Real data_spacing, + Shape &shape, SPHAdaptation &sph_adaptation) + : LevelSet(tentative_bounds, data_spacing, 4, shape, sph_adaptation) { - package_parallel_for( - [&](size_t package_index) { - computeGradient(phi_, phi_gradient_, package_index); - }); + initialize_data_in_a_cell.exec(); + + finishDataPackages(); } //=================================================================================================// -void LevelSet::updateKernelIntegrals() +void LevelSet::finishDataPackages() { - package_parallel_for( - [&](size_t package_index) { - Arrayi cell_index = meta_data_cell_[package_index].first; - assignByPosition( - kernel_weight_, cell_index, [&](const Vecd &position) -> Real { return computeKernelIntegral(position); }); - assignByPosition( - kernel_gradient_, cell_index, [&](const Vecd &position) -> Vecd { return computeKernelGradientIntegral(position); }); - }); + tag_a_cell_is_inner_package.exec(); + + parallel_sort(occupied_data_pkgs_.begin(), occupied_data_pkgs_.end(), + [](const std::pair& a, const std::pair& b) + { + return a.first < b.first; + }); + num_grid_pkgs_ = occupied_data_pkgs_.size() + 2; + cell_neighborhood_ = new CellNeighborhood[num_grid_pkgs_]; + meta_data_cell_ = new std::pair[num_grid_pkgs_]; + initialize_index_mesh.exec(); + initialize_cell_neighborhood.exec(); + resizeMeshVariableData(); + + + Real far_field_distance = grid_spacing_ * (Real)buffer_width_; + initializeDataForSingularPackage(0, -far_field_distance); + initializeDataForSingularPackage(1, far_field_distance); + + initialize_basic_data_for_a_package.exec(); + update_level_set_gradient.exec(); + update_kernel_integrals.exec(); } //=================================================================================================// Vecd LevelSet::probeNormalDirection(const Vecd &position) @@ -98,15 +114,15 @@ Vecd LevelSet::probeKernelGradientIntegral(const Vecd &position, Real h_ratio) //=================================================================================================// void LevelSet::redistanceInterface() { - redistance_interface.exec(); - // package_parallel_for( - // [&](size_t package_index) { - // std::pair &metadata = meta_data_cell_[package_index]; - // if (metadata.second == 1) - // { - // redistanceInterfaceForAPackage(PackageIndexFromCellIndex(metadata.first)); - // } - // }); + // redistance_interface.exec(); + package_parallel_for( + [&](size_t package_index) { + std::pair &metadata = meta_data_cell_[package_index]; + if (metadata.second == 1) + { + redistanceInterfaceForAPackage(PackageIndexFromCellIndex(metadata.first)); + } + }); } //=================================================================================================// void LevelSet::cleanInterface(Real small_shift_factor) @@ -114,8 +130,8 @@ void LevelSet::cleanInterface(Real small_shift_factor) markNearInterface(small_shift_factor); redistanceInterface(); reinitializeLevelSet(); - updateLevelSetGradient(); - updateKernelIntegrals(); + update_level_set_gradient.exec(); + update_kernel_integrals.exec(); } //=============================================================================================// void LevelSet::correctTopology(Real small_shift_factor) @@ -123,8 +139,8 @@ void LevelSet::correctTopology(Real small_shift_factor) markNearInterface(small_shift_factor); for (size_t i = 0; i != 10; ++i) diffuseLevelSetSign(); - updateLevelSetGradient(); - updateKernelIntegrals(); + update_level_set_gradient.exec(); + update_kernel_integrals.exec(); } //=================================================================================================// bool LevelSet::probeIsWithinMeshBound(const Vecd &position) @@ -141,39 +157,6 @@ bool LevelSet::probeIsWithinMeshBound(const Vecd &position) return is_bounded; } //=================================================================================================// -void LevelSet::initializeDataInACell(const Arrayi &cell_index) -{ - Vecd cell_position = CellPositionFromIndex(cell_index); - Real signed_distance = shape_.findSignedDistance(cell_position); - Vecd normal_direction = shape_.findNormalDirection(cell_position); - Real measure = (signed_distance * normal_direction).cwiseAbs().maxCoeff(); - if (measure < grid_spacing_) - { - assignCore(cell_index); - } - else - { - size_t package_index = shape_.checkContain(cell_position) ? 0 : 1; - assignSingular(cell_index); - assignDataPackageIndex(cell_index, package_index); - } -} -//=================================================================================================// -void LevelSet::tagACellIsInnerPackage(const Arrayi &cell_index) -{ - if (isInnerPackage(cell_index)) - { - if (!isInnerDataPackage(cell_index)) - { - std::pair occupied; - occupied.first = cell_index[0] * all_cells_[1] + cell_index[1]; //2d version try implement, 3d separation needed - occupied.second = 0; - - mesh_data_.registerOccupied(occupied); - } - } -} -//=================================================================================================// Real LevelSet::upwindDifference(Real sign, Real df_p, Real df_n) { if (sign * df_p >= 0.0 && sign * df_n >= 0.0) diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index 242b11b4d2..b905a3be07 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -100,8 +100,8 @@ class LevelSet : public MeshWithGridDataPackages<4>, virtual Vecd probeKernelGradientIntegral(const Vecd &position, Real h_ratio = 1.0) override; virtual void writeMeshFieldToPlt(std::ofstream &output_file) override; bool isWithinCorePackage(Vecd position); - Real computeKernelIntegral(const Vecd &position); - Vecd computeKernelGradientIntegral(const Vecd &position); + // Real computeKernelIntegral(const Vecd &position); + // Vecd computeKernelGradientIntegral(const Vecd &position); Kernel &kernel_; protected: @@ -113,7 +113,7 @@ class LevelSet : public MeshWithGridDataPackages<4>, MeshWithGridDataPackages<4> &mesh_data_ = *this; void initializeDataForSingularPackage(const size_t package_index, Real far_field_level_set); - void initializeBasicDataForAPackage(const Arrayi &cell_index, const size_t package_index, Shape &shape); + // void initializeBasicDataForAPackage(const Arrayi &cell_index, const size_t package_index, Shape &shape); void redistanceInterfaceForAPackage(const size_t package_index); void finishDataPackages(); @@ -121,13 +121,13 @@ class LevelSet : public MeshWithGridDataPackages<4>, void markNearInterface(Real small_shift_factor); void redistanceInterface(); void diffuseLevelSetSign(); - void updateKernelIntegrals(); - bool isInnerPackage(const Arrayi &cell_index); - void initializeDataInACell(const Arrayi &cell_index); - void tagACellIsInnerPackage(const Arrayi &cell_index); - void initializeIndexMesh(); - void initializeCellNeighborhood(); - void updateLevelSetGradient(); + // void updateKernelIntegrals(); + // bool isInnerPackage(const Arrayi &cell_index); + // void initializeDataInACell(const Arrayi &cell_index); + // void tagACellIsInnerPackage(const Arrayi &cell_index); + // void initializeIndexMesh(); + // void initializeCellNeighborhood(); + // void updateLevelSetGradient(); MeshAllDynamics initialize_data_in_a_cell{mesh_data_, shape_}; MeshAllDynamics tag_a_cell_is_inner_package{mesh_data_}; diff --git a/src/shared/meshes/mesh_local_dynamics.cpp b/src/shared/meshes/mesh_local_dynamics.cpp index 2e7b7955f6..649b8c97cf 100644 --- a/src/shared/meshes/mesh_local_dynamics.cpp +++ b/src/shared/meshes/mesh_local_dynamics.cpp @@ -78,7 +78,7 @@ void TagACellIsInnerPackage::update(const Arrayi &cell_index) void InitializeIndexMesh::update(const size_t &package_index) { size_t sort_index = mesh_data_.occupied_data_pkgs_[package_index-2].first; - Arrayi cell_index = Arrayi(sort_index / all_cells_[1], sort_index % all_cells_[1]); //[notion] there might be problems, 3d implementation needed + Arrayi cell_index = CellIndexFromSortIndex(sort_index); mesh_data_.assignDataPackageIndex(cell_index, package_index); } //=================================================================================================// @@ -87,16 +87,6 @@ void UpdateLevelSetGradient::update(const size_t &index) mesh_data_.computeGradient(phi_, phi_gradient_, index); } //=================================================================================================// -// Real UpdateKernelIntegrals::computeKernelIntegral(const Vecd &position) -// { - -// } -//=================================================================================================// -// Vecd UpdateKernelIntegrals::computeKernelGradientIntegral(const Vecd &position) -// { - -// } -//=================================================================================================// void UpdateKernelIntegrals::update(const size_t &package_index) { Arrayi cell_index = mesh_data_.meta_data_cell_[package_index].first; @@ -108,25 +98,5 @@ void UpdateKernelIntegrals::update(const size_t &package_index) { return computeKernelGradientIntegral(position); }); } //=================================================================================================// -// void ReinitializeLevelSet::update() -// { - -// } -//=================================================================================================// -// void MarkNearInterface::update() -// { - -// } -//=================================================================================================// -// void RedistanceInterface::update() -// { - -// } -//=================================================================================================// -// void DiffuseLevelSetSign::update() -// { - -// } -//=================================================================================================// } // namespace SPH //=================================================================================================// diff --git a/src/shared/meshes/mesh_local_dynamics.h b/src/shared/meshes/mesh_local_dynamics.h index b52e69a9e6..2c12b56795 100644 --- a/src/shared/meshes/mesh_local_dynamics.h +++ b/src/shared/meshes/mesh_local_dynamics.h @@ -51,7 +51,13 @@ class BaseMeshLocalDynamics explicit BaseMeshLocalDynamics(MeshWithGridDataPackages<4> &mesh_data) : mesh_data_(mesh_data), all_cells_(mesh_data.AllCells()), - grid_spacing_(mesh_data.GridSpacing()){}; + grid_spacing_(mesh_data.GridSpacing()), + data_spacing_(mesh_data.DataSpacing()), + phi_(*mesh_data.getMeshVariable("Levelset")), + phi_gradient_(*mesh_data.getMeshVariable("LevelsetGradient")), + near_interface_id_(*mesh_data.getMeshVariable("NearInterfaceID")), + kernel_weight_(*mesh_data.getMeshVariable("KernelWeight")), + kernel_gradient_(*mesh_data.getMeshVariable("KernelGradient")){}; virtual ~BaseMeshLocalDynamics(){}; virtual void update(const IndexType &index) = 0; @@ -59,6 +65,13 @@ class BaseMeshLocalDynamics MeshWithGridDataPackages<4> &mesh_data_; Arrayi all_cells_; Real grid_spacing_; + Real data_spacing_; + + MeshVariable &phi_; + MeshVariable &phi_gradient_; + MeshVariable &near_interface_id_; + MeshVariable &kernel_weight_; + MeshVariable &kernel_gradient_; }; class InitializeDataInACell : public BaseMeshLocalDynamics @@ -95,32 +108,26 @@ class InitializeIndexMesh : public BaseMeshLocalDynamics { public: explicit InitializeIndexMesh(MeshWithGridDataPackagesType &mesh_data) - : BaseMeshLocalDynamics(mesh_data), - all_cells_(mesh_data.AllCells()){}; + : BaseMeshLocalDynamics(mesh_data){}; virtual ~InitializeIndexMesh(){}; void update(const size_t &index); private: - Arrayi all_cells_; + Arrayi CellIndexFromSortIndex(const size_t &sort_index); }; class InitializeCellNeighborhood : public BaseMeshLocalDynamics { public: explicit InitializeCellNeighborhood(MeshWithGridDataPackagesType &mesh_data) - : BaseMeshLocalDynamics(mesh_data), - // cell_neighborhood_(mesh_data.getCellNeighborhood()), - // meta_data_cell_(mesh_data.getMetaDataCell()), - all_cells_(mesh_data.AllCells()){}; + : BaseMeshLocalDynamics(mesh_data){}; virtual ~InitializeCellNeighborhood(){}; void update(const size_t &index); private: - Arrayi all_cells_; - // CellNeighborhood* cell_neighborhood_; - // std::pair* meta_data_cell_; + Arrayi CellIndexFromSortIndex(const size_t &sort_index); }; class InitializeBasicDataForAPackage : public BaseMeshLocalDynamics @@ -128,19 +135,13 @@ class InitializeBasicDataForAPackage : public BaseMeshLocalDynamics public: explicit InitializeBasicDataForAPackage(MeshWithGridDataPackagesType &mesh_data, Shape &shape) : BaseMeshLocalDynamics(mesh_data), - shape_(shape), - all_cells_(mesh_data.AllCells()), - phi_(*mesh_data.getMeshVariable("Levelset")), - near_interface_id_(*mesh_data.getMeshVariable("NearInterfaceID")){}; + shape_(shape){}; virtual ~InitializeBasicDataForAPackage(){}; void update(const size_t &index); private: Shape &shape_; - Arrayi all_cells_; - MeshVariable &phi_; - MeshVariable &near_interface_id_; Arrayi CellIndexFromSortIndex(const size_t &sort_index); }; @@ -149,16 +150,10 @@ class UpdateLevelSetGradient : public BaseMeshLocalDynamics { public: explicit UpdateLevelSetGradient(MeshWithGridDataPackages<4> &mesh_data) - : BaseMeshLocalDynamics(mesh_data), - phi_(*mesh_data.getMeshVariable("Levelset")), - phi_gradient_(*mesh_data.getMeshVariable("LevelsetGradient")){}; + : BaseMeshLocalDynamics(mesh_data){}; virtual ~UpdateLevelSetGradient(){}; void update(const size_t &index); - - private: - MeshVariable &phi_; - MeshVariable &phi_gradient_; }; class UpdateKernelIntegrals : public BaseMeshLocalDynamics @@ -166,24 +161,14 @@ class UpdateKernelIntegrals : public BaseMeshLocalDynamics public: explicit UpdateKernelIntegrals(MeshWithGridDataPackagesType &mesh_data, Kernel &kernel, Real global_h_ratio) : BaseMeshLocalDynamics(mesh_data), - phi_(*mesh_data.getMeshVariable("Levelset")), - phi_gradient_(*mesh_data.getMeshVariable("LevelsetGradient")), - kernel_weight_(*mesh_data.getMeshVariable("KernelWeight")), - kernel_gradient_(*mesh_data.getMeshVariable("KernelGradient")), kernel_(kernel), - data_spacing_(mesh_data.DataSpacing()), global_h_ratio_(global_h_ratio){}; virtual ~UpdateKernelIntegrals(){}; void update(const size_t &package_index); private: - MeshVariable &phi_; - MeshVariable &phi_gradient_; - MeshVariable &kernel_weight_; - MeshVariable &kernel_gradient_; Kernel &kernel_; - Real data_spacing_; Real global_h_ratio_; Real probeSignedDistance(const Vecd &position) { return mesh_data_.probeMesh(phi_, position); }; @@ -207,20 +192,12 @@ class ReinitializeLevelSet : public BaseMeshLocalDynamics { public: explicit ReinitializeLevelSet(MeshWithGridDataPackagesType &mesh_data) - : BaseMeshLocalDynamics(mesh_data), - data_spacing_(mesh_data.DataSpacing()), - phi_(*mesh_data.getMeshVariable("Levelset")), - near_interface_id_(*mesh_data.getMeshVariable("NearInterfaceID")){}; + : BaseMeshLocalDynamics(mesh_data){}; virtual ~ReinitializeLevelSet(){}; void update(const size_t &package_index); private: - MeshVariable &phi_; - MeshVariable &near_interface_id_; - - Real data_spacing_; - Real upwindDifference(Real sign, Real df_p, Real df_n) { if (sign * df_p >= 0.0 && sign * df_n >= 0.0) @@ -246,58 +223,34 @@ class MarkNearInterface : public BaseMeshLocalDynamics { public: explicit MarkNearInterface(MeshWithGridDataPackagesType &mesh_data) - : BaseMeshLocalDynamics(mesh_data), - data_spacing_(mesh_data.DataSpacing()), - phi_(*mesh_data.getMeshVariable("Levelset")), - near_interface_id_(*mesh_data.getMeshVariable("NearInterfaceID")){}; + : BaseMeshLocalDynamics(mesh_data){}; virtual ~MarkNearInterface(){}; void update(const size_t &package_index); void setSmallShiftFactor(Real small_shift_factor){ small_shift = data_spacing_ * small_shift_factor; }; private: - MeshVariable &phi_; - MeshVariable &near_interface_id_; - Real small_shift; - Real data_spacing_; }; class RedistanceInterface : public BaseMeshLocalDynamics { public: explicit RedistanceInterface(MeshWithGridDataPackagesType &mesh_data) - : BaseMeshLocalDynamics(mesh_data), - data_spacing_(mesh_data.DataSpacing()), - phi_(*mesh_data.getMeshVariable("Levelset")), - near_interface_id_(*mesh_data.getMeshVariable("NearInterfaceID")), - phi_gradient_(*mesh_data.getMeshVariable("LevelsetGradient")){}; + : BaseMeshLocalDynamics(mesh_data){}; virtual ~RedistanceInterface(){}; void update(const size_t &package_index); - - private: - MeshVariable &phi_; - MeshVariable &phi_gradient_; - MeshVariable &near_interface_id_; - - Real data_spacing_; }; class DiffuseLevelSetSign : public BaseMeshLocalDynamics { public: explicit DiffuseLevelSetSign(MeshWithGridDataPackagesType &mesh_data) - : BaseMeshLocalDynamics(mesh_data), - phi_(*mesh_data.getMeshVariable("Levelset")), - near_interface_id_(*mesh_data.getMeshVariable("NearInterfaceID")){}; + : BaseMeshLocalDynamics(mesh_data){}; virtual ~DiffuseLevelSetSign(){}; void update(const size_t &package_index); - - private: - MeshVariable &phi_; - MeshVariable &near_interface_id_; }; } // namespace SPH From c13593114258b8d26ff0d27de0ab2620b0583685 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Fri, 16 Aug 2024 23:07:41 +0200 Subject: [PATCH 24/55] temp --- .../meshes/mesh_local_dynamics_3d.cpp | 27 ++++++++++++++++++- src/shared/geometries/level_set.cpp | 9 +++++-- src/shared/geometries/level_set.h | 12 --------- src/shared/meshes/mesh_local_dynamics.h | 10 +++++++ src/shared/meshes/mesh_with_data_packages.h | 8 +++--- 5 files changed, 46 insertions(+), 20 deletions(-) diff --git a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp index bb90d293c1..ddb660ab92 100644 --- a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp +++ b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp @@ -150,7 +150,32 @@ Vecd UpdateKernelIntegrals::computeKernelGradientIntegral(const Vecd &position) //=============================================================================================// void ReinitializeLevelSet::update(const size_t &package_index) { - printf("this is the execution of DiffuseLevelSetSign\n"); + auto phi_data = phi_.DataField(); + auto &phi_addrs = phi_data[package_index]; + auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; + auto &neighborhood = mesh_data_.cell_neighborhood_[package_index]; + + mesh_data_.for_each_cell_data( + [&](int i, int j, int k) + { + // only reinitialize non cut cells + if (near_interface_id_addrs[i][j][k] != 0) + { + Real phi_0 = phi_addrs[i][j][k]; + Real sign = phi_0 / sqrt(phi_0 * phi_0 + data_spacing_ * data_spacing_); + using NeighbourIndex = std::pair; /**< stores shifted neighbour info: (size_t)package index, (arrayi)local grid index. */ + NeighbourIndex x1 = mesh_data_.NeighbourIndexShift(Arrayi(i + 1, j, k), neighborhood); + NeighbourIndex x2 = mesh_data_.NeighbourIndexShift(Arrayi(i - 1, j, k), neighborhood); + NeighbourIndex y1 = mesh_data_.NeighbourIndexShift(Arrayi(i, j + 1, k), neighborhood); + NeighbourIndex y2 = mesh_data_.NeighbourIndexShift(Arrayi(i, j - 1, k), neighborhood); + NeighbourIndex z1 = mesh_data_.NeighbourIndexShift(Arrayi(i, j, k + 1), neighborhood); + NeighbourIndex z2 = mesh_data_.NeighbourIndexShift(Arrayi(i, j, k - 1), neighborhood); + Real dv_x = upwindDifference(sign, phi_data[x1.first][x1.second[0]][x1.second[1]][x1.second[2]] - phi_0, phi_0 - phi_data[x2.first][x2.second[0]][x2.second[1]][x2.second[2]]); + Real dv_y = upwindDifference(sign, phi_data[y1.first][y1.second[0]][y1.second[1]][y1.second[2]] - phi_0, phi_0 - phi_data[y2.first][y2.second[0]][y2.second[1]][y2.second[2]]); + Real dv_z = upwindDifference(sign, phi_data[z1.first][z1.second[0]][z1.second[1]][z1.second[2]] - phi_0, phi_0 - phi_data[z2.first][z2.second[0]][z2.second[1]][z2.second[2]]); + phi_addrs[i][j][k] -= 0.3 * sign * (Vec3d(dv_x, dv_y, dv_z).norm() - data_spacing_); + } + }); } //=============================================================================================// void MarkNearInterface::update(const size_t &package_index) diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index 00545aab4b..a978384408 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -181,7 +181,6 @@ void RefinedLevelSet::initializeDataInACellFromCoarse(const Arrayi &cell_index) { Vecd cell_position = CellPositionFromIndex(cell_index); size_t package_index = coarse_mesh_.probeSignedDistance(cell_position) < 0.0 ? 0 : 1; - assignSingular(cell_index); assignDataPackageIndex(cell_index, package_index); if (coarse_mesh_.isWithinCorePackage(cell_position)) { @@ -190,7 +189,13 @@ void RefinedLevelSet::initializeDataInACellFromCoarse(const Arrayi &cell_index) Real measure = (signed_distance * normal_direction).cwiseAbs().maxCoeff(); if (measure < grid_spacing_) { - assignCore(cell_index); + // assignCore(cell_index); + std::pair occupied; + occupied.first = cell_index[0] * all_cells_[1] + cell_index[1]; + occupied.second = 1; + + mesh_data_.assignDataPackageIndex(cell_index, 2); + mesh_data_.registerOccupied(occupied); } } } diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index b905a3be07..f7d678ebc4 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -80,8 +80,6 @@ class LevelSet : public MeshWithGridDataPackages<4>, public BaseLevelSet { public: - // typedef GridDataPackage<4, 1> LevelSetDataPackage; - // ConcurrentVec core_data_pkgs_; /**< packages near to zero level set. */ Real global_h_ratio_; /** This constructor only initialize far field. */ @@ -100,8 +98,6 @@ class LevelSet : public MeshWithGridDataPackages<4>, virtual Vecd probeKernelGradientIntegral(const Vecd &position, Real h_ratio = 1.0) override; virtual void writeMeshFieldToPlt(std::ofstream &output_file) override; bool isWithinCorePackage(Vecd position); - // Real computeKernelIntegral(const Vecd &position); - // Vecd computeKernelGradientIntegral(const Vecd &position); Kernel &kernel_; protected: @@ -113,7 +109,6 @@ class LevelSet : public MeshWithGridDataPackages<4>, MeshWithGridDataPackages<4> &mesh_data_ = *this; void initializeDataForSingularPackage(const size_t package_index, Real far_field_level_set); - // void initializeBasicDataForAPackage(const Arrayi &cell_index, const size_t package_index, Shape &shape); void redistanceInterfaceForAPackage(const size_t package_index); void finishDataPackages(); @@ -121,13 +116,6 @@ class LevelSet : public MeshWithGridDataPackages<4>, void markNearInterface(Real small_shift_factor); void redistanceInterface(); void diffuseLevelSetSign(); - // void updateKernelIntegrals(); - // bool isInnerPackage(const Arrayi &cell_index); - // void initializeDataInACell(const Arrayi &cell_index); - // void tagACellIsInnerPackage(const Arrayi &cell_index); - // void initializeIndexMesh(); - // void initializeCellNeighborhood(); - // void updateLevelSetGradient(); MeshAllDynamics initialize_data_in_a_cell{mesh_data_, shape_}; MeshAllDynamics tag_a_cell_is_inner_package{mesh_data_}; diff --git a/src/shared/meshes/mesh_local_dynamics.h b/src/shared/meshes/mesh_local_dynamics.h index 2c12b56795..00fdb164d3 100644 --- a/src/shared/meshes/mesh_local_dynamics.h +++ b/src/shared/meshes/mesh_local_dynamics.h @@ -253,5 +253,15 @@ class DiffuseLevelSetSign : public BaseMeshLocalDynamics void update(const size_t &package_index); }; +// class InitializeDataInACellFromCoarse : public BaseMeshLocalDynamics +// { +// public: +// explicit InitializeDataInACellFromCoarse(MeshWithGridDataPackagesType &mesh_data) +// : BaseMeshLocalDynamics(mesh_data){}; +// virtual ~InitializeDataInACellFromCoarse(){}; + +// void update(const Arrayi &cell_index); +// } + } // namespace SPH #endif // MESH_LOCAL_DYNAMICS_H diff --git a/src/shared/meshes/mesh_with_data_packages.h b/src/shared/meshes/mesh_with_data_packages.h index ee0baead28..8ddbcdf6e8 100644 --- a/src/shared/meshes/mesh_with_data_packages.h +++ b/src/shared/meshes/mesh_with_data_packages.h @@ -135,8 +135,6 @@ class MeshWithGridDataPackages : public Mesh /** spacing between the data, which is 1/ pkg_size of this grid spacing */ virtual Real DataSpacing() override { return data_spacing_; }; Real GridSpacing() { return grid_spacing_; }; - // CellNeighborhood* getCellNeighborhood() { return cell_neighborhood_; }; - // std::pair* getMetaDataCell() { return meta_data_cell_; }; public: ConcurrentVec> occupied_data_pkgs_; /**< (size_t)sort_index, (int)core1/inner0. */ CellNeighborhood *cell_neighborhood_; /**< 3*3(*3) array to store indicies of neighborhood cells. */ @@ -222,9 +220,9 @@ class MeshWithGridDataPackages : public Mesh .min((pkg_size - 1) * Arrayi::Ones()); } - void assignSingular(const Arrayi &cell_index) { assignCategoryOnMetaDataMesh(cell_index, 0); }; - void assignInner(const Arrayi &cell_index) { assignCategoryOnMetaDataMesh(cell_index, 1); }; - void assignCore(const Arrayi &cell_index) { assignCategoryOnMetaDataMesh(cell_index, 2); }; + // void assignSingular(const Arrayi &cell_index) { assignCategoryOnMetaDataMesh(cell_index, 0); }; + // void assignInner(const Arrayi &cell_index) { assignCategoryOnMetaDataMesh(cell_index, 1); }; + // void assignCore(const Arrayi &cell_index) { assignCategoryOnMetaDataMesh(cell_index, 2); }; public: /** obtain averaged value at a corner of a data cell */ From 5c93c8c5e6add4edcdfe55ec4d223045264ebb95 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Sat, 17 Aug 2024 21:22:02 +0200 Subject: [PATCH 25/55] fix bug --- src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp index 5cc31e8203..0edb627a77 100644 --- a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp +++ b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp @@ -61,7 +61,7 @@ void InitializeBasicDataForAPackage::update(const size_t &package_index) { auto &phi = phi_.DataField()[package_index]; auto &near_interface_id = near_interface_id_.DataField()[package_index]; - Arrayi cell_index = CellIndexFromSortIndex(package_index); + Arrayi cell_index = mesh_data_.meta_data_cell_[package_index].first; mesh_data_.for_each_cell_data( [&](int i, int j) { From d7d451ea1f5385c31963f22b31904eed292fffff Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Sat, 17 Aug 2024 21:42:25 +0200 Subject: [PATCH 26/55] (3d)org/meshwithgriddatapackages --- .../meshes/mesh_with_data_packages.hpp | 33 +--------- .../meshes/mesh_with_data_packages.hpp | 33 +--------- src/shared/meshes/mesh_with_data_packages.h | 60 ++++--------------- 3 files changed, 17 insertions(+), 109 deletions(-) diff --git a/src/for_2D_build/meshes/mesh_with_data_packages.hpp b/src/for_2D_build/meshes/mesh_with_data_packages.hpp index 74ed7db24b..db06333b78 100644 --- a/src/for_2D_build/meshes/mesh_with_data_packages.hpp +++ b/src/for_2D_build/meshes/mesh_with_data_packages.hpp @@ -10,7 +10,6 @@ #include "mesh_with_data_packages.h" #include "mesh_iterators.hpp" -//=================================================================================================// namespace SPH { //=================================================================================================// @@ -46,18 +45,6 @@ void MeshWithGridDataPackages::deleteIndexDataMatrix() } //=================================================================================================// template -void MeshWithGridDataPackages::allocateCategoryDataMatrix() -{ - Allocate2dArray(category_data_mesh_, all_cells_); -} -//=================================================================================================// -template -void MeshWithGridDataPackages::deleteCategoryDataMatrix() -{ - Delete2dArray(category_data_mesh_, all_cells_); -} -//=================================================================================================// -template template DataType MeshWithGridDataPackages:: probeMesh(MeshVariable &mesh_variable, const Vecd &position) @@ -95,13 +82,6 @@ size_t MeshWithGridDataPackages:: } //=================================================================================================// template -void MeshWithGridDataPackages:: - assignCategoryOnMetaDataMesh(const Arrayi &cell_index, const int category) -{ - category_data_mesh_[cell_index[0]][cell_index[1]] = category; -} -//=================================================================================================// -template bool MeshWithGridDataPackages:: isSingularDataPackage(const Arrayi &cell_index) { @@ -116,16 +96,6 @@ bool MeshWithGridDataPackages:: } //=================================================================================================// template -bool MeshWithGridDataPackages:: - isCoreDataPackage(const Arrayi &cell_index) -{ - size_t package_index = PackageIndexFromCellIndex(cell_index); - return meta_data_cell_[package_index].second == 1; - - // return category_data_mesh_[cell_index[0]][cell_index[1]] == 2; -} -//=================================================================================================// -template std::pair MeshWithGridDataPackages:: NeighbourIndexShift(const Arrayi shift_index, const CellNeighborhood &neighbour) { @@ -229,8 +199,7 @@ DataType MeshWithGridDataPackages:: //=================================================================================================// template template -void MeshWithGridDataPackages:: - grid_parallel_for(const FunctionOnData &function) +void MeshWithGridDataPackages::grid_parallel_for(const FunctionOnData &function) { mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), [&](size_t i, size_t j) diff --git a/src/for_3D_build/meshes/mesh_with_data_packages.hpp b/src/for_3D_build/meshes/mesh_with_data_packages.hpp index 3324a5dd03..a69fe05e81 100644 --- a/src/for_3D_build/meshes/mesh_with_data_packages.hpp +++ b/src/for_3D_build/meshes/mesh_with_data_packages.hpp @@ -45,18 +45,6 @@ void MeshWithGridDataPackages::deleteIndexDataMatrix() } //=================================================================================================// template -void MeshWithGridDataPackages::allocateCategoryDataMatrix() -{ - Allocate3dArray(category_data_mesh_, all_cells_); -} -//=================================================================================================// -template -void MeshWithGridDataPackages::deleteCategoryDataMatrix() -{ - Delete3dArray(category_data_mesh_, all_cells_); -} -//=================================================================================================// -template template DataType MeshWithGridDataPackages:: probeMesh(MeshVariable &mesh_variable, const Vecd &position) @@ -95,31 +83,17 @@ size_t MeshWithGridDataPackages:: } //=================================================================================================// template -void MeshWithGridDataPackages:: - assignCategoryOnMetaDataMesh(const Arrayi &cell_index, const int category) -{ - category_data_mesh_[cell_index[0]][cell_index[1]][cell_index[2]] = category; -} -//=================================================================================================// -template bool MeshWithGridDataPackages:: isSingularDataPackage(const Arrayi &cell_index) { - return category_data_mesh_[cell_index[0]][cell_index[1]][cell_index[2]] == 0; + return index_data_mesh_[cell_index[0]][cell_index[1]][cell_index[2]] < 2; } //=================================================================================================// template bool MeshWithGridDataPackages:: isInnerDataPackage(const Arrayi &cell_index) { - return category_data_mesh_[cell_index[0]][cell_index[1]][cell_index[2]] != 0; -} -//=================================================================================================// -template -bool MeshWithGridDataPackages:: - isCoreDataPackage(const Arrayi &cell_index) -{ - return category_data_mesh_[cell_index[0]][cell_index[1]][cell_index[2]] == 2; + return index_data_mesh_[cell_index[0]][cell_index[1]][cell_index[2]] > 1; } //=================================================================================================// template @@ -240,8 +214,7 @@ DataType MeshWithGridDataPackages:: //=================================================================================================// template template -void MeshWithGridDataPackages:: - grid_parallel_for(const FunctionOnData &function) +void MeshWithGridDataPackages::grid_parallel_for(const FunctionOnData &function) { mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), [&](size_t i, size_t j, size_t k) diff --git a/src/shared/meshes/mesh_with_data_packages.h b/src/shared/meshes/mesh_with_data_packages.h index 8ddbcdf6e8..11b8b59893 100644 --- a/src/shared/meshes/mesh_with_data_packages.h +++ b/src/shared/meshes/mesh_with_data_packages.h @@ -41,31 +41,6 @@ using namespace std::placeholders; namespace SPH { -/** Iterator on a collection of mesh data packages. sequential computing. */ -template -void package_for(const ConcurrentVec &data_pkgs, - const LocalFunction &local_function, Args &&...args) -{ - for (size_t i = 0; i != data_pkgs.size(); ++i) - local_function(data_pkgs[i]); -}; -/** Iterator on a collection of mesh data packages. parallel computing. */ -// template -// void package_parallel_for(const ConcurrentVec &data_pkgs, -// const LocalFunction &local_function, Args &&...args) -// { -// parallel_for( -// IndexRange(0, data_pkgs.size()), -// [&](const IndexRange &r) -// { -// for (size_t i = r.begin(); i != r.end(); ++i) -// { -// local_function(data_pkgs[i]); -// } -// }, -// ap); -// }; - /** * @class BaseDataPackage * @brief Abstract base class for a data package, @@ -123,18 +98,17 @@ class MeshWithGridDataPackages : public Mesh global_mesh_(mesh_lower_bound_ + 0.5 * data_spacing * Vecd::Ones(), data_spacing, all_cells_ * pkg_size) { allocateIndexDataMatrix(); - allocateCategoryDataMatrix(); }; virtual ~MeshWithGridDataPackages() { deleteIndexDataMatrix(); - deleteCategoryDataMatrix(); delete[] cell_neighborhood_; delete[] meta_data_cell_; }; /** spacing between the data, which is 1/ pkg_size of this grid spacing */ virtual Real DataSpacing() override { return data_spacing_; }; Real GridSpacing() { return grid_spacing_; }; + public: ConcurrentVec> occupied_data_pkgs_; /**< (size_t)sort_index, (int)core1/inner0. */ CellNeighborhood *cell_neighborhood_; /**< 3*3(*3) array to store indicies of neighborhood cells. */ @@ -147,9 +121,7 @@ class MeshWithGridDataPackages : public Mesh BaseMesh global_mesh_; /**< the mesh for the locations of all possible data points. */ size_t num_grid_pkgs_ = 2; /**< the number of all distinct packages, initially only 2 singular packages. */ using MetaData = std::pair; /**< stores the metadata for each cell: (int)singular0/inner1/core2, (size_t)package data index*/ - MeshDataMatrix meta_data_mesh_; /**< metadata for all cells. */ MeshDataMatrix index_data_mesh_; /**< metadata for all cells. */ - MeshDataMatrix category_data_mesh_; /**< metadata for all cells. */ using NeighbourIndex = std::pair; /**< stores shifted neighbour info: (size_t)package index, (arrayi)local grid index. */ template using PackageData = PackageDataMatrix; @@ -159,8 +131,6 @@ class MeshWithGridDataPackages : public Mesh void allocateIndexDataMatrix(); /**< allocate memories for metadata of data packages. */ void deleteIndexDataMatrix(); /**< delete memories for metadata of data packages. */ - void allocateCategoryDataMatrix(); /**< allocate memories for metadata of data packages. */ - void deleteCategoryDataMatrix(); /**< delete memories for metadata of data packages. */ template MeshVariable *registerMeshVariable(const std::string &variable_name) @@ -177,8 +147,6 @@ class MeshWithGridDataPackages : public Mesh return variable; }; - - /** resize all mesh variable data field with `num_grid_pkgs_` size(initially only singular data) */ template struct ResizeMeshVariableData @@ -196,21 +164,17 @@ class MeshWithGridDataPackages : public Mesh }; DataAssembleOperation resize_mesh_variable_data_; - - void assignCategoryOnMetaDataMesh(const Arrayi &cell_index, const int category); - bool isSingularDataPackage(const Arrayi &cell_index); - bool isCoreDataPackage(const Arrayi &cell_index); - - /** probe by applying bi and tri-linear interpolation within the package. */ template DataType probeDataPackage(MeshVariable &mesh_variable, size_t package_index, const Arrayi &cell_index, const Vecd &position); + bool isSingularDataPackage(const Arrayi &cell_index); /** return the position of the lower bound data in a cell. */ Vecd DataLowerBoundInCell(const Arrayi &cell_index) { return CellLowerCorner(cell_index) + 0.5 * data_spacing_ * Vecd::Ones(); } + /** return the grid index from its position and the index of the cell it belongs to. */ Arrayi DataIndexFromPosition(const Arrayi &cell_index, const Vecd &position) { @@ -220,17 +184,16 @@ class MeshWithGridDataPackages : public Mesh .min((pkg_size - 1) * Arrayi::Ones()); } - // void assignSingular(const Arrayi &cell_index) { assignCategoryOnMetaDataMesh(cell_index, 0); }; - // void assignInner(const Arrayi &cell_index) { assignCategoryOnMetaDataMesh(cell_index, 1); }; - // void assignCore(const Arrayi &cell_index) { assignCategoryOnMetaDataMesh(cell_index, 2); }; - public: + std::pair NeighbourIndexShift(const Arrayi shift_index, const CellNeighborhood &neighbour); + bool isInnerDataPackage(const Arrayi &cell_index); + void assignDataPackageIndex(const Arrayi &cell_index, const size_t package_index); + size_t PackageIndexFromCellIndex(const Arrayi &cell_index); /** obtain averaged value at a corner of a data cell */ template DataType CornerAverage(MeshVariable &mesh_variable, Arrayi addrs_index, Arrayi corner_direction, CellNeighborhood &neighborhood); - std::pair NeighbourIndexShift(const Arrayi shift_index, const CellNeighborhood &neighbour); /** This function find the value of data from its index from global mesh. */ template DataType DataValueFromGlobalIndex(MeshVariable &mesh_variable, @@ -251,9 +214,6 @@ class MeshWithGridDataPackages : public Mesh /** void (non_value_returning) function iterate on all data points by value. */ template void for_each_cell_data(const FunctionOnData &function); - bool isInnerDataPackage(const Arrayi &cell_index); - void assignDataPackageIndex(const Arrayi &cell_index, const size_t package_index); - size_t PackageIndexFromCellIndex(const Arrayi &cell_index); template void grid_parallel_for(const FunctionOnData &function); void resizeMeshVariableData() @@ -302,6 +262,12 @@ class MeshWithGridDataPackages : public Mesh { return global_mesh_.GridPositionFromIndex(cell_index); } + + bool isCoreDataPackage(const Arrayi &cell_index) + { + size_t package_index = PackageIndexFromCellIndex(cell_index); + return meta_data_cell_[package_index].second == 1; + } }; } // namespace SPH #endif // MESH_WITH_DATA_PACKAGES_H From d5f1b00e9ea83032eed3e3a28af90e8ebfd19cf5 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Sat, 17 Aug 2024 21:54:05 +0200 Subject: [PATCH 27/55] (3d)org/levelset --- src/for_2D_build/geometries/level_set_2d.cpp | 2 +- src/for_3D_build/geometries/level_set_3d.cpp | 13 ------------- src/shared/geometries/level_set.cpp | 2 -- 3 files changed, 1 insertion(+), 16 deletions(-) diff --git a/src/for_2D_build/geometries/level_set_2d.cpp b/src/for_2D_build/geometries/level_set_2d.cpp index ec4dc8ca16..3c111b5dea 100644 --- a/src/for_2D_build/geometries/level_set_2d.cpp +++ b/src/for_2D_build/geometries/level_set_2d.cpp @@ -32,7 +32,7 @@ void LevelSet::initializeDataForSingularPackage(const size_t package_index, Real bool LevelSet::isWithinCorePackage(Vecd position) { Arrayi cell_index = CellIndexFromPosition(position); - return isInnerDataPackage(cell_index); + return isCoreDataPackage(cell_index); } //=================================================================================================// void LevelSet::diffuseLevelSetSign() diff --git a/src/for_3D_build/geometries/level_set_3d.cpp b/src/for_3D_build/geometries/level_set_3d.cpp index 5a20a00b57..2930471c45 100644 --- a/src/for_3D_build/geometries/level_set_3d.cpp +++ b/src/for_3D_build/geometries/level_set_3d.cpp @@ -156,19 +156,6 @@ void LevelSet::markNearInterface(Real small_shift_factor) }); } //=================================================================================================// -// void LevelSet::initializeBasicDataForAPackage(const Arrayi &cell_index, const size_t package_index, Shape &shape) -// { -// auto &phi = phi_.DataField()[package_index]; -// auto &near_interface_id = near_interface_id_.DataField()[package_index]; -// for_each_cell_data( -// [&](int i, int j, int k) -// { -// Vec3d position = DataPositionFromIndex(cell_index, Array3i(i, j, k)); -// phi[i][j][k] = shape.findSignedDistance(position); -// near_interface_id[i][j][k] = phi[i][j][k] < 0.0 ? -2 : 2; -// }); -// } -//=================================================================================================// void LevelSet::redistanceInterfaceForAPackage(const size_t package_index) { auto phi_data = phi_.DataField(); diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index a978384408..53e3126d6d 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -47,7 +47,6 @@ LevelSet::LevelSet(BoundingBox tentative_bounds, Real data_spacing, : LevelSet(tentative_bounds, data_spacing, 4, shape, sph_adaptation) { initialize_data_in_a_cell.exec(); - finishDataPackages(); } //=================================================================================================// @@ -189,7 +188,6 @@ void RefinedLevelSet::initializeDataInACellFromCoarse(const Arrayi &cell_index) Real measure = (signed_distance * normal_direction).cwiseAbs().maxCoeff(); if (measure < grid_spacing_) { - // assignCore(cell_index); std::pair occupied; occupied.first = cell_index[0] * all_cells_[1] + cell_index[1]; occupied.second = 1; From 9627b04f803cebf1c6d70bc8682614629042981c Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Sun, 18 Aug 2024 00:54:01 +0200 Subject: [PATCH 28/55] temp --- src/shared/geometries/level_set.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index 53e3126d6d..8e15ef78d8 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -190,6 +190,7 @@ void RefinedLevelSet::initializeDataInACellFromCoarse(const Arrayi &cell_index) { std::pair occupied; occupied.first = cell_index[0] * all_cells_[1] + cell_index[1]; + occupied.first = cell_index[0] * all_cells_[1] * all_cells_[2] + cell_index[1] * all_cells_[2] + cell_index[2]; occupied.second = 1; mesh_data_.assignDataPackageIndex(cell_index, 2); From 267e5d3b029695b1c87e46711619e6e1941fb718 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Sun, 18 Aug 2024 15:14:14 +0200 Subject: [PATCH 29/55] fix bug 3d --- src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp index ddb660ab92..c8a904b29c 100644 --- a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp +++ b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp @@ -66,7 +66,7 @@ void InitializeBasicDataForAPackage::update(const size_t &package_index) { auto &phi = phi_.DataField()[package_index]; auto &near_interface_id = near_interface_id_.DataField()[package_index]; - Arrayi cell_index = CellIndexFromSortIndex(package_index); + Arrayi cell_index = mesh_data_.meta_data_cell_[package_index].first; mesh_data_.for_each_cell_data( [&](int i, int j, int k) { From bf3222703d73a1ab55247afa29d2ace513356dc8 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Sun, 18 Aug 2024 16:21:14 +0200 Subject: [PATCH 30/55] 3d wrap --- src/for_3D_build/geometries/level_set_3d.cpp | 212 +++++++++--------- .../meshes/mesh_local_dynamics_3d.cpp | 73 +++++- src/shared/geometries/level_set.cpp | 10 +- src/shared/meshes/mesh_with_data_packages.h | 12 + 4 files changed, 192 insertions(+), 115 deletions(-) diff --git a/src/for_3D_build/geometries/level_set_3d.cpp b/src/for_3D_build/geometries/level_set_3d.cpp index 2930471c45..b25b7102d1 100644 --- a/src/for_3D_build/geometries/level_set_3d.cpp +++ b/src/for_3D_build/geometries/level_set_3d.cpp @@ -37,123 +37,127 @@ bool LevelSet::isWithinCorePackage(Vecd position) //=============================================================================================// void LevelSet::diffuseLevelSetSign() { - package_parallel_for( - [&](size_t package_index) - { - auto phi_data = phi_.DataField(); - auto near_interface_id_data = near_interface_id_.DataField(); - auto &neighborhood = cell_neighborhood_[package_index]; + diffuse_level_set_sign.exec(); + // package_parallel_for( + // [&](size_t package_index) + // { + // auto phi_data = phi_.DataField(); + // auto near_interface_id_data = near_interface_id_.DataField(); + // auto &neighborhood = cell_neighborhood_[package_index]; - for_each_cell_data( - [&](int i, int j, int k) - { - // near interface cells are not considered - if (abs(near_interface_id_data[package_index][i][j][k]) > 1) - { - mesh_find_if3d<-1, 2>( - [&](int l, int m, int n) -> bool - { - NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i + l, j + m, k + n), neighborhood); - int near_interface_id = near_interface_id_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; - bool is_found = abs(near_interface_id) == 1; - if (is_found) - { - Real phi_0 = phi_data[package_index][i][j][k]; - near_interface_id_data[package_index][i][j][k] = near_interface_id; - phi_data[package_index][i][j][k] = near_interface_id == 1 ? fabs(phi_0) : -fabs(phi_0); - } - return is_found; - }); - } - }); - }); + // for_each_cell_data( + // [&](int i, int j, int k) + // { + // // near interface cells are not considered + // if (abs(near_interface_id_data[package_index][i][j][k]) > 1) + // { + // mesh_find_if3d<-1, 2>( + // [&](int l, int m, int n) -> bool + // { + // NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i + l, j + m, k + n), neighborhood); + // int near_interface_id = near_interface_id_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; + // bool is_found = abs(near_interface_id) == 1; + // if (is_found) + // { + // Real phi_0 = phi_data[package_index][i][j][k]; + // near_interface_id_data[package_index][i][j][k] = near_interface_id; + // phi_data[package_index][i][j][k] = near_interface_id == 1 ? fabs(phi_0) : -fabs(phi_0); + // } + // return is_found; + // }); + // } + // }); + // }); } //=============================================================================================// void LevelSet::reinitializeLevelSet() { - package_parallel_for( - [&](size_t package_index) - { - auto phi_data = phi_.DataField(); - auto &phi_addrs = phi_data[package_index]; - auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; - auto &neighborhood = cell_neighborhood_[package_index]; + reinitialize_level_set.exec(); + // package_parallel_for( + // [&](size_t package_index) + // { + // auto phi_data = phi_.DataField(); + // auto &phi_addrs = phi_data[package_index]; + // auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; + // auto &neighborhood = cell_neighborhood_[package_index]; - for_each_cell_data( - [&](int i, int j, int k) - { - // only reinitialize non cut cells - if (near_interface_id_addrs[i][j][k] != 0) - { - Real phi_0 = phi_addrs[i][j][k]; - Real sign = phi_0 / sqrt(phi_0 * phi_0 + data_spacing_ * data_spacing_); - NeighbourIndex x1 = NeighbourIndexShift(Arrayi(i + 1, j, k), neighborhood); - NeighbourIndex x2 = NeighbourIndexShift(Arrayi(i - 1, j, k), neighborhood); - NeighbourIndex y1 = NeighbourIndexShift(Arrayi(i, j + 1, k), neighborhood); - NeighbourIndex y2 = NeighbourIndexShift(Arrayi(i, j - 1, k), neighborhood); - NeighbourIndex z1 = NeighbourIndexShift(Arrayi(i, j, k + 1), neighborhood); - NeighbourIndex z2 = NeighbourIndexShift(Arrayi(i, j, k - 1), neighborhood); - Real dv_x = upwindDifference(sign, phi_data[x1.first][x1.second[0]][x1.second[1]][x1.second[2]] - phi_0, phi_0 - phi_data[x2.first][x2.second[0]][x2.second[1]][x2.second[2]]); - Real dv_y = upwindDifference(sign, phi_data[y1.first][y1.second[0]][y1.second[1]][y1.second[2]] - phi_0, phi_0 - phi_data[y2.first][y2.second[0]][y2.second[1]][y2.second[2]]); - Real dv_z = upwindDifference(sign, phi_data[z1.first][z1.second[0]][z1.second[1]][z1.second[2]] - phi_0, phi_0 - phi_data[z2.first][z2.second[0]][z2.second[1]][z2.second[2]]); - phi_addrs[i][j][k] -= 0.3 * sign * (Vec3d(dv_x, dv_y, dv_z).norm() - data_spacing_); - } - }); - }); + // for_each_cell_data( + // [&](int i, int j, int k) + // { + // // only reinitialize non cut cells + // if (near_interface_id_addrs[i][j][k] != 0) + // { + // Real phi_0 = phi_addrs[i][j][k]; + // Real sign = phi_0 / sqrt(phi_0 * phi_0 + data_spacing_ * data_spacing_); + // NeighbourIndex x1 = NeighbourIndexShift(Arrayi(i + 1, j, k), neighborhood); + // NeighbourIndex x2 = NeighbourIndexShift(Arrayi(i - 1, j, k), neighborhood); + // NeighbourIndex y1 = NeighbourIndexShift(Arrayi(i, j + 1, k), neighborhood); + // NeighbourIndex y2 = NeighbourIndexShift(Arrayi(i, j - 1, k), neighborhood); + // NeighbourIndex z1 = NeighbourIndexShift(Arrayi(i, j, k + 1), neighborhood); + // NeighbourIndex z2 = NeighbourIndexShift(Arrayi(i, j, k - 1), neighborhood); + // Real dv_x = upwindDifference(sign, phi_data[x1.first][x1.second[0]][x1.second[1]][x1.second[2]] - phi_0, phi_0 - phi_data[x2.first][x2.second[0]][x2.second[1]][x2.second[2]]); + // Real dv_y = upwindDifference(sign, phi_data[y1.first][y1.second[0]][y1.second[1]][y1.second[2]] - phi_0, phi_0 - phi_data[y2.first][y2.second[0]][y2.second[1]][y2.second[2]]); + // Real dv_z = upwindDifference(sign, phi_data[z1.first][z1.second[0]][z1.second[1]][z1.second[2]] - phi_0, phi_0 - phi_data[z2.first][z2.second[0]][z2.second[1]][z2.second[2]]); + // phi_addrs[i][j][k] -= 0.3 * sign * (Vec3d(dv_x, dv_y, dv_z).norm() - data_spacing_); + // } + // }); + // }); } //=================================================================================================// void LevelSet::markNearInterface(Real small_shift_factor) { - Real small_shift = small_shift_factor * data_spacing_; + // Real small_shift = small_shift_factor * data_spacing_; + mark_near_interface.setSmallShiftFactor(small_shift_factor); + mark_near_interface.exec(); - package_parallel_for( - [&](size_t package_index) - { - auto &phi_addrs = phi_.DataField()[package_index]; - auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; - auto neighborhood = cell_neighborhood_[package_index]; + // package_parallel_for( + // [&](size_t package_index) + // { + // auto &phi_addrs = phi_.DataField()[package_index]; + // auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; + // auto neighborhood = cell_neighborhood_[package_index]; - // corner averages, note that the first row and first column are not used - PackageTemporaryData corner_averages; - mesh_for_each3d<0, pkg_size + 1>( - [&](int i, int j, int k) - { - corner_averages[i][j][k] = CornerAverage(phi_, Arrayi(i, j, k), Arrayi(-1, -1, -1), neighborhood); - }); + // // corner averages, note that the first row and first column are not used + // PackageTemporaryData corner_averages; + // mesh_for_each3d<0, pkg_size + 1>( + // [&](int i, int j, int k) + // { + // corner_averages[i][j][k] = CornerAverage(phi_, Arrayi(i, j, k), Arrayi(-1, -1, -1), neighborhood); + // }); - for_each_cell_data( - [&](int i, int j, int k) - { - // first assume far cells - Real phi_0 = phi_addrs[i][j][k]; - int near_interface_id = phi_0 > 0.0 ? 2 : -2; - if (fabs(phi_0) < small_shift) - { - near_interface_id = 0; - Real phi_average_0 = corner_averages[i][j][k]; - // find inner and outer cut cells - mesh_for_each3d<0, 2>( - [&](int l, int m, int n) - { - Real phi_average = corner_averages[i + l][j + m][k + n]; - if ((phi_average_0 - small_shift) * (phi_average - small_shift) < 0.0) - near_interface_id = 1; - if ((phi_average_0 + small_shift) * (phi_average + small_shift) < 0.0) - near_interface_id = -1; - }); - // find zero cut cells - mesh_for_each3d<0, 2>( - [&](int l, int m, int n) - { - Real phi_average = corner_averages[i + l][j + m][k + n]; - if (phi_average_0 * phi_average < 0.0) - near_interface_id = 0; - }); - } - // assign this is to package - near_interface_id_addrs[i][j][k] = near_interface_id; - }); - }); + // for_each_cell_data( + // [&](int i, int j, int k) + // { + // // first assume far cells + // Real phi_0 = phi_addrs[i][j][k]; + // int near_interface_id = phi_0 > 0.0 ? 2 : -2; + // if (fabs(phi_0) < small_shift) + // { + // near_interface_id = 0; + // Real phi_average_0 = corner_averages[i][j][k]; + // // find inner and outer cut cells + // mesh_for_each3d<0, 2>( + // [&](int l, int m, int n) + // { + // Real phi_average = corner_averages[i + l][j + m][k + n]; + // if ((phi_average_0 - small_shift) * (phi_average - small_shift) < 0.0) + // near_interface_id = 1; + // if ((phi_average_0 + small_shift) * (phi_average + small_shift) < 0.0) + // near_interface_id = -1; + // }); + // // find zero cut cells + // mesh_for_each3d<0, 2>( + // [&](int l, int m, int n) + // { + // Real phi_average = corner_averages[i + l][j + m][k + n]; + // if (phi_average_0 * phi_average < 0.0) + // near_interface_id = 0; + // }); + // } + // // assign this is to package + // near_interface_id_addrs[i][j][k] = near_interface_id; + // }); + // }); } //=================================================================================================// void LevelSet::redistanceInterfaceForAPackage(const size_t package_index) diff --git a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp index c8a904b29c..caca7d67b6 100644 --- a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp +++ b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp @@ -180,7 +180,50 @@ void ReinitializeLevelSet::update(const size_t &package_index) //=============================================================================================// void MarkNearInterface::update(const size_t &package_index) { - printf("this is the execution of DiffuseLevelSetSign\n"); + auto &phi_addrs = phi_.DataField()[package_index]; + auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; + auto neighborhood = mesh_data_.cell_neighborhood_[package_index]; + + // corner averages, note that the first row and first column are not used + PackageDataMatrix corner_averages; + mesh_for_each3d<0, 5>( + [&](int i, int j, int k) + { + corner_averages[i][j][k] = mesh_data_.CornerAverage(phi_, Arrayi(i, j, k), Arrayi(-1, -1, -1), neighborhood); + }); + + mesh_data_.for_each_cell_data( + [&](int i, int j, int k) + { + // first assume far cells + Real phi_0 = phi_addrs[i][j][k]; + int near_interface_id = phi_0 > 0.0 ? 2 : -2; + if (fabs(phi_0) < small_shift) + { + near_interface_id = 0; + Real phi_average_0 = corner_averages[i][j][k]; + // find inner and outer cut cells + mesh_for_each3d<0, 2>( + [&](int l, int m, int n) + { + Real phi_average = corner_averages[i + l][j + m][k + n]; + if ((phi_average_0 - small_shift) * (phi_average - small_shift) < 0.0) + near_interface_id = 1; + if ((phi_average_0 + small_shift) * (phi_average + small_shift) < 0.0) + near_interface_id = -1; + }); + // find zero cut cells + mesh_for_each3d<0, 2>( + [&](int l, int m, int n) + { + Real phi_average = corner_averages[i + l][j + m][k + n]; + if (phi_average_0 * phi_average < 0.0) + near_interface_id = 0; + }); + } + // assign this is to package + near_interface_id_addrs[i][j][k] = near_interface_id; + }); } //=============================================================================================// void RedistanceInterface::update(const size_t &package_index) @@ -190,7 +233,33 @@ void RedistanceInterface::update(const size_t &package_index) //=============================================================================================// void DiffuseLevelSetSign::update(const size_t &package_index) { - printf("this is the execution of DiffuseLevelSetSign\n"); + auto phi_data = phi_.DataField(); + auto near_interface_id_data = near_interface_id_.DataField(); + auto &neighborhood = mesh_data_.cell_neighborhood_[package_index]; + + mesh_data_.for_each_cell_data( + [&](int i, int j, int k) + { + // near interface cells are not considered + if (abs(near_interface_id_data[package_index][i][j][k]) > 1) + { + mesh_find_if3d<-1, 2>( + [&](int l, int m, int n) -> bool + { + using NeighbourIndex = std::pair; /**< stores shifted neighbour info: (size_t)package index, (arrayi)local grid index. */ + NeighbourIndex neighbour_index = mesh_data_.NeighbourIndexShift(Arrayi(i + l, j + m, k + n), neighborhood); + int near_interface_id = near_interface_id_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; + bool is_found = abs(near_interface_id) == 1; + if (is_found) + { + Real phi_0 = phi_data[package_index][i][j][k]; + near_interface_id_data[package_index][i][j][k] = near_interface_id; + phi_data[package_index][i][j][k] = near_interface_id == 1 ? fabs(phi_0) : -fabs(phi_0); + } + return is_found; + }); + } + }); } //=============================================================================================// } // namespace SPH diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index 8e15ef78d8..f33c2cd214 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -2,7 +2,6 @@ #include "adaptation.h" #include "base_kernel.h" -#include "tbb/parallel_sort.h" namespace SPH { @@ -54,14 +53,7 @@ void LevelSet::finishDataPackages() { tag_a_cell_is_inner_package.exec(); - parallel_sort(occupied_data_pkgs_.begin(), occupied_data_pkgs_.end(), - [](const std::pair& a, const std::pair& b) - { - return a.first < b.first; - }); - num_grid_pkgs_ = occupied_data_pkgs_.size() + 2; - cell_neighborhood_ = new CellNeighborhood[num_grid_pkgs_]; - meta_data_cell_ = new std::pair[num_grid_pkgs_]; + mesh_data_.organizeOccupiedPackages(); initialize_index_mesh.exec(); initialize_cell_neighborhood.exec(); resizeMeshVariableData(); diff --git a/src/shared/meshes/mesh_with_data_packages.h b/src/shared/meshes/mesh_with_data_packages.h index 11b8b59893..fb91d21ad5 100644 --- a/src/shared/meshes/mesh_with_data_packages.h +++ b/src/shared/meshes/mesh_with_data_packages.h @@ -32,6 +32,7 @@ #include "base_mesh.h" #include "base_variable.h" #include "my_memory_pool.h" +#include "tbb/parallel_sort.h" #include #include @@ -268,6 +269,17 @@ class MeshWithGridDataPackages : public Mesh size_t package_index = PackageIndexFromCellIndex(cell_index); return meta_data_cell_[package_index].second == 1; } + + void organizeOccupiedPackages(){ + parallel_sort(occupied_data_pkgs_.begin(), occupied_data_pkgs_.end(), + [](const std::pair& a, const std::pair& b) + { + return a.first < b.first; + }); + num_grid_pkgs_ = occupied_data_pkgs_.size() + 2; + cell_neighborhood_ = new CellNeighborhood[num_grid_pkgs_]; + meta_data_cell_ = new std::pair[num_grid_pkgs_]; + } }; } // namespace SPH #endif // MESH_WITH_DATA_PACKAGES_H From dc79ef6be465cbc30984ec356cee210012d28f3c Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Sun, 18 Aug 2024 16:30:02 +0200 Subject: [PATCH 31/55] clean --- src/for_2D_build/geometries/level_set_2d.cpp | 123 ------------------ src/for_3D_build/geometries/level_set_3d.cpp | 125 ------------------- src/shared/geometries/level_set.cpp | 10 +- src/shared/geometries/level_set.h | 3 - 4 files changed, 6 insertions(+), 255 deletions(-) diff --git a/src/for_2D_build/geometries/level_set_2d.cpp b/src/for_2D_build/geometries/level_set_2d.cpp index 3c111b5dea..a92a8e452b 100644 --- a/src/for_2D_build/geometries/level_set_2d.cpp +++ b/src/for_2D_build/geometries/level_set_2d.cpp @@ -35,129 +35,6 @@ bool LevelSet::isWithinCorePackage(Vecd position) return isCoreDataPackage(cell_index); } //=================================================================================================// -void LevelSet::diffuseLevelSetSign() -{ - diffuse_level_set_sign.exec(); - // package_parallel_for( - // [&](size_t package_index) - // { - // auto phi_data = phi_.DataField(); - // auto near_interface_id_data = near_interface_id_.DataField(); - // auto &neighborhood = cell_neighborhood_[package_index]; - - // for_each_cell_data( - // [&](int i, int j) - // { - // // near interface cells are not considered - // if (abs(near_interface_id_data[package_index][i][j]) > 1) - // { - // mesh_find_if2d<-1, 2>( - // [&](int l, int m) -> bool - // { - // NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i + l, j + m), neighborhood); - // int near_interface_id = near_interface_id_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]]; - // bool is_found = abs(near_interface_id) == 1; - // if (is_found) - // { - // Real phi_0 = phi_data[package_index][i][j]; - // near_interface_id_data[package_index][i][j] = near_interface_id; - // phi_data[package_index][i][j] = near_interface_id == 1 ? fabs(phi_0) : -fabs(phi_0); - // } - // return is_found; - // }); - // } - // }); - // }); -} -//=============================================================================================// -void LevelSet::reinitializeLevelSet() -{ - reinitialize_level_set.exec(); - // package_parallel_for( - // [&](size_t package_index) - // { - // auto phi_data = phi_.DataField(); - // auto &phi_addrs = phi_data[package_index]; - // auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; - // auto &neighborhood = cell_neighborhood_[package_index]; - - // for_each_cell_data( - // [&](int i, int j) - // { - // // only reinitialize non cut cells - // if (near_interface_id_addrs[i][j] != 0) - // { - // Real phi_0 = phi_addrs[i][j]; - // Real sign = phi_0 / sqrt(phi_0 * phi_0 + data_spacing_ * data_spacing_); - // NeighbourIndex x1 = NeighbourIndexShift(Arrayi(i + 1, j), neighborhood); - // NeighbourIndex x2 = NeighbourIndexShift(Arrayi(i - 1, j), neighborhood); - // NeighbourIndex y1 = NeighbourIndexShift(Arrayi(i, j + 1), neighborhood); - // NeighbourIndex y2 = NeighbourIndexShift(Arrayi(i, j - 1), neighborhood); - // Real dv_x = upwindDifference(sign, phi_data[x1.first][x1.second[0]][x1.second[1]] - phi_0, - // phi_0 - phi_data[x2.first][x2.second[0]][x2.second[1]]); - // Real dv_y = upwindDifference(sign, phi_data[y1.first][y1.second[0]][y1.second[1]] - phi_0, - // phi_0 - phi_data[y2.first][y2.second[0]][y2.second[1]]); - // phi_addrs[i][j] -= 0.5 * sign * (Vec2d(dv_x, dv_y).norm() - data_spacing_); - // } - // }); - // }); -} -//=================================================================================================// -void LevelSet::markNearInterface(Real small_shift_factor) -{ - // Real small_shift = small_shift_factor * data_spacing_; - mark_near_interface.setSmallShiftFactor(small_shift_factor); - mark_near_interface.exec(); - // package_parallel_for( - // [&](size_t package_index) - // { - // auto &phi_addrs = phi_.DataField()[package_index]; - // auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; - // auto neighborhood = cell_neighborhood_[package_index]; - - // // corner averages, note that the first row and first column are not used - // PackageTemporaryData corner_averages; - // mesh_for_each2d<0, pkg_size + 1>( - // [&](int i, int j) - // { - // corner_averages[i][j] = CornerAverage(phi_, Arrayi(i, j), Arrayi(-1, -1), neighborhood); - // }); - - // for_each_cell_data( - // [&](int i, int j) - // { - // // first assume far cells - // Real phi_0 = phi_addrs[i][j]; - // int near_interface_id = phi_0 > 0.0 ? 2 : -2; - // if (fabs(phi_0) < small_shift) - // { - // near_interface_id = 0; - // Real phi_average_0 = corner_averages[i][j]; - // // find outer cut cells by comparing the sign of corner averages - // mesh_for_each2d<0, 2>( - // [&](int l, int m) - // { - // Real phi_average = corner_averages[i + l][j + m]; - // if ((phi_average_0 - small_shift) * (phi_average - small_shift) < 0.0) - // near_interface_id = 1; - // if ((phi_average_0 + small_shift) * (phi_average + small_shift) < 0.0) - // near_interface_id = -1; - // }); - // // find zero cut cells by comparing the sign of corner averages - // mesh_for_each2d<0, 2>( - // [&](int l, int m) - // { - // Real phi_average = corner_averages[i + l][j + m]; - // if (phi_average_0 * phi_average < 0.0) - // near_interface_id = 0; - // }); - // } - // // assign this to package - // near_interface_id_addrs[i][j] = near_interface_id; - // }); - // }); -} -//=================================================================================================// void LevelSet::redistanceInterfaceForAPackage(const size_t package_index) { auto phi_data = phi_.DataField(); diff --git a/src/for_3D_build/geometries/level_set_3d.cpp b/src/for_3D_build/geometries/level_set_3d.cpp index b25b7102d1..fa26349588 100644 --- a/src/for_3D_build/geometries/level_set_3d.cpp +++ b/src/for_3D_build/geometries/level_set_3d.cpp @@ -34,131 +34,6 @@ bool LevelSet::isWithinCorePackage(Vecd position) Arrayi cell_index = CellIndexFromPosition(position); return isCoreDataPackage(cell_index); } -//=============================================================================================// -void LevelSet::diffuseLevelSetSign() -{ - diffuse_level_set_sign.exec(); - // package_parallel_for( - // [&](size_t package_index) - // { - // auto phi_data = phi_.DataField(); - // auto near_interface_id_data = near_interface_id_.DataField(); - // auto &neighborhood = cell_neighborhood_[package_index]; - - // for_each_cell_data( - // [&](int i, int j, int k) - // { - // // near interface cells are not considered - // if (abs(near_interface_id_data[package_index][i][j][k]) > 1) - // { - // mesh_find_if3d<-1, 2>( - // [&](int l, int m, int n) -> bool - // { - // NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i + l, j + m, k + n), neighborhood); - // int near_interface_id = near_interface_id_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; - // bool is_found = abs(near_interface_id) == 1; - // if (is_found) - // { - // Real phi_0 = phi_data[package_index][i][j][k]; - // near_interface_id_data[package_index][i][j][k] = near_interface_id; - // phi_data[package_index][i][j][k] = near_interface_id == 1 ? fabs(phi_0) : -fabs(phi_0); - // } - // return is_found; - // }); - // } - // }); - // }); -} -//=============================================================================================// -void LevelSet::reinitializeLevelSet() -{ - reinitialize_level_set.exec(); - // package_parallel_for( - // [&](size_t package_index) - // { - // auto phi_data = phi_.DataField(); - // auto &phi_addrs = phi_data[package_index]; - // auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; - // auto &neighborhood = cell_neighborhood_[package_index]; - - // for_each_cell_data( - // [&](int i, int j, int k) - // { - // // only reinitialize non cut cells - // if (near_interface_id_addrs[i][j][k] != 0) - // { - // Real phi_0 = phi_addrs[i][j][k]; - // Real sign = phi_0 / sqrt(phi_0 * phi_0 + data_spacing_ * data_spacing_); - // NeighbourIndex x1 = NeighbourIndexShift(Arrayi(i + 1, j, k), neighborhood); - // NeighbourIndex x2 = NeighbourIndexShift(Arrayi(i - 1, j, k), neighborhood); - // NeighbourIndex y1 = NeighbourIndexShift(Arrayi(i, j + 1, k), neighborhood); - // NeighbourIndex y2 = NeighbourIndexShift(Arrayi(i, j - 1, k), neighborhood); - // NeighbourIndex z1 = NeighbourIndexShift(Arrayi(i, j, k + 1), neighborhood); - // NeighbourIndex z2 = NeighbourIndexShift(Arrayi(i, j, k - 1), neighborhood); - // Real dv_x = upwindDifference(sign, phi_data[x1.first][x1.second[0]][x1.second[1]][x1.second[2]] - phi_0, phi_0 - phi_data[x2.first][x2.second[0]][x2.second[1]][x2.second[2]]); - // Real dv_y = upwindDifference(sign, phi_data[y1.first][y1.second[0]][y1.second[1]][y1.second[2]] - phi_0, phi_0 - phi_data[y2.first][y2.second[0]][y2.second[1]][y2.second[2]]); - // Real dv_z = upwindDifference(sign, phi_data[z1.first][z1.second[0]][z1.second[1]][z1.second[2]] - phi_0, phi_0 - phi_data[z2.first][z2.second[0]][z2.second[1]][z2.second[2]]); - // phi_addrs[i][j][k] -= 0.3 * sign * (Vec3d(dv_x, dv_y, dv_z).norm() - data_spacing_); - // } - // }); - // }); -} -//=================================================================================================// -void LevelSet::markNearInterface(Real small_shift_factor) -{ - // Real small_shift = small_shift_factor * data_spacing_; - mark_near_interface.setSmallShiftFactor(small_shift_factor); - mark_near_interface.exec(); - - // package_parallel_for( - // [&](size_t package_index) - // { - // auto &phi_addrs = phi_.DataField()[package_index]; - // auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; - // auto neighborhood = cell_neighborhood_[package_index]; - - // // corner averages, note that the first row and first column are not used - // PackageTemporaryData corner_averages; - // mesh_for_each3d<0, pkg_size + 1>( - // [&](int i, int j, int k) - // { - // corner_averages[i][j][k] = CornerAverage(phi_, Arrayi(i, j, k), Arrayi(-1, -1, -1), neighborhood); - // }); - - // for_each_cell_data( - // [&](int i, int j, int k) - // { - // // first assume far cells - // Real phi_0 = phi_addrs[i][j][k]; - // int near_interface_id = phi_0 > 0.0 ? 2 : -2; - // if (fabs(phi_0) < small_shift) - // { - // near_interface_id = 0; - // Real phi_average_0 = corner_averages[i][j][k]; - // // find inner and outer cut cells - // mesh_for_each3d<0, 2>( - // [&](int l, int m, int n) - // { - // Real phi_average = corner_averages[i + l][j + m][k + n]; - // if ((phi_average_0 - small_shift) * (phi_average - small_shift) < 0.0) - // near_interface_id = 1; - // if ((phi_average_0 + small_shift) * (phi_average + small_shift) < 0.0) - // near_interface_id = -1; - // }); - // // find zero cut cells - // mesh_for_each3d<0, 2>( - // [&](int l, int m, int n) - // { - // Real phi_average = corner_averages[i + l][j + m][k + n]; - // if (phi_average_0 * phi_average < 0.0) - // near_interface_id = 0; - // }); - // } - // // assign this is to package - // near_interface_id_addrs[i][j][k] = near_interface_id; - // }); - // }); -} //=================================================================================================// void LevelSet::redistanceInterfaceForAPackage(const size_t package_index) { diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index f33c2cd214..f0baeebc18 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -118,18 +118,20 @@ void LevelSet::redistanceInterface() //=================================================================================================// void LevelSet::cleanInterface(Real small_shift_factor) { - markNearInterface(small_shift_factor); + mark_near_interface.setSmallShiftFactor(small_shift_factor); + mark_near_interface.exec(); redistanceInterface(); - reinitializeLevelSet(); + reinitialize_level_set.exec(); update_level_set_gradient.exec(); update_kernel_integrals.exec(); } //=============================================================================================// void LevelSet::correctTopology(Real small_shift_factor) { - markNearInterface(small_shift_factor); + mark_near_interface.setSmallShiftFactor(small_shift_factor); + mark_near_interface.exec(); for (size_t i = 0; i != 10; ++i) - diffuseLevelSetSign(); + diffuse_level_set_sign.exec(); update_level_set_gradient.exec(); update_kernel_integrals.exec(); } diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index f7d678ebc4..7d83ded5c3 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -112,10 +112,7 @@ class LevelSet : public MeshWithGridDataPackages<4>, void redistanceInterfaceForAPackage(const size_t package_index); void finishDataPackages(); - void reinitializeLevelSet(); - void markNearInterface(Real small_shift_factor); void redistanceInterface(); - void diffuseLevelSetSign(); MeshAllDynamics initialize_data_in_a_cell{mesh_data_, shape_}; MeshAllDynamics tag_a_cell_is_inner_package{mesh_data_}; From 5f38a47b16f4102a4d08857834f3c70c0906e05e Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Sun, 18 Aug 2024 19:41:19 +0200 Subject: [PATCH 32/55] wrap redistance --- src/for_2D_build/geometries/level_set_2d.cpp | 76 ------------------- src/for_3D_build/geometries/level_set_3d.cpp | 76 ------------------- .../meshes/mesh_local_dynamics_3d.cpp | 74 +++++++++++++++++- src/shared/geometries/level_set.cpp | 15 +--- src/shared/geometries/level_set.h | 1 - 5 files changed, 74 insertions(+), 168 deletions(-) diff --git a/src/for_2D_build/geometries/level_set_2d.cpp b/src/for_2D_build/geometries/level_set_2d.cpp index a92a8e452b..da3cf000cf 100644 --- a/src/for_2D_build/geometries/level_set_2d.cpp +++ b/src/for_2D_build/geometries/level_set_2d.cpp @@ -34,82 +34,6 @@ bool LevelSet::isWithinCorePackage(Vecd position) Arrayi cell_index = CellIndexFromPosition(position); return isCoreDataPackage(cell_index); } -//=================================================================================================// -void LevelSet::redistanceInterfaceForAPackage(const size_t package_index) -{ - auto phi_data = phi_.DataField(); - auto near_interface_id_data = near_interface_id_.DataField(); - auto &neighborhood = cell_neighborhood_[package_index]; - - for_each_cell_data( - [&](int i, int j) - { - int near_interface_id = near_interface_id_data[package_index][i][j]; - if (near_interface_id == 0) - { - bool positive_band = false; - bool negative_band = false; - mesh_for_each2d<-1, 2>( - [&](int r, int s) - { - NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i + r, j + s), neighborhood); - int neighbor_near_interface_id = near_interface_id_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]]; - if (neighbor_near_interface_id >= 1) - positive_band = true; - if (neighbor_near_interface_id <= -1) - negative_band = true; - }); - if (positive_band == false) - { - Real min_distance_p = 5.0 * data_spacing_; - mesh_for_each2d<-4, 5>( - [&](int x, int y) - { - NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i + x, j + y), neighborhood); - auto &neighbor_phi = phi_.DataField()[neighbour_index.first]; - auto &neighbor_phi_gradient = phi_gradient_.DataField()[neighbour_index.first]; - auto &neighbor_near_interface_id = near_interface_id_.DataField()[neighbour_index.first]; - if (neighbor_near_interface_id[neighbour_index.second[0]][neighbour_index.second[1]] >= 1) - { - Real phi_p_ = neighbor_phi[neighbour_index.second[0]][neighbour_index.second[1]]; - Vecd norm_to_face = neighbor_phi_gradient[neighbour_index.second[0]][neighbour_index.second[1]]; - norm_to_face /= norm_to_face.norm() + TinyReal; - min_distance_p = SMIN(min_distance_p, (Vecd((Real)x, (Real)y) * data_spacing_ + phi_p_ * norm_to_face).norm()); - } - }); - phi_data[package_index][i][j] = -min_distance_p; - // this immediate switch of near interface id - // does not intervening with the identification of unresolved interface - // based on the assumption that positive false_and negative bands are not close to each other - near_interface_id_data[package_index][i][j] = -1; - } - if (negative_band == false) - { - Real min_distance_n = 5.0 * data_spacing_; - mesh_for_each2d<-4, 5>( - [&](int x, int y) - { - NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i + x, j + y), neighborhood); - auto &neighbor_phi = phi_.DataField()[neighbour_index.first]; - auto &neighbor_phi_gradient = phi_gradient_.DataField()[neighbour_index.first]; - auto &neighbor_near_interface_id = near_interface_id_.DataField()[neighbour_index.first]; - if (neighbor_near_interface_id[neighbour_index.second[0]][neighbour_index.second[1]] <= -1) - { - Real phi_n_ = neighbor_phi[neighbour_index.second[0]][neighbour_index.second[1]]; - Vecd norm_to_face = neighbor_phi_gradient[neighbour_index.second[0]][neighbour_index.second[1]]; - norm_to_face /= norm_to_face.norm() + TinyReal; - min_distance_n = SMIN(min_distance_n, (Vecd((Real)x, (Real)y) * data_spacing_ - phi_n_ * norm_to_face).norm()); - } - }); - phi_data[package_index][i][j] = min_distance_n; - // this immediate switch of near interface id - // does not intervening with the identification of unresolved interface - // based on the assumption that positive false_and negative bands are not close to each other - near_interface_id_data[package_index][i][j] = 1; - } - } - }); -} //=============================================================================================// void LevelSet::writeMeshFieldToPlt(std::ofstream &output_file) { diff --git a/src/for_3D_build/geometries/level_set_3d.cpp b/src/for_3D_build/geometries/level_set_3d.cpp index fa26349588..d5f24b3d14 100644 --- a/src/for_3D_build/geometries/level_set_3d.cpp +++ b/src/for_3D_build/geometries/level_set_3d.cpp @@ -35,82 +35,6 @@ bool LevelSet::isWithinCorePackage(Vecd position) return isCoreDataPackage(cell_index); } //=================================================================================================// -void LevelSet::redistanceInterfaceForAPackage(const size_t package_index) -{ - auto phi_data = phi_.DataField(); - auto near_interface_id_data = near_interface_id_.DataField(); - auto &neighborhood = cell_neighborhood_[package_index]; - - for_each_cell_data( - [&](int i, int j, int k) - { - int near_interface_id = near_interface_id_data[package_index][i][j][k]; - if (near_interface_id == 0) - { - bool positive_band = false; - bool negative_band = false; - mesh_for_each3d<-1, 2>( - [&](int r, int s, int t) - { - NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i + r, j + s, k + t), neighborhood); - int neighbor_near_interface_id = near_interface_id_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; - if (neighbor_near_interface_id >= 1) - positive_band = true; - if (neighbor_near_interface_id <= -1) - negative_band = true; - }); - if (positive_band == false) - { - Real min_distance_p = 5.0 * data_spacing_; - mesh_for_each3d<-4, 5>( - [&](int x, int y, int z) - { - NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i + x, j + y, k + z), neighborhood); - auto &neighbor_phi = phi_.DataField()[neighbour_index.first]; - auto &neighbor_phi_gradient = phi_gradient_.DataField()[neighbour_index.first]; - auto &neighbor_near_interface_id = near_interface_id_.DataField()[neighbour_index.first]; - if (neighbor_near_interface_id[neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]] >= 1) - { - Real phi_p_ = neighbor_phi[neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; - Vecd norm_to_face = neighbor_phi_gradient[neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; - norm_to_face /= norm_to_face.norm() + TinyReal; - min_distance_p = SMIN(min_distance_p, (Vecd((Real)x, (Real)y, Real(z)) * data_spacing_ + phi_p_ * norm_to_face).norm()); - } - }); - phi_data[package_index][i][j][k] = -min_distance_p; - // this immediate switch of near interface id - // does not intervening with the identification of unresolved interface - // based on the assumption that positive false_and negative bands are not close to each other - near_interface_id_data[package_index][i][j][k] = -1; - } - if (negative_band == false) - { - Real min_distance_n = 5.0 * data_spacing_; - mesh_for_each3d<-4, 5>( - [&](int x, int y, int z) - { - NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i + x, j + y, k + z), neighborhood); - auto &neighbor_phi = phi_.DataField()[neighbour_index.first]; - auto &neighbor_phi_gradient = phi_gradient_.DataField()[neighbour_index.first]; - auto &neighbor_near_interface_id = near_interface_id_.DataField()[neighbour_index.first]; - if (neighbor_near_interface_id[neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]] <= -1) - { - Real phi_n_ = neighbor_phi[neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; - Vecd norm_to_face = neighbor_phi_gradient[neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; - norm_to_face /= norm_to_face.norm() + TinyReal; - min_distance_n = SMIN(min_distance_n, (Vecd((Real)x, (Real)y, Real(z)) * data_spacing_ - phi_n_ * norm_to_face).norm()); - } - }); - phi_data[package_index][i][j][k] = min_distance_n; - // this immediate switch of near interface id - // does not intervening with the identification of unresolved interface - // based on the assumption that positive false_and negative bands are not close to each other - near_interface_id_data[package_index][i][j][k] = 1; - } - } - }); -} -//=================================================================================================// void LevelSet::writeMeshFieldToPlt(std::ofstream &output_file) { Arrayi number_of_operation = global_mesh_.AllGridPoints(); diff --git a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp index caca7d67b6..c98d3d4c1f 100644 --- a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp +++ b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp @@ -228,7 +228,79 @@ void MarkNearInterface::update(const size_t &package_index) //=============================================================================================// void RedistanceInterface::update(const size_t &package_index) { - printf("this is the execution of DiffuseLevelSetSign\n"); + auto phi_data = phi_.DataField(); + auto near_interface_id_data = near_interface_id_.DataField(); + auto &neighborhood = mesh_data_.cell_neighborhood_[package_index]; + + using NeighbourIndex = std::pair; /**< stores shifted neighbour info: (size_t)package index, (arrayi)local grid index. */ + mesh_data_.for_each_cell_data( + [&](int i, int j, int k) + { + int near_interface_id = near_interface_id_data[package_index][i][j][k]; + if (near_interface_id == 0) + { + bool positive_band = false; + bool negative_band = false; + mesh_for_each3d<-1, 2>( + [&](int r, int s, int t) + { + NeighbourIndex neighbour_index = mesh_data_.NeighbourIndexShift(Arrayi(i + r, j + s, k + t), neighborhood); + int neighbor_near_interface_id = near_interface_id_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; + if (neighbor_near_interface_id >= 1) + positive_band = true; + if (neighbor_near_interface_id <= -1) + negative_band = true; + }); + if (positive_band == false) + { + Real min_distance_p = 5.0 * data_spacing_; + mesh_for_each3d<-4, 5>( + [&](int x, int y, int z) + { + NeighbourIndex neighbour_index = mesh_data_.NeighbourIndexShift(Arrayi(i + x, j + y, k + z), neighborhood); + auto &neighbor_phi = phi_.DataField()[neighbour_index.first]; + auto &neighbor_phi_gradient = phi_gradient_.DataField()[neighbour_index.first]; + auto &neighbor_near_interface_id = near_interface_id_.DataField()[neighbour_index.first]; + if (neighbor_near_interface_id[neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]] >= 1) + { + Real phi_p_ = neighbor_phi[neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; + Vecd norm_to_face = neighbor_phi_gradient[neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; + norm_to_face /= norm_to_face.norm() + TinyReal; + min_distance_p = SMIN(min_distance_p, (Vecd((Real)x, (Real)y, Real(z)) * data_spacing_ + phi_p_ * norm_to_face).norm()); + } + }); + phi_data[package_index][i][j][k] = -min_distance_p; + // this immediate switch of near interface id + // does not intervening with the identification of unresolved interface + // based on the assumption that positive false_and negative bands are not close to each other + near_interface_id_data[package_index][i][j][k] = -1; + } + if (negative_band == false) + { + Real min_distance_n = 5.0 * data_spacing_; + mesh_for_each3d<-4, 5>( + [&](int x, int y, int z) + { + NeighbourIndex neighbour_index = mesh_data_.NeighbourIndexShift(Arrayi(i + x, j + y, k + z), neighborhood); + auto &neighbor_phi = phi_.DataField()[neighbour_index.first]; + auto &neighbor_phi_gradient = phi_gradient_.DataField()[neighbour_index.first]; + auto &neighbor_near_interface_id = near_interface_id_.DataField()[neighbour_index.first]; + if (neighbor_near_interface_id[neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]] <= -1) + { + Real phi_n_ = neighbor_phi[neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; + Vecd norm_to_face = neighbor_phi_gradient[neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; + norm_to_face /= norm_to_face.norm() + TinyReal; + min_distance_n = SMIN(min_distance_n, (Vecd((Real)x, (Real)y, Real(z)) * data_spacing_ - phi_n_ * norm_to_face).norm()); + } + }); + phi_data[package_index][i][j][k] = min_distance_n; + // this immediate switch of near interface id + // does not intervening with the identification of unresolved interface + // based on the assumption that positive false_and negative bands are not close to each other + near_interface_id_data[package_index][i][j][k] = 1; + } + } + }); } //=============================================================================================// void DiffuseLevelSetSign::update(const size_t &package_index) diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index f0baeebc18..9e0212e0ff 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -103,24 +103,11 @@ Vecd LevelSet::probeKernelGradientIntegral(const Vecd &position, Real h_ratio) return probeMesh(kernel_gradient_, position); } //=================================================================================================// -void LevelSet::redistanceInterface() -{ - // redistance_interface.exec(); - package_parallel_for( - [&](size_t package_index) { - std::pair &metadata = meta_data_cell_[package_index]; - if (metadata.second == 1) - { - redistanceInterfaceForAPackage(PackageIndexFromCellIndex(metadata.first)); - } - }); -} -//=================================================================================================// void LevelSet::cleanInterface(Real small_shift_factor) { mark_near_interface.setSmallShiftFactor(small_shift_factor); mark_near_interface.exec(); - redistanceInterface(); + redistance_interface.exec(); reinitialize_level_set.exec(); update_level_set_gradient.exec(); update_kernel_integrals.exec(); diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index 7d83ded5c3..84ca8114bd 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -112,7 +112,6 @@ class LevelSet : public MeshWithGridDataPackages<4>, void redistanceInterfaceForAPackage(const size_t package_index); void finishDataPackages(); - void redistanceInterface(); MeshAllDynamics initialize_data_in_a_cell{mesh_data_, shape_}; MeshAllDynamics tag_a_cell_is_inner_package{mesh_data_}; From a94885e8eecea8a71fb8158c17175811e7d27515 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Sun, 18 Aug 2024 21:21:09 +0200 Subject: [PATCH 33/55] (wrapped) init singular --- src/for_2D_build/geometries/level_set_2d.cpp | 19 -------- .../meshes/mesh_local_dynamics_2d.cpp | 19 ++++++++ src/for_3D_build/geometries/level_set_3d.cpp | 19 -------- .../meshes/mesh_local_dynamics_3d.cpp | 19 ++++++++ src/shared/geometries/level_set.cpp | 6 +-- src/shared/geometries/level_set.h | 3 -- src/shared/meshes/mesh_dynamics.h | 43 +++++++++++++------ src/shared/meshes/mesh_local_dynamics.h | 12 +++++- 8 files changed, 82 insertions(+), 58 deletions(-) diff --git a/src/for_2D_build/geometries/level_set_2d.cpp b/src/for_2D_build/geometries/level_set_2d.cpp index da3cf000cf..cb0513c896 100644 --- a/src/for_2D_build/geometries/level_set_2d.cpp +++ b/src/for_2D_build/geometries/level_set_2d.cpp @@ -10,25 +10,6 @@ namespace SPH { //=================================================================================================// -void LevelSet::initializeDataForSingularPackage(const size_t package_index, Real far_field_level_set) -{ - auto &phi = phi_.DataField()[package_index]; - auto &near_interface_id = near_interface_id_.DataField()[package_index]; - auto &phi_gradient = phi_gradient_.DataField()[package_index]; - auto &kernel_weight = kernel_weight_.DataField()[package_index]; - auto &kernel_gradient = kernel_gradient_.DataField()[package_index]; - - for_each_cell_data( - [&](int i, int j) - { - phi[i][j] = far_field_level_set; - near_interface_id[i][j] = far_field_level_set < 0.0 ? -2 : 2; - phi_gradient[i][j] = Vecd::Ones(); - kernel_weight[i][j] = far_field_level_set < 0.0 ? 0 : 1.0; - kernel_gradient[i][j] = Vec2d::Zero(); - }); -} -//=================================================================================================// bool LevelSet::isWithinCorePackage(Vecd position) { Arrayi cell_index = CellIndexFromPosition(position); diff --git a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp index 0edb627a77..91b7bc17b1 100644 --- a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp +++ b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp @@ -5,6 +5,25 @@ namespace SPH { //=============================================================================================// +void InitializeDataForSingularPackage::update(const size_t package_index, Real far_field_level_set) +{ + auto &phi = phi_.DataField()[package_index]; + auto &near_interface_id = near_interface_id_.DataField()[package_index]; + auto &phi_gradient = phi_gradient_.DataField()[package_index]; + auto &kernel_weight = kernel_weight_.DataField()[package_index]; + auto &kernel_gradient = kernel_gradient_.DataField()[package_index]; + + mesh_data_.for_each_cell_data( + [&](int i, int j) + { + phi[i][j] = far_field_level_set; + near_interface_id[i][j] = far_field_level_set < 0.0 ? -2 : 2; + phi_gradient[i][j] = Vecd::Ones(); + kernel_weight[i][j] = far_field_level_set < 0.0 ? 0 : 1.0; + kernel_gradient[i][j] = Vec2d::Zero(); + }); +} +//=============================================================================================// size_t InitializeDataInACell::SortIndexFromCellIndex(const Arrayi &cell_index) { return cell_index[0] * all_cells_[1] + cell_index[1]; diff --git a/src/for_3D_build/geometries/level_set_3d.cpp b/src/for_3D_build/geometries/level_set_3d.cpp index d5f24b3d14..406d007a77 100644 --- a/src/for_3D_build/geometries/level_set_3d.cpp +++ b/src/for_3D_build/geometries/level_set_3d.cpp @@ -10,25 +10,6 @@ namespace SPH { //=================================================================================================// -void LevelSet::initializeDataForSingularPackage(const size_t package_index, Real far_field_level_set) -{ - auto &phi = phi_.DataField()[package_index]; - auto &near_interface_id = near_interface_id_.DataField()[package_index]; - auto &phi_gradient = phi_gradient_.DataField()[package_index]; - auto &kernel_weight = kernel_weight_.DataField()[package_index]; - auto &kernel_gradient = kernel_gradient_.DataField()[package_index]; - - for_each_cell_data( - [&](int i, int j, int k) - { - phi[i][j][k] = far_field_level_set; - near_interface_id[i][j][k] = far_field_level_set < 0.0 ? -2 : 2; - phi_gradient[i][j][k] = Vecd::Ones(); - kernel_weight[i][j][k] = far_field_level_set < 0.0 ? 0 : 1.0; - kernel_gradient[i][j][k] = Vec3d::Zero(); - }); -} -//=================================================================================================// bool LevelSet::isWithinCorePackage(Vecd position) { Arrayi cell_index = CellIndexFromPosition(position); diff --git a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp index c98d3d4c1f..c439d71e8b 100644 --- a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp +++ b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp @@ -5,6 +5,25 @@ namespace SPH { //=============================================================================================// +void InitializeDataForSingularPackage::update(const size_t package_index, Real far_field_level_set) +{ + auto &phi = phi_.DataField()[package_index]; + auto &near_interface_id = near_interface_id_.DataField()[package_index]; + auto &phi_gradient = phi_gradient_.DataField()[package_index]; + auto &kernel_weight = kernel_weight_.DataField()[package_index]; + auto &kernel_gradient = kernel_gradient_.DataField()[package_index]; + + mesh_data_.for_each_cell_data( + [&](int i, int j, int k) + { + phi[i][j][k] = far_field_level_set; + near_interface_id[i][j][k] = far_field_level_set < 0.0 ? -2 : 2; + phi_gradient[i][j][k] = Vecd::Ones(); + kernel_weight[i][j][k] = far_field_level_set < 0.0 ? 0 : 1.0; + kernel_gradient[i][j][k] = Vec3d::Zero(); + }); +} +//=============================================================================================// size_t InitializeDataInACell::SortIndexFromCellIndex(const Arrayi &cell_index) { return cell_index[0] * all_cells_[1] * all_cells_[2] + cell_index[1] * all_cells_[2] + cell_index[2]; diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index 9e0212e0ff..9777b11835 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -58,10 +58,10 @@ void LevelSet::finishDataPackages() initialize_cell_neighborhood.exec(); resizeMeshVariableData(); - Real far_field_distance = grid_spacing_ * (Real)buffer_width_; - initializeDataForSingularPackage(0, -far_field_distance); - initializeDataForSingularPackage(1, far_field_distance); + MeshSingleDynamics initialize_data_for_singular_package(mesh_data_); + initialize_data_for_singular_package.exec(0, -far_field_distance); + initialize_data_for_singular_package.exec(1, far_field_distance); initialize_basic_data_for_a_package.exec(); update_level_set_gradient.exec(); diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index 84ca8114bd..84ad42fba6 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -108,9 +108,6 @@ class LevelSet : public MeshWithGridDataPackages<4>, MeshVariable &kernel_gradient_; MeshWithGridDataPackages<4> &mesh_data_ = *this; - void initializeDataForSingularPackage(const size_t package_index, Real far_field_level_set); - void redistanceInterfaceForAPackage(const size_t package_index); - void finishDataPackages(); MeshAllDynamics initialize_data_in_a_cell{mesh_data_, shape_}; MeshAllDynamics tag_a_cell_is_inner_package{mesh_data_}; diff --git a/src/shared/meshes/mesh_dynamics.h b/src/shared/meshes/mesh_dynamics.h index ad3270bfb1..be3f8dfab8 100644 --- a/src/shared/meshes/mesh_dynamics.h +++ b/src/shared/meshes/mesh_dynamics.h @@ -46,7 +46,6 @@ namespace SPH * This class contains only the interface functions available * for all dynamics. An specific implementation should be realized. */ -template class BaseMeshDynamics { public: @@ -54,9 +53,6 @@ class BaseMeshDynamics : mesh_data_(mesh_data){}; virtual ~BaseMeshDynamics(){}; - /** There is the interface functions for computing. */ - virtual ReturnType exec() = 0; - protected: MeshWithGridDataPackages<4> &mesh_data_; }; @@ -66,16 +62,16 @@ class BaseMeshDynamics * @brief Mesh dynamics for all cell on the mesh */ template -class MeshAllDynamics : public LocalDynamicsType, public BaseMeshDynamics +class MeshAllDynamics : public LocalDynamicsType, public BaseMeshDynamics { public: template MeshAllDynamics(MeshWithGridDataPackages<4> &mesh_data, Args &&...args) : LocalDynamicsType(mesh_data, std::forward(args)...), - BaseMeshDynamics(mesh_data){}; + BaseMeshDynamics(mesh_data){}; virtual ~MeshAllDynamics(){}; - virtual void exec() override + void exec() { mesh_data_.grid_parallel_for( [&](Arrayi cell_index) @@ -91,16 +87,16 @@ class MeshAllDynamics : public LocalDynamicsType, public BaseMeshDynamics * @brief Mesh dynamics for only inner cells on the mesh */ template -class MeshInnerDynamics : public LocalDynamicsType, public BaseMeshDynamics +class MeshInnerDynamics : public LocalDynamicsType, public BaseMeshDynamics { public: template MeshInnerDynamics(MeshWithGridDataPackages<4> &mesh_data, Args &&...args) : LocalDynamicsType(mesh_data, std::forward(args)...), - BaseMeshDynamics(mesh_data){}; + BaseMeshDynamics(mesh_data){}; virtual ~MeshInnerDynamics(){}; - virtual void exec() override + void exec() { mesh_data_.package_parallel_for( [&](size_t package_index) @@ -116,16 +112,16 @@ class MeshInnerDynamics : public LocalDynamicsType, public BaseMeshDynamics -class MeshCoreDynamics : public LocalDynamicsType, public BaseMeshDynamics +class MeshCoreDynamics : public LocalDynamicsType, public BaseMeshDynamics { public: template MeshCoreDynamics(DynamicsIdentifier &identifier, Args &&...args) : LocalDynamicsType(identifier, std::forward(args)...), - BaseMeshDynamics(identifier){}; + BaseMeshDynamics(identifier){}; virtual ~MeshCoreDynamics(){}; - virtual void exec() override + void exec() { mesh_data_.package_parallel_for( [&](size_t package_index) @@ -139,5 +135,26 @@ class MeshCoreDynamics : public LocalDynamicsType, public BaseMeshDynamics ); }; }; + +/** + * @class MeshSingleDynamics + * @brief Mesh dynamics for only core cells on the mesh + */ +template +class MeshSingleDynamics : public LocalDynamicsType, public BaseMeshDynamics +{ + public: + template + MeshSingleDynamics(DynamicsIdentifier &identifier, Args &&...args) + : LocalDynamicsType(identifier, std::forward(args)...), + BaseMeshDynamics(identifier){}; + virtual ~MeshSingleDynamics(){}; + + template + void exec(Args &&...args) + { + this->update(std::forward(args)...); + }; +}; } // namespace SPH #endif // MESH_DYNAMICS_H \ No newline at end of file diff --git a/src/shared/meshes/mesh_local_dynamics.h b/src/shared/meshes/mesh_local_dynamics.h index 00fdb164d3..1208feb21e 100644 --- a/src/shared/meshes/mesh_local_dynamics.h +++ b/src/shared/meshes/mesh_local_dynamics.h @@ -60,7 +60,7 @@ class BaseMeshLocalDynamics kernel_gradient_(*mesh_data.getMeshVariable("KernelGradient")){}; virtual ~BaseMeshLocalDynamics(){}; - virtual void update(const IndexType &index) = 0; + // virtual void update(const IndexType &index) = 0; protected: MeshWithGridDataPackages<4> &mesh_data_; Arrayi all_cells_; @@ -74,6 +74,16 @@ class BaseMeshLocalDynamics MeshVariable &kernel_gradient_; }; +class InitializeDataForSingularPackage : public BaseMeshLocalDynamics +{ + public: + explicit InitializeDataForSingularPackage(MeshWithGridDataPackages<4> &mesh_data) + : BaseMeshLocalDynamics(mesh_data){}; + virtual ~InitializeDataForSingularPackage(){}; + + void update(const size_t package_index, Real far_field_level_set); +}; + class InitializeDataInACell : public BaseMeshLocalDynamics { public: From 72be0ee90c23ab715a45c666df3815ec19dbf472 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Sat, 17 Aug 2024 21:42:25 +0200 Subject: [PATCH 34/55] (3d)org/meshwithgriddatapackages --- .../meshes/mesh_with_data_packages.hpp | 33 +--------- .../meshes/mesh_with_data_packages.hpp | 33 +--------- src/shared/meshes/mesh_with_data_packages.h | 60 ++++--------------- 3 files changed, 17 insertions(+), 109 deletions(-) diff --git a/src/for_2D_build/meshes/mesh_with_data_packages.hpp b/src/for_2D_build/meshes/mesh_with_data_packages.hpp index 74ed7db24b..db06333b78 100644 --- a/src/for_2D_build/meshes/mesh_with_data_packages.hpp +++ b/src/for_2D_build/meshes/mesh_with_data_packages.hpp @@ -10,7 +10,6 @@ #include "mesh_with_data_packages.h" #include "mesh_iterators.hpp" -//=================================================================================================// namespace SPH { //=================================================================================================// @@ -46,18 +45,6 @@ void MeshWithGridDataPackages::deleteIndexDataMatrix() } //=================================================================================================// template -void MeshWithGridDataPackages::allocateCategoryDataMatrix() -{ - Allocate2dArray(category_data_mesh_, all_cells_); -} -//=================================================================================================// -template -void MeshWithGridDataPackages::deleteCategoryDataMatrix() -{ - Delete2dArray(category_data_mesh_, all_cells_); -} -//=================================================================================================// -template template DataType MeshWithGridDataPackages:: probeMesh(MeshVariable &mesh_variable, const Vecd &position) @@ -95,13 +82,6 @@ size_t MeshWithGridDataPackages:: } //=================================================================================================// template -void MeshWithGridDataPackages:: - assignCategoryOnMetaDataMesh(const Arrayi &cell_index, const int category) -{ - category_data_mesh_[cell_index[0]][cell_index[1]] = category; -} -//=================================================================================================// -template bool MeshWithGridDataPackages:: isSingularDataPackage(const Arrayi &cell_index) { @@ -116,16 +96,6 @@ bool MeshWithGridDataPackages:: } //=================================================================================================// template -bool MeshWithGridDataPackages:: - isCoreDataPackage(const Arrayi &cell_index) -{ - size_t package_index = PackageIndexFromCellIndex(cell_index); - return meta_data_cell_[package_index].second == 1; - - // return category_data_mesh_[cell_index[0]][cell_index[1]] == 2; -} -//=================================================================================================// -template std::pair MeshWithGridDataPackages:: NeighbourIndexShift(const Arrayi shift_index, const CellNeighborhood &neighbour) { @@ -229,8 +199,7 @@ DataType MeshWithGridDataPackages:: //=================================================================================================// template template -void MeshWithGridDataPackages:: - grid_parallel_for(const FunctionOnData &function) +void MeshWithGridDataPackages::grid_parallel_for(const FunctionOnData &function) { mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), [&](size_t i, size_t j) diff --git a/src/for_3D_build/meshes/mesh_with_data_packages.hpp b/src/for_3D_build/meshes/mesh_with_data_packages.hpp index 3324a5dd03..a69fe05e81 100644 --- a/src/for_3D_build/meshes/mesh_with_data_packages.hpp +++ b/src/for_3D_build/meshes/mesh_with_data_packages.hpp @@ -45,18 +45,6 @@ void MeshWithGridDataPackages::deleteIndexDataMatrix() } //=================================================================================================// template -void MeshWithGridDataPackages::allocateCategoryDataMatrix() -{ - Allocate3dArray(category_data_mesh_, all_cells_); -} -//=================================================================================================// -template -void MeshWithGridDataPackages::deleteCategoryDataMatrix() -{ - Delete3dArray(category_data_mesh_, all_cells_); -} -//=================================================================================================// -template template DataType MeshWithGridDataPackages:: probeMesh(MeshVariable &mesh_variable, const Vecd &position) @@ -95,31 +83,17 @@ size_t MeshWithGridDataPackages:: } //=================================================================================================// template -void MeshWithGridDataPackages:: - assignCategoryOnMetaDataMesh(const Arrayi &cell_index, const int category) -{ - category_data_mesh_[cell_index[0]][cell_index[1]][cell_index[2]] = category; -} -//=================================================================================================// -template bool MeshWithGridDataPackages:: isSingularDataPackage(const Arrayi &cell_index) { - return category_data_mesh_[cell_index[0]][cell_index[1]][cell_index[2]] == 0; + return index_data_mesh_[cell_index[0]][cell_index[1]][cell_index[2]] < 2; } //=================================================================================================// template bool MeshWithGridDataPackages:: isInnerDataPackage(const Arrayi &cell_index) { - return category_data_mesh_[cell_index[0]][cell_index[1]][cell_index[2]] != 0; -} -//=================================================================================================// -template -bool MeshWithGridDataPackages:: - isCoreDataPackage(const Arrayi &cell_index) -{ - return category_data_mesh_[cell_index[0]][cell_index[1]][cell_index[2]] == 2; + return index_data_mesh_[cell_index[0]][cell_index[1]][cell_index[2]] > 1; } //=================================================================================================// template @@ -240,8 +214,7 @@ DataType MeshWithGridDataPackages:: //=================================================================================================// template template -void MeshWithGridDataPackages:: - grid_parallel_for(const FunctionOnData &function) +void MeshWithGridDataPackages::grid_parallel_for(const FunctionOnData &function) { mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), [&](size_t i, size_t j, size_t k) diff --git a/src/shared/meshes/mesh_with_data_packages.h b/src/shared/meshes/mesh_with_data_packages.h index 8ddbcdf6e8..11b8b59893 100644 --- a/src/shared/meshes/mesh_with_data_packages.h +++ b/src/shared/meshes/mesh_with_data_packages.h @@ -41,31 +41,6 @@ using namespace std::placeholders; namespace SPH { -/** Iterator on a collection of mesh data packages. sequential computing. */ -template -void package_for(const ConcurrentVec &data_pkgs, - const LocalFunction &local_function, Args &&...args) -{ - for (size_t i = 0; i != data_pkgs.size(); ++i) - local_function(data_pkgs[i]); -}; -/** Iterator on a collection of mesh data packages. parallel computing. */ -// template -// void package_parallel_for(const ConcurrentVec &data_pkgs, -// const LocalFunction &local_function, Args &&...args) -// { -// parallel_for( -// IndexRange(0, data_pkgs.size()), -// [&](const IndexRange &r) -// { -// for (size_t i = r.begin(); i != r.end(); ++i) -// { -// local_function(data_pkgs[i]); -// } -// }, -// ap); -// }; - /** * @class BaseDataPackage * @brief Abstract base class for a data package, @@ -123,18 +98,17 @@ class MeshWithGridDataPackages : public Mesh global_mesh_(mesh_lower_bound_ + 0.5 * data_spacing * Vecd::Ones(), data_spacing, all_cells_ * pkg_size) { allocateIndexDataMatrix(); - allocateCategoryDataMatrix(); }; virtual ~MeshWithGridDataPackages() { deleteIndexDataMatrix(); - deleteCategoryDataMatrix(); delete[] cell_neighborhood_; delete[] meta_data_cell_; }; /** spacing between the data, which is 1/ pkg_size of this grid spacing */ virtual Real DataSpacing() override { return data_spacing_; }; Real GridSpacing() { return grid_spacing_; }; + public: ConcurrentVec> occupied_data_pkgs_; /**< (size_t)sort_index, (int)core1/inner0. */ CellNeighborhood *cell_neighborhood_; /**< 3*3(*3) array to store indicies of neighborhood cells. */ @@ -147,9 +121,7 @@ class MeshWithGridDataPackages : public Mesh BaseMesh global_mesh_; /**< the mesh for the locations of all possible data points. */ size_t num_grid_pkgs_ = 2; /**< the number of all distinct packages, initially only 2 singular packages. */ using MetaData = std::pair; /**< stores the metadata for each cell: (int)singular0/inner1/core2, (size_t)package data index*/ - MeshDataMatrix meta_data_mesh_; /**< metadata for all cells. */ MeshDataMatrix index_data_mesh_; /**< metadata for all cells. */ - MeshDataMatrix category_data_mesh_; /**< metadata for all cells. */ using NeighbourIndex = std::pair; /**< stores shifted neighbour info: (size_t)package index, (arrayi)local grid index. */ template using PackageData = PackageDataMatrix; @@ -159,8 +131,6 @@ class MeshWithGridDataPackages : public Mesh void allocateIndexDataMatrix(); /**< allocate memories for metadata of data packages. */ void deleteIndexDataMatrix(); /**< delete memories for metadata of data packages. */ - void allocateCategoryDataMatrix(); /**< allocate memories for metadata of data packages. */ - void deleteCategoryDataMatrix(); /**< delete memories for metadata of data packages. */ template MeshVariable *registerMeshVariable(const std::string &variable_name) @@ -177,8 +147,6 @@ class MeshWithGridDataPackages : public Mesh return variable; }; - - /** resize all mesh variable data field with `num_grid_pkgs_` size(initially only singular data) */ template struct ResizeMeshVariableData @@ -196,21 +164,17 @@ class MeshWithGridDataPackages : public Mesh }; DataAssembleOperation resize_mesh_variable_data_; - - void assignCategoryOnMetaDataMesh(const Arrayi &cell_index, const int category); - bool isSingularDataPackage(const Arrayi &cell_index); - bool isCoreDataPackage(const Arrayi &cell_index); - - /** probe by applying bi and tri-linear interpolation within the package. */ template DataType probeDataPackage(MeshVariable &mesh_variable, size_t package_index, const Arrayi &cell_index, const Vecd &position); + bool isSingularDataPackage(const Arrayi &cell_index); /** return the position of the lower bound data in a cell. */ Vecd DataLowerBoundInCell(const Arrayi &cell_index) { return CellLowerCorner(cell_index) + 0.5 * data_spacing_ * Vecd::Ones(); } + /** return the grid index from its position and the index of the cell it belongs to. */ Arrayi DataIndexFromPosition(const Arrayi &cell_index, const Vecd &position) { @@ -220,17 +184,16 @@ class MeshWithGridDataPackages : public Mesh .min((pkg_size - 1) * Arrayi::Ones()); } - // void assignSingular(const Arrayi &cell_index) { assignCategoryOnMetaDataMesh(cell_index, 0); }; - // void assignInner(const Arrayi &cell_index) { assignCategoryOnMetaDataMesh(cell_index, 1); }; - // void assignCore(const Arrayi &cell_index) { assignCategoryOnMetaDataMesh(cell_index, 2); }; - public: + std::pair NeighbourIndexShift(const Arrayi shift_index, const CellNeighborhood &neighbour); + bool isInnerDataPackage(const Arrayi &cell_index); + void assignDataPackageIndex(const Arrayi &cell_index, const size_t package_index); + size_t PackageIndexFromCellIndex(const Arrayi &cell_index); /** obtain averaged value at a corner of a data cell */ template DataType CornerAverage(MeshVariable &mesh_variable, Arrayi addrs_index, Arrayi corner_direction, CellNeighborhood &neighborhood); - std::pair NeighbourIndexShift(const Arrayi shift_index, const CellNeighborhood &neighbour); /** This function find the value of data from its index from global mesh. */ template DataType DataValueFromGlobalIndex(MeshVariable &mesh_variable, @@ -251,9 +214,6 @@ class MeshWithGridDataPackages : public Mesh /** void (non_value_returning) function iterate on all data points by value. */ template void for_each_cell_data(const FunctionOnData &function); - bool isInnerDataPackage(const Arrayi &cell_index); - void assignDataPackageIndex(const Arrayi &cell_index, const size_t package_index); - size_t PackageIndexFromCellIndex(const Arrayi &cell_index); template void grid_parallel_for(const FunctionOnData &function); void resizeMeshVariableData() @@ -302,6 +262,12 @@ class MeshWithGridDataPackages : public Mesh { return global_mesh_.GridPositionFromIndex(cell_index); } + + bool isCoreDataPackage(const Arrayi &cell_index) + { + size_t package_index = PackageIndexFromCellIndex(cell_index); + return meta_data_cell_[package_index].second == 1; + } }; } // namespace SPH #endif // MESH_WITH_DATA_PACKAGES_H From b67edd60fdf8756995d053b0df14cb5d507a228f Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Sat, 17 Aug 2024 21:54:05 +0200 Subject: [PATCH 35/55] (3d)org/levelset --- src/for_2D_build/geometries/level_set_2d.cpp | 2 +- src/for_3D_build/geometries/level_set_3d.cpp | 13 ------------- src/shared/geometries/level_set.cpp | 2 -- 3 files changed, 1 insertion(+), 16 deletions(-) diff --git a/src/for_2D_build/geometries/level_set_2d.cpp b/src/for_2D_build/geometries/level_set_2d.cpp index ec4dc8ca16..3c111b5dea 100644 --- a/src/for_2D_build/geometries/level_set_2d.cpp +++ b/src/for_2D_build/geometries/level_set_2d.cpp @@ -32,7 +32,7 @@ void LevelSet::initializeDataForSingularPackage(const size_t package_index, Real bool LevelSet::isWithinCorePackage(Vecd position) { Arrayi cell_index = CellIndexFromPosition(position); - return isInnerDataPackage(cell_index); + return isCoreDataPackage(cell_index); } //=================================================================================================// void LevelSet::diffuseLevelSetSign() diff --git a/src/for_3D_build/geometries/level_set_3d.cpp b/src/for_3D_build/geometries/level_set_3d.cpp index 5a20a00b57..2930471c45 100644 --- a/src/for_3D_build/geometries/level_set_3d.cpp +++ b/src/for_3D_build/geometries/level_set_3d.cpp @@ -156,19 +156,6 @@ void LevelSet::markNearInterface(Real small_shift_factor) }); } //=================================================================================================// -// void LevelSet::initializeBasicDataForAPackage(const Arrayi &cell_index, const size_t package_index, Shape &shape) -// { -// auto &phi = phi_.DataField()[package_index]; -// auto &near_interface_id = near_interface_id_.DataField()[package_index]; -// for_each_cell_data( -// [&](int i, int j, int k) -// { -// Vec3d position = DataPositionFromIndex(cell_index, Array3i(i, j, k)); -// phi[i][j][k] = shape.findSignedDistance(position); -// near_interface_id[i][j][k] = phi[i][j][k] < 0.0 ? -2 : 2; -// }); -// } -//=================================================================================================// void LevelSet::redistanceInterfaceForAPackage(const size_t package_index) { auto phi_data = phi_.DataField(); diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index a978384408..53e3126d6d 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -47,7 +47,6 @@ LevelSet::LevelSet(BoundingBox tentative_bounds, Real data_spacing, : LevelSet(tentative_bounds, data_spacing, 4, shape, sph_adaptation) { initialize_data_in_a_cell.exec(); - finishDataPackages(); } //=================================================================================================// @@ -189,7 +188,6 @@ void RefinedLevelSet::initializeDataInACellFromCoarse(const Arrayi &cell_index) Real measure = (signed_distance * normal_direction).cwiseAbs().maxCoeff(); if (measure < grid_spacing_) { - // assignCore(cell_index); std::pair occupied; occupied.first = cell_index[0] * all_cells_[1] + cell_index[1]; occupied.second = 1; From 88bc0f818d47037bca9cb97cb4b174344f8e783a Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Sun, 18 Aug 2024 15:14:14 +0200 Subject: [PATCH 36/55] fix bug 3d --- src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp index ddb660ab92..c8a904b29c 100644 --- a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp +++ b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp @@ -66,7 +66,7 @@ void InitializeBasicDataForAPackage::update(const size_t &package_index) { auto &phi = phi_.DataField()[package_index]; auto &near_interface_id = near_interface_id_.DataField()[package_index]; - Arrayi cell_index = CellIndexFromSortIndex(package_index); + Arrayi cell_index = mesh_data_.meta_data_cell_[package_index].first; mesh_data_.for_each_cell_data( [&](int i, int j, int k) { From 568bb22e537cf7a5177d57e5a81db0635ea9f5d9 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Sun, 18 Aug 2024 16:21:14 +0200 Subject: [PATCH 37/55] 3d wrap --- src/for_3D_build/geometries/level_set_3d.cpp | 212 +++++++++--------- .../meshes/mesh_local_dynamics_3d.cpp | 73 +++++- src/shared/geometries/level_set.cpp | 10 +- src/shared/meshes/mesh_with_data_packages.h | 12 + 4 files changed, 192 insertions(+), 115 deletions(-) diff --git a/src/for_3D_build/geometries/level_set_3d.cpp b/src/for_3D_build/geometries/level_set_3d.cpp index 2930471c45..b25b7102d1 100644 --- a/src/for_3D_build/geometries/level_set_3d.cpp +++ b/src/for_3D_build/geometries/level_set_3d.cpp @@ -37,123 +37,127 @@ bool LevelSet::isWithinCorePackage(Vecd position) //=============================================================================================// void LevelSet::diffuseLevelSetSign() { - package_parallel_for( - [&](size_t package_index) - { - auto phi_data = phi_.DataField(); - auto near_interface_id_data = near_interface_id_.DataField(); - auto &neighborhood = cell_neighborhood_[package_index]; + diffuse_level_set_sign.exec(); + // package_parallel_for( + // [&](size_t package_index) + // { + // auto phi_data = phi_.DataField(); + // auto near_interface_id_data = near_interface_id_.DataField(); + // auto &neighborhood = cell_neighborhood_[package_index]; - for_each_cell_data( - [&](int i, int j, int k) - { - // near interface cells are not considered - if (abs(near_interface_id_data[package_index][i][j][k]) > 1) - { - mesh_find_if3d<-1, 2>( - [&](int l, int m, int n) -> bool - { - NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i + l, j + m, k + n), neighborhood); - int near_interface_id = near_interface_id_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; - bool is_found = abs(near_interface_id) == 1; - if (is_found) - { - Real phi_0 = phi_data[package_index][i][j][k]; - near_interface_id_data[package_index][i][j][k] = near_interface_id; - phi_data[package_index][i][j][k] = near_interface_id == 1 ? fabs(phi_0) : -fabs(phi_0); - } - return is_found; - }); - } - }); - }); + // for_each_cell_data( + // [&](int i, int j, int k) + // { + // // near interface cells are not considered + // if (abs(near_interface_id_data[package_index][i][j][k]) > 1) + // { + // mesh_find_if3d<-1, 2>( + // [&](int l, int m, int n) -> bool + // { + // NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i + l, j + m, k + n), neighborhood); + // int near_interface_id = near_interface_id_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; + // bool is_found = abs(near_interface_id) == 1; + // if (is_found) + // { + // Real phi_0 = phi_data[package_index][i][j][k]; + // near_interface_id_data[package_index][i][j][k] = near_interface_id; + // phi_data[package_index][i][j][k] = near_interface_id == 1 ? fabs(phi_0) : -fabs(phi_0); + // } + // return is_found; + // }); + // } + // }); + // }); } //=============================================================================================// void LevelSet::reinitializeLevelSet() { - package_parallel_for( - [&](size_t package_index) - { - auto phi_data = phi_.DataField(); - auto &phi_addrs = phi_data[package_index]; - auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; - auto &neighborhood = cell_neighborhood_[package_index]; + reinitialize_level_set.exec(); + // package_parallel_for( + // [&](size_t package_index) + // { + // auto phi_data = phi_.DataField(); + // auto &phi_addrs = phi_data[package_index]; + // auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; + // auto &neighborhood = cell_neighborhood_[package_index]; - for_each_cell_data( - [&](int i, int j, int k) - { - // only reinitialize non cut cells - if (near_interface_id_addrs[i][j][k] != 0) - { - Real phi_0 = phi_addrs[i][j][k]; - Real sign = phi_0 / sqrt(phi_0 * phi_0 + data_spacing_ * data_spacing_); - NeighbourIndex x1 = NeighbourIndexShift(Arrayi(i + 1, j, k), neighborhood); - NeighbourIndex x2 = NeighbourIndexShift(Arrayi(i - 1, j, k), neighborhood); - NeighbourIndex y1 = NeighbourIndexShift(Arrayi(i, j + 1, k), neighborhood); - NeighbourIndex y2 = NeighbourIndexShift(Arrayi(i, j - 1, k), neighborhood); - NeighbourIndex z1 = NeighbourIndexShift(Arrayi(i, j, k + 1), neighborhood); - NeighbourIndex z2 = NeighbourIndexShift(Arrayi(i, j, k - 1), neighborhood); - Real dv_x = upwindDifference(sign, phi_data[x1.first][x1.second[0]][x1.second[1]][x1.second[2]] - phi_0, phi_0 - phi_data[x2.first][x2.second[0]][x2.second[1]][x2.second[2]]); - Real dv_y = upwindDifference(sign, phi_data[y1.first][y1.second[0]][y1.second[1]][y1.second[2]] - phi_0, phi_0 - phi_data[y2.first][y2.second[0]][y2.second[1]][y2.second[2]]); - Real dv_z = upwindDifference(sign, phi_data[z1.first][z1.second[0]][z1.second[1]][z1.second[2]] - phi_0, phi_0 - phi_data[z2.first][z2.second[0]][z2.second[1]][z2.second[2]]); - phi_addrs[i][j][k] -= 0.3 * sign * (Vec3d(dv_x, dv_y, dv_z).norm() - data_spacing_); - } - }); - }); + // for_each_cell_data( + // [&](int i, int j, int k) + // { + // // only reinitialize non cut cells + // if (near_interface_id_addrs[i][j][k] != 0) + // { + // Real phi_0 = phi_addrs[i][j][k]; + // Real sign = phi_0 / sqrt(phi_0 * phi_0 + data_spacing_ * data_spacing_); + // NeighbourIndex x1 = NeighbourIndexShift(Arrayi(i + 1, j, k), neighborhood); + // NeighbourIndex x2 = NeighbourIndexShift(Arrayi(i - 1, j, k), neighborhood); + // NeighbourIndex y1 = NeighbourIndexShift(Arrayi(i, j + 1, k), neighborhood); + // NeighbourIndex y2 = NeighbourIndexShift(Arrayi(i, j - 1, k), neighborhood); + // NeighbourIndex z1 = NeighbourIndexShift(Arrayi(i, j, k + 1), neighborhood); + // NeighbourIndex z2 = NeighbourIndexShift(Arrayi(i, j, k - 1), neighborhood); + // Real dv_x = upwindDifference(sign, phi_data[x1.first][x1.second[0]][x1.second[1]][x1.second[2]] - phi_0, phi_0 - phi_data[x2.first][x2.second[0]][x2.second[1]][x2.second[2]]); + // Real dv_y = upwindDifference(sign, phi_data[y1.first][y1.second[0]][y1.second[1]][y1.second[2]] - phi_0, phi_0 - phi_data[y2.first][y2.second[0]][y2.second[1]][y2.second[2]]); + // Real dv_z = upwindDifference(sign, phi_data[z1.first][z1.second[0]][z1.second[1]][z1.second[2]] - phi_0, phi_0 - phi_data[z2.first][z2.second[0]][z2.second[1]][z2.second[2]]); + // phi_addrs[i][j][k] -= 0.3 * sign * (Vec3d(dv_x, dv_y, dv_z).norm() - data_spacing_); + // } + // }); + // }); } //=================================================================================================// void LevelSet::markNearInterface(Real small_shift_factor) { - Real small_shift = small_shift_factor * data_spacing_; + // Real small_shift = small_shift_factor * data_spacing_; + mark_near_interface.setSmallShiftFactor(small_shift_factor); + mark_near_interface.exec(); - package_parallel_for( - [&](size_t package_index) - { - auto &phi_addrs = phi_.DataField()[package_index]; - auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; - auto neighborhood = cell_neighborhood_[package_index]; + // package_parallel_for( + // [&](size_t package_index) + // { + // auto &phi_addrs = phi_.DataField()[package_index]; + // auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; + // auto neighborhood = cell_neighborhood_[package_index]; - // corner averages, note that the first row and first column are not used - PackageTemporaryData corner_averages; - mesh_for_each3d<0, pkg_size + 1>( - [&](int i, int j, int k) - { - corner_averages[i][j][k] = CornerAverage(phi_, Arrayi(i, j, k), Arrayi(-1, -1, -1), neighborhood); - }); + // // corner averages, note that the first row and first column are not used + // PackageTemporaryData corner_averages; + // mesh_for_each3d<0, pkg_size + 1>( + // [&](int i, int j, int k) + // { + // corner_averages[i][j][k] = CornerAverage(phi_, Arrayi(i, j, k), Arrayi(-1, -1, -1), neighborhood); + // }); - for_each_cell_data( - [&](int i, int j, int k) - { - // first assume far cells - Real phi_0 = phi_addrs[i][j][k]; - int near_interface_id = phi_0 > 0.0 ? 2 : -2; - if (fabs(phi_0) < small_shift) - { - near_interface_id = 0; - Real phi_average_0 = corner_averages[i][j][k]; - // find inner and outer cut cells - mesh_for_each3d<0, 2>( - [&](int l, int m, int n) - { - Real phi_average = corner_averages[i + l][j + m][k + n]; - if ((phi_average_0 - small_shift) * (phi_average - small_shift) < 0.0) - near_interface_id = 1; - if ((phi_average_0 + small_shift) * (phi_average + small_shift) < 0.0) - near_interface_id = -1; - }); - // find zero cut cells - mesh_for_each3d<0, 2>( - [&](int l, int m, int n) - { - Real phi_average = corner_averages[i + l][j + m][k + n]; - if (phi_average_0 * phi_average < 0.0) - near_interface_id = 0; - }); - } - // assign this is to package - near_interface_id_addrs[i][j][k] = near_interface_id; - }); - }); + // for_each_cell_data( + // [&](int i, int j, int k) + // { + // // first assume far cells + // Real phi_0 = phi_addrs[i][j][k]; + // int near_interface_id = phi_0 > 0.0 ? 2 : -2; + // if (fabs(phi_0) < small_shift) + // { + // near_interface_id = 0; + // Real phi_average_0 = corner_averages[i][j][k]; + // // find inner and outer cut cells + // mesh_for_each3d<0, 2>( + // [&](int l, int m, int n) + // { + // Real phi_average = corner_averages[i + l][j + m][k + n]; + // if ((phi_average_0 - small_shift) * (phi_average - small_shift) < 0.0) + // near_interface_id = 1; + // if ((phi_average_0 + small_shift) * (phi_average + small_shift) < 0.0) + // near_interface_id = -1; + // }); + // // find zero cut cells + // mesh_for_each3d<0, 2>( + // [&](int l, int m, int n) + // { + // Real phi_average = corner_averages[i + l][j + m][k + n]; + // if (phi_average_0 * phi_average < 0.0) + // near_interface_id = 0; + // }); + // } + // // assign this is to package + // near_interface_id_addrs[i][j][k] = near_interface_id; + // }); + // }); } //=================================================================================================// void LevelSet::redistanceInterfaceForAPackage(const size_t package_index) diff --git a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp index c8a904b29c..caca7d67b6 100644 --- a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp +++ b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp @@ -180,7 +180,50 @@ void ReinitializeLevelSet::update(const size_t &package_index) //=============================================================================================// void MarkNearInterface::update(const size_t &package_index) { - printf("this is the execution of DiffuseLevelSetSign\n"); + auto &phi_addrs = phi_.DataField()[package_index]; + auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; + auto neighborhood = mesh_data_.cell_neighborhood_[package_index]; + + // corner averages, note that the first row and first column are not used + PackageDataMatrix corner_averages; + mesh_for_each3d<0, 5>( + [&](int i, int j, int k) + { + corner_averages[i][j][k] = mesh_data_.CornerAverage(phi_, Arrayi(i, j, k), Arrayi(-1, -1, -1), neighborhood); + }); + + mesh_data_.for_each_cell_data( + [&](int i, int j, int k) + { + // first assume far cells + Real phi_0 = phi_addrs[i][j][k]; + int near_interface_id = phi_0 > 0.0 ? 2 : -2; + if (fabs(phi_0) < small_shift) + { + near_interface_id = 0; + Real phi_average_0 = corner_averages[i][j][k]; + // find inner and outer cut cells + mesh_for_each3d<0, 2>( + [&](int l, int m, int n) + { + Real phi_average = corner_averages[i + l][j + m][k + n]; + if ((phi_average_0 - small_shift) * (phi_average - small_shift) < 0.0) + near_interface_id = 1; + if ((phi_average_0 + small_shift) * (phi_average + small_shift) < 0.0) + near_interface_id = -1; + }); + // find zero cut cells + mesh_for_each3d<0, 2>( + [&](int l, int m, int n) + { + Real phi_average = corner_averages[i + l][j + m][k + n]; + if (phi_average_0 * phi_average < 0.0) + near_interface_id = 0; + }); + } + // assign this is to package + near_interface_id_addrs[i][j][k] = near_interface_id; + }); } //=============================================================================================// void RedistanceInterface::update(const size_t &package_index) @@ -190,7 +233,33 @@ void RedistanceInterface::update(const size_t &package_index) //=============================================================================================// void DiffuseLevelSetSign::update(const size_t &package_index) { - printf("this is the execution of DiffuseLevelSetSign\n"); + auto phi_data = phi_.DataField(); + auto near_interface_id_data = near_interface_id_.DataField(); + auto &neighborhood = mesh_data_.cell_neighborhood_[package_index]; + + mesh_data_.for_each_cell_data( + [&](int i, int j, int k) + { + // near interface cells are not considered + if (abs(near_interface_id_data[package_index][i][j][k]) > 1) + { + mesh_find_if3d<-1, 2>( + [&](int l, int m, int n) -> bool + { + using NeighbourIndex = std::pair; /**< stores shifted neighbour info: (size_t)package index, (arrayi)local grid index. */ + NeighbourIndex neighbour_index = mesh_data_.NeighbourIndexShift(Arrayi(i + l, j + m, k + n), neighborhood); + int near_interface_id = near_interface_id_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; + bool is_found = abs(near_interface_id) == 1; + if (is_found) + { + Real phi_0 = phi_data[package_index][i][j][k]; + near_interface_id_data[package_index][i][j][k] = near_interface_id; + phi_data[package_index][i][j][k] = near_interface_id == 1 ? fabs(phi_0) : -fabs(phi_0); + } + return is_found; + }); + } + }); } //=============================================================================================// } // namespace SPH diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index 53e3126d6d..d100b53688 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -2,7 +2,6 @@ #include "adaptation.h" #include "base_kernel.h" -#include "tbb/parallel_sort.h" namespace SPH { @@ -54,14 +53,7 @@ void LevelSet::finishDataPackages() { tag_a_cell_is_inner_package.exec(); - parallel_sort(occupied_data_pkgs_.begin(), occupied_data_pkgs_.end(), - [](const std::pair& a, const std::pair& b) - { - return a.first < b.first; - }); - num_grid_pkgs_ = occupied_data_pkgs_.size() + 2; - cell_neighborhood_ = new CellNeighborhood[num_grid_pkgs_]; - meta_data_cell_ = new std::pair[num_grid_pkgs_]; + mesh_data_.organizeOccupiedPackages(); initialize_index_mesh.exec(); initialize_cell_neighborhood.exec(); resizeMeshVariableData(); diff --git a/src/shared/meshes/mesh_with_data_packages.h b/src/shared/meshes/mesh_with_data_packages.h index 11b8b59893..fb91d21ad5 100644 --- a/src/shared/meshes/mesh_with_data_packages.h +++ b/src/shared/meshes/mesh_with_data_packages.h @@ -32,6 +32,7 @@ #include "base_mesh.h" #include "base_variable.h" #include "my_memory_pool.h" +#include "tbb/parallel_sort.h" #include #include @@ -268,6 +269,17 @@ class MeshWithGridDataPackages : public Mesh size_t package_index = PackageIndexFromCellIndex(cell_index); return meta_data_cell_[package_index].second == 1; } + + void organizeOccupiedPackages(){ + parallel_sort(occupied_data_pkgs_.begin(), occupied_data_pkgs_.end(), + [](const std::pair& a, const std::pair& b) + { + return a.first < b.first; + }); + num_grid_pkgs_ = occupied_data_pkgs_.size() + 2; + cell_neighborhood_ = new CellNeighborhood[num_grid_pkgs_]; + meta_data_cell_ = new std::pair[num_grid_pkgs_]; + } }; } // namespace SPH #endif // MESH_WITH_DATA_PACKAGES_H From 31f79d5a5d92369694ea0c48a51b2a533baaf947 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Sun, 18 Aug 2024 16:30:02 +0200 Subject: [PATCH 38/55] clean --- src/for_2D_build/geometries/level_set_2d.cpp | 123 ------------------ src/for_3D_build/geometries/level_set_3d.cpp | 125 ------------------- src/shared/geometries/level_set.cpp | 10 +- src/shared/geometries/level_set.h | 3 - 4 files changed, 6 insertions(+), 255 deletions(-) diff --git a/src/for_2D_build/geometries/level_set_2d.cpp b/src/for_2D_build/geometries/level_set_2d.cpp index 3c111b5dea..a92a8e452b 100644 --- a/src/for_2D_build/geometries/level_set_2d.cpp +++ b/src/for_2D_build/geometries/level_set_2d.cpp @@ -35,129 +35,6 @@ bool LevelSet::isWithinCorePackage(Vecd position) return isCoreDataPackage(cell_index); } //=================================================================================================// -void LevelSet::diffuseLevelSetSign() -{ - diffuse_level_set_sign.exec(); - // package_parallel_for( - // [&](size_t package_index) - // { - // auto phi_data = phi_.DataField(); - // auto near_interface_id_data = near_interface_id_.DataField(); - // auto &neighborhood = cell_neighborhood_[package_index]; - - // for_each_cell_data( - // [&](int i, int j) - // { - // // near interface cells are not considered - // if (abs(near_interface_id_data[package_index][i][j]) > 1) - // { - // mesh_find_if2d<-1, 2>( - // [&](int l, int m) -> bool - // { - // NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i + l, j + m), neighborhood); - // int near_interface_id = near_interface_id_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]]; - // bool is_found = abs(near_interface_id) == 1; - // if (is_found) - // { - // Real phi_0 = phi_data[package_index][i][j]; - // near_interface_id_data[package_index][i][j] = near_interface_id; - // phi_data[package_index][i][j] = near_interface_id == 1 ? fabs(phi_0) : -fabs(phi_0); - // } - // return is_found; - // }); - // } - // }); - // }); -} -//=============================================================================================// -void LevelSet::reinitializeLevelSet() -{ - reinitialize_level_set.exec(); - // package_parallel_for( - // [&](size_t package_index) - // { - // auto phi_data = phi_.DataField(); - // auto &phi_addrs = phi_data[package_index]; - // auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; - // auto &neighborhood = cell_neighborhood_[package_index]; - - // for_each_cell_data( - // [&](int i, int j) - // { - // // only reinitialize non cut cells - // if (near_interface_id_addrs[i][j] != 0) - // { - // Real phi_0 = phi_addrs[i][j]; - // Real sign = phi_0 / sqrt(phi_0 * phi_0 + data_spacing_ * data_spacing_); - // NeighbourIndex x1 = NeighbourIndexShift(Arrayi(i + 1, j), neighborhood); - // NeighbourIndex x2 = NeighbourIndexShift(Arrayi(i - 1, j), neighborhood); - // NeighbourIndex y1 = NeighbourIndexShift(Arrayi(i, j + 1), neighborhood); - // NeighbourIndex y2 = NeighbourIndexShift(Arrayi(i, j - 1), neighborhood); - // Real dv_x = upwindDifference(sign, phi_data[x1.first][x1.second[0]][x1.second[1]] - phi_0, - // phi_0 - phi_data[x2.first][x2.second[0]][x2.second[1]]); - // Real dv_y = upwindDifference(sign, phi_data[y1.first][y1.second[0]][y1.second[1]] - phi_0, - // phi_0 - phi_data[y2.first][y2.second[0]][y2.second[1]]); - // phi_addrs[i][j] -= 0.5 * sign * (Vec2d(dv_x, dv_y).norm() - data_spacing_); - // } - // }); - // }); -} -//=================================================================================================// -void LevelSet::markNearInterface(Real small_shift_factor) -{ - // Real small_shift = small_shift_factor * data_spacing_; - mark_near_interface.setSmallShiftFactor(small_shift_factor); - mark_near_interface.exec(); - // package_parallel_for( - // [&](size_t package_index) - // { - // auto &phi_addrs = phi_.DataField()[package_index]; - // auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; - // auto neighborhood = cell_neighborhood_[package_index]; - - // // corner averages, note that the first row and first column are not used - // PackageTemporaryData corner_averages; - // mesh_for_each2d<0, pkg_size + 1>( - // [&](int i, int j) - // { - // corner_averages[i][j] = CornerAverage(phi_, Arrayi(i, j), Arrayi(-1, -1), neighborhood); - // }); - - // for_each_cell_data( - // [&](int i, int j) - // { - // // first assume far cells - // Real phi_0 = phi_addrs[i][j]; - // int near_interface_id = phi_0 > 0.0 ? 2 : -2; - // if (fabs(phi_0) < small_shift) - // { - // near_interface_id = 0; - // Real phi_average_0 = corner_averages[i][j]; - // // find outer cut cells by comparing the sign of corner averages - // mesh_for_each2d<0, 2>( - // [&](int l, int m) - // { - // Real phi_average = corner_averages[i + l][j + m]; - // if ((phi_average_0 - small_shift) * (phi_average - small_shift) < 0.0) - // near_interface_id = 1; - // if ((phi_average_0 + small_shift) * (phi_average + small_shift) < 0.0) - // near_interface_id = -1; - // }); - // // find zero cut cells by comparing the sign of corner averages - // mesh_for_each2d<0, 2>( - // [&](int l, int m) - // { - // Real phi_average = corner_averages[i + l][j + m]; - // if (phi_average_0 * phi_average < 0.0) - // near_interface_id = 0; - // }); - // } - // // assign this to package - // near_interface_id_addrs[i][j] = near_interface_id; - // }); - // }); -} -//=================================================================================================// void LevelSet::redistanceInterfaceForAPackage(const size_t package_index) { auto phi_data = phi_.DataField(); diff --git a/src/for_3D_build/geometries/level_set_3d.cpp b/src/for_3D_build/geometries/level_set_3d.cpp index b25b7102d1..fa26349588 100644 --- a/src/for_3D_build/geometries/level_set_3d.cpp +++ b/src/for_3D_build/geometries/level_set_3d.cpp @@ -34,131 +34,6 @@ bool LevelSet::isWithinCorePackage(Vecd position) Arrayi cell_index = CellIndexFromPosition(position); return isCoreDataPackage(cell_index); } -//=============================================================================================// -void LevelSet::diffuseLevelSetSign() -{ - diffuse_level_set_sign.exec(); - // package_parallel_for( - // [&](size_t package_index) - // { - // auto phi_data = phi_.DataField(); - // auto near_interface_id_data = near_interface_id_.DataField(); - // auto &neighborhood = cell_neighborhood_[package_index]; - - // for_each_cell_data( - // [&](int i, int j, int k) - // { - // // near interface cells are not considered - // if (abs(near_interface_id_data[package_index][i][j][k]) > 1) - // { - // mesh_find_if3d<-1, 2>( - // [&](int l, int m, int n) -> bool - // { - // NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i + l, j + m, k + n), neighborhood); - // int near_interface_id = near_interface_id_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; - // bool is_found = abs(near_interface_id) == 1; - // if (is_found) - // { - // Real phi_0 = phi_data[package_index][i][j][k]; - // near_interface_id_data[package_index][i][j][k] = near_interface_id; - // phi_data[package_index][i][j][k] = near_interface_id == 1 ? fabs(phi_0) : -fabs(phi_0); - // } - // return is_found; - // }); - // } - // }); - // }); -} -//=============================================================================================// -void LevelSet::reinitializeLevelSet() -{ - reinitialize_level_set.exec(); - // package_parallel_for( - // [&](size_t package_index) - // { - // auto phi_data = phi_.DataField(); - // auto &phi_addrs = phi_data[package_index]; - // auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; - // auto &neighborhood = cell_neighborhood_[package_index]; - - // for_each_cell_data( - // [&](int i, int j, int k) - // { - // // only reinitialize non cut cells - // if (near_interface_id_addrs[i][j][k] != 0) - // { - // Real phi_0 = phi_addrs[i][j][k]; - // Real sign = phi_0 / sqrt(phi_0 * phi_0 + data_spacing_ * data_spacing_); - // NeighbourIndex x1 = NeighbourIndexShift(Arrayi(i + 1, j, k), neighborhood); - // NeighbourIndex x2 = NeighbourIndexShift(Arrayi(i - 1, j, k), neighborhood); - // NeighbourIndex y1 = NeighbourIndexShift(Arrayi(i, j + 1, k), neighborhood); - // NeighbourIndex y2 = NeighbourIndexShift(Arrayi(i, j - 1, k), neighborhood); - // NeighbourIndex z1 = NeighbourIndexShift(Arrayi(i, j, k + 1), neighborhood); - // NeighbourIndex z2 = NeighbourIndexShift(Arrayi(i, j, k - 1), neighborhood); - // Real dv_x = upwindDifference(sign, phi_data[x1.first][x1.second[0]][x1.second[1]][x1.second[2]] - phi_0, phi_0 - phi_data[x2.first][x2.second[0]][x2.second[1]][x2.second[2]]); - // Real dv_y = upwindDifference(sign, phi_data[y1.first][y1.second[0]][y1.second[1]][y1.second[2]] - phi_0, phi_0 - phi_data[y2.first][y2.second[0]][y2.second[1]][y2.second[2]]); - // Real dv_z = upwindDifference(sign, phi_data[z1.first][z1.second[0]][z1.second[1]][z1.second[2]] - phi_0, phi_0 - phi_data[z2.first][z2.second[0]][z2.second[1]][z2.second[2]]); - // phi_addrs[i][j][k] -= 0.3 * sign * (Vec3d(dv_x, dv_y, dv_z).norm() - data_spacing_); - // } - // }); - // }); -} -//=================================================================================================// -void LevelSet::markNearInterface(Real small_shift_factor) -{ - // Real small_shift = small_shift_factor * data_spacing_; - mark_near_interface.setSmallShiftFactor(small_shift_factor); - mark_near_interface.exec(); - - // package_parallel_for( - // [&](size_t package_index) - // { - // auto &phi_addrs = phi_.DataField()[package_index]; - // auto &near_interface_id_addrs = near_interface_id_.DataField()[package_index]; - // auto neighborhood = cell_neighborhood_[package_index]; - - // // corner averages, note that the first row and first column are not used - // PackageTemporaryData corner_averages; - // mesh_for_each3d<0, pkg_size + 1>( - // [&](int i, int j, int k) - // { - // corner_averages[i][j][k] = CornerAverage(phi_, Arrayi(i, j, k), Arrayi(-1, -1, -1), neighborhood); - // }); - - // for_each_cell_data( - // [&](int i, int j, int k) - // { - // // first assume far cells - // Real phi_0 = phi_addrs[i][j][k]; - // int near_interface_id = phi_0 > 0.0 ? 2 : -2; - // if (fabs(phi_0) < small_shift) - // { - // near_interface_id = 0; - // Real phi_average_0 = corner_averages[i][j][k]; - // // find inner and outer cut cells - // mesh_for_each3d<0, 2>( - // [&](int l, int m, int n) - // { - // Real phi_average = corner_averages[i + l][j + m][k + n]; - // if ((phi_average_0 - small_shift) * (phi_average - small_shift) < 0.0) - // near_interface_id = 1; - // if ((phi_average_0 + small_shift) * (phi_average + small_shift) < 0.0) - // near_interface_id = -1; - // }); - // // find zero cut cells - // mesh_for_each3d<0, 2>( - // [&](int l, int m, int n) - // { - // Real phi_average = corner_averages[i + l][j + m][k + n]; - // if (phi_average_0 * phi_average < 0.0) - // near_interface_id = 0; - // }); - // } - // // assign this is to package - // near_interface_id_addrs[i][j][k] = near_interface_id; - // }); - // }); -} //=================================================================================================// void LevelSet::redistanceInterfaceForAPackage(const size_t package_index) { diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index d100b53688..f27a150743 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -118,18 +118,20 @@ void LevelSet::redistanceInterface() //=================================================================================================// void LevelSet::cleanInterface(Real small_shift_factor) { - markNearInterface(small_shift_factor); + mark_near_interface.setSmallShiftFactor(small_shift_factor); + mark_near_interface.exec(); redistanceInterface(); - reinitializeLevelSet(); + reinitialize_level_set.exec(); update_level_set_gradient.exec(); update_kernel_integrals.exec(); } //=============================================================================================// void LevelSet::correctTopology(Real small_shift_factor) { - markNearInterface(small_shift_factor); + mark_near_interface.setSmallShiftFactor(small_shift_factor); + mark_near_interface.exec(); for (size_t i = 0; i != 10; ++i) - diffuseLevelSetSign(); + diffuse_level_set_sign.exec(); update_level_set_gradient.exec(); update_kernel_integrals.exec(); } diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index f7d678ebc4..7d83ded5c3 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -112,10 +112,7 @@ class LevelSet : public MeshWithGridDataPackages<4>, void redistanceInterfaceForAPackage(const size_t package_index); void finishDataPackages(); - void reinitializeLevelSet(); - void markNearInterface(Real small_shift_factor); void redistanceInterface(); - void diffuseLevelSetSign(); MeshAllDynamics initialize_data_in_a_cell{mesh_data_, shape_}; MeshAllDynamics tag_a_cell_is_inner_package{mesh_data_}; From 99b021b18bf5f09c551e2a89fa9953feaf574c37 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Sun, 18 Aug 2024 19:41:19 +0200 Subject: [PATCH 39/55] wrap redistance --- src/for_2D_build/geometries/level_set_2d.cpp | 76 ------------------- src/for_3D_build/geometries/level_set_3d.cpp | 76 ------------------- .../meshes/mesh_local_dynamics_3d.cpp | 74 +++++++++++++++++- src/shared/geometries/level_set.cpp | 15 +--- src/shared/geometries/level_set.h | 1 - 5 files changed, 74 insertions(+), 168 deletions(-) diff --git a/src/for_2D_build/geometries/level_set_2d.cpp b/src/for_2D_build/geometries/level_set_2d.cpp index a92a8e452b..da3cf000cf 100644 --- a/src/for_2D_build/geometries/level_set_2d.cpp +++ b/src/for_2D_build/geometries/level_set_2d.cpp @@ -34,82 +34,6 @@ bool LevelSet::isWithinCorePackage(Vecd position) Arrayi cell_index = CellIndexFromPosition(position); return isCoreDataPackage(cell_index); } -//=================================================================================================// -void LevelSet::redistanceInterfaceForAPackage(const size_t package_index) -{ - auto phi_data = phi_.DataField(); - auto near_interface_id_data = near_interface_id_.DataField(); - auto &neighborhood = cell_neighborhood_[package_index]; - - for_each_cell_data( - [&](int i, int j) - { - int near_interface_id = near_interface_id_data[package_index][i][j]; - if (near_interface_id == 0) - { - bool positive_band = false; - bool negative_band = false; - mesh_for_each2d<-1, 2>( - [&](int r, int s) - { - NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i + r, j + s), neighborhood); - int neighbor_near_interface_id = near_interface_id_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]]; - if (neighbor_near_interface_id >= 1) - positive_band = true; - if (neighbor_near_interface_id <= -1) - negative_band = true; - }); - if (positive_band == false) - { - Real min_distance_p = 5.0 * data_spacing_; - mesh_for_each2d<-4, 5>( - [&](int x, int y) - { - NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i + x, j + y), neighborhood); - auto &neighbor_phi = phi_.DataField()[neighbour_index.first]; - auto &neighbor_phi_gradient = phi_gradient_.DataField()[neighbour_index.first]; - auto &neighbor_near_interface_id = near_interface_id_.DataField()[neighbour_index.first]; - if (neighbor_near_interface_id[neighbour_index.second[0]][neighbour_index.second[1]] >= 1) - { - Real phi_p_ = neighbor_phi[neighbour_index.second[0]][neighbour_index.second[1]]; - Vecd norm_to_face = neighbor_phi_gradient[neighbour_index.second[0]][neighbour_index.second[1]]; - norm_to_face /= norm_to_face.norm() + TinyReal; - min_distance_p = SMIN(min_distance_p, (Vecd((Real)x, (Real)y) * data_spacing_ + phi_p_ * norm_to_face).norm()); - } - }); - phi_data[package_index][i][j] = -min_distance_p; - // this immediate switch of near interface id - // does not intervening with the identification of unresolved interface - // based on the assumption that positive false_and negative bands are not close to each other - near_interface_id_data[package_index][i][j] = -1; - } - if (negative_band == false) - { - Real min_distance_n = 5.0 * data_spacing_; - mesh_for_each2d<-4, 5>( - [&](int x, int y) - { - NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i + x, j + y), neighborhood); - auto &neighbor_phi = phi_.DataField()[neighbour_index.first]; - auto &neighbor_phi_gradient = phi_gradient_.DataField()[neighbour_index.first]; - auto &neighbor_near_interface_id = near_interface_id_.DataField()[neighbour_index.first]; - if (neighbor_near_interface_id[neighbour_index.second[0]][neighbour_index.second[1]] <= -1) - { - Real phi_n_ = neighbor_phi[neighbour_index.second[0]][neighbour_index.second[1]]; - Vecd norm_to_face = neighbor_phi_gradient[neighbour_index.second[0]][neighbour_index.second[1]]; - norm_to_face /= norm_to_face.norm() + TinyReal; - min_distance_n = SMIN(min_distance_n, (Vecd((Real)x, (Real)y) * data_spacing_ - phi_n_ * norm_to_face).norm()); - } - }); - phi_data[package_index][i][j] = min_distance_n; - // this immediate switch of near interface id - // does not intervening with the identification of unresolved interface - // based on the assumption that positive false_and negative bands are not close to each other - near_interface_id_data[package_index][i][j] = 1; - } - } - }); -} //=============================================================================================// void LevelSet::writeMeshFieldToPlt(std::ofstream &output_file) { diff --git a/src/for_3D_build/geometries/level_set_3d.cpp b/src/for_3D_build/geometries/level_set_3d.cpp index fa26349588..d5f24b3d14 100644 --- a/src/for_3D_build/geometries/level_set_3d.cpp +++ b/src/for_3D_build/geometries/level_set_3d.cpp @@ -35,82 +35,6 @@ bool LevelSet::isWithinCorePackage(Vecd position) return isCoreDataPackage(cell_index); } //=================================================================================================// -void LevelSet::redistanceInterfaceForAPackage(const size_t package_index) -{ - auto phi_data = phi_.DataField(); - auto near_interface_id_data = near_interface_id_.DataField(); - auto &neighborhood = cell_neighborhood_[package_index]; - - for_each_cell_data( - [&](int i, int j, int k) - { - int near_interface_id = near_interface_id_data[package_index][i][j][k]; - if (near_interface_id == 0) - { - bool positive_band = false; - bool negative_band = false; - mesh_for_each3d<-1, 2>( - [&](int r, int s, int t) - { - NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i + r, j + s, k + t), neighborhood); - int neighbor_near_interface_id = near_interface_id_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; - if (neighbor_near_interface_id >= 1) - positive_band = true; - if (neighbor_near_interface_id <= -1) - negative_band = true; - }); - if (positive_band == false) - { - Real min_distance_p = 5.0 * data_spacing_; - mesh_for_each3d<-4, 5>( - [&](int x, int y, int z) - { - NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i + x, j + y, k + z), neighborhood); - auto &neighbor_phi = phi_.DataField()[neighbour_index.first]; - auto &neighbor_phi_gradient = phi_gradient_.DataField()[neighbour_index.first]; - auto &neighbor_near_interface_id = near_interface_id_.DataField()[neighbour_index.first]; - if (neighbor_near_interface_id[neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]] >= 1) - { - Real phi_p_ = neighbor_phi[neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; - Vecd norm_to_face = neighbor_phi_gradient[neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; - norm_to_face /= norm_to_face.norm() + TinyReal; - min_distance_p = SMIN(min_distance_p, (Vecd((Real)x, (Real)y, Real(z)) * data_spacing_ + phi_p_ * norm_to_face).norm()); - } - }); - phi_data[package_index][i][j][k] = -min_distance_p; - // this immediate switch of near interface id - // does not intervening with the identification of unresolved interface - // based on the assumption that positive false_and negative bands are not close to each other - near_interface_id_data[package_index][i][j][k] = -1; - } - if (negative_band == false) - { - Real min_distance_n = 5.0 * data_spacing_; - mesh_for_each3d<-4, 5>( - [&](int x, int y, int z) - { - NeighbourIndex neighbour_index = NeighbourIndexShift(Arrayi(i + x, j + y, k + z), neighborhood); - auto &neighbor_phi = phi_.DataField()[neighbour_index.first]; - auto &neighbor_phi_gradient = phi_gradient_.DataField()[neighbour_index.first]; - auto &neighbor_near_interface_id = near_interface_id_.DataField()[neighbour_index.first]; - if (neighbor_near_interface_id[neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]] <= -1) - { - Real phi_n_ = neighbor_phi[neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; - Vecd norm_to_face = neighbor_phi_gradient[neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; - norm_to_face /= norm_to_face.norm() + TinyReal; - min_distance_n = SMIN(min_distance_n, (Vecd((Real)x, (Real)y, Real(z)) * data_spacing_ - phi_n_ * norm_to_face).norm()); - } - }); - phi_data[package_index][i][j][k] = min_distance_n; - // this immediate switch of near interface id - // does not intervening with the identification of unresolved interface - // based on the assumption that positive false_and negative bands are not close to each other - near_interface_id_data[package_index][i][j][k] = 1; - } - } - }); -} -//=================================================================================================// void LevelSet::writeMeshFieldToPlt(std::ofstream &output_file) { Arrayi number_of_operation = global_mesh_.AllGridPoints(); diff --git a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp index caca7d67b6..c98d3d4c1f 100644 --- a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp +++ b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp @@ -228,7 +228,79 @@ void MarkNearInterface::update(const size_t &package_index) //=============================================================================================// void RedistanceInterface::update(const size_t &package_index) { - printf("this is the execution of DiffuseLevelSetSign\n"); + auto phi_data = phi_.DataField(); + auto near_interface_id_data = near_interface_id_.DataField(); + auto &neighborhood = mesh_data_.cell_neighborhood_[package_index]; + + using NeighbourIndex = std::pair; /**< stores shifted neighbour info: (size_t)package index, (arrayi)local grid index. */ + mesh_data_.for_each_cell_data( + [&](int i, int j, int k) + { + int near_interface_id = near_interface_id_data[package_index][i][j][k]; + if (near_interface_id == 0) + { + bool positive_band = false; + bool negative_band = false; + mesh_for_each3d<-1, 2>( + [&](int r, int s, int t) + { + NeighbourIndex neighbour_index = mesh_data_.NeighbourIndexShift(Arrayi(i + r, j + s, k + t), neighborhood); + int neighbor_near_interface_id = near_interface_id_data[neighbour_index.first][neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; + if (neighbor_near_interface_id >= 1) + positive_band = true; + if (neighbor_near_interface_id <= -1) + negative_band = true; + }); + if (positive_band == false) + { + Real min_distance_p = 5.0 * data_spacing_; + mesh_for_each3d<-4, 5>( + [&](int x, int y, int z) + { + NeighbourIndex neighbour_index = mesh_data_.NeighbourIndexShift(Arrayi(i + x, j + y, k + z), neighborhood); + auto &neighbor_phi = phi_.DataField()[neighbour_index.first]; + auto &neighbor_phi_gradient = phi_gradient_.DataField()[neighbour_index.first]; + auto &neighbor_near_interface_id = near_interface_id_.DataField()[neighbour_index.first]; + if (neighbor_near_interface_id[neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]] >= 1) + { + Real phi_p_ = neighbor_phi[neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; + Vecd norm_to_face = neighbor_phi_gradient[neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; + norm_to_face /= norm_to_face.norm() + TinyReal; + min_distance_p = SMIN(min_distance_p, (Vecd((Real)x, (Real)y, Real(z)) * data_spacing_ + phi_p_ * norm_to_face).norm()); + } + }); + phi_data[package_index][i][j][k] = -min_distance_p; + // this immediate switch of near interface id + // does not intervening with the identification of unresolved interface + // based on the assumption that positive false_and negative bands are not close to each other + near_interface_id_data[package_index][i][j][k] = -1; + } + if (negative_band == false) + { + Real min_distance_n = 5.0 * data_spacing_; + mesh_for_each3d<-4, 5>( + [&](int x, int y, int z) + { + NeighbourIndex neighbour_index = mesh_data_.NeighbourIndexShift(Arrayi(i + x, j + y, k + z), neighborhood); + auto &neighbor_phi = phi_.DataField()[neighbour_index.first]; + auto &neighbor_phi_gradient = phi_gradient_.DataField()[neighbour_index.first]; + auto &neighbor_near_interface_id = near_interface_id_.DataField()[neighbour_index.first]; + if (neighbor_near_interface_id[neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]] <= -1) + { + Real phi_n_ = neighbor_phi[neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; + Vecd norm_to_face = neighbor_phi_gradient[neighbour_index.second[0]][neighbour_index.second[1]][neighbour_index.second[2]]; + norm_to_face /= norm_to_face.norm() + TinyReal; + min_distance_n = SMIN(min_distance_n, (Vecd((Real)x, (Real)y, Real(z)) * data_spacing_ - phi_n_ * norm_to_face).norm()); + } + }); + phi_data[package_index][i][j][k] = min_distance_n; + // this immediate switch of near interface id + // does not intervening with the identification of unresolved interface + // based on the assumption that positive false_and negative bands are not close to each other + near_interface_id_data[package_index][i][j][k] = 1; + } + } + }); } //=============================================================================================// void DiffuseLevelSetSign::update(const size_t &package_index) diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index f27a150743..ac97b3ac49 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -103,24 +103,11 @@ Vecd LevelSet::probeKernelGradientIntegral(const Vecd &position, Real h_ratio) return probeMesh(kernel_gradient_, position); } //=================================================================================================// -void LevelSet::redistanceInterface() -{ - // redistance_interface.exec(); - package_parallel_for( - [&](size_t package_index) { - std::pair &metadata = meta_data_cell_[package_index]; - if (metadata.second == 1) - { - redistanceInterfaceForAPackage(PackageIndexFromCellIndex(metadata.first)); - } - }); -} -//=================================================================================================// void LevelSet::cleanInterface(Real small_shift_factor) { mark_near_interface.setSmallShiftFactor(small_shift_factor); mark_near_interface.exec(); - redistanceInterface(); + redistance_interface.exec(); reinitialize_level_set.exec(); update_level_set_gradient.exec(); update_kernel_integrals.exec(); diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index 7d83ded5c3..84ca8114bd 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -112,7 +112,6 @@ class LevelSet : public MeshWithGridDataPackages<4>, void redistanceInterfaceForAPackage(const size_t package_index); void finishDataPackages(); - void redistanceInterface(); MeshAllDynamics initialize_data_in_a_cell{mesh_data_, shape_}; MeshAllDynamics tag_a_cell_is_inner_package{mesh_data_}; From f43df06c3564f3f60dac08c334ede2c309b864a6 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Sun, 18 Aug 2024 21:21:09 +0200 Subject: [PATCH 40/55] (wrapped) init singular --- src/for_2D_build/geometries/level_set_2d.cpp | 19 -------- .../meshes/mesh_local_dynamics_2d.cpp | 19 ++++++++ src/for_3D_build/geometries/level_set_3d.cpp | 19 -------- .../meshes/mesh_local_dynamics_3d.cpp | 19 ++++++++ src/shared/geometries/level_set.cpp | 6 +-- src/shared/geometries/level_set.h | 3 -- src/shared/meshes/mesh_dynamics.h | 43 +++++++++++++------ src/shared/meshes/mesh_local_dynamics.h | 12 +++++- 8 files changed, 82 insertions(+), 58 deletions(-) diff --git a/src/for_2D_build/geometries/level_set_2d.cpp b/src/for_2D_build/geometries/level_set_2d.cpp index da3cf000cf..cb0513c896 100644 --- a/src/for_2D_build/geometries/level_set_2d.cpp +++ b/src/for_2D_build/geometries/level_set_2d.cpp @@ -10,25 +10,6 @@ namespace SPH { //=================================================================================================// -void LevelSet::initializeDataForSingularPackage(const size_t package_index, Real far_field_level_set) -{ - auto &phi = phi_.DataField()[package_index]; - auto &near_interface_id = near_interface_id_.DataField()[package_index]; - auto &phi_gradient = phi_gradient_.DataField()[package_index]; - auto &kernel_weight = kernel_weight_.DataField()[package_index]; - auto &kernel_gradient = kernel_gradient_.DataField()[package_index]; - - for_each_cell_data( - [&](int i, int j) - { - phi[i][j] = far_field_level_set; - near_interface_id[i][j] = far_field_level_set < 0.0 ? -2 : 2; - phi_gradient[i][j] = Vecd::Ones(); - kernel_weight[i][j] = far_field_level_set < 0.0 ? 0 : 1.0; - kernel_gradient[i][j] = Vec2d::Zero(); - }); -} -//=================================================================================================// bool LevelSet::isWithinCorePackage(Vecd position) { Arrayi cell_index = CellIndexFromPosition(position); diff --git a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp index 0edb627a77..91b7bc17b1 100644 --- a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp +++ b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp @@ -5,6 +5,25 @@ namespace SPH { //=============================================================================================// +void InitializeDataForSingularPackage::update(const size_t package_index, Real far_field_level_set) +{ + auto &phi = phi_.DataField()[package_index]; + auto &near_interface_id = near_interface_id_.DataField()[package_index]; + auto &phi_gradient = phi_gradient_.DataField()[package_index]; + auto &kernel_weight = kernel_weight_.DataField()[package_index]; + auto &kernel_gradient = kernel_gradient_.DataField()[package_index]; + + mesh_data_.for_each_cell_data( + [&](int i, int j) + { + phi[i][j] = far_field_level_set; + near_interface_id[i][j] = far_field_level_set < 0.0 ? -2 : 2; + phi_gradient[i][j] = Vecd::Ones(); + kernel_weight[i][j] = far_field_level_set < 0.0 ? 0 : 1.0; + kernel_gradient[i][j] = Vec2d::Zero(); + }); +} +//=============================================================================================// size_t InitializeDataInACell::SortIndexFromCellIndex(const Arrayi &cell_index) { return cell_index[0] * all_cells_[1] + cell_index[1]; diff --git a/src/for_3D_build/geometries/level_set_3d.cpp b/src/for_3D_build/geometries/level_set_3d.cpp index d5f24b3d14..406d007a77 100644 --- a/src/for_3D_build/geometries/level_set_3d.cpp +++ b/src/for_3D_build/geometries/level_set_3d.cpp @@ -10,25 +10,6 @@ namespace SPH { //=================================================================================================// -void LevelSet::initializeDataForSingularPackage(const size_t package_index, Real far_field_level_set) -{ - auto &phi = phi_.DataField()[package_index]; - auto &near_interface_id = near_interface_id_.DataField()[package_index]; - auto &phi_gradient = phi_gradient_.DataField()[package_index]; - auto &kernel_weight = kernel_weight_.DataField()[package_index]; - auto &kernel_gradient = kernel_gradient_.DataField()[package_index]; - - for_each_cell_data( - [&](int i, int j, int k) - { - phi[i][j][k] = far_field_level_set; - near_interface_id[i][j][k] = far_field_level_set < 0.0 ? -2 : 2; - phi_gradient[i][j][k] = Vecd::Ones(); - kernel_weight[i][j][k] = far_field_level_set < 0.0 ? 0 : 1.0; - kernel_gradient[i][j][k] = Vec3d::Zero(); - }); -} -//=================================================================================================// bool LevelSet::isWithinCorePackage(Vecd position) { Arrayi cell_index = CellIndexFromPosition(position); diff --git a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp index c98d3d4c1f..c439d71e8b 100644 --- a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp +++ b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp @@ -5,6 +5,25 @@ namespace SPH { //=============================================================================================// +void InitializeDataForSingularPackage::update(const size_t package_index, Real far_field_level_set) +{ + auto &phi = phi_.DataField()[package_index]; + auto &near_interface_id = near_interface_id_.DataField()[package_index]; + auto &phi_gradient = phi_gradient_.DataField()[package_index]; + auto &kernel_weight = kernel_weight_.DataField()[package_index]; + auto &kernel_gradient = kernel_gradient_.DataField()[package_index]; + + mesh_data_.for_each_cell_data( + [&](int i, int j, int k) + { + phi[i][j][k] = far_field_level_set; + near_interface_id[i][j][k] = far_field_level_set < 0.0 ? -2 : 2; + phi_gradient[i][j][k] = Vecd::Ones(); + kernel_weight[i][j][k] = far_field_level_set < 0.0 ? 0 : 1.0; + kernel_gradient[i][j][k] = Vec3d::Zero(); + }); +} +//=============================================================================================// size_t InitializeDataInACell::SortIndexFromCellIndex(const Arrayi &cell_index) { return cell_index[0] * all_cells_[1] * all_cells_[2] + cell_index[1] * all_cells_[2] + cell_index[2]; diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index ac97b3ac49..3c984eab6a 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -58,10 +58,10 @@ void LevelSet::finishDataPackages() initialize_cell_neighborhood.exec(); resizeMeshVariableData(); - Real far_field_distance = grid_spacing_ * (Real)buffer_width_; - initializeDataForSingularPackage(0, -far_field_distance); - initializeDataForSingularPackage(1, far_field_distance); + MeshSingleDynamics initialize_data_for_singular_package(mesh_data_); + initialize_data_for_singular_package.exec(0, -far_field_distance); + initialize_data_for_singular_package.exec(1, far_field_distance); initialize_basic_data_for_a_package.exec(); update_level_set_gradient.exec(); diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index 84ca8114bd..84ad42fba6 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -108,9 +108,6 @@ class LevelSet : public MeshWithGridDataPackages<4>, MeshVariable &kernel_gradient_; MeshWithGridDataPackages<4> &mesh_data_ = *this; - void initializeDataForSingularPackage(const size_t package_index, Real far_field_level_set); - void redistanceInterfaceForAPackage(const size_t package_index); - void finishDataPackages(); MeshAllDynamics initialize_data_in_a_cell{mesh_data_, shape_}; MeshAllDynamics tag_a_cell_is_inner_package{mesh_data_}; diff --git a/src/shared/meshes/mesh_dynamics.h b/src/shared/meshes/mesh_dynamics.h index ad3270bfb1..be3f8dfab8 100644 --- a/src/shared/meshes/mesh_dynamics.h +++ b/src/shared/meshes/mesh_dynamics.h @@ -46,7 +46,6 @@ namespace SPH * This class contains only the interface functions available * for all dynamics. An specific implementation should be realized. */ -template class BaseMeshDynamics { public: @@ -54,9 +53,6 @@ class BaseMeshDynamics : mesh_data_(mesh_data){}; virtual ~BaseMeshDynamics(){}; - /** There is the interface functions for computing. */ - virtual ReturnType exec() = 0; - protected: MeshWithGridDataPackages<4> &mesh_data_; }; @@ -66,16 +62,16 @@ class BaseMeshDynamics * @brief Mesh dynamics for all cell on the mesh */ template -class MeshAllDynamics : public LocalDynamicsType, public BaseMeshDynamics +class MeshAllDynamics : public LocalDynamicsType, public BaseMeshDynamics { public: template MeshAllDynamics(MeshWithGridDataPackages<4> &mesh_data, Args &&...args) : LocalDynamicsType(mesh_data, std::forward(args)...), - BaseMeshDynamics(mesh_data){}; + BaseMeshDynamics(mesh_data){}; virtual ~MeshAllDynamics(){}; - virtual void exec() override + void exec() { mesh_data_.grid_parallel_for( [&](Arrayi cell_index) @@ -91,16 +87,16 @@ class MeshAllDynamics : public LocalDynamicsType, public BaseMeshDynamics * @brief Mesh dynamics for only inner cells on the mesh */ template -class MeshInnerDynamics : public LocalDynamicsType, public BaseMeshDynamics +class MeshInnerDynamics : public LocalDynamicsType, public BaseMeshDynamics { public: template MeshInnerDynamics(MeshWithGridDataPackages<4> &mesh_data, Args &&...args) : LocalDynamicsType(mesh_data, std::forward(args)...), - BaseMeshDynamics(mesh_data){}; + BaseMeshDynamics(mesh_data){}; virtual ~MeshInnerDynamics(){}; - virtual void exec() override + void exec() { mesh_data_.package_parallel_for( [&](size_t package_index) @@ -116,16 +112,16 @@ class MeshInnerDynamics : public LocalDynamicsType, public BaseMeshDynamics -class MeshCoreDynamics : public LocalDynamicsType, public BaseMeshDynamics +class MeshCoreDynamics : public LocalDynamicsType, public BaseMeshDynamics { public: template MeshCoreDynamics(DynamicsIdentifier &identifier, Args &&...args) : LocalDynamicsType(identifier, std::forward(args)...), - BaseMeshDynamics(identifier){}; + BaseMeshDynamics(identifier){}; virtual ~MeshCoreDynamics(){}; - virtual void exec() override + void exec() { mesh_data_.package_parallel_for( [&](size_t package_index) @@ -139,5 +135,26 @@ class MeshCoreDynamics : public LocalDynamicsType, public BaseMeshDynamics ); }; }; + +/** + * @class MeshSingleDynamics + * @brief Mesh dynamics for only core cells on the mesh + */ +template +class MeshSingleDynamics : public LocalDynamicsType, public BaseMeshDynamics +{ + public: + template + MeshSingleDynamics(DynamicsIdentifier &identifier, Args &&...args) + : LocalDynamicsType(identifier, std::forward(args)...), + BaseMeshDynamics(identifier){}; + virtual ~MeshSingleDynamics(){}; + + template + void exec(Args &&...args) + { + this->update(std::forward(args)...); + }; +}; } // namespace SPH #endif // MESH_DYNAMICS_H \ No newline at end of file diff --git a/src/shared/meshes/mesh_local_dynamics.h b/src/shared/meshes/mesh_local_dynamics.h index 00fdb164d3..1208feb21e 100644 --- a/src/shared/meshes/mesh_local_dynamics.h +++ b/src/shared/meshes/mesh_local_dynamics.h @@ -60,7 +60,7 @@ class BaseMeshLocalDynamics kernel_gradient_(*mesh_data.getMeshVariable("KernelGradient")){}; virtual ~BaseMeshLocalDynamics(){}; - virtual void update(const IndexType &index) = 0; + // virtual void update(const IndexType &index) = 0; protected: MeshWithGridDataPackages<4> &mesh_data_; Arrayi all_cells_; @@ -74,6 +74,16 @@ class BaseMeshLocalDynamics MeshVariable &kernel_gradient_; }; +class InitializeDataForSingularPackage : public BaseMeshLocalDynamics +{ + public: + explicit InitializeDataForSingularPackage(MeshWithGridDataPackages<4> &mesh_data) + : BaseMeshLocalDynamics(mesh_data){}; + virtual ~InitializeDataForSingularPackage(){}; + + void update(const size_t package_index, Real far_field_level_set); +}; + class InitializeDataInACell : public BaseMeshLocalDynamics { public: From 52dc1e63b5675930120c8eb8178cfd3d717aaa99 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Mon, 19 Aug 2024 01:29:08 +0200 Subject: [PATCH 41/55] temp --- src/for_2D_build/geometries/level_set_2d.cpp | 19 ------- .../meshes/mesh_local_dynamics_2d.cpp | 15 ++--- src/for_3D_build/geometries/level_set_3d.cpp | 19 ------- .../meshes/mesh_local_dynamics_3d.cpp | 15 ++--- src/shared/geometries/level_set.cpp | 31 ++++------- src/shared/geometries/level_set.h | 3 - src/shared/meshes/mesh_local_dynamics.cpp | 22 ++++++++ src/shared/meshes/mesh_local_dynamics.h | 55 +++++++++++-------- src/shared/meshes/mesh_with_data_packages.h | 6 ++ 9 files changed, 81 insertions(+), 104 deletions(-) diff --git a/src/for_2D_build/geometries/level_set_2d.cpp b/src/for_2D_build/geometries/level_set_2d.cpp index cb0513c896..a5fbb705f2 100644 --- a/src/for_2D_build/geometries/level_set_2d.cpp +++ b/src/for_2D_build/geometries/level_set_2d.cpp @@ -9,12 +9,6 @@ namespace SPH { -//=================================================================================================// -bool LevelSet::isWithinCorePackage(Vecd position) -{ - Arrayi cell_index = CellIndexFromPosition(position); - return isCoreDataPackage(cell_index); -} //=============================================================================================// void LevelSet::writeMeshFieldToPlt(std::ofstream &output_file) { @@ -128,18 +122,5 @@ void LevelSet::writeMeshFieldToPlt(std::ofstream &output_file) } } //=============================================================================================// -RefinedLevelSet::RefinedLevelSet(BoundingBox tentative_bounds, LevelSet &coarse_level_set, - Shape &shape, SPHAdaptation &sph_adaptation) - : RefinedMesh(tentative_bounds, coarse_level_set, 4, shape, sph_adaptation) -{ - mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), - [&](size_t i, size_t j) - { - initializeDataInACellFromCoarse(Arrayi(i, j)); - }); - - finishDataPackages(); -} -//=============================================================================================// } // namespace SPH //=============================================================================================// diff --git a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp index 91b7bc17b1..d35f6cd636 100644 --- a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp +++ b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp @@ -5,6 +5,11 @@ namespace SPH { //=============================================================================================// +size_t BaseMeshLocalDynamics::SortIndexFromCellIndex(const Arrayi &cell_index) +{ + return cell_index[0] * all_cells_[1] + cell_index[1]; +} +//=============================================================================================// void InitializeDataForSingularPackage::update(const size_t package_index, Real far_field_level_set) { auto &phi = phi_.DataField()[package_index]; @@ -24,16 +29,6 @@ void InitializeDataForSingularPackage::update(const size_t package_index, Real f }); } //=============================================================================================// -size_t InitializeDataInACell::SortIndexFromCellIndex(const Arrayi &cell_index) -{ - return cell_index[0] * all_cells_[1] + cell_index[1]; -} -//=============================================================================================// -size_t TagACellIsInnerPackage::SortIndexFromCellIndex(const Arrayi &cell_index) -{ - return cell_index[0] * all_cells_[1] + cell_index[1]; -} -//=============================================================================================// bool TagACellIsInnerPackage::isInnerPackage(const Arrayi &cell_index) { return mesh_any_of( diff --git a/src/for_3D_build/geometries/level_set_3d.cpp b/src/for_3D_build/geometries/level_set_3d.cpp index 406d007a77..718a1b6c1e 100644 --- a/src/for_3D_build/geometries/level_set_3d.cpp +++ b/src/for_3D_build/geometries/level_set_3d.cpp @@ -10,12 +10,6 @@ namespace SPH { //=================================================================================================// -bool LevelSet::isWithinCorePackage(Vecd position) -{ - Arrayi cell_index = CellIndexFromPosition(position); - return isCoreDataPackage(cell_index); -} -//=================================================================================================// void LevelSet::writeMeshFieldToPlt(std::ofstream &output_file) { Arrayi number_of_operation = global_mesh_.AllGridPoints(); @@ -124,17 +118,4 @@ void LevelSet::writeMeshFieldToPlt(std::ofstream &output_file) } } //=============================================================================================// -RefinedLevelSet::RefinedLevelSet(BoundingBox tentative_bounds, LevelSet &coarse_level_set, - Shape &shape, SPHAdaptation &sph_adaptation) - : RefinedMesh(tentative_bounds, coarse_level_set, 4, shape, sph_adaptation) -{ - mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), - [&](size_t i, size_t j, size_t k) - { - initializeDataInACellFromCoarse(Arrayi(i, j, k)); - }); - - finishDataPackages(); -} -//=============================================================================================// } // namespace SPH diff --git a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp index c439d71e8b..664a524371 100644 --- a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp +++ b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp @@ -5,6 +5,11 @@ namespace SPH { //=============================================================================================// +size_t BaseMeshLocalDynamics::SortIndexFromCellIndex(const Arrayi &cell_index) +{ + return cell_index[0] * all_cells_[1] * all_cells_[2] + cell_index[1] * all_cells_[2] + cell_index[2]; +} +//=============================================================================================// void InitializeDataForSingularPackage::update(const size_t package_index, Real far_field_level_set) { auto &phi = phi_.DataField()[package_index]; @@ -24,16 +29,6 @@ void InitializeDataForSingularPackage::update(const size_t package_index, Real f }); } //=============================================================================================// -size_t InitializeDataInACell::SortIndexFromCellIndex(const Arrayi &cell_index) -{ - return cell_index[0] * all_cells_[1] * all_cells_[2] + cell_index[1] * all_cells_[2] + cell_index[2]; -} -//=============================================================================================// -size_t TagACellIsInnerPackage::SortIndexFromCellIndex(const Arrayi &cell_index) -{ - return cell_index[0] * all_cells_[1] * all_cells_[2] + cell_index[1] * all_cells_[2] + cell_index[2]; -} -//=============================================================================================// bool TagACellIsInnerPackage::isInnerPackage(const Arrayi &cell_index) { return mesh_any_of( diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index 9777b11835..40bfc427b7 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -157,27 +157,20 @@ Real LevelSet::upwindDifference(Real sign, Real df_p, Real df_n) return df; } //=============================================================================================// -void RefinedLevelSet::initializeDataInACellFromCoarse(const Arrayi &cell_index) +bool LevelSet::isWithinCorePackage(Vecd position) { - Vecd cell_position = CellPositionFromIndex(cell_index); - size_t package_index = coarse_mesh_.probeSignedDistance(cell_position) < 0.0 ? 0 : 1; - assignDataPackageIndex(cell_index, package_index); - if (coarse_mesh_.isWithinCorePackage(cell_position)) - { - Real signed_distance = shape_.findSignedDistance(cell_position); - Vecd normal_direction = shape_.findNormalDirection(cell_position); - Real measure = (signed_distance * normal_direction).cwiseAbs().maxCoeff(); - if (measure < grid_spacing_) - { - std::pair occupied; - occupied.first = cell_index[0] * all_cells_[1] + cell_index[1]; - occupied.first = cell_index[0] * all_cells_[1] * all_cells_[2] + cell_index[1] * all_cells_[2] + cell_index[2]; - occupied.second = 1; + Arrayi cell_index = CellIndexFromPosition(position); + return isCoreDataPackage(cell_index); +} +//=============================================================================================// +RefinedLevelSet::RefinedLevelSet(BoundingBox tentative_bounds, LevelSet &coarse_level_set, + Shape &shape, SPHAdaptation &sph_adaptation) + : RefinedMesh(tentative_bounds, coarse_level_set, 4, shape, sph_adaptation) +{ + MeshAllDynamics initialize_data_in_a_cell_from_coarse(mesh_data_, coarse_mesh_, shape_); + initialize_data_in_a_cell_from_coarse.exec(); - mesh_data_.assignDataPackageIndex(cell_index, 2); - mesh_data_.registerOccupied(occupied); - } - } + finishDataPackages(); } //=============================================================================================// MultilevelLevelSet::MultilevelLevelSet( diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index 84ad42fba6..c451d7f38a 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -135,9 +135,6 @@ class RefinedLevelSet : public RefinedMesh public: RefinedLevelSet(BoundingBox tentative_bounds, LevelSet &coarse_level_set, Shape &shape, SPHAdaptation &sph_adaptation); virtual ~RefinedLevelSet(){}; - - protected: - void initializeDataInACellFromCoarse(const Arrayi &cell_index); }; /** diff --git a/src/shared/meshes/mesh_local_dynamics.cpp b/src/shared/meshes/mesh_local_dynamics.cpp index 649b8c97cf..627c0a19b3 100644 --- a/src/shared/meshes/mesh_local_dynamics.cpp +++ b/src/shared/meshes/mesh_local_dynamics.cpp @@ -98,5 +98,27 @@ void UpdateKernelIntegrals::update(const size_t &package_index) { return computeKernelGradientIntegral(position); }); } //=================================================================================================// +void InitializeDataInACellFromCoarse::update(const Arrayi &cell_index) +{ + Vecd cell_position = mesh_data_.CellPositionFromIndex(cell_index); + // size_t package_index = coarse_mesh_.probeSignedDistance(cell_position) < 0.0 ? 0 : 1; + mesh_data_.assignDataPackageIndex(cell_index, 1); //todo change the 1 to package_index here + if (coarse_mesh_.isWithinCorePackage(cell_position)) + { + Real signed_distance = shape_.findSignedDistance(cell_position); + Vecd normal_direction = shape_.findNormalDirection(cell_position); + Real measure = (signed_distance * normal_direction).cwiseAbs().maxCoeff(); + if (measure < grid_spacing_) + { + std::pair occupied; + occupied.first = SortIndexFromCellIndex(cell_index); + occupied.second = 1; + + mesh_data_.assignDataPackageIndex(cell_index, 2); + mesh_data_.registerOccupied(occupied); + } + } +} +//=================================================================================================// } // namespace SPH //=================================================================================================// diff --git a/src/shared/meshes/mesh_local_dynamics.h b/src/shared/meshes/mesh_local_dynamics.h index 1208feb21e..338e342108 100644 --- a/src/shared/meshes/mesh_local_dynamics.h +++ b/src/shared/meshes/mesh_local_dynamics.h @@ -44,7 +44,6 @@ using MeshWithGridDataPackagesType = MeshWithGridDataPackages<4>; * @class BaseMeshLocalDynamics * @brief The base class for all mesh local particle dynamics. */ -template class BaseMeshLocalDynamics { public: @@ -60,7 +59,6 @@ class BaseMeshLocalDynamics kernel_gradient_(*mesh_data.getMeshVariable("KernelGradient")){}; virtual ~BaseMeshLocalDynamics(){}; - // virtual void update(const IndexType &index) = 0; protected: MeshWithGridDataPackages<4> &mesh_data_; Arrayi all_cells_; @@ -72,9 +70,11 @@ class BaseMeshLocalDynamics MeshVariable &near_interface_id_; MeshVariable &kernel_weight_; MeshVariable &kernel_gradient_; + + size_t SortIndexFromCellIndex(const Arrayi &cell_index); }; -class InitializeDataForSingularPackage : public BaseMeshLocalDynamics +class InitializeDataForSingularPackage : public BaseMeshLocalDynamics { public: explicit InitializeDataForSingularPackage(MeshWithGridDataPackages<4> &mesh_data) @@ -84,7 +84,7 @@ class InitializeDataForSingularPackage : public BaseMeshLocalDynamics void update(const size_t package_index, Real far_field_level_set); }; -class InitializeDataInACell : public BaseMeshLocalDynamics +class InitializeDataInACell : public BaseMeshLocalDynamics { public: explicit InitializeDataInACell(MeshWithGridDataPackages<4> &mesh_data, Shape &shape) @@ -97,10 +97,10 @@ class InitializeDataInACell : public BaseMeshLocalDynamics private: Shape &shape_; - size_t SortIndexFromCellIndex(const Arrayi &cell_index); + // size_t SortIndexFromCellIndex(const Arrayi &cell_index); }; -class TagACellIsInnerPackage : public BaseMeshLocalDynamics +class TagACellIsInnerPackage : public BaseMeshLocalDynamics { public: explicit TagACellIsInnerPackage(MeshWithGridDataPackagesType &mesh_data) @@ -111,10 +111,10 @@ class TagACellIsInnerPackage : public BaseMeshLocalDynamics private: bool isInnerPackage(const Arrayi &cell_index); - size_t SortIndexFromCellIndex(const Arrayi &cell_index); + // size_t SortIndexFromCellIndex(const Arrayi &cell_index); }; -class InitializeIndexMesh : public BaseMeshLocalDynamics +class InitializeIndexMesh : public BaseMeshLocalDynamics { public: explicit InitializeIndexMesh(MeshWithGridDataPackagesType &mesh_data) @@ -127,7 +127,7 @@ class InitializeIndexMesh : public BaseMeshLocalDynamics Arrayi CellIndexFromSortIndex(const size_t &sort_index); }; -class InitializeCellNeighborhood : public BaseMeshLocalDynamics +class InitializeCellNeighborhood : public BaseMeshLocalDynamics { public: explicit InitializeCellNeighborhood(MeshWithGridDataPackagesType &mesh_data) @@ -140,7 +140,7 @@ class InitializeCellNeighborhood : public BaseMeshLocalDynamics Arrayi CellIndexFromSortIndex(const size_t &sort_index); }; -class InitializeBasicDataForAPackage : public BaseMeshLocalDynamics +class InitializeBasicDataForAPackage : public BaseMeshLocalDynamics { public: explicit InitializeBasicDataForAPackage(MeshWithGridDataPackagesType &mesh_data, Shape &shape) @@ -156,7 +156,7 @@ class InitializeBasicDataForAPackage : public BaseMeshLocalDynamics Arrayi CellIndexFromSortIndex(const size_t &sort_index); }; -class UpdateLevelSetGradient : public BaseMeshLocalDynamics +class UpdateLevelSetGradient : public BaseMeshLocalDynamics { public: explicit UpdateLevelSetGradient(MeshWithGridDataPackages<4> &mesh_data) @@ -166,7 +166,7 @@ class UpdateLevelSetGradient : public BaseMeshLocalDynamics void update(const size_t &index); }; -class UpdateKernelIntegrals : public BaseMeshLocalDynamics +class UpdateKernelIntegrals : public BaseMeshLocalDynamics { public: explicit UpdateKernelIntegrals(MeshWithGridDataPackagesType &mesh_data, Kernel &kernel, Real global_h_ratio) @@ -198,7 +198,7 @@ class UpdateKernelIntegrals : public BaseMeshLocalDynamics } }; -class ReinitializeLevelSet : public BaseMeshLocalDynamics +class ReinitializeLevelSet : public BaseMeshLocalDynamics { public: explicit ReinitializeLevelSet(MeshWithGridDataPackagesType &mesh_data) @@ -229,7 +229,7 @@ class ReinitializeLevelSet : public BaseMeshLocalDynamics } }; -class MarkNearInterface : public BaseMeshLocalDynamics +class MarkNearInterface : public BaseMeshLocalDynamics { public: explicit MarkNearInterface(MeshWithGridDataPackagesType &mesh_data) @@ -243,7 +243,7 @@ class MarkNearInterface : public BaseMeshLocalDynamics Real small_shift; }; -class RedistanceInterface : public BaseMeshLocalDynamics +class RedistanceInterface : public BaseMeshLocalDynamics { public: explicit RedistanceInterface(MeshWithGridDataPackagesType &mesh_data) @@ -253,7 +253,7 @@ class RedistanceInterface : public BaseMeshLocalDynamics void update(const size_t &package_index); }; -class DiffuseLevelSetSign : public BaseMeshLocalDynamics +class DiffuseLevelSetSign : public BaseMeshLocalDynamics { public: explicit DiffuseLevelSetSign(MeshWithGridDataPackagesType &mesh_data) @@ -263,15 +263,22 @@ class DiffuseLevelSetSign : public BaseMeshLocalDynamics void update(const size_t &package_index); }; -// class InitializeDataInACellFromCoarse : public BaseMeshLocalDynamics -// { -// public: -// explicit InitializeDataInACellFromCoarse(MeshWithGridDataPackagesType &mesh_data) -// : BaseMeshLocalDynamics(mesh_data){}; -// virtual ~InitializeDataInACellFromCoarse(){}; +class InitializeDataInACellFromCoarse : public BaseMeshLocalDynamics +{ + public: + explicit InitializeDataInACellFromCoarse(MeshWithGridDataPackagesType &mesh_data, MeshWithGridDataPackagesType &coarse_mesh, Shape &shape) + : BaseMeshLocalDynamics(mesh_data), + coarse_mesh_(coarse_mesh), + shape_(shape){}; + virtual ~InitializeDataInACellFromCoarse(){}; + + void update(const Arrayi &cell_index); + + private: + MeshWithGridDataPackagesType &coarse_mesh_; + Shape &shape_; -// void update(const Arrayi &cell_index); -// } +}; } // namespace SPH #endif // MESH_LOCAL_DYNAMICS_H diff --git a/src/shared/meshes/mesh_with_data_packages.h b/src/shared/meshes/mesh_with_data_packages.h index fb91d21ad5..d3c52cf7c5 100644 --- a/src/shared/meshes/mesh_with_data_packages.h +++ b/src/shared/meshes/mesh_with_data_packages.h @@ -280,6 +280,12 @@ class MeshWithGridDataPackages : public Mesh cell_neighborhood_ = new CellNeighborhood[num_grid_pkgs_]; meta_data_cell_ = new std::pair[num_grid_pkgs_]; } + + bool isWithinCorePackage(Vecd position) + { + Arrayi cell_index = CellIndexFromPosition(position); + return isCoreDataPackage(cell_index); + } }; } // namespace SPH #endif // MESH_WITH_DATA_PACKAGES_H From eb59a15240805d2c5230fbe8cbd1f3a7fc7ea085 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Mon, 19 Aug 2024 01:37:41 +0200 Subject: [PATCH 42/55] bug fix --- src/for_2D_build/geometries/level_set_2d.cpp | 19 ------- .../meshes/mesh_local_dynamics_2d.cpp | 15 ++--- src/for_3D_build/geometries/level_set_3d.cpp | 19 ------- .../meshes/mesh_local_dynamics_3d.cpp | 15 ++--- src/shared/geometries/level_set.cpp | 30 ++++------ src/shared/geometries/level_set.h | 3 - src/shared/meshes/mesh_local_dynamics.cpp | 23 ++++++++ src/shared/meshes/mesh_local_dynamics.h | 55 +++++++++++-------- src/shared/meshes/mesh_with_data_packages.h | 6 ++ 9 files changed, 82 insertions(+), 103 deletions(-) diff --git a/src/for_2D_build/geometries/level_set_2d.cpp b/src/for_2D_build/geometries/level_set_2d.cpp index cb0513c896..a5fbb705f2 100644 --- a/src/for_2D_build/geometries/level_set_2d.cpp +++ b/src/for_2D_build/geometries/level_set_2d.cpp @@ -9,12 +9,6 @@ namespace SPH { -//=================================================================================================// -bool LevelSet::isWithinCorePackage(Vecd position) -{ - Arrayi cell_index = CellIndexFromPosition(position); - return isCoreDataPackage(cell_index); -} //=============================================================================================// void LevelSet::writeMeshFieldToPlt(std::ofstream &output_file) { @@ -128,18 +122,5 @@ void LevelSet::writeMeshFieldToPlt(std::ofstream &output_file) } } //=============================================================================================// -RefinedLevelSet::RefinedLevelSet(BoundingBox tentative_bounds, LevelSet &coarse_level_set, - Shape &shape, SPHAdaptation &sph_adaptation) - : RefinedMesh(tentative_bounds, coarse_level_set, 4, shape, sph_adaptation) -{ - mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), - [&](size_t i, size_t j) - { - initializeDataInACellFromCoarse(Arrayi(i, j)); - }); - - finishDataPackages(); -} -//=============================================================================================// } // namespace SPH //=============================================================================================// diff --git a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp index 91b7bc17b1..d35f6cd636 100644 --- a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp +++ b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp @@ -5,6 +5,11 @@ namespace SPH { //=============================================================================================// +size_t BaseMeshLocalDynamics::SortIndexFromCellIndex(const Arrayi &cell_index) +{ + return cell_index[0] * all_cells_[1] + cell_index[1]; +} +//=============================================================================================// void InitializeDataForSingularPackage::update(const size_t package_index, Real far_field_level_set) { auto &phi = phi_.DataField()[package_index]; @@ -24,16 +29,6 @@ void InitializeDataForSingularPackage::update(const size_t package_index, Real f }); } //=============================================================================================// -size_t InitializeDataInACell::SortIndexFromCellIndex(const Arrayi &cell_index) -{ - return cell_index[0] * all_cells_[1] + cell_index[1]; -} -//=============================================================================================// -size_t TagACellIsInnerPackage::SortIndexFromCellIndex(const Arrayi &cell_index) -{ - return cell_index[0] * all_cells_[1] + cell_index[1]; -} -//=============================================================================================// bool TagACellIsInnerPackage::isInnerPackage(const Arrayi &cell_index) { return mesh_any_of( diff --git a/src/for_3D_build/geometries/level_set_3d.cpp b/src/for_3D_build/geometries/level_set_3d.cpp index 406d007a77..718a1b6c1e 100644 --- a/src/for_3D_build/geometries/level_set_3d.cpp +++ b/src/for_3D_build/geometries/level_set_3d.cpp @@ -10,12 +10,6 @@ namespace SPH { //=================================================================================================// -bool LevelSet::isWithinCorePackage(Vecd position) -{ - Arrayi cell_index = CellIndexFromPosition(position); - return isCoreDataPackage(cell_index); -} -//=================================================================================================// void LevelSet::writeMeshFieldToPlt(std::ofstream &output_file) { Arrayi number_of_operation = global_mesh_.AllGridPoints(); @@ -124,17 +118,4 @@ void LevelSet::writeMeshFieldToPlt(std::ofstream &output_file) } } //=============================================================================================// -RefinedLevelSet::RefinedLevelSet(BoundingBox tentative_bounds, LevelSet &coarse_level_set, - Shape &shape, SPHAdaptation &sph_adaptation) - : RefinedMesh(tentative_bounds, coarse_level_set, 4, shape, sph_adaptation) -{ - mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), - [&](size_t i, size_t j, size_t k) - { - initializeDataInACellFromCoarse(Arrayi(i, j, k)); - }); - - finishDataPackages(); -} -//=============================================================================================// } // namespace SPH diff --git a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp index c439d71e8b..664a524371 100644 --- a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp +++ b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp @@ -5,6 +5,11 @@ namespace SPH { //=============================================================================================// +size_t BaseMeshLocalDynamics::SortIndexFromCellIndex(const Arrayi &cell_index) +{ + return cell_index[0] * all_cells_[1] * all_cells_[2] + cell_index[1] * all_cells_[2] + cell_index[2]; +} +//=============================================================================================// void InitializeDataForSingularPackage::update(const size_t package_index, Real far_field_level_set) { auto &phi = phi_.DataField()[package_index]; @@ -24,16 +29,6 @@ void InitializeDataForSingularPackage::update(const size_t package_index, Real f }); } //=============================================================================================// -size_t InitializeDataInACell::SortIndexFromCellIndex(const Arrayi &cell_index) -{ - return cell_index[0] * all_cells_[1] * all_cells_[2] + cell_index[1] * all_cells_[2] + cell_index[2]; -} -//=============================================================================================// -size_t TagACellIsInnerPackage::SortIndexFromCellIndex(const Arrayi &cell_index) -{ - return cell_index[0] * all_cells_[1] * all_cells_[2] + cell_index[1] * all_cells_[2] + cell_index[2]; -} -//=============================================================================================// bool TagACellIsInnerPackage::isInnerPackage(const Arrayi &cell_index) { return mesh_any_of( diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index 3c984eab6a..40bfc427b7 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -157,26 +157,20 @@ Real LevelSet::upwindDifference(Real sign, Real df_p, Real df_n) return df; } //=============================================================================================// -void RefinedLevelSet::initializeDataInACellFromCoarse(const Arrayi &cell_index) +bool LevelSet::isWithinCorePackage(Vecd position) { - Vecd cell_position = CellPositionFromIndex(cell_index); - size_t package_index = coarse_mesh_.probeSignedDistance(cell_position) < 0.0 ? 0 : 1; - assignDataPackageIndex(cell_index, package_index); - if (coarse_mesh_.isWithinCorePackage(cell_position)) - { - Real signed_distance = shape_.findSignedDistance(cell_position); - Vecd normal_direction = shape_.findNormalDirection(cell_position); - Real measure = (signed_distance * normal_direction).cwiseAbs().maxCoeff(); - if (measure < grid_spacing_) - { - std::pair occupied; - occupied.first = cell_index[0] * all_cells_[1] + cell_index[1]; - occupied.second = 1; + Arrayi cell_index = CellIndexFromPosition(position); + return isCoreDataPackage(cell_index); +} +//=============================================================================================// +RefinedLevelSet::RefinedLevelSet(BoundingBox tentative_bounds, LevelSet &coarse_level_set, + Shape &shape, SPHAdaptation &sph_adaptation) + : RefinedMesh(tentative_bounds, coarse_level_set, 4, shape, sph_adaptation) +{ + MeshAllDynamics initialize_data_in_a_cell_from_coarse(mesh_data_, coarse_mesh_, shape_); + initialize_data_in_a_cell_from_coarse.exec(); - mesh_data_.assignDataPackageIndex(cell_index, 2); - mesh_data_.registerOccupied(occupied); - } - } + finishDataPackages(); } //=============================================================================================// MultilevelLevelSet::MultilevelLevelSet( diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index 84ad42fba6..c451d7f38a 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -135,9 +135,6 @@ class RefinedLevelSet : public RefinedMesh public: RefinedLevelSet(BoundingBox tentative_bounds, LevelSet &coarse_level_set, Shape &shape, SPHAdaptation &sph_adaptation); virtual ~RefinedLevelSet(){}; - - protected: - void initializeDataInACellFromCoarse(const Arrayi &cell_index); }; /** diff --git a/src/shared/meshes/mesh_local_dynamics.cpp b/src/shared/meshes/mesh_local_dynamics.cpp index 649b8c97cf..3e255c747c 100644 --- a/src/shared/meshes/mesh_local_dynamics.cpp +++ b/src/shared/meshes/mesh_local_dynamics.cpp @@ -98,5 +98,28 @@ void UpdateKernelIntegrals::update(const size_t &package_index) { return computeKernelGradientIntegral(position); }); } //=================================================================================================// +void InitializeDataInACellFromCoarse::update(const Arrayi &cell_index) +{ + Vecd cell_position = mesh_data_.CellPositionFromIndex(cell_index); + MeshVariable &coarse_phi_ = *coarse_mesh_.getMeshVariable("Levelset"); + size_t package_index = coarse_mesh_.probeMesh(coarse_phi_, cell_position) < 0.0 ? 0 : 1; + mesh_data_.assignDataPackageIndex(cell_index, package_index); + if (coarse_mesh_.isWithinCorePackage(cell_position)) + { + Real signed_distance = shape_.findSignedDistance(cell_position); + Vecd normal_direction = shape_.findNormalDirection(cell_position); + Real measure = (signed_distance * normal_direction).cwiseAbs().maxCoeff(); + if (measure < grid_spacing_) + { + std::pair occupied; + occupied.first = SortIndexFromCellIndex(cell_index); + occupied.second = 1; + + mesh_data_.assignDataPackageIndex(cell_index, 2); + mesh_data_.registerOccupied(occupied); + } + } +} +//=================================================================================================// } // namespace SPH //=================================================================================================// diff --git a/src/shared/meshes/mesh_local_dynamics.h b/src/shared/meshes/mesh_local_dynamics.h index 1208feb21e..338e342108 100644 --- a/src/shared/meshes/mesh_local_dynamics.h +++ b/src/shared/meshes/mesh_local_dynamics.h @@ -44,7 +44,6 @@ using MeshWithGridDataPackagesType = MeshWithGridDataPackages<4>; * @class BaseMeshLocalDynamics * @brief The base class for all mesh local particle dynamics. */ -template class BaseMeshLocalDynamics { public: @@ -60,7 +59,6 @@ class BaseMeshLocalDynamics kernel_gradient_(*mesh_data.getMeshVariable("KernelGradient")){}; virtual ~BaseMeshLocalDynamics(){}; - // virtual void update(const IndexType &index) = 0; protected: MeshWithGridDataPackages<4> &mesh_data_; Arrayi all_cells_; @@ -72,9 +70,11 @@ class BaseMeshLocalDynamics MeshVariable &near_interface_id_; MeshVariable &kernel_weight_; MeshVariable &kernel_gradient_; + + size_t SortIndexFromCellIndex(const Arrayi &cell_index); }; -class InitializeDataForSingularPackage : public BaseMeshLocalDynamics +class InitializeDataForSingularPackage : public BaseMeshLocalDynamics { public: explicit InitializeDataForSingularPackage(MeshWithGridDataPackages<4> &mesh_data) @@ -84,7 +84,7 @@ class InitializeDataForSingularPackage : public BaseMeshLocalDynamics void update(const size_t package_index, Real far_field_level_set); }; -class InitializeDataInACell : public BaseMeshLocalDynamics +class InitializeDataInACell : public BaseMeshLocalDynamics { public: explicit InitializeDataInACell(MeshWithGridDataPackages<4> &mesh_data, Shape &shape) @@ -97,10 +97,10 @@ class InitializeDataInACell : public BaseMeshLocalDynamics private: Shape &shape_; - size_t SortIndexFromCellIndex(const Arrayi &cell_index); + // size_t SortIndexFromCellIndex(const Arrayi &cell_index); }; -class TagACellIsInnerPackage : public BaseMeshLocalDynamics +class TagACellIsInnerPackage : public BaseMeshLocalDynamics { public: explicit TagACellIsInnerPackage(MeshWithGridDataPackagesType &mesh_data) @@ -111,10 +111,10 @@ class TagACellIsInnerPackage : public BaseMeshLocalDynamics private: bool isInnerPackage(const Arrayi &cell_index); - size_t SortIndexFromCellIndex(const Arrayi &cell_index); + // size_t SortIndexFromCellIndex(const Arrayi &cell_index); }; -class InitializeIndexMesh : public BaseMeshLocalDynamics +class InitializeIndexMesh : public BaseMeshLocalDynamics { public: explicit InitializeIndexMesh(MeshWithGridDataPackagesType &mesh_data) @@ -127,7 +127,7 @@ class InitializeIndexMesh : public BaseMeshLocalDynamics Arrayi CellIndexFromSortIndex(const size_t &sort_index); }; -class InitializeCellNeighborhood : public BaseMeshLocalDynamics +class InitializeCellNeighborhood : public BaseMeshLocalDynamics { public: explicit InitializeCellNeighborhood(MeshWithGridDataPackagesType &mesh_data) @@ -140,7 +140,7 @@ class InitializeCellNeighborhood : public BaseMeshLocalDynamics Arrayi CellIndexFromSortIndex(const size_t &sort_index); }; -class InitializeBasicDataForAPackage : public BaseMeshLocalDynamics +class InitializeBasicDataForAPackage : public BaseMeshLocalDynamics { public: explicit InitializeBasicDataForAPackage(MeshWithGridDataPackagesType &mesh_data, Shape &shape) @@ -156,7 +156,7 @@ class InitializeBasicDataForAPackage : public BaseMeshLocalDynamics Arrayi CellIndexFromSortIndex(const size_t &sort_index); }; -class UpdateLevelSetGradient : public BaseMeshLocalDynamics +class UpdateLevelSetGradient : public BaseMeshLocalDynamics { public: explicit UpdateLevelSetGradient(MeshWithGridDataPackages<4> &mesh_data) @@ -166,7 +166,7 @@ class UpdateLevelSetGradient : public BaseMeshLocalDynamics void update(const size_t &index); }; -class UpdateKernelIntegrals : public BaseMeshLocalDynamics +class UpdateKernelIntegrals : public BaseMeshLocalDynamics { public: explicit UpdateKernelIntegrals(MeshWithGridDataPackagesType &mesh_data, Kernel &kernel, Real global_h_ratio) @@ -198,7 +198,7 @@ class UpdateKernelIntegrals : public BaseMeshLocalDynamics } }; -class ReinitializeLevelSet : public BaseMeshLocalDynamics +class ReinitializeLevelSet : public BaseMeshLocalDynamics { public: explicit ReinitializeLevelSet(MeshWithGridDataPackagesType &mesh_data) @@ -229,7 +229,7 @@ class ReinitializeLevelSet : public BaseMeshLocalDynamics } }; -class MarkNearInterface : public BaseMeshLocalDynamics +class MarkNearInterface : public BaseMeshLocalDynamics { public: explicit MarkNearInterface(MeshWithGridDataPackagesType &mesh_data) @@ -243,7 +243,7 @@ class MarkNearInterface : public BaseMeshLocalDynamics Real small_shift; }; -class RedistanceInterface : public BaseMeshLocalDynamics +class RedistanceInterface : public BaseMeshLocalDynamics { public: explicit RedistanceInterface(MeshWithGridDataPackagesType &mesh_data) @@ -253,7 +253,7 @@ class RedistanceInterface : public BaseMeshLocalDynamics void update(const size_t &package_index); }; -class DiffuseLevelSetSign : public BaseMeshLocalDynamics +class DiffuseLevelSetSign : public BaseMeshLocalDynamics { public: explicit DiffuseLevelSetSign(MeshWithGridDataPackagesType &mesh_data) @@ -263,15 +263,22 @@ class DiffuseLevelSetSign : public BaseMeshLocalDynamics void update(const size_t &package_index); }; -// class InitializeDataInACellFromCoarse : public BaseMeshLocalDynamics -// { -// public: -// explicit InitializeDataInACellFromCoarse(MeshWithGridDataPackagesType &mesh_data) -// : BaseMeshLocalDynamics(mesh_data){}; -// virtual ~InitializeDataInACellFromCoarse(){}; +class InitializeDataInACellFromCoarse : public BaseMeshLocalDynamics +{ + public: + explicit InitializeDataInACellFromCoarse(MeshWithGridDataPackagesType &mesh_data, MeshWithGridDataPackagesType &coarse_mesh, Shape &shape) + : BaseMeshLocalDynamics(mesh_data), + coarse_mesh_(coarse_mesh), + shape_(shape){}; + virtual ~InitializeDataInACellFromCoarse(){}; + + void update(const Arrayi &cell_index); + + private: + MeshWithGridDataPackagesType &coarse_mesh_; + Shape &shape_; -// void update(const Arrayi &cell_index); -// } +}; } // namespace SPH #endif // MESH_LOCAL_DYNAMICS_H diff --git a/src/shared/meshes/mesh_with_data_packages.h b/src/shared/meshes/mesh_with_data_packages.h index fb91d21ad5..d3c52cf7c5 100644 --- a/src/shared/meshes/mesh_with_data_packages.h +++ b/src/shared/meshes/mesh_with_data_packages.h @@ -280,6 +280,12 @@ class MeshWithGridDataPackages : public Mesh cell_neighborhood_ = new CellNeighborhood[num_grid_pkgs_]; meta_data_cell_ = new std::pair[num_grid_pkgs_]; } + + bool isWithinCorePackage(Vecd position) + { + Arrayi cell_index = CellIndexFromPosition(position); + return isCoreDataPackage(cell_index); + } }; } // namespace SPH #endif // MESH_WITH_DATA_PACKAGES_H From dffb3a8057938df7b9e9b87997bf6911e1b23491 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Mon, 19 Aug 2024 09:21:31 +0200 Subject: [PATCH 43/55] wrap finish packages --- src/shared/geometries/level_set.cpp | 23 +------ src/shared/geometries/level_set.h | 8 +-- src/shared/meshes/all_mesh_dynamics.h | 74 ++++++++++++--------- src/shared/meshes/mesh_with_data_packages.h | 1 + 4 files changed, 49 insertions(+), 57 deletions(-) diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index 40bfc427b7..ea790bac9e 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -46,26 +46,7 @@ LevelSet::LevelSet(BoundingBox tentative_bounds, Real data_spacing, : LevelSet(tentative_bounds, data_spacing, 4, shape, sph_adaptation) { initialize_data_in_a_cell.exec(); - finishDataPackages(); -} -//=================================================================================================// -void LevelSet::finishDataPackages() -{ - tag_a_cell_is_inner_package.exec(); - - mesh_data_.organizeOccupiedPackages(); - initialize_index_mesh.exec(); - initialize_cell_neighborhood.exec(); - resizeMeshVariableData(); - - Real far_field_distance = grid_spacing_ * (Real)buffer_width_; - MeshSingleDynamics initialize_data_for_singular_package(mesh_data_); - initialize_data_for_singular_package.exec(0, -far_field_distance); - initialize_data_for_singular_package.exec(1, far_field_distance); - - initialize_basic_data_for_a_package.exec(); - update_level_set_gradient.exec(); - update_kernel_integrals.exec(); + finish_data_packages.exec(); } //=================================================================================================// Vecd LevelSet::probeNormalDirection(const Vecd &position) @@ -170,7 +151,7 @@ RefinedLevelSet::RefinedLevelSet(BoundingBox tentative_bounds, LevelSet &coarse_ MeshAllDynamics initialize_data_in_a_cell_from_coarse(mesh_data_, coarse_mesh_, shape_); initialize_data_in_a_cell_from_coarse.exec(); - finishDataPackages(); + finish_data_packages.exec(); } //=============================================================================================// MultilevelLevelSet::MultilevelLevelSet( diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index c451d7f38a..24a5f786db 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -34,6 +34,7 @@ #include "mesh_with_data_packages.hpp" #include "mesh_dynamics.h" #include "mesh_local_dynamics.h" +#include "all_mesh_dynamics.h" namespace SPH { @@ -108,13 +109,8 @@ class LevelSet : public MeshWithGridDataPackages<4>, MeshVariable &kernel_gradient_; MeshWithGridDataPackages<4> &mesh_data_ = *this; - void finishDataPackages(); + FinishDataPackages finish_data_packages{mesh_data_, shape_, kernel_, global_h_ratio_}; MeshAllDynamics initialize_data_in_a_cell{mesh_data_, shape_}; - MeshAllDynamics tag_a_cell_is_inner_package{mesh_data_}; - - MeshInnerDynamics initialize_index_mesh{mesh_data_}; - MeshInnerDynamics initialize_cell_neighborhood{mesh_data_}; - MeshInnerDynamics initialize_basic_data_for_a_package{mesh_data_, shape_}; MeshInnerDynamics update_level_set_gradient{mesh_data_}; MeshInnerDynamics update_kernel_integrals{mesh_data_, kernel_, global_h_ratio_}; MeshInnerDynamics diffuse_level_set_sign{mesh_data_}; diff --git a/src/shared/meshes/all_mesh_dynamics.h b/src/shared/meshes/all_mesh_dynamics.h index 2e7af73baa..fd65ccdb91 100644 --- a/src/shared/meshes/all_mesh_dynamics.h +++ b/src/shared/meshes/all_mesh_dynamics.h @@ -33,39 +33,53 @@ #include "mesh_dynamics.h" #include "mesh_local_dynamics.h" -#include "all_body_relations.h" -#include "base_body.h" -#include "base_data_package.h" -#include "neighborhood.h" -#include "sph_data_containers.h" - -#include - -using namespace std::placeholders; namespace SPH { -// class DefineShapeOnMeshWithGridDataPackages -// : BaseMeshDynamics -// { -// public: -// explicit DefineShapeOnMeshWithGridDataPackages(MeshWithGridDataPackages &mesh_data, Shape &shape) -// : BaseMeshDynamics(mesh_data), -// shape_(shape){}; -// virtual ~DefineShapeOnMeshWithGridDataPackages(){}; - -// virtual void exec() override; - -// private: -// Shape &shape_; - -// MeshAllDynamics initialize_data_in_a_cell(mesh_data_, shape_); -// MeshAllDynamics tag_a_cell_is_inner_package(mesh_data_); -// MeshInnerDynamics initialize_index_mesh(mesh_data_); -// MeshInnerDynamics initialize_cell_neighborhood(mesh_data_); - -// bool isInnerPackage(); -// }; +class FinishDataPackages : public BaseMeshDynamics +{ + public: + explicit FinishDataPackages(MeshWithGridDataPackages<4> &mesh_data, Shape &shape, Kernel &kernel, Real global_h_ratio) + : BaseMeshDynamics(mesh_data), + shape_(shape), + kernel_(kernel), + global_h_ratio_(global_h_ratio), + grid_spacing_(mesh_data.GridSpacing()), + buffer_width_(mesh_data.BufferWidth()){}; + virtual ~FinishDataPackages(){}; + + void exec(){ + tag_a_cell_is_inner_package.exec(); + + mesh_data_.organizeOccupiedPackages(); + initialize_index_mesh.exec(); + initialize_cell_neighborhood.exec(); + mesh_data_.resizeMeshVariableData(); + + Real far_field_distance = grid_spacing_ * (Real)buffer_width_; + initialize_data_for_singular_package.exec(0, -far_field_distance); + initialize_data_for_singular_package.exec(1, far_field_distance); + + initialize_basic_data_for_a_package.exec(); + update_level_set_gradient.exec(); + update_kernel_integrals.exec(); + }; + + private: + Shape &shape_; + Kernel &kernel_; + Real global_h_ratio_; + Real grid_spacing_; + size_t buffer_width_; + + MeshSingleDynamics initialize_data_for_singular_package{mesh_data_}; + MeshAllDynamics tag_a_cell_is_inner_package{mesh_data_}; + MeshInnerDynamics initialize_index_mesh{mesh_data_}; + MeshInnerDynamics initialize_cell_neighborhood{mesh_data_}; + MeshInnerDynamics initialize_basic_data_for_a_package{mesh_data_, shape_}; + MeshInnerDynamics update_level_set_gradient{mesh_data_}; + MeshInnerDynamics update_kernel_integrals{mesh_data_, kernel_, global_h_ratio_}; +}; // class CleanInterface // : BaseMeshDynamics diff --git a/src/shared/meshes/mesh_with_data_packages.h b/src/shared/meshes/mesh_with_data_packages.h index d3c52cf7c5..01990bda31 100644 --- a/src/shared/meshes/mesh_with_data_packages.h +++ b/src/shared/meshes/mesh_with_data_packages.h @@ -109,6 +109,7 @@ class MeshWithGridDataPackages : public Mesh /** spacing between the data, which is 1/ pkg_size of this grid spacing */ virtual Real DataSpacing() override { return data_spacing_; }; Real GridSpacing() { return grid_spacing_; }; + size_t BufferWidth() { return buffer_width_; }; public: ConcurrentVec> occupied_data_pkgs_; /**< (size_t)sort_index, (int)core1/inner0. */ From 1f61683a210d248da10c5f7ef0dad95a7a507fec Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Mon, 19 Aug 2024 10:57:25 +0200 Subject: [PATCH 44/55] remove duplicate functions --- src/shared/geometries/level_set.cpp | 12 ------------ src/shared/geometries/level_set.h | 16 ++++++++++------ src/shared/meshes/mesh_local_dynamics.h | 4 ++++ 3 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index ea790bac9e..48c06a86d3 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -17,18 +17,6 @@ BaseLevelSet ::BaseLevelSet(Shape &shape, SPHAdaptation &sph_adaptation) } } //=================================================================================================// -Real BaseLevelSet::CutCellVolumeFraction(Real phi, const Vecd &phi_gradient, Real data_spacing) -{ - Real squared_norm_inv = 1.0 / (phi_gradient.squaredNorm() + TinyReal); - Real volume_fraction(0); - for (size_t i = 0; i != Dimensions; ++i) - { - volume_fraction += phi_gradient[i] * phi_gradient[i] * squared_norm_inv * - Heaviside(phi / (ABS(phi_gradient[i]) + TinyReal), 0.5 * data_spacing); - } - return volume_fraction; -} -//=================================================================================================// LevelSet::LevelSet(BoundingBox tentative_bounds, Real data_spacing, size_t buffer_size, Shape &shape, SPHAdaptation &sph_adaptation) : MeshWithGridDataPackages<4>(tentative_bounds, data_spacing, buffer_size), diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index 24a5f786db..3154256f74 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -62,12 +62,6 @@ class BaseLevelSet : public BaseMeshField protected: Shape &shape_; /**< the geometry is described by the level set. */ SPHAdaptation &sph_adaptation_; - - /** a cut cell is a cut by the level set. */ - /** "Multi-scale modeling of compressible multi-fluid flows with conservative interface method." - * Hu, X. Y., et al., Proceedings of the Summer Program. Vol. 301. Stanford, CA, USA: - * Center for Turbulence Research, Stanford University, 2010.*/ - Real CutCellVolumeFraction(Real phi, const Vecd &phi_gradient, Real data_spacing); }; /** @@ -156,5 +150,15 @@ class MultilevelLevelSet : public MultilevelMesh Date: Mon, 19 Aug 2024 12:14:00 +0200 Subject: [PATCH 45/55] compute wrap --- src/shared/geometries/level_set.cpp | 46 +++++-------------------- src/shared/geometries/level_set.h | 7 ++-- src/shared/meshes/all_mesh_dynamics.h | 26 ++++++++++++++ src/shared/meshes/mesh_dynamics.h | 17 +++++++++ src/shared/meshes/mesh_local_dynamics.h | 41 ++++++++++++++++++++++ 5 files changed, 97 insertions(+), 40 deletions(-) diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index 48c06a86d3..ab2870c064 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -39,37 +39,27 @@ LevelSet::LevelSet(BoundingBox tentative_bounds, Real data_spacing, //=================================================================================================// Vecd LevelSet::probeNormalDirection(const Vecd &position) { - Vecd probed_value = probeLevelSetGradient(position); - - Real threshold = 1.0e-2 * data_spacing_; - while (probed_value.norm() < threshold) - { - Vecd jittered = position; // jittering - for (int l = 0; l != position.size(); ++l) - jittered[l] += rand_uniform(-0.5, 0.5) * 0.5 * data_spacing_; - probed_value = probeLevelSetGradient(jittered); - } - return probed_value.normalized(); + return probe_normal_direction.exec(position); } //=================================================================================================// Vecd LevelSet::probeLevelSetGradient(const Vecd &position) { - return probeMesh(phi_gradient_, position); + return probe_level_set_gradient.exec(position); } //=================================================================================================// Real LevelSet::probeSignedDistance(const Vecd &position) { - return probeMesh(phi_, position); + return probe_signed_distance.exec(position); } //=================================================================================================// Real LevelSet::probeKernelIntegral(const Vecd &position, Real h_ratio) { - return probeMesh(kernel_weight_, position); + return probe_kernel_integral.exec(position); } //=================================================================================================// Vecd LevelSet::probeKernelGradientIntegral(const Vecd &position, Real h_ratio) { - return probeMesh(kernel_gradient_, position); + return probe_kernel_gradient_integral.exec(position); } //=================================================================================================// void LevelSet::cleanInterface(Real small_shift_factor) @@ -95,7 +85,7 @@ void LevelSet::correctTopology(Real small_shift_factor) bool LevelSet::probeIsWithinMeshBound(const Vecd &position) { bool is_bounded = true; - Arrayi cell_pos = CellIndexFromPosition(position); + Arrayi cell_pos = mesh_data_.CellIndexFromPosition(position); for (int i = 0; i != position.size(); ++i) { if (cell_pos[i] < 2) @@ -105,31 +95,11 @@ bool LevelSet::probeIsWithinMeshBound(const Vecd &position) } return is_bounded; } -//=================================================================================================// -Real LevelSet::upwindDifference(Real sign, Real df_p, Real df_n) -{ - if (sign * df_p >= 0.0 && sign * df_n >= 0.0) - return df_n; - if (sign * df_p <= 0.0 && sign * df_n <= 0.0) - return df_p; - if (sign * df_p > 0.0 && sign * df_n < 0.0) - return 0.0; - - Real df = df_p; - if (sign * df_p < 0.0 && sign * df_n > 0.0) - { - Real ss = sign * (fabs(df_p) - fabs(df_n)) / (df_p - df_n); - if (ss > 0.0) - df = df_n; - } - - return df; -} //=============================================================================================// bool LevelSet::isWithinCorePackage(Vecd position) { - Arrayi cell_index = CellIndexFromPosition(position); - return isCoreDataPackage(cell_index); + Arrayi cell_index = mesh_data_.CellIndexFromPosition(position); + return mesh_data_.isCoreDataPackage(cell_index); } //=============================================================================================// RefinedLevelSet::RefinedLevelSet(BoundingBox tentative_bounds, LevelSet &coarse_level_set, diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index 3154256f74..03b1f84b4b 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -102,6 +102,11 @@ class LevelSet : public MeshWithGridDataPackages<4>, MeshVariable &kernel_weight_; MeshVariable &kernel_gradient_; MeshWithGridDataPackages<4> &mesh_data_ = *this; + MeshCalculateDynamics probe_level_set_gradient{mesh_data_}; + MeshCalculateDynamics probe_normal_direction{mesh_data_}; + MeshCalculateDynamics probe_signed_distance{mesh_data_}; + MeshCalculateDynamics probe_kernel_integral{mesh_data_}; + MeshCalculateDynamics probe_kernel_gradient_integral{mesh_data_}; FinishDataPackages finish_data_packages{mesh_data_, shape_, kernel_, global_h_ratio_}; MeshAllDynamics initialize_data_in_a_cell{mesh_data_, shape_}; @@ -112,8 +117,6 @@ class LevelSet : public MeshWithGridDataPackages<4>, MeshInnerDynamics mark_near_interface{mesh_data_}; MeshCoreDynamics redistance_interface{mesh_data_}; - // upwind algorithm choosing candidate difference by the sign - Real upwindDifference(Real sign, Real df_p, Real df_n); }; /** diff --git a/src/shared/meshes/all_mesh_dynamics.h b/src/shared/meshes/all_mesh_dynamics.h index fd65ccdb91..db768edc3e 100644 --- a/src/shared/meshes/all_mesh_dynamics.h +++ b/src/shared/meshes/all_mesh_dynamics.h @@ -81,6 +81,32 @@ class FinishDataPackages : public BaseMeshDynamics MeshInnerDynamics update_kernel_integrals{mesh_data_, kernel_, global_h_ratio_}; }; +class ProbeNormalDirection : public BaseMeshLocalDynamics +{ + public: + explicit ProbeNormalDirection(MeshWithGridDataPackagesType &mesh_data) + : BaseMeshLocalDynamics(mesh_data){}; + virtual ~ProbeNormalDirection(){}; + + Vecd update(const Vecd &position) + { + Vecd probed_value = probe_level_set_gradient.exec(position); + + Real threshold = 1.0e-2 * data_spacing_; + while (probed_value.norm() < threshold) + { + Vecd jittered = position; // jittering + for (int l = 0; l != position.size(); ++l) + jittered[l] += rand_uniform(-0.5, 0.5) * 0.5 * data_spacing_; + probed_value = probe_level_set_gradient.exec(jittered); + } + return probed_value.normalized(); + } + + private: + MeshCalculateDynamics probe_level_set_gradient{mesh_data_}; +}; + // class CleanInterface // : BaseMeshDynamics // { diff --git a/src/shared/meshes/mesh_dynamics.h b/src/shared/meshes/mesh_dynamics.h index be3f8dfab8..091596e780 100644 --- a/src/shared/meshes/mesh_dynamics.h +++ b/src/shared/meshes/mesh_dynamics.h @@ -156,5 +156,22 @@ class MeshSingleDynamics : public LocalDynamicsType, public BaseMeshDynamics this->update(std::forward(args)...); }; }; + +template +class MeshCalculateDynamics : public LocalDynamicsType, public BaseMeshDynamics +{ + public: + template + MeshCalculateDynamics(DynamicsIdentifier &identifier, Args &&...args) + : LocalDynamicsType(identifier, std::forward(args)...), + BaseMeshDynamics(identifier){}; + virtual ~MeshCalculateDynamics(){}; + + template + ReturnType exec(Args &&...args) + { + return this->update(std::forward(args)...); + }; +}; } // namespace SPH #endif // MESH_DYNAMICS_H \ No newline at end of file diff --git a/src/shared/meshes/mesh_local_dynamics.h b/src/shared/meshes/mesh_local_dynamics.h index 5d12136122..5c023da796 100644 --- a/src/shared/meshes/mesh_local_dynamics.h +++ b/src/shared/meshes/mesh_local_dynamics.h @@ -212,6 +212,7 @@ class ReinitializeLevelSet : public BaseMeshLocalDynamics void update(const size_t &package_index); private: + // upwind algorithm choosing candidate difference by the sign Real upwindDifference(Real sign, Real df_p, Real df_n) { if (sign * df_p >= 0.0 && sign * df_n >= 0.0) @@ -284,5 +285,45 @@ class InitializeDataInACellFromCoarse : public BaseMeshLocalDynamics }; +class ProbeSignedDistance : public BaseMeshLocalDynamics +{ + public: + explicit ProbeSignedDistance(MeshWithGridDataPackagesType &mesh_data) + : BaseMeshLocalDynamics(mesh_data){}; + virtual ~ProbeSignedDistance(){}; + + Real update(const Vecd &position) { return mesh_data_.probeMesh(phi_, position); }; +}; + +class ProbeLevelSetGradient : public BaseMeshLocalDynamics +{ + public: + explicit ProbeLevelSetGradient(MeshWithGridDataPackagesType &mesh_data) + : BaseMeshLocalDynamics(mesh_data){}; + virtual ~ProbeLevelSetGradient(){}; + + Vecd update(const Vecd &position) { return mesh_data_.probeMesh(phi_gradient_, position); }; +}; + +class ProbeKernelIntegral : public BaseMeshLocalDynamics +{ + public: + explicit ProbeKernelIntegral(MeshWithGridDataPackagesType &mesh_data) + : BaseMeshLocalDynamics(mesh_data){}; + virtual ~ProbeKernelIntegral(){}; + + Real update(const Vecd &position) { return mesh_data_.probeMesh(kernel_weight_, position); }; +}; + +class ProbeKernelGradientIntegral : public BaseMeshLocalDynamics +{ + public: + explicit ProbeKernelGradientIntegral(MeshWithGridDataPackagesType &mesh_data) + : BaseMeshLocalDynamics(mesh_data){}; + virtual ~ProbeKernelGradientIntegral(){}; + + Vecd update(const Vecd &position) { return mesh_data_.probeMesh(kernel_gradient_, position); }; +}; + } // namespace SPH #endif // MESH_LOCAL_DYNAMICS_H From d41bc26c1264205f26face8f5de8a1355f922576 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Mon, 26 Aug 2024 06:57:23 +0200 Subject: [PATCH 46/55] wrap all --- src/for_2D_build/geometries/level_set_2d.cpp | 126 ------------------ .../meshes/mesh_local_dynamics_2d.cpp | 112 ++++++++++++++++ src/for_3D_build/geometries/level_set_3d.cpp | 121 ----------------- .../meshes/mesh_local_dynamics_3d.cpp | 108 +++++++++++++++ src/shared/geometries/level_set.cpp | 81 +++++++---- src/shared/geometries/level_set.h | 20 ++- src/shared/meshes/all_mesh_dynamics.h | 94 +++++++------ src/shared/meshes/mesh_local_dynamics.h | 45 +++++++ src/shared/meshes/mesh_with_data_packages.h | 32 ++--- 9 files changed, 397 insertions(+), 342 deletions(-) delete mode 100644 src/for_2D_build/geometries/level_set_2d.cpp delete mode 100644 src/for_3D_build/geometries/level_set_3d.cpp diff --git a/src/for_2D_build/geometries/level_set_2d.cpp b/src/for_2D_build/geometries/level_set_2d.cpp deleted file mode 100644 index a5fbb705f2..0000000000 --- a/src/for_2D_build/geometries/level_set_2d.cpp +++ /dev/null @@ -1,126 +0,0 @@ -#include "level_set.h" - -#include "base_body.h" -#include "base_kernel.h" -#include "base_particle_dynamics.h" -#include "base_particles.h" -#include "mesh_iterators.hpp" -#include "tbb/parallel_sort.h" - -namespace SPH -{ -//=============================================================================================// -void LevelSet::writeMeshFieldToPlt(std::ofstream &output_file) -{ - Arrayi number_of_operation = global_mesh_.AllGridPoints(); - - output_file << "\n"; - output_file << "title='View'" - << "\n"; - output_file << "variables= " - << "x, " - << "y, " - << "phi, " - << "n_x, " - << "n_y " - << "near_interface_id "; - output_file << "kernel_weight, " - << "kernel_gradient_x, " - << "kernel_gradient_y " - << "\n"; - output_file << "zone i=" << number_of_operation[0] << " j=" << number_of_operation[1] << " k=" << 1 - << " DATAPACKING=BLOCK SOLUTIONTIME=" << 0 << "\n"; - - for (int j = 0; j != number_of_operation[1]; ++j) - { - for (int i = 0; i != number_of_operation[0]; ++i) - { - Vecd data_position = global_mesh_.GridPositionFromIndex(Arrayi(i, j)); - output_file << data_position[0] << " "; - } - output_file << " \n"; - } - - for (int j = 0; j != number_of_operation[1]; ++j) - { - for (int i = 0; i != number_of_operation[0]; ++i) - { - Vecd data_position = global_mesh_.GridPositionFromIndex(Arrayi(i, j)); - output_file << data_position[1] << " "; - } - output_file << " \n"; - } - - for (int j = 0; j != number_of_operation[1]; ++j) - { - for (int i = 0; i != number_of_operation[0]; ++i) - { - output_file << DataValueFromGlobalIndex(phi_, Arrayi(i, j)) - << " "; - } - output_file << " \n"; - } - - for (int j = 0; j != number_of_operation[1]; ++j) - { - for (int i = 0; i != number_of_operation[0]; ++i) - { - output_file << DataValueFromGlobalIndex(phi_gradient_, Arrayi(i, j))[0] - << " "; - } - output_file << " \n"; - } - - for (int j = 0; j != number_of_operation[1]; ++j) - { - for (int i = 0; i != number_of_operation[0]; ++i) - { - output_file << DataValueFromGlobalIndex(phi_gradient_, Arrayi(i, j))[1] - << " "; - } - output_file << " \n"; - } - - for (int j = 0; j != number_of_operation[1]; ++j) - { - for (int i = 0; i != number_of_operation[0]; ++i) - { - output_file << DataValueFromGlobalIndex(near_interface_id_, Arrayi(i, j)) - << " "; - } - output_file << " \n"; - } - - for (int j = 0; j != number_of_operation[1]; ++j) - { - for (int i = 0; i != number_of_operation[0]; ++i) - { - output_file << DataValueFromGlobalIndex(kernel_weight_, Arrayi(i, j)) - << " "; - } - output_file << " \n"; - } - - for (int j = 0; j != number_of_operation[1]; ++j) - { - for (int i = 0; i != number_of_operation[0]; ++i) - { - output_file << DataValueFromGlobalIndex(kernel_gradient_, Arrayi(i, j))[0] - << " "; - } - output_file << " \n"; - } - - for (int j = 0; j != number_of_operation[1]; ++j) - { - for (int i = 0; i != number_of_operation[0]; ++i) - { - output_file << DataValueFromGlobalIndex(kernel_gradient_, Arrayi(i, j))[1] - << " "; - } - output_file << " \n"; - } -} -//=============================================================================================// -} // namespace SPH -//=============================================================================================// diff --git a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp index d35f6cd636..3d6e3778c5 100644 --- a/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp +++ b/src/for_2D_build/meshes/mesh_local_dynamics_2d.cpp @@ -342,5 +342,117 @@ void DiffuseLevelSetSign::update(const size_t &package_index) }); } //=============================================================================================// +void WriteMeshFieldToPlt::update(std::ofstream &output_file) +{ + Arrayi number_of_operation = mesh_data_.global_mesh_.AllGridPoints(); + + output_file << "\n"; + output_file << "title='View'" + << "\n"; + output_file << "variables= " + << "x, " + << "y, " + << "phi, " + << "n_x, " + << "n_y " + << "near_interface_id "; + output_file << "kernel_weight, " + << "kernel_gradient_x, " + << "kernel_gradient_y " + << "\n"; + output_file << "zone i=" << number_of_operation[0] << " j=" << number_of_operation[1] << " k=" << 1 + << " DATAPACKING=BLOCK SOLUTIONTIME=" << 0 << "\n"; + + for (int j = 0; j != number_of_operation[1]; ++j) + { + for (int i = 0; i != number_of_operation[0]; ++i) + { + Vecd data_position = mesh_data_.global_mesh_.GridPositionFromIndex(Arrayi(i, j)); + output_file << data_position[0] << " "; + } + output_file << " \n"; + } + + for (int j = 0; j != number_of_operation[1]; ++j) + { + for (int i = 0; i != number_of_operation[0]; ++i) + { + Vecd data_position = mesh_data_.global_mesh_.GridPositionFromIndex(Arrayi(i, j)); + output_file << data_position[1] << " "; + } + output_file << " \n"; + } + + for (int j = 0; j != number_of_operation[1]; ++j) + { + for (int i = 0; i != number_of_operation[0]; ++i) + { + output_file << mesh_data_.DataValueFromGlobalIndex(phi_, Arrayi(i, j)) + << " "; + } + output_file << " \n"; + } + + for (int j = 0; j != number_of_operation[1]; ++j) + { + for (int i = 0; i != number_of_operation[0]; ++i) + { + output_file << mesh_data_.DataValueFromGlobalIndex(phi_gradient_, Arrayi(i, j))[0] + << " "; + } + output_file << " \n"; + } + + for (int j = 0; j != number_of_operation[1]; ++j) + { + for (int i = 0; i != number_of_operation[0]; ++i) + { + output_file << mesh_data_.DataValueFromGlobalIndex(phi_gradient_, Arrayi(i, j))[1] + << " "; + } + output_file << " \n"; + } + + for (int j = 0; j != number_of_operation[1]; ++j) + { + for (int i = 0; i != number_of_operation[0]; ++i) + { + output_file << mesh_data_.DataValueFromGlobalIndex(near_interface_id_, Arrayi(i, j)) + << " "; + } + output_file << " \n"; + } + + for (int j = 0; j != number_of_operation[1]; ++j) + { + for (int i = 0; i != number_of_operation[0]; ++i) + { + output_file << mesh_data_.DataValueFromGlobalIndex(kernel_weight_, Arrayi(i, j)) + << " "; + } + output_file << " \n"; + } + + for (int j = 0; j != number_of_operation[1]; ++j) + { + for (int i = 0; i != number_of_operation[0]; ++i) + { + output_file << mesh_data_.DataValueFromGlobalIndex(kernel_gradient_, Arrayi(i, j))[0] + << " "; + } + output_file << " \n"; + } + + for (int j = 0; j != number_of_operation[1]; ++j) + { + for (int i = 0; i != number_of_operation[0]; ++i) + { + output_file << mesh_data_.DataValueFromGlobalIndex(kernel_gradient_, Arrayi(i, j))[1] + << " "; + } + output_file << " \n"; + } +} +//=============================================================================================// } // namespace SPH //=============================================================================================// \ No newline at end of file diff --git a/src/for_3D_build/geometries/level_set_3d.cpp b/src/for_3D_build/geometries/level_set_3d.cpp deleted file mode 100644 index 718a1b6c1e..0000000000 --- a/src/for_3D_build/geometries/level_set_3d.cpp +++ /dev/null @@ -1,121 +0,0 @@ -#include "level_set.h" - -#include "base_body.h" -#include "base_kernel.h" -#include "base_particle_dynamics.h" -#include "base_particles.h" -#include "mesh_iterators.hpp" -#include "tbb/parallel_sort.h" - -namespace SPH -{ -//=================================================================================================// -void LevelSet::writeMeshFieldToPlt(std::ofstream &output_file) -{ - Arrayi number_of_operation = global_mesh_.AllGridPoints(); - - output_file << "\n"; - output_file << "title='View'" - << "\n"; - output_file << "variables= " - << "x, " - << "y, " - << "z, " - << "phi, " - << "n_x, " - << "n_y, " - << "n_z " - << "\n"; - output_file << "zone i=" << number_of_operation[0] << " j=" << number_of_operation[1] << " k=" << number_of_operation[2] - << " DATAPACKING=BLOCK SOLUTIONTIME=" << 0 << "\n"; - - for (int k = 0; k != number_of_operation[2]; ++k) - for (int j = 0; j != number_of_operation[1]; ++j) - { - for (int i = 0; i != number_of_operation[0]; ++i) - { - Vecd data_position = global_mesh_.GridPositionFromIndex(Arrayi(i, j, k)); - output_file << data_position[0] << " "; - } - output_file << " \n"; - } - - for (int k = 0; k != number_of_operation[2]; ++k) - for (int j = 0; j != number_of_operation[1]; ++j) - { - for (int i = 0; i != number_of_operation[0]; ++i) - { - Vecd data_position = global_mesh_.GridPositionFromIndex(Arrayi(i, j, k)); - output_file << data_position[1] << " "; - } - output_file << " \n"; - } - - for (int k = 0; k != number_of_operation[2]; ++k) - for (int j = 0; j != number_of_operation[1]; ++j) - { - for (int i = 0; i != number_of_operation[0]; ++i) - { - Vecd data_position = global_mesh_.GridPositionFromIndex(Arrayi(i, j, k)); - output_file << data_position[2] << " "; - } - output_file << " \n"; - } - - for (int k = 0; k != number_of_operation[2]; ++k) - for (int j = 0; j != number_of_operation[1]; ++j) - { - for (int i = 0; i != number_of_operation[0]; ++i) - { - output_file << DataValueFromGlobalIndex(phi_, Arrayi(i, j, k)) - << " "; - } - output_file << " \n"; - } - - for (int k = 0; k != number_of_operation[2]; ++k) - for (int j = 0; j != number_of_operation[1]; ++j) - { - for (int i = 0; i != number_of_operation[0]; ++i) - { - output_file << DataValueFromGlobalIndex(phi_gradient_, Arrayi(i, j, k))[0] - << " "; - } - output_file << " \n"; - } - - for (int k = 0; k != number_of_operation[2]; ++k) - for (int j = 0; j != number_of_operation[1]; ++j) - { - for (int i = 0; i != number_of_operation[0]; ++i) - { - output_file << DataValueFromGlobalIndex(phi_gradient_, Arrayi(i, j, k))[1] - << " "; - } - output_file << " \n"; - } - - for (int k = 0; k != number_of_operation[2]; ++k) - for (int j = 0; j != number_of_operation[1]; ++j) - { - for (int i = 0; i != number_of_operation[0]; ++i) - { - output_file << DataValueFromGlobalIndex(phi_gradient_, Arrayi(i, j, k))[2] - << " "; - } - output_file << " \n"; - } - - for (int k = 0; k != number_of_operation[2]; ++k) - for (int j = 0; j != number_of_operation[1]; ++j) - { - for (int i = 0; i != number_of_operation[0]; ++i) - { - output_file << DataValueFromGlobalIndex(near_interface_id_, Arrayi(i, j, k)) - << " "; - } - output_file << " \n"; - } -} -//=============================================================================================// -} // namespace SPH diff --git a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp index 664a524371..2b0aaf30c0 100644 --- a/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp +++ b/src/for_3D_build/meshes/mesh_local_dynamics_3d.cpp @@ -348,5 +348,113 @@ void DiffuseLevelSetSign::update(const size_t &package_index) }); } //=============================================================================================// +void WriteMeshFieldToPlt::update(std::ofstream &output_file) +{ + Arrayi number_of_operation = mesh_data_.global_mesh_.AllGridPoints(); + + output_file << "\n"; + output_file << "title='View'" + << "\n"; + output_file << "variables= " + << "x, " + << "y, " + << "z, " + << "phi, " + << "n_x, " + << "n_y, " + << "n_z " + << "\n"; + output_file << "zone i=" << number_of_operation[0] << " j=" << number_of_operation[1] << " k=" << number_of_operation[2] + << " DATAPACKING=BLOCK SOLUTIONTIME=" << 0 << "\n"; + + for (int k = 0; k != number_of_operation[2]; ++k) + for (int j = 0; j != number_of_operation[1]; ++j) + { + for (int i = 0; i != number_of_operation[0]; ++i) + { + Vecd data_position = mesh_data_.global_mesh_.GridPositionFromIndex(Arrayi(i, j, k)); + output_file << data_position[0] << " "; + } + output_file << " \n"; + } + + for (int k = 0; k != number_of_operation[2]; ++k) + for (int j = 0; j != number_of_operation[1]; ++j) + { + for (int i = 0; i != number_of_operation[0]; ++i) + { + Vecd data_position = mesh_data_.global_mesh_.GridPositionFromIndex(Arrayi(i, j, k)); + output_file << data_position[1] << " "; + } + output_file << " \n"; + } + + for (int k = 0; k != number_of_operation[2]; ++k) + for (int j = 0; j != number_of_operation[1]; ++j) + { + for (int i = 0; i != number_of_operation[0]; ++i) + { + Vecd data_position = mesh_data_.global_mesh_.GridPositionFromIndex(Arrayi(i, j, k)); + output_file << data_position[2] << " "; + } + output_file << " \n"; + } + + for (int k = 0; k != number_of_operation[2]; ++k) + for (int j = 0; j != number_of_operation[1]; ++j) + { + for (int i = 0; i != number_of_operation[0]; ++i) + { + output_file << mesh_data_.DataValueFromGlobalIndex(phi_, Arrayi(i, j, k)) + << " "; + } + output_file << " \n"; + } + + for (int k = 0; k != number_of_operation[2]; ++k) + for (int j = 0; j != number_of_operation[1]; ++j) + { + for (int i = 0; i != number_of_operation[0]; ++i) + { + output_file << mesh_data_.DataValueFromGlobalIndex(phi_gradient_, Arrayi(i, j, k))[0] + << " "; + } + output_file << " \n"; + } + + for (int k = 0; k != number_of_operation[2]; ++k) + for (int j = 0; j != number_of_operation[1]; ++j) + { + for (int i = 0; i != number_of_operation[0]; ++i) + { + output_file << mesh_data_.DataValueFromGlobalIndex(phi_gradient_, Arrayi(i, j, k))[1] + << " "; + } + output_file << " \n"; + } + + for (int k = 0; k != number_of_operation[2]; ++k) + for (int j = 0; j != number_of_operation[1]; ++j) + { + for (int i = 0; i != number_of_operation[0]; ++i) + { + output_file << mesh_data_.DataValueFromGlobalIndex(phi_gradient_, Arrayi(i, j, k))[2] + << " "; + } + output_file << " \n"; + } + + for (int k = 0; k != number_of_operation[2]; ++k) + for (int j = 0; j != number_of_operation[1]; ++j) + { + for (int i = 0; i != number_of_operation[0]; ++i) + { + output_file << mesh_data_.DataValueFromGlobalIndex(near_interface_id_, Arrayi(i, j, k)) + << " "; + } + output_file << " \n"; + } +} +//=============================================================================================// } // namespace SPH //=============================================================================================// \ No newline at end of file diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index ab2870c064..f35a8aa203 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -33,7 +33,9 @@ LevelSet::LevelSet(BoundingBox tentative_bounds, Real data_spacing, Shape &shape, SPHAdaptation &sph_adaptation) : LevelSet(tentative_bounds, data_spacing, 4, shape, sph_adaptation) { + MeshAllDynamics initialize_data_in_a_cell{mesh_data_, shape_}; initialize_data_in_a_cell.exec(); + FinishDataPackages finish_data_packages{mesh_data_, shape_, kernel_, global_h_ratio_}; finish_data_packages.exec(); } //=================================================================================================// @@ -64,42 +66,24 @@ Vecd LevelSet::probeKernelGradientIntegral(const Vecd &position, Real h_ratio) //=================================================================================================// void LevelSet::cleanInterface(Real small_shift_factor) { - mark_near_interface.setSmallShiftFactor(small_shift_factor); - mark_near_interface.exec(); - redistance_interface.exec(); - reinitialize_level_set.exec(); - update_level_set_gradient.exec(); - update_kernel_integrals.exec(); + CleanInterface clean_interface{mesh_data_, kernel_, global_h_ratio_}; + clean_interface.exec(small_shift_factor); } //=============================================================================================// void LevelSet::correctTopology(Real small_shift_factor) { - mark_near_interface.setSmallShiftFactor(small_shift_factor); - mark_near_interface.exec(); - for (size_t i = 0; i != 10; ++i) - diffuse_level_set_sign.exec(); - update_level_set_gradient.exec(); - update_kernel_integrals.exec(); + CorrectTopology correct_topology{mesh_data_, kernel_, global_h_ratio_}; + correct_topology.exec(small_shift_factor); } //=================================================================================================// bool LevelSet::probeIsWithinMeshBound(const Vecd &position) { - bool is_bounded = true; - Arrayi cell_pos = mesh_data_.CellIndexFromPosition(position); - for (int i = 0; i != position.size(); ++i) - { - if (cell_pos[i] < 2) - is_bounded = false; - if (cell_pos[i] > (all_cells_[i] - 2)) - is_bounded = false; - } - return is_bounded; + return probe_is_within_mesh_bound.exec(position); } //=============================================================================================// bool LevelSet::isWithinCorePackage(Vecd position) { - Arrayi cell_index = mesh_data_.CellIndexFromPosition(position); - return mesh_data_.isCoreDataPackage(cell_index); + return is_within_core_package.exec(position); } //=============================================================================================// RefinedLevelSet::RefinedLevelSet(BoundingBox tentative_bounds, LevelSet &coarse_level_set, @@ -108,7 +92,7 @@ RefinedLevelSet::RefinedLevelSet(BoundingBox tentative_bounds, LevelSet &coarse_ { MeshAllDynamics initialize_data_in_a_cell_from_coarse(mesh_data_, coarse_mesh_, shape_); initialize_data_in_a_cell_from_coarse.exec(); - + FinishDataPackages finish_data_packages{mesh_data_, shape_, kernel_, global_h_ratio_}; finish_data_packages.exec(); } //=============================================================================================// @@ -116,12 +100,51 @@ MultilevelLevelSet::MultilevelLevelSet( BoundingBox tentative_bounds, Real reference_data_spacing, size_t total_levels, Shape &shape, SPHAdaptation &sph_adaptation) : MultilevelMesh( - tentative_bounds, reference_data_spacing, total_levels, shape, sph_adaptation) {} + tentative_bounds, reference_data_spacing, total_levels, shape, sph_adaptation), + kernel_(*sph_adaptation.getKernel()) +{ + mesh_data_set_.push_back( + mesh_data_ptr_vector_keeper_ + .template createPtr(tentative_bounds, reference_data_spacing, 4)); + + mesh_data_set_[0]->registerMeshVariable("Levelset"); + mesh_data_set_[0]->registerMeshVariable("NearInterfaceID"); + mesh_data_set_[0]->registerMeshVariable("LevelsetGradient"); + mesh_data_set_[0]->registerMeshVariable("KernelWeight"); + mesh_data_set_[0]->registerMeshVariable("KernelGradient"); + + Real global_h_ratio = sph_adaptation.ReferenceSpacing() / reference_data_spacing; + global_h_ratio_vec_.push_back(global_h_ratio); + MeshAllDynamics initialize_data_in_a_cell{*mesh_data_set_[0], shape_}; + FinishDataPackages finish_data_packages{*mesh_data_set_[0], shape_, kernel_, global_h_ratio}; + initialize_data_in_a_cell.exec(); + finish_data_packages.exec(); + + for (size_t level = 1; level != total_levels_; ++level) + { + reference_data_spacing *= 0.5; + global_h_ratio *= 2; + global_h_ratio_vec_.push_back(global_h_ratio); + /** all mesh levels aligned at the lower bound of tentative_bounds */ + mesh_data_set_.push_back( + mesh_data_ptr_vector_keeper_ + .template createPtr(tentative_bounds, reference_data_spacing, 4)); + mesh_data_set_[level]->registerMeshVariable("Levelset"); + mesh_data_set_[level]->registerMeshVariable("NearInterfaceID"); + mesh_data_set_[level]->registerMeshVariable("LevelsetGradient"); + mesh_data_set_[level]->registerMeshVariable("KernelWeight"); + mesh_data_set_[level]->registerMeshVariable("KernelGradient"); + MeshAllDynamics initialize_data_in_a_cell_from_coarse(*mesh_data_set_[level], *mesh_data_set_[level - 1], shape_); + FinishDataPackages finish_data_packages{*mesh_data_set_[level], shape_, kernel_, global_h_ratio}; + initialize_data_in_a_cell_from_coarse.exec(); + finish_data_packages.exec(); + } +} //=================================================================================================// size_t MultilevelLevelSet::getCoarseLevel(Real h_ratio) { for (size_t level = total_levels_; level != 0; --level) - if (h_ratio > mesh_levels_[level - 1]->global_h_ratio_) + if (h_ratio > global_h_ratio_vec_[level - 1]) return level - 1; // jump out the loop! std::cout << "\n Error: LevelSet level searching out of bound!" << std::endl; @@ -133,11 +156,15 @@ size_t MultilevelLevelSet::getCoarseLevel(Real h_ratio) void MultilevelLevelSet::cleanInterface(Real small_shift_factor) { mesh_levels_.back()->cleanInterface(small_shift_factor); + CleanInterface clean_interface{*mesh_data_set_.back(), kernel_, global_h_ratio_vec_.back()}; + clean_interface.exec(small_shift_factor); } //=============================================================================================// void MultilevelLevelSet::correctTopology(Real small_shift_factor) { mesh_levels_.back()->correctTopology(small_shift_factor); + CorrectTopology correct_topology{*mesh_data_set_.back(), kernel_, global_h_ratio_vec_.back()}; + correct_topology.exec(small_shift_factor); } //=============================================================================================// Real MultilevelLevelSet::probeSignedDistance(const Vecd &position) diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index 03b1f84b4b..acf37f9b9d 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -91,7 +91,7 @@ class LevelSet : public MeshWithGridDataPackages<4>, virtual Vecd probeLevelSetGradient(const Vecd &position) override; virtual Real probeKernelIntegral(const Vecd &position, Real h_ratio = 1.0) override; virtual Vecd probeKernelGradientIntegral(const Vecd &position, Real h_ratio = 1.0) override; - virtual void writeMeshFieldToPlt(std::ofstream &output_file) override; + virtual void writeMeshFieldToPlt(std::ofstream &output_file) override { write_mesh_field_to_plt.exec(output_file); }; bool isWithinCorePackage(Vecd position); Kernel &kernel_; @@ -107,9 +107,10 @@ class LevelSet : public MeshWithGridDataPackages<4>, MeshCalculateDynamics probe_signed_distance{mesh_data_}; MeshCalculateDynamics probe_kernel_integral{mesh_data_}; MeshCalculateDynamics probe_kernel_gradient_integral{mesh_data_}; + MeshCalculateDynamics probe_is_within_mesh_bound{mesh_data_}; + MeshCalculateDynamics is_within_core_package{mesh_data_}; + MeshCalculateDynamics write_mesh_field_to_plt{mesh_data_}; - FinishDataPackages finish_data_packages{mesh_data_, shape_, kernel_, global_h_ratio_}; - MeshAllDynamics initialize_data_in_a_cell{mesh_data_, shape_}; MeshInnerDynamics update_level_set_gradient{mesh_data_}; MeshInnerDynamics update_kernel_integrals{mesh_data_, kernel_, global_h_ratio_}; MeshInnerDynamics diffuse_level_set_sign{mesh_data_}; @@ -152,16 +153,11 @@ class MultilevelLevelSet : public MultilevelMesh mesh_data_set_; + StdVec global_h_ratio_vec_; + UniquePtrsKeeper mesh_data_ptr_vector_keeper_; }; } // namespace SPH #endif // LEVEL_SET_H diff --git a/src/shared/meshes/all_mesh_dynamics.h b/src/shared/meshes/all_mesh_dynamics.h index db768edc3e..304abbe933 100644 --- a/src/shared/meshes/all_mesh_dynamics.h +++ b/src/shared/meshes/all_mesh_dynamics.h @@ -107,45 +107,59 @@ class ProbeNormalDirection : public BaseMeshLocalDynamics MeshCalculateDynamics probe_level_set_gradient{mesh_data_}; }; -// class CleanInterface -// : BaseMeshDynamics -// { -// public: -// explicit CleanInterface(MeshWithGridDataPackages &mesh_data, Real small_shift_factor) -// : BaseMeshDynamics(mesh_data), -// small_shift_factor_(small_shift_factor){}; -// virtual ~CleanInterface(){}; - -// virtual void exec() override; - -// private: -// Real small_shift_factor_; - -// MeshInnerDynamics mark_near_interface(small_shift_factor_); -// MeshCoreDynamics redistance_interface; -// MeshInnerDynamics reinitialize_level_set; -// MeshInnerDynamics update_level_set_gradient; -// MeshInnerDynamics update_kernel_integrals; -// } - -// class CorrectTopology -// : BaseMeshDynamics -// { -// public: -// explicit CorrectTopology(MeshWithGridDataPackages &mesh_data, Real small_shift_factor) -// : BaseMeshDynamics(mesh_data), -// small_shift_factor_(small_shift_factor){}; -// virtual ~CorrectTopology(){}; - -// virtual void exec() override; - -// private: -// Real small_shift_factor_; - -// MeshInnerDynamics mark_near_interface(small_shift_factor_); -// MeshInnerDynamics diffuse_level_set_sign(); -// MeshInnerDynamics update_level_set_gradient; -// MeshInnerDynamics update_kernel_integrals; -// } +class CleanInterface : public BaseMeshDynamics +{ + public: + explicit CleanInterface(MeshWithGridDataPackagesType &mesh_data, Kernel &kernel, Real global_h_ratio) + : BaseMeshDynamics(mesh_data), + kernel_(kernel), + global_h_ratio_(global_h_ratio){}; + virtual ~CleanInterface(){}; + + void exec(Real small_shift_factor){ + mark_near_interface.setSmallShiftFactor(small_shift_factor); + mark_near_interface.exec(); + redistance_interface.exec(); + reinitialize_level_set.exec(); + update_level_set_gradient.exec(); + update_kernel_integrals.exec(); + } + + private: + Kernel &kernel_; + Real global_h_ratio_; + MeshInnerDynamics update_level_set_gradient{mesh_data_}; + MeshInnerDynamics update_kernel_integrals{mesh_data_, kernel_, global_h_ratio_}; + MeshInnerDynamics mark_near_interface{mesh_data_}; + MeshCoreDynamics redistance_interface{mesh_data_}; + MeshInnerDynamics reinitialize_level_set{mesh_data_}; +}; + +class CorrectTopology : public BaseMeshDynamics +{ + public: + explicit CorrectTopology(MeshWithGridDataPackagesType &mesh_data, Kernel &kernel, Real global_h_ratio) + : BaseMeshDynamics(mesh_data), + kernel_(kernel), + global_h_ratio_(global_h_ratio){}; + virtual ~CorrectTopology(){}; + + void exec(Real small_shift_factor){ + mark_near_interface.setSmallShiftFactor(small_shift_factor); + mark_near_interface.exec(); + for (size_t i = 0; i != 10; ++i) + diffuse_level_set_sign.exec(); + update_level_set_gradient.exec(); + update_kernel_integrals.exec(); + } + + private: + Kernel &kernel_; + Real global_h_ratio_; + MeshInnerDynamics update_level_set_gradient{mesh_data_}; + MeshInnerDynamics update_kernel_integrals{mesh_data_, kernel_, global_h_ratio_}; + MeshInnerDynamics mark_near_interface{mesh_data_}; + MeshInnerDynamics diffuse_level_set_sign{mesh_data_}; +}; } // namespace SPH #endif // ALL_MESH_DYNAMICS_H \ No newline at end of file diff --git a/src/shared/meshes/mesh_local_dynamics.h b/src/shared/meshes/mesh_local_dynamics.h index 5c023da796..54ceefc25b 100644 --- a/src/shared/meshes/mesh_local_dynamics.h +++ b/src/shared/meshes/mesh_local_dynamics.h @@ -325,5 +325,50 @@ class ProbeKernelGradientIntegral : public BaseMeshLocalDynamics Vecd update(const Vecd &position) { return mesh_data_.probeMesh(kernel_gradient_, position); }; }; +class ProbeIsWithinMeshBound : public BaseMeshLocalDynamics +{ + public: + explicit ProbeIsWithinMeshBound(MeshWithGridDataPackagesType &mesh_data) + : BaseMeshLocalDynamics(mesh_data){}; + virtual ~ProbeIsWithinMeshBound(){}; + + bool update(const Vecd &position) + { + bool is_bounded = true; + Arrayi cell_pos = mesh_data_.CellIndexFromPosition(position); + for (int i = 0; i != position.size(); ++i) + { + if (cell_pos[i] < 2) + is_bounded = false; + if (cell_pos[i] > (all_cells_[i] - 2)) + is_bounded = false; + } + return is_bounded; + } +}; + +class IsWithinCorePackage : public BaseMeshLocalDynamics +{ + public: + explicit IsWithinCorePackage(MeshWithGridDataPackagesType &mesh_data) + : BaseMeshLocalDynamics(mesh_data){}; + virtual ~IsWithinCorePackage(){}; + + bool update(Vecd position) + { + Arrayi cell_index = mesh_data_.CellIndexFromPosition(position); + return mesh_data_.isCoreDataPackage(cell_index); + } +}; + +class WriteMeshFieldToPlt : public BaseMeshLocalDynamics +{ + public: + explicit WriteMeshFieldToPlt(MeshWithGridDataPackagesType &mesh_data) + : BaseMeshLocalDynamics(mesh_data){}; + virtual ~WriteMeshFieldToPlt(){}; + + void update(std::ofstream &output_file); +}; } // namespace SPH #endif // MESH_LOCAL_DYNAMICS_H diff --git a/src/shared/meshes/mesh_with_data_packages.h b/src/shared/meshes/mesh_with_data_packages.h index 01990bda31..429a08332f 100644 --- a/src/shared/meshes/mesh_with_data_packages.h +++ b/src/shared/meshes/mesh_with_data_packages.h @@ -115,12 +115,12 @@ class MeshWithGridDataPackages : public Mesh ConcurrentVec> occupied_data_pkgs_; /**< (size_t)sort_index, (int)core1/inner0. */ CellNeighborhood *cell_neighborhood_; /**< 3*3(*3) array to store indicies of neighborhood cells. */ std::pair *meta_data_cell_; /**< metadata for each occupied cell: (arrayi)cell index, (int)core1/inner0. */ + BaseMesh global_mesh_; /**< the mesh for the locations of all possible data points. */ protected: MeshVariableAssemble all_mesh_variables_; /**< all mesh variables on this mesh. */ static constexpr int pkg_size = PKG_SIZE; /**< the size of the data package matrix*/ const Real data_spacing_; /**< spacing of data in the data packages*/ - BaseMesh global_mesh_; /**< the mesh for the locations of all possible data points. */ size_t num_grid_pkgs_ = 2; /**< the number of all distinct packages, initially only 2 singular packages. */ using MetaData = std::pair; /**< stores the metadata for each cell: (int)singular0/inner1/core2, (size_t)package data index*/ MeshDataMatrix index_data_mesh_; /**< metadata for all cells. */ @@ -134,21 +134,6 @@ class MeshWithGridDataPackages : public Mesh void allocateIndexDataMatrix(); /**< allocate memories for metadata of data packages. */ void deleteIndexDataMatrix(); /**< delete memories for metadata of data packages. */ - template - MeshVariable *registerMeshVariable(const std::string &variable_name) - { - MeshVariable *variable = - findVariableByName(all_mesh_variables_, variable_name); - if (variable == nullptr) - { - constexpr int type_index = DataTypeIndex::value; - size_t new_variable_index = std::get(all_mesh_variables_).size(); - return addVariableToAssemble(all_mesh_variables_, mesh_variable_ptrs_, - variable_name, new_variable_index); - } - return variable; - }; - /** resize all mesh variable data field with `num_grid_pkgs_` size(initially only singular data) */ template struct ResizeMeshVariableData @@ -287,6 +272,21 @@ class MeshWithGridDataPackages : public Mesh Arrayi cell_index = CellIndexFromPosition(position); return isCoreDataPackage(cell_index); } + + template + MeshVariable *registerMeshVariable(const std::string &variable_name) + { + MeshVariable *variable = + findVariableByName(all_mesh_variables_, variable_name); + if (variable == nullptr) + { + constexpr int type_index = DataTypeIndex::value; + size_t new_variable_index = std::get(all_mesh_variables_).size(); + return addVariableToAssemble(all_mesh_variables_, mesh_variable_ptrs_, + variable_name, new_variable_index); + } + return variable; + }; }; } // namespace SPH #endif // MESH_WITH_DATA_PACKAGES_H From 00e680baac493333ca36c3f03d87dbc897234b23 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Mon, 26 Aug 2024 07:32:16 +0200 Subject: [PATCH 47/55] change implementation --- src/shared/geometries/level_set.cpp | 40 +++++++++++++++++------------ 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index f35a8aa203..bfa1cf81ad 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -155,48 +155,53 @@ size_t MultilevelLevelSet::getCoarseLevel(Real h_ratio) //=================================================================================================// void MultilevelLevelSet::cleanInterface(Real small_shift_factor) { - mesh_levels_.back()->cleanInterface(small_shift_factor); CleanInterface clean_interface{*mesh_data_set_.back(), kernel_, global_h_ratio_vec_.back()}; clean_interface.exec(small_shift_factor); } //=============================================================================================// void MultilevelLevelSet::correctTopology(Real small_shift_factor) { - mesh_levels_.back()->correctTopology(small_shift_factor); CorrectTopology correct_topology{*mesh_data_set_.back(), kernel_, global_h_ratio_vec_.back()}; correct_topology.exec(small_shift_factor); } //=============================================================================================// Real MultilevelLevelSet::probeSignedDistance(const Vecd &position) { - return mesh_levels_[getProbeLevel(position)]->probeSignedDistance(position); + MeshCalculateDynamics probe_signed_distance{*mesh_data_set_[getProbeLevel(position)]}; + return probe_signed_distance.exec(position); } //=============================================================================================// Vecd MultilevelLevelSet::probeNormalDirection(const Vecd &position) { - return mesh_levels_[getProbeLevel(position)]->probeNormalDirection(position); + MeshCalculateDynamics probe_normal_direction{*mesh_data_set_[getProbeLevel(position)]}; + return probe_normal_direction.exec(position); } //=============================================================================================// Vecd MultilevelLevelSet::probeLevelSetGradient(const Vecd &position) { - return mesh_levels_[getProbeLevel(position)]->probeLevelSetGradient(position); + MeshCalculateDynamics probe_levelset_gradient{*mesh_data_set_[getProbeLevel(position)]}; + return probe_levelset_gradient.exec(position); } //=============================================================================================// size_t MultilevelLevelSet::getProbeLevel(const Vecd &position) { - for (size_t level = total_levels_; level != 0; --level) - if (mesh_levels_[level - 1]->isWithinCorePackage(position)) + for (size_t level = total_levels_; level != 0; --level){ + MeshCalculateDynamics is_within_core_package{*mesh_data_set_[level - 1]}; + if(is_within_core_package.exec(position)) return level - 1; // jump out of the loop! + } return 0; } //=================================================================================================// Real MultilevelLevelSet::probeKernelIntegral(const Vecd &position, Real h_ratio) { size_t coarse_level = getCoarseLevel(h_ratio); - Real alpha = (mesh_levels_[coarse_level + 1]->global_h_ratio_ - h_ratio) / - (mesh_levels_[coarse_level + 1]->global_h_ratio_ - mesh_levels_[coarse_level]->global_h_ratio_); - Real coarse_level_value = mesh_levels_[coarse_level]->probeKernelIntegral(position); - Real fine_level_value = mesh_levels_[coarse_level + 1]->probeKernelIntegral(position); + Real alpha = (global_h_ratio_vec_[coarse_level + 1] - h_ratio) / + (global_h_ratio_vec_[coarse_level + 1] - global_h_ratio_vec_[coarse_level]); + MeshCalculateDynamics coarse_probe{*mesh_data_set_[coarse_level]}; + MeshCalculateDynamics fine_probe{*mesh_data_set_[coarse_level + 1]}; + Real coarse_level_value = coarse_probe.exec(position); + Real fine_level_value = fine_probe.exec(position); return alpha * coarse_level_value + (1.0 - alpha) * fine_level_value; } @@ -204,10 +209,12 @@ Real MultilevelLevelSet::probeKernelIntegral(const Vecd &position, Real h_ratio) Vecd MultilevelLevelSet::probeKernelGradientIntegral(const Vecd &position, Real h_ratio) { size_t coarse_level = getCoarseLevel(h_ratio); - Real alpha = (mesh_levels_[coarse_level + 1]->global_h_ratio_ - h_ratio) / - (mesh_levels_[coarse_level + 1]->global_h_ratio_ - mesh_levels_[coarse_level]->global_h_ratio_); - Vecd coarse_level_value = mesh_levels_[coarse_level]->probeKernelGradientIntegral(position); - Vecd fine_level_value = mesh_levels_[coarse_level + 1]->probeKernelGradientIntegral(position); + Real alpha = (global_h_ratio_vec_[coarse_level + 1] - h_ratio) / + (global_h_ratio_vec_[coarse_level + 1] - global_h_ratio_vec_[coarse_level]); + MeshCalculateDynamics coarse_probe{*mesh_data_set_[coarse_level]}; + MeshCalculateDynamics fine_probe{*mesh_data_set_[coarse_level + 1]}; + Vecd coarse_level_value = coarse_probe.exec(position); + Vecd fine_level_value = fine_probe.exec(position); return alpha * coarse_level_value + (1.0 - alpha) * fine_level_value; } @@ -217,7 +224,8 @@ bool MultilevelLevelSet::probeIsWithinMeshBound(const Vecd &position) bool is_bounded = true; for (size_t l = 0; l != total_levels_; ++l) { - if (!mesh_levels_[l]->probeIsWithinMeshBound(position)) + MeshCalculateDynamics probe_is_within_mesh_bound{*mesh_data_set_[l]}; + if (!probe_is_within_mesh_bound.exec(position)) { is_bounded = false; break; From 2dbc22a7a4d4d523261fabaac9e4df3101886d4a Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Mon, 26 Aug 2024 12:48:06 +0200 Subject: [PATCH 48/55] temp --- src/shared/adaptations/adaptation.cpp | 6 ++-- src/shared/adaptations/adaptation.h | 5 ++-- src/shared/geometries/level_set.cpp | 40 +++++++++++++++++++++++-- src/shared/geometries/level_set.h | 38 ++++++++++++++++------- src/shared/geometries/level_set_shape.h | 4 +-- 5 files changed, 72 insertions(+), 21 deletions(-) diff --git a/src/shared/adaptations/adaptation.cpp b/src/shared/adaptations/adaptation.cpp index 709f6e1b81..fd68bb3a37 100644 --- a/src/shared/adaptations/adaptation.cpp +++ b/src/shared/adaptations/adaptation.cpp @@ -86,7 +86,7 @@ UniquePtr SPHAdaptation::createCellLinkedList(const Bounding return makeUnique(domain_bounds, kernel_ptr_->CutOffRadius(), *this); } //=================================================================================================// -UniquePtr SPHAdaptation::createLevelSet(Shape &shape, Real refinement_ratio) +UniquePtr SPHAdaptation::createLevelSet(Shape &shape, Real refinement_ratio) { // estimate the required mesh levels int total_levels = (int)log10(MinimumDimension(shape.getBounds()) / ReferenceSpacing()) + 2; @@ -94,7 +94,7 @@ UniquePtr SPHAdaptation::createLevelSet(Shape &shape, Real refinem MultilevelLevelSet coarser_level_sets(shape.getBounds(), coarsest_spacing / refinement_ratio, total_levels - 1, shape, *this); // return the finest level set only - return makeUnique(shape.getBounds(), *coarser_level_sets.getMeshLevels().back(), shape, *this); + return makeUnique(shape.getBounds(), coarser_level_sets.getMeshLevels().back(), shape, *this); } //=================================================================================================// ParticleWithLocalRefinement:: @@ -136,7 +136,7 @@ UniquePtr ParticleWithLocalRefinement::createCellLinkedList( getCellLinkedListTotalLevel(), *this); } //=================================================================================================// -UniquePtr ParticleWithLocalRefinement::createLevelSet(Shape &shape, Real refinement_ratio) +UniquePtr ParticleWithLocalRefinement::createLevelSet(Shape &shape, Real refinement_ratio) { return makeUnique(shape.getBounds(), ReferenceSpacing() / refinement_ratio, getLevelSetTotalLevel(), shape, *this); diff --git a/src/shared/adaptations/adaptation.h b/src/shared/adaptations/adaptation.h index 0419ec97b5..5898d2f92f 100644 --- a/src/shared/adaptations/adaptation.h +++ b/src/shared/adaptations/adaptation.h @@ -40,6 +40,7 @@ class Shape; class BaseParticles; class BodyRegionByCell; class BaseLevelSet; +class MultilevelLevelSet; class BaseCellLinkedList; /** @@ -80,7 +81,7 @@ class SPHAdaptation virtual void initializeAdaptationVariables(BaseParticles &base_particles){}; virtual UniquePtr createCellLinkedList(const BoundingBox &domain_bounds); - virtual UniquePtr createLevelSet(Shape &shape, Real refinement_ratio); + virtual UniquePtr createLevelSet(Shape &shape, Real refinement_ratio); template void resetKernel(Args &&...args) @@ -118,7 +119,7 @@ class ParticleWithLocalRefinement : public SPHAdaptation virtual void initializeAdaptationVariables(BaseParticles &base_particles) override; virtual UniquePtr createCellLinkedList(const BoundingBox &domain_bounds) override; - virtual UniquePtr createLevelSet(Shape &shape, Real refinement_ratio) override; + virtual UniquePtr createLevelSet(Shape &shape, Real refinement_ratio) override; protected: Real finest_spacing_bound_; /**< the adaptation bound for finest particles */ diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index bfa1cf81ad..bf31712d11 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -99,9 +99,7 @@ RefinedLevelSet::RefinedLevelSet(BoundingBox tentative_bounds, LevelSet &coarse_ MultilevelLevelSet::MultilevelLevelSet( BoundingBox tentative_bounds, Real reference_data_spacing, size_t total_levels, Shape &shape, SPHAdaptation &sph_adaptation) - : MultilevelMesh( - tentative_bounds, reference_data_spacing, total_levels, shape, sph_adaptation), - kernel_(*sph_adaptation.getKernel()) + : BaseMeshField("LevelSet_" + shape.getName()), kernel_(*sph_adaptation.getKernel()), shape_(shape), total_levels_(total_levels) { mesh_data_set_.push_back( mesh_data_ptr_vector_keeper_ @@ -141,6 +139,30 @@ MultilevelLevelSet::MultilevelLevelSet( } } //=================================================================================================// +MultilevelLevelSet::MultilevelLevelSet( + BoundingBox tentative_bounds, MeshWithGridDataPackagesType* coarse_data, Shape &shape, SPHAdaptation &sph_adaptation) + : BaseMeshField("LevelSet_" + shape.getName()), kernel_(*sph_adaptation.getKernel()), shape_(shape) +{ + total_levels_ = 1; + Real reference_data_spacing = coarse_data->DataSpacing() * 0.5; + Real global_h_ratio = sph_adaptation.ReferenceSpacing() / reference_data_spacing; + global_h_ratio_vec_.push_back(global_h_ratio); + + mesh_data_set_.push_back( + mesh_data_ptr_vector_keeper_ + .template createPtr(tentative_bounds, reference_data_spacing, 4)); + mesh_data_set_[0]->registerMeshVariable("Levelset"); + mesh_data_set_[0]->registerMeshVariable("NearInterfaceID"); + mesh_data_set_[0]->registerMeshVariable("LevelsetGradient"); + mesh_data_set_[0]->registerMeshVariable("KernelWeight"); + mesh_data_set_[0]->registerMeshVariable("KernelGradient"); + + MeshAllDynamics initialize_data_in_a_cell_from_coarse(*mesh_data_set_[0], *coarse_data, shape_); + FinishDataPackages finish_data_packages{*mesh_data_set_[0], shape_, kernel_, global_h_ratio}; + initialize_data_in_a_cell_from_coarse.exec(); + finish_data_packages.exec(); +} +//=================================================================================================// size_t MultilevelLevelSet::getCoarseLevel(Real h_ratio) { for (size_t level = total_levels_; level != 0; --level) @@ -193,6 +215,12 @@ size_t MultilevelLevelSet::getProbeLevel(const Vecd &position) return 0; } //=================================================================================================// +Real MultilevelLevelSet::probeKernelIntegral(const Vecd &position) +{ + MeshCalculateDynamics refine_probe{*mesh_data_set_[0]}; + return refine_probe.exec(position); +} +//=================================================================================================// Real MultilevelLevelSet::probeKernelIntegral(const Vecd &position, Real h_ratio) { size_t coarse_level = getCoarseLevel(h_ratio); @@ -206,6 +234,12 @@ Real MultilevelLevelSet::probeKernelIntegral(const Vecd &position, Real h_ratio) return alpha * coarse_level_value + (1.0 - alpha) * fine_level_value; } //=================================================================================================// +Vecd MultilevelLevelSet::probeKernelGradientIntegral(const Vecd &position) +{ + MeshCalculateDynamics refine_probe{*mesh_data_set_[0]}; + return refine_probe.exec(position); +} +//=================================================================================================// Vecd MultilevelLevelSet::probeKernelGradientIntegral(const Vecd &position, Real h_ratio) { size_t coarse_level = getCoarseLevel(h_ratio); diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index acf37f9b9d..c7de5beda8 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -135,26 +135,42 @@ class RefinedLevelSet : public RefinedMesh * @class MultilevelLevelSet * @brief Defining a multilevel level set for a complex region. */ -class MultilevelLevelSet : public MultilevelMesh +class MultilevelLevelSet : public BaseMeshField { public: MultilevelLevelSet(BoundingBox tentative_bounds, Real reference_data_spacing, size_t total_levels, Shape &shape, SPHAdaptation &sph_adaptation); - virtual ~MultilevelLevelSet(){}; - - virtual void cleanInterface(Real small_shift_factor) override; - virtual void correctTopology(Real small_shift_factor) override; - virtual bool probeIsWithinMeshBound(const Vecd &position) override; - virtual Real probeSignedDistance(const Vecd &position) override; - virtual Vecd probeNormalDirection(const Vecd &position) override; - virtual Vecd probeLevelSetGradient(const Vecd &position) override; - virtual Real probeKernelIntegral(const Vecd &position, Real h_ratio = 1.0) override; - virtual Vecd probeKernelGradientIntegral(const Vecd &position, Real h_ratio = 1.0) override; + MultilevelLevelSet(BoundingBox tentative_bounds, MeshWithGridDataPackagesType* coarse_data, Shape &shape, SPHAdaptation &sph_adaptation); + ~MultilevelLevelSet(){}; + + void cleanInterface(Real small_shift_factor); + void correctTopology(Real small_shift_factor); + bool probeIsWithinMeshBound(const Vecd &position); + Real probeSignedDistance(const Vecd &position); + Vecd probeNormalDirection(const Vecd &position); + Vecd probeLevelSetGradient(const Vecd &position); + Real probeKernelIntegral(const Vecd &position, Real h_ratio = 1.0); + Real probeKernelIntegral(const Vecd &position); + Vecd probeKernelGradientIntegral(const Vecd &position, Real h_ratio = 1.0); + Vecd probeKernelGradientIntegral(const Vecd &position); + StdVec getMeshLevels() { return mesh_data_set_; }; + + void writeMeshFieldToPlt(std::ofstream &output_file) override + { + for (size_t l = 0; l != total_levels_; ++l) + { + MeshCalculateDynamics write_mesh_field_to_plt(*mesh_data_set_[l]); + write_mesh_field_to_plt.exec(output_file); + // mesh_levels_[l]->writeMeshFieldToPlt(output_file); + } + } protected: inline size_t getProbeLevel(const Vecd &position); inline size_t getCoarseLevel(Real h_ratio); Kernel &kernel_; + Shape &shape_; /**< the geometry is described by the level set. */ + size_t total_levels_; /**< level 0 is the coarsest */ StdVec mesh_data_set_; StdVec global_h_ratio_vec_; UniquePtrsKeeper mesh_data_ptr_vector_keeper_; diff --git a/src/shared/geometries/level_set_shape.h b/src/shared/geometries/level_set_shape.h index 90f7855530..5cced7a150 100644 --- a/src/shared/geometries/level_set_shape.h +++ b/src/shared/geometries/level_set_shape.h @@ -45,7 +45,7 @@ class SPHSystem; class LevelSetShape : public Shape { private: - UniquePtrKeeper level_set_keeper_; + UniquePtrKeeper level_set_keeper_; SharedPtr sph_adaptation_; public: @@ -68,7 +68,7 @@ class LevelSetShape : public Shape void writeLevelSet(SPHSystem &sph_system); protected: - BaseLevelSet &level_set_; /**< narrow bounded level set mesh. */ + MultilevelLevelSet &level_set_; /**< narrow bounded level set mesh. */ virtual BoundingBox findBounds() override; }; From 13933638500b664d46a8ead2b61795ab46ec0479 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Mon, 26 Aug 2024 13:18:13 +0200 Subject: [PATCH 49/55] complete --- src/shared/adaptations/adaptation.h | 1 - src/shared/geometries/level_set.cpp | 98 +++-------------------------- src/shared/geometries/level_set.h | 98 +---------------------------- 3 files changed, 10 insertions(+), 187 deletions(-) diff --git a/src/shared/adaptations/adaptation.h b/src/shared/adaptations/adaptation.h index 5898d2f92f..a5b61096bc 100644 --- a/src/shared/adaptations/adaptation.h +++ b/src/shared/adaptations/adaptation.h @@ -39,7 +39,6 @@ namespace SPH class Shape; class BaseParticles; class BodyRegionByCell; -class BaseLevelSet; class MultilevelLevelSet; class BaseCellLinkedList; diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index bf31712d11..bd301157bf 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -6,96 +6,6 @@ namespace SPH { //=================================================================================================// -BaseLevelSet ::BaseLevelSet(Shape &shape, SPHAdaptation &sph_adaptation) - : BaseMeshField("LevelSet_" + shape.getName()), shape_(shape), sph_adaptation_(sph_adaptation) -{ - if (!shape_.isValid()) - { - std::cout << "\n BaseLevelSet Error: shape_ is invalid." << std::endl; - std::cout << __FILE__ << ':' << __LINE__ << std::endl; - throw; - } -} -//=================================================================================================// -LevelSet::LevelSet(BoundingBox tentative_bounds, Real data_spacing, size_t buffer_size, - Shape &shape, SPHAdaptation &sph_adaptation) - : MeshWithGridDataPackages<4>(tentative_bounds, data_spacing, buffer_size), - BaseLevelSet(shape, sph_adaptation), - global_h_ratio_(sph_adaptation.ReferenceSpacing() / data_spacing), - phi_(*registerMeshVariable("Levelset")), - near_interface_id_(*registerMeshVariable("NearInterfaceID")), - phi_gradient_(*registerMeshVariable("LevelsetGradient")), - kernel_weight_(*registerMeshVariable("KernelWeight")), - kernel_gradient_(*registerMeshVariable("KernelGradient")), - kernel_(*sph_adaptation.getKernel()) {} -//=================================================================================================// -LevelSet::LevelSet(BoundingBox tentative_bounds, Real data_spacing, - Shape &shape, SPHAdaptation &sph_adaptation) - : LevelSet(tentative_bounds, data_spacing, 4, shape, sph_adaptation) -{ - MeshAllDynamics initialize_data_in_a_cell{mesh_data_, shape_}; - initialize_data_in_a_cell.exec(); - FinishDataPackages finish_data_packages{mesh_data_, shape_, kernel_, global_h_ratio_}; - finish_data_packages.exec(); -} -//=================================================================================================// -Vecd LevelSet::probeNormalDirection(const Vecd &position) -{ - return probe_normal_direction.exec(position); -} -//=================================================================================================// -Vecd LevelSet::probeLevelSetGradient(const Vecd &position) -{ - return probe_level_set_gradient.exec(position); -} -//=================================================================================================// -Real LevelSet::probeSignedDistance(const Vecd &position) -{ - return probe_signed_distance.exec(position); -} -//=================================================================================================// -Real LevelSet::probeKernelIntegral(const Vecd &position, Real h_ratio) -{ - return probe_kernel_integral.exec(position); -} -//=================================================================================================// -Vecd LevelSet::probeKernelGradientIntegral(const Vecd &position, Real h_ratio) -{ - return probe_kernel_gradient_integral.exec(position); -} -//=================================================================================================// -void LevelSet::cleanInterface(Real small_shift_factor) -{ - CleanInterface clean_interface{mesh_data_, kernel_, global_h_ratio_}; - clean_interface.exec(small_shift_factor); -} -//=============================================================================================// -void LevelSet::correctTopology(Real small_shift_factor) -{ - CorrectTopology correct_topology{mesh_data_, kernel_, global_h_ratio_}; - correct_topology.exec(small_shift_factor); -} -//=================================================================================================// -bool LevelSet::probeIsWithinMeshBound(const Vecd &position) -{ - return probe_is_within_mesh_bound.exec(position); -} -//=============================================================================================// -bool LevelSet::isWithinCorePackage(Vecd position) -{ - return is_within_core_package.exec(position); -} -//=============================================================================================// -RefinedLevelSet::RefinedLevelSet(BoundingBox tentative_bounds, LevelSet &coarse_level_set, - Shape &shape, SPHAdaptation &sph_adaptation) - : RefinedMesh(tentative_bounds, coarse_level_set, 4, shape, sph_adaptation) -{ - MeshAllDynamics initialize_data_in_a_cell_from_coarse(mesh_data_, coarse_mesh_, shape_); - initialize_data_in_a_cell_from_coarse.exec(); - FinishDataPackages finish_data_packages{mesh_data_, shape_, kernel_, global_h_ratio_}; - finish_data_packages.exec(); -} -//=============================================================================================// MultilevelLevelSet::MultilevelLevelSet( BoundingBox tentative_bounds, Real reference_data_spacing, size_t total_levels, Shape &shape, SPHAdaptation &sph_adaptation) @@ -223,6 +133,10 @@ Real MultilevelLevelSet::probeKernelIntegral(const Vecd &position) //=================================================================================================// Real MultilevelLevelSet::probeKernelIntegral(const Vecd &position, Real h_ratio) { + if(mesh_data_set_.size() == 1){ + MeshCalculateDynamics refine_probe{*mesh_data_set_[0]}; + return refine_probe.exec(position); + } size_t coarse_level = getCoarseLevel(h_ratio); Real alpha = (global_h_ratio_vec_[coarse_level + 1] - h_ratio) / (global_h_ratio_vec_[coarse_level + 1] - global_h_ratio_vec_[coarse_level]); @@ -242,6 +156,10 @@ Vecd MultilevelLevelSet::probeKernelGradientIntegral(const Vecd &position) //=================================================================================================// Vecd MultilevelLevelSet::probeKernelGradientIntegral(const Vecd &position, Real h_ratio) { + if(mesh_data_set_.size() == 1){ + MeshCalculateDynamics refine_probe{*mesh_data_set_[0]}; + return refine_probe.exec(position); + } size_t coarse_level = getCoarseLevel(h_ratio); Real alpha = (global_h_ratio_vec_[coarse_level + 1] - h_ratio) / (global_h_ratio_vec_[coarse_level + 1] - global_h_ratio_vec_[coarse_level]); diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index c7de5beda8..06b9f83ae0 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -38,99 +38,6 @@ namespace SPH { -/** - * @class BaseLevelSet - * @brief A abstract describes a level set field defined on a mesh. - * Level set is a signed distance function to an interface where the zero level set locates. - * Here, the region with negative level set is considered as the region enclose by the interface. - */ -class BaseLevelSet : public BaseMeshField -{ - public: - BaseLevelSet(Shape &shape, SPHAdaptation &sph_adaptation); - virtual ~BaseLevelSet(){}; - - virtual void cleanInterface(Real small_shift_factor) = 0; - virtual void correctTopology(Real small_shift_factor) = 0; - virtual bool probeIsWithinMeshBound(const Vecd &position) = 0; - virtual Real probeSignedDistance(const Vecd &position) = 0; - virtual Vecd probeNormalDirection(const Vecd &position) = 0; - virtual Vecd probeLevelSetGradient(const Vecd &position) = 0; - virtual Real probeKernelIntegral(const Vecd &position, Real h_ratio = 1.0) = 0; - virtual Vecd probeKernelGradientIntegral(const Vecd &position, Real h_ratio = 1.0) = 0; - - protected: - Shape &shape_; /**< the geometry is described by the level set. */ - SPHAdaptation &sph_adaptation_; -}; - -/** - * @class LevelSet - * @brief Mesh with level set data as packages. - * Note that the mesh containing the data packages are cell-based - * but within the data package, the data is grid-based. - * Note that the level set data is initialized after the constructor. - */ -class LevelSet : public MeshWithGridDataPackages<4>, - public BaseLevelSet -{ - public: - Real global_h_ratio_; - - /** This constructor only initialize far field. */ - LevelSet(BoundingBox tentative_bounds, Real data_spacing, size_t buffer_size, Shape &shape, SPHAdaptation &sph_adaptation); - /** This constructor generate inner packages too. */ - LevelSet(BoundingBox tentative_bounds, Real data_spacing, Shape &shape, SPHAdaptation &sph_adaptation); - virtual ~LevelSet(){}; - - virtual void cleanInterface(Real small_shift_factor) override; - virtual void correctTopology(Real small_shift_factor) override; - virtual bool probeIsWithinMeshBound(const Vecd &position) override; - virtual Real probeSignedDistance(const Vecd &position) override; - virtual Vecd probeNormalDirection(const Vecd &position) override; - virtual Vecd probeLevelSetGradient(const Vecd &position) override; - virtual Real probeKernelIntegral(const Vecd &position, Real h_ratio = 1.0) override; - virtual Vecd probeKernelGradientIntegral(const Vecd &position, Real h_ratio = 1.0) override; - virtual void writeMeshFieldToPlt(std::ofstream &output_file) override { write_mesh_field_to_plt.exec(output_file); }; - bool isWithinCorePackage(Vecd position); - Kernel &kernel_; - - protected: - MeshVariable &phi_; - MeshVariable &near_interface_id_; - MeshVariable &phi_gradient_; - MeshVariable &kernel_weight_; - MeshVariable &kernel_gradient_; - MeshWithGridDataPackages<4> &mesh_data_ = *this; - MeshCalculateDynamics probe_level_set_gradient{mesh_data_}; - MeshCalculateDynamics probe_normal_direction{mesh_data_}; - MeshCalculateDynamics probe_signed_distance{mesh_data_}; - MeshCalculateDynamics probe_kernel_integral{mesh_data_}; - MeshCalculateDynamics probe_kernel_gradient_integral{mesh_data_}; - MeshCalculateDynamics probe_is_within_mesh_bound{mesh_data_}; - MeshCalculateDynamics is_within_core_package{mesh_data_}; - MeshCalculateDynamics write_mesh_field_to_plt{mesh_data_}; - - MeshInnerDynamics update_level_set_gradient{mesh_data_}; - MeshInnerDynamics update_kernel_integrals{mesh_data_, kernel_, global_h_ratio_}; - MeshInnerDynamics diffuse_level_set_sign{mesh_data_}; - MeshInnerDynamics reinitialize_level_set{mesh_data_}; - MeshInnerDynamics mark_near_interface{mesh_data_}; - MeshCoreDynamics redistance_interface{mesh_data_}; - -}; - -/** - * @class RefinedLevelSet - * @brief level set which has double resolution of a coarse level set. - */ -class RefinedLevelSet : public RefinedMesh -{ - public: - RefinedLevelSet(BoundingBox tentative_bounds, LevelSet &coarse_level_set, Shape &shape, SPHAdaptation &sph_adaptation); - virtual ~RefinedLevelSet(){}; -}; - /** * @class MultilevelLevelSet * @brief Defining a multilevel level set for a complex region. @@ -160,7 +67,6 @@ class MultilevelLevelSet : public BaseMeshField { MeshCalculateDynamics write_mesh_field_to_plt(*mesh_data_set_[l]); write_mesh_field_to_plt.exec(output_file); - // mesh_levels_[l]->writeMeshFieldToPlt(output_file); } } @@ -169,10 +75,10 @@ class MultilevelLevelSet : public BaseMeshField inline size_t getCoarseLevel(Real h_ratio); Kernel &kernel_; - Shape &shape_; /**< the geometry is described by the level set. */ + Shape &shape_; /**< the geometry is described by the level set. */ size_t total_levels_; /**< level 0 is the coarsest */ - StdVec mesh_data_set_; StdVec global_h_ratio_vec_; + StdVec mesh_data_set_; UniquePtrsKeeper mesh_data_ptr_vector_keeper_; }; } // namespace SPH From cda96a52a0bcd562d84e37e64ef130ad4b7b27b7 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Wed, 28 Aug 2024 18:40:55 +0200 Subject: [PATCH 50/55] updated --- .../meshes/mesh_with_data_packages.hpp | 11 --------- .../meshes/mesh_with_data_packages.hpp | 11 --------- src/shared/meshes/mesh_with_data_packages.h | 12 ++++++++-- src/shared/variables/base_variable.h | 23 ------------------- 4 files changed, 10 insertions(+), 47 deletions(-) diff --git a/src/for_2D_build/meshes/mesh_with_data_packages.hpp b/src/for_2D_build/meshes/mesh_with_data_packages.hpp index 694477c045..a166305940 100644 --- a/src/for_2D_build/meshes/mesh_with_data_packages.hpp +++ b/src/for_2D_build/meshes/mesh_with_data_packages.hpp @@ -196,17 +196,6 @@ DataType MeshWithGridDataPackages:: return bilinear; } //=================================================================================================// -template -template -void MeshWithGridDataPackages::grid_parallel_for(const FunctionOnData &function) -{ - mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), - [&](size_t i, size_t j) - { - function(Arrayi(i, j)); - }); -} -//=================================================================================================// } // namespace SPH //=================================================================================================// #endif // MESH_WITH_DATA_PACKAGES_2D_HPP \ No newline at end of file diff --git a/src/for_3D_build/meshes/mesh_with_data_packages.hpp b/src/for_3D_build/meshes/mesh_with_data_packages.hpp index 4b75c7905a..46ab1e720a 100644 --- a/src/for_3D_build/meshes/mesh_with_data_packages.hpp +++ b/src/for_3D_build/meshes/mesh_with_data_packages.hpp @@ -212,17 +212,6 @@ DataType MeshWithGridDataPackages:: return bilinear_1 * beta[2] + bilinear_2 * alpha[2]; } //=================================================================================================// -template -template -void MeshWithGridDataPackages::grid_parallel_for(const FunctionOnData &function) -{ - mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), - [&](size_t i, size_t j, size_t k) - { - function(Arrayi(i, j, k)); - }); -} -//=================================================================================================// } // namespace SPH //=================================================================================================// #endif // MESH_WITH_DATA_PACKAGES_3D_HPP \ No newline at end of file diff --git a/src/shared/meshes/mesh_with_data_packages.h b/src/shared/meshes/mesh_with_data_packages.h index 429a08332f..3b15cc782d 100644 --- a/src/shared/meshes/mesh_with_data_packages.h +++ b/src/shared/meshes/mesh_with_data_packages.h @@ -33,6 +33,7 @@ #include "base_variable.h" #include "my_memory_pool.h" #include "tbb/parallel_sort.h" +#include "mesh_iterators.h" #include #include @@ -107,7 +108,7 @@ class MeshWithGridDataPackages : public Mesh delete[] meta_data_cell_; }; /** spacing between the data, which is 1/ pkg_size of this grid spacing */ - virtual Real DataSpacing() override { return data_spacing_; }; + Real DataSpacing() { return data_spacing_; }; Real GridSpacing() { return grid_spacing_; }; size_t BufferWidth() { return buffer_width_; }; @@ -202,7 +203,14 @@ class MeshWithGridDataPackages : public Mesh template void for_each_cell_data(const FunctionOnData &function); template - void grid_parallel_for(const FunctionOnData &function); + void grid_parallel_for(const FunctionOnData &function) + { + mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), + [&](Arrayi cell_index) + { + function(cell_index); + }); + } void resizeMeshVariableData() { resize_mesh_variable_data_(all_mesh_variables_, num_grid_pkgs_); diff --git a/src/shared/variables/base_variable.h b/src/shared/variables/base_variable.h index cb59c39dfb..f9d779d992 100644 --- a/src/shared/variables/base_variable.h +++ b/src/shared/variables/base_variable.h @@ -98,29 +98,6 @@ class MeshVariable : public BaseVariable PackageData *data_field_; }; -template -class MeshVariable : public BaseVariable -{ - public: - using PackageData = PackageDataMatrix; - MeshVariable(const std::string &name, size_t index) - : BaseVariable(name), index_in_container_(index), - data_field_(nullptr){}; - virtual ~MeshVariable() { delete[] data_field_; }; - - size_t IndexInContainer() const { return index_in_container_; }; - // void setDataField(PackageData* mesh_data){ data_field_ = mesh_data; }; - PackageData *DataField() { return data_field_; }; - void allocateAllMeshVariableData(const size_t size) - { - data_field_ = new PackageData[size]; - } - - private: - size_t index_in_container_; - PackageData *data_field_; -}; - template class VariableType> VariableType *findVariableByName(DataContainerAddressAssemble &assemble, const std::string &name) From a31e1a490abadee90dcc7977ae5fd3cb00d45921 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Mon, 2 Sep 2024 11:44:45 +0200 Subject: [PATCH 51/55] separate grid for --- src/shared/meshes/mesh_dynamics.h | 17 +++++++++++++++-- src/shared/meshes/mesh_with_data_packages.h | 9 --------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/shared/meshes/mesh_dynamics.h b/src/shared/meshes/mesh_dynamics.h index 091596e780..f32f54261c 100644 --- a/src/shared/meshes/mesh_dynamics.h +++ b/src/shared/meshes/mesh_dynamics.h @@ -33,6 +33,7 @@ #include "mesh_local_dynamics.h" #include "mesh_with_data_packages.hpp" +#include "mesh_iterators.h" #include @@ -50,11 +51,23 @@ class BaseMeshDynamics { public: BaseMeshDynamics(MeshWithGridDataPackages<4> &mesh_data) - : mesh_data_(mesh_data){}; + : mesh_data_(mesh_data), + all_cells_(mesh_data.AllCells()){}; virtual ~BaseMeshDynamics(){}; protected: MeshWithGridDataPackages<4> &mesh_data_; + Arrayi all_cells_; + + template + void grid_parallel_for(const FunctionOnData &function) + { + mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), + [&](Arrayi cell_index) + { + function(cell_index); + }); + } }; /** @@ -73,7 +86,7 @@ class MeshAllDynamics : public LocalDynamicsType, public BaseMeshDynamics void exec() { - mesh_data_.grid_parallel_for( + grid_parallel_for( [&](Arrayi cell_index) { this->update(cell_index); diff --git a/src/shared/meshes/mesh_with_data_packages.h b/src/shared/meshes/mesh_with_data_packages.h index 3b15cc782d..04ddf25684 100644 --- a/src/shared/meshes/mesh_with_data_packages.h +++ b/src/shared/meshes/mesh_with_data_packages.h @@ -202,15 +202,6 @@ class MeshWithGridDataPackages : public Mesh /** void (non_value_returning) function iterate on all data points by value. */ template void for_each_cell_data(const FunctionOnData &function); - template - void grid_parallel_for(const FunctionOnData &function) - { - mesh_parallel_for(MeshRange(Arrayi::Zero(), all_cells_), - [&](Arrayi cell_index) - { - function(cell_index); - }); - } void resizeMeshVariableData() { resize_mesh_variable_data_(all_mesh_variables_, num_grid_pkgs_); From 32f67a7ef6ce97cda579754ab554bdc65acfd613 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Mon, 2 Sep 2024 14:27:44 +0200 Subject: [PATCH 52/55] minor --- src/shared/geometries/level_set.cpp | 62 +++++++++++++++++++---------- src/shared/geometries/level_set.h | 9 +++++ 2 files changed, 49 insertions(+), 22 deletions(-) diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index bd301157bf..2748d97af5 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -27,6 +27,15 @@ MultilevelLevelSet::MultilevelLevelSet( FinishDataPackages finish_data_packages{*mesh_data_set_[0], shape_, kernel_, global_h_ratio}; initialize_data_in_a_cell.exec(); finish_data_packages.exec(); + probe_signed_distance_set_.push_back( + probe_signed_distance_vector_keeper_ + .template createPtr>(*mesh_data_set_[0])); + probe_normal_direction_set_.push_back( + probe_normal_direction_vector_keeper_ + .template createPtr>(*mesh_data_set_[0])); + probe_level_set_gradient_set_.push_back( + probe_level_set_gradient_vector_keeper_ + .template createPtr>(*mesh_data_set_[0])); for (size_t level = 1; level != total_levels_; ++level) { @@ -46,7 +55,20 @@ MultilevelLevelSet::MultilevelLevelSet( FinishDataPackages finish_data_packages{*mesh_data_set_[level], shape_, kernel_, global_h_ratio}; initialize_data_in_a_cell_from_coarse.exec(); finish_data_packages.exec(); + + probe_signed_distance_set_.push_back( + probe_signed_distance_vector_keeper_ + .template createPtr>(*mesh_data_set_[level])); + probe_normal_direction_set_.push_back( + probe_normal_direction_vector_keeper_ + .template createPtr>(*mesh_data_set_[level])); + probe_level_set_gradient_set_.push_back( + probe_level_set_gradient_vector_keeper_ + .template createPtr>(*mesh_data_set_[level])); } + + clean_interface = new CleanInterface{*mesh_data_set_.back(), kernel_, global_h_ratio_vec_.back()}; + correct_topology = new CorrectTopology{*mesh_data_set_.back(), kernel_, global_h_ratio_vec_.back()}; } //=================================================================================================// MultilevelLevelSet::MultilevelLevelSet( @@ -71,6 +93,19 @@ MultilevelLevelSet::MultilevelLevelSet( FinishDataPackages finish_data_packages{*mesh_data_set_[0], shape_, kernel_, global_h_ratio}; initialize_data_in_a_cell_from_coarse.exec(); finish_data_packages.exec(); + + probe_signed_distance_set_.push_back( + probe_signed_distance_vector_keeper_ + .template createPtr>(*mesh_data_set_[0])); + probe_normal_direction_set_.push_back( + probe_normal_direction_vector_keeper_ + .template createPtr>(*mesh_data_set_[0])); + probe_level_set_gradient_set_.push_back( + probe_level_set_gradient_vector_keeper_ + .template createPtr>(*mesh_data_set_[0])); + + clean_interface = new CleanInterface{*mesh_data_set_.back(), kernel_, global_h_ratio_vec_.back()}; + correct_topology = new CorrectTopology{*mesh_data_set_.back(), kernel_, global_h_ratio_vec_.back()}; } //=================================================================================================// size_t MultilevelLevelSet::getCoarseLevel(Real h_ratio) @@ -87,32 +122,27 @@ size_t MultilevelLevelSet::getCoarseLevel(Real h_ratio) //=================================================================================================// void MultilevelLevelSet::cleanInterface(Real small_shift_factor) { - CleanInterface clean_interface{*mesh_data_set_.back(), kernel_, global_h_ratio_vec_.back()}; - clean_interface.exec(small_shift_factor); + clean_interface->exec(small_shift_factor); } //=============================================================================================// void MultilevelLevelSet::correctTopology(Real small_shift_factor) { - CorrectTopology correct_topology{*mesh_data_set_.back(), kernel_, global_h_ratio_vec_.back()}; - correct_topology.exec(small_shift_factor); + correct_topology->exec(small_shift_factor); } //=============================================================================================// Real MultilevelLevelSet::probeSignedDistance(const Vecd &position) { - MeshCalculateDynamics probe_signed_distance{*mesh_data_set_[getProbeLevel(position)]}; - return probe_signed_distance.exec(position); + return probe_signed_distance_set_[getProbeLevel(position)]->exec(position); } //=============================================================================================// Vecd MultilevelLevelSet::probeNormalDirection(const Vecd &position) { - MeshCalculateDynamics probe_normal_direction{*mesh_data_set_[getProbeLevel(position)]}; - return probe_normal_direction.exec(position); + return probe_normal_direction_set_[getProbeLevel(position)]->exec(position); } //=============================================================================================// Vecd MultilevelLevelSet::probeLevelSetGradient(const Vecd &position) { - MeshCalculateDynamics probe_levelset_gradient{*mesh_data_set_[getProbeLevel(position)]}; - return probe_levelset_gradient.exec(position); + return probe_level_set_gradient_set_[getProbeLevel(position)]->exec(position); } //=============================================================================================// size_t MultilevelLevelSet::getProbeLevel(const Vecd &position) @@ -125,12 +155,6 @@ size_t MultilevelLevelSet::getProbeLevel(const Vecd &position) return 0; } //=================================================================================================// -Real MultilevelLevelSet::probeKernelIntegral(const Vecd &position) -{ - MeshCalculateDynamics refine_probe{*mesh_data_set_[0]}; - return refine_probe.exec(position); -} -//=================================================================================================// Real MultilevelLevelSet::probeKernelIntegral(const Vecd &position, Real h_ratio) { if(mesh_data_set_.size() == 1){ @@ -148,12 +172,6 @@ Real MultilevelLevelSet::probeKernelIntegral(const Vecd &position, Real h_ratio) return alpha * coarse_level_value + (1.0 - alpha) * fine_level_value; } //=================================================================================================// -Vecd MultilevelLevelSet::probeKernelGradientIntegral(const Vecd &position) -{ - MeshCalculateDynamics refine_probe{*mesh_data_set_[0]}; - return refine_probe.exec(position); -} -//=================================================================================================// Vecd MultilevelLevelSet::probeKernelGradientIntegral(const Vecd &position, Real h_ratio) { if(mesh_data_set_.size() == 1){ diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index 06b9f83ae0..eab2c61a1f 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -79,7 +79,16 @@ class MultilevelLevelSet : public BaseMeshField size_t total_levels_; /**< level 0 is the coarsest */ StdVec global_h_ratio_vec_; StdVec mesh_data_set_; + StdVec *> probe_signed_distance_set_; + StdVec *> probe_normal_direction_set_; + StdVec *> probe_level_set_gradient_set_; UniquePtrsKeeper mesh_data_ptr_vector_keeper_; + UniquePtrsKeeper> probe_signed_distance_vector_keeper_; + UniquePtrsKeeper> probe_normal_direction_vector_keeper_; + UniquePtrsKeeper> probe_level_set_gradient_vector_keeper_; + + CleanInterface *clean_interface; + CorrectTopology *correct_topology; }; } // namespace SPH #endif // LEVEL_SET_H From a80ce96add0f149f4af231ad838cda8c288e6a21 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Mon, 9 Sep 2024 08:00:44 +0200 Subject: [PATCH 53/55] reorder init del calculate class --- src/shared/geometries/level_set.cpp | 56 ++++++++--------- src/shared/geometries/level_set.h | 16 ++--- src/shared/meshes/all_mesh_dynamics.cpp | 69 --------------------- src/shared/meshes/all_mesh_dynamics.h | 12 ++-- src/shared/meshes/mesh_dynamics.h | 65 +++++++------------ src/shared/meshes/mesh_with_data_packages.h | 21 +------ 6 files changed, 68 insertions(+), 171 deletions(-) delete mode 100644 src/shared/meshes/all_mesh_dynamics.cpp diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index 2748d97af5..bc056d9e4b 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -29,13 +29,13 @@ MultilevelLevelSet::MultilevelLevelSet( finish_data_packages.exec(); probe_signed_distance_set_.push_back( probe_signed_distance_vector_keeper_ - .template createPtr>(*mesh_data_set_[0])); + .template createPtr(*mesh_data_set_[0])); probe_normal_direction_set_.push_back( probe_normal_direction_vector_keeper_ - .template createPtr>(*mesh_data_set_[0])); + .template createPtr(*mesh_data_set_[0])); probe_level_set_gradient_set_.push_back( probe_level_set_gradient_vector_keeper_ - .template createPtr>(*mesh_data_set_[0])); + .template createPtr(*mesh_data_set_[0])); for (size_t level = 1; level != total_levels_; ++level) { @@ -58,13 +58,13 @@ MultilevelLevelSet::MultilevelLevelSet( probe_signed_distance_set_.push_back( probe_signed_distance_vector_keeper_ - .template createPtr>(*mesh_data_set_[level])); + .template createPtr(*mesh_data_set_[level])); probe_normal_direction_set_.push_back( probe_normal_direction_vector_keeper_ - .template createPtr>(*mesh_data_set_[level])); + .template createPtr(*mesh_data_set_[level])); probe_level_set_gradient_set_.push_back( probe_level_set_gradient_vector_keeper_ - .template createPtr>(*mesh_data_set_[level])); + .template createPtr(*mesh_data_set_[level])); } clean_interface = new CleanInterface{*mesh_data_set_.back(), kernel_, global_h_ratio_vec_.back()}; @@ -96,13 +96,13 @@ MultilevelLevelSet::MultilevelLevelSet( probe_signed_distance_set_.push_back( probe_signed_distance_vector_keeper_ - .template createPtr>(*mesh_data_set_[0])); + .template createPtr(*mesh_data_set_[0])); probe_normal_direction_set_.push_back( probe_normal_direction_vector_keeper_ - .template createPtr>(*mesh_data_set_[0])); + .template createPtr(*mesh_data_set_[0])); probe_level_set_gradient_set_.push_back( probe_level_set_gradient_vector_keeper_ - .template createPtr>(*mesh_data_set_[0])); + .template createPtr(*mesh_data_set_[0])); clean_interface = new CleanInterface{*mesh_data_set_.back(), kernel_, global_h_ratio_vec_.back()}; correct_topology = new CorrectTopology{*mesh_data_set_.back(), kernel_, global_h_ratio_vec_.back()}; @@ -132,24 +132,24 @@ void MultilevelLevelSet::correctTopology(Real small_shift_factor) //=============================================================================================// Real MultilevelLevelSet::probeSignedDistance(const Vecd &position) { - return probe_signed_distance_set_[getProbeLevel(position)]->exec(position); + return probe_signed_distance_set_[getProbeLevel(position)]->update(position); } //=============================================================================================// Vecd MultilevelLevelSet::probeNormalDirection(const Vecd &position) { - return probe_normal_direction_set_[getProbeLevel(position)]->exec(position); + return probe_normal_direction_set_[getProbeLevel(position)]->update(position); } //=============================================================================================// Vecd MultilevelLevelSet::probeLevelSetGradient(const Vecd &position) { - return probe_level_set_gradient_set_[getProbeLevel(position)]->exec(position); + return probe_level_set_gradient_set_[getProbeLevel(position)]->update(position); } //=============================================================================================// size_t MultilevelLevelSet::getProbeLevel(const Vecd &position) { for (size_t level = total_levels_; level != 0; --level){ - MeshCalculateDynamics is_within_core_package{*mesh_data_set_[level - 1]}; - if(is_within_core_package.exec(position)) + IsWithinCorePackage is_within_core_package{*mesh_data_set_[level - 1]}; + if(is_within_core_package.update(position)) return level - 1; // jump out of the loop! } return 0; @@ -158,16 +158,16 @@ size_t MultilevelLevelSet::getProbeLevel(const Vecd &position) Real MultilevelLevelSet::probeKernelIntegral(const Vecd &position, Real h_ratio) { if(mesh_data_set_.size() == 1){ - MeshCalculateDynamics refine_probe{*mesh_data_set_[0]}; - return refine_probe.exec(position); + ProbeKernelIntegral refine_probe{*mesh_data_set_[0]}; + return refine_probe.update(position); } size_t coarse_level = getCoarseLevel(h_ratio); Real alpha = (global_h_ratio_vec_[coarse_level + 1] - h_ratio) / (global_h_ratio_vec_[coarse_level + 1] - global_h_ratio_vec_[coarse_level]); - MeshCalculateDynamics coarse_probe{*mesh_data_set_[coarse_level]}; - MeshCalculateDynamics fine_probe{*mesh_data_set_[coarse_level + 1]}; - Real coarse_level_value = coarse_probe.exec(position); - Real fine_level_value = fine_probe.exec(position); + ProbeKernelIntegral coarse_probe{*mesh_data_set_[coarse_level]}; + ProbeKernelIntegral fine_probe{*mesh_data_set_[coarse_level + 1]}; + Real coarse_level_value = coarse_probe.update(position); + Real fine_level_value = fine_probe.update(position); return alpha * coarse_level_value + (1.0 - alpha) * fine_level_value; } @@ -175,16 +175,16 @@ Real MultilevelLevelSet::probeKernelIntegral(const Vecd &position, Real h_ratio) Vecd MultilevelLevelSet::probeKernelGradientIntegral(const Vecd &position, Real h_ratio) { if(mesh_data_set_.size() == 1){ - MeshCalculateDynamics refine_probe{*mesh_data_set_[0]}; - return refine_probe.exec(position); + ProbeKernelGradientIntegral refine_probe{*mesh_data_set_[0]}; + return refine_probe.update(position); } size_t coarse_level = getCoarseLevel(h_ratio); Real alpha = (global_h_ratio_vec_[coarse_level + 1] - h_ratio) / (global_h_ratio_vec_[coarse_level + 1] - global_h_ratio_vec_[coarse_level]); - MeshCalculateDynamics coarse_probe{*mesh_data_set_[coarse_level]}; - MeshCalculateDynamics fine_probe{*mesh_data_set_[coarse_level + 1]}; - Vecd coarse_level_value = coarse_probe.exec(position); - Vecd fine_level_value = fine_probe.exec(position); + ProbeKernelGradientIntegral coarse_probe{*mesh_data_set_[coarse_level]}; + ProbeKernelGradientIntegral fine_probe{*mesh_data_set_[coarse_level + 1]}; + Vecd coarse_level_value = coarse_probe.update(position); + Vecd fine_level_value = fine_probe.update(position); return alpha * coarse_level_value + (1.0 - alpha) * fine_level_value; } @@ -194,8 +194,8 @@ bool MultilevelLevelSet::probeIsWithinMeshBound(const Vecd &position) bool is_bounded = true; for (size_t l = 0; l != total_levels_; ++l) { - MeshCalculateDynamics probe_is_within_mesh_bound{*mesh_data_set_[l]}; - if (!probe_is_within_mesh_bound.exec(position)) + ProbeIsWithinMeshBound probe_is_within_mesh_bound{*mesh_data_set_[l]}; + if (!probe_is_within_mesh_bound.update(position)) { is_bounded = false; break; diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index eab2c61a1f..d596c295bd 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -65,8 +65,8 @@ class MultilevelLevelSet : public BaseMeshField { for (size_t l = 0; l != total_levels_; ++l) { - MeshCalculateDynamics write_mesh_field_to_plt(*mesh_data_set_[l]); - write_mesh_field_to_plt.exec(output_file); + WriteMeshFieldToPlt write_mesh_field_to_plt(*mesh_data_set_[l]); + write_mesh_field_to_plt.update(output_file); } } @@ -79,13 +79,13 @@ class MultilevelLevelSet : public BaseMeshField size_t total_levels_; /**< level 0 is the coarsest */ StdVec global_h_ratio_vec_; StdVec mesh_data_set_; - StdVec *> probe_signed_distance_set_; - StdVec *> probe_normal_direction_set_; - StdVec *> probe_level_set_gradient_set_; + StdVec probe_signed_distance_set_; + StdVec probe_normal_direction_set_; + StdVec probe_level_set_gradient_set_; UniquePtrsKeeper mesh_data_ptr_vector_keeper_; - UniquePtrsKeeper> probe_signed_distance_vector_keeper_; - UniquePtrsKeeper> probe_normal_direction_vector_keeper_; - UniquePtrsKeeper> probe_level_set_gradient_vector_keeper_; + UniquePtrsKeeper probe_signed_distance_vector_keeper_; + UniquePtrsKeeper probe_normal_direction_vector_keeper_; + UniquePtrsKeeper probe_level_set_gradient_vector_keeper_; CleanInterface *clean_interface; CorrectTopology *correct_topology; diff --git a/src/shared/meshes/all_mesh_dynamics.cpp b/src/shared/meshes/all_mesh_dynamics.cpp deleted file mode 100644 index 36fa08b76a..0000000000 --- a/src/shared/meshes/all_mesh_dynamics.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/* ------------------------------------------------------------------------- * - * SPHinXsys * - * ------------------------------------------------------------------------- * - * SPHinXsys (pronunciation: s'finksis) is an acronym from Smoothed Particle * - * Hydrodynamics for industrial compleX systems. It provides C++ APIs for * - * physical accurate simulation and aims to model coupled industrial dynamic * - * systems including fluid, solid, multi-body dynamics and beyond with SPH * - * (smoothed particle hydrodynamics), a meshless computational method using * - * particle discretization. * - * * - * SPHinXsys is partially funded by German Research Foundation * - * (Deutsche Forschungsgemeinschaft) DFG HU1527/6-1, HU1527/10-1, * - * HU1527/12-1 and HU1527/12-4. * - * * - * Portions copyright (c) 2017-2023 Technical University of Munich and * - * the authors' affiliations. * - * * - * Licensed under the Apache License, Version 2.0 (the "License"); you may * - * not use this file except in compliance with the License. You may obtain a * - * copy of the License at http://www.apache.org/licenses/LICENSE-2.0. * - * * - * ------------------------------------------------------------------------- */ -/** - * @file base_relax_dynamics.h - * @brief This is the classes of particle relaxation in order to produce body fitted - * initial particle distribution. - * @author Chi Zhang and Xiangyu Hu - */ - -#include "all_mesh_dynamics.h" - -#include "all_body_relations.h" -#include "all_particle_dynamics.h" -#include "base_kernel.h" -#include "base_particles.hpp" -#include "cell_linked_list.h" - -namespace SPH -{ -//=================================================================================================// -// void DefineShapeOnMeshWithGridDataPackages::exec() -// { -// initialize_data_in_a_cell.exec(); -// tag_a_cell_is_inner_package.exec(); -// initialize_index_mesh.exec(); -// initialize_cell_neighborhood.exec(); -// mesh_data_.resizeMeshVariableData(); -// } -//=================================================================================================// -// void CleanInterface::exec() -// { -// mark_near_interface.exec(); -// redistance_interface.exec(); -// reinitialize_level_set.exec(); -// update_level_set_gradient.exec(); -// update_kernel_integrals.exec(); -// } -//=================================================================================================// -// void CorrectTopology::exec() -// { -// mark_near_interface.exec(); -// for (size_t i = 0; i != 10; ++i) -// diffuse_level_set_sign.exec(); -// update_level_set_gradient.exec(); -// update_kernel_integrals.exec(); -// } -//=================================================================================================// -} // namespace SPH -//=================================================================================================// diff --git a/src/shared/meshes/all_mesh_dynamics.h b/src/shared/meshes/all_mesh_dynamics.h index 304abbe933..b94092c545 100644 --- a/src/shared/meshes/all_mesh_dynamics.h +++ b/src/shared/meshes/all_mesh_dynamics.h @@ -57,8 +57,8 @@ class FinishDataPackages : public BaseMeshDynamics mesh_data_.resizeMeshVariableData(); Real far_field_distance = grid_spacing_ * (Real)buffer_width_; - initialize_data_for_singular_package.exec(0, -far_field_distance); - initialize_data_for_singular_package.exec(1, far_field_distance); + initialize_data_for_singular_package.update(0, -far_field_distance); + initialize_data_for_singular_package.update(1, far_field_distance); initialize_basic_data_for_a_package.exec(); update_level_set_gradient.exec(); @@ -72,7 +72,7 @@ class FinishDataPackages : public BaseMeshDynamics Real grid_spacing_; size_t buffer_width_; - MeshSingleDynamics initialize_data_for_singular_package{mesh_data_}; + InitializeDataForSingularPackage initialize_data_for_singular_package{mesh_data_}; MeshAllDynamics tag_a_cell_is_inner_package{mesh_data_}; MeshInnerDynamics initialize_index_mesh{mesh_data_}; MeshInnerDynamics initialize_cell_neighborhood{mesh_data_}; @@ -90,7 +90,7 @@ class ProbeNormalDirection : public BaseMeshLocalDynamics Vecd update(const Vecd &position) { - Vecd probed_value = probe_level_set_gradient.exec(position); + Vecd probed_value = probe_level_set_gradient.update(position); Real threshold = 1.0e-2 * data_spacing_; while (probed_value.norm() < threshold) @@ -98,13 +98,13 @@ class ProbeNormalDirection : public BaseMeshLocalDynamics Vecd jittered = position; // jittering for (int l = 0; l != position.size(); ++l) jittered[l] += rand_uniform(-0.5, 0.5) * 0.5 * data_spacing_; - probed_value = probe_level_set_gradient.exec(jittered); + probed_value = probe_level_set_gradient.update(jittered); } return probed_value.normalized(); } private: - MeshCalculateDynamics probe_level_set_gradient{mesh_data_}; + ProbeLevelSetGradient probe_level_set_gradient{mesh_data_}; }; class CleanInterface : public BaseMeshDynamics diff --git a/src/shared/meshes/mesh_dynamics.h b/src/shared/meshes/mesh_dynamics.h index f32f54261c..596facd55b 100644 --- a/src/shared/meshes/mesh_dynamics.h +++ b/src/shared/meshes/mesh_dynamics.h @@ -52,12 +52,16 @@ class BaseMeshDynamics public: BaseMeshDynamics(MeshWithGridDataPackages<4> &mesh_data) : mesh_data_(mesh_data), - all_cells_(mesh_data.AllCells()){}; + all_cells_(mesh_data.AllCells()), + num_grid_pkgs_(mesh_data.num_grid_pkgs_), + meta_data_cell_(mesh_data.meta_data_cell_){}; virtual ~BaseMeshDynamics(){}; protected: MeshWithGridDataPackages<4> &mesh_data_; Arrayi all_cells_; + size_t &num_grid_pkgs_; + std::pair* &meta_data_cell_; template void grid_parallel_for(const FunctionOnData &function) @@ -68,6 +72,21 @@ class BaseMeshDynamics function(cell_index); }); } + + /** Iterator on a collection of mesh data packages. parallel computing. */ + template + void package_parallel_for(const FunctionOnData &function) + { + parallel_for(IndexRange(2, num_grid_pkgs_), + [&](const IndexRange &r) + { + for (size_t i = r.begin(); i != r.end(); ++i) + { + function(i); + } + }, + ap); + } }; /** @@ -111,7 +130,7 @@ class MeshInnerDynamics : public LocalDynamicsType, public BaseMeshDynamics void exec() { - mesh_data_.package_parallel_for( + package_parallel_for( [&](size_t package_index) { this->update(package_index); @@ -136,10 +155,10 @@ class MeshCoreDynamics : public LocalDynamicsType, public BaseMeshDynamics void exec() { - mesh_data_.package_parallel_for( + package_parallel_for( [&](size_t package_index) { - std::pair &metadata = mesh_data_.meta_data_cell_[package_index]; + std::pair &metadata = meta_data_cell_[package_index]; if (metadata.second == 1) { this->update(package_index); @@ -148,43 +167,5 @@ class MeshCoreDynamics : public LocalDynamicsType, public BaseMeshDynamics ); }; }; - -/** - * @class MeshSingleDynamics - * @brief Mesh dynamics for only core cells on the mesh - */ -template -class MeshSingleDynamics : public LocalDynamicsType, public BaseMeshDynamics -{ - public: - template - MeshSingleDynamics(DynamicsIdentifier &identifier, Args &&...args) - : LocalDynamicsType(identifier, std::forward(args)...), - BaseMeshDynamics(identifier){}; - virtual ~MeshSingleDynamics(){}; - - template - void exec(Args &&...args) - { - this->update(std::forward(args)...); - }; -}; - -template -class MeshCalculateDynamics : public LocalDynamicsType, public BaseMeshDynamics -{ - public: - template - MeshCalculateDynamics(DynamicsIdentifier &identifier, Args &&...args) - : LocalDynamicsType(identifier, std::forward(args)...), - BaseMeshDynamics(identifier){}; - virtual ~MeshCalculateDynamics(){}; - - template - ReturnType exec(Args &&...args) - { - return this->update(std::forward(args)...); - }; -}; } // namespace SPH #endif // MESH_DYNAMICS_H \ No newline at end of file diff --git a/src/shared/meshes/mesh_with_data_packages.h b/src/shared/meshes/mesh_with_data_packages.h index 04ddf25684..00e5ce98cc 100644 --- a/src/shared/meshes/mesh_with_data_packages.h +++ b/src/shared/meshes/mesh_with_data_packages.h @@ -96,8 +96,8 @@ class MeshWithGridDataPackages : public Mesh template explicit MeshWithGridDataPackages(BoundingBox tentative_bounds, Real data_spacing, size_t buffer_size) : Mesh(tentative_bounds, pkg_size * data_spacing, buffer_size), - data_spacing_(data_spacing), - global_mesh_(mesh_lower_bound_ + 0.5 * data_spacing * Vecd::Ones(), data_spacing, all_cells_ * pkg_size) + global_mesh_(mesh_lower_bound_ + 0.5 * data_spacing * Vecd::Ones(), data_spacing, all_cells_ * pkg_size), + data_spacing_(data_spacing) { allocateIndexDataMatrix(); }; @@ -117,12 +117,12 @@ class MeshWithGridDataPackages : public Mesh CellNeighborhood *cell_neighborhood_; /**< 3*3(*3) array to store indicies of neighborhood cells. */ std::pair *meta_data_cell_; /**< metadata for each occupied cell: (arrayi)cell index, (int)core1/inner0. */ BaseMesh global_mesh_; /**< the mesh for the locations of all possible data points. */ + size_t num_grid_pkgs_ = 2; /**< the number of all distinct packages, initially only 2 singular packages. */ protected: MeshVariableAssemble all_mesh_variables_; /**< all mesh variables on this mesh. */ static constexpr int pkg_size = PKG_SIZE; /**< the size of the data package matrix*/ const Real data_spacing_; /**< spacing of data in the data packages*/ - size_t num_grid_pkgs_ = 2; /**< the number of all distinct packages, initially only 2 singular packages. */ using MetaData = std::pair; /**< stores the metadata for each cell: (int)singular0/inner1/core2, (size_t)package data index*/ MeshDataMatrix index_data_mesh_; /**< metadata for all cells. */ using NeighbourIndex = std::pair; /**< stores shifted neighbour info: (size_t)package index, (arrayi)local grid index. */ @@ -218,21 +218,6 @@ class MeshWithGridDataPackages : public Mesh void computeGradient(MeshVariable &in_variable, MeshVariable &out_variable, const size_t package_index); - /** Iterator on a collection of mesh data packages. parallel computing. */ - template - void package_parallel_for(const FunctionOnData &function) - { - parallel_for( - IndexRange(2, num_grid_pkgs_), - [&](const IndexRange &r) - { - for (size_t i = r.begin(); i != r.end(); ++i) - { - function(i); - } - }, - ap); - } void registerOccupied(std::pair &occupied) { From 7e6e0ffb3192ea9691f3673f345a6e25393fd56b Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Mon, 30 Sep 2024 08:19:04 +0200 Subject: [PATCH 54/55] improve code repeating --- src/shared/common/sph_data_containers.h | 1 - src/shared/geometries/level_set.cpp | 130 ++++++++------------ src/shared/geometries/level_set.h | 18 +-- src/shared/meshes/all_mesh_dynamics.h | 14 +++ src/shared/meshes/mesh_with_data_packages.h | 40 +----- 5 files changed, 81 insertions(+), 122 deletions(-) diff --git a/src/shared/common/sph_data_containers.h b/src/shared/common/sph_data_containers.h index d597b3a324..9b2e2ac859 100644 --- a/src/shared/common/sph_data_containers.h +++ b/src/shared/common/sph_data_containers.h @@ -76,7 +76,6 @@ typedef DataContainerAddressAssemble SingleVariables; /** Generalized mesh data type */ // template -// using MeshVariable = DiscreteVariable; typedef DataContainerAddressAssemble MeshVariableAssemble; } // namespace SPH diff --git a/src/shared/geometries/level_set.cpp b/src/shared/geometries/level_set.cpp index bc056d9e4b..1841938289 100644 --- a/src/shared/geometries/level_set.cpp +++ b/src/shared/geometries/level_set.cpp @@ -11,101 +11,77 @@ MultilevelLevelSet::MultilevelLevelSet( Shape &shape, SPHAdaptation &sph_adaptation) : BaseMeshField("LevelSet_" + shape.getName()), kernel_(*sph_adaptation.getKernel()), shape_(shape), total_levels_(total_levels) { - mesh_data_set_.push_back( - mesh_data_ptr_vector_keeper_ - .template createPtr(tentative_bounds, reference_data_spacing, 4)); - - mesh_data_set_[0]->registerMeshVariable("Levelset"); - mesh_data_set_[0]->registerMeshVariable("NearInterfaceID"); - mesh_data_set_[0]->registerMeshVariable("LevelsetGradient"); - mesh_data_set_[0]->registerMeshVariable("KernelWeight"); - mesh_data_set_[0]->registerMeshVariable("KernelGradient"); - Real global_h_ratio = sph_adaptation.ReferenceSpacing() / reference_data_spacing; global_h_ratio_vec_.push_back(global_h_ratio); - MeshAllDynamics initialize_data_in_a_cell{*mesh_data_set_[0], shape_}; - FinishDataPackages finish_data_packages{*mesh_data_set_[0], shape_, kernel_, global_h_ratio}; - initialize_data_in_a_cell.exec(); - finish_data_packages.exec(); - probe_signed_distance_set_.push_back( - probe_signed_distance_vector_keeper_ - .template createPtr(*mesh_data_set_[0])); - probe_normal_direction_set_.push_back( - probe_normal_direction_vector_keeper_ - .template createPtr(*mesh_data_set_[0])); - probe_level_set_gradient_set_.push_back( - probe_level_set_gradient_vector_keeper_ - .template createPtr(*mesh_data_set_[0])); - for (size_t level = 1; level != total_levels_; ++level) - { - reference_data_spacing *= 0.5; - global_h_ratio *= 2; + initializeLevel(0, reference_data_spacing, global_h_ratio, tentative_bounds); + + for (size_t level = 1; level < total_levels_; ++level) { + reference_data_spacing *= 0.5; // Halve the data spacing + global_h_ratio *= 2; // Double the ratio global_h_ratio_vec_.push_back(global_h_ratio); - /** all mesh levels aligned at the lower bound of tentative_bounds */ - mesh_data_set_.push_back( - mesh_data_ptr_vector_keeper_ - .template createPtr(tentative_bounds, reference_data_spacing, 4)); - mesh_data_set_[level]->registerMeshVariable("Levelset"); - mesh_data_set_[level]->registerMeshVariable("NearInterfaceID"); - mesh_data_set_[level]->registerMeshVariable("LevelsetGradient"); - mesh_data_set_[level]->registerMeshVariable("KernelWeight"); - mesh_data_set_[level]->registerMeshVariable("KernelGradient"); - MeshAllDynamics initialize_data_in_a_cell_from_coarse(*mesh_data_set_[level], *mesh_data_set_[level - 1], shape_); - FinishDataPackages finish_data_packages{*mesh_data_set_[level], shape_, kernel_, global_h_ratio}; - initialize_data_in_a_cell_from_coarse.exec(); - finish_data_packages.exec(); - probe_signed_distance_set_.push_back( - probe_signed_distance_vector_keeper_ - .template createPtr(*mesh_data_set_[level])); - probe_normal_direction_set_.push_back( - probe_normal_direction_vector_keeper_ - .template createPtr(*mesh_data_set_[level])); - probe_level_set_gradient_set_.push_back( - probe_level_set_gradient_vector_keeper_ - .template createPtr(*mesh_data_set_[level])); + initializeLevel(level, reference_data_spacing, global_h_ratio, tentative_bounds); } - clean_interface = new CleanInterface{*mesh_data_set_.back(), kernel_, global_h_ratio_vec_.back()}; - correct_topology = new CorrectTopology{*mesh_data_set_.back(), kernel_, global_h_ratio_vec_.back()}; + clean_interface = makeUnique(*mesh_data_set_.back(), kernel_, global_h_ratio_vec_.back()); + correct_topology = makeUnique(*mesh_data_set_.back(), kernel_, global_h_ratio_vec_.back()); } //=================================================================================================// MultilevelLevelSet::MultilevelLevelSet( BoundingBox tentative_bounds, MeshWithGridDataPackagesType* coarse_data, Shape &shape, SPHAdaptation &sph_adaptation) - : BaseMeshField("LevelSet_" + shape.getName()), kernel_(*sph_adaptation.getKernel()), shape_(shape) + : BaseMeshField("LevelSet_" + shape.getName()), kernel_(*sph_adaptation.getKernel()), shape_(shape), total_levels_(1) { - total_levels_ = 1; Real reference_data_spacing = coarse_data->DataSpacing() * 0.5; Real global_h_ratio = sph_adaptation.ReferenceSpacing() / reference_data_spacing; global_h_ratio_vec_.push_back(global_h_ratio); + initializeLevel(0, reference_data_spacing, global_h_ratio, tentative_bounds, coarse_data); + + clean_interface = makeUnique(*mesh_data_set_.back(), kernel_, global_h_ratio_vec_.back()); + correct_topology = makeUnique(*mesh_data_set_.back(), kernel_, global_h_ratio_vec_.back()); +} +//=================================================================================================// +void MultilevelLevelSet::initializeLevel(size_t level, Real reference_data_spacing, Real global_h_ratio, BoundingBox tentative_bounds, MeshWithGridDataPackagesType* coarse_data) +{ mesh_data_set_.push_back( mesh_data_ptr_vector_keeper_ .template createPtr(tentative_bounds, reference_data_spacing, 4)); - mesh_data_set_[0]->registerMeshVariable("Levelset"); - mesh_data_set_[0]->registerMeshVariable("NearInterfaceID"); - mesh_data_set_[0]->registerMeshVariable("LevelsetGradient"); - mesh_data_set_[0]->registerMeshVariable("KernelWeight"); - mesh_data_set_[0]->registerMeshVariable("KernelGradient"); - MeshAllDynamics initialize_data_in_a_cell_from_coarse(*mesh_data_set_[0], *coarse_data, shape_); - FinishDataPackages finish_data_packages{*mesh_data_set_[0], shape_, kernel_, global_h_ratio}; - initialize_data_in_a_cell_from_coarse.exec(); + RegisterMeshVariable register_mesh_variable; + register_mesh_variable.exec(mesh_data_set_[level]); + + if (coarse_data == nullptr) { + MeshAllDynamics initialize_data_in_a_cell(*mesh_data_set_[level], shape_); + initialize_data_in_a_cell.exec(); + } else { + MeshAllDynamics initialize_data_in_a_cell_from_coarse(*mesh_data_set_[level], *coarse_data, shape_); + initialize_data_in_a_cell_from_coarse.exec(); + } + + FinishDataPackages finish_data_packages(*mesh_data_set_[level], shape_, kernel_, global_h_ratio); finish_data_packages.exec(); + registerProbes(level); +} +//=================================================================================================// +void MultilevelLevelSet::registerProbes(size_t level) +{ probe_signed_distance_set_.push_back( - probe_signed_distance_vector_keeper_ - .template createPtr(*mesh_data_set_[0])); + probe_signed_distance_vector_keeper_ + .template createPtr(*mesh_data_set_[level])); probe_normal_direction_set_.push_back( probe_normal_direction_vector_keeper_ - .template createPtr(*mesh_data_set_[0])); + .template createPtr(*mesh_data_set_[level])); probe_level_set_gradient_set_.push_back( probe_level_set_gradient_vector_keeper_ - .template createPtr(*mesh_data_set_[0])); - - clean_interface = new CleanInterface{*mesh_data_set_.back(), kernel_, global_h_ratio_vec_.back()}; - correct_topology = new CorrectTopology{*mesh_data_set_.back(), kernel_, global_h_ratio_vec_.back()}; + .template createPtr(*mesh_data_set_[level])); + probe_kernel_integral_set_.push_back( + probe_kernel_integral_vector_keeper_ + .template createPtr(*mesh_data_set_[level])); + probe_kernel_gradient_integral_set_.push_back( + probe_kernel_gradient_integral_vector_keeper_ + .template createPtr(*mesh_data_set_[level])); } //=================================================================================================// size_t MultilevelLevelSet::getCoarseLevel(Real h_ratio) @@ -158,16 +134,13 @@ size_t MultilevelLevelSet::getProbeLevel(const Vecd &position) Real MultilevelLevelSet::probeKernelIntegral(const Vecd &position, Real h_ratio) { if(mesh_data_set_.size() == 1){ - ProbeKernelIntegral refine_probe{*mesh_data_set_[0]}; - return refine_probe.update(position); + return probe_kernel_integral_set_[0]->update(position); } size_t coarse_level = getCoarseLevel(h_ratio); Real alpha = (global_h_ratio_vec_[coarse_level + 1] - h_ratio) / (global_h_ratio_vec_[coarse_level + 1] - global_h_ratio_vec_[coarse_level]); - ProbeKernelIntegral coarse_probe{*mesh_data_set_[coarse_level]}; - ProbeKernelIntegral fine_probe{*mesh_data_set_[coarse_level + 1]}; - Real coarse_level_value = coarse_probe.update(position); - Real fine_level_value = fine_probe.update(position); + Real coarse_level_value = probe_kernel_integral_set_[coarse_level]->update(position); + Real fine_level_value = probe_kernel_integral_set_[coarse_level + 1]->update(position); return alpha * coarse_level_value + (1.0 - alpha) * fine_level_value; } @@ -175,16 +148,13 @@ Real MultilevelLevelSet::probeKernelIntegral(const Vecd &position, Real h_ratio) Vecd MultilevelLevelSet::probeKernelGradientIntegral(const Vecd &position, Real h_ratio) { if(mesh_data_set_.size() == 1){ - ProbeKernelGradientIntegral refine_probe{*mesh_data_set_[0]}; - return refine_probe.update(position); + return probe_kernel_gradient_integral_set_[0]->update(position); } size_t coarse_level = getCoarseLevel(h_ratio); Real alpha = (global_h_ratio_vec_[coarse_level + 1] - h_ratio) / (global_h_ratio_vec_[coarse_level + 1] - global_h_ratio_vec_[coarse_level]); - ProbeKernelGradientIntegral coarse_probe{*mesh_data_set_[coarse_level]}; - ProbeKernelGradientIntegral fine_probe{*mesh_data_set_[coarse_level + 1]}; - Vecd coarse_level_value = coarse_probe.update(position); - Vecd fine_level_value = fine_probe.update(position); + Vecd coarse_level_value = probe_kernel_gradient_integral_set_[coarse_level]->update(position); + Vecd fine_level_value = probe_kernel_gradient_integral_set_[coarse_level + 1]->update(position); return alpha * coarse_level_value + (1.0 - alpha) * fine_level_value; } diff --git a/src/shared/geometries/level_set.h b/src/shared/geometries/level_set.h index d596c295bd..6c68bb22cd 100644 --- a/src/shared/geometries/level_set.h +++ b/src/shared/geometries/level_set.h @@ -63,17 +63,17 @@ class MultilevelLevelSet : public BaseMeshField void writeMeshFieldToPlt(std::ofstream &output_file) override { - for (size_t l = 0; l != total_levels_; ++l) - { - WriteMeshFieldToPlt write_mesh_field_to_plt(*mesh_data_set_[l]); - write_mesh_field_to_plt.update(output_file); - } + for(size_t l = 0; l != total_levels_; ++l) + WriteMeshFieldToPlt(*mesh_data_set_[l]).update(output_file); } protected: inline size_t getProbeLevel(const Vecd &position); inline size_t getCoarseLevel(Real h_ratio); + void initializeLevel(size_t level, Real reference_data_spacing, Real global_h_ratio, BoundingBox tentative_bounds, MeshWithGridDataPackagesType* coarse_data = nullptr); + void registerProbes(size_t level); + Kernel &kernel_; Shape &shape_; /**< the geometry is described by the level set. */ size_t total_levels_; /**< level 0 is the coarsest */ @@ -82,13 +82,17 @@ class MultilevelLevelSet : public BaseMeshField StdVec probe_signed_distance_set_; StdVec probe_normal_direction_set_; StdVec probe_level_set_gradient_set_; + StdVec probe_kernel_integral_set_; + StdVec probe_kernel_gradient_integral_set_; UniquePtrsKeeper mesh_data_ptr_vector_keeper_; UniquePtrsKeeper probe_signed_distance_vector_keeper_; UniquePtrsKeeper probe_normal_direction_vector_keeper_; UniquePtrsKeeper probe_level_set_gradient_vector_keeper_; + UniquePtrsKeeper probe_kernel_integral_vector_keeper_; + UniquePtrsKeeper probe_kernel_gradient_integral_vector_keeper_; - CleanInterface *clean_interface; - CorrectTopology *correct_topology; + UniquePtr clean_interface; + UniquePtr correct_topology; }; } // namespace SPH #endif // LEVEL_SET_H diff --git a/src/shared/meshes/all_mesh_dynamics.h b/src/shared/meshes/all_mesh_dynamics.h index b94092c545..666f0aabc3 100644 --- a/src/shared/meshes/all_mesh_dynamics.h +++ b/src/shared/meshes/all_mesh_dynamics.h @@ -36,6 +36,20 @@ namespace SPH { +class RegisterMeshVariable +{ + public: + explicit RegisterMeshVariable(){}; + ~RegisterMeshVariable(){}; + + void exec(MeshWithGridDataPackagesType *mesh_data){ + mesh_data->registerMeshVariable("Levelset"); + mesh_data->registerMeshVariable("NearInterfaceID"); + mesh_data->registerMeshVariable("LevelsetGradient"); + mesh_data->registerMeshVariable("KernelWeight"); + mesh_data->registerMeshVariable("KernelGradient"); + } +}; class FinishDataPackages : public BaseMeshDynamics { public: diff --git a/src/shared/meshes/mesh_with_data_packages.h b/src/shared/meshes/mesh_with_data_packages.h index 00e5ce98cc..9221248d8c 100644 --- a/src/shared/meshes/mesh_with_data_packages.h +++ b/src/shared/meshes/mesh_with_data_packages.h @@ -43,32 +43,6 @@ using namespace std::placeholders; namespace SPH { -/** - * @class BaseDataPackage - * @brief Abstract base class for a data package, - * by which the data in a derived class can be on- or off-grid. - * The data package can be defined in a cell of a background mesh so the pkg_index is - * the cell location on the mesh. - */ -class BaseDataPackage -{ - public: - BaseDataPackage() : cell_index_on_mesh_(Arrayi::Zero()), state_indicator_(0){}; - virtual ~BaseDataPackage(){}; - void setInnerPackage() { state_indicator_ = 1; }; - bool isInnerPackage() { return state_indicator_ != 0; }; - void setCorePackage() { state_indicator_ = 2; }; - bool isCorePackage() { return state_indicator_ == 2; }; - void setCellIndexOnMesh(const Arrayi &cell_index) { cell_index_on_mesh_ = cell_index; } - Arrayi CellIndexOnMesh() const { return cell_index_on_mesh_; } - - protected: - Arrayi cell_index_on_mesh_; /**< index of this data package on the background mesh, zero if it is not on the mesh. */ - /** reserved value: 0 not occupying background mesh, 1 occupying. - * guide to use: larger for high priority of the data package. */ - int state_indicator_; -}; - /** * @class MeshWithGridDataPackages * @brief Abstract class for mesh with grid-based data packages. @@ -85,7 +59,6 @@ class BaseDataPackage * All these data packages are indexed by a concurrent vector inner_data_pkgs_. * Note that a data package should be not near the mesh bound, otherwise one will encounter the error "out of range". */ -// template template class MeshWithGridDataPackages : public Mesh { @@ -136,21 +109,20 @@ class MeshWithGridDataPackages : public Mesh void deleteIndexDataMatrix(); /**< delete memories for metadata of data packages. */ /** resize all mesh variable data field with `num_grid_pkgs_` size(initially only singular data) */ - template struct ResizeMeshVariableData { - void operator()(MeshVariableAssemble &all_mesh_variables_, + template + void operator()(DataContainerAddressKeeper> &all_mesh_variables_, const size_t num_grid_pkgs_) { - constexpr int type_index = DataTypeIndex::value; - for (size_t l = 0; l != std::get(all_mesh_variables_).size(); ++l) + for (size_t l = 0; l != all_mesh_variables_.size(); ++l) { - MeshVariable *variable = std::get(all_mesh_variables_)[l]; + MeshVariable *variable = all_mesh_variables_[l]; variable->allocateAllMeshVariableData(num_grid_pkgs_); } } }; - DataAssembleOperation resize_mesh_variable_data_; + OperationOnDataAssemble resize_mesh_variable_data_{all_mesh_variables_}; /** probe by applying bi and tri-linear interpolation within the package. */ template @@ -204,7 +176,7 @@ class MeshWithGridDataPackages : public Mesh void for_each_cell_data(const FunctionOnData &function); void resizeMeshVariableData() { - resize_mesh_variable_data_(all_mesh_variables_, num_grid_pkgs_); + resize_mesh_variable_data_(num_grid_pkgs_); } template From 3fe594f9fba7d2d413bf8b4be119e3ff4a993303 Mon Sep 17 00:00:00 2001 From: frances <117010072@link.cuhk.edu.cn> Date: Mon, 30 Sep 2024 08:40:22 +0200 Subject: [PATCH 55/55] update with master --- .github/workflows/ci.yml | 71 +- .gitignore | 2 + CMakeLists.txt | 24 + README.md | 50 +- .../opencascade/relax_dynamics_surface.cpp | 14 +- .../opencascade/relax_dynamics_surface.h | 9 +- .../structural_simulation_class.cpp | 43 +- .../structural_simulation_class.h | 7 +- src/CMakeLists.txt | 61 +- src/for_2D_build/common/data_type.h | 2 +- src/for_2D_build/io_system/io_vtk_fvm_2d.cpp | 6 +- src/for_2D_build/meshes/base_mesh_2d.cpp | 14 +- .../particle_generator_lattice_2d.cpp | 12 +- src/for_3D_build/common/data_type.h | 2 +- src/for_3D_build/io_system/io_vtk_fvm_3d.cpp | 8 +- src/for_3D_build/meshes/base_mesh_3d.cpp | 15 +- .../meshes/cell_linked_list_3d.cpp | 1 - .../slender_structure_dynamics.cpp | 161 +- .../slender_structure_dynamics.h | 78 +- .../particle_generator_lattice_3d.cpp | 12 +- .../particle_generator_network.h | 2 +- .../particles/linear_particles.cpp | 12 +- src/for_3D_build/particles/linear_particles.h | 6 +- src/shared/adaptations/adaptation.cpp | 14 +- src/shared/adaptations/adaptation.h | 24 +- src/shared/adaptations/adaptation.hpp | 18 + src/shared/bodies/base_body.cpp | 40 +- src/shared/bodies/base_body.h | 17 +- src/shared/bodies/base_body_part.h | 10 +- .../bodies/complex_bodies/tree_body.cpp | 2 +- .../complex_bodies/unstructured_mesh.cpp | 3 +- .../bodies/complex_bodies/unstructured_mesh.h | 3 +- src/shared/bodies/solid_body.cpp | 4 +- src/shared/bodies/solid_body.h | 4 +- .../body_relations/base_body_relation.cpp | 6 +- .../body_relations/base_body_relation.h | 17 +- .../body_relations/contact_body_relation.cpp | 1 - .../body_relations/contact_body_relation.h | 1 + .../body_relations/inner_body_relation.h | 9 +- src/shared/common/base_data_package.h | 5 +- src/shared/common/base_data_type.h | 169 +- src/shared/common/common_functors.h | 20 +- src/shared/common/geometric_primitive.h | 150 + src/shared/common/image_mhd.h | 2 +- src/shared/common/large_data_containers.h | 1 + src/shared/common/sphinxsys_constant.h | 90 + ...ta_containers.h => sphinxsys_containers.h} | 31 +- src/shared/common/sphinxsys_variable.h | 218 ++ src/shared/common/vector_functions.cpp | 4 +- src/shared/common/vector_functions.h | 5 + src/shared/geometries/base_geometry.h | 2 +- src/shared/include/sphinxsys.h | 4 +- src/shared/io_system/io_base.cpp | 41 +- src/shared/io_system/io_base.h | 69 +- src/shared/io_system/io_observation.h | 26 +- src/shared/io_system/io_plt.cpp | 70 +- src/shared/io_system/io_plt.h | 2 + src/shared/io_system/io_simbody.cpp | 10 +- src/shared/io_system/io_simbody.h | 4 +- src/shared/io_system/io_vtk.cpp | 8 +- src/shared/io_system/io_vtk.h | 8 +- src/shared/io_system/io_vtk.hpp | 119 + src/shared/io_system/io_vtk_fvm.cpp | 4 +- src/shared/io_system/io_vtk_fvm.h | 8 +- src/shared/materials/base_material.cpp | 20 +- src/shared/materials/base_material.h | 26 +- src/shared/materials/complex_solid.cpp | 14 +- src/shared/materials/complex_solid.h | 11 +- src/shared/materials/complex_solid.hpp | 4 +- src/shared/materials/diffusion_reaction.cpp | 10 +- src/shared/materials/diffusion_reaction.h | 12 +- src/shared/materials/elastic_solid.cpp | 52 +- src/shared/materials/elastic_solid.h | 16 +- src/shared/materials/general_continuum.cpp | 49 +- src/shared/materials/general_continuum.h | 30 +- src/shared/materials/inelastic_solid.cpp | 30 +- src/shared/materials/inelastic_solid.h | 6 +- .../materials/weakly_compressible_fluid.cpp | 3 + .../materials/weakly_compressible_fluid.h | 24 + src/shared/meshes/base_mesh.cpp | 65 +- src/shared/meshes/base_mesh.h | 140 +- src/shared/meshes/cell_linked_list.cpp | 102 +- src/shared/meshes/cell_linked_list.h | 84 +- src/shared/meshes/cell_linked_list.hpp | 145 +- src/shared/meshes/mesh_local_dynamics.h | 2 +- src/shared/meshes/mesh_with_data_packages.h | 6 +- .../active_muscle_dynamics.cpp | 6 +- .../active_muscle_dynamics.h | 6 +- .../particle_dynamics/all_particle_dynamics.h | 2 +- .../all_shared_physical_dynamics.h | 7 +- .../particle_dynamics/base_local_dynamics.h | 45 +- .../base_particle_dynamics.h | 92 +- .../all_configuration_dynamics.h | 36 + .../base_configuration_dynamics.h | 66 + .../particle_sorting.cpp | 63 + .../particle_sorting.h | 86 +- .../particle_sorting.hpp | 24 + .../all_continuum_dynamics.h | 1 + .../base_continuum_dynamics.h | 4 +- .../continuum_dynamics_variable.cpp | 57 + .../continuum_dynamics_variable.h | 99 + .../continuum_integration.cpp | 183 +- .../continuum_integration.h | 106 +- .../continuum_integration.hpp | 58 +- .../diffusion_optimization_common.h | 21 +- .../diffusion_optimization_common.hpp | 4 +- .../diffusion_splitting_base.h | 44 +- .../diffusion_splitting_base.hpp | 98 +- .../diffusion_splitting_parameter.h | 26 +- .../diffusion_splitting_parameter.hpp | 74 +- .../diffusion_splitting_state.h | 22 +- .../diffusion_splitting_state.hpp | 64 +- .../diffusion_dynamics.h | 68 +- .../diffusion_dynamics.hpp | 86 +- .../reaction_dynamics.h | 4 +- .../reaction_dynamics.hpp | 8 +- .../particle_dynamics_dissipation.h | 82 +- .../particle_dynamics_dissipation.hpp | 92 +- ...ics_algorithms.h => dynamics_algorithms.h} | 36 +- .../particle_dynamics/execution/execution.h | 106 + .../{ => execution}/execution_policy.h | 5 + .../external_force/external_force.cpp | 19 +- .../external_force/external_force.h | 66 +- .../fluid_dynamics/base_fluid_dynamics.h | 5 +- .../boundary_condition/fluid_boundary.cpp | 32 +- .../boundary_condition/fluid_boundary.h | 58 +- .../boundary_condition/near_wall_boundary.cpp | 10 +- .../boundary_condition/near_wall_boundary.h | 8 +- .../non_reflective_boundary.cpp | 30 +- .../non_reflective_boundary.h | 12 +- .../fluid_dynamics/density_summation.cpp | 6 +- .../fluid_dynamics/density_summation.h | 10 +- .../fluid_dynamics/density_summation.hpp | 10 +- ...ulerian_compressible_fluid_integration.cpp | 34 +- .../eulerian_compressible_fluid_integration.h | 14 +- .../eulerian_fluid_integration.h | 4 +- .../eulerian_fluid_integration.hpp | 22 +- .../fluid_dynamics/fluid_integration.cpp | 14 +- .../fluid_dynamics/fluid_integration.h | 22 +- .../fluid_dynamics/fluid_integration.hpp | 44 +- .../fluid_dynamics/fluid_time_step.cpp | 62 +- .../fluid_dynamics/fluid_time_step.h | 54 +- .../non_newtonian_dynamics.cpp | 25 +- .../non_newtonian_dynamics.h | 18 +- .../fluid_dynamics/shape_confinement.cpp | 31 +- .../fluid_dynamics/shape_confinement.h | 18 +- .../fluid_dynamics/surface_tension.cpp | 15 +- .../fluid_dynamics/surface_tension.h | 23 +- .../fluid_dynamics/surface_tension.hpp | 15 +- .../transport_velocity_correction.h | 10 +- .../transport_velocity_correction.hpp | 10 +- .../fluid_dynamics/velocity_gradient.cpp | 6 +- .../fluid_dynamics/velocity_gradient.h | 8 +- .../fluid_dynamics/velocity_gradient.hpp | 6 +- .../fluid_dynamics/viscous_dynamics.cpp | 6 +- .../fluid_dynamics/viscous_dynamics.h | 24 +- .../fluid_dynamics/viscous_dynamics.hpp | 30 +- .../general_dynamics/all_general_dynamics.h | 2 +- .../general_dynamics/base_general_dynamics.h | 10 +- .../eulerian_ghost_boundary.cpp | 45 +- .../eulerian_ghost_boundary.h | 27 +- .../boundary_condition/fvm_ghost_boundary.cpp | 22 +- .../boundary_condition/fvm_ghost_boundary.h | 30 +- .../domian_bouding/domain_bounding.h | 8 +- .../domian_bouding/ghost_bounding.cpp | 2 +- .../domian_bouding/ghost_bounding.h | 4 +- .../general_dynamics/force_prior.cpp | 33 - .../general_dynamics/force_prior.h | 26 +- .../general_dynamics/force_prior.hpp | 44 + .../general_dynamics/general_constraint.cpp | 3 +- .../general_dynamics/general_constraint.h | 29 +- .../general_dynamics/general_geometric.cpp | 36 +- .../general_dynamics/general_geometric.h | 16 +- .../general_dynamics/general_interpolation.h | 29 +- .../general_dynamics/general_reduce.cpp | 19 +- .../general_dynamics/general_reduce.h | 64 +- .../general_dynamics/kernel_correction.cpp | 14 +- .../general_dynamics/kernel_correction.h | 9 +- .../general_dynamics/kernel_correction.hpp | 4 +- .../general_dynamics/particle_smoothing.h | 6 +- .../general_dynamics/particle_smoothing.hpp | 10 +- .../smeared_surface_indication.cpp | 4 +- .../smeared_surface_indication.h | 4 +- .../surface_indication/surface_indication.cpp | 8 +- .../surface_indication/surface_indication.h | 10 +- .../surface_indication/surface_indication.hpp | 6 +- .../particle_dynamics/particle_functors.h | 29 +- .../particle_dynamics/particle_iterators.h | 124 +- .../relax_dynamics/base_relax_dynamics.cpp | 4 +- .../relax_dynamics/base_relax_dynamics.h | 5 +- .../relax_dynamics/relax_stepping.cpp | 19 +- .../relax_dynamics/relax_stepping.h | 27 +- .../relax_dynamics/relax_stepping.hpp | 8 +- .../relax_dynamics/relax_thick_shell.cpp | 29 +- .../relax_dynamics/relax_thick_shell.h | 23 +- .../solid_dynamics/all_solid_dynamics.h | 2 +- .../solid_dynamics/constraint_dynamics.cpp | 44 +- .../solid_dynamics/constraint_dynamics.h | 133 +- .../solid_dynamics/constraint_dynamics.hpp | 109 + .../contact_dynamics/contact_friction.cpp | 8 +- .../contact_dynamics/contact_friction.h | 29 +- .../contact_dynamics/contact_repulsion.cpp | 31 +- .../contact_dynamics/contact_repulsion.h | 37 +- .../repulsion_factor_summation.cpp | 6 +- .../repulsion_factor_summation.h | 6 +- .../solid_dynamics/elastic_dynamics.cpp | 68 +- .../solid_dynamics/elastic_dynamics.h | 47 +- .../fluid_structure_interaction.cpp | 29 +- .../fluid_structure_interaction.h | 30 +- .../fluid_structure_interaction.hpp | 22 +- .../solid_dynamics/general_solid_dynamics.cpp | 23 +- .../solid_dynamics/general_solid_dynamics.h | 9 +- .../solid_dynamics/inelastic_dynamics.cpp | 4 +- .../solid_dynamics/inelastic_dynamics.h | 2 +- .../solid_dynamics/loading_dynamics.cpp | 121 +- .../solid_dynamics/loading_dynamics.h | 54 +- .../solid_dynamics_variable.cpp | 46 +- .../solid_dynamics/solid_dynamics_variable.h | 42 +- .../thin_structure_dynamics.cpp | 166 +- .../solid_dynamics/thin_structure_dynamics.h | 111 +- .../base_particle_generator.h | 2 +- .../particle_neighborhood/neighborhood.cpp | 20 +- .../particle_neighborhood/neighborhood.h | 24 +- src/shared/particles/base_particles.cpp | 132 +- src/shared/particles/base_particles.h | 114 +- src/shared/particles/base_particles.hpp | 338 +- src/shared/particles/particle_sorting.cpp | 60 - src/shared/particles/surface_particles.cpp | 12 +- src/shared/particles/surface_particles.h | 8 +- .../regression_test/regression_test_base.h | 18 +- .../regression_test/regression_test_base.hpp | 21 +- .../shared_ck/body_relation/relation_ck.cpp | 65 + .../shared_ck/body_relation/relation_ck.h | 108 + .../shared_ck/body_relation/relation_ck.hpp | 17 + src/shared/shared_ck/include/sphinxsys_ck.h | 34 + src/shared/shared_ck/io_system/io_all_ck.h | 33 + .../shared_ck/io_system/io_observation_ck.h | 147 + .../shared_ck/neighborhood/neighborhood_ck.h | 84 + .../neighborhood/neighborhood_ck.hpp | 39 + .../all_shared_physical_dynamics_ck.h | 44 + .../particle_dynamics/complex_algorithms_ck.h | 73 + .../particle_sort_ck.cpp | 31 + .../configuration_dynamics/particle_sort_ck.h | 140 + .../particle_sort_ck.hpp | 114 + .../update_body_relation.h | 129 + .../update_body_relation.hpp | 198 ++ .../update_cell_linked_list.h | 89 + .../update_cell_linked_list.hpp | 99 + .../fluid_dynamics/acoustic_step_1st_half.h | 151 + .../fluid_dynamics/acoustic_step_1st_half.hpp | 180 ++ .../fluid_dynamics/acoustic_step_2nd_half.h | 130 + .../fluid_dynamics/acoustic_step_2nd_half.hpp | 128 + .../fluid_dynamics/density_regularization.h | 194 ++ .../fluid_dynamics/density_regularization.hpp | 119 + .../fluid_dynamics/fluid_time_step_ck.cpp | 64 + .../fluid_dynamics/fluid_time_step_ck.h | 199 ++ .../fluid_dynamics/fluid_time_step_ck.hpp | 39 + .../all_general_dynamics_ck.h | 35 + .../general_dynamics/force_prior_ck.h | 91 + .../general_dynamics/force_prior_ck.hpp | 63 + .../general_dynamics/general_reduce_ck.cpp | 21 + .../general_dynamics/general_reduce_ck.h | 120 + .../general_dynamics/general_reduce_ck.hpp | 35 + .../general_dynamics/geometric_dynamics.cpp | 25 + .../general_dynamics/geometric_dynamics.h | 62 + .../general_dynamics/geometric_dynamics.hpp | 27 + .../general_dynamics/interpolation_dynamics.h | 79 + .../interpolation_dynamics.hpp | 52 + .../interaction_algorithms_ck.cpp | 36 + .../interaction_algorithms_ck.h | 229 ++ .../interaction_algorithms_ck.hpp | 198 ++ .../particle_dynamics/interaction_ck.h | 115 + .../particle_dynamics/interaction_ck.hpp | 101 + .../particle_dynamics/simple_algorithms_ck.h | 99 + .../smoothing_kernel/kernel_wenland_c2_ck.h | 127 + src/shared/simbody_sphinxsys/xml_engine.h | 2 +- src/shared/sphinxsys_system/sph_system.cpp | 9 +- src/shared/sphinxsys_system/sph_system.h | 19 +- src/shared/sphinxsys_system/sph_system.hpp | 54 + src/shared/tools/tinyxml2.cpp | 2826 +++++++++-------- src/shared/tools/xml_parser.h | 2 +- src/shared/variables/base_variable.h | 126 - .../shared/common/sphinxsys_constant_sycl.hpp | 29 + .../shared/common/sphinxsys_variable_sycl.hpp | 96 + src/src_sycl/shared/include/sphinxsys_sycl.h | 39 + .../base_configuration_dynamics_sycl.h | 53 + .../particle_sort_sycl.cpp | 18 + .../particle_sort_sycl.h | 54 + .../particle_sort_sycl.hpp | 16 + .../shared/particle_dynamics/execution_sycl.h | 185 ++ .../particle_iterators_sycl.h | 96 + .../2d_examples/2d_examples_ck/CMakeLists.txt | 7 + .../test_2d_dambreak_ck/CMakeLists.txt | 25 + .../test_2d_dambreak_ck/dambreak_ck.cpp | 266 ++ .../FluidObserver_Pressure_Run_0_result.xml | 9 + .../FluidObserver_Pressure_Run_10_result.xml | 9 + .../FluidObserver_Pressure_Run_20_result.xml | 9 + .../FluidObserver_Pressure_dtwdistance.xml | 4 + .../FluidObserver_Pressure_runtimes.dat | 3 + ...ody_TotalMechanicalEnergy_Run_0_result.xml | 9 + ...dy_TotalMechanicalEnergy_Run_11_result.xml | 9 + ...ody_TotalMechanicalEnergy_Run_6_result.xml | 9 + ...ody_TotalMechanicalEnergy_dtwdistance.xml} | 2 +- ...terBody_TotalMechanicalEnergy_runtimes.dat | 3 + .../regression_test_tool.py | 44 + .../regression_test.cpp | 19 +- .../test_1d_shock_tube/shock_tube.cpp | 7 +- .../2d_FVM_double_mach_reflection.cpp | 7 +- .../2d_FVM_double_mach_reflection.h | 9 +- .../common_compressible_FVM_classes.cpp | 8 +- .../common_compressible_FVM_classes.h | 6 +- .../2d_FVM_flow_around_cylinder.cpp | 7 +- ...common_weakly_compressible_FVM_classes.cpp | 20 +- .../common_weakly_compressible_FVM_classes.h | 28 +- .../test_2d_T_shaped_pipe/T_shaped_pipe.cpp | 28 +- .../test_2d_airfoil/airfoil_2d.cpp | 4 +- .../test_2d_anisotropic_beam.cpp | 25 +- .../ball_shell_collision.cpp | 11 +- .../channel_flow_shell.cpp | 43 +- .../test_2d_collision/collision.cpp | 15 +- .../column_collapse.cpp | 24 +- .../GranularBody_TotalMechanicalEnergy.xml | 85 +- ...ody_TotalMechanicalEnergy_Run_0_result.xml | 4 +- ...dy_TotalMechanicalEnergy_Run_10_result.xml | 9 - ...dy_TotalMechanicalEnergy_Run_11_result.xml | 9 - ...dy_TotalMechanicalEnergy_Run_12_result.xml | 9 - ...ody_TotalMechanicalEnergy_Run_1_result.xml | 4 +- ...ody_TotalMechanicalEnergy_Run_2_result.xml | 4 +- ...ody_TotalMechanicalEnergy_Run_3_result.xml | 4 +- ...ody_TotalMechanicalEnergy_Run_4_result.xml | 4 +- ...ody_TotalMechanicalEnergy_Run_5_result.xml | 4 +- ...ody_TotalMechanicalEnergy_Run_6_result.xml | 4 +- ...ody_TotalMechanicalEnergy_Run_7_result.xml | 4 +- ...ody_TotalMechanicalEnergy_Run_8_result.xml | 9 - ...ody_TotalMechanicalEnergy_Run_9_result.xml | 9 - ...Body_TotalMechanicalEnergy_dtwdistance.xml | 2 +- ...larBody_TotalMechanicalEnergy_runtimes.dat | 2 +- .../2d_examples/test_2d_dambreak/Dambreak.cpp | 25 +- .../dambreak_python.cpp | 39 +- .../test_2d_depolarization/depolarization.cpp | 19 +- .../test_2d_diffusion/diffusion.cpp | 19 +- .../diffusion_NeumannBC.cpp | 9 +- .../diffusion_NeumannBC.h | 34 +- .../diffusion_RobinBC.cpp | 9 +- .../diffusion_RobinBC.h | 36 +- .../test_2d_elastic_gate/elastic_gate.cpp | 25 +- .../2d_eulerian_flow_around_cylinder_LG.cpp | 9 +- ...lerian_supersonic_flow_around_cylinder.cpp | 13 +- ...eulerian_supersonic_flow_around_cylinder.h | 32 +- .../FluidBlock_MaximumSpeed.xml | 31 + .../FluidBlock_MaximumSpeed_Run_0_result.xml | 9 + .../FluidBlock_MaximumSpeed_Run_1_result.xml | 9 + .../FluidBlock_MaximumSpeed_Run_2_result.xml | 9 + .../FluidBlock_MaximumSpeed_Run_3_result.xml | 9 + .../FluidBlock_MaximumSpeed_Run_4_result.xml | 9 + .../FluidBlock_MaximumSpeed_Run_5_result.xml | 9 + .../FluidBlock_MaximumSpeed_dtwdistance.xml | 4 + ...mSpeed_ensemble_averaged_mean_variance.xml | 63 - .../FluidBlock_MaximumSpeed_runtimes.dat | 4 +- .../regression_test_tool.py | 4 +- .../2d_eulerian_taylor_green_LG.cpp | 7 +- .../test_2d_filling_tank/filling_tank.cpp | 28 +- .../2d_flow_around_cylinder.cpp | 22 +- .../2d_flow_around_cylinder.h | 6 +- .../2d_flow_stream_around_fish.cpp | 28 +- .../2d_flow_stream_around_fish.h | 42 +- .../active_model.cpp | 6 +- .../active_model.h | 2 +- .../2d_free_stream_around_cylinder.cpp | 26 +- .../2d_free_stream_around_cylinder.h | 24 +- .../mr_free_stream_around_cylinder.cpp | 26 +- .../mr_free_stream_around_cylinder.h | 24 +- tests/2d_examples/test_2d_fsi2/fsi2.cpp | 24 +- tests/2d_examples/test_2d_fsi2/fsi2.h | 5 +- .../test_2d_heat_transfer/heat_transfer.cpp | 50 +- .../test_2d_hydrostatic_fluid_shell.cpp | 15 +- .../hydrostatic_fsi.cpp | 15 +- .../test_2d_impact_patch/impact_patch.cpp | 25 +- .../lid_driven_cavity.cpp | 13 +- .../nonlinear_wave_fsi.cpp | 41 +- .../nonlinear_wave_fsi.h | 8 +- .../oscillating_beam.cpp | 9 +- .../oscillating_beam_UL.cpp | 42 +- .../BeamBody_TotalKineticEnergy.xml | 103 + ...amBody_TotalKineticEnergy_Run_0_result.xml | 2 +- ...amBody_TotalKineticEnergy_Run_1_result.xml | 9 + ...amBody_TotalKineticEnergy_Run_2_result.xml | 9 + ...amBody_TotalKineticEnergy_Run_3_result.xml | 2 +- ...amBody_TotalKineticEnergy_Run_4_result.xml | 9 + ...amBody_TotalKineticEnergy_Run_5_result.xml | 2 +- ...eamBody_TotalKineticEnergy_dtwdistance.xml | 2 +- .../cauchy_oscillating_beam.cpp | 9 +- tests/2d_examples/test_2d_owsc/owsc.cpp | 28 +- tests/2d_examples/test_2d_owsc/owsc.h | 8 +- tests/2d_examples/test_2d_plate/2d_plate.cpp | 7 +- .../poiseuille_flow.cpp | 25 +- .../test_2d_rotation_patch/rotation_patch.cpp | 31 +- .../BeamObserver_Position_Run_0_result.xml | 2 +- .../BeamObserver_Position_Run_3_result.xml | 2 +- .../BeamObserver_Position_Run_5_result.xml | 2 +- .../test_2d_self_contact/self_contact.cpp | 11 +- tests/2d_examples/test_2d_shell/2d_shell.cpp | 30 +- .../shell_beam_collision.cpp | 9 +- tests/2d_examples/test_2d_sliding/sliding.cpp | 12 +- .../test_2d_sliding_solid_shell.cpp | 16 +- .../droplet_conservation.cpp | 15 +- .../test_2d_standing_wave/standing_wave.cpp | 25 +- .../static_confinement.cpp | 23 +- tests/2d_examples/test_2d_stfb/stfb.cpp | 24 +- tests/2d_examples/test_2d_stlw/stlw.cpp | 24 +- .../test_2d_stretching/stretching.cpp | 33 +- .../test_2d_taylor_green/taylor_green.cpp | 11 +- .../src/tethered_dead_fish_in_flow.cpp | 36 +- .../test_2d_three_ring_impact.cpp | 28 +- tests/2d_examples/test_2d_throat/throat.cpp | 23 +- .../two_phase_dambreak.cpp | 34 +- .../viscous_cream_drop.cpp | 11 +- .../test_2d_water_entry_exit.cpp | 74 +- .../windows_frame_diffusion_D4.cpp | 9 +- .../windows_frame_diffusion_D4.h | 38 +- .../windows_frame_diffusion_D7.cpp | 9 +- .../windows_frame_diffusion_D7.h | 38 +- tests/3d_examples/test_3d_arch/3d_arch.cpp | 12 +- .../beam_pulling_pressure_load.cpp | 26 +- ..._bending_circular_plate_parametric_cvt.cpp | 54 +- .../3d_examples/test_3d_dambreak/dambreak.cpp | 23 +- .../test_3d_dambreak_elastic_plate_shell.cpp | 48 +- .../test_3d_dynamic_plate.cpp | 28 +- .../3d_elasticSolid_shell_collision.cpp | 11 +- .../excitation-contraction.cpp | 72 +- .../excitation_contraction.cpp | 18 +- .../excitation_contraction.h | 55 +- .../heart_volume_change.cpp | 8 +- .../heart_volume_change.h | 21 +- ...common_weakly_compressible_FVM_classes.cpp | 16 +- .../common_weakly_compressible_FVM_classes.h | 26 +- .../test_3d_incompressible_channel_flow.cpp | 7 +- .../test_3d_incompressible_channel_flow.h | 10 +- .../src/muscle_activation.cpp | 18 +- .../muscle_soft_body_contact.cpp | 10 +- .../muscle_solid_contact.cpp | 10 +- .../nonlinear_wave_fsi.cpp | 28 +- .../nonlinear_wave_fsi.h | 8 +- .../CMakeLists.txt | 21 - .../oscillating_plate_UL.cpp | 268 -- ...teBody_TotalKineticEnergy_Run_0_result.xml | 9 - ...teBody_TotalKineticEnergy_Run_3_result.xml | 9 - ...teBody_TotalKineticEnergy_Run_5_result.xml | 9 - .../passive_cantilever.cpp | 10 +- .../passive_cantilever_neohookean.cpp | 29 +- .../pkj_lv_electrocontraction.cpp | 17 +- .../pkj_lv_electrocontraction.h | 55 +- .../poiseuille_flow_shell.cpp | 43 +- .../test_3d_repose_angle/repose_angle.cpp | 26 +- tests/3d_examples/test_3d_roof/3d_roof.cpp | 33 +- .../test_3d_roof_parametric_cvt.cpp | 81 +- .../test_3d_self_contact/3d_self_contact.cpp | 11 +- .../test_3d_shell_stability_half_sphere.cpp | 34 +- .../test_3d_slender_beam.cpp | 32 +- .../test_3d_sliding/test_3d_sliding.cpp | 35 +- tests/3d_examples/test_3d_stfb/stfb.cpp | 24 +- tests/3d_examples/test_3d_stlw/stlw.cpp | 25 +- .../test_3d_taylor_bar/taylor_bar.cpp | 10 +- .../test_3d_taylor_bar/taylor_bar.h | 22 +- .../test_3d_taylor_bar_UL/CMakeLists.txt | 26 + .../MyObserver_Position.xml | 63 + .../MyObserver_Position_Run_0_result.xml | 9 + .../MyObserver_Position_Run_1_result.xml | 9 + .../MyObserver_Position_Run_2_result.xml | 9 + .../MyObserver_Position_Run_3_result.xml | 9 + .../MyObserver_Position_Run_4_result.xml | 9 + .../MyObserver_Position_Run_5_result.xml | 9 + .../MyObserver_Position_dtwdistance.xml | 4 + .../MyObserver_Position_runtimes.dat} | 0 .../regression_test_tool.py | 38 + .../test_3d_taylor_bar_UL/taylor_bar_UL.cpp | 179 ++ .../test_3d_taylor_bar_UL/taylor_bar_UL.h | 132 + .../test_3d_thin_plate/test_3d_thin_plate.cpp | 32 +- .../MyObserver_Position_Run_0_result.xml | 2 +- .../MyObserver_Position_Run_3_result.xml | 2 +- .../MyObserver_Position_Run_5_result.xml | 2 +- .../MyObserver_Position_dtwdistance.xml | 2 +- .../MyObserver_Velocity_Run_0_result.xml | 2 +- .../MyObserver_Velocity_Run_3_result.xml | 2 +- .../MyObserver_Velocity_Run_5_result.xml | 2 +- .../MyObserver_Velocity_dtwdistance.xml | 2 +- .../twisting_column.cpp | 9 +- tests/CMakeLists.txt | 9 +- .../shared/particle_momentum_dissipation.h | 4 +- .../shared/particle_momentum_dissipation.hpp | 6 +- .../shared/porous_media_dynamics.cpp | 43 +- .../extra_src/shared/porous_media_dynamics.h | 41 +- .../pressure_boundary/bidirectional_buffer.h | 117 +- .../pressure_boundary/density_correciton.cpp | 2 +- .../pressure_boundary/density_correciton.h | 8 +- .../pressure_boundary/density_correciton.hpp | 6 +- .../pressure_boundary/kernel_summation.cpp | 5 +- .../pressure_boundary/kernel_summation.h | 6 +- .../pressure_boundary/kernel_summation.hpp | 3 +- .../pressure_boundary/pressure_boundary.h | 8 +- .../test_2d_T_pipe_VIPO_shell/CMakeLists.txt | 26 + .../T_pipe_VIPO_shell.cpp | 528 +++ .../VelocityObserver_Velocity.xml | 112 + ...VelocityObserver_Velocity_Run_0_result.xml | 9 + ...VelocityObserver_Velocity_Run_1_result.xml | 9 + ...VelocityObserver_Velocity_Run_2_result.xml | 9 + ...VelocityObserver_Velocity_Run_3_result.xml | 9 + ...VelocityObserver_Velocity_Run_4_result.xml | 9 + ...VelocityObserver_Velocity_Run_5_result.xml | 9 + .../VelocityObserver_Velocity_dtwdistance.xml | 4 + .../VelocityObserver_Velocity_runtimes.dat | 3 + .../regression_test_tool.py | 11 +- .../lid_driven_cavity.cpp | 28 +- .../test_2d_membrane/2d_membrane.cpp | 14 +- .../CMakeLists.txt | 2 +- .../mixed_poiseuille_flow.cpp | 67 +- .../test_2d_modified_T_flow/CMakeLists.txt | 2 +- .../modified_T_flow.cpp | 76 +- .../CMakeLists.txt | 2 +- .../pulsatile_poiseuille_flow.cpp | 48 +- .../passive_cantilever_LG.cpp | 19 +- ...ntileverObserver_Position_Run_0_result.xml | 2 +- ...ntileverObserver_Position_Run_1_result.xml | 9 - ...ntileverObserver_Position_Run_2_result.xml | 9 - ...ntileverObserver_Position_Run_3_result.xml | 2 +- ...ntileverObserver_Position_Run_4_result.xml | 9 - ...ntileverObserver_Position_Run_5_result.xml | 2 +- ...antileverObserver_Position_dtwdistance.xml | 2 +- .../regression_test_tool.py | 4 +- .../thin_plate_python.cpp | 72 +- ...mass_spring_damper_response_struct_sim.cpp | 7 +- .../VP_heat_flux_optimization.cpp | 59 +- .../VP_heat_flux_steady.cpp | 46 +- .../VP_same_sink_optimization.cpp | 59 +- .../VP_same_sink_steady.cpp | 46 +- tests/tests_sycl/2d_examples/CMakeLists.txt | 7 + .../test_2d_dambreak_sycl/CMakeLists.txt | 25 + .../test_2d_dambreak_sycl/dambreak_sycl.cpp | 264 ++ .../FluidObserver_Pressure_Run_0_result.xml | 9 + .../FluidObserver_Pressure_Run_10_result.xml | 9 + .../FluidObserver_Pressure_Run_20_result.xml | 9 + .../FluidObserver_Pressure_dtwdistance.xml | 4 + .../FluidObserver_Pressure_runtimes.dat | 3 + ...ody_TotalMechanicalEnergy_Run_0_result.xml | 9 + ...dy_TotalMechanicalEnergy_Run_11_result.xml | 9 + ...ody_TotalMechanicalEnergy_Run_6_result.xml | 9 + ...Body_TotalMechanicalEnergy_dtwdistance.xml | 4 + ...terBody_TotalMechanicalEnergy_runtimes.dat | 3 + .../regression_test_tool.py | 44 + tests/tests_sycl/CMakeLists.txt | 7 + tests/tests_sycl/unit_test_src/CMakeLists.txt | 7 + .../unit_test_src/shared/CMakeLists.txt | 7 + .../shared/particle_dynamics/CMakeLists.txt | 7 + .../configuration_dynamics/CMakeLists.txt | 7 + .../test_exclusive_scan_sycl/CMakeLists.txt | 14 + .../test_exclusive_scan.cpp | 38 + .../for_2D_build/meshes/CMakeLists.txt | 7 + .../test_2d_particle_for_split/CMakeLists.txt | 15 + .../test_particle_for_split.cpp | 64 + .../for_3D_build/meshes/CMakeLists.txt | 7 + .../test_3d_particle_for_split/CMakeLists.txt | 16 + .../test_particle_for_split.cpp | 62 + .../test_sph_data_containers.cpp | 2 +- .../configuration_dynamics/CMakeLists.txt | 7 + .../test_exclusive_scan/CMakeLists.txt | 15 + .../test_exclusive_scan.cpp | 30 + .../test_thin_structure_dynamics.cpp | 32 +- 567 files changed, 15428 insertions(+), 7083 deletions(-) create mode 100644 src/shared/adaptations/adaptation.hpp create mode 100644 src/shared/common/geometric_primitive.h create mode 100644 src/shared/common/sphinxsys_constant.h rename src/shared/common/{sph_data_containers.h => sphinxsys_containers.h} (75%) create mode 100644 src/shared/common/sphinxsys_variable.h create mode 100644 src/shared/io_system/io_vtk.hpp create mode 100644 src/shared/particle_dynamics/configuration_dynamics/all_configuration_dynamics.h create mode 100644 src/shared/particle_dynamics/configuration_dynamics/base_configuration_dynamics.h create mode 100644 src/shared/particle_dynamics/configuration_dynamics/particle_sorting.cpp rename src/shared/{particles => particle_dynamics/configuration_dynamics}/particle_sorting.h (82%) create mode 100644 src/shared/particle_dynamics/configuration_dynamics/particle_sorting.hpp create mode 100644 src/shared/particle_dynamics/continuum_dynamics/continuum_dynamics_variable.cpp create mode 100644 src/shared/particle_dynamics/continuum_dynamics/continuum_dynamics_variable.h rename src/shared/particle_dynamics/{particle_dynamics_algorithms.h => dynamics_algorithms.h} (93%) create mode 100644 src/shared/particle_dynamics/execution/execution.h rename src/shared/particle_dynamics/{ => execution}/execution_policy.h (96%) delete mode 100644 src/shared/particle_dynamics/general_dynamics/force_prior.cpp create mode 100644 src/shared/particle_dynamics/general_dynamics/force_prior.hpp create mode 100644 src/shared/particle_dynamics/solid_dynamics/constraint_dynamics.hpp delete mode 100644 src/shared/particles/particle_sorting.cpp create mode 100644 src/shared/shared_ck/body_relation/relation_ck.cpp create mode 100644 src/shared/shared_ck/body_relation/relation_ck.h create mode 100644 src/shared/shared_ck/body_relation/relation_ck.hpp create mode 100644 src/shared/shared_ck/include/sphinxsys_ck.h create mode 100644 src/shared/shared_ck/io_system/io_all_ck.h create mode 100644 src/shared/shared_ck/io_system/io_observation_ck.h create mode 100644 src/shared/shared_ck/neighborhood/neighborhood_ck.h create mode 100644 src/shared/shared_ck/neighborhood/neighborhood_ck.hpp create mode 100644 src/shared/shared_ck/particle_dynamics/all_shared_physical_dynamics_ck.h create mode 100644 src/shared/shared_ck/particle_dynamics/complex_algorithms_ck.h create mode 100644 src/shared/shared_ck/particle_dynamics/configuration_dynamics/particle_sort_ck.cpp create mode 100644 src/shared/shared_ck/particle_dynamics/configuration_dynamics/particle_sort_ck.h create mode 100644 src/shared/shared_ck/particle_dynamics/configuration_dynamics/particle_sort_ck.hpp create mode 100644 src/shared/shared_ck/particle_dynamics/configuration_dynamics/update_body_relation.h create mode 100644 src/shared/shared_ck/particle_dynamics/configuration_dynamics/update_body_relation.hpp create mode 100644 src/shared/shared_ck/particle_dynamics/configuration_dynamics/update_cell_linked_list.h create mode 100644 src/shared/shared_ck/particle_dynamics/configuration_dynamics/update_cell_linked_list.hpp create mode 100644 src/shared/shared_ck/particle_dynamics/fluid_dynamics/acoustic_step_1st_half.h create mode 100644 src/shared/shared_ck/particle_dynamics/fluid_dynamics/acoustic_step_1st_half.hpp create mode 100644 src/shared/shared_ck/particle_dynamics/fluid_dynamics/acoustic_step_2nd_half.h create mode 100644 src/shared/shared_ck/particle_dynamics/fluid_dynamics/acoustic_step_2nd_half.hpp create mode 100644 src/shared/shared_ck/particle_dynamics/fluid_dynamics/density_regularization.h create mode 100644 src/shared/shared_ck/particle_dynamics/fluid_dynamics/density_regularization.hpp create mode 100644 src/shared/shared_ck/particle_dynamics/fluid_dynamics/fluid_time_step_ck.cpp create mode 100644 src/shared/shared_ck/particle_dynamics/fluid_dynamics/fluid_time_step_ck.h create mode 100644 src/shared/shared_ck/particle_dynamics/fluid_dynamics/fluid_time_step_ck.hpp create mode 100644 src/shared/shared_ck/particle_dynamics/general_dynamics/all_general_dynamics_ck.h create mode 100644 src/shared/shared_ck/particle_dynamics/general_dynamics/force_prior_ck.h create mode 100644 src/shared/shared_ck/particle_dynamics/general_dynamics/force_prior_ck.hpp create mode 100644 src/shared/shared_ck/particle_dynamics/general_dynamics/general_reduce_ck.cpp create mode 100644 src/shared/shared_ck/particle_dynamics/general_dynamics/general_reduce_ck.h create mode 100644 src/shared/shared_ck/particle_dynamics/general_dynamics/general_reduce_ck.hpp create mode 100644 src/shared/shared_ck/particle_dynamics/general_dynamics/geometric_dynamics.cpp create mode 100644 src/shared/shared_ck/particle_dynamics/general_dynamics/geometric_dynamics.h create mode 100644 src/shared/shared_ck/particle_dynamics/general_dynamics/geometric_dynamics.hpp create mode 100644 src/shared/shared_ck/particle_dynamics/general_dynamics/interpolation_dynamics.h create mode 100644 src/shared/shared_ck/particle_dynamics/general_dynamics/interpolation_dynamics.hpp create mode 100644 src/shared/shared_ck/particle_dynamics/interaction_algorithms_ck.cpp create mode 100644 src/shared/shared_ck/particle_dynamics/interaction_algorithms_ck.h create mode 100644 src/shared/shared_ck/particle_dynamics/interaction_algorithms_ck.hpp create mode 100644 src/shared/shared_ck/particle_dynamics/interaction_ck.h create mode 100644 src/shared/shared_ck/particle_dynamics/interaction_ck.hpp create mode 100644 src/shared/shared_ck/particle_dynamics/simple_algorithms_ck.h create mode 100644 src/shared/shared_ck/smoothing_kernel/kernel_wenland_c2_ck.h create mode 100644 src/shared/sphinxsys_system/sph_system.hpp delete mode 100644 src/shared/variables/base_variable.h create mode 100644 src/src_sycl/shared/common/sphinxsys_constant_sycl.hpp create mode 100644 src/src_sycl/shared/common/sphinxsys_variable_sycl.hpp create mode 100644 src/src_sycl/shared/include/sphinxsys_sycl.h create mode 100644 src/src_sycl/shared/particle_dynamics/configuration_dynamics/base_configuration_dynamics_sycl.h create mode 100644 src/src_sycl/shared/particle_dynamics/configuration_dynamics/particle_sort_sycl.cpp create mode 100644 src/src_sycl/shared/particle_dynamics/configuration_dynamics/particle_sort_sycl.h create mode 100644 src/src_sycl/shared/particle_dynamics/configuration_dynamics/particle_sort_sycl.hpp create mode 100644 src/src_sycl/shared/particle_dynamics/execution_sycl.h create mode 100644 src/src_sycl/shared/particle_dynamics/particle_iterators_sycl.h create mode 100644 tests/2d_examples/2d_examples_ck/CMakeLists.txt create mode 100644 tests/2d_examples/2d_examples_ck/test_2d_dambreak_ck/CMakeLists.txt create mode 100644 tests/2d_examples/2d_examples_ck/test_2d_dambreak_ck/dambreak_ck.cpp create mode 100644 tests/2d_examples/2d_examples_ck/test_2d_dambreak_ck/regression_test_tool/FluidObserver_Pressure_Run_0_result.xml create mode 100644 tests/2d_examples/2d_examples_ck/test_2d_dambreak_ck/regression_test_tool/FluidObserver_Pressure_Run_10_result.xml create mode 100644 tests/2d_examples/2d_examples_ck/test_2d_dambreak_ck/regression_test_tool/FluidObserver_Pressure_Run_20_result.xml create mode 100644 tests/2d_examples/2d_examples_ck/test_2d_dambreak_ck/regression_test_tool/FluidObserver_Pressure_dtwdistance.xml create mode 100644 tests/2d_examples/2d_examples_ck/test_2d_dambreak_ck/regression_test_tool/FluidObserver_Pressure_runtimes.dat create mode 100644 tests/2d_examples/2d_examples_ck/test_2d_dambreak_ck/regression_test_tool/WaterBody_TotalMechanicalEnergy_Run_0_result.xml create mode 100644 tests/2d_examples/2d_examples_ck/test_2d_dambreak_ck/regression_test_tool/WaterBody_TotalMechanicalEnergy_Run_11_result.xml create mode 100644 tests/2d_examples/2d_examples_ck/test_2d_dambreak_ck/regression_test_tool/WaterBody_TotalMechanicalEnergy_Run_6_result.xml rename tests/{3d_examples/test_3d_oscillating_plate_UL/regression_test_tool/PlateBody_TotalKineticEnergy_dtwdistance.xml => 2d_examples/2d_examples_ck/test_2d_dambreak_ck/regression_test_tool/WaterBody_TotalMechanicalEnergy_dtwdistance.xml} (58%) create mode 100644 tests/2d_examples/2d_examples_ck/test_2d_dambreak_ck/regression_test_tool/WaterBody_TotalMechanicalEnergy_runtimes.dat create mode 100644 tests/2d_examples/2d_examples_ck/test_2d_dambreak_ck/regression_test_tool/regression_test_tool.py delete mode 100644 tests/2d_examples/test_2d_column_collapse/regression_test_tool/GranularBody_TotalMechanicalEnergy_Run_10_result.xml delete mode 100644 tests/2d_examples/test_2d_column_collapse/regression_test_tool/GranularBody_TotalMechanicalEnergy_Run_11_result.xml delete mode 100644 tests/2d_examples/test_2d_column_collapse/regression_test_tool/GranularBody_TotalMechanicalEnergy_Run_12_result.xml delete mode 100644 tests/2d_examples/test_2d_column_collapse/regression_test_tool/GranularBody_TotalMechanicalEnergy_Run_8_result.xml delete mode 100644 tests/2d_examples/test_2d_column_collapse/regression_test_tool/GranularBody_TotalMechanicalEnergy_Run_9_result.xml create mode 100644 tests/2d_examples/test_2d_eulerian_supersonic_flow_new_BC/regression_test_tool/FluidBlock_MaximumSpeed.xml create mode 100644 tests/2d_examples/test_2d_eulerian_supersonic_flow_new_BC/regression_test_tool/FluidBlock_MaximumSpeed_Run_0_result.xml create mode 100644 tests/2d_examples/test_2d_eulerian_supersonic_flow_new_BC/regression_test_tool/FluidBlock_MaximumSpeed_Run_1_result.xml create mode 100644 tests/2d_examples/test_2d_eulerian_supersonic_flow_new_BC/regression_test_tool/FluidBlock_MaximumSpeed_Run_2_result.xml create mode 100644 tests/2d_examples/test_2d_eulerian_supersonic_flow_new_BC/regression_test_tool/FluidBlock_MaximumSpeed_Run_3_result.xml create mode 100644 tests/2d_examples/test_2d_eulerian_supersonic_flow_new_BC/regression_test_tool/FluidBlock_MaximumSpeed_Run_4_result.xml create mode 100644 tests/2d_examples/test_2d_eulerian_supersonic_flow_new_BC/regression_test_tool/FluidBlock_MaximumSpeed_Run_5_result.xml create mode 100644 tests/2d_examples/test_2d_eulerian_supersonic_flow_new_BC/regression_test_tool/FluidBlock_MaximumSpeed_dtwdistance.xml delete mode 100644 tests/2d_examples/test_2d_eulerian_supersonic_flow_new_BC/regression_test_tool/FluidBlock_MaximumSpeed_ensemble_averaged_mean_variance.xml create mode 100644 tests/2d_examples/test_2d_oscillating_beam_UL/regression_test_tool/BeamBody_TotalKineticEnergy.xml create mode 100644 tests/2d_examples/test_2d_oscillating_beam_UL/regression_test_tool/BeamBody_TotalKineticEnergy_Run_1_result.xml create mode 100644 tests/2d_examples/test_2d_oscillating_beam_UL/regression_test_tool/BeamBody_TotalKineticEnergy_Run_2_result.xml create mode 100644 tests/2d_examples/test_2d_oscillating_beam_UL/regression_test_tool/BeamBody_TotalKineticEnergy_Run_4_result.xml delete mode 100644 tests/3d_examples/test_3d_oscillating_plate_UL/CMakeLists.txt delete mode 100644 tests/3d_examples/test_3d_oscillating_plate_UL/oscillating_plate_UL.cpp delete mode 100644 tests/3d_examples/test_3d_oscillating_plate_UL/regression_test_tool/PlateBody_TotalKineticEnergy_Run_0_result.xml delete mode 100644 tests/3d_examples/test_3d_oscillating_plate_UL/regression_test_tool/PlateBody_TotalKineticEnergy_Run_3_result.xml delete mode 100644 tests/3d_examples/test_3d_oscillating_plate_UL/regression_test_tool/PlateBody_TotalKineticEnergy_Run_5_result.xml create mode 100644 tests/3d_examples/test_3d_taylor_bar_UL/CMakeLists.txt create mode 100644 tests/3d_examples/test_3d_taylor_bar_UL/regression_test_tool/MyObserver_Position.xml create mode 100644 tests/3d_examples/test_3d_taylor_bar_UL/regression_test_tool/MyObserver_Position_Run_0_result.xml create mode 100644 tests/3d_examples/test_3d_taylor_bar_UL/regression_test_tool/MyObserver_Position_Run_1_result.xml create mode 100644 tests/3d_examples/test_3d_taylor_bar_UL/regression_test_tool/MyObserver_Position_Run_2_result.xml create mode 100644 tests/3d_examples/test_3d_taylor_bar_UL/regression_test_tool/MyObserver_Position_Run_3_result.xml create mode 100644 tests/3d_examples/test_3d_taylor_bar_UL/regression_test_tool/MyObserver_Position_Run_4_result.xml create mode 100644 tests/3d_examples/test_3d_taylor_bar_UL/regression_test_tool/MyObserver_Position_Run_5_result.xml create mode 100644 tests/3d_examples/test_3d_taylor_bar_UL/regression_test_tool/MyObserver_Position_dtwdistance.xml rename tests/3d_examples/{test_3d_oscillating_plate_UL/regression_test_tool/PlateBody_TotalKineticEnergy_runtimes.dat => test_3d_taylor_bar_UL/regression_test_tool/MyObserver_Position_runtimes.dat} (100%) create mode 100644 tests/3d_examples/test_3d_taylor_bar_UL/regression_test_tool/regression_test_tool.py create mode 100644 tests/3d_examples/test_3d_taylor_bar_UL/taylor_bar_UL.cpp create mode 100644 tests/3d_examples/test_3d_taylor_bar_UL/taylor_bar_UL.h create mode 100644 tests/extra_source_and_tests/test_2d_T_pipe_VIPO_shell/CMakeLists.txt create mode 100644 tests/extra_source_and_tests/test_2d_T_pipe_VIPO_shell/T_pipe_VIPO_shell.cpp create mode 100644 tests/extra_source_and_tests/test_2d_T_pipe_VIPO_shell/regression_test_tool/VelocityObserver_Velocity.xml create mode 100644 tests/extra_source_and_tests/test_2d_T_pipe_VIPO_shell/regression_test_tool/VelocityObserver_Velocity_Run_0_result.xml create mode 100644 tests/extra_source_and_tests/test_2d_T_pipe_VIPO_shell/regression_test_tool/VelocityObserver_Velocity_Run_1_result.xml create mode 100644 tests/extra_source_and_tests/test_2d_T_pipe_VIPO_shell/regression_test_tool/VelocityObserver_Velocity_Run_2_result.xml create mode 100644 tests/extra_source_and_tests/test_2d_T_pipe_VIPO_shell/regression_test_tool/VelocityObserver_Velocity_Run_3_result.xml create mode 100644 tests/extra_source_and_tests/test_2d_T_pipe_VIPO_shell/regression_test_tool/VelocityObserver_Velocity_Run_4_result.xml create mode 100644 tests/extra_source_and_tests/test_2d_T_pipe_VIPO_shell/regression_test_tool/VelocityObserver_Velocity_Run_5_result.xml create mode 100644 tests/extra_source_and_tests/test_2d_T_pipe_VIPO_shell/regression_test_tool/VelocityObserver_Velocity_dtwdistance.xml create mode 100644 tests/extra_source_and_tests/test_2d_T_pipe_VIPO_shell/regression_test_tool/VelocityObserver_Velocity_runtimes.dat rename tests/{3d_examples/test_3d_oscillating_plate_UL => extra_source_and_tests/test_2d_T_pipe_VIPO_shell}/regression_test_tool/regression_test_tool.py (84%) delete mode 100644 tests/extra_source_and_tests/test_3d_passive_cantilever_LG/regression_test_tool/CantileverObserver_Position_Run_1_result.xml delete mode 100644 tests/extra_source_and_tests/test_3d_passive_cantilever_LG/regression_test_tool/CantileverObserver_Position_Run_2_result.xml delete mode 100644 tests/extra_source_and_tests/test_3d_passive_cantilever_LG/regression_test_tool/CantileverObserver_Position_Run_4_result.xml create mode 100644 tests/tests_sycl/2d_examples/CMakeLists.txt create mode 100644 tests/tests_sycl/2d_examples/test_2d_dambreak_sycl/CMakeLists.txt create mode 100644 tests/tests_sycl/2d_examples/test_2d_dambreak_sycl/dambreak_sycl.cpp create mode 100644 tests/tests_sycl/2d_examples/test_2d_dambreak_sycl/regression_test_tool/FluidObserver_Pressure_Run_0_result.xml create mode 100644 tests/tests_sycl/2d_examples/test_2d_dambreak_sycl/regression_test_tool/FluidObserver_Pressure_Run_10_result.xml create mode 100644 tests/tests_sycl/2d_examples/test_2d_dambreak_sycl/regression_test_tool/FluidObserver_Pressure_Run_20_result.xml create mode 100644 tests/tests_sycl/2d_examples/test_2d_dambreak_sycl/regression_test_tool/FluidObserver_Pressure_dtwdistance.xml create mode 100644 tests/tests_sycl/2d_examples/test_2d_dambreak_sycl/regression_test_tool/FluidObserver_Pressure_runtimes.dat create mode 100644 tests/tests_sycl/2d_examples/test_2d_dambreak_sycl/regression_test_tool/WaterBody_TotalMechanicalEnergy_Run_0_result.xml create mode 100644 tests/tests_sycl/2d_examples/test_2d_dambreak_sycl/regression_test_tool/WaterBody_TotalMechanicalEnergy_Run_11_result.xml create mode 100644 tests/tests_sycl/2d_examples/test_2d_dambreak_sycl/regression_test_tool/WaterBody_TotalMechanicalEnergy_Run_6_result.xml create mode 100644 tests/tests_sycl/2d_examples/test_2d_dambreak_sycl/regression_test_tool/WaterBody_TotalMechanicalEnergy_dtwdistance.xml create mode 100644 tests/tests_sycl/2d_examples/test_2d_dambreak_sycl/regression_test_tool/WaterBody_TotalMechanicalEnergy_runtimes.dat create mode 100644 tests/tests_sycl/2d_examples/test_2d_dambreak_sycl/regression_test_tool/regression_test_tool.py create mode 100644 tests/tests_sycl/CMakeLists.txt create mode 100644 tests/tests_sycl/unit_test_src/CMakeLists.txt create mode 100644 tests/tests_sycl/unit_test_src/shared/CMakeLists.txt create mode 100644 tests/tests_sycl/unit_test_src/shared/particle_dynamics/CMakeLists.txt create mode 100644 tests/tests_sycl/unit_test_src/shared/particle_dynamics/configuration_dynamics/CMakeLists.txt create mode 100644 tests/tests_sycl/unit_test_src/shared/particle_dynamics/configuration_dynamics/test_exclusive_scan_sycl/CMakeLists.txt create mode 100644 tests/tests_sycl/unit_test_src/shared/particle_dynamics/configuration_dynamics/test_exclusive_scan_sycl/test_exclusive_scan.cpp create mode 100644 tests/unit_tests_src/for_2D_build/meshes/CMakeLists.txt create mode 100644 tests/unit_tests_src/for_2D_build/meshes/test_2d_particle_for_split/CMakeLists.txt create mode 100644 tests/unit_tests_src/for_2D_build/meshes/test_2d_particle_for_split/test_particle_for_split.cpp create mode 100644 tests/unit_tests_src/for_3D_build/meshes/CMakeLists.txt create mode 100644 tests/unit_tests_src/for_3D_build/meshes/test_3d_particle_for_split/CMakeLists.txt create mode 100644 tests/unit_tests_src/for_3D_build/meshes/test_3d_particle_for_split/test_particle_for_split.cpp create mode 100644 tests/unit_tests_src/shared/particle_dynamics/configuration_dynamics/CMakeLists.txt create mode 100644 tests/unit_tests_src/shared/particle_dynamics/configuration_dynamics/test_exclusive_scan/CMakeLists.txt create mode 100644 tests/unit_tests_src/shared/particle_dynamics/configuration_dynamics/test_exclusive_scan/test_exclusive_scan.cpp diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fb2241acfd..77ea59320c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,7 +27,7 @@ env: # A workflow is made up of one or more jobs that can run sequentially or in parallel jobs: ############################################################################### - Linux-float: + Linux-sycl: if: ${{ github.event_name != 'workflow_dispatch' }} runs-on: ubuntu-22.04 env: @@ -51,6 +51,11 @@ jobs: libfontconfig1-dev `# From here required for vcpkg opencascade`\ libx11-dev \ libgl-dev + wget -O- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB | gpg --dearmor | sudo tee /usr/share/keyrings/oneapi-archive-keyring.gpg > /dev/null + echo "deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main" | sudo tee /etc/apt/sources.list.d/oneAPI.list + sudo apt update + sudo apt install intel-basekit \ + intel-oneapi-runtime-opencl - uses: hendrikmuhs/ccache-action@v1.2 with: @@ -59,7 +64,7 @@ jobs: - uses: friendlyanon/setup-vcpkg@v1 # Setup vcpkg into ${{github.workspace}} with: committish: ${{ env.VCPKG_VERSION }} - cache: false + cache-version: ${{env.VCPKG_VERSION}} - name: Install dependencies run: | @@ -73,24 +78,70 @@ jobs: boost-geometry \ simbody \ gtest \ - xsimd \ - pybind11 \ - opencascade + pybind11 - - name: Generate buildsystem using float (No test) + - name: Generate buildsystem run: | + # sycl environment has to be setup for each session + source /opt/intel/oneapi/setvars.sh --include-intel-llvm cmake -G Ninja \ -D CMAKE_BUILD_TYPE=Release \ + -D CMAKE_C_COMPILER=icx -D CMAKE_CXX_COMPILER=icpx \ -D CMAKE_TOOLCHAIN_FILE="${{github.workspace}}/vcpkg/scripts/buildsystems/vcpkg.cmake" \ -D CMAKE_C_COMPILER_LAUNCHER=ccache -D CMAKE_CXX_COMPILER_LAUNCHER=ccache \ - -D SPHINXSYS_USE_FLOAT=ON \ - -D SPHINXSYS_MODULE_OPENCASCADE=ON \ -D SPHINXSYS_CI=ON \ + -D SPHINXSYS_USE_SYCL=ON \ + -D TEST_STATE_RECORDING=OFF \ -S ${{github.workspace}} \ -B ${{github.workspace}}/build - - name: Build using float - run: cmake --build build --config Release --verbose + - name: Build libraries and tests which are using SYCL + run: | + # sycl environment has to be setup for each session + source /opt/intel/oneapi/setvars.sh --include-intel-llvm + cmake --build build --config Release --verbose + + - name: Test with the first try + id: first-try + run: | + source /opt/intel/oneapi/setvars.sh --include-intel-llvm + cd build/tests/tests_sycl + ctest --output-on-failure --timeout 1000 + continue-on-error: true + + - name: Test with the second try for failed cases + id: second-try + if: ${{ steps.first-try.outcome == 'failure' }} + run: | + source /opt/intel/oneapi/setvars.sh --include-intel-llvm + cd build/tests/tests_sycl + ctest --rerun-failed --output-on-failure --timeout 1000 + continue-on-error: true + + - name: Test with the third try for failed cases + id: third-try + if: ${{ steps.second-try.outcome == 'failure' }} + run: | + source /opt/intel/oneapi/setvars.sh --include-intel-llvm + cd build/tests/tests_sycl + ctest --rerun-failed --output-on-failure --timeout 1000 + continue-on-error: true + + - name: Test with the fourth try for failed cases + id: fourth-try + if: ${{ steps.third-try.outcome == 'failure' }} + run: | + source /opt/intel/oneapi/setvars.sh --include-intel-llvm + cd build/tests/tests_sycl + ctest --rerun-failed --output-on-failure --timeout 1000 + continue-on-error: true + + - name: Test with the last try for failed cases + if: ${{ steps.fourth-try.outcome == 'failure' }} + run: | + source /opt/intel/oneapi/setvars.sh --include-intel-llvm + cd build/tests/tests_sycl + ctest --rerun-failed --output-on-failure --timeout 1000 ############################################################################### Linux-build: diff --git a/.gitignore b/.gitignore index ecdad57838..ddf793482e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ ##### VS Code # VS Code setting up .vscode +*.json +CMakePresets.json ##### Windows # Windows thumbnail cache files diff --git a/CMakeLists.txt b/CMakeLists.txt index 8fd5328cbc..e6ab2ece88 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,6 +14,7 @@ option(SPHINXSYS_DEVELOPER_MODE "Developer mode has more flags active for code q option(SPHINXSYS_USE_FLOAT "Build using float (single-precision floating-point format) as primary type" OFF) option(SPHINXSYS_USE_SIMD "Build using SIMD instructions" OFF) option(SPHINXSYS_MODULE_OPENCASCADE "Build extension relying on OpenCASCADE" OFF) +option(SPHINXSYS_USE_SYCL "Build using SYCL acceleration or not" OFF) # ------ Global properties (Some cannot be set on INTERFACE targets) set(CMAKE_VERBOSE_MAKEFILE OFF CACHE BOOL "Enable verbose compilation commands for Makefile and Ninja" FORCE) # Extra fluff needed for Ninja: https://github.com/ninja-build/ninja/issues/900 @@ -49,6 +50,14 @@ elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") # target_compile_options(sphinxsys_core INTERFACE $<$:-Wpedantic>) # For strict C++ standard compliance # TODO: endif() +if(SPHINXSYS_USE_SYCL) + if(NOT SPHINXSYS_USE_FLOAT) + set(SPHINXSYS_USE_FLOAT ON) + message("-- Float is used as required by SPHinXsysSYCL.") + endif() +endif() + +target_compile_definitions(sphinxsys_core INTERFACE SPHINXSYS_USE_SYCL=$) target_compile_definitions(sphinxsys_core INTERFACE SPHINXSYS_USE_FLOAT=$) # ------ Dependencies @@ -98,6 +107,21 @@ if(TARGET Boost::program_options) target_link_libraries(sphinxsys_core INTERFACE Boost::program_options) endif() +if(SPHINXSYS_USE_SYCL) + set(SPHINXSYS_USE_SYCL ON) + if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "IntelLLVM") + message(FATAL_ERROR "-- SPHinXsysSYCL is only supported with IntelLLVM compiler.") + endif() + + if(NOT SPHINXSYS_SYCL_TARGETS) + set(SPHINXSYS_SYCL_TARGETS spir64_x86_64) + endif() + + message("-- Set SPHinXsysSYCL target as ${SPHINXSYS_SYCL_TARGETS}") + target_compile_options(sphinxsys_core INTERFACE -fsycl -fsycl-targets=${SPHINXSYS_SYCL_TARGETS} -Wno-unknown-cuda-version) + target_link_options(sphinxsys_core INTERFACE -fsycl -fsycl-targets=${SPHINXSYS_SYCL_TARGETS} -Wno-unknown-cuda-version) +endif() + # ------ Setup the concrete libraries add_subdirectory(src) add_subdirectory(modules) diff --git a/README.md b/README.md index 167e3d0875..29146f0496 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,12 @@ # ![SPHinXsys Logo](assets/logo.png) SPHinXsys -**Notice on repository transfer to SPHinXsys team** +## Notice on the transformation to heterogeneous computational platform -In order to promoting open-source democratization, -this repository will be transferred to the SPHinXsys team -in the next few weeks. -After the transfer, the decision-making process for SPHinXsys will be made by a number of project leaders from different institutions. +SPHinXsys is set to undergo a major transformation, moving from traditional CPU parallelism to a new era of heterogeneous parallelism, where compute-intensive tasks can harness the power of both CPUs and GPUs. This evolution will be driven by SYCL (via Intel's DPC++), enabling us to leverage heterogeneous architectures with standard C++. Importantly, this transformation will be achieved with minimal disruption to the existing codebase, ensuring seamless continuity for current users. + +The groundwork for this shift is already laid out. A 2D dambreak test case has been added to the `test/test_sycl` folder, showcasing the capabilities of our specially designed framework. What's unique about this framework is that it allows for the development and testing of numerical methods even in environments without GPUs or DPC++ installed. If these methods are crafted following our specified guidelines and prove functional, they will seamlessly operate in environments equipped with DPC++ and GPU support. + +By embracing this new paradigm, SPHinXsys is positioning itself at the forefront of multi-physics modeling, where performance meets versatility. **Project status** [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) @@ -19,7 +20,14 @@ After the transfer, the decision-making process for SPHinXsys will be made by a [![YouTube](https://img.shields.io/badge/YouTube-FF0000.svg?style=flat&logo=YouTube&logoColor=white)](https://www.youtube.com/channel/UCexdJbxOn9dvim6Jg1dnCFQ) [![Bilibili](https://img.shields.io/badge/bilibili-%E5%93%94%E5%93%A9%E5%93%94%E5%93%A9-critical)](https://space.bilibili.com/1761273682/video) -## Description +## Master and stable branches + +The most active development (or default) branch of this repository is `master`. +This branch gives the updated development of SPHinXsys using heterogeneous (using TBB and SYCL) parallelism. + +The most stable branch of the repository is `version1.0`, which is based on CPU (using TBB) parallelism. + +## Repository Description SPHinXsys (pronunciation: s'fink-sis) is an acronym from **S**moothed **P**article **H**ydrodynamics for **in**dustrial comple**X** **sys**tems. The multi-physics library uses SPH (smoothed particle hydrodynamics) as the underlying numerical method @@ -46,6 +54,8 @@ Here, we present several short examples in flow, solid dynamics, fluid structure + + ## Fully compatible to classical FVM method @@ -61,36 +71,28 @@ The only difference is that SPHinXsys reads a predefined mesh, other than genera ## Target-driven optimization -The unique target-driven optimization is able to achieve the optimization target and physical solution all-in-once, +The unique target-driven optimization is able to achieve the optimization target and physical solution all-in-once, which is able to accelerate optimization process greatly. -The following gives an example of optimizing the conductivity distribution +The following gives an example of optimizing the conductivity distribution for a thermal domain problem targeting minimum average temperature. Note that the physical solution of the thermal domain (right) and the optimal distribution of conductivity (left) -are obtained at the same time when optimization is finished. -Also note that the entire optimization process is very fast and +are obtained at the same time when optimization is finished. +Also note that the entire optimization process is very fast and only several times slower than that for a single physical solution with given conductivity distribution. ## Python interface -While SPHinXsys is written in C++, it provides a python interface for users to write python scripts to control the simulation, +While SPHinXsys is written in C++, it provides a python interface for users to write python scripts to control the simulation, including carry out regression tests for continuous integration (CI) and other tasks. One example is given below for the dambreak case. -Please check the source code of -[2D Dambreak case with python interface](https://github.com/Xiangyu-Hu/SPHinXsys/tree/master/tests/2d_examples/test_2d_dambreak_python) +Please check the source code of +[2D Dambreak case with python interface](https://github.com/Xiangyu-Hu/SPHinXsys/tree/master/tests/2d_examples/test_2d_dambreak_python) for the usage. -## Heterogenous computing - -Recently, we have a preview release for the heterogeneous computing version of SPHinXsys. -By using SYCL, a royalty-free open standard developed by the Khronos Group that allows developers -to program heterogeneous architectures in standard C++, SPHinXsys is able to utilize the power of GPU. -Please check the [Preview Release](https://github.com/Xiangyu-Hu/SPHinXsys/releases/tag/v1.0-beta.08-sycl) -and the [SYCL branch](https://github.com/Xiangyu-Hu/SPHinXsys/tree/sycl) for details. - ## Publications Main publication on the library: @@ -114,10 +116,10 @@ For a Docker image, check . ## Interaction with SPHinXsys and the team -Thank you for using and supporting our open-source project! +Thank you for using and supporting our open-source project! We value each feedback. -#### For SPHinXsys users: +#### For SPHinXsys users Your input is crucial to us. We encourage you to report any issues you encounter with the library, including: @@ -128,7 +130,7 @@ Your input is crucial to us. We encourage you to report any issues you encounter We particularly appreciate feedback stemming from practical simulations or projects, as these insights are essential for improving SPHinXsys. -#### For SPHinXsys developers: +#### For SPHinXsys developers If you don't have a GitHub account yet, please register for one. Fork the SPHinXsys repository to add new features or improve existing ones. Once your changes are ready, commit them and initiate a pull request to have your contributions merged into the main repository. diff --git a/modules/opencascade/opencascade/relax_dynamics_surface.cpp b/modules/opencascade/opencascade/relax_dynamics_surface.cpp index f3c3c15aa1..351e9f976c 100644 --- a/modules/opencascade/opencascade/relax_dynamics_surface.cpp +++ b/modules/opencascade/opencascade/relax_dynamics_surface.cpp @@ -11,8 +11,8 @@ namespace relax_dynamics { //=================================================================================================// ShapeSurfaceBounding2::ShapeSurfaceBounding2(RealBody &real_body_) - : LocalDynamics(real_body_), DataDelegateSimple(real_body_), - pos_(*particles_->getVariableDataByName("Position")) + : LocalDynamics(real_body_), + pos_(particles_->getVariableDataByName("Position")) { shape_ = &real_body_.getInitialShape(); } @@ -24,7 +24,7 @@ void ShapeSurfaceBounding2::update(size_t index_i, Real dt) //=================================================================================================// RelaxationStepInnerFirstHalf:: RelaxationStepInnerFirstHalf(BaseInnerRelation &inner_relation) - : BaseDynamics(inner_relation.getSPHBody()), real_body_(inner_relation.real_body_), + : BaseDynamics(), real_body_(inner_relation.real_body_), inner_relation_(inner_relation), relaxation_acceleration_inner_(inner_relation) {} //=================================================================================================// void RelaxationStepInnerFirstHalf::exec(Real dt) @@ -37,7 +37,7 @@ void RelaxationStepInnerFirstHalf::exec(Real dt) //=================================================================================================// RelaxationStepInnerSecondHalf:: RelaxationStepInnerSecondHalf(BaseInnerRelation &inner_relation) - : BaseDynamics(inner_relation.getSPHBody()), real_body_(inner_relation.real_body_), + : BaseDynamics(), real_body_(inner_relation.real_body_), get_time_step_square_(*real_body_), update_particle_position_(*real_body_), surface_bounding_(*real_body_) { @@ -52,10 +52,10 @@ void RelaxationStepInnerSecondHalf::exec(Real dt) //=================================================================================================// SurfaceNormalDirection::SurfaceNormalDirection(SPHBody &sph_body) - : DataDelegateSimple(sph_body), LocalDynamics(sph_body), + : LocalDynamics(sph_body), surface_shape_(DynamicCast(this, &sph_body.getInitialShape())), - pos_(*particles_->getVariableDataByName("Position")), - n_(*particles_->registerSharedVariable("NormalDirection")) {} + pos_(particles_->getVariableDataByName("Position")), + n_(particles_->registerStateVariable("NormalDirection")) {} //=================================================================================================// void SurfaceNormalDirection::update(size_t index_i, Real dt) diff --git a/modules/opencascade/opencascade/relax_dynamics_surface.h b/modules/opencascade/opencascade/relax_dynamics_surface.h index 8fc2e81ad7..4d19b5de3d 100644 --- a/modules/opencascade/opencascade/relax_dynamics_surface.h +++ b/modules/opencascade/opencascade/relax_dynamics_surface.h @@ -41,8 +41,7 @@ class SurfaceShape; namespace relax_dynamics { -class ShapeSurfaceBounding2 : public LocalDynamics, - public DataDelegateSimple +class ShapeSurfaceBounding2 : public LocalDynamics { public: ShapeSurfaceBounding2(RealBody &real_body_); @@ -50,7 +49,7 @@ class ShapeSurfaceBounding2 : public LocalDynamics, void update(size_t index_i, Real dt = 0.0); protected: - StdLargeVec &pos_; + Vecd *pos_; Shape *shape_; }; @@ -86,7 +85,7 @@ class RelaxationStepInnerSecondHalf : public BaseDynamics * @class SurfaceNormalDirection * @brief get the normal direction of surface particles. */ -class SurfaceNormalDirection : public DataDelegateSimple, public LocalDynamics +class SurfaceNormalDirection : public LocalDynamics { public: explicit SurfaceNormalDirection(SPHBody &sph_body); @@ -95,7 +94,7 @@ class SurfaceNormalDirection : public DataDelegateSimple, public LocalDynamics protected: SurfaceShape *surface_shape_; - StdLargeVec &pos_, &n_; + Vecd *pos_, *n_; }; } // namespace relax_dynamics diff --git a/modules/structural_simulation/structural_simulation_class.cpp b/modules/structural_simulation/structural_simulation_class.cpp index 7a59a36778..613c5fc27a 100755 --- a/modules/structural_simulation/structural_simulation_class.cpp +++ b/modules/structural_simulation/structural_simulation_class.cpp @@ -22,7 +22,7 @@ BodyPartFromMesh::BodyPartFromMesh(SPHBody &body, SharedPtr t SolidBodyFromMesh::SolidBodyFromMesh( SPHSystem &system, SharedPtr triangle_mesh_shape, Real resolution, - SharedPtr material_model, StdLargeVec &pos_0, StdLargeVec &volume) + SharedPtr material_model, Vecd *pos_0, Real *volume) : SolidBody(system, triangle_mesh_shape) { defineAdaptationRatios(1.15, system.resolution_ref_ / resolution); @@ -33,7 +33,7 @@ SolidBodyFromMesh::SolidBodyFromMesh( SolidBodyForSimulation::SolidBodyForSimulation( SPHSystem &system, SharedPtr triangle_mesh_shape, Real resolution, - Real physical_viscosity, SharedPtr material_model, StdLargeVec &pos_0, StdLargeVec &volume) + Real physical_viscosity, SharedPtr material_model, Vecd *pos_0, Real *volume) : solid_body_from_mesh_(system, triangle_mesh_shape, resolution, material_model, pos_0, volume), inner_body_relation_(solid_body_from_mesh_), initial_normal_direction_(SimpleDynamics(solid_body_from_mesh_)), @@ -103,7 +103,7 @@ void relaxParticlesSingleResolution(bool write_particle_relaxation_data, std::cout << "The physics relaxation process of the imported model finished !" << std::endl; } -std::tuple, StdLargeVec> generateAndRelaxParticlesFromMesh( +std::tuple generateAndRelaxParticlesFromMesh( SharedPtr triangle_mesh_shape, Real resolution, bool particle_relaxation, bool write_particle_relaxation_data) { BoundingBox bb = triangle_mesh_shape->getBounds(); @@ -120,7 +120,7 @@ std::tuple, StdLargeVec> generateAndRelaxParticlesFromMe relaxParticlesSingleResolution(write_particle_relaxation_data, model, inner_relation); } - return std::tuple, StdLargeVec>(model.getBaseParticles().ParticlePositions(), model.getBaseParticles().VolumetricMeasures()); + return std::tuple(model.getBaseParticles().ParticlePositions(), model.getBaseParticles().VolumetricMeasures()); } BodyPartByParticle *createBodyPartFromMesh(SPHBody &body, const StlList &stl_list, size_t body_index, SharedPtr tmesh) @@ -199,6 +199,7 @@ StructuralSimulation::StructuralSimulation(const StructuralSimulationInput &inpu system_(SPHSystem(BoundingBox(Vec3d::Zero(), Vec3d::Zero()), system_resolution_)), scale_system_boundaries_(input.scale_system_boundaries_), io_environment_(system_), + physical_time_(*system_.getSystemVariableDataByName("PhysicalTime")), // optional: boundary conditions non_zero_gravity_(input.non_zero_gravity_), @@ -325,12 +326,12 @@ void StructuralSimulation::initializeElasticSolidBodies() // we delete the .stl ending temp_name.erase(temp_name.size() - 4); // create the initial particles from the triangle mesh shape with particle relaxation option - std::tuple, StdLargeVec> particles = + std::tuple particles = generateAndRelaxParticlesFromMesh(body_mesh_list_[i], resolution_list_[i], particle_relaxation_list_[i], write_particle_relaxation_data_); // get the particles' initial position and their volume - StdLargeVec &pos_0 = std::get<0>(particles); - StdLargeVec &volume = std::get<1>(particles); + Vecd *pos_0 = std::get<0>(particles); + Real *volume = std::get<1>(particles); // create the SolidBodyForSimulation solid_body_list_.emplace_back(makeShared( @@ -405,7 +406,8 @@ void StructuralSimulation::initializeGravity() { SharedPtr gravity_ptr = makeShared(non_zero_gravity_[gravity_index_i].second); gravity_list_.emplace_back(non_zero_gravity_[gravity_index_i].second); - initialize_gravity_.emplace_back(makeShared>(*solid_body_list_[i]->getSolidBodyFromMesh(), gravity_list_.back())); + initialize_gravity_.emplace_back(makeShared>>( + *solid_body_list_[i]->getSolidBodyFromMesh(), gravity_list_.back())); gravity_index_i++; } } @@ -674,7 +676,7 @@ void StructuralSimulation::executeContactFactorSummation() int index = (i - number_of_general_contacts) / 2; Real start_time = time_dep_contacting_body_pairs_list_[index].second[0]; Real end_time = time_dep_contacting_body_pairs_list_[index].second[1]; - if (GlobalStaticVariables::physical_time_ >= start_time && GlobalStaticVariables::physical_time_ <= end_time) + if (physical_time_ >= start_time && physical_time_ <= end_time) { contact_density_list_[i]->exec(); } @@ -699,7 +701,7 @@ void StructuralSimulation::executeContactForce() int index = (i - number_of_general_contacts) / 2; Real start_time = time_dep_contacting_body_pairs_list_[index].second[0]; Real end_time = time_dep_contacting_body_pairs_list_[index].second[1]; - if (GlobalStaticVariables::physical_time_ >= start_time && GlobalStaticVariables::physical_time_ <= end_time) + if (physical_time_ >= start_time && physical_time_ <= end_time) { contact_force_list_[i]->exec(); } @@ -806,7 +808,7 @@ void StructuralSimulation::executeContactUpdateConfiguration() int index = (i - number_of_general_contacts) / 2; Real start_time = time_dep_contacting_body_pairs_list_[index].second[0]; Real end_time = time_dep_contacting_body_pairs_list_[index].second[1]; - if (GlobalStaticVariables::physical_time_ >= start_time && GlobalStaticVariables::physical_time_ <= end_time) + if (physical_time_ >= start_time && physical_time_ <= end_time) { contact_list_[i]->updateConfiguration(); } @@ -816,7 +818,7 @@ void StructuralSimulation::executeContactUpdateConfiguration() void StructuralSimulation::initializeSimulation() { - GlobalStaticVariables::physical_time_ = 0.0; + physical_time_ = 0.0; /** INITIALIZE SYSTEM */ system_.initializeSystemCellLinkedLists(); @@ -829,7 +831,7 @@ void StructuralSimulation::initializeSimulation() void StructuralSimulation::runSimulationStep(Real &dt, Real &integration_time) { if (iteration_ % 100 == 0) - std::cout << "N=" << iteration_ << " Time: " << GlobalStaticVariables::physical_time_ << " dt: " << dt << "\n"; + std::cout << "N=" << iteration_ << " Time: " << physical_time_ << " dt: " << dt << "\n"; /** UPDATE NORMAL DIRECTIONS */ executeUpdateElasticNormalDirection(); @@ -873,7 +875,7 @@ void StructuralSimulation::runSimulationStep(Real &dt, Real &integration_time) iteration_++; dt = system_.getSmallestTimeStepAmongSolidBodies(); integration_time += dt; - GlobalStaticVariables::physical_time_ += dt; + physical_time_ += dt; /** UPDATE BODIES CELL LINKED LISTS */ executeUpdateCellLinkedList(); @@ -893,7 +895,7 @@ void StructuralSimulation::runSimulation(Real end_time) TickCount t1 = TickCount::now(); TimeInterval interval; /** Main loop */ - while (GlobalStaticVariables::physical_time_ < end_time) + while (physical_time_ < end_time) { Real integration_time = 0.0; while (integration_time < output_period) @@ -916,7 +918,7 @@ void StructuralSimulation::runSimulation(Real end_time) double StructuralSimulation::runSimulationFixedDurationJS(int number_of_steps) { BodyStatesRecordingToVtp write_states(system_); - GlobalStaticVariables::physical_time_ = 0.0; + physical_time_ = 0.0; /** Statistics for computing time. */ write_states.writeToFile(0); @@ -947,10 +949,11 @@ double StructuralSimulation::runSimulationFixedDurationJS(int number_of_steps) Real StructuralSimulation::getMaxDisplacement(int body_index) { - StdLargeVec &pos = solid_body_list_[body_index].get()->getElasticSolidParticles()->ParticlePositions(); - StdLargeVec &pos0 = *solid_body_list_[body_index].get()->getElasticSolidParticles()->registerSharedVariableFrom("InitialPosition", "Position"); + BaseParticles *base_particles = solid_body_list_[body_index].get()->getElasticSolidParticles(); + Vecd *pos = base_particles->ParticlePositions(); + Vecd *pos0 = base_particles->registerStateVariableFrom("InitialPosition", "Position"); Real displ_max = 0; - for (size_t i = 0; i < pos0.size(); i++) + for (size_t i = 0; i < base_particles->TotalRealParticles(); i++) { Real displ = (pos[i] - pos0[i]).norm(); if (displ > displ_max) @@ -965,7 +968,7 @@ StructuralSimulationJS::StructuralSimulationJS(const StructuralSimulationInput & dt(0.0) { write_states_.writeToFile(0); - GlobalStaticVariables::physical_time_ = 0.0; + physical_time_ = 0.0; } void StructuralSimulationJS::runSimulationFixedDuration(int number_of_steps) diff --git a/modules/structural_simulation/structural_simulation_class.h b/modules/structural_simulation/structural_simulation_class.h index 7dea5734f2..4a3c15db25 100755 --- a/modules/structural_simulation/structural_simulation_class.h +++ b/modules/structural_simulation/structural_simulation_class.h @@ -80,7 +80,7 @@ class SolidBodyFromMesh : public SolidBody { public: SolidBodyFromMesh(SPHSystem &system, SharedPtr triangle_mesh_shape, Real resolution, - SharedPtr material_model, StdLargeVec &pos_0, StdLargeVec &volume); + SharedPtr material_model, Vec3d *pos_0, Real *volume); ~SolidBodyFromMesh(){}; }; @@ -100,7 +100,7 @@ class SolidBodyForSimulation // no particle reload --> direct generator SolidBodyForSimulation( SPHSystem &system, SharedPtr triangle_mesh_shape, Real resolution, - Real physical_viscosity, SharedPtr material_model, StdLargeVec &pos_0, StdLargeVec &volume); + Real physical_viscosity, SharedPtr material_model, Vec3d *pos_0, Real *volume); ~SolidBodyForSimulation(){}; SolidBodyFromMesh *getSolidBodyFromMesh() { return &solid_body_from_mesh_; }; @@ -200,6 +200,7 @@ class StructuralSimulation SPHSystem system_; Real scale_system_boundaries_; IOEnvironment io_environment_; + Real &physical_time_; StdVec> solid_body_list_; StdVec>> particle_normal_update_; @@ -210,7 +211,7 @@ class StructuralSimulation // for initializeATimeStep StdVec gravity_list_; - StdVec>> initialize_gravity_; + StdVec>>> initialize_gravity_; StdVec non_zero_gravity_; // for ExternalForceInBoundingBox StdVec>> force_bounding_box_; diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9911d830e3..6ac0a2f67f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,6 +1,11 @@ file(GLOB_RECURSE SPHINXSYS_SHARED_HEADERS CONFIGURE_DEPENDS shared/*.h shared/*.hpp) file(GLOB_RECURSE SPHINXSYS_SHARED_SOURCES CONFIGURE_DEPENDS shared/*.cpp) +if(SPHINXSYS_USE_SYCL) +file(GLOB_RECURSE SPHINXSYS_SYCL_HEADERS CONFIGURE_DEPENDS src_sycl/*.h src_sycl/*.hpp) +file(GLOB_RECURSE SPHINXSYS_SYCL_SOURCES CONFIGURE_DEPENDS src_sycl/*.cpp) +endif() + if(SPHINXSYS_2D) add_library(sphinxsys_2d) #Make sure in-tree projects can reference this as SPHinXsys::sphinxsys_2d @@ -8,25 +13,39 @@ if(SPHINXSYS_2D) add_library(SPHinXsys::sphinxsys_2d ALIAS sphinxsys_2d) file(GLOB_RECURSE SPHINXSYS_2D_HEADERS CONFIGURE_DEPENDS for_2D_build/*.h for_2D_build/*.hpp) - target_sources(sphinxsys_2d PUBLIC ${SPHINXSYS_SHARED_HEADERS} ${SPHINXSYS_2D_HEADERS}) - + file(GLOB_RECURSE SPHINXSYS_2D_SOURCES CONFIGURE_DEPENDS for_2D_build/*.cpp) + foreach(FILEPATH ${SPHINXSYS_SHARED_HEADERS}) get_filename_component(DIR ${FILEPATH} DIRECTORY) list(APPEND SPHINXSYS_2D_INCLUDE_DIRS ${DIR}) endforeach() + foreach(FILEPATH ${SPHINXSYS_2D_HEADERS}) get_filename_component(DIR ${FILEPATH} DIRECTORY) list(APPEND SPHINXSYS_2D_INCLUDE_DIRS ${DIR}) - endforeach() + endforeach() + + if(SPHINXSYS_USE_SYCL) + foreach(FILEPATH ${SPHINXSYS_SYCL_HEADERS}) + get_filename_component(DIR ${FILEPATH} DIRECTORY) + list(APPEND SPHINXSYS_2D_INCLUDE_DIRS ${DIR}) + endforeach() + + target_sources(sphinxsys_2d PUBLIC ${SPHINXSYS_SHARED_HEADERS} ${SPHINXSYS_2D_HEADERS} ${SPHINXSYS_SYCL_HEADERS}) + target_sources(sphinxsys_2d PRIVATE ${SPHINXSYS_SHARED_SOURCES} ${SPHINXSYS_2D_SOURCES} ${SPHINXSYS_SYCL_SOURCES}) + else() + target_sources(sphinxsys_2d PUBLIC ${SPHINXSYS_SHARED_HEADERS} ${SPHINXSYS_2D_HEADERS}) + target_sources(sphinxsys_2d PRIVATE ${SPHINXSYS_SHARED_SOURCES} ${SPHINXSYS_2D_SOURCES}) + endif() + + list(REMOVE_DUPLICATES SPHINXSYS_2D_INCLUDE_DIRS) + foreach(DIR ${SPHINXSYS_2D_INCLUDE_DIRS}) target_include_directories(sphinxsys_2d PUBLIC $) endforeach() target_include_directories(sphinxsys_2d PUBLIC $) - file(GLOB_RECURSE SPHINXSYS_2D_SOURCES CONFIGURE_DEPENDS for_2D_build/*.cpp) - target_sources(sphinxsys_2d PRIVATE ${SPHINXSYS_SHARED_SOURCES} ${SPHINXSYS_2D_SOURCES}) - target_link_libraries(sphinxsys_2d PUBLIC sphinxsys_core) endif() @@ -38,25 +57,37 @@ if(SPHINXSYS_3D) add_library(SPHinXsys::sphinxsys_3d ALIAS sphinxsys_3d) file(GLOB_RECURSE SPHINXSYS_3D_HEADERS CONFIGURE_DEPENDS for_3D_build/*.h for_3D_build/*.hpp) - target_sources(sphinxsys_3d PUBLIC ${SPHINXSYS_SHARED_HEADERS} ${SPHINXSYS_3D_HEADERS}) - + file(GLOB_RECURSE SPHINXSYS_3D_SOURCES CONFIGURE_DEPENDS for_3D_build/*.cpp) foreach(FILEPATH ${SPHINXSYS_SHARED_HEADERS}) - get_filename_component(DIR ${FILEPATH} DIRECTORY) - list(APPEND SPHINXSYS_3D_INCLUDE_DIRS ${DIR}) + get_filename_component(DIR ${FILEPATH} DIRECTORY) + list(APPEND SPHINXSYS_3D_INCLUDE_DIRS ${DIR}) endforeach() + foreach(FILEPATH ${SPHINXSYS_3D_HEADERS}) - get_filename_component(DIR ${FILEPATH} DIRECTORY) - list(APPEND SPHINXSYS_3D_INCLUDE_DIRS ${DIR}) + get_filename_component(DIR ${FILEPATH} DIRECTORY) + list(APPEND SPHINXSYS_3D_INCLUDE_DIRS ${DIR}) endforeach() + + if(SPHINXSYS_USE_SYCL) + foreach(FILEPATH ${SPHINXSYS_SYCL_HEADERS}) + get_filename_component(DIR ${FILEPATH} DIRECTORY) + list(APPEND SPHINXSYS_3D_INCLUDE_DIRS ${DIR}) + endforeach() + + target_sources(sphinxsys_3d PUBLIC ${SPHINXSYS_SHARED_HEADERS} ${SPHINXSYS_3D_HEADERS} ${SPHINXSYS_SYCL_HEADERS}) + target_sources(sphinxsys_3d PRIVATE ${SPHINXSYS_SHARED_SOURCES} ${SPHINXSYS_3D_SOURCES} ${SPHINXSYS_SYCL_SOURCES}) + else() + target_sources(sphinxsys_3d PUBLIC ${SPHINXSYS_SHARED_HEADERS} ${SPHINXSYS_3D_HEADERS}) + target_sources(sphinxsys_3d PRIVATE ${SPHINXSYS_SHARED_SOURCES} ${SPHINXSYS_3D_SOURCES}) + endif() + list(REMOVE_DUPLICATES SPHINXSYS_3D_INCLUDE_DIRS) + foreach(DIR ${SPHINXSYS_3D_INCLUDE_DIRS}) target_include_directories(sphinxsys_3d PUBLIC $) endforeach() target_include_directories(sphinxsys_3d PUBLIC $) - file(GLOB_RECURSE SPHINXSYS_3D_SOURCES CONFIGURE_DEPENDS for_3D_build/*.cpp) - target_sources(sphinxsys_3d PRIVATE ${SPHINXSYS_SHARED_SOURCES} ${SPHINXSYS_3D_SOURCES}) - target_link_libraries(sphinxsys_3d PUBLIC sphinxsys_core) endif() diff --git a/src/for_2D_build/common/data_type.h b/src/for_2D_build/common/data_type.h index 917f61f2da..f1a425efa4 100644 --- a/src/for_2D_build/common/data_type.h +++ b/src/for_2D_build/common/data_type.h @@ -30,6 +30,7 @@ #define DATA_TYPE_2D_H #include "base_data_type.h" +#include "geometric_primitive.h" #include "scalar_functions.h" namespace SPH @@ -37,7 +38,6 @@ namespace SPH using Arrayi = Array2i; using Vecd = Vec2d; using Matd = Mat2d; -using AlignedBox = AlignedBox2d; using AngularVecd = Real; using Rotation = Rotation2d; using BoundingBox = BaseBoundingBox; diff --git a/src/for_2D_build/io_system/io_vtk_fvm_2d.cpp b/src/for_2D_build/io_system/io_vtk_fvm_2d.cpp index 78e3bd2844..661e56eed5 100644 --- a/src/for_2D_build/io_system/io_vtk_fvm_2d.cpp +++ b/src/for_2D_build/io_system/io_vtk_fvm_2d.cpp @@ -1,5 +1,5 @@ +#include "io_vtk.hpp" #include "io_vtk_fvm.h" - namespace SPH { //=================================================================================================// @@ -66,7 +66,9 @@ void BodyStatesRecordingInMeshToVtp::writeWithFileName(const std::string &sequen // Write face attribute data out_file << "\n"; - body->writeParticlesToVtpFile(out_file); + + BaseParticles &particles = body->getBaseParticles(); + writeParticlesToVtk(out_file, particles); out_file << "\n"; diff --git a/src/for_2D_build/meshes/base_mesh_2d.cpp b/src/for_2D_build/meshes/base_mesh_2d.cpp index 3985460ab7..4210447b10 100644 --- a/src/for_2D_build/meshes/base_mesh_2d.cpp +++ b/src/for_2D_build/meshes/base_mesh_2d.cpp @@ -3,21 +3,11 @@ namespace SPH { //=============================================================================================// -Array2i BaseMesh::transfer1DtoMeshIndex(const Array2i &mesh_size, size_t i) +Arrayi Mesh::transfer1DtoMeshIndex(const Arrayi &mesh_size, size_t i) const { size_t row_size = mesh_size[1]; size_t column = i / row_size; - return Array2i(column, i - column * row_size); -} -//=============================================================================================// -size_t BaseMesh::transferMeshIndexTo1D(const Array2i &mesh_size, const Array2i &mesh_index) -{ - return mesh_index[0] * mesh_size[1] + mesh_index[1]; -} -//=============================================================================================// -size_t BaseMesh::transferMeshIndexToMortonOrder(const Array2i &mesh_index) -{ - return MortonCode(mesh_index[0]) | (MortonCode(mesh_index[1]) << 1); + return Arrayi(column, i - column * row_size); } } // namespace SPH //=============================================================================================// diff --git a/src/for_2D_build/particle_generator/particle_generator_lattice_2d.cpp b/src/for_2D_build/particle_generator/particle_generator_lattice_2d.cpp index 3f682a7f54..062296cf2e 100644 --- a/src/for_2D_build/particle_generator/particle_generator_lattice_2d.cpp +++ b/src/for_2D_build/particle_generator/particle_generator_lattice_2d.cpp @@ -11,9 +11,9 @@ namespace SPH //=================================================================================================// void ParticleGenerator::prepareGeometricData() { - BaseMesh mesh(domain_bounds_, lattice_spacing_, 0); + Mesh mesh(domain_bounds_, lattice_spacing_, 0); Real particle_volume = lattice_spacing_ * lattice_spacing_; - Arrayi number_of_lattices = mesh.AllCellsFromAllGridPoints(mesh.AllGridPoints()); + Arrayi number_of_lattices = mesh.AllCells(); for (int i = 0; i < number_of_lattices[0]; ++i) for (int j = 0; j < number_of_lattices[1]; ++j) { @@ -32,12 +32,12 @@ void ParticleGenerator::prepareGeometricData() { // Calculate the total volume and // count the number of cells inside the body volume, where we might put particles. - std::unique_ptr mesh(new BaseMesh(domain_bounds_, lattice_spacing_, 0)); - Arrayi number_of_lattices = mesh->AllCellsFromAllGridPoints(mesh->AllGridPoints()); + Mesh mesh(domain_bounds_, lattice_spacing_, 0); + Arrayi number_of_lattices = mesh.AllCells(); for (int i = 0; i < number_of_lattices[0]; ++i) for (int j = 0; j < number_of_lattices[1]; ++j) { - Vecd particle_position = mesh->CellPositionFromIndex(Arrayi(i, j)); + Vecd particle_position = mesh.CellPositionFromIndex(Arrayi(i, j)); if (initial_shape_.checkNotFar(particle_position, lattice_spacing_)) { if (initial_shape_.checkContain(particle_position)) @@ -63,7 +63,7 @@ void ParticleGenerator::prepareGeometricData() for (int i = 0; i < number_of_lattices[0]; ++i) for (int j = 0; j < number_of_lattices[1]; ++j) { - Vecd particle_position = mesh->CellPositionFromIndex(Arrayi(i, j)); + Vecd particle_position = mesh.CellPositionFromIndex(Arrayi(i, j)); if (initial_shape_.checkNotFar(particle_position, lattice_spacing_)) { if (initial_shape_.checkContain(particle_position)) diff --git a/src/for_3D_build/common/data_type.h b/src/for_3D_build/common/data_type.h index 680a06dbf7..288fc2d852 100644 --- a/src/for_3D_build/common/data_type.h +++ b/src/for_3D_build/common/data_type.h @@ -29,6 +29,7 @@ #define DATA_TYPE_3D_H #include "base_data_type.h" +#include "geometric_primitive.h" #include "scalar_functions.h" namespace SPH @@ -36,7 +37,6 @@ namespace SPH using Arrayi = Array3i; using Vecd = Vec3d; using Matd = Mat3d; -using AlignedBox = AlignedBox3d; using AngularVecd = Vec3d; using Rotation = Rotation3d; using BoundingBox = BaseBoundingBox; diff --git a/src/for_3D_build/io_system/io_vtk_fvm_3d.cpp b/src/for_3D_build/io_system/io_vtk_fvm_3d.cpp index 3900e331fb..998d17ec2c 100644 --- a/src/for_3D_build/io_system/io_vtk_fvm_3d.cpp +++ b/src/for_3D_build/io_system/io_vtk_fvm_3d.cpp @@ -1,6 +1,7 @@ +#include "io_vtk.hpp" #include "io_vtk_fvm.h" - #include "mesh_helper.h" + namespace SPH { //=================================================================================================// @@ -31,7 +32,10 @@ void BodyStatesRecordingInMeshToVtu::writeWithFileName(const std::string &sequen // write Particle data to vtu file out_file << "\n"; - body->writeParticlesToVtuFile(out_file); + + BaseParticles &particles = body->getBaseParticles(); + writeParticlesToVtk(out_file, particles); + out_file << "\n"; // Write VTU file footer out_file << "\n"; diff --git a/src/for_3D_build/meshes/base_mesh_3d.cpp b/src/for_3D_build/meshes/base_mesh_3d.cpp index d9902fcfe8..7ab5331313 100644 --- a/src/for_3D_build/meshes/base_mesh_3d.cpp +++ b/src/for_3D_build/meshes/base_mesh_3d.cpp @@ -3,25 +3,14 @@ namespace SPH { //=================================================================================================// -Array3i BaseMesh::transfer1DtoMeshIndex(const Array3i &mesh_size, size_t i) +Arrayi Mesh::transfer1DtoMeshIndex(const Arrayi &mesh_size, size_t i) const { size_t row_times_column_size = mesh_size[1] * mesh_size[2]; size_t page = i / row_times_column_size; size_t left_over = (i - page * row_times_column_size); size_t row_size = mesh_size[2]; size_t column = left_over / row_size; - return Array3i(page, column, left_over - column * row_size); + return Arrayi(page, column, left_over - column * row_size); } //=================================================================================================// -size_t BaseMesh::transferMeshIndexTo1D(const Array3i &mesh_size, const Array3i &mesh_index) -{ - return mesh_index[0] * mesh_size[1] * mesh_size[2] + - mesh_index[1] * mesh_size[2] + - mesh_index[2]; -} -//=================================================================================================// -size_t BaseMesh::transferMeshIndexToMortonOrder(const Array3i &mesh_index) -{ - return MortonCode(mesh_index[0]) | (MortonCode(mesh_index[1]) << 1) | (MortonCode(mesh_index[2]) << 2); -} } // namespace SPH diff --git a/src/for_3D_build/meshes/cell_linked_list_3d.cpp b/src/for_3D_build/meshes/cell_linked_list_3d.cpp index b07983f7e3..4f25879bad 100644 --- a/src/for_3D_build/meshes/cell_linked_list_3d.cpp +++ b/src/for_3D_build/meshes/cell_linked_list_3d.cpp @@ -9,7 +9,6 @@ namespace SPH { - //=================================================================================================// void CellLinkedList:: tagBoundingCells(StdVec &cell_data_lists, const BoundingBox &bounding_bounds, int axis) diff --git a/src/for_3D_build/particle_dynamics/solid_dynamics/slender_structure_dynamics.cpp b/src/for_3D_build/particle_dynamics/solid_dynamics/slender_structure_dynamics.cpp index c529db2d6e..f24e11bde5 100644 --- a/src/for_3D_build/particle_dynamics/solid_dynamics/slender_structure_dynamics.cpp +++ b/src/for_3D_build/particle_dynamics/solid_dynamics/slender_structure_dynamics.cpp @@ -7,24 +7,23 @@ namespace slender_structure_dynamics { //=================================================================================================// BarAcousticTimeStepSize::BarAcousticTimeStepSize(SPHBody &sph_body, Real CFL) - : LocalDynamicsReduce(sph_body), - DataDelegateSimple(sph_body), CFL_(CFL), + : LocalDynamicsReduce(sph_body), CFL_(CFL), elastic_solid_(DynamicCast(this, sph_body.getBaseMaterial())), - vel_(*particles_->getVariableDataByName("Velocity")), - force_(*particles_->getVariableDataByName("Force")), - angular_vel_(*particles_->getVariableDataByName("AngularVelocity")), - dangular_vel_dt_(*particles_->getVariableDataByName("AngularAcceleration")), - force_prior_(*particles_->getVariableDataByName("ForcePrior")), - thickness_(*particles_->getVariableDataByName("Thickness")), - mass_(*particles_->getVariableDataByName("Mass")), + vel_(particles_->getVariableDataByName("Velocity")), + force_(particles_->getVariableDataByName("Force")), + angular_vel_(particles_->getVariableDataByName("AngularVelocity")), + dangular_vel_dt_(particles_->getVariableDataByName("AngularAcceleration")), + force_prior_(particles_->getVariableDataByName("ForcePrior")), + thickness_(particles_->getVariableDataByName("Thickness")), + mass_(particles_->getVariableDataByName("Mass")), rho0_(elastic_solid_.ReferenceDensity()), E0_(elastic_solid_.YoungsModulus()), nu_(elastic_solid_.PoissonRatio()), c0_(elastic_solid_.ReferenceSoundSpeed()), smoothing_length_(sph_body.sph_adaptation_->ReferenceSmoothingLength()), - angular_b_vel_(*particles_->getVariableDataByName("BinormalAngularVelocity")), - dangular_b_vel_dt_(*particles_->getVariableDataByName("BinormalAngularAcceleration")), - width_(*particles_->getVariableDataByName("Width")) {} + angular_b_vel_(particles_->getVariableDataByName("BinormalAngularVelocity")), + dangular_b_vel_dt_(particles_->getVariableDataByName("BinormalAngularAcceleration")), + width_(particles_->getVariableDataByName("Width")) {} //=================================================================================================// Real BarAcousticTimeStepSize::reduce(size_t index_i, Real dt) { @@ -44,56 +43,56 @@ Real BarAcousticTimeStepSize::reduce(size_t index_i, Real dt) BarCorrectConfiguration:: BarCorrectConfiguration(BaseInnerRelation &inner_relation) : LocalDynamics(inner_relation.getSPHBody()), DataDelegateInner(inner_relation), - Vol_(*particles_->getVariableDataByName("VolumetricMeasure")), - B_(*particles_->registerSharedVariable("LinearGradientCorrectionMatrix", IdentityMatrix::value)), - n0_(*particles_->registerSharedVariableFrom("InitialNormalDirection", "NormalDirection")), - transformation_matrix0_(*particles_->getVariableDataByName("TransformationMatrix")) {} + Vol_(particles_->getVariableDataByName("VolumetricMeasure")), + B_(particles_->registerStateVariable("LinearGradientCorrectionMatrix", IdentityMatrix::value)), + n0_(particles_->registerStateVariableFrom("InitialNormalDirection", "NormalDirection")), + transformation_matrix0_(particles_->getVariableDataByName("TransformationMatrix")) {} //=================================================================================================// BarDeformationGradientTensor:: BarDeformationGradientTensor(BaseInnerRelation &inner_relation) : LocalDynamics(inner_relation.getSPHBody()), DataDelegateInner(inner_relation), - Vol_(*particles_->getVariableDataByName("VolumetricMeasure")), - pos_(*particles_->getVariableDataByName("Position")), - pseudo_n_(*particles_->registerSharedVariableFrom("PseudoNormal", "NormalDirection")), - n0_(*particles_->registerSharedVariableFrom("InitialNormalDirection", "NormalDirection")), - B_(*particles_->getVariableDataByName("LinearGradientCorrectionMatrix")), - F_(*particles_->registerSharedVariable("DeformationGradient", IdentityMatrix::value)), - F_bending_(*particles_->registerSharedVariable("BendingDeformationGradient")), - transformation_matrix0_(*particles_->getVariableDataByName("TransformationMatrix")), - pseudo_b_n_(*particles_->registerSharedVariableFrom("PseudoBinormal", "BinormalDirection")), - b_n0_(*particles_->registerSharedVariableFrom("InitialBinormalDirection", "BinormalDirection")), - F_b_bending_(*particles_->registerSharedVariable("BinormalBending")) {} + Vol_(particles_->getVariableDataByName("VolumetricMeasure")), + pos_(particles_->getVariableDataByName("Position")), + pseudo_n_(particles_->registerStateVariableFrom("PseudoNormal", "NormalDirection")), + n0_(particles_->registerStateVariableFrom("InitialNormalDirection", "NormalDirection")), + B_(particles_->getVariableDataByName("LinearGradientCorrectionMatrix")), + F_(particles_->registerStateVariable("DeformationGradient", IdentityMatrix::value)), + F_bending_(particles_->registerStateVariable("BendingDeformationGradient")), + transformation_matrix0_(particles_->getVariableDataByName("TransformationMatrix")), + pseudo_b_n_(particles_->registerStateVariableFrom("PseudoBinormal", "BinormalDirection")), + b_n0_(particles_->registerStateVariableFrom("InitialBinormalDirection", "BinormalDirection")), + F_b_bending_(particles_->registerStateVariable("BinormalBending")) {} //=================================================================================================// BaseBarRelaxation::BaseBarRelaxation(BaseInnerRelation &inner_relation) : LocalDynamics(inner_relation.getSPHBody()), DataDelegateInner(inner_relation), - Vol_(*particles_->getVariableDataByName("VolumetricMeasure")), - thickness_(*particles_->getVariableDataByName("Thickness")), - width_(*particles_->getVariableDataByName("Width")), - pos_(*particles_->getVariableDataByName("Position")), - vel_(*particles_->registerSharedVariable("Velocity")), - force_(*particles_->registerSharedVariable("Force")), - force_prior_(*particles_->registerSharedVariable("ForcePrior")), - n0_(*particles_->registerSharedVariableFrom("InitialNormalDirection", "NormalDirection")), - pseudo_n_(*particles_->registerSharedVariableFrom("PseudoNormal", "NormalDirection")), - dpseudo_n_dt_(*particles_->registerSharedVariable("PseudoNormalChangeRate")), - dpseudo_n_d2t_(*particles_->registerSharedVariable("PseudoNormal2ndOrderTimeDerivative")), - rotation_(*particles_->registerSharedVariable("Rotation")), - angular_vel_(*particles_->registerSharedVariable("AngularVelocity")), - dangular_vel_dt_(*particles_->registerSharedVariable("AngularAcceleration")), - B_(*particles_->getVariableDataByName("LinearGradientCorrectionMatrix")), - F_(*particles_->registerSharedVariable("DeformationGradient", IdentityMatrix::value)), - dF_dt_(*particles_->registerSharedVariable("DeformationRate")), - F_bending_(*particles_->registerSharedVariable("BendingDeformationGradient")), - dF_bending_dt_(*particles_->registerSharedVariable("BendingDeformationRate")), - pseudo_b_n_(*particles_->registerSharedVariableFrom("PseudoBinormal", "BinormalDirection")), - dpseudo_b_n_dt_(*particles_->registerSharedVariable("PseudoBinormalChangeRate")), - dpseudo_b_n_d2t_(*particles_->registerSharedVariable("PseudoBinormal2ndOrderTimeDerivative")), - rotation_b_(*particles_->registerSharedVariable("BinormalRotation")), - angular_b_vel_(*particles_->registerSharedVariable("BinormalAngularVelocity")), - dangular_b_vel_dt_(*particles_->registerSharedVariable("BinormalAngularAcceleration")), - transformation_matrix0_(*particles_->getVariableDataByName("TransformationMatrix")), - F_b_bending_(*particles_->registerSharedVariable("BinormalBending")), - dF_b_bending_dt_(*particles_->registerSharedVariable("BinormalBendingRate")) {} + Vol_(particles_->getVariableDataByName("VolumetricMeasure")), + thickness_(particles_->getVariableDataByName("Thickness")), + width_(particles_->getVariableDataByName("Width")), + pos_(particles_->getVariableDataByName("Position")), + vel_(particles_->registerStateVariable("Velocity")), + force_(particles_->registerStateVariable("Force")), + force_prior_(particles_->registerStateVariable("ForcePrior")), + n0_(particles_->registerStateVariableFrom("InitialNormalDirection", "NormalDirection")), + pseudo_n_(particles_->registerStateVariableFrom("PseudoNormal", "NormalDirection")), + dpseudo_n_dt_(particles_->registerStateVariable("PseudoNormalChangeRate")), + dpseudo_n_d2t_(particles_->registerStateVariable("PseudoNormal2ndOrderTimeDerivative")), + rotation_(particles_->registerStateVariable("Rotation")), + angular_vel_(particles_->registerStateVariable("AngularVelocity")), + dangular_vel_dt_(particles_->registerStateVariable("AngularAcceleration")), + B_(particles_->getVariableDataByName("LinearGradientCorrectionMatrix")), + F_(particles_->registerStateVariable("DeformationGradient", IdentityMatrix::value)), + dF_dt_(particles_->registerStateVariable("DeformationRate")), + F_bending_(particles_->registerStateVariable("BendingDeformationGradient")), + dF_bending_dt_(particles_->registerStateVariable("BendingDeformationRate")), + pseudo_b_n_(particles_->registerStateVariableFrom("PseudoBinormal", "BinormalDirection")), + dpseudo_b_n_dt_(particles_->registerStateVariable("PseudoBinormalChangeRate")), + dpseudo_b_n_d2t_(particles_->registerStateVariable("PseudoBinormal2ndOrderTimeDerivative")), + rotation_b_(particles_->registerStateVariable("BinormalRotation")), + angular_b_vel_(particles_->registerStateVariable("BinormalAngularVelocity")), + dangular_b_vel_dt_(particles_->registerStateVariable("BinormalAngularAcceleration")), + transformation_matrix0_(particles_->getVariableDataByName("TransformationMatrix")), + F_b_bending_(particles_->registerStateVariable("BinormalBending")), + dF_b_bending_dt_(particles_->registerStateVariable("BinormalBendingRate")) {} //=================================================================================================// BarStressRelaxationFirstHalf:: BarStressRelaxationFirstHalf(BaseInnerRelation &inner_relation, @@ -103,22 +102,22 @@ BarStressRelaxationFirstHalf:: rho0_(elastic_solid_.ReferenceDensity()), inv_rho0_(1.0 / rho0_), smoothing_length_(sph_body_.sph_adaptation_->ReferenceSmoothingLength()), numerical_damping_scaling_matrix_(Matd::Identity() * smoothing_length_), - rho_(*particles_->getVariableDataByName("Density")), - mass_(*particles_->getVariableDataByName("Mass")), - global_stress_(*particles_->registerSharedVariable("GlobalStress")), - global_moment_(*particles_->registerSharedVariable("GlobalMoment")), - mid_surface_cauchy_stress_(*particles_->registerSharedVariable("MidSurfaceCauchyStress")), - global_shear_stress_(*particles_->registerSharedVariable("GlobalShearStress")), - n_(*particles_->getVariableDataByName("NormalDirection")), + rho_(particles_->getVariableDataByName("Density")), + mass_(particles_->getVariableDataByName("Mass")), + global_stress_(particles_->registerStateVariable("GlobalStress")), + global_moment_(particles_->registerStateVariable("GlobalMoment")), + mid_surface_cauchy_stress_(particles_->registerStateVariable("MidSurfaceCauchyStress")), + global_shear_stress_(particles_->registerStateVariable("GlobalShearStress")), + n_(particles_->getVariableDataByName("NormalDirection")), E0_(elastic_solid_.YoungsModulus()), G0_(elastic_solid_.ShearModulus()), nu_(elastic_solid_.PoissonRatio()), hourglass_control_(hourglass_control), number_of_gaussian_points_(number_of_gaussian_points), - global_b_stress_(*particles_->registerSharedVariable("GlobalBinormalStress")), - global_b_moment_(*particles_->registerSharedVariable("GlobalBinormalMoment")), - global_b_shear_stress_(*particles_->registerSharedVariable("GlobalBinormalShearStress")), - b_n_(*particles_->getVariableDataByName("BinormalDirection")) + global_b_stress_(particles_->registerStateVariable("GlobalBinormalStress")), + global_b_moment_(particles_->registerStateVariable("GlobalBinormalMoment")), + global_b_shear_stress_(particles_->registerStateVariable("GlobalBinormalShearStress")), + b_n_(particles_->getVariableDataByName("BinormalDirection")) { /** Note that, only three-point and five-point Gaussian quadrature rules are defined. */ switch (number_of_gaussian_points) @@ -290,10 +289,10 @@ void BarStressRelaxationSecondHalf::update(size_t index_i, Real dt) //=================================================================================================// ConstrainBarBodyRegion:: ConstrainBarBodyRegion(BodyPartByParticle &body_part) - : BaseLocalDynamics(body_part), DataDelegateSimple(body_part.getSPHBody()), - vel_(*particles_->getVariableDataByName("Velocity")), - angular_vel_(*particles_->getVariableDataByName("AngularVelocity")), - angular_b_vel_(*particles_->getVariableDataByName("BinormalAngularVelocity")) {} + : BaseLocalDynamics(body_part), + vel_(particles_->getVariableDataByName("Velocity")), + angular_vel_(particles_->getVariableDataByName("AngularVelocity")), + angular_b_vel_(particles_->getVariableDataByName("BinormalAngularVelocity")) {} //=================================================================================================// void ConstrainBarBodyRegion::update(size_t index_i, Real dt) { @@ -303,17 +302,17 @@ void ConstrainBarBodyRegion::update(size_t index_i, Real dt) } //=================================================================================================// ConstrainBarBodyRegionAlongAxis::ConstrainBarBodyRegionAlongAxis(BodyPartByParticle &body_part, int axis) - : BaseLocalDynamics(body_part), DataDelegateSimple(body_part.getSPHBody()), - axis_(axis), pos_(*particles_->getVariableDataByName("Position")), - pos0_(*particles_->registerSharedVariableFrom("InitialPosition", "Position")), - vel_(*particles_->getVariableDataByName("Velocity")), - force_(*particles_->getVariableDataByName("Force")), - rotation_(*particles_->getVariableDataByName("Rotation")), - angular_vel_(*particles_->getVariableDataByName("AngularVelocity")), - dangular_vel_dt_(*particles_->getVariableDataByName("AngularAcceleration")), - rotation_b_(*particles_->getVariableDataByName("BinormalRotation")), - angular_b_vel_(*particles_->getVariableDataByName("BinormalAngularVelocity")), - dangular_b_vel_dt_(*particles_->getVariableDataByName("BinormalAngularAcceleration")) {} + : BaseLocalDynamics(body_part), + axis_(axis), pos_(particles_->getVariableDataByName("Position")), + pos0_(particles_->registerStateVariableFrom("InitialPosition", "Position")), + vel_(particles_->getVariableDataByName("Velocity")), + force_(particles_->getVariableDataByName("Force")), + rotation_(particles_->getVariableDataByName("Rotation")), + angular_vel_(particles_->getVariableDataByName("AngularVelocity")), + dangular_vel_dt_(particles_->getVariableDataByName("AngularAcceleration")), + rotation_b_(particles_->getVariableDataByName("BinormalRotation")), + angular_b_vel_(particles_->getVariableDataByName("BinormalAngularVelocity")), + dangular_b_vel_dt_(particles_->getVariableDataByName("BinormalAngularAcceleration")) {} //=================================================================================================// void ConstrainBarBodyRegionAlongAxis::update(size_t index_i, Real dt) { diff --git a/src/for_3D_build/particle_dynamics/solid_dynamics/slender_structure_dynamics.h b/src/for_3D_build/particle_dynamics/solid_dynamics/slender_structure_dynamics.h index c41fe8c9f8..75cd7f9ef4 100644 --- a/src/for_3D_build/particle_dynamics/solid_dynamics/slender_structure_dynamics.h +++ b/src/for_3D_build/particle_dynamics/solid_dynamics/slender_structure_dynamics.h @@ -45,19 +45,18 @@ namespace slender_structure_dynamics * @class BarAcousticTimeStepSize * @brief Computing the acoustic time step size for bar */ -class BarAcousticTimeStepSize : public LocalDynamicsReduce, - public DataDelegateSimple +class BarAcousticTimeStepSize : public LocalDynamicsReduce { protected: Real CFL_; ElasticSolid &elastic_solid_; - StdLargeVec &vel_, &force_, &angular_vel_, &dangular_vel_dt_, &force_prior_; - StdLargeVec &thickness_, &mass_; + Vecd *vel_, *force_, *angular_vel_, *dangular_vel_dt_, *force_prior_; + Real *thickness_, *mass_; Real rho0_, E0_, nu_, c0_; Real smoothing_length_; - StdLargeVec &angular_b_vel_, &dangular_b_vel_dt_; - StdLargeVec &width_; + Vecd *angular_b_vel_, *dangular_b_vel_dt_; + Real *width_; public: explicit BarAcousticTimeStepSize(SPHBody &sph_body, Real CFL = 0.6); @@ -95,10 +94,10 @@ class BarCorrectConfiguration : public LocalDynamics, public DataDelegateInner }; protected: - StdLargeVec &Vol_; - StdLargeVec &B_; - StdLargeVec &n0_; - StdLargeVec &transformation_matrix0_; + Real *Vol_; + Matd *B_; + Vecd *n0_; + Matd *transformation_matrix0_; }; /** @@ -139,13 +138,12 @@ class BarDeformationGradientTensor : public LocalDynamics, public DataDelegateIn }; protected: - StdLargeVec &Vol_; - StdLargeVec &pos_, &pseudo_n_, &n0_; - StdLargeVec &B_, &F_, &F_bending_; - StdLargeVec &transformation_matrix0_; - - StdLargeVec &pseudo_b_n_, &b_n0_; - StdLargeVec &F_b_bending_; + Real *Vol_; + Vecd *pos_, *pseudo_n_, *n0_; + Matd *B_, *F_, *F_bending_; + Matd *transformation_matrix0_; + Vecd *pseudo_b_n_, *b_n0_; + Matd *F_b_bending_; }; /** @@ -159,16 +157,16 @@ class BaseBarRelaxation : public LocalDynamics, public DataDelegateInner virtual ~BaseBarRelaxation(){}; protected: - StdLargeVec &Vol_, &thickness_, &width_; - StdLargeVec &pos_, &vel_, &force_, &force_prior_; - StdLargeVec &n0_, &pseudo_n_, &dpseudo_n_dt_, &dpseudo_n_d2t_, &rotation_, - &angular_vel_, &dangular_vel_dt_; - StdLargeVec &B_, &F_, &dF_dt_, &F_bending_, &dF_bending_dt_; - - StdLargeVec &pseudo_b_n_, &dpseudo_b_n_dt_, &dpseudo_b_n_d2t_, &rotation_b_, - &angular_b_vel_, dangular_b_vel_dt_; - StdLargeVec &transformation_matrix0_; - StdLargeVec &F_b_bending_, &dF_b_bending_dt_; + Real *Vol_, *thickness_, *width_; + Vecd *pos_, *vel_, *force_, *force_prior_; + Vecd *n0_, *pseudo_n_, *dpseudo_n_dt_, *dpseudo_n_d2t_, *rotation_, + *angular_vel_, *dangular_vel_dt_; + Matd *B_, *F_, *dF_dt_, *F_bending_, *dF_bending_dt_; + + Vecd *pseudo_b_n_, *dpseudo_b_n_dt_, *dpseudo_b_n_d2t_, *rotation_b_, + *angular_b_vel_, *dangular_b_vel_dt_; + Matd *transformation_matrix0_; + Matd *F_b_bending_, *dF_b_bending_dt_; }; /** @@ -228,9 +226,9 @@ class BarStressRelaxationFirstHalf : public BaseBarRelaxation Real rho0_, inv_rho0_; Real smoothing_length_; Matd numerical_damping_scaling_matrix_; - StdLargeVec &rho_, &mass_; - StdLargeVec &global_stress_, &global_moment_, &mid_surface_cauchy_stress_; - StdLargeVec &global_shear_stress_, &n_; + Real *rho_, *mass_; + Matd *global_stress_, *global_moment_, *mid_surface_cauchy_stress_; + Vecd *global_shear_stress_, *n_; Real E0_, G0_, nu_, hourglass_control_factor_; bool hourglass_control_; @@ -252,9 +250,9 @@ class BarStressRelaxationFirstHalf : public BaseBarRelaxation int number_of_gaussian_points_; - StdLargeVec &global_b_stress_, &global_b_moment_; - StdLargeVec &global_b_shear_stress_; - StdLargeVec &b_n_; + Matd *global_b_stress_, *global_b_moment_; + Vecd *global_b_shear_stress_; + Vecd *b_n_; StdVec gaussian_point_x; StdVec gaussian_point_y; StdVec gaussian_weight_; @@ -309,7 +307,7 @@ class BarStressRelaxationSecondHalf : public BaseBarRelaxation /**@class ConstrainBarBodyRegion * @brief Fix the position and angle of a bar body part. */ -class ConstrainBarBodyRegion : public BaseLocalDynamics, public DataDelegateSimple +class ConstrainBarBodyRegion : public BaseLocalDynamics { public: ConstrainBarBodyRegion(BodyPartByParticle &body_part); @@ -317,7 +315,7 @@ class ConstrainBarBodyRegion : public BaseLocalDynamics, pub void update(size_t index_i, Real dt = 0.0); protected: - StdLargeVec &vel_, &angular_vel_, &angular_b_vel_; + Vecd *vel_, *angular_vel_, *angular_b_vel_; }; /**@class ConstrainBarBodyRegionAlongAxis @@ -325,7 +323,7 @@ class ConstrainBarBodyRegion : public BaseLocalDynamics, pub * The axis must be 0 or 1. * Note that the average values for FSI are prescribed also. */ -class ConstrainBarBodyRegionAlongAxis : public BaseLocalDynamics, public DataDelegateSimple +class ConstrainBarBodyRegionAlongAxis : public BaseLocalDynamics { public: ConstrainBarBodyRegionAlongAxis(BodyPartByParticle &body_part, int axis); @@ -334,10 +332,10 @@ class ConstrainBarBodyRegionAlongAxis : public BaseLocalDynamics &pos_, &pos0_; - StdLargeVec &vel_, &force_; - StdLargeVec &rotation_, &angular_vel_, &dangular_vel_dt_; - StdLargeVec &rotation_b_, &angular_b_vel_, &dangular_b_vel_dt_; + Vecd *pos_, *pos0_; + Vecd *vel_, *force_; + Vecd *rotation_, *angular_vel_, *dangular_vel_dt_; + Vecd *rotation_b_, *angular_b_vel_, *dangular_b_vel_dt_; }; } // namespace slender_structure_dynamics } // namespace SPH diff --git a/src/for_3D_build/particle_generator/particle_generator_lattice_3d.cpp b/src/for_3D_build/particle_generator/particle_generator_lattice_3d.cpp index f7ede7482c..61e8e4ee92 100644 --- a/src/for_3D_build/particle_generator/particle_generator_lattice_3d.cpp +++ b/src/for_3D_build/particle_generator/particle_generator_lattice_3d.cpp @@ -11,9 +11,9 @@ namespace SPH //=================================================================================================// void ParticleGenerator::prepareGeometricData() { - BaseMesh mesh(domain_bounds_, lattice_spacing_, 0); + Mesh mesh(domain_bounds_, lattice_spacing_, 0); Real particle_volume = lattice_spacing_ * lattice_spacing_ * lattice_spacing_; - Arrayi number_of_lattices = mesh.AllCellsFromAllGridPoints(mesh.AllGridPoints()); + Arrayi number_of_lattices = mesh.AllCells(); for (int i = 0; i < number_of_lattices[0]; ++i) for (int j = 0; j < number_of_lattices[1]; ++j) for (int k = 0; k < number_of_lattices[2]; ++k) @@ -33,13 +33,13 @@ void ParticleGenerator::prepareGeometricData() { // Calculate the total volume and // count the number of cells inside the body volume, where we might put particles. - std::unique_ptr mesh(new BaseMesh(domain_bounds_, lattice_spacing_, 0)); - Arrayi number_of_lattices = mesh->AllCellsFromAllGridPoints(mesh->AllGridPoints()); + Mesh mesh(domain_bounds_, lattice_spacing_, 0); + Arrayi number_of_lattices = mesh.AllCells(); for (int i = 0; i < number_of_lattices[0]; ++i) for (int j = 0; j < number_of_lattices[1]; ++j) for (int k = 0; k < number_of_lattices[2]; ++k) { - Vecd particle_position = mesh->CellPositionFromIndex(Arrayi(i, j, k)); + Vecd particle_position = mesh.CellPositionFromIndex(Arrayi(i, j, k)); if (initial_shape_.checkNotFar(particle_position, lattice_spacing_)) { if (initial_shape_.checkContain(particle_position)) @@ -66,7 +66,7 @@ void ParticleGenerator::prepareGeometricData() for (int j = 0; j < number_of_lattices[1]; ++j) for (int k = 0; k < number_of_lattices[2]; ++k) { - Vecd particle_position = mesh->CellPositionFromIndex(Arrayi(i, j, k)); + Vecd particle_position = mesh.CellPositionFromIndex(Arrayi(i, j, k)); if (initial_shape_.checkNotFar(particle_position, lattice_spacing_)) { if (initial_shape_.checkContain(particle_position)) diff --git a/src/for_3D_build/particle_generator/particle_generator_network.h b/src/for_3D_build/particle_generator/particle_generator_network.h index ac566a708b..ddf724549c 100644 --- a/src/for_3D_build/particle_generator/particle_generator_network.h +++ b/src/for_3D_build/particle_generator/particle_generator_network.h @@ -31,7 +31,7 @@ #define PARTICLE_GENERATOR_NETWORK_H #include "base_particle_generator.h" -#include "sph_data_containers.h" +#include "sphinxsys_containers.h" #include "tree_body.h" namespace SPH diff --git a/src/for_3D_build/particles/linear_particles.cpp b/src/for_3D_build/particles/linear_particles.cpp index dc1bef4b91..71ae69149c 100644 --- a/src/for_3D_build/particles/linear_particles.cpp +++ b/src/for_3D_build/particles/linear_particles.cpp @@ -8,8 +8,8 @@ LinearParticles::LinearParticles(SPHBody &sph_body, BaseMaterial *base_material) //=================================================================================================// void LinearParticles::registerLineProperties(StdLargeVec &b_n, StdLargeVec &width) { - b_n_ = registerSharedVariableFrom("BinormalDirection", b_n); - width_ = registerSharedVariableFrom("Width", width); + b_n_ = registerStateVariableFrom("BinormalDirection", b_n); + width_ = registerStateVariableFrom("Width", width); addVariableToReload("BinormalDirection"); addVariableToReload("Width"); addVariableToWrite("BinormalDirection"); @@ -17,15 +17,15 @@ void LinearParticles::registerLineProperties(StdLargeVec &b_n, StdLargeVec //=================================================================================================// void LinearParticles::registerLinePropertiesFromReload() { - b_n_ = registerSharedVariableFromReload("NormalDirection"); - width_ = registerSharedVariableFromReload("Thickness"); + b_n_ = registerStateVariableFromReload("NormalDirection"); + width_ = registerStateVariableFromReload("Thickness"); } //=================================================================================================// void LinearParticles::registerTransformationMatrix() { - transformation_matrix0_ = registerSharedVariable( + transformation_matrix0_ = registerStateVariable( "TransformationMatrix", [&](size_t index_i) -> Matd - { return getTransformationMatrix((*n_)[index_i], (*b_n_)[index_i]); }); + { return getTransformationMatrix(n_[index_i], b_n_[index_i]); }); } //=================================================================================================// } // namespace SPH diff --git a/src/for_3D_build/particles/linear_particles.h b/src/for_3D_build/particles/linear_particles.h index 2bc1d07c81..153129b6f6 100644 --- a/src/for_3D_build/particles/linear_particles.h +++ b/src/for_3D_build/particles/linear_particles.h @@ -40,11 +40,11 @@ class LinearParticles : public SurfaceParticles LinearParticles(SPHBody &sph_body, BaseMaterial *base_material); virtual ~LinearParticles(){}; - StdLargeVec *b_n_; /**< binormal direction */ - StdLargeVec *width_; + Vecd *b_n_; /**< binormal direction */ + Real *width_; /** get particle volume. */ - virtual Real ParticleVolume(size_t index_i) override { return (*Vol_)[index_i] * (*thickness_)[index_i] * (*width_)[index_i]; } + virtual Real ParticleVolume(size_t index_i) override { return Vol_[index_i] * thickness_[index_i] * width_[index_i]; } void registerLineProperties(StdLargeVec &b_n, StdLargeVec &width); void registerLinePropertiesFromReload(); virtual void registerTransformationMatrix() override; diff --git a/src/shared/adaptations/adaptation.cpp b/src/shared/adaptations/adaptation.cpp index e8c1cf4755..32a3c7e8bf 100644 --- a/src/shared/adaptations/adaptation.cpp +++ b/src/shared/adaptations/adaptation.cpp @@ -16,7 +16,7 @@ SPHAdaptation::SPHAdaptation(Real resolution_ref, Real h_spacing_ratio, Real sys h_ref_(h_spacing_ratio_ * spacing_ref_), kernel_ptr_(makeUnique(h_ref_)), sigma0_ref_(computeLatticeNumberDensity(Vecd())), spacing_min_(this->MostRefinedSpacingRegular(spacing_ref_, local_refinement_level_)), - Vol_min_(pow(spacing_min_, Dimensions)), h_ratio_max_(spacing_ref_ / spacing_min_){}; + Vol_min_(pow(spacing_min_, Dimensions)), h_ratio_max_(spacing_ref_ / spacing_min_) {}; //=================================================================================================// Real SPHAdaptation::MostRefinedSpacing(Real coarse_particle_spacing, int local_refinement_level) { @@ -81,9 +81,10 @@ void SPHAdaptation::resetAdaptationRatios(Real h_spacing_ratio, Real new_system_ h_ratio_max_ = spacing_ref_ / spacing_min_; } //=================================================================================================// -UniquePtr SPHAdaptation::createCellLinkedList(const BoundingBox &domain_bounds) +UniquePtr SPHAdaptation:: + createCellLinkedList(const BoundingBox &domain_bounds, BaseParticles &base_particles) { - return makeUnique(domain_bounds, kernel_ptr_->CutOffRadius(), *this); + return makeUnique(domain_bounds, kernel_ptr_->CutOffRadius(), base_particles, *this); } //=================================================================================================// UniquePtr SPHAdaptation::createLevelSet(Shape &shape, Real refinement_ratio) @@ -114,7 +115,7 @@ ParticleWithLocalRefinement:: void ParticleWithLocalRefinement::initializeAdaptationVariables(BaseParticles &base_particles) { SPHAdaptation::initializeAdaptationVariables(base_particles); - h_ratio_ = base_particles.registerSharedVariable( + h_ratio_ = base_particles.registerStateVariable( "SmoothingLengthRatio", [&](size_t i) -> Real { return ReferenceSpacing() / base_particles.ParticleSpacing(i); }); base_particles.addVariableToSort("SmoothingLengthRatio"); @@ -131,10 +132,11 @@ size_t ParticleWithLocalRefinement::getLevelSetTotalLevel() return getCellLinkedListTotalLevel() + 1; } //=================================================================================================// -UniquePtr ParticleWithLocalRefinement::createCellLinkedList(const BoundingBox &domain_bounds) +UniquePtr ParticleWithLocalRefinement:: + createCellLinkedList(const BoundingBox &domain_bounds, BaseParticles &base_particles) { return makeUnique(domain_bounds, kernel_ptr_->CutOffRadius(), - getCellLinkedListTotalLevel(), *this); + getCellLinkedListTotalLevel(), base_particles, *this); } //=================================================================================================// UniquePtr ParticleWithLocalRefinement::createLevelSet(Shape &shape, Real refinement_ratio) diff --git a/src/shared/adaptations/adaptation.h b/src/shared/adaptations/adaptation.h index c27f125665..f4354d7daf 100644 --- a/src/shared/adaptations/adaptation.h +++ b/src/shared/adaptations/adaptation.h @@ -31,7 +31,8 @@ #include "base_data_package.h" #include "base_kernel.h" -#include "sph_data_containers.h" +#include "base_mesh.h" +#include "sphinxsys_containers.h" namespace SPH { @@ -65,7 +66,7 @@ class SPHAdaptation public: explicit SPHAdaptation(Real resolution_ref, Real h_spacing_ratio = 1.3, Real system_refinement_ratio = 1.0); - virtual ~SPHAdaptation(){}; + virtual ~SPHAdaptation() {}; int LocalRefinementLevel() { return local_refinement_level_; }; Real ReferenceSpacing() { return spacing_ref_; }; @@ -79,9 +80,12 @@ class SPHAdaptation void resetAdaptationRatios(Real h_spacing_ratio, Real new_system_refinement_ratio = 1.0); virtual void initializeAdaptationVariables(BaseParticles &base_particles) {}; - virtual UniquePtr createCellLinkedList(const BoundingBox &domain_bounds); + virtual UniquePtr createCellLinkedList(const BoundingBox &domain_bounds, BaseParticles &base_particles); virtual UniquePtr createLevelSet(Shape &shape, Real refinement_ratio); + template + MeshType createBackGroundMesh(SPHBody &sph_body, Args &&...args); + template void resetKernel(Args &&...args) { @@ -104,20 +108,20 @@ class SPHAdaptation class ParticleWithLocalRefinement : public SPHAdaptation { public: - StdLargeVec *h_ratio_; /**< the ratio between reference smoothing length to variable smoothing length */ + Real *h_ratio_; /**< the ratio between reference smoothing length to variable smoothing length */ ParticleWithLocalRefinement(Real resolution_ref, Real h_spacing_ratio_, Real system_refinement_ratio, int local_refinement_level); - virtual ~ParticleWithLocalRefinement(){}; + virtual ~ParticleWithLocalRefinement() {}; virtual size_t getCellLinkedListTotalLevel(); size_t getLevelSetTotalLevel(); virtual Real SmoothingLengthRatio(size_t particle_index_i) override { - return (*h_ratio_)[particle_index_i]; + return h_ratio_[particle_index_i]; }; virtual void initializeAdaptationVariables(BaseParticles &base_particles) override; - virtual UniquePtr createCellLinkedList(const BoundingBox &domain_bounds) override; + virtual UniquePtr createCellLinkedList(const BoundingBox &domain_bounds, BaseParticles &base_particles) override; virtual UniquePtr createLevelSet(Shape &shape, Real refinement_ratio) override; protected: @@ -136,7 +140,7 @@ class ParticleRefinementByShape : public ParticleWithLocalRefinement ParticleRefinementByShape(Args &&...args) : ParticleWithLocalRefinement(std::forward(args)...){}; - virtual ~ParticleRefinementByShape(){}; + virtual ~ParticleRefinementByShape() {}; virtual Real getLocalSpacing(Shape &shape, const Vecd &position) = 0; protected: @@ -153,7 +157,7 @@ class ParticleRefinementNearSurface : public ParticleRefinementByShape template ParticleRefinementNearSurface(Args &&...args) : ParticleRefinementByShape(std::forward(args)...){}; - virtual ~ParticleRefinementNearSurface(){}; + virtual ~ParticleRefinementNearSurface() {}; virtual Real getLocalSpacing(Shape &shape, const Vecd &position) override; }; @@ -168,7 +172,7 @@ class ParticleRefinementWithinShape : public ParticleRefinementByShape template ParticleRefinementWithinShape(Args &&...args) : ParticleRefinementByShape(std::forward(args)...){}; - virtual ~ParticleRefinementWithinShape(){}; + virtual ~ParticleRefinementWithinShape() {}; virtual Real getLocalSpacing(Shape &shape, const Vecd &position) override; }; diff --git a/src/shared/adaptations/adaptation.hpp b/src/shared/adaptations/adaptation.hpp new file mode 100644 index 0000000000..431cd59ad5 --- /dev/null +++ b/src/shared/adaptations/adaptation.hpp @@ -0,0 +1,18 @@ +#ifndef ADAPTATION_HPP +#define ADAPTATION_HPP + +#include "adaptation.h" +#include "base_body.h" + +namespace SPH +{ +//=================================================================================================// +template +MeshType SPHAdaptation::createBackGroundMesh(SPHBody &sph_body, Args &&...args) +{ + return MeshType(sph_body.getSPHSystemBounds(), kernel_ptr_->CutOffRadius(), 2, + std::forward(args)...); +} +//=================================================================================================// +} // namespace SPH +#endif // ADAPTATION_HPP \ No newline at end of file diff --git a/src/shared/bodies/base_body.cpp b/src/shared/bodies/base_body.cpp index 0084bf6045..71edccef28 100644 --- a/src/shared/bodies/base_body.cpp +++ b/src/shared/bodies/base_body.cpp @@ -9,7 +9,7 @@ namespace SPH //=================================================================================================// SPHBody::SPHBody(SPHSystem &sph_system, Shape &shape, const std::string &name) : sph_system_(sph_system), body_name_(name), newly_updated_(true), - base_particles_(nullptr), is_bound_set_(false), initial_shape_(&shape), + base_particles_(nullptr), is_bound_set_(false), initial_shape_(&shape), total_body_parts_(0), sph_adaptation_(sph_adaptation_ptr_keeper_.createPtr(sph_system.ReferenceResolution())), base_material_(base_material_ptr_keeper_.createPtr()) { @@ -36,6 +36,12 @@ BoundingBox SPHBody::getSPHSystemBounds() return sph_system_.system_domain_bounds_; } //=================================================================================================// +int SPHBody::getNewBodyPartID() +{ + total_body_parts_++; + return total_body_parts_; +}; +//=================================================================================================// SPHSystem &SPHBody::getSPHSystem() { return sph_system_; @@ -74,24 +80,14 @@ BoundingBox SPHBody::getSPHBodyBounds() return is_bound_set_ ? bound_ : initial_shape_->getBounds(); } //=================================================================================================// -void SPHBody::defineAdaptationRatios(Real h_spacing_ratio, Real new_system_refinement_ratio) -{ - sph_adaptation_->resetAdaptationRatios(h_spacing_ratio, new_system_refinement_ratio); -} -//=================================================================================================// -void SPHBody::writeParticlesToVtuFile(std::ostream &output_file) +void SPHBody::registerComputingKernel(execution::Implementation *implementation) { - base_particles_->writeParticlesToVtk(output_file); + all_simple_reduce_computing_kernels_.push_back(implementation); } //=================================================================================================// -void SPHBody::writeParticlesToVtpFile(std::ofstream &output_file) -{ - base_particles_->writeParticlesToVtk(output_file); -} -//=================================================================================================// -void SPHBody::writeParticlesToPltFile(std::ofstream &output_file) +void SPHBody::defineAdaptationRatios(Real h_spacing_ratio, Real new_system_refinement_ratio) { - base_particles_->writeParticlesToPltFile(output_file); + sph_adaptation_->resetAdaptationRatios(h_spacing_ratio, new_system_refinement_ratio); } //=================================================================================================// void SPHBody::writeParticlesToXmlForRestart(std::string &filefullpath) @@ -113,7 +109,8 @@ BaseCellLinkedList &RealBody::getCellLinkedList() { if (!cell_linked_list_created_) { - cell_linked_list_ptr_ = sph_adaptation_->createCellLinkedList(getSPHSystemBounds()); + cell_linked_list_ptr_ = + sph_adaptation_->createCellLinkedList(getSPHSystemBounds(), *base_particles_); cell_linked_list_created_ = true; } return *cell_linked_list_ptr_.get(); @@ -124,15 +121,4 @@ void RealBody::updateCellLinkedList() getCellLinkedList().UpdateCellLists(*base_particles_); } //=================================================================================================// -void RealBody::updateCellLinkedListWithParticleSort(size_t particle_sorting_period) -{ - if (iteration_count_ % particle_sorting_period == 0) - { - base_particles_->sortParticles(getCellLinkedList()); - } - - iteration_count_++; - updateCellLinkedList(); -} -//=================================================================================================// } // namespace SPH diff --git a/src/shared/bodies/base_body.h b/src/shared/bodies/base_body.h index 46c6b46bf0..81639414a7 100644 --- a/src/shared/bodies/base_body.h +++ b/src/shared/bodies/base_body.h @@ -42,9 +42,9 @@ #include "base_particle_generator.h" #include "base_particles.h" #include "cell_linked_list.h" -#include "particle_sorting.h" -#include "sph_data_containers.h" +#include "execution.h" #include "sph_system.h" +#include "sphinxsys_containers.h" #include @@ -76,6 +76,9 @@ class SPHBody bool is_bound_set_; /**< whether the bounding box is set */ BoundingBox bound_; /**< bounding box of the body */ Shape *initial_shape_; /**< initial volumetric geometry enclosing the body */ + int total_body_parts_; + StdVec *> all_simple_reduce_computing_kernels_; + /**< total number of body parts */ public: SPHAdaptation *sph_adaptation_; /**< numerical adaptation policy */ @@ -106,6 +109,9 @@ class SPHBody void setSPHBodyBounds(const BoundingBox &bound); BoundingBox getSPHBodyBounds(); BoundingBox getSPHSystemBounds(); + void registerComputingKernel(execution::Implementation *implementation); + int getNewBodyPartID(); + int getTotalBodyParts() { return total_body_parts_; }; //---------------------------------------------------------------------- // Object factory template functions //---------------------------------------------------------------------- @@ -171,9 +177,6 @@ class SPHBody generateParticles(particle_reserve, std::forward(args)...); }; - virtual void writeParticlesToVtuFile(std::ostream &output_file); - virtual void writeParticlesToVtpFile(std::ofstream &output_file); - virtual void writeParticlesToPltFile(std::ofstream &output_file); virtual void writeParticlesToXmlForRestart(std::string &filefullpath); virtual void readParticlesFromXmlForRestart(std::string &filefullpath); virtual void writeToXmlForReloadParticle(std::string &filefullpath); @@ -189,21 +192,19 @@ class RealBody : public SPHBody { private: UniquePtr cell_linked_list_ptr_; - size_t iteration_count_; bool cell_linked_list_created_; public: template RealBody(Args &&...args) : SPHBody(std::forward(args)...), - iteration_count_(1), cell_linked_list_created_(false) + cell_linked_list_created_(false) { this->getSPHSystem().addRealBody(this); }; virtual ~RealBody(){}; BaseCellLinkedList &getCellLinkedList(); void updateCellLinkedList(); - void updateCellLinkedListWithParticleSort(size_t particle_sort_period); }; } // namespace SPH #endif // BASE_BODY_H diff --git a/src/shared/bodies/base_body_part.h b/src/shared/bodies/base_body_part.h index 86bb2d65e6..ec490a8b31 100644 --- a/src/shared/bodies/base_body_part.h +++ b/src/shared/bodies/base_body_part.h @@ -45,19 +45,23 @@ class BodyPart { public: BodyPart(SPHBody &sph_body, const std::string &body_part_name) - : sph_body_(sph_body), body_part_name_(body_part_name), + : sph_body_(sph_body), part_id_(sph_body.getNewBodyPartID()), + body_part_name_(body_part_name), base_particles_(sph_body.getBaseParticles()), - pos_(*base_particles_.getVariableDataByName("Position")){}; + pos_(base_particles_.getVariableDataByName("Position")){}; virtual ~BodyPart(){}; SPHBody &getSPHBody() { return sph_body_; }; + SPHSystem &getSPHSystem() { return sph_body_.getSPHSystem(); }; std::string getName() { return body_part_name_; }; + int getPartID() { return part_id_; }; protected: SPHBody &sph_body_; + int part_id_; std::string body_part_name_; BaseParticles &base_particles_; - StdLargeVec &pos_; + Vecd *pos_; }; /** diff --git a/src/shared/bodies/complex_bodies/tree_body.cpp b/src/shared/bodies/complex_bodies/tree_body.cpp index b2032931a8..eddec7a2dd 100644 --- a/src/shared/bodies/complex_bodies/tree_body.cpp +++ b/src/shared/bodies/complex_bodies/tree_body.cpp @@ -20,7 +20,7 @@ void TreeBody::buildParticleConfiguration(ParticleConfiguration &particle_config neighboring_ids.push_back(branches_[1]->inner_particles_[0]); neighboring_ids.push_back(branches_[1]->inner_particles_[1]); /** Build configuration. */ - const StdLargeVec &pos = base_particles_->ParticlePositions(); + Vecd *pos = base_particles_->ParticlePositions(); NeighborBuilderInner neighbor_relation_inner(*this); for (size_t n = 0; n != neighboring_ids.size(); ++n) { diff --git a/src/shared/bodies/complex_bodies/unstructured_mesh.cpp b/src/shared/bodies/complex_bodies/unstructured_mesh.cpp index 1e4b965949..bd2e9078df 100644 --- a/src/shared/bodies/complex_bodies/unstructured_mesh.cpp +++ b/src/shared/bodies/complex_bodies/unstructured_mesh.cpp @@ -10,7 +10,8 @@ BaseInnerRelationInFVM::BaseInnerRelationInFVM(RealBody &real_body, ANSYSMesh &a : BaseInnerRelation(real_body), real_body_(&real_body), node_coordinates_(ansys_mesh.node_coordinates_), mesh_topology_(ansys_mesh.mesh_topology_), - Vol_(*base_particles_.getVariableDataByName("VolumetricMeasure")) + pos_(base_particles_.getVariableDataByName("Position")), + Vol_(base_particles_.getVariableDataByName("VolumetricMeasure")) { subscribeToBody(); inner_configuration_.resize(base_particles_.RealParticlesBound(), Neighborhood()); diff --git a/src/shared/bodies/complex_bodies/unstructured_mesh.h b/src/shared/bodies/complex_bodies/unstructured_mesh.h index 23a98ba734..5ba92073ef 100644 --- a/src/shared/bodies/complex_bodies/unstructured_mesh.h +++ b/src/shared/bodies/complex_bodies/unstructured_mesh.h @@ -73,7 +73,8 @@ class BaseInnerRelationInFVM : public BaseInnerRelation virtual ~BaseInnerRelationInFVM(){}; protected: - StdLargeVec &Vol_; + Vecd *pos_; + Real *Vol_; virtual void resetNeighborhoodCurrentSize() override; }; diff --git a/src/shared/bodies/solid_body.cpp b/src/shared/bodies/solid_body.cpp index 0986b84969..77119253de 100644 --- a/src/shared/bodies/solid_body.cpp +++ b/src/shared/bodies/solid_body.cpp @@ -11,8 +11,8 @@ SolidBodyPartForSimbody:: SolidBodyPartForSimbody(SPHBody &body, Shape &body_part_shape) : BodyRegionByParticle(body, body_part_shape), rho0_(DynamicCast(this, body.base_material_)->ReferenceDensity()), - Vol_(*base_particles_.getVariableDataByName("VolumetricMeasure")), - pos_(*base_particles_.getVariableDataByName("Position")) + Vol_(base_particles_.getVariableDataByName("VolumetricMeasure")), + pos_(base_particles_.getVariableDataByName("Position")) { setMassProperties(); } diff --git a/src/shared/bodies/solid_body.h b/src/shared/bodies/solid_body.h index b4b4eb237f..31b6405b68 100644 --- a/src/shared/bodies/solid_body.h +++ b/src/shared/bodies/solid_body.h @@ -78,8 +78,8 @@ class SolidBodyPartForSimbody : public BodyRegionByParticle protected: Real rho0_; - StdLargeVec &Vol_; - StdLargeVec &pos_; + Real *Vol_; + Vecd *pos_; private: void setMassProperties(); diff --git a/src/shared/body_relations/base_body_relation.cpp b/src/shared/body_relations/base_body_relation.cpp index f60d58730a..bde91d2bde 100644 --- a/src/shared/body_relations/base_body_relation.cpp +++ b/src/shared/body_relations/base_body_relation.cpp @@ -18,8 +18,7 @@ RealBodyVector BodyPartsToRealBodies(BodyPartVector body_parts) //=================================================================================================// SPHRelation::SPHRelation(SPHBody &sph_body) : sph_body_(sph_body), - base_particles_(sph_body.getBaseParticles()), - pos_(*base_particles_.getVariableDataByName("Position")) {} + base_particles_(sph_body.getBaseParticles()) {} //=================================================================================================// BaseInnerRelation::BaseInnerRelation(RealBody &real_body) : SPHRelation(real_body), real_body_(&real_body) @@ -49,6 +48,9 @@ BaseContactRelation::BaseContactRelation(SPHBody &sph_body, RealBodyVector conta contact_configuration_.resize(contact_bodies_.size()); for (size_t k = 0; k != contact_bodies_.size(); ++k) { + const std::string name = contact_bodies_[k]->getName(); + contact_particles_.push_back(&contact_bodies_[k]->getBaseParticles()); + contact_adaptations_.push_back(contact_bodies_[k]->sph_adaptation_); contact_configuration_[k].resize(base_particles_.RealParticlesBound(), Neighborhood()); } } diff --git a/src/shared/body_relations/base_body_relation.h b/src/shared/body_relations/base_body_relation.h index 9ae9db31f3..a348dddc59 100644 --- a/src/shared/body_relations/base_body_relation.h +++ b/src/shared/body_relations/base_body_relation.h @@ -34,6 +34,7 @@ #include "base_geometry.h" #include "base_particles.h" #include "cell_linked_list.h" +#include "execution.h" #include "neighborhood.h" namespace SPH @@ -67,11 +68,11 @@ struct SearchDepthAdaptive { Real inv_grid_spacing_; Kernel *kernel_; - StdLargeVec &h_ratio_; + Real *h_ratio_; SearchDepthAdaptive(SPHBody &sph_body, CellLinkedList *target_cell_linked_list) : inv_grid_spacing_(1.0 / target_cell_linked_list->GridSpacing()), kernel_(sph_body.sph_adaptation_->getKernel()), - h_ratio_(*sph_body.getBaseParticles().getVariableDataByName("SmoothingLengthRatio")){}; + h_ratio_(sph_body.getBaseParticles().getVariableDataByName("SmoothingLengthRatio")){}; int operator()(size_t particle_index) const { return 1 + (int)floor(kernel_->CutOffRadius(h_ratio_[particle_index]) * inv_grid_spacing_); @@ -116,7 +117,6 @@ class SPHRelation protected: SPHBody &sph_body_; BaseParticles &base_particles_; - StdLargeVec &pos_; }; /** @@ -125,15 +125,15 @@ class SPHRelation */ class BaseInnerRelation : public SPHRelation { - protected: - virtual void resetNeighborhoodCurrentSize(); - public: RealBody *real_body_; ParticleConfiguration inner_configuration_; /**< inner configuration for the neighbor relations. */ explicit BaseInnerRelation(RealBody &real_body); virtual ~BaseInnerRelation(){}; BaseInnerRelation &getRelation() { return *this; }; + + protected: + virtual void resetNeighborhoodCurrentSize(); }; /** @@ -147,6 +147,8 @@ class BaseContactRelation : public SPHRelation public: RealBodyVector contact_bodies_; + StdVec contact_particles_; + StdVec contact_adaptations_; StdVec contact_configuration_; /**< Configurations for particle interaction between bodies. */ BaseContactRelation(SPHBody &sph_body, RealBodyVector contact_bodies); @@ -154,6 +156,9 @@ class BaseContactRelation : public SPHRelation : BaseContactRelation(sph_body, BodyPartsToRealBodies(contact_body_parts)){}; virtual ~BaseContactRelation(){}; BaseContactRelation &getRelation() { return *this; }; + RealBodyVector getContactBodies() { return contact_bodies_; }; + StdVec getContactParticles() { return contact_particles_; }; + StdVec getContactAdaptations() { return contact_adaptations_; }; }; } // namespace SPH #endif // BASE_BODY_RELATION_H \ No newline at end of file diff --git a/src/shared/body_relations/contact_body_relation.cpp b/src/shared/body_relations/contact_body_relation.cpp index 7346287f0d..62a5b68fed 100644 --- a/src/shared/body_relations/contact_body_relation.cpp +++ b/src/shared/body_relations/contact_body_relation.cpp @@ -2,7 +2,6 @@ #include "all_particles.h" #include "base_particle_dynamics.h" #include "cell_linked_list.hpp" -#include namespace SPH { diff --git a/src/shared/body_relations/contact_body_relation.h b/src/shared/body_relations/contact_body_relation.h index 1bf23a149e..a37e208280 100644 --- a/src/shared/body_relations/contact_body_relation.h +++ b/src/shared/body_relations/contact_body_relation.h @@ -61,6 +61,7 @@ class ContactRelationCrossResolution : public BaseContactRelation } }; virtual ~ContactRelationCrossResolution(){}; + StdVec getContactCellLinkedList() { return target_cell_linked_lists_; } protected: StdVec target_cell_linked_lists_; diff --git a/src/shared/body_relations/inner_body_relation.h b/src/shared/body_relations/inner_body_relation.h index 1b4c63d096..75925c90af 100644 --- a/src/shared/body_relations/inner_body_relation.h +++ b/src/shared/body_relations/inner_body_relation.h @@ -46,8 +46,9 @@ class InnerRelation : public BaseInnerRelation public: explicit InnerRelation(RealBody &real_body); - virtual ~InnerRelation(){}; + virtual ~InnerRelation() {}; + CellLinkedList &getCellLinkedList() { return cell_linked_list_; }; virtual void updateConfiguration() override; }; @@ -68,7 +69,7 @@ class AdaptiveInnerRelation : public BaseInnerRelation public: explicit AdaptiveInnerRelation(RealBody &real_body); - virtual ~AdaptiveInnerRelation(){}; + virtual ~AdaptiveInnerRelation() {}; virtual void updateConfiguration() override; }; @@ -83,7 +84,7 @@ class SelfSurfaceContactRelation : public BaseInnerRelation BodySurfaceLayer body_surface_layer_; explicit SelfSurfaceContactRelation(RealBody &real_body); - virtual ~SelfSurfaceContactRelation(){}; + virtual ~SelfSurfaceContactRelation() {}; virtual void updateConfiguration() override; protected: @@ -107,7 +108,7 @@ class TreeInnerRelation : public InnerRelation public: explicit TreeInnerRelation(RealBody &real_body); - virtual ~TreeInnerRelation(){}; + virtual ~TreeInnerRelation() {}; virtual void updateConfiguration() override; }; diff --git a/src/shared/common/base_data_package.h b/src/shared/common/base_data_package.h index 6d52130474..d86d55636f 100644 --- a/src/shared/common/base_data_package.h +++ b/src/shared/common/base_data_package.h @@ -50,9 +50,12 @@ using DataContainerAddressKeeper = StdVec; /** Generalized data container unique pointer keeper */ template using DataContainerUniquePtrKeeper = UniquePtrsKeeper; +/** Generalized data container allocated data keeper */ +template +using AllocatedData = DataType *; template