Skip to content

Commit 86397ca

Browse files
committed
HUGE UPDATE
[x] Múltiples partículas [x] Paralelo [x] Linear omega damping [x] Archivo ipynb para graficar [x] Limpieza y resetructuración de código (nombres de variables, ...) [x] Actualziado el Makefile
1 parent d87a830 commit 86397ca

20 files changed

+5877
-2665
lines changed

Makefile

+124-36
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,112 @@
1+
#--------------------------------------------------------------------------
2+
# Directories and file names
3+
4+
SRC_DIR = src
5+
OBJ_DIR = build
6+
MOD_DIR = modules
7+
DEP_FILE = dependencies.dep # Name of the dependencies file
8+
EXE_FILE = ASTROBOULD # Name of the executable
9+
10+
#--------------------------------------------------------------------------
11+
#--------------------------------------------------------------------------
12+
13+
# Compiler
114
FC = gfortran -g
2-
MYFFLAGS = -ffinite-math-only -funsafe-math-optimizations -funroll-loops #-fcheck=all ## Este último es para debuggear
15+
16+
# Debug
17+
ifdef DEBUG
18+
MYFFLAGS := -fcheck=all -fbacktrace
19+
MYLDFLAGS := -O0
20+
else
21+
MYFFLAGS := -ffinite-math-only -funsafe-math-optimizations -funroll-loops
22+
MYLDFLAGS := -O2
23+
endif
24+
25+
# Serial
26+
ifndef SERIAL
27+
MYFFLAGS += -fopenmp
28+
endif
29+
30+
#--------------------------------------------------------------------------
31+
32+
# Variables
33+
## Source files
34+
FIXED_SOURCES = $(wildcard $(SRC_DIR)/*.f)
35+
FREE_SOURCES = $(wildcard $(SRC_DIR)/*.F90)
36+
SRCS = $(FIXED_SOURCES) $(FREE_SOURCES)
37+
## Objects
38+
FIXED_OBJECTS = $(addprefix $(OBJ_DIR)/,$(notdir $(FIXED_SOURCES:.f=.o)))
39+
FREE_OBJECTS = $(addprefix $(OBJ_DIR)/,$(notdir $(FREE_SOURCES:.F90=.o)))
40+
OBJECTS = $(FIXED_OBJECTS) $(FREE_OBJECTS)
41+
## Modules
42+
MODULES = $(filter-out main.mod, $(notdir $(OBJECTS:.o=.mod)))
43+
## Dependencies
44+
MAKE_DEP_FILE = $(DEP_FILE)
45+
46+
# Compiler flags
347
FFLAGS = -Wall -Wextra -march=native $(MYFFLAGS)
4-
MYLDFLAGS = -O2
548
LDFLAGS = $(MYLDFLAGS)
649

7-
TARGETS = main
8-
FIXED_SOURCES = $(wildcard *.f)
9-
FREE_SOURCES = $(wildcard *.F90)
10-
FIXED_OBJECTS = $(patsubst %.f,%.o,${FIXED_SOURCES})
11-
FREE_OBJECTS = $(patsubst %.F90,%.o,${FREE_SOURCES})
50+
#--------------------------------------------------------------------------
51+
#--------------------------------------------------------------------------
52+
53+
# Rules
54+
55+
# Default rule
56+
all: $(OBJ_DIR) main $(DEP_FILE)
57+
58+
# Pattern rules
59+
60+
# Serial
61+
serial:
62+
$(MAKE) SERIAL=1
1263

13-
MAKEDEP = deps
14-
DEP_FILE_NAME = main.dep
15-
DEP_FILE = $(DEP_FILE_NAME)
64+
# Debug
65+
debug:
66+
$(MAKE) DEBUG=1
1667

17-
all: $(TARGETS) $(DEP_FILE_NAME)
1868

19-
${FIXED_OBJECTS} : %.o : %.f
69+
# Create build directory before compiling
70+
$(OBJECTS): | $(OBJ_DIR)
71+
72+
# Create build directory
73+
$(OBJ_DIR):
74+
@mkdir -p $(OBJ_DIR)
75+
76+
# Compile source files .f to objects
77+
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.f
2078
$(FC) $(FFLAGS) -o $@ -c $< $(LDFLAGS)
2179

22-
${FREE_OBJECTS} : %.o : %.F90
23-
$(FC) $(FFLAGS) -o $@ -c $< $(DEP_FILE_NAME) $(LDFLAGS)
24-
25-
%.o: %.F90
80+
# Compile source files .F90 to objects
81+
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.F90
2682
$(FC) $(FFLAGS) -o $@ -c $< $(LDFLAGS)
2783

28-
main: ${FREE_OBJECTS} ${FIXED_OBJECTS}
29-
$(FC) $(FFLAGS) -o main $^ $(LDFLAGS)
84+
# Link objects and create main
85+
main: $(OBJECTS)
86+
$(FC) $(FFLAGS) -o $(EXE_FILE) $^ $(LDFLAGS)
87+
@mkdir -p $(MOD_DIR)
88+
@mv -f $(MODULES) $(MOD_DIR) 2>/dev/null; true
89+
@touch $(EXE_FILE)
90+
@echo ""
91+
@echo "Compilation successful!"
92+
@if [ -n "$(SERIAL)" ]; then echo " (Without using OpenMP)"; fi
93+
@echo ""
94+
3095

96+
# Create dependencies file with fortdepend
3197
deps:
32-
@echo "Creating dependencies file: $(DEP_FILE_NAME)"
3398
@{ \
34-
if command -v fortdepend >/dev/null 2>&1; then \
35-
fortdepend -w -o $(DEP_FILE_NAME) -f *.F90; \
99+
if [ ! -f $(DEP_FILE) ]; then \
100+
echo "Creating dependencies file: $(DEP_FILE)"; \
101+
if command -v fortdepend >/dev/null 2>&1; then \
102+
fortdepend -w -o $(DEP_FILE) -f $(FREE_SOURCES) -b $(OBJ_DIR) -i omp_lib; \
103+
else \
104+
echo "Error: fortdepend is not installed. Please run 'make install' to install it."; \
105+
exit 1; \
106+
fi; \
36107
else \
37-
echo "Error: fortdepend is not installed. Please run 'make install' to install it."; \
38-
exit 1; \
108+
echo "Dependencies file already exists: $(DEP_FILE)"; \
109+
echo "Remove it and run 'make deps' to create a new one."; \
39110
fi; \
40111
}
41112

@@ -48,25 +119,42 @@ install: # Install fortdepend
48119
echo "fortdepend already installed."; \
49120
fi; \
50121
}
51-
make deps
122+
$(MAKE) deps
52123

124+
# Clean
53125
clean:
54-
@echo "rm -rf *.o *.mod main"
55-
@rm -rf *.o *.mod main
126+
@echo "Cleaning up..."
127+
@echo "rm -rf *.o *.mod $(OBJ_DIR)/*.o $(MOD_DIR)/*.mod $(EXE_FILE)"
128+
@rm -rf *.o *.mod $(OBJ_DIR)/*.o $(MOD_DIR)/*.mod $(EXE_FILE)
129+
@{ \
130+
if [ -d $(OBJ_DIR) ] && [ -z "$$(ls -A $(OBJ_DIR))" ]; then \
131+
rmdir $(OBJ_DIR); \
132+
echo "rmdir $(OBJ_DIR)"; \
133+
fi; \
134+
}
135+
@{ \
136+
if [ -d $(MOD_DIR) ] && [ -z "$$(ls -A $(MOD_DIR))" ]; then \
137+
rmdir $(MOD_DIR); \
138+
echo "rmdir $(MOD_DIR)"; \
139+
fi; \
140+
}
141+
142+
#--------------------------------------------------------------------------
143+
#--------------------------------------------------------------------------
56144

57145
# Include (or not) and create (if necessary) main.dep
58146
ifeq ($(filter-out main all,$(MAKECMDGOALS)),)
59-
ifneq ("$(wildcard $(DEP_FILE_NAME))","")
60-
include $(DEP_FILE_NAME)
61-
else
62147
include $(DEP_FILE)
63148
endif
64-
endif
65149

66-
## The creation of main.dep is made with the python package: fortdepend
67-
## It can be installed via pip:
68-
### $ python -m pip install fortdepend
69-
${DEP_FILE}:
70-
make deps
150+
${MAKE_DEP_FILE}:
151+
$(MAKE) deps
152+
153+
#--------------------------------------------------------------------------
154+
#--------------------------------------------------------------------------
155+
156+
# Phony rules
157+
.PHONY: clean all deps install serial debug
71158

72-
.PHONY: clean all deps install
159+
# Default rule
160+
.DEFAULT_GOAL := all

README.md

+77-39
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ Repositorio con programa para integrar partículas gravitatoriamente alrededor d
33

44
Los parámetros iniciales del sistema y la integración se modifican en el archivo: [config.ini](./config.ini)
55

6-
En caso de no utilizarlo, se usan los parámtros definidos en [main.F90](./main.F90#18#89), entre las líneas 18 y 89.
6+
En caso de no utilizarlo, se usan los parámetros definidos en [main.F90](./main.F90#22#118), entre las líneas 22 y 118.
77

88
# Usage
99

@@ -12,7 +12,9 @@ En caso de no utilizarlo, se usan los parámtros definidos en [main.F90](./main.
1212
make
1313
```
1414

15-
Recuerda volver a ejecutar `make` cada vez que se realice un cambio en algún .F90.
15+
Recuerda volver a ejecutar `make` cada vez que se realice un cambio en algún .F90.
16+
17+
Asimismo, recuerda ejecutar `make clean` en caso de realizar algún cambio de compilación.
1618

1719
## Run
1820

@@ -22,59 +24,95 @@ La ejecución básica de una particula individual se realiza con
2224
$ ./main <a> <e> <M> <w> <R> [args]
2325
```
2426

25-
Los argumentos "$a$, $e$, $M$, $\omega$" son los elementos orbitales, y $R$ (cociente inicial $n_{part}/\Omega_{ast}$) es opcional.
26-
En caso de usarlo, calcula y reemplaza el valor de a.
27+
Los argumentos "$a$, $e$, $M$, $\omega$" son los elementos orbitales, y $R$ (cociente de movimientos inicial $n_{part}/\Omega_{ast}$) es opcional.
28+
En caso de usarlo, calcula y reemplaza el valor de $a$.
2729

2830
Una ayuda puede obtenerse con
2931

3032
``` console
31-
$ ./main --help
32-
33-
Uso: ./main <ea> <ee> <eM> <ew> <eR> [args]
34-
ea : Elemento a de la partícula (km)
35-
ee : Elemento e de la partícula
36-
eM : Elemento M de la partícula (deg)
37-
ew : Elemento w de la partícula (deg)
38-
eR : Elemento R de la partícula [Opcional]
39-
-nsim : Asignar como número de simulación al 'int' que sigue
40-
--nodata : No guardar datos
41-
-datafile : Guardar datos en el archivo que sigue
42-
--noinfo : No guardar información
43-
-infofile : Guardar información en el archivo que sigue
44-
--nochaos : No guardar caos
45-
-chaosfile : Guardar caos en el archivo que sigue
46-
--screen : Imprimir información en pantalla
47-
--noscreen : No imprimir en pantalla
48-
--perc : Imprimir porcentaje de integración
49-
--noperc : No imprimir porcentaje de integración
50-
--datascr : Imprimir datos en pantalla
51-
--nodatascr : No imprimir datos en pantalla
52-
--nomap : No guardar mapas de potencial
53-
-mapfile : Guardar mapas de potencial en el archivo que sigue
54-
--implicit : Usar método implícito (integra boulders)
55-
--explicit : Usar método explícito (cos, sen)
56-
--elem : Imprimir elementos orbitales (solo partícula)
57-
--noelem : Imprimir coordenadas baricéntricas
58-
-tomfile : Utilizar archivo de (t)iempos|omega(t)|dmasa(t) que sigue
59-
--notomfile : No utilizar archivo de (t)iempos|omega(t)|dmasa(t)
33+
$ ./ASTROBOULD --help
34+
Uso: ./ASTROBOULD <ea> <ee> <eM> <ew> <eR> [args]
35+
ea : Elemento a de la partícula (km)
36+
ee : Elemento e de la partícula
37+
eM : Elemento M de la partícula (deg)
38+
ew : Elemento w de la partícula (deg)
39+
eR : Elemento R de la partícula [Optional]
40+
-mpart : Masa de la partícula individual
41+
-nsim : Asignar como número de simulación al 'int' que sigue
42+
-datafile : Guardar datos en el archivo que sigue
43+
--nodataf : No guardar datos
44+
-chaosfile : Guardar caos en el archivo que sigue
45+
--nochaosf : No guardar caos
46+
--screen : Imprimir información en pantalla
47+
--noscreen : No imprimir en pantalla
48+
--perc : Imprimir porcentaje de integración
49+
--noperc : No imprimir porcentaje de integración
50+
--datascr : Imprimir datos en pantalla
51+
--nodatascr : No imprimir datos en pantalla
52+
-multifile : Guardar datos en archivos individuales
53+
--nomultif : No guardar datos en archivos individuales
54+
-mapfile : Guardar mapas de potencial en el archivo que sigue
55+
--nomapf : No guardar mapas de potencial
56+
--implicit : Usar método implícito (integra) [default]
57+
--explicit : Usar método explícito (cos, sen)
58+
--elem : Imprimir elementos orbitales (solo partículas) [default]
59+
--noelem : Imprimir coordenadas baricéntricas
60+
-tomfile : Utilizar archivo de (t)iempos|omega|masa que sigue
61+
--notomfile : No utilizar archivo de (t)iempos|omega|masa
62+
-partfile : Utilizar archivo de partículas que sigue
63+
--nopartfile : No utilizar archivo de partículas
64+
--noconfig : No leer archivo de configuración
65+
--version1 : Usar versión 1: y=(B0, B1, ..., P0, ...)
66+
--version2 : Usar versión 2: y=(θ, ω, P0, ...) [default]
67+
--merge : Incluir asociar colisiones de partículas a asteroide
68+
--nomerge : No asociar colisiones de partículas
69+
--torque : Incluir torque de partículas hacia el asteroide
70+
--notorque : No incluir torque de partículas hacia el asteroide
71+
-parallel : Paralelizar usando la cantida de thread que sique
72+
--parallel : Paralelizar usando todos los threads disponibles
73+
--noparallel : No usar paralelización para partículas
74+
--help : Mostrar esta ayuda
75+
6076
```
6177

6278

63-
### PARALELO (Recordar estar en algún entorno de python)
79+
### Parallel
80+
81+
Hay 2 posibilidad de ejecución en paralelo:
82+
83+
- _Dependiente_: Se realiza una sola integración, incluyendo un asteroide y muchas partículas al mismo tiempo. Aquí se paralelizan las tareas relacionadas a cada partícula por separado (i.e, cálculo de aceleraciones, elementos orbitales, etc.).
84+
- _Independiente_: Se realizan múltiples integraciones independientes, con una partícula cada una. Aquí cada integración se ejecuta en paralelo.
85+
6486
En este caso se debe tener un **archivo con los datos de las partículas a integrar**.
65-
Este archivo se puede crear con el código [make_particles.py](./make_particles.py). Su configuración se realiza en las líneas [67 a 97](./make_particles.py#L67#L97).
87+
Este archivo se puede crear con el código [make_particles.py](./tools/make_particles.py). Su configuración se realiza en las líneas [75 a 102](./make_particles.py#75#L102), y si ejecució se realiza con:
88+
89+
``` console
90+
$ python make_particles.py
91+
```
6692

67-
Para ejecutar en paralelo, se puede utilizar el código [parallel.py](./parallel.py). Más información se encuentra [al inicio](./parallel.py#L2#L55) de este archivo. Luego de configurarlo, su ejecución se realiza con
93+
Para la integración _dependiente_ es necesario compilar usando _-fopenmp_ (incluído ya por default), mientras que para la independiente no es necesario. En este segundo caso, es posible compilar ejecutando ` make serial`, y así entonces no se utiliza _fopenmp_.
94+
95+
Para realizar la integración _independiente_, se provee el código en Python [launcher.py](./launcher.py). Más información se encuentra [al inicio](./launcher.py#L3#L42) de este archivo. Luego de configurarlo, su ejecución se realiza con:
6896

6997
``` console
70-
$ python parallel.py
98+
$ python launcher.py
7199
```
72100

101+
(Recordar estar en algún entorno de python)
102+
103+
Para realizar una integración _dependiente_, simplemente se debe editar el número de cpus en el [archivo de configuraciones](./config.ini) ([use parallel threads](./config.ini#L17)), o ejecutar directamente en la terminal:
104+
105+
``` console
106+
$ ./ASTROBOULD [args] -parallel <number of cpus to use>
107+
```
108+
109+
También se puede utilzar el código [launcher.py](./launcher.py) para esta integración, pero en este caso solo funcionará si está activado el modo [torque](./launcher.py#L70).
110+
73111
### Archivo TOM (Tiempos, Omega, Masa agregada)
74112

75-
Para crear este archivo se puede usar [make_TOM.py](./make_TOM.py), luego de configurarlo (líneas [17 a 41](./make_TOM.py#L17#L41)). Se puede encontrar más información [al inicio](./make_TOM.py#L5#L15) de este archivo.
113+
Para crear este archivo se puede usar [make_TOM.py](./tools/make_TOM.py), luego de configurarlo (líneas [17 a 41](./make_TOM.py#L17#L41)). Se puede encontrar más información [al inicio](./make_TOM.py#L5#L15) de este archivo.
76114

77-
Por otro lado, también se puede usar [make_TOM.f90](./make_TOM.f90), de C. Beaugé. Se debe configurar manualmente, para luego compilar y ejecutar.
115+
Por otro lado, también se puede usar [make_TOM.f90](./tools/make_TOM.f90), de C. Beaugé. Se debe configurar manualmente, para luego compilar y ejecutar.
78116

79117
# Author
80118
Emmanuel Gianuzzi

0 commit comments

Comments
 (0)