Skip to content

Commit 96e3d41

Browse files
authored
Merge pull request #2 from SpechtMagnus/first_particle_approach
Milestone 1 Presentation
2 parents 05e7521 + 25759c0 commit 96e3d41

39 files changed

+958
-214
lines changed

Planung/Planung SPH.md

+20-4
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,34 @@
22

33
## Allgemeines
44

5-
- Der SPH Manager wird auf allen Prozessoren ausgeführt und ist die Kommunikationsschnittstelle der Prozessoren
5+
- Der SPH Manager wird auf allen Prozessoren ausgeführt und ist eine Kommunikationsschnittstelle der Prozessoren
6+
- Partikelgeneratoren, Initiator, Exporter sowie andere noch nicht festgelegte Klassen laufen auf dem Master Prozess
67

78
## Domänen
89

9-
- staische Domänen (ändert sich spätestens im Optimierungspart des StuPro)
10+
- semi-dynamische Domänen
1011
- viele Domänen. Jeder Prozessor übernimmt eine Anzahl davon
11-
- bei 4 Prozessoren gilt:
12+
- Es gilt: ProzessorID = DomainID mod AnzahlProzessoren
13+
- bei 4 Prozessoren gilt also:
1214
- Prozessor 1 übernimmt Domäne 1, 5, 9, ...
1315
- Prozessor 2 übernimmt Domäne 2, 6, 10, ...
1416
- Prozessor 3 übernimmt Domäne 3, 7, 11, ...
1517
- Prozessor 4 übernimmt Domäne 4, 8, 12, ...
1618

19+
20+
## Einfügen von Partikeln in eine Domäne
21+
22+
Es gibt zwei Möglichekeiten wie Partikel in eine Domain gelangen können
23+
- wenn eine Domain Decomposition durchgeführt wird
24+
- Wird ein Partikel vom DomainDecomposer gesender, so findet eine Domain Decomposition statt und der DomainDecomposer berechnet die ProzessorID des Empfangenden Prozesses. Gesendete Partikel landen daraufhin im Buffer des Prozesses und nach der Sendephase findet im DomainDecomposer eine Empfangsphase statt bei der alle gesendeten Partikel aus dem Buffer genommen werden und in die jeweils Richtige Domain eingetragen werden.
25+
- wenn ein Partikel von einem Generator, nach einem Berechnungszyklus, an den SphManager gesendet wird
26+
- Wird ein Partikel vom einem Generator in eine Domain eingefügt, so wird die ProzessorID für die zuständige DomainID berechnet und der Partikel wird an den SphManager dieses Prozesses gesendet.
27+
28+
## Generieren von Domänen
29+
30+
- Wird ein Partikel in eine Domäne eingefügt, welche noch nicht existiert, wird diese Domäne erzeugt. Welche Domäne erzeugt werden muss kann mithilfe der Hashfunktion erkannt werden.
31+
- Im Optimierungsteil können leer Domänen noch erkannt und aus der berechnung ausgeschlossen werden, solange bis wieder Partikel enthalten sind Domänen werden "deaktiviert" und nicht gelöscht, wenn diese einmal erstellt sind.
32+
1733
## Nachbarschaftssuche
1834

1935
- Nachbarschaftssuche Listensuche (genauer Algorithmus wird noch bestimmt)
@@ -24,7 +40,7 @@
2440

2541
## Partikelgeneratoren
2642

27-
- Partikelgeneratoren, Initiator, sowie andere noch nicht festgelegte Klassen laufen auf dem Master Prozess
43+
- Partikelgeneratoren laufen auf dem Master Prozess
2844

2945
## Baking
3046

Planung/Workflow.md

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Workflow
2+
3+
## Git
4+
5+
- The master must always point on a working version
6+
7+
### New milestone
8+
9+
- Create a new branch from master named "M0-title"
10+
- Set a tag for the previos milestone
11+
12+
### New feature
13+
14+
- Create a new branch from the milestone branch
15+
- Rebase on milestone branch
16+
- Merge after feature is complete
17+
18+
### Milestone finished
19+
20+
- Create a pull request for the milestone branch
21+
- Accept the pull request
22+
23+
## Weekly Meeting
24+
25+
- There are weekly meetings of at least one member per team on Wednsday 8pm
26+
27+
## Testing
28+
29+
Boost Test

SphWaterfall/CMakeLists.txt

+11-5
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
cmake_minimum_required(VERSION 2.6)
22
project(SphWaterfall)
33

4-
if(OPENMP_FOUND)
5-
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
6-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
7-
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
8-
endif()
4+
find_package(MPI REQUIRED)
5+
# add this line only when you are using openmpi which has a different c++ bindings
6+
add_definitions(-DOMPI_SKIP_MPICXX)
97

108
include("SphWaterfall/src/CMakeLists.txt")
9+
10+
target_link_libraries(SphWaterfall
11+
PRIVATE
12+
${MPI_C_LIBRARIES})
13+
14+
target_include_directories(SphWaterfall
15+
PRIVATE
16+
${MPI_C_INCLUDE_PATH})

SphWaterfall/SphWaterfall/src/CMakeLists.txt

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ add_executable(
33
"${CMAKE_CURRENT_LIST_DIR}/SphWaterfall.cpp"
44
)
55

6+
7+
include("${CMAKE_CURRENT_LIST_DIR}/cui/CMakeLists.txt")
68
include("${CMAKE_CURRENT_LIST_DIR}/data/CMakeLists.txt")
79
include("${CMAKE_CURRENT_LIST_DIR}/export/CMakeLists.txt")
810
include("${CMAKE_CURRENT_LIST_DIR}/geometry/CMakeLists.txt")
+43-113
Original file line numberDiff line numberDiff line change
@@ -1,132 +1,62 @@
1-
#include <iostream>
2-
#include <string>
3-
#include <sstream>
4-
#include <vector>
5-
#include <queue>
1+
#include "mpi.h"
62

7-
#include "geometry/TerrainParser.h"
3+
#include "cui/CUI.h"
84

9-
void trim(std::string &str) {
10-
int pos1 = str.find_first_not_of(" ");
11-
int pos2 = str.find_last_not_of(" ");
12-
str = str.substr(pos1, pos2 - pos1 + 1);
13-
}
145

15-
bool readNextToken(std::queue<std::string> &tokens, std::string &nextToken)
16-
{
17-
if (tokens.empty()) {
18-
return false;
19-
}
20-
else {
21-
nextToken = tokens.front();
22-
tokens.pop();
23-
return true;
24-
}
6+
void loadMesh() {
7+
printf("Command is loadMesh");
258
}
269

27-
bool readNextCombinedToken(std::queue<std::string> &tokens, std::string &nextToken) {
28-
std::string tempToken = "", resultToken = "";
29-
30-
//Read first token
31-
if (!readNextToken(tokens, tempToken))
32-
return false;
33-
if (tempToken.find_first_of('\"') != 0) {
34-
//No combined token
35-
nextToken = tempToken;
36-
return true;
37-
}
38-
if (tempToken.find_last_of('\"') == tempToken.length() - 1) {
39-
//Combined token without spaces
40-
nextToken = tempToken.substr(1, tempToken.length() - 2);
41-
return true;
42-
}
43-
44-
//Read following tokens
45-
do {
46-
resultToken += tempToken + " ";
47-
if (!readNextToken(tokens, tempToken)) {
48-
// No second quotation mark
49-
nextToken = resultToken.substr(1);
50-
return true;
51-
}
52-
} while (tempToken.find_last_of('\"') != tempToken.length() - 1);
53-
54-
//Return combined token
55-
resultToken += tempToken;
56-
nextToken = resultToken.substr(1, resultToken.length() - 2);
57-
return true;
10+
void generateParticle() {
11+
printf("command is particleGen");
5812
}
5913

60-
/* -_-_-_Comands Begin_-_-_- */
61-
62-
void loadMesh(std::queue<std::string> &tokens)
63-
{
64-
std::string paramName, fileName;
65-
66-
//Read fileName Parameter
67-
if (readNextToken(tokens, paramName) && paramName == "-p") {
68-
fileName = "";
69-
readNextCombinedToken(tokens, fileName);
70-
std::cout << fileName << std::endl;
14+
void moveShutter() {
15+
printf("command is moveShutter");
16+
}
7117

72-
Terrain loadedFile = TerrainParser::loadFromFile(fileName);
73-
std::cout << "Vertices: " << loadedFile.getVertexCount() << " Faces: " << loadedFile.getFaceCount() << std::endl;
74-
}
75-
else
76-
{
77-
std::cout << "Missing path parameter '-p'" << std::endl;
78-
}
18+
void simulate() {
19+
printf("command is simulate");
7920
}
8021

81-
void showHelp()
22+
int main(int argc, char** argv)
8223
{
83-
std::cout << "loadMesh -p" << std::endl;
84-
std::cout << "particleGen [-w] [-f] [-e]" << std::endl;
85-
std::cout << "moveShutter -t (-u/-d) [-l]" << std::endl;
86-
std::cout << "simulate -s -e -r -g -m -t" << std::endl;
87-
std::cout << "help" << std::endl;
88-
std::cout << "exit" << std::endl;
89-
}
24+
MPI_Init(&argc, &argv);
9025

91-
/* -_-_-_Comands End_-_-_- */
26+
int *buffer;
27+
buffer = (int*)malloc(sizeof(int));
9228

93-
void readCommands()
94-
{
95-
std::string inputLine, command;
96-
std::queue<std::string> tokens;
29+
int rank;
30+
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
31+
int world_size;
32+
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
9733

98-
while (true)
99-
{
100-
//Read command
101-
std::cout << std::endl << "Please enter a command or enter 'help' to show a list of all commands" << std::endl;
102-
std::getline(std::cin, inputLine);
103-
trim(inputLine);
34+
CUI cui = CUI::CUI();
35+
if (rank == 0) {
36+
cui.readCommands(buffer);
37+
}
10438

105-
//Tokenize command
106-
std::istringstream tokenStream(inputLine);
107-
tokens = std::queue<std::string>();
108-
while (tokenStream >> command)
109-
tokens.push(command);
39+
MPI_Bcast(buffer, 1, MPI_INT, 0, MPI_COMM_WORLD);
40+
printf("Hello world from processor rank %d out of %d processors, buffer is %d\n", rank, world_size, buffer[0]);
11041

111-
//Execute command
112-
if (!tokens.empty())
113-
{
114-
command = tokens.front();
115-
tokens.pop();
42+
if (*buffer == 1) {
43+
loadMesh();
44+
}
45+
else if (*buffer == 2) {
46+
generateParticle();
47+
}
48+
else if (*buffer == 3) {
49+
moveShutter();
50+
}
51+
else if (*buffer == 4) {
52+
simulate();
53+
}
11654

117-
if (command == "loadMesh")
118-
loadMesh(tokens);
119-
else if (command == "help" || command == "?")
120-
showHelp();
121-
else if (command == "exit")
122-
break;
123-
else
124-
std::cout << "Unknown command. Enter 'hlep' to view a list of all available commands." << std::endl;
125-
}
55+
if (rank == 0) {
56+
system("pause");
57+
MPI_Wait;
12658
}
127-
}
59+
MPI_Finalize();
12860

129-
int main()
130-
{
131-
readCommands();
132-
}
61+
62+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
target_sources(
2+
SphWaterfall
3+
PUBLIC
4+
"${CMAKE_CURRENT_LIST_DIR}/CUI.h"
5+
"${CMAKE_CURRENT_LIST_DIR}/CUI.cpp"
6+
)

0 commit comments

Comments
 (0)