diff --git a/src/shared/discrete_variable/base_variables.h b/src/shared/discrete_variable/base_variables.h index 22c02f10d5..b3c346c63c 100644 --- a/src/shared/discrete_variable/base_variables.h +++ b/src/shared/discrete_variable/base_variables.h @@ -24,7 +24,7 @@ * @file base_variables.h * @brief Here gives classes for the base variables used in simulation. * @details These variables are those discretized in spaces and time. - * @author Xiangyu Hu + * @author Chenxi Zhao and Xiangyu Hu */ #ifndef BASE_VARIABLES_H diff --git a/src/shared/particle_dynamics/base_local_dynamics.h b/src/shared/particle_dynamics/base_local_dynamics.h index 330b176bc2..25f37264af 100644 --- a/src/shared/particle_dynamics/base_local_dynamics.h +++ b/src/shared/particle_dynamics/base_local_dynamics.h @@ -24,7 +24,7 @@ * @file base_local_dynamics.h * @brief This is for the base classes of local particle dynamics, which describe the * dynamics of a particle and it neighbors. - * @author Chi ZHang and Xiangyu Hu + * @author Chi Zhang, Chenxi Zhao and Xiangyu Hu */ #ifndef BASE_LOCAL_DYNAMICS_H diff --git a/src/shared/particle_dynamics/diffusion_reaction_dynamics/diffusion_dynamics.h b/src/shared/particle_dynamics/diffusion_reaction_dynamics/diffusion_dynamics.h index 784d786c3d..95de542c98 100644 --- a/src/shared/particle_dynamics/diffusion_reaction_dynamics/diffusion_dynamics.h +++ b/src/shared/particle_dynamics/diffusion_reaction_dynamics/diffusion_dynamics.h @@ -24,7 +24,7 @@ * @file diffusion_dynamics.h * @brief This is the particle dynamics applicable for all type bodies * TODO: there is an issue on applying corrected configuration for contact bodies.. - * @author Chi Zhang and Xiangyu Hu + * @author Chi Zhang, Chenxi Zhao and Xiangyu Hu */ #ifndef DIFFUSION_DYNAMICS_H diff --git a/src/shared/particles/base_particles.h b/src/shared/particles/base_particles.h index 0d1b37f395..a296d734ae 100644 --- a/src/shared/particles/base_particles.h +++ b/src/shared/particles/base_particles.h @@ -25,7 +25,7 @@ * @brief This is the base class of SPH particles. The basic data of the particles * is saved in separated large vectors. Each derived class will introduce several extra * vectors for the new data. Note that there is no class of single particle. - * @author Chi ZHang and Xiangyu Hu + * @author Chi Zhang, Chenxi Zhao and Xiangyu Hu */ #ifndef BASE_PARTICLES_H diff --git a/tests/2d_examples/test_2d_diffusion_NeumannBC/diffusion_NeumannBC.cpp b/tests/2d_examples/test_2d_diffusion_NeumannBC/diffusion_NeumannBC.cpp index 6a7948422d..fa4ee08806 100644 --- a/tests/2d_examples/test_2d_diffusion_NeumannBC/diffusion_NeumannBC.cpp +++ b/tests/2d_examples/test_2d_diffusion_NeumannBC/diffusion_NeumannBC.cpp @@ -1,7 +1,7 @@ /** - * @file 2d_diffusion_test_with_NeumannBC.cpp - * @brief 2D diffusion test of diffusion problem with Neumann boundary condition. - * @details This is a case to implement Neumann boundary condition. + * @file diffusion_NeumannBC.cpp + * @brief 2D test of diffusion problem with Neumann boundary condition. + * @details This is the first case to validate multiple boundary conditions. * @author Chenxi Zhao, Bo Zhang, Chi Zhang and Xiangyu Hu */ #include "diffusion_NeumannBC.h" @@ -46,7 +46,6 @@ int main(int ac, char *av[]) ContactRelation diffusion_body_contact_Dirichlet(diffusion_body, {&wall_boundary_Dirichlet}); ContactRelation diffusion_body_contact_Neumann(diffusion_body, {&wall_boundary_Neumann}); - ContactRelation wall_boundary_contact_Neumann(wall_boundary_Neumann, {&diffusion_body}); ContactRelation temperature_observer_contact(temperature_observer, {&diffusion_body}); //---------------------------------------------------------------------- @@ -61,6 +60,8 @@ int main(int ac, char *av[]) SimpleDynamics setup_boundary_condition_Dirichlet(wall_boundary_Dirichlet); SimpleDynamics setup_boundary_condition_Neumann(wall_boundary_Neumann); + InteractionDynamics correct_configuration(diffusion_body_inner_relation); + SimpleDynamics diffusion_body_normal_direction(diffusion_body); SimpleDynamics wall_boundary_normal_direction(wall_boundary_Neumann); //---------------------------------------------------------------------- @@ -77,6 +78,8 @@ int main(int ac, char *av[]) sph_system.initializeSystemCellLinkedLists(); sph_system.initializeSystemConfigurations(); + correct_configuration.exec(); + setup_diffusion_initial_condition.exec(); setup_boundary_condition_Dirichlet.exec(); diff --git a/tests/2d_examples/test_2d_diffusion_NeumannBC/diffusion_NeumannBC.h b/tests/2d_examples/test_2d_diffusion_NeumannBC/diffusion_NeumannBC.h index fa366458bc..54cb41eb1d 100644 --- a/tests/2d_examples/test_2d_diffusion_NeumannBC/diffusion_NeumannBC.h +++ b/tests/2d_examples/test_2d_diffusion_NeumannBC/diffusion_NeumannBC.h @@ -1,10 +1,10 @@ /** - * @file 2d_diffusion_test_with_NeumannBC.h - * @brief This is the head files used by 2d_diffusion_test_with_NeumannBC.cpp. + * @file diffusion_NeumannBC.h + * @brief This is the head files used by diffusion_NeumannBC.cpp. * @author Chenxi Zhao, Bo Zhang, Chi Zhang and Xiangyu Hu */ -#ifndef DIFFUSION_TEST_WITH_NEUMANNBC_H -#define DIFFUSION_TEST_WITH_NEUMANNBC_H +#ifndef DIFFUSION_NEUMANNBC_H +#define DIFFUSION_NEUMANNBC_H #include "sphinxsys.h" using namespace SPH; @@ -213,4 +213,4 @@ class TemperatureObserverParticleGenerator : public ObserverParticleGenerator } } }; -#endif // DIFFUSION_TEST_WITH_NEUMANNBC_H \ No newline at end of file +#endif // DIFFUSION_NEUMANNBC_H \ No newline at end of file diff --git a/tests/2d_examples/test_2d_diffusion_NeumannBC/regression_test_tool/TemperatureObserver_Phi.xml b/tests/2d_examples/test_2d_diffusion_NeumannBC/regression_test_tool/TemperatureObserver_Phi.xml index b4798650c0..c85e88f1b3 100644 --- a/tests/2d_examples/test_2d_diffusion_NeumannBC/regression_test_tool/TemperatureObserver_Phi.xml +++ b/tests/2d_examples/test_2d_diffusion_NeumannBC/regression_test_tool/TemperatureObserver_Phi.xml @@ -1,14 +1,14 @@ - - - - - - - - - - + + + + + + + + + + diff --git a/tests/2d_examples/test_2d_diffusion_NeumannBC/regression_test_tool/TemperatureObserver_Phi_ensemble_averaged_mean_variance.xml b/tests/2d_examples/test_2d_diffusion_NeumannBC/regression_test_tool/TemperatureObserver_Phi_ensemble_averaged_mean_variance.xml index 1a1447482a..51ab4a5108 100644 --- a/tests/2d_examples/test_2d_diffusion_NeumannBC/regression_test_tool/TemperatureObserver_Phi_ensemble_averaged_mean_variance.xml +++ b/tests/2d_examples/test_2d_diffusion_NeumannBC/regression_test_tool/TemperatureObserver_Phi_ensemble_averaged_mean_variance.xml @@ -2,28 +2,28 @@ - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + diff --git a/tests/2d_examples/test_2d_diffusion_NeumannBC/regression_test_tool/TemperatureObserver_Phi_result.xml b/tests/2d_examples/test_2d_diffusion_NeumannBC/regression_test_tool/TemperatureObserver_Phi_result.xml index bb5c2c6570..f8d6d69c82 100644 --- a/tests/2d_examples/test_2d_diffusion_NeumannBC/regression_test_tool/TemperatureObserver_Phi_result.xml +++ b/tests/2d_examples/test_2d_diffusion_NeumannBC/regression_test_tool/TemperatureObserver_Phi_result.xml @@ -2,80 +2,80 @@ - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + diff --git a/tests/2d_examples/test_2d_diffusion_NeumannBC/regression_test_tool/regression_test_tool.py b/tests/2d_examples/test_2d_diffusion_NeumannBC/regression_test_tool/regression_test_tool.py index 8b4b1a4b20..04b32db0be 100644 --- a/tests/2d_examples/test_2d_diffusion_NeumannBC/regression_test_tool/regression_test_tool.py +++ b/tests/2d_examples/test_2d_diffusion_NeumannBC/regression_test_tool/regression_test_tool.py @@ -7,10 +7,10 @@ from regression_test_base_tool import SphinxsysRegressionTest """ -case name: 2d_diffusion_test_with_NeumannBC +case name: test_2d_diffusion_NeumannBC """ -case_name = "2d_diffusion_test_with_NeumannBC" +case_name = "test_2d_diffusion_NeumannBC" body_name = "DiffusionBody" parameter_name = "TemperatureObserver" diff --git a/tests/user_examples/test_2d_advection_diffusion/CMakeLists.txt b/tests/user_examples/test_2d_advection_diffusion/CMakeLists.txt new file mode 100644 index 0000000000..f556a1622e --- /dev/null +++ b/tests/user_examples/test_2d_advection_diffusion/CMakeLists.txt @@ -0,0 +1,23 @@ +STRING(REGEX REPLACE ".*/(.*)" "\\1" CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR}) +PROJECT("${CURRENT_FOLDER}") + +SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) +SET(EXECUTABLE_OUTPUT_PATH "${PROJECT_BINARY_DIR}/bin/") +SET(BUILD_INPUT_PATH "${EXECUTABLE_OUTPUT_PATH}/input") +SET(BUILD_RELOAD_PATH "${EXECUTABLE_OUTPUT_PATH}/reload") + +file(MAKE_DIRECTORY ${BUILD_INPUT_PATH}) +file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/regression_test_tool/ + DESTINATION ${BUILD_INPUT_PATH}) + +add_executable(${PROJECT_NAME}) +aux_source_directory(. DIR_SRCS) +target_sources(${PROJECT_NAME} PRIVATE ${DIR_SRCS}) +target_link_libraries(${PROJECT_NAME} extra_sources_2d) +set_target_properties(${PROJECT_NAME} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${EXECUTABLE_OUTPUT_PATH}") + +add_test(NAME ${PROJECT_NAME} + COMMAND ${PROJECT_NAME} + WORKING_DIRECTORY ${EXECUTABLE_OUTPUT_PATH}) + +set_tests_properties(${PROJECT_NAME} PROPERTIES LABELS "diffusion reaction") \ No newline at end of file diff --git a/tests/user_examples/test_2d_diffusion_RobinBC/test_2d_diffusion_RobinBC.cpp b/tests/user_examples/test_2d_advection_diffusion/advection_diffusion.cpp similarity index 96% rename from tests/user_examples/test_2d_diffusion_RobinBC/test_2d_diffusion_RobinBC.cpp rename to tests/user_examples/test_2d_advection_diffusion/advection_diffusion.cpp index 5b8b6fc29d..6824da0e17 100644 --- a/tests/user_examples/test_2d_diffusion_RobinBC/test_2d_diffusion_RobinBC.cpp +++ b/tests/user_examples/test_2d_advection_diffusion/advection_diffusion.cpp @@ -1,11 +1,11 @@ /** - * @file test_2d_diffusion_RobinBC.cpp - * @brief 2D diffusion test of diffusion problem with Neumann boundary condition. - * @details This is a case to implement Neumann boundary condition. - * @author Chenxi Zhao, Bo Zhang, Chi Zhang and Xiangyu Hu + * @file advection_diffusion.cpp + * @brief + * @details + * @author Chenxi Zhao and Xiangyu Hu */ #include "sphinxsys.h" -#include "test_2d_diffusion_RobinBC.h" +#include "advection_diffusion.h" using namespace SPH; //Namespace cite here //---------------------------------------------------------------------- diff --git a/tests/user_examples/test_2d_advection_diffusion/advection_diffusion.h b/tests/user_examples/test_2d_advection_diffusion/advection_diffusion.h new file mode 100644 index 0000000000..5abda47112 --- /dev/null +++ b/tests/user_examples/test_2d_advection_diffusion/advection_diffusion.h @@ -0,0 +1,227 @@ +/** + * @file test_2d_advection_diffusion.h + * @brief This is the head files used by test_2d_advection_diffusion.cpp. + * @author Chenxi Zhao and Xiangyu Hu + */ +#ifndef ADVECTION_DIFFUSION_H +#define ADVECTION_DIFFUSION_H + +#include "sphinxsys.h" +using namespace SPH; + +//---------------------------------------------------------------------- +// Basic geometry parameters and numerical setup. +//---------------------------------------------------------------------- +Real L = 1.0; +Real H = 1.0; +Real resolution_ref = H / 100.0; +Real BW = resolution_ref * 2.0; +BoundingBox system_domain_bounds(Vec2d(-BW, -BW), Vec2d(L + BW, H + BW)); +//---------------------------------------------------------------------- +// Basic parameters for material properties. +//---------------------------------------------------------------------- +Real diffusion_coff = 1; +std::array species_name_list{ "Phi" }; +//---------------------------------------------------------------------- +// Initial and boundary conditions. +//---------------------------------------------------------------------- +Real initial_temperature = 100.0; +Real left_temperature = 300.0; +Real right_temperature = 350.0; +Real convection = 100.0; +Real T_infinity = 400.0; +//---------------------------------------------------------------------- +// Geometric shapes used in the system. +//---------------------------------------------------------------------- +std::vector createThermalDomain() +{ + std::vector thermalDomainShape; + thermalDomainShape.push_back(Vecd(0.0, 0.0)); + thermalDomainShape.push_back(Vecd(0.0, H)); + thermalDomainShape.push_back(Vecd(L, H)); + thermalDomainShape.push_back(Vecd(L, 0.0)); + thermalDomainShape.push_back(Vecd(0.0, 0.0)); + + return thermalDomainShape; +} + +std::vector left_temperature_region +{ + Vecd(0.3 * L, H), Vecd(0.3 * L, H + BW), Vecd(0.4 * L, H + BW), + Vecd(0.4 * L, H), Vecd(0.3 * L, H) +}; + +std::vector right_temperature_region +{ + Vecd(0.6 * L, H), Vecd(0.6 * L, H + BW), Vecd(0.7 * L, H + BW), + Vecd(0.7 * L, H), Vecd(0.6 * L, H) +}; + +std::vector convection_region +{ + Vecd(0.45 * L, -BW), Vecd(0.45 * L, 0), Vecd(0.55 * L, 0), + Vecd(0.55 * L, -BW), Vecd(0.45 * L, -BW) +}; + +//---------------------------------------------------------------------- +// Define SPH bodies. +//---------------------------------------------------------------------- +class DiffusionBody : public MultiPolygonShape +{ +public: + explicit DiffusionBody(const std::string& shape_name) : MultiPolygonShape(shape_name) + { + multi_polygon_.addAPolygon(createThermalDomain(), ShapeBooleanOps::add); + } +}; + +class DirichletWallBoundary : public MultiPolygonShape +{ +public: + explicit DirichletWallBoundary(const std::string& shape_name) : MultiPolygonShape(shape_name) + { + multi_polygon_.addAPolygon(left_temperature_region, ShapeBooleanOps::add); + multi_polygon_.addAPolygon(right_temperature_region, ShapeBooleanOps::add); + } +}; + +class RobinWallBoundary : public MultiPolygonShape +{ +public: + explicit RobinWallBoundary(const std::string& shape_name) : MultiPolygonShape(shape_name) + { + multi_polygon_.addAPolygon(convection_region, ShapeBooleanOps::add); + } +}; +//---------------------------------------------------------------------- +// Setup diffusion material properties. +//---------------------------------------------------------------------- +class DiffusionMaterial : public DiffusionReaction +{ +public: + DiffusionMaterial() : DiffusionReaction({ "Phi" }, SharedPtr()) + { + initializeAnDiffusion("Phi", "Phi", diffusion_coff); + } +}; +using DiffusionParticles = DiffusionReactionParticles; +using WallParticles = DiffusionReactionParticles; +//---------------------------------------------------------------------- +// Application dependent initial condition. +//---------------------------------------------------------------------- +class DiffusionInitialCondition + : public DiffusionReactionInitialCondition +{ +protected: + size_t phi_; + +public: + explicit DiffusionInitialCondition(SPHBody& sph_body) + : DiffusionReactionInitialCondition(sph_body) + { + phi_ = particles_->diffusion_reaction_material_.AllSpeciesIndexMap()["Phi"]; + }; + + void update(size_t index_i, Real dt) + { + all_species_[phi_][index_i] = initial_temperature; + }; +}; + +class DirichletWallBoundaryInitialCondition + : public DiffusionReactionInitialCondition +{ +protected: + size_t phi_; + +public: + DirichletWallBoundaryInitialCondition(SolidBody& diffusion_body) : + DiffusionReactionInitialCondition(diffusion_body) + { + phi_ = particles_->diffusion_reaction_material_.AllSpeciesIndexMap()["Phi"]; + } + + void update(size_t index_i, Real dt) + { + all_species_[phi_][index_i] = -0.0; + + if (pos_[index_i][1] > H && pos_[index_i][0] > 0.3 * L && pos_[index_i][0] < 0.4 * L) + { + all_species_[phi_][index_i] = left_temperature; + } + if (pos_[index_i][1] > H && pos_[index_i][0] > 0.6 * L && pos_[index_i][0] < 0.7 * L) + { + all_species_[phi_][index_i] = right_temperature; + } + } +}; + +class RobinWallBoundaryInitialCondition + : public DiffusionReactionInitialCondition +{ +protected: + size_t phi_; + StdLargeVec& convection_; + Real& T_infinity_; + +public: + RobinWallBoundaryInitialCondition(SolidBody& diffusion_body) : + DiffusionReactionInitialCondition(diffusion_body), + convection_(*(this->particles_->template getVariableByName("Convection"))), + T_infinity_(*(this->particles_->template getGlobalVariableByName("T_infinity"))) + { + phi_ = particles_->diffusion_reaction_material_.AllSpeciesIndexMap()["Phi"]; + } + + void update(size_t index_i, Real dt) + { + all_species_[phi_][index_i] = -0.0; + + if (pos_[index_i][1] < 0 && pos_[index_i][0] > 0.45 * L && pos_[index_i][0] < 0.55 * L) + { + convection_[index_i] = convection; + T_infinity_ = T_infinity; + } + } +}; + +using SolidDiffusionInner = DiffusionRelaxationInner; +using SolidDiffusionDirichlet = DiffusionRelaxationDirichlet; +using SolidDiffusionRobin = DiffusionRelaxationRobin; +//---------------------------------------------------------------------- +// Specify diffusion relaxation method. +//---------------------------------------------------------------------- +class DiffusionBodyRelaxation + : public DiffusionRelaxationRK2> +{ +public: + explicit DiffusionBodyRelaxation(BaseInnerRelation& inner_relation, + BaseContactRelation& body_contact_relation_Dirichlet, + BaseContactRelation& body_contact_relation_Robin) + : DiffusionRelaxationRK2>( + inner_relation, body_contact_relation_Dirichlet, body_contact_relation_Robin) {}; + virtual ~DiffusionBodyRelaxation() {}; +}; +//---------------------------------------------------------------------- +// An observer body to measure temperature at given positions. +//---------------------------------------------------------------------- +class TemperatureObserverParticleGenerator : public ObserverParticleGenerator +{ +public: + TemperatureObserverParticleGenerator(SPHBody& sph_body) : ObserverParticleGenerator(sph_body) + { + /** A line of measuring points at the middle line. */ + size_t number_of_observation_points = 5; + Real range_of_measure = L; + Real start_of_measure = 0; + + for (size_t i = 0; i < number_of_observation_points; ++i) + { + Vec2d point_coordinate(0.5 * L, range_of_measure * Real(i) / + Real(number_of_observation_points - 1) + + start_of_measure); + positions_.push_back(point_coordinate); + } + } +}; +#endif //DIFFUSION_TEST_WITH_NEUMANNBC_H \ No newline at end of file diff --git a/tests/user_examples/test_2d_advection_diffusion/regression_test_tool/TemperatureObserver_Phi.xml b/tests/user_examples/test_2d_advection_diffusion/regression_test_tool/TemperatureObserver_Phi.xml new file mode 100644 index 0000000000..59c684b3c5 --- /dev/null +++ b/tests/user_examples/test_2d_advection_diffusion/regression_test_tool/TemperatureObserver_Phi.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/tests/user_examples/test_2d_advection_diffusion/regression_test_tool/TemperatureObserver_Phi_ensemble_averaged_mean_variance.xml b/tests/user_examples/test_2d_advection_diffusion/regression_test_tool/TemperatureObserver_Phi_ensemble_averaged_mean_variance.xml new file mode 100644 index 0000000000..56574afbfb --- /dev/null +++ b/tests/user_examples/test_2d_advection_diffusion/regression_test_tool/TemperatureObserver_Phi_ensemble_averaged_mean_variance.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/user_examples/test_2d_advection_diffusion/regression_test_tool/TemperatureObserver_Phi_result.xml b/tests/user_examples/test_2d_advection_diffusion/regression_test_tool/TemperatureObserver_Phi_result.xml new file mode 100644 index 0000000000..4c3efde64f --- /dev/null +++ b/tests/user_examples/test_2d_advection_diffusion/regression_test_tool/TemperatureObserver_Phi_result.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/user_examples/test_2d_advection_diffusion/regression_test_tool/TemperatureObserver_Phi_runtimes.dat b/tests/user_examples/test_2d_advection_diffusion/regression_test_tool/TemperatureObserver_Phi_runtimes.dat new file mode 100644 index 0000000000..0320826438 --- /dev/null +++ b/tests/user_examples/test_2d_advection_diffusion/regression_test_tool/TemperatureObserver_Phi_runtimes.dat @@ -0,0 +1,3 @@ +true +6 +5 \ No newline at end of file diff --git a/tests/user_examples/test_2d_advection_diffusion/regression_test_tool/regression_test_tool.py b/tests/user_examples/test_2d_advection_diffusion/regression_test_tool/regression_test_tool.py new file mode 100644 index 0000000000..c85a815a81 --- /dev/null +++ b/tests/user_examples/test_2d_advection_diffusion/regression_test_tool/regression_test_tool.py @@ -0,0 +1,37 @@ +# !/usr/bin/env python3 +import os +import sys + +path = os.path.abspath('../../../../../PythonScriptStore/RegressionTest') +sys.path.append(path) +from regression_test_base_tool import SphinxsysRegressionTest + +""" +case name: test_2d_advection_diffusion +""" + +case_name = "test_2d_advection_diffusion" +body_name = "DiffusionBody" +parameter_name = "TemperatureObserver" + +number_of_run_times = 0 +converged = 0 +sphinxsys = SphinxsysRegressionTest(case_name, body_name, parameter_name) + + +while True: + print("Now start a new run......") + sphinxsys.run_case() + number_of_run_times += 1 + converged = sphinxsys.read_dat_file() + print("Please note: This is the", number_of_run_times, "run!") + if number_of_run_times <= 200: + if (converged == "true") and (converged_1 == "true"): + print("The tested parameters of all variables are converged, and the run will stop here!") + break + elif converged != "true": + print("The tested parameters of", sphinxsys.sphinxsys_parameter_name, "are not converged!") + continue + else: + print("It's too many runs but still not converged, please try again!") + break diff --git a/tests/user_examples/test_2d_diffusion_RobinBC/diffusion_RobinBC.cpp b/tests/user_examples/test_2d_diffusion_RobinBC/diffusion_RobinBC.cpp new file mode 100644 index 0000000000..1b19399d37 --- /dev/null +++ b/tests/user_examples/test_2d_diffusion_RobinBC/diffusion_RobinBC.cpp @@ -0,0 +1,164 @@ +/** + * @file diffusion_RobinBC.cpp + * @brief 2D test of diffusion problem with Robin boundary condition. + * @details This is the first case to implement global variables registed on particles. + * @author Chenxi Zhao, Bo Zhang, Chi Zhang and Xiangyu Hu + */ +#include "sphinxsys.h" +#include "diffusion_RobinBC.h" + +using namespace SPH; //Namespace cite here +//---------------------------------------------------------------------- +// Main program starts here. +//---------------------------------------------------------------------- +int main(int ac, char* av[]) +{ + //---------------------------------------------------------------------- + // Build up the environment of a SPHSystem. + //---------------------------------------------------------------------- + SPHSystem sph_system(system_domain_bounds, resolution_ref); + sph_system.generate_regression_data_ = false; + IOEnvironment io_environment(sph_system); + //---------------------------------------------------------------------- + // Creating body, materials and particles. + //---------------------------------------------------------------------- + SolidBody diffusion_body(sph_system, makeShared("DiffusionBody")); + diffusion_body.defineParticlesAndMaterial(); + diffusion_body.generateParticles(); + + SolidBody wall_boundary_Dirichlet(sph_system, makeShared("DirichletWallBoundary")); + wall_boundary_Dirichlet.defineParticlesAndMaterial(); + wall_boundary_Dirichlet.generateParticles(); + + SolidBody wall_boundary_Robin(sph_system, makeShared("RobinWallBoundary")); + wall_boundary_Robin.defineParticlesAndMaterial(); + wall_boundary_Robin.generateParticles(); + //---------------------------------------------------------------------- + // Particle and body creation of temperature observers. + //---------------------------------------------------------------------- + ObserverBody temperature_observer(sph_system, "TemperatureObserver"); + temperature_observer.generateParticles(); + //---------------------------------------------------------------------- + // Define body relation map. + // The contact map gives the topological connections between the bodies. + // Basically the range of bodies to build neighbor particle lists. + //---------------------------------------------------------------------- + InnerRelation diffusion_body_inner_relation(diffusion_body); + + ContactRelation diffusion_body_contact_Dirichlet(diffusion_body, { &wall_boundary_Dirichlet }); + ContactRelation diffusion_body_contact_Robin(diffusion_body, { &wall_boundary_Robin }); + + ContactRelation temperature_observer_contact(temperature_observer, { &diffusion_body }); + //---------------------------------------------------------------------- + // Define the main numerical methods used in the simulation. + // Note that there may be data dependence on the constructors of these methods. + //---------------------------------------------------------------------- + DiffusionBodyRelaxation temperature_relaxation(diffusion_body_inner_relation, diffusion_body_contact_Dirichlet, diffusion_body_contact_Robin); + + GetDiffusionTimeStepSize get_time_step_size(diffusion_body); + + SimpleDynamics setup_diffusion_initial_condition(diffusion_body); + SimpleDynamics setup_boundary_condition_Dirichlet(wall_boundary_Dirichlet); + SimpleDynamics setup_boundary_condition_Robin(wall_boundary_Robin); + + InteractionDynamics correct_configuration(diffusion_body_inner_relation); + + SimpleDynamics diffusion_body_normal_direction(diffusion_body); + SimpleDynamics Dirichlet_normal_direction(wall_boundary_Dirichlet); + SimpleDynamics Robin_normal_direction(wall_boundary_Robin); + //---------------------------------------------------------------------- + // Define the methods for I/O operations and observations of the simulation. + //---------------------------------------------------------------------- + BodyStatesRecordingToVtp write_states(io_environment, sph_system.real_bodies_); + //ObservedQuantityRecording write_solid_temperature("Phi", io_environment, temperature_observer_contact); + RegressionTestEnsembleAveraged> + write_solid_temperature("Phi", io_environment, temperature_observer_contact); + //---------------------------------------------------------------------- + // Prepare the simulation with cell linked list, configuration + // and case specified initial condition if necessary. + //---------------------------------------------------------------------- + sph_system.initializeSystemCellLinkedLists(); + sph_system.initializeSystemConfigurations(); + + correct_configuration.exec(); + + setup_diffusion_initial_condition.exec(); + + setup_boundary_condition_Dirichlet.exec(); + setup_boundary_condition_Robin.exec(); + + diffusion_body_normal_direction.exec(); + Dirichlet_normal_direction.exec(); + Robin_normal_direction.exec(); + //---------------------------------------------------------------------- + // Setup for time-stepping control + //---------------------------------------------------------------------- + int ite = 0; + Real T0 = 1; + Real End_Time = T0; + Real Observe_time = 0.01 * End_Time; + Real Output_Time = 0.1 * End_Time; + Real dt = 0.0; + //---------------------------------------------------------------------- + // Statistics for CPU time + //---------------------------------------------------------------------- + TickCount t1 = TickCount::now(); + TickCount::interval_t interval; + //---------------------------------------------------------------------- + // First output before the main loop. + //---------------------------------------------------------------------- + write_states.writeToFile(); + write_solid_temperature.writeToFile(); + //---------------------------------------------------------------------- + // Main loop starts here. + //---------------------------------------------------------------------- + while (GlobalStaticVariables::physical_time_ < End_Time) + { + Real integration_time = 0.0; + while (integration_time < Output_Time) + { + Real relaxation_time = 0.0; + while (relaxation_time < Observe_time) + { + if (ite % 500 == 0) + { + std::cout << "N=" << ite << " Time: " + << GlobalStaticVariables::physical_time_ << " dt: " + << dt << "\n"; + } + + temperature_relaxation.exec(dt); + + ite++; + dt = get_time_step_size.exec(); + relaxation_time += dt; + integration_time += dt; + GlobalStaticVariables::physical_time_ += dt; + } + } + + TickCount t2 = TickCount::now(); + write_states.writeToFile(); + write_solid_temperature.writeToFile(ite); + TickCount t3 = TickCount::now(); + interval += t3 - t2; + } + TickCount t4 = TickCount::now(); + + TickCount::interval_t tt; + tt = t4 - t1 - interval; + + std::cout << "Total wall time for computation: " << tt.seconds() << " seconds." << std::endl; + std::cout << "Total physical time for computation: " << GlobalStaticVariables::physical_time_ << " seconds." << std::endl; + + if (sph_system.generate_regression_data_) + { + write_solid_temperature.generateDataBase(1.0e-3, 1.0e-3); + } + else if (sph_system.RestartStep() == 0) + { + write_solid_temperature.testResult(); + } + + return 0; +} \ No newline at end of file diff --git a/tests/user_examples/test_2d_diffusion_RobinBC/test_2d_diffusion_RobinBC.h b/tests/user_examples/test_2d_diffusion_RobinBC/diffusion_RobinBC.h similarity index 97% rename from tests/user_examples/test_2d_diffusion_RobinBC/test_2d_diffusion_RobinBC.h rename to tests/user_examples/test_2d_diffusion_RobinBC/diffusion_RobinBC.h index aef01a4e54..5b1868e1b2 100644 --- a/tests/user_examples/test_2d_diffusion_RobinBC/test_2d_diffusion_RobinBC.h +++ b/tests/user_examples/test_2d_diffusion_RobinBC/diffusion_RobinBC.h @@ -1,10 +1,10 @@ /** - * @file test_2d_diffusion_RobinBC.h - * @brief This is the head files used by test_2d_diffusion_RobinBC.cpp. + * @file diffusion_RobinBC.h + * @brief This is the head files used by diffusion_RobinBC.cpp. * @author Chenxi Zhao, Bo Zhang, Chi Zhang and Xiangyu Hu */ -#ifndef DIFFUSION_TEST_WITH_ROBINBC_H -#define DIFFUSION_TEST_WITH_ROBINBC_H +#ifndef DIFFUSION_ROBINBC_H +#define DIFFUSION_ROBINBC_H #include "sphinxsys.h" using namespace SPH; @@ -224,4 +224,4 @@ class TemperatureObserverParticleGenerator : public ObserverParticleGenerator } } }; -#endif //DIFFUSION_TEST_WITH_NEUMANNBC_H \ No newline at end of file +#endif //DIFFUSION_ROBINBC_H \ No newline at end of file diff --git a/tests/user_examples/test_2d_diffusion_RobinBC/regression_test_tool/TemperatureObserver_Phi.xml b/tests/user_examples/test_2d_diffusion_RobinBC/regression_test_tool/TemperatureObserver_Phi.xml index 59c684b3c5..75da4d9623 100644 --- a/tests/user_examples/test_2d_diffusion_RobinBC/regression_test_tool/TemperatureObserver_Phi.xml +++ b/tests/user_examples/test_2d_diffusion_RobinBC/regression_test_tool/TemperatureObserver_Phi.xml @@ -1,14 +1,14 @@ - - - - - - - - - - + + + + + + + + + + diff --git a/tests/user_examples/test_2d_diffusion_RobinBC/regression_test_tool/TemperatureObserver_Phi_ensemble_averaged_mean_variance.xml b/tests/user_examples/test_2d_diffusion_RobinBC/regression_test_tool/TemperatureObserver_Phi_ensemble_averaged_mean_variance.xml index 56574afbfb..c1ae0de9ae 100644 --- a/tests/user_examples/test_2d_diffusion_RobinBC/regression_test_tool/TemperatureObserver_Phi_ensemble_averaged_mean_variance.xml +++ b/tests/user_examples/test_2d_diffusion_RobinBC/regression_test_tool/TemperatureObserver_Phi_ensemble_averaged_mean_variance.xml @@ -2,28 +2,28 @@ - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + diff --git a/tests/user_examples/test_2d_diffusion_RobinBC/regression_test_tool/TemperatureObserver_Phi_result.xml b/tests/user_examples/test_2d_diffusion_RobinBC/regression_test_tool/TemperatureObserver_Phi_result.xml index 4c3efde64f..1805c90351 100644 --- a/tests/user_examples/test_2d_diffusion_RobinBC/regression_test_tool/TemperatureObserver_Phi_result.xml +++ b/tests/user_examples/test_2d_diffusion_RobinBC/regression_test_tool/TemperatureObserver_Phi_result.xml @@ -1,81 +1,81 @@ - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - + + + + + + + + + +