Ir para o conteúdo

Pore Network

Simulation

Este módulo pode realizar diferentes tipos de simulações a partir dos resultados da tabela de poros e ligações (criada no módulo de Extração). As simulações incluem: One-phase, Two-phase, Mercury injection, explicados nas seções adiante.

Todas as simulações possuem os mesmos argumentos de entrada: A tabela de poros gerada a partir da extração da rede e quando o volume for multiescalar, o modelo subescala utilizado e sua parametrização.

Figura 1
Figura 1: Entrada da tabela de poros gerada com o módulo Extração.

One-phase

A simulação de uma fase, é utilizada principalmente para determinar a propriedade de permeabilidade absoluta (\(K_{abs}\)) da amostra.

Figura 2
Figura 2: Simulação de uma fase.

Três diferentes solvers podem ser usados para esse tipo de simulação:

  • pypardiso (recomendado) : rende os melhores resultados, convergindo mesmo em situações de raios muito discrepantes;
  • pyflowsolver : inclui uma opção de seleção do critério de parada, porém com performance menor que o pypardiso;
  • openpnm : opção mais tradicionalmente usada;
Figura 3
Figura 3: Opção pyflowsolver e critério de parada. As demais opções (pypardiso e openpnm) não possuem esse critério.

Quando os valores de condutividade são muito discrepantes para a mesma amostra, e essa amostra percola mais pela subescala, podemos ter problemas na convergência para a solução, por conta disso, adicionamos uma opção para poder limitar os valores em altas condutividades.

Figura 4
Figura 4: Opções de limitação dos valores de condutividade.

Além disso, a simulação de uma fase pode ser realizada em uma única direção, ou em múltiplas direções, a partir do parâmetro Orientation scheme.

Figura 5
Figura 5: Esquema de orientação utilizado.

Two-phase

A simulação de duas fases consiste em inicialmente injetar óleo na amostra e aumentar a pressão do mesmo afim de que esse invada praticamente todos os poros, num processo que é conhecido como drenagem (drainage). Após essa primeira etapa, substitui-se o óleo por água e novamente aumenta-se a pressão, de forma a permitir que a água invada alguns dos poros que antes estavam com óleo, expulsando o último, esse segundo processo é conhecido como embebição (imbibition). Ao medirmos a permeabilidade da rocha em relação a permeabilidade absoluta, em função da saturação de água durante esse processo, obtemos a curva conhecida como curva de permeabilidade relativa (\(K_{rel}\)).

Uma vez que cada rocha pode interagir físicamente ou quimicamente com o óleo e com a água de diferentes maneiras, precisamos de uma variedade bastante grande de parametros que permitam calibrar os resultados de forma a modelar e simplificar essa interação, afim de extrairmos algum significado físico das propriedades da rocha a partir da simulação. Abaixo, elencamos alguns parâmetros que podem ser encontrados na simulação de duas fases disponibilizada no GeoSlicer.

Atualmente, temos disponível no GeoSlicer dois algoritmos para realizar a simulação de duas fases, a primeira delas é a do PNFlow que é um algoritmo padrão utilizado, implementado em C++, e a segunda é um algoritmo próprio desenvolvido pela LTrace em linguagem Python.

Salvar/Carregar tabela de seleção de parâmetros

Para facilitar a reprodução de simulações que rodam no mesmo conjunto de parâmetros, a interface possui opções para salvar/carregar os parâmetros a partir de tabelas que são salvas junto ao projeto. Dessa forma, ao calibrar o conjunto de parâmetros, o usuário pode guardar essas informações para uma outra análise posterior, ou usar esses mesmos parâmetros em outra amostra.

Figura 6aFigura 6b
Figura 6: Opções para salvar/carregar tabelas de seleção de parâmetros.

Fluid properties

Nessa seção é possível alterar os parâmetros dos fluidos (água e óleo) utilizados na simulação:

Figura 7
Figura 7: Entrada dos parâmetros dos fluidos (água e óleo).

Contact angle options

Uma das principais propriedades que afetam a interação de um líquido com um sólido é a molhabilidade, essa pode ser determinada a partir do ângulo de contato formado pelo primeiro quando em contato com o último. Assim, se o ângulo de contato for próximo de zero há uma forte interação que "prende" o líquido ao sólido, já quando o ângulo de contato é próximo a 180º, a interação do líquido com a superfície é fraca e esse pode escoar com mais facilidade pela mesma.

Figura 8
Figura 8: Representação visual do conceito de molhabilidade e ângulo de contato.

Modelamos os ângulos de contato a partir de duas distribuições usadas em momentos distintos: a Initial contact angle que controla o ângulo de contato dos poros antes da invasão por óleo; e a Equilibrium contact angle que controla o ângulo de contato após a invasão por óleo. Além das distribuições base utilizadas em cada caso, há uma opção para adicionar uma segunda distribuição para cada uma delas, assim cada poro é atrelado a uma das duas distribuições, com o parâmetro "Fraction" sendo usado para determinar qual a porcentagem de poros vão seguir a segunda distribuição em relação a primeira.

Figura 9
Figura 9: Parâmetros das distribuições de ângulo de contato.

Cada distribuição de ângulos, seja primária ou secundária, inicial ou de equilíbrio, tem uma série de parâmetros que a descreve:

  • Model: permite modelar as curvas de histerese entre ângulos de avanço/recuo a partir dos ângulos intrínsicos:

    • Equal angles: ângulos de avanço/recuo idênticos ao ângulo intrinsico;
    • Constant difference: diferença constante dos ângulos de avanço/recuo em relação ao ângulo intrínsico;
    • Morrow curve: curvas de avanço/recuo determinadas pelas curvas de Morrow;
Figura 10
Figura 10: Curvas para cada um dos modelos de ângulo de contato implementados no GeoSlicer. Imagem retirada de N. R. Morrow, 1975 (https://doi.org/10.2118/75-04-04).
  • Contact angle distribution center: Define o centro da distribuição de ângulo de contato;
  • Contact angle distribution range: Alcance da distribuição (center-range/2, center+range/2), com o ângulo mínimo/máximo sendo 0º/180º, respectivamente;
  • Delta, Gamma: Parâmetros da distribuição de Weibull truncada, se um número negativo é escolhido, usa uma distribuição uniforme; Se números positivos são escolhidos, usa a seguinte distribuição de probabilidades: \(p(\tilde\theta)=\frac{\gamma}{\delta}\frac{\tilde\theta^{\gamma-1}e^{-\tilde\theta^\gamma/\delta}}{1-e^{-1/\delta}}\) onde \(\tilde\theta\in[\theta_{min},\theta_{max}]\). Algumas ideias de parâmetros para essa distribuição são gráficados abaixo:
Figura 11
Figura 11: Distribuição de Weibull.
  • Contact angle correlation: Escolhe como o ângulo de contato será correlacionado ao raio dos poros: Positive radius define maiores ângulos de contato para raios maiores; Negative radius faz o oposto, atribuindo maiores ângulos para raios menores; Uncorrelated significa independência entre ângulos de contato com o raio do poro;
  • Separation: Se o modelo escolhido for constant difference, define a separação entre ângulos de avanço e recuo;

Outros parâmetros estão definidos apenas para a segunda distribuição:

  • Fraction: Um valor entre 0 e 1 que controla qual a fração dos poros usará a segunda distribuição ao invés da primeira;
  • Fraction distribution: Define se a fração será determinada pela quantidade de poros ou volume total;
  • Correlation diameter: Se a Fraction correlation for escolhida como Spatially correlated, define a distância mais provável de encontrar poros com mesma distribuição de ângulo de contato;
  • Fraction correlation: Define como a fração para a segunda distribuição será correlacionada, se correlacionada espacialmente, para maiores poros, menores poros ou aleatória;

Modo de Execução

O usuário pode escolher entre dois modos de execução para realizar a simulação bifásica:

  • Local: Executa a simulação diretamente na máquina do usuário. Nesse modo, o usuário pode definir a opção de simulação Max subprocesses, que controla quantos subprocessos de thread única serão executados em paralelo. O valor recomendado é cerca de dois terços do total de núcleos de CPU disponíveis para um desempenho otimizado sem sobrecarregar o sistema.

  • Remoto: Envia a simulação para ser executada em um cluster de computação configurado. Nesse modo, o usuário especifica o opção Number of jobs em que a simulação será dividida. Ideal para testes de sensibilidade muito grandes. A interface à direita mostrará o progresso da simulação, e o usuário também pode clicar em Open para inspeção dos resultados parciais antes da conclusão.

Figure 12a
Figura 12a: Seleção do modo de execução para a simulação bifásica.
Figure 12b
Figure 12b: Opções do job enviado a cluster.

Essa flexibilidade permite que o usuário aproveite o processamento local para execuções de testes menores ou utilize recursos de computação em cluster para simulações mais complexas ou de grande escala.

Simulation options

Essa seção de parâmetros é dedicada a controlar os parâmetros relacionados a própria simulação.

Figura 13
Figura 13: Parâmetros da simulação.
  • Minimum SWi: Define o valor mínimo de SWi, interrompendo o ciclo de drenagem quando o valor de Sw é atingido (SWi pode ser maior se a água ficar presa);
  • Final cycle Pc: Interrompe o ciclo quando essa pressão capilar é alcançada;
  • Sw step length: Passo de Sw utilizado antes de verificar o novo valor de permeabilidade;
  • Inject/Produce from: Define por quais lados o fluido será injetado/produzido ao longo do eixo z, o mesmo lado pode tanto injetar como também produzir;
  • Pore fill: Determina qual mecanismo domina cada evento de preenchimento de poro individual;
  • Lower/Upper box boundary: Poros com distância relativa no eixo Z da borda até este valor do plano são considerados poros "à esquerda"/"à direita", respectivamente;
  • Subresolution volume: Considera que o volume contém essa fração de espaço poroso em subresolução que está sempre preenchido com água;
  • Plot first injection cycle: Se selecionado, o primeiro ciclo, injeção de óleo em um meio totalmente saturado de água, será incluído no gráfico de saída. A simulação será executada, independentemente da opção estar selecionada ou não;
  • Create animation node: Cria um nó de animação que pode ser usado na aba "Cycles Visualization";
  • Keep temporary files: Mantém os arquivos .vtu na pasta de arquivos temporários do GeoSlicer, um arquivo para cada etapa da simulação;
  • Max subprocesses: Quantidade máxima de subprocessos single-thread que devem ser executados; O valor recomendado para uma máquina ociosa é 2/3 do total de núcleos;
  • Number of jobs: número de jobs em que a simulação será dividida no cluster;

Uma vez que temos uma vasta quantidade de parâmetros que podem ser modificados para modelar o experimento a partir da simulação, se torna útil variarmos tais parâmetros de forma mais sistemática para uma análise aprofundada da sua influência nos resultados obtidos.

Para isso o usuário pode selecionar o botão "Multi" disponível em grande parte dos parâmetros, ao clicar em Multi, três caixas aparecem com opções de início, fim e passo, que podem ser usadas para rodar diversas simulações em uma tabela linearmente distribuída dos valores desses parâmetros. Se mais de um parâmetro é escolhido com múltiplos valores, simulações rodam com todas as combinações de parâmetros possíveis, isso pode aumentar consideravelmente a quantidade de simulações e o tempo para executar.

Ao finalizar a execução do conjunto de simulações, o usuário pode realizar análises para entender as relações entre os resultados das simulações com os parâmetros escolhidos na aba Krel EDA.

Mercury injection

Além das simulações de uma e duas fases, também temos disponível nesse módulo uma simulação do experimento de intrusão de Mercúrio.

Figura 14
Figura 14: Simulação de intrusão de Mercúrio.

A intrusão de mercúrio é um experimento no qual mercúrio líquido é injetado em uma amostra de rocha reservatório sob vácuo, com pressão crescente. O volume de mercúrio invadindo a amostra é medido em função da pressão de mercúrio. Uma vez que o ângulo de contato do mercúrio líquido com o vapor de mercúrio é aproximadamente independente do substrato, é possível utilizar modelos analíticos, como o modelo do feixe de tubos, para calcular a distribuição do tamanho dos poros da amostra.

O ensaio de intrusão de mercúrio é relativamente acessível e sua principal relevância no contexto do PNM reside na capacidade de executar a simulação em uma amostra para a qual os resultados experimentais de curvas de Pressão Capilar por Intrusão de Mercúrio (MICP) estão disponíveis. Isso permite a comparação dos resultados para validar e calibrar a rede de poros extraída da amostra, que será usada nas simulações de uma e duas fases.

Para facilitar as análises da atribuição dos raios dos poros sub-resolução, o código presente no GeoSlicer produzirá como saída, além dos gráficos obtidos pela simulação no OpenPNM, os gráficos das distribuições de raios de poros e gargantas e também das distribuições de volumes, separando em poros resolvidos (que não se alteram pela atribuição da subescala) e poros não resolvidos. Dessa forma, o usuário pode conferir se o modelo de subescala foi aplicado corretamente.

Modelo Subscala

No caso da rede multiescalar, como os raios da subescala não podem ser determinados a partir da própria imagem, por estarem fora da resolução, é necessário definir um modelo para atribuição desses raios. Algumas opções disponíveis atualmente são:

  • Fixed radius: Todos os raios da subresolução tem o mesmo tamanho escolhido na interface; Figura 15

  • Leverett Function - Sample Permeability: Atribui uma pressão de entrada com base na curva de J Leverett com base na permeabilidade da amostra; Figura 16

  • Leverett Function - Permeability curve: Também utiliza a curva de J Leverett mas com uma curva definida para a permeabilidade ao invés de um valor; Figura 17

  • Pressure Curve e Throat Radius Curve: Atribui os raios da subresolução com base na curva obtida por um experimento de injeção de mercúrio. Pode ser utilizado o dado da pressão de entrada pela fração do volume, ou então o raio equivalente em função da fração de volume; Figura 18aFigura 18b

Ambos os modelos exigem uma tabela contendo a Fração Incremental do Volume de Poros (\(\Delta S_i\)). Esse parâmetro representa a porção do espaço poroso total que é preenchida com mercúrio durante um intervalo de pressão específico (ou, equivalentemente, o volume associado a uma faixa específica de tamanhos de garganta). Ele é obtido a partir da saturação cumulativa (\(S_{Hg}\)) experimental de Pressão Capilar por Intrusão de Mercúrio (MICP), calculando a diferença entre pontos consecutivos: \(\Delta S_{i} = S_{Hg}(P_{i}) - S_{Hg}(P_{i-1})\). Esta fração é usada para ponderar as funções capilares de sub-resolução, garantindo que a injeção de mercúrio simulada corresponda à distribuição experimental da amostra.

O modelo de subescala escolhido não tem impacto nas simulações de redes uniescalares, uma vez que todos os raios já estão determinados.


Extractor

Esse módulo é utilizado para extrair a rede de poros e ligações a partir de: uma segmentação individualizada dos poros (Label Map Volume) realizada por um algoritmo de watershed, gerando uma rede uniescalar; ou por um mapa de porosidades (Scalar Volume), que gerará um modelo multiescalar com poros resolvidos e não-resolvidos.

Interface do módulo de Extração
Figura 1: Interface do módulo de Extração.

Após a extração, ficará disponível na interface do GeoSlicer: as tabelas de poros e gargantas e também os modelos de visualização da rede. As tabelas geradas serão os dados usados na etapa seguinte de simulação.

Label MapRede Uniescalar
Figura 1: A esquerda Label Map utilizado como entrada na extração e a direita rede uniescalar extraída.
ScalarRede Multiescalar
Figura 2: A esquerda Scalar Volume utilizado como entrada na extração e a direita rede multiescalar extraída, onde azul representa poros resolvidos, e rosa representa os poros não-resolvidos.

Escala de Cores:

Esferas (Poros):

  • Azul - Poro resolvido
  • Magenta - Poro não resolvido

Cilindros (Gargantas):

  • Verde - Garganta entre poros resolvidos
  • Amarelo - Garganta entre um poro resolvido e um não resolvido
  • Vermelho - Garganta entre poros não resolvidos

Remote Workflow

The Pore Network Remote Workflow module provides an end-to-end automated pipeline for batch processing raw micro-CT sample volumes on a remote computing cluster. It coordinates raw data loading, adaptive cropping, artifact shading correction, porosity mapping, and multiscale pore network extraction, leading directly into single- and two-phase transport simulations.

By using Dask distributed scheduling over a SLURM Cluster, the workflow parallelizes tasks across multiple instances, making large sensitivity studies manageable from a single dashboard.


Sample Listing and Selection

Remote Workflow Module Interface
Figure 1: Main data selector and sample filtering table.
  • Select CSV File / Load: Select your index file data (e.g., All) and click Load to populate the sample list.
  • Filter: Dynamically query the loaded samples by:

    • name
    • codigo_amostra
    • tipo_amostra
    • phi (experimentally measured absolute porosity, if available)
  • Target Selection Area: Double-click any row in the filtered table to add the sample name to the selection box below. Sample names may also be pasted or edited manually using spaces, commas, or semicolons as separators.


Workflow Settings

Remote Workflow Module Interface
Figure 2: Workflow settings.

Workflow Configuration

The Load parameters and Save parameters sections allow the complete Remote Workflow configuration to be stored as reusable parameter nodes inside the current GeoSlicer scene. This enables entire workflow configurations to be saved, shared, and restored without manually reconfiguring the interface.

Save parameters

The Save parameters section stores the current workflow configuration as a new Remote Workflow parameter node.

  • Output parameter node name: Specifies the name of the parameter node to create.
  • Save parameters: Saves the current workflow configuration into the scene.

The generated parameter node appears in the Subject Hierarchy and can later be selected from the Load parameters section.

Load parameters

The Load parameters section restores a previously saved Remote Workflow configuration.

  • Input parameter node: Select a previously saved Remote Workflow parameter node.
  • Load parameters: Restores all saved settings into the current interface.

Note: Remote Workflow parameter nodes store references to existing Extractor and Simulation parameter nodes. If a referenced parameter node is no longer present in the current scene, its corresponding selector remains empty.

Processing Parameters

  • Extractor params: Select the extraction parameters used to generate the pore network.
  • One-phase params: Select the parameters used for the one-phase simulation.
  • Two-phase params: Select the parameters used for the two-phase simulation.

Note: One-phase and two-phase simulations are executed only when Extractor params is selected.

💡 How Parameter Nodes are Generated The parameter nodes available in the Extractor params, One-phase params, and Two-phase params selectors are created from the Pore Network Extractor and Pore Network Simulation modules. Configure the desired settings in those modules, expand the Save parameters section, and click Save parameters to create reusable parameter nodes. The Remote Workflow parameter nodes created by this module are separate objects. They store the workflow configuration together with references to the selected extractor and simulation parameter nodes, allowing an entire workflow setup to be restored with a single click.

  • Output Folder Prefix: Appends a custom identifying string to the workflow output directory name.
  • Downsampling Factor(s): Accepts a comma-separated list of values (e.g., 2, 4.5, 6). A separate workflow is generated for each specified factor.
  • Workers: Defines the maximum number of samples processed simultaneously on the cluster. The Suggest button automatically calculates the recommended number of workers based on the number of selected samples and downsampling factors.
  • Save workstep image: Controls whether intermediate workstep images are generated and stored for inspection.

Crop Sample Options

When samples do not fill the visual field or exhibit border degradation, the Crop Sample stage isolates the valid rock volume.

Crop Methods

  • Method: Specifies the method used to isolate the rock volume.
  • Auto: The workflow analyzes the micro-CT volume boundaries to automatically choose the most appropriate cropping strategy:

    • If the sample fills the image but exhibits corner attenuation, Cylindrical crop is selected.
    • If the sample terminates before the image boundaries, Sample segmentation is selected.
    • Otherwise, cropping is skipped.
  • Cylindrical Crop: Applies a cylindrical mask. Center coordinates default to the detected sample center. The radius may be automatically reduced using the Reduction (%) parameter.

  • Sample Segmentation: Uses a 3-phase Multi-Otsu segmentation followed by morphological processing to separate the rock from the background and remove artifacts.

  • Discard bottom/top: Removes a configurable percentage (0–45%) from the lower and upper ends of the sample along the Z axis.

Once the crop mask is generated, the workflow trims the image to the smallest bounding box enclosing the selected sample.


Shading Correction Options

Corrects illumination gradients and X-ray beam hardening artifacts.

  • Function: Specifies the correction model:
  • Auto: Evaluates sample boundaries and cropping results to select the most appropriate correction model.

    • If it is a cylindrical cropping or partial sample boundaries are detected, Polynomial Radial is selected.
    • If no sample cropping is required, Spline Radial is selected.
  • Polynomial: Fits a conventional polynomial across the calculated slice mask.

  • Polynomial Radial: Constraints the polynomial fitting to a radially symmetric model.
  • Spline Radial: Applies a radially symmetric spline-based function.
  • Order: Specifies the polynomial order (2, 4, or 6) when a polynomial model is selected.
  • Slice Group Size: Number of consecutive slices sharing the same fitted correction model.
  • Fitting Points (%): Percentage of mask pixels used to estimate the correction surface.
  • Mask Percentile Min/Max: Defines the intensity percentile range used to estimate the correction mask.

Porosity Map Options

This stage generates the porosity map required by multiscale pore network extraction.

  • Gradient Anisotropic Diffusion (GAD): Optional edge-preserving smoothing filter that reduces noise while preserving pore boundaries.
  • Porosity Derivation Methods
    • Standard Method (experimental φ available): Uses the experimental porosity loaded from the database to calibrate the porosity map.
    • Fallback Method (experimental φ unavailable): Uses a three-class Multi-Otsu segmentation to estimate macro- and sub-resolution porosity.
  • Otsu Threshold Shifts: Allow manual adjustment (±15%) of the Multi-Otsu thresholds when using the fallback method.

Remote Jobs Tab Interface

When Apply or Visualize is executed, the workflow is submitted to the remote cluster as a single master job (PNM Workflow: <prefix>). Progress can be monitored from the Remote Jobs tab.

Right-clicking a workflow entry provides the following actions:

  • Open: Downloads every completed sample currently available without waiting for the entire workflow to finish.
  • Details: Displays job information, SLURM identifiers, execution paths, and stored parameters.
  • Reconnect: Reconnects to the remote scheduler after communication interruptions.
  • Cancel/Delete: Terminates the workflow and removes the associated cluster jobs.

Data Collection

When workflow results are opened, GeoSlicer automatically reconstructs the project hierarchy:

  1. Creates workflow directory: <Prefix>_<Workflow_ID>.
  2. Creates sample directories: <Sample_Name_Stem>.
  3. Creates one directory for each downsampling factor (DS_<Factor>_R<Index>):

    • Workflow params
    • Experimental Krel data
    • Workstep image lazy nodes:
      • Sample
      • Cropped_Sample
      • Cropped_Sample_Mask
      • Shading_Correction
      • Shading_Mask
      • GAD_Pre_Porosity_Map
      • Porosity_Map
    • Network Extraction nodes
    • One-Phase simulation nodes
    • Two-Phase simulation nodes
  4. Creates aggregated resolution analysis nodes for comparing multiple downsampling factors.


Step-by-Step Execution Guide

  1. Generate parameter nodes

    • Configure the Pore Network Extractor module and save its parameter node.
    • Configure the Pore Network Simulation module and save the desired one-phase and/or two-phase parameter nodes.
  2. Load the database

    • Open Pore Network Remote Workflow.
    • Select the desired CSV repository and click Load.
  3. Select samples

    • Filter the sample list.
    • Double-click the desired samples or paste sample names into the selection box.
  4. Configure the workflow

    • Optionally load a previously saved Remote Workflow configuration.
    • Select the Extractor, One-phase, and Two-phase parameter nodes.
    • Configure downsampling factors, worker count, and preprocessing options.
  5. Run the workflow

    • Click Apply to submit the workflow to the cluster.
    • Click Visualize to perform a visualization-only execution.
  6. Monitor execution

    • Open the Remote Jobs tab.
    • Use Open at any time to retrieve completed samples while the remaining tasks continue processing.