-
Notifications
You must be signed in to change notification settings - Fork 8
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #93 from streeve/thermal_models
Add thermal deformation example
- Loading branch information
Showing
25 changed files
with
759 additions
and
205 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,10 +1,2 @@ | ||
add_executable(ElasticWave elastic_wave.cpp) | ||
target_link_libraries(ElasticWave LINK_PUBLIC CabanaPD) | ||
|
||
add_executable(KalthoffWinkler kalthoff_winkler.cpp) | ||
target_link_libraries(KalthoffWinkler LINK_PUBLIC CabanaPD) | ||
|
||
add_executable(CrackBranching crack_branching.cpp) | ||
target_link_libraries(CrackBranching LINK_PUBLIC CabanaPD) | ||
|
||
install(TARGETS ElasticWave KalthoffWinkler CrackBranching DESTINATION ${CMAKE_INSTALL_BINDIR}) | ||
add_subdirectory(mechanics) | ||
add_subdirectory(thermomechanics) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
add_executable(ElasticWave elastic_wave.cpp) | ||
target_link_libraries(ElasticWave LINK_PUBLIC CabanaPD) | ||
|
||
add_executable(KalthoffWinkler kalthoff_winkler.cpp) | ||
target_link_libraries(KalthoffWinkler LINK_PUBLIC CabanaPD) | ||
|
||
add_executable(CrackBranching crack_branching.cpp) | ||
target_link_libraries(CrackBranching LINK_PUBLIC CabanaPD) | ||
|
||
install(TARGETS ElasticWave KalthoffWinkler CrackBranching DESTINATION ${CMAKE_INSTALL_BINDIR}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
File renamed without changes.
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
add_executable(ThermalDeformation thermal_deformation.cpp) | ||
target_link_libraries(ThermalDeformation LINK_PUBLIC CabanaPD) | ||
install(TARGETS ThermalDeformation DESTINATION ${CMAKE_INSTALL_BINDIR}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
{ | ||
"num_cells" : {"value": [100, 30, 3]}, | ||
"system_size" : {"value": [1.0, 0.3, 0.03], "unit": "m"}, | ||
"density" : {"value": 3980, "unit": "kg/m^3"}, | ||
"elastic_modulus" : {"value": 370e+9, "unit": "Pa"}, | ||
"thermal_coefficient" : {"value": 7.5E-6, "unit": "oC^{-1}"}, | ||
"reference_temperature" : {"value": 20.0, "unit": "oC"}, | ||
"horizon" : {"value": 0.03, "unit": "m"}, | ||
"final_time" : {"value": 0.01, "unit": "s"}, | ||
"timestep" : {"value": 7.5E-7, "unit": "s"}, | ||
"output_frequency" : {"value": 100}, | ||
"output_reference" : {"value": true} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,136 @@ | ||
/**************************************************************************** | ||
* Copyright (c) 2022-2023 by Oak Ridge National Laboratory * | ||
* All rights reserved. * | ||
* * | ||
* This file is part of CabanaPD. CabanaPD is distributed under a * | ||
* BSD 3-clause license. For the licensing terms see the LICENSE file in * | ||
* the top-level directory. * | ||
* * | ||
* SPDX-License-Identifier: BSD-3-Clause * | ||
****************************************************************************/ | ||
|
||
#include <fstream> | ||
#include <iostream> | ||
|
||
#include "mpi.h" | ||
|
||
#include <Kokkos_Core.hpp> | ||
|
||
#include <CabanaPD.hpp> | ||
|
||
// Simulate thermally-induced deformation in a rectangular plate. | ||
void thermalDeformationExample( const std::string filename ) | ||
{ | ||
// ==================================================== | ||
// Use default Kokkos spaces | ||
// ==================================================== | ||
using exec_space = Kokkos::DefaultExecutionSpace; | ||
using memory_space = typename exec_space::memory_space; | ||
|
||
// ==================================================== | ||
// Read inputs | ||
// ==================================================== | ||
CabanaPD::Inputs inputs( filename ); | ||
|
||
// ==================================================== | ||
// Material and problem parameters | ||
// ==================================================== | ||
// Material parameters | ||
double rho0 = inputs["density"]; | ||
double E = inputs["elastic_modulus"]; | ||
double nu = 0.25; | ||
double K = E / ( 3 * ( 1 - 2 * nu ) ); | ||
double delta = inputs["horizon"]; | ||
double alpha = inputs["thermal_coefficient"]; | ||
|
||
// Problem parameters | ||
double temp0 = inputs["reference_temperature"]; | ||
|
||
// ==================================================== | ||
// Discretization | ||
// ==================================================== | ||
// FIXME: set halo width based on delta | ||
std::array<double, 3> low_corner = inputs["low_corner"]; | ||
std::array<double, 3> high_corner = inputs["high_corner"]; | ||
std::array<int, 3> num_cells = inputs["num_cells"]; | ||
int m = std::floor( delta / | ||
( ( high_corner[0] - low_corner[0] ) / num_cells[0] ) ); | ||
int halo_width = m + 1; // Just to be safe. | ||
|
||
// ==================================================== | ||
// Force model type | ||
// ==================================================== | ||
using model_type = CabanaPD::PMB; | ||
using thermal_type = CabanaPD::TemperatureDependent; | ||
|
||
// ==================================================== | ||
// Particle generation | ||
// ==================================================== | ||
// Does not set displacements, velocities, etc. | ||
auto particles = std::make_shared< | ||
CabanaPD::Particles<memory_space, model_type, thermal_type>>( | ||
exec_space(), low_corner, high_corner, num_cells, halo_width ); | ||
|
||
// ==================================================== | ||
// Custom particle initialization | ||
// ==================================================== | ||
auto rho = particles->sliceDensity(); | ||
auto init_functor = KOKKOS_LAMBDA( const int pid ) { rho( pid ) = rho0; }; | ||
particles->updateParticles( exec_space{}, init_functor ); | ||
|
||
// ==================================================== | ||
// Force model | ||
// ==================================================== | ||
auto force_model = | ||
CabanaPD::createForceModel<model_type, CabanaPD::Elastic, thermal_type>( | ||
*particles, delta, K, alpha, temp0 ); | ||
|
||
// ==================================================== | ||
// Create solver | ||
// ==================================================== | ||
auto cabana_pd = CabanaPD::createSolverElastic<memory_space>( | ||
inputs, particles, force_model ); | ||
|
||
// ==================================================== | ||
// Imposed field | ||
// ==================================================== | ||
auto x = particles->sliceReferencePosition(); | ||
auto temp = particles->sliceTemperature(); | ||
const double low_corner_y = low_corner[1]; | ||
// This is purposely delayed until after solver init so that ghosted | ||
// particles are correctly taken into account for lambda capture here. | ||
auto temp_func = KOKKOS_LAMBDA( const int pid, const double t ) | ||
{ | ||
temp( pid ) = temp0 + 5000.0 * ( x( pid, 1 ) - low_corner_y ) * t; | ||
}; | ||
auto body_term = CabanaPD::createBodyTerm( temp_func, false ); | ||
|
||
// ==================================================== | ||
// Simulation run | ||
// ==================================================== | ||
cabana_pd->init( body_term ); | ||
cabana_pd->run( body_term ); | ||
|
||
// ==================================================== | ||
// Outputs | ||
// ==================================================== | ||
// Output displacement along the x-axis | ||
createDisplacementProfile( MPI_COMM_WORLD, num_cells[0], 0, | ||
"xdisplacement_profile.txt", *particles ); | ||
|
||
// Output displacement along the y-axis | ||
createDisplacementProfile( MPI_COMM_WORLD, num_cells[1], 1, | ||
"ydisplacement_profile.txt", *particles ); | ||
} | ||
|
||
// Initialize MPI+Kokkos. | ||
int main( int argc, char* argv[] ) | ||
{ | ||
MPI_Init( &argc, &argv ); | ||
Kokkos::initialize( argc, argv ); | ||
|
||
thermalDeformationExample( argv[1] ); | ||
|
||
Kokkos::finalize(); | ||
MPI_Finalize(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.