R9482/Homework31235d24fe4c2master
README.md
SP4E - Homework 3
General Info
This file provides a brief documentation and information related to the third Homework of the course "Scientific Programming for Engineers", fall 2019.
This homework is done by O. Ashtari and A. Sieber.
Last update: 12.11.2019
Project Description
One goal of this project is to learn and practice how to link an external library, here FFTW, to a C++ code. We use fast Fourier transforms to solve heat equation using a pseudo-spectral method. For this aim, as the second objective of the project, we extend the existing code originally written for simulating dynamics of interacting particles. Many functionalities we need have been already implemented and tested in the available code, meaning that we can trust on it as the starting point of development.
Executable Files
After cloning this repository on your computer, you should build the program in a desired directory based on the CMakeLists.txt file in the root. To do so, inside the destination directory, you can build the executable file(s) using commands below:
$ cmake -DCMAKE_PREFIX_PATH=<include> -DCMAKE_LIBRARY_PATH=<library> -DUSE_FFT=<status> <CMakeLists> $ make
where the command cmake is basically followed by the address of the directory where the CMakeLists.txt is located (denoted by <CMakeLists>.) Available options are as follows:
- -DCMAKE_PREFIX_PATH specifies the path where you want the program look for headers (.h files) in. <include> in the command above will be replaced by the address.
- -DCMAKE_LIBRARY_PATH specifies the path where you want the program look for libraries (.a files) in. <library> in the command above will be replaced by the address.
- -DUSE_FFT determines whether the program should look for FFTW library/header in the specified directories or not. <status> can either be ON or OFF.
The executable file particles will be built in <build_directory>/src. Moreover, three tests test_fft, test_heat and test_kepler are built. The minimum requirement for CMake is the version 3.1.
Running a simulation: from generating initial condition to post-processing
1- Generating initial condition
The first step in running a simulation consist in setting up the initial conditions. This is done through the python script input_generator.py in the tools folder. By running this code, the user is asked to chose the simulation test case simulation, the grid size N_grid, the half domain extend L in both the x and y directions and the radius of the heat source R.
The available simulation test cases are the following:
- Uniform temperature without heat source, uniform_temperature.
- Uniform temperature with line heat sources, line_source.
- Uniform temperature with radial heat source, radial_source.
As an example by running the following command line:
$ python3 -simulation line_source -N_grid 512 -L 1 -R 0.5
A line source simulation is initialized on a [-1;1]x[-1;1] domain on a 512x512 grid. The radial heat source is not used in this case.
2- Running the calculations
Once this step is achieved, the actual simulation can be performed. This is done by running the particles executable through the command line alongside a set a user-defined variables.
$ ./particles n_steps dump_freq input_file particles_type boundary_type domain_length density_heat_capacity heat_conductivity
The arguments are introduced above represents:
- n_steps, the amount of time steps. Must be an integer.
- dump_freq, the output files dumping frequency. Must be an integer.
- input_file, the path to the input file generated with the input_generator.py script.
- particles_types, the type of simulation. Here the string material_point must be used.
- boundary_type, the boundary type. As of now, only Dirichlet or Periodic boundary conditions are implemented.
- domain_length, the total length of the domain in both the x and y directions. As opposed to the python script domain_length must be set to 2xL.
- density_heat_capacity, the product of the density and the heat capacity of the simulated material.
- heat_conductivity, the heat conductivity of the simulated material.
The user is also asked to create a dumps folder where the dumped file can be stored.
3- Visualization
The visualization of the results can be done with the Paraview software. Here, we introduce two ways of visualizing the results in this software: (1) a simple step-by-step guide and (2) a macro that contains all steps in a Python .py file.
Step-by-step instruction
Step 1: First, the dumped files are loaded into the software (by selecting step-..csv group of output files inside the dumps folder.) After loading the files, be sure to set the field Delimiter Character to a simple space, and uncheck the Have Headers box. Then click on Apply.
Step 2: The Table To Points filter allows to convert the data points to coordinates. The x-coordinates correspond to the field 0, the y-coordinates correspond to the field 1 and the z-coordinates correspond to the field 2. Click on Apply after making these changes.
Step 3: Finally, to visualization different fields add a proper filter like Delaunay 2D or Point Volume Interpolator to the Table To Points object from step 2. Visualization of the temperature field is achieved by setting the Coloring option of the field 13 whereas the field 14 shows the heat source distribution.
Using the provided macro
A file named Visualization.py is located in a folder with the same name. To use this macro, under the tab Macros click on Add new macro..., then select the .py file. Now if you click on Macros you see that a new row, named Visualization, is added to the menu. Having the macro available you need to just open a group of results (<running directory>/dumps/step-..csv) and then click on the recently added item Visualization (under Macros.) Steps described in the previous subsection will be taken and you see the animation.
Integration of the boundary condition in the existing code
The boundary condition are handled in the heat_boundary.hh and heat_boundary.cc source files which are member functions of the compute_temperature.hh file. It works as follow: at each time step, all the node points are updated without considering the boundary conditions, then heat_boundary.hh's' compute method is called and imposes the boundary conditions based on the user-defined input boundary_type.