Skip to content

Commit

Permalink
Merge pull request #4 from caefleury/matplotlib-data-analysis
Browse files Browse the repository at this point in the history
feat: first test plot with mathplotlib
  • Loading branch information
caefleury authored Jun 7, 2024
2 parents 69eb5c7 + 644b6a3 commit 1dcf067
Show file tree
Hide file tree
Showing 11 changed files with 132 additions and 32 deletions.
6 changes: 4 additions & 2 deletions .github/workflows/python-app.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
# This workflow will install Python dependencies, run tests and lint with a single version of Python
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python

name: Python application

Expand Down Expand Up @@ -33,6 +31,10 @@ jobs:
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
- name: Build the Docker image
run: docker build . --file Dockerfile --tag my-image-name:$(date +%s)

- name: Test with pytest
run: |
pytest
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
__pycache__
.pytest_cache
.venv
.env
.env
src/data/
12 changes: 12 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
FROM python:3 AS build

# Copy your utility scripts or modules into the utils directory
COPY . .

RUN pip install -r requirements.txt

# Set the PYTHONPATH environment variable to include the utils directory
ENV PYTHONPATH="${PYTHONPATH}:/src/utils"

# Your application's entrypoint or command
CMD ["python", "src/main.py"]
53 changes: 29 additions & 24 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@ Repositório com as simulações do projeto de PIBITI focado em simulações ter

## Objetivos:

- Criar a célula unitário do R10-Graphene em arquivo .xyz
- Criar a célula unitária do R10-Graphene em arquivo .xyz
- Gerar a estrutura padrão de uma folha de R10-Grapehene com um script genético
- Gerar estruturas com rasgos (nanocracks)
- Gerar estrutura pristine e estruturas com rasgos (nanocracks).
- Simular deformações utilizando o LAMMPS.
- Analisar os dados das deformações e indicar as propriedades termodinâmicas das estruturas.

## Configurações iniciais

Expand All @@ -32,6 +34,7 @@ export PYTHONPATH=$PWD/src/utils
Subistituir `$PWD` pelo caminho até o repositorio. Exemplo: `/home/my_user/.../<nome_do_repositorio>`

### Configuração do PYTHONPATH em ambiente virtual

1. `python3 -m venv venv`
2. `source ./venv/bin/activate`

Expand Down Expand Up @@ -71,56 +74,58 @@ Acessar a pasta e executar o arquivo com a simulação do rasgo:
python3 <nome_do_arquivo>.py
```

## VMD Scripting
## VMD Scripting

### set – Setting the unitcell parameters
### set – Definindo os parâmetros da célula unitária

To be able to work correctly, all other procedures of the PBCTools plugin require the VMD unitcell parameters to be set. Some file formats and their readers provide the necessary information (e.g. the DCD, VTF and Amber crdbox formats). When the format does not provide the information, the parameters can either be set with help of the command pbc set, or they can be read in from a file in XST format via the procedure pbc readxst (see section 5).
Para que funcione corretamente, todos os outros procedimentos do plugin PBCTools requerem que os parâmetros da célula unitária do VMD sejam definidos. Alguns formatos de arquivo e seus leitores fornecem as informações necessárias (por exemplo, os formatos DCD, VTF e Amber crdbox). Quando o formato não fornece a informação, os parâmetros podem ser definidos com a ajuda do comando pbc set, ou podem ser lidos de um arquivo no formato XST através do procedimento pbc readxst.

### Syntax:
### Sintaxe:

```
pbc set cell [options…]
```
### Description:

Sets the VMD unit cell properties to cell in the specified frames. cell must either contain a single set of unit cell parameters that will be used in all frames of the molecule, or it must contain a parameter set for every frame.
### Descrição:

Define as propriedades da célula unitária do VMD como cell nos quadros especificados. A cell deve conter ou um único conjunto de parâmetros da célula unitária que será usado em todos os quadros da molécula, ou deve conter um conjunto de parâmetros para cada quadro.

### Example

Set the unit cell side length to 10 in all frames:
Definir o comprimento do lado da célula unitária como 10 em todos os quadros:

```
pbc set {10.0 10.0 10.0}
```

```
pbc set {10.0 10.0 10.0}
```
### Uso na simulação:

O tamanho da caixa deve refletir o tamanha da estrutura.O calculo pode ser feito com os valores das lattice constants e o número de replicações. Para o valor de z podemos atribuir 100.

Para as estruturas nesse projeto temos que:
- a (eixo x) = 6.3028
- b (eixo y) = 4.9302

Para o número de replicações temos que:
- eixo x = 17
- eixo y = 21
- a (eixo x) = 6.3028
- b (eixo y) = 4.9302

Portanto, nossa caixa de simulação terá os seguintes valores:
Para o número de replicações temos que:

- em x: a * replicações em x = 6.3028 * 17 = 107.1476
- em y: b * replicações em y = 4.9302 * 21 = 103.5342
- em z: z = 100
- eixo x = 17
- eixo y = 21

Portanto, nossa caixa de simulação terá os seguintes valores:

- em x: a _ replicações em x = 6.3028 _ 17 = 107.1476
- em y: b _ replicações em y = 4.9302 _ 21 = 103.5342
- em z: z = 100

```
pbc set {107.1476 103.5342 100.0}
```


## Padrão de pastas para simulação LAMPPS

### Uma pasta de simulação LAMPPS precisa de 3 arquivos
### Uma pasta de simulação LAMPPS precisa de 3 arquivos

1. Arquivo .charge da estrutura
2. Arquivo .reaxff
3. Arquivo da strain (strain-x ou strain-y)
3. Arquivo da deformação (strain-x ou strain-y)
5 changes: 5 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
version: '3'
services:
app:
build: .
command: tail -f /dev/null
5 changes: 4 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
flake8
autopep8
pytest
pytest
matplotlib
numpy
mplcursors
2 changes: 1 addition & 1 deletion src/charge_structures/center_crack_structure.charge
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ LAMMPS data file. CGCMM style. atom_style charge generated by VMD/TopoTools v1.7
0 improper types
-0.000002 107.147596 xlo xhi
-0.000005 103.534198 ylo yhi
-50.000000 50.000000 zlo zhi
-4.000000 96.000000 zlo zhi

# Pair Coeffs
#
Expand Down
2 changes: 1 addition & 1 deletion src/charge_structures/n1_x_axis_crack_structure.charge
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ LAMMPS data file. CGCMM style. atom_style charge generated by VMD/TopoTools v1.7
0 improper types
-0.000002 107.147596 xlo xhi
-0.000005 103.534198 ylo yhi
-50.000000 50.000000 zlo zhi
-4.000000 96.000000 zlo zhi

# Pair Coeffs
#
Expand Down
2 changes: 1 addition & 1 deletion src/charge_structures/n1_y_axis_crack_structure.charge
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ LAMMPS data file. CGCMM style. atom_style charge generated by VMD/TopoTools v1.7
0 improper types
-0.000002 107.147596 xlo xhi
-0.000005 103.534198 ylo yhi
-50.000000 50.000000 zlo zhi
-4.000000 96.000000 zlo zhi

# Pair Coeffs
#
Expand Down
2 changes: 1 addition & 1 deletion src/charge_structures/pristine_structure.charge
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ LAMMPS data file. CGCMM style. atom_style charge generated by VMD/TopoTools v1.7
0 improper types
-0.000002 107.147596 xlo xhi
-0.000005 103.534198 ylo yhi
-50.000000 50.000000 zlo zhi
-4.000000 96.000000 zlo zhi

# Pair Coeffs
#
Expand Down
72 changes: 72 additions & 0 deletions src/data/strain_data_draft.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import numpy as np
import matplotlib.pyplot as plt
import mplcursors

# Certifique-se de adicionar os arquivos das simulações na pasta data
# Alterar o caminho dos arquivos de dados.

strain = 'strain-x'
simulation_data = f'pristine/{strain}/2/stress_strain.dat'
strain_no_gold = np.genfromtxt(f'src/data/no_gold_final_simulation/{simulation_data}')
strain_gold = np.genfromtxt(f'src/data/gold_substrate_final_simulation/{simulation_data}')

# Criar figura com dois graficos
fig, axs = plt.subplots(2, figsize=(18, 10))

def moving_average(x, window_size):
return np.convolve(x, np.ones(window_size), 'valid') / window_size

window_size = 1

if strain == 'strain-x':
# Deformacao em x de simulação sem o substrato de ouro
smoothed_stress_no_gold = moving_average(strain_no_gold[:, 1], window_size)
line1, = axs[0].plot(strain_no_gold[:len(smoothed_stress_no_gold), 0], smoothed_stress_no_gold, label='Ex. strain-x simulation without gold substrate')
axs[0].set_xlabel('Strain (x)')
axs[0].set_ylabel('Stress (y)')
axs[0].legend()

# Deformacao em x de simulação com o substrato de ouro
smoothed_stress_gold = moving_average(strain_gold[:, 1], window_size)
line2, = axs[1].plot(strain_gold[:len(smoothed_stress_gold), 0], smoothed_stress_gold, label='Ex. strain-x simulation with gold substrate')
axs[1].set_xlabel('Strain (x)')
axs[1].set_ylabel('Stress (y)')
axs[1].legend()

elif strain == 'strain-y':
# Deformacao em y de simulação sem o substrato de ouro
smoothed_stress_no_gold = moving_average(strain_no_gold[:, 2], window_size)
line1, = axs[0].plot(strain_no_gold[:len(smoothed_stress_no_gold), 0], smoothed_stress_no_gold, label='Ex. strain-y simulation without gold substrate')
axs[0].set_xlabel('Strain (x)')
axs[0].set_ylabel('Stress (y)')
axs[0].legend()

# Deformacao em y de simulação com o substrato de ouro
smoothed_stress_gold = moving_average(strain_gold[:, 2], window_size)
line2, = axs[1].plot(strain_gold[:len(smoothed_stress_gold), 0], smoothed_stress_gold, label='Ex. strain-y simulation with gold substrate')
axs[1].set_xlabel('Strain (x)')
axs[1].set_ylabel('Stress (y)')
axs[1].legend()

# Adicionando tooltips interativos
cursor1 = mplcursors.cursor(line1, hover=True)
cursor2 = mplcursors.cursor(line2, hover=True)

@cursor1.connect("add")
def on_add1(sel):
x, y = sel.target
sel.annotation.set(text=f'Strain(x): {x:.4f}\nStress(y): {y:.4f}')

@cursor2.connect("add")
def on_add2(sel):
x, y = sel.target
sel.annotation.set(text=f'Strain(x): {x:.4f}\nStress(y): {y:.4f}')

# Ajustar layout e plotar
plt.tight_layout()

# Ativar a barra de ferramentas de navegação
plt.get_current_fig_manager().toolbar.pan()
plt.get_current_fig_manager().toolbar.zoom()

plt.show()

0 comments on commit 1dcf067

Please sign in to comment.