-
Notifications
You must be signed in to change notification settings - Fork 6
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add heat transfer #108
base: main
Are you sure you want to change the base?
Add heat transfer #108
Changes from all commits
351159c
325798a
43bf7da
de4a86a
e2fb205
17601d3
7631943
e5519b8
cabce6c
38ea025
c3d352b
be854ef
e478e6a
b9235f9
a53e8bc
5db7fef
0d95b79
bd8e279
ebdfdd0
8c1ef36
543c22c
37e422f
ffdbe3b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,13 +1,15 @@ | ||
{ | ||
"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} | ||
"num_cells" : {"value": [101, 31, 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_expansion_coeff" : {"value": 7.5E-6, "unit": "oC^{-1}"}, | ||
"thermal_conductivity" : {"value": 31, "unit": "W/(m.K)"}, | ||
"specific_heat_capacity" : {"value": 880, "unit": "J/(kg.K)"}, | ||
"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} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
{ | ||
"num_cells" : {"value": [40, 40, 40]}, | ||
"system_size" : {"value": [0.1, 0.1, 0.1], "unit": "m"}, | ||
"density" : {"value": 8915, "unit": "kg/m^3"}, | ||
"elastic_modulus" : {"value": 115e+9, "unit": "Pa"}, | ||
"thermal_expansion_coeff" : {"value": 17e-6, "unit": "oC^{-1}"}, | ||
"thermal_conductivity" : {"value": 387, "unit": "W/(m.K)"}, | ||
"specific_heat_capacity" : {"value": 385, "unit": "J/(kg.K)"}, | ||
"reference_temperature" : {"value": 100.0, "unit": "oC"}, | ||
"horizon" : {"value": 0.0075, "unit": "m"}, | ||
"final_time" : {"value": 8, "unit": "s"}, | ||
"timestep" : {"value": 5.1e-8, "unit": "s"}, | ||
"thermal_subcycle_steps": {"value": 100}, | ||
"output_frequency" : {"value": 1}, | ||
"output_reference" : {"value": true} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
{ | ||
"num_cells" : {"value": [101, 101, 101]}, | ||
"system_size" : {"value": [0.1, 0.1, 0.1], "unit": "m"}, | ||
"density" : {"value": 8915, "unit": "kg/m^3"}, | ||
"elastic_modulus" : {"value": 115e+9, "unit": "Pa"}, | ||
"thermal_expansion_coeff" : {"value": 17e-6, "unit": "oC^{-1}"}, | ||
"thermal_conductivity" : {"value": 387, "unit": "W/(m.K)"}, | ||
"specific_heat_capacity" : {"value": 385, "unit": "J/(kg.K)"}, | ||
"reference_temperature" : {"value": 100.0, "unit": "oC"}, | ||
"horizon" : {"value": 0.003, "unit": "m"}, | ||
"final_time" : {"value": 8, "unit": "s"}, | ||
"timestep" : {"value": 0.004, "unit": "s"}, | ||
"output_frequency" : {"value": 100}, | ||
"output_reference" : {"value": true} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,204 @@ | ||
/**************************************************************************** | ||
* Copyright (c) 2022 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 thermalDeformationHeatTransferExample( 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_expansion_coeff"]; | ||
double kappa = inputs["thermal_conductivity"]; | ||
double cp = inputs["specific_heat_capacity"]; | ||
|
||
// 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::DynamicTemperature; | ||
|
||
// ==================================================== | ||
// Particle generation | ||
// ==================================================== | ||
// Does not set displacements, velocities, etc. | ||
auto particles = | ||
std::make_shared<CabanaPD::Particles<memory_space, model_type, | ||
typename thermal_type::base_type>>( | ||
exec_space(), low_corner, high_corner, num_cells, halo_width ); | ||
|
||
// ==================================================== | ||
// Custom particle initialization | ||
// ==================================================== | ||
auto rho = particles->sliceDensity(); | ||
auto temp = particles->sliceTemperature(); | ||
auto init_functor = KOKKOS_LAMBDA( const int pid ) | ||
{ | ||
// Density | ||
rho( pid ) = rho0; | ||
// Temperature | ||
temp( pid ) = temp0; | ||
}; | ||
particles->updateParticles( exec_space{}, init_functor ); | ||
|
||
// ==================================================== | ||
// Force model | ||
// ==================================================== | ||
auto force_model = CabanaPD::createForceModel( | ||
model_type{}, CabanaPD::Elastic{}, *particles, delta, K, kappa, cp, | ||
alpha, temp0 ); | ||
|
||
// ==================================================== | ||
// Create solver | ||
// ==================================================== | ||
auto cabana_pd = CabanaPD::createSolverElastic<memory_space>( | ||
inputs, particles, force_model ); | ||
|
||
// ==================================================== | ||
// Boundary condition | ||
// ==================================================== | ||
// Temperature profile imposed on top, bottom, left, and right surfaces | ||
double dx = particles->dx[0]; | ||
double dy = particles->dx[1]; | ||
double dz = particles->dx[2]; | ||
using plane_type = CabanaPD::RegionBoundary<CabanaPD::RectangularPrism>; | ||
|
||
// Left surface: x-direction | ||
plane_type plane1( low_corner[0] - dx, low_corner[0] + dx, low_corner[1], | ||
high_corner[1], low_corner[2], high_corner[2] ); | ||
|
||
// Right surface: x-direction | ||
plane_type plane2( high_corner[0] - dx, high_corner[0] + dx, low_corner[1], | ||
high_corner[1], low_corner[2], high_corner[2] ); | ||
|
||
// Top surface: y-direction | ||
plane_type plane3( low_corner[0], high_corner[0], high_corner[1] - dy, | ||
high_corner[1] + dy, low_corner[2], high_corner[2] ); | ||
|
||
// Bottom surface: y-direction | ||
plane_type plane4( low_corner[0], high_corner[0], low_corner[1] - dy, | ||
low_corner[1] + dy, low_corner[2], high_corner[2] ); | ||
|
||
// Front surface: z-direction | ||
plane_type plane5( low_corner[0], high_corner[0], low_corner[1], | ||
high_corner[1], low_corner[2] - dz, low_corner[2] + dz ); | ||
|
||
// Back surface: z-direction | ||
plane_type plane6( low_corner[0], high_corner[0], low_corner[1], | ||
high_corner[1], high_corner[2] - dz, | ||
high_corner[2] + dz ); | ||
|
||
std::vector<plane_type> planes = { plane1, plane2, plane3, | ||
plane4, plane5, plane6 }; | ||
|
||
auto x = particles->sliceReferencePosition(); | ||
// Need to reslice to include ghosted particles on the boundary. | ||
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_bc = KOKKOS_LAMBDA( const int pid, const double ) | ||
{ | ||
temp( pid ) = 0.0; | ||
}; | ||
auto bc = CabanaPD::createBoundaryCondition( | ||
temp_bc, exec_space{}, *particles, planes, false, 1.0 ); | ||
|
||
// ==================================================== | ||
// Simulation run | ||
// ==================================================== | ||
cabana_pd->init( bc ); | ||
cabana_pd->run( bc ); | ||
|
||
// ==================================================== | ||
// Outputs | ||
// ==================================================== | ||
|
||
// Output temperature along the y-axis | ||
auto temp_output = particles->sliceTemperature(); | ||
auto value = KOKKOS_LAMBDA( const int pid ) { return temp_output( pid ); }; | ||
|
||
int profile_dim = 1; | ||
std::string file_name = "temperature_yaxis_profile.txt"; | ||
createOutputProfile( MPI_COMM_WORLD, num_cells[1], profile_dim, file_name, | ||
*particles, value ); | ||
|
||
// Output y-displacement along the x-axis | ||
createDisplacementProfile( MPI_COMM_WORLD, | ||
"ydisplacement_xaxis_profile.txt", *particles, | ||
num_cells[0], 0, 1 ); | ||
|
||
// Output y-displacement along the y-axis | ||
createDisplacementProfile( MPI_COMM_WORLD, | ||
"ydisplacement_yaxis_profile.txt", *particles, | ||
num_cells[1], 1, 1 ); | ||
|
||
// Output displacement magnitude along the x-axis | ||
createDisplacementMagnitudeProfile( | ||
MPI_COMM_WORLD, "displacement_magnitude_xaxis_profile.txt", *particles, | ||
num_cells[0], 0 ); | ||
|
||
// Output displacement magnitude along the y-axis | ||
createDisplacementMagnitudeProfile( | ||
MPI_COMM_WORLD, "displacement_magnitude_yaxis_profile.txt", *particles, | ||
num_cells[1], 1 ); | ||
} | ||
|
||
// Initialize MPI+Kokkos. | ||
int main( int argc, char* argv[] ) | ||
{ | ||
MPI_Init( &argc, &argv ); | ||
Kokkos::initialize( argc, argv ); | ||
|
||
thermalDeformationHeatTransferExample( argv[1] ); | ||
|
||
Kokkos::finalize(); | ||
MPI_Finalize(); | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -12,6 +12,7 @@ | |
#ifndef FORCE_MODELS_H | ||
#define FORCE_MODELS_H | ||
|
||
#include <CabanaPD_Constants.hpp> | ||
#include <CabanaPD_Types.hpp> | ||
|
||
namespace CabanaPD | ||
|
@@ -71,6 +72,45 @@ struct BaseTemperatureModel | |
} | ||
}; | ||
|
||
// This class stores temperature parameters needed for heat transfer, but not | ||
// the temperature itself (stored instead in the static temperature class | ||
// above). | ||
struct BaseDynamicTemperatureModel | ||
{ | ||
double delta; | ||
|
||
double thermal_coeff; | ||
double kappa; | ||
double cp; | ||
bool constant_conductivity; | ||
|
||
BaseDynamicTemperatureModel( const double _delta, const double _kappa, | ||
const double _cp, | ||
const bool _constant_conductivity = true ) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What do we do if we want a different micro-conductivity than the constant one? |
||
{ | ||
set_param( _delta, _kappa, _cp, _constant_conductivity ); | ||
} | ||
|
||
void set_param( const double _delta, const double _kappa, const double _cp, | ||
const bool _constant_conductivity ) | ||
{ | ||
delta = _delta; | ||
kappa = _kappa; | ||
cp = _cp; | ||
const double d3 = _delta * _delta * _delta; | ||
thermal_coeff = 9.0 / 2.0 * _kappa / pi / d3; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This should be analogous to Line 52 in CabanaPD_ForceModels_PMB.hpp. I was wondering if we should use a more clear description. There, we used "c". However using "k" may not be good. |
||
constant_conductivity = _constant_conductivity; | ||
} | ||
|
||
KOKKOS_INLINE_FUNCTION double conductivity_function( double r ) const | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should the function be called "microconductivity_function"? |
||
{ | ||
if ( constant_conductivity ) | ||
return thermal_coeff; | ||
else | ||
return 4.0 * thermal_coeff * ( 1.0 - r / delta ); | ||
} | ||
}; | ||
|
||
template <typename ModelType, typename DamageType, | ||
typename ThermalType = TemperatureIndependent, typename... DataTypes> | ||
struct ForceModel; | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I guess this refers to the "micro-conductivity"? Perhaps call it "constant_microconductivity"?