Feature: Feature mesh deformation#2196
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #2196 +/- ##
=======================================
Coverage 79.42% 79.42%
=======================================
Files 115 115
Lines 19285 19285
=======================================
Hits 15318 15318
Misses 3967 3967 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
| @@ -0,0 +1,121 @@ | |||
| #include <fstream> | |||
There was a problem hiding this comment.
Please include the license statement and file documentation
| #include <fstream> | ||
| #include <iostream> | ||
| #include <string> | ||
| #include <algorithm> | ||
| #include <t8_cmesh/t8_cmesh.h> | ||
| #include <t8_cmesh/t8_cmesh.hxx> | ||
| #include <t8_cmesh/t8_cmesh_vertex_connectivity/t8_cmesh_vertex_connectivity.hxx> | ||
| #include <t8_cmesh/t8_cmesh_mesh_deformation/t8_cmesh_mesh_deformation.hxx> | ||
| #include <t8_schemes/t8_default/t8_default.hxx> | ||
| #include <t8_cmesh/t8_cmesh_io/t8_cmesh_readmshfile.h> | ||
| #include <t8_cad/t8_cad_handle.hxx> | ||
| #include <t8_vtk/t8_vtk_writer.h> | ||
| #include <vector> | ||
| #include <array> | ||
| #include <mpi.h> | ||
| #include <unordered_set> | ||
| #include <sc_options.h> |
There was a problem hiding this comment.
Do you really need all those includes?
Can you also split them between t8code and std includes?
| SC_CHECK_MPI (mpiret); | ||
|
|
||
| /* Initialize the sc library, has to happen before we initialize t8code. */ | ||
| sc_init (sc_MPI_COMM_WORLD, 1, 1, NULL, SC_LP_PRODUCTION); |
There was a problem hiding this comment.
| sc_init (sc_MPI_COMM_WORLD, 1, 1, NULL, SC_LP_PRODUCTION); | |
| sc_init (sc_MPI_COMM_WORLD, 1, 1, NULL, SC_LP_ESSENTIAL); |
| /** Update the CAD manager with a new one. | ||
| * \param[in] new_cad_handle The new CAD handle to be used. | ||
| */ |
There was a problem hiding this comment.
| /** Update the CAD manager with a new one. | |
| * \param[in] new_cad_handle The new CAD handle to be used. | |
| */ | |
| /** Update the CAD handle with a new one. | |
| * \param[in] new_cad_handle The new CAD handle to be used. | |
| */ |
| t8_forest/t8_forest_partition_for_coarsening.cxx | ||
| t8_forest/t8_forest_pfc_helper.cxx | ||
| t8_forest/t8_forest.cxx | ||
| t8_forest/t8_forest.cxx |
There was a problem hiding this comment.
| t8_forest/t8_forest.cxx | |
| t8_forest/t8_forest.cxx |
| /* Moving plane loop */ | ||
| while (adapt_data.t < steps) { | ||
| /* Adapt and balance the forest. | ||
| /* Adapt and balance the forest. |
There was a problem hiding this comment.
| /* Adapt and balance the forest. | |
| /* Adapt and balance the forest. |
| #include <t8_geometry/t8_geometry_implementations/t8_geometry_cad.hxx> /* Curved geometry calculation of trees */ | ||
| #include <t8_cmesh/t8_cmesh_mesh_deformation/t8_cmesh_mesh_deformation.hxx> /* Mesh deformation struct */ | ||
| #include <t8_cad/t8_cad_handle.hxx> /* CAD data structure */ |
There was a problem hiding this comment.
| #include <t8_geometry/t8_geometry_implementations/t8_geometry_cad.hxx> /* Curved geometry calculation of trees */ | |
| #include <t8_cmesh/t8_cmesh_mesh_deformation/t8_cmesh_mesh_deformation.hxx> /* Mesh deformation struct */ | |
| #include <t8_cad/t8_cad_handle.hxx> /* CAD data structure */ | |
| #include <t8_geometry/t8_geometry_implementations/t8_geometry_cad.hxx> /* Curved geometry calculation of trees */ |
| @@ -0,0 +1,156 @@ | |||
|
|
|||
| sc_options_destroy (opt); | ||
|
|
||
| #else | ||
| t8_global_productionf ("\n\t ERROR: This example requires OpenCASCADE support to be enabled in t8code.\n\n"); |
There was a problem hiding this comment.
| t8_global_productionf ("\n\t ERROR: This example requires OpenCASCADE support to be enabled in t8code.\n\n"); | |
| t8_global_errorf ("ERROR: This example requires OpenCASCADE support to be enabled in t8code.\n"); |
| /* Cleanup. */ | ||
| t8_forest_unref (&forest); | ||
|
|
||
| std::cout << "Mesh deformation completed." << std::endl; |
There was a problem hiding this comment.
| std::cout << "Mesh deformation completed." << std::endl; | |
| t8_global_productionf ("Mesh deformation completed."); |
| /* The usage string or help message was truncated */ | ||
| /* Note: gcc >= 7.1 prints a warning if we | ||
| * do not check the return value of snprintf. */ | ||
| t8_debugf ("Warning: Truncated usage string and help message to '%s' and '%s'\n", usage, help); |
There was a problem hiding this comment.
| t8_debugf ("Warning: Truncated usage string and help message to '%s' and '%s'\n", usage, help); | |
| t8_debugf ("WARNING: Truncated usage string and help message to '%s' and '%s'\n", usage, help); |
| /* Initialize t8code with log level SC_LP_ESSENTIAL. See sc.h for more info on the log levels. */ | ||
| t8_init (SC_LP_ESSENTIAL); | ||
|
|
||
| #ifdef T8CODE_ENABLE_OCC |
There was a problem hiding this comment.
| #ifdef T8CODE_ENABLE_OCC | |
| #if T8CODE_ENABLE_OCC |
| int dim = 0; | ||
| int level = 2; |
There was a problem hiding this comment.
The default values are assigned by the options
| int dim = 0; | |
| int level = 2; | |
| int dim, level; |
| #if T8CODE_ENABLE_OCC | ||
| #include <t8_cad/t8_cad_handle.hxx> | ||
| #include <t8_cmesh/t8_cmesh_mesh_deformation/t8_cmesh_mesh_deformation.hxx> | ||
| #endif |
There was a problem hiding this comment.
| #endif | |
| #endif /* T8CODE_ENABLE_OCC */ |
| mpiret = sc_MPI_Finalize (); | ||
| SC_CHECK_MPI (mpiret); | ||
|
|
||
| #else |
There was a problem hiding this comment.
| #else | |
| #else /* !T8CODE_ENABLE_OCC */ |
|
|
||
| #else | ||
| t8_global_errorf ("ERROR: This example requires OpenCASCADE support to be enabled in t8code.\n\n"); | ||
| #endif |
There was a problem hiding this comment.
| #endif | |
| #endif /* T8CODE_ENABLE_OCC */ |
| SC_CHECK_MPI (mpiret); | ||
|
|
||
| #else | ||
| t8_global_errorf ("ERROR: This example requires OpenCASCADE support to be enabled in t8code.\n\n"); |
There was a problem hiding this comment.
| t8_global_errorf ("ERROR: This example requires OpenCASCADE support to be enabled in t8code.\n\n"); | |
| t8_global_errorf ("ERROR: This example requires OpenCASCADE support to be enabled in t8code.\n"); |
| #if T8_ENABLE_DEBUG | ||
| /* Iterate over all trees and compare to the reference tree. */ | ||
| for (const auto &[tree_id, local_corner_index] : tree_list) { | ||
|
|
||
| const int *geom_attribute = static_cast<const int *> ( | ||
| t8_cmesh_get_attribute (associated_cmesh, t8_get_package_id (), T8_CMESH_NODE_GEOMETRY_ATTRIBUTE_KEY, tree_id)); | ||
|
|
||
| const int entity_dim = geom_attribute[2 * local_corner_index]; | ||
| const int entity_tag = geom_attribute[2 * local_corner_index + 1]; | ||
|
|
||
| /* Check if the attribute of the vertex is the same in all trees. */ | ||
| if (!(entity_dim == first_tree_entity_dim && entity_tag == first_tree_entity_tag)) { | ||
| t8_errorf ( | ||
| "Error: Inconsistent entity info for global vertex %li: tree %d: dim=%d tag=%d, expected dim=%d tag=%d\n", | ||
| global_vertex_id, tree_id, entity_dim, entity_tag, first_tree_entity_dim, first_tree_entity_tag); | ||
| SC_ABORTF ("Inconsistency in vertex info.\n"); | ||
| } | ||
| } | ||
| #endif /*T8_ENABLE_DEBUG */ |
There was a problem hiding this comment.
Can you add a comment at the start explaining what this check does?
| /* Initialize t8code with log level SC_LP_ESSENTIAL. See sc.h for more info on the log levels. */ | ||
| t8_init (SC_LP_ESSENTIAL); |
There was a problem hiding this comment.
With this log level your t8_productionf prints wont work.
| /* Initialize t8code with log level SC_LP_ESSENTIAL. See sc.h for more info on the log levels. */ | |
| t8_init (SC_LP_ESSENTIAL); | |
| /* Initialize t8code with log level SC_LP_PRODUCTION. See sc.h for more info on the log levels. */ | |
| t8_init (SC_LP_PRODUCTION); |
| t8_global_errorf ("ERROR: Invalid mesh dimension: dim=%d. Dimension must be 1, 2 or 3.\n\n", dim); | ||
| sc_options_print_usage (t8_get_package_id (), SC_LP_ERROR, opt, NULL); | ||
| } | ||
| else if (parsed >= 0) { |
There was a problem hiding this comment.
What would happen if parsed was -1? The program would terminate and the user has no clue why
| else if (parsed >= 0) { | |
| else { |
| t8_global_productionf ("%s\n", help); | ||
| sc_options_print_usage (t8_get_package_id (), SC_LP_ERROR, opt, NULL); | ||
| } | ||
| else if (msh_file == NULL || brep_file == NULL || dim == 0) { |
There was a problem hiding this comment.
if the user provides unknown options this also is a wrong usage
| else if (msh_file == NULL || brep_file == NULL || dim == 0) { | |
| else if (msh_file == NULL || brep_file == NULL || dim == 0 || parsed >= 0) { |
| sc_options_print_usage (t8_get_package_id (), SC_LP_ERROR, opt, NULL); | ||
| } | ||
| else if (msh_file == NULL || brep_file == NULL || dim == 0) { | ||
| t8_global_errorf ("ERROR: Missing required arguments: -m, -b, and -d are mandatory.\n\n"); |
There was a problem hiding this comment.
We would have to keep this list updated twice, once in the options and once in this message. But the list is also in the usage you print in the next line
| t8_global_errorf ("ERROR: Missing required arguments: -m, -b, and -d are mandatory.\n\n"); | |
| t8_global_errorf ("\n\t ERROR: Wrong usage.\n\n"); |
| /* Check if the coordinates are available. */ | ||
| if (old_coords == nullptr) { | ||
| t8_errorf ("Error: Coordinates attribute missing for tree %d\n.", first_tree_id); | ||
| SC_ABORTF ("Vertex coordinates are missing."); |
There was a problem hiding this comment.
| SC_ABORTF ("Vertex coordinates are missing."); | |
| SC_ABORTF ("Vertex coordinates are missing.\n"); |
| /* Check if the (u,v)-parameters are available. */ | ||
| if (uv_attribute == nullptr) { | ||
| t8_errorf ("Error: (u,v)-parameters are missing for tree %d\n.", first_tree_id); | ||
| SC_ABORT ("(u,v)-parameters are missing."); |
There was a problem hiding this comment.
| SC_ABORT ("(u,v)-parameters are missing."); | |
| SC_ABORT ("(u,v)-parameters are missing.\n"); |
| /* Check if the geometry attribute is available for this tree. */ | ||
| if (first_tree_geom_attribute == nullptr) { | ||
| t8_errorf ("Error: Geometry attribute missing for tree %d\n.", first_tree_id); | ||
| SC_ABORTF ("Geometry attribute is missing."); |
There was a problem hiding this comment.
| SC_ABORTF ("Geometry attribute is missing."); | |
| SC_ABORTF ("Geometry attribute is missing.\n"); |
Closes #2197
Describe your changes here:
Added mesh deformation support using the new t8_cmesh_mesh_deformation files. This allows moving mesh vertices to new positions defined by a CAD geometry.
The calculation is currently done by focusing on surface vertices and comparing their current locations with the target CAD shape. The displacement for internal vertices is not yet included. A new example, t8_cmesh_mesh_deformation_example.cxx, was added to show how the deformation works.
All these boxes must be checked by the AUTHOR before requesting review:
Documentation:,Bugfix:,Feature:,Improvement:orOther:.All these boxes must be checked by the REVIEWERS before merging the pull request:
As a reviewer please read through all the code lines and make sure that the code is fully understood, bug free, well-documented and well-structured.
General
Tests
If the Pull request introduces code that is not covered by the github action (for example coupling with a new library):
Scripts and Wiki
script/find_all_source_files.scpto check the indentation of these files.License
doc/(or already has one).