Overview
santanu sinha
RESEARCHER
About

My research focuses on multiphase flow in porous media, which is essentially how multiple fluids move through materials filled with tiny, interconnected spaces. These materials are found everywhere: from the earth beneath our feet, to the tissues in our bodies, and the materials in our infrastructure. Specifically, I work on upscaling problems, by utilizing methods like pore-scale modeling, thermodynamics, and statistical physics. Additionally, I work on fiber bundle models and percolation theory, with particular attention to the relationships between disorder, connectivity, structure, and failure mechanisms. My academic background includes a PhD in statistical physics.

Highlights
Spin-glass transition in two-phase flow
Steady-state immiscible two-phase flow in porous media undergoes a spin-glass (SG) to paramagnetic (P) phase transition, which coincides with Darcy scale non-linear crossover.
Dynamic pore-Network simulation
A dynamic pore-network model for immiscible two-phase flow, that can simulation drainage and steady-state flow in regular or reconstructed core-sample networks.
Non-linear growth of viscous fingers
Growth of viscous fingers during the drainage of immiscible of two-phase flow in porous media follow non-linear relationship with the local pressure drop in a certain regime.
Disorder and stress competition in fracture
Interplay between disorder and stress enhancement leads a fracture processes to a localization transition, the order of which depends on the disorder distribution of the thresholds.
[Scroll down for full publication list]
Credentials
Background
  • PhD [Indian Institute of Technology Guwahati, India]
  • Post Docs [NTNU and UiO, Norway, and CSRC, China]
  • Assistant professor [Assam University Silchar, India]
  • International Young Scientists grant [NSFC China]
  • Board member [Interpore Norway]
Skills
C/C++, Python, OpenGL, Linux, Shapr3D, LaTeX, KiCad
Explorations
Beyond the lab
  • Electronics, Teensy and Arduino, 3D modeling
Social
  • Traveling, Filming, Cooking
Publications
2026
  • Glassy phase transition in immiscible steady-state two-phase flow in porous media, S. Sinha, H. Carmona, J. S. Andrade Jr. and A. Hansen
  • Coordination-number dependent universality in Mixed Wet Percolation, J. R. Das, S. Sinha, A. Hansen and S. B. Santra
  • Immiscible two-phase flow in porous media: a statistical mechanics approach, A. Hansen and S. Sinha, Journal of Statistical Mechanics: Theory and Experiment
  • Pressure drop-flow rate nonlinearity in bubble trains through a capillary bundle, P. Botticini, D. Picchi, S. Sinha and A. Hansen
2025
  • Thermodynamics-like Formalism for Immiscible and Incompressible Two-Phase Flow in Porous Media, A. Hansen and S. Sinha
  • Mixed-wet percolation on a dual square lattice, J. R. Das, S. Sinha, A. Hansen and S. B. Santra
2024
  • Immiscible two-phase flow in porous media: Effective rheology in the continuum limit, S. Roy, S. Sinha and A. Hansen
  • Disorder-induced non-linear growth of fingers in immiscible two-phase flow in porous media, S. Sinha, Y. Méheust, H. Fyhn, S. Roy, A. Hansen
2023
  • Transition from viscous fingers to foam during drainage in heterogeneous porous media, F. Lanza, S. Sinha, A. Hansen, A. Rosso and L. Talon
  • Effective rheology of immiscible two-phase flow in porous media consisting of random mixtures of grains having two types of wetting properties, H. Fyhn, S. Sinha and A. Hansen
  • Local statistics of immiscible and incompressible two-phase flow in porous media, H. Fyhn, S. Sinha and A. Hansen
  • Steady-state two-phase flow of compressible and incompressible fluids in a capillary tube of varying radius, H. L. Cheon, H. Fyhn, A. Hansen, Ø. Wilhelmsen and S. Sinha
2022
  • A statistical mechanics framework for immiscible and incompressible two-phase flow in porous media, A. Hansen, E. G. Flekkøy, S. Sinha and P. A. Slotte
  • The co‑moving velocity in immiscible two‑phase flow in porous media, S. Roy, H. Pedersen, S. Sinha and A. Hansen
2021
  • Rheology of immiscible two-phase flow in mixed wet porous media: Dynamic pore network model and capillary fiber bundle model results, H. Fyhn, S. Sinha, S. Roy and A. Hansen
  • Role of pore-size distribution on effective rheology of two-phase flow in porous media, S. Roy, S. Sinha and A. Hansen
  • Fluid meniscus algorithms for dynamic pore-network modeling of immiscible two-phase flow in porous media, S. Sinha, M. Aa. Gjennestad, M. Vassvik and A. Hansen
  • Crack localization and the interplay between stress enhancement and thermal noise, S. Sinha, S. Roy and A. Hansen
2020
  • Phase transitions and correlations in fracture processes where disorder and stress compete, S. Sinha, S. Roy and A. Hansen
  • Flow-area relations in immiscible two-phase flow in porous media, S. Roy, S. Sinha and A. Hansen
2019
  • Rheology of high-capillary number flow in porous media, S. Sinha, M. Aa. Gjennestad, M. Vassvik, M. Winkler, A. Hansen and Eirik G. Flekkøy
  • Effective rheology of two-phase flow in a capillary fiber bundle model, S. Roy, A. Hansen and S. Sinha
2018
  • Relations between seepage velocities in immiscible, incompressible two-phase flow in porous media, A. Hansen, S. Sinha, D. Bedeaux, S. Kjelstrup, M. Aa. Gjennestad and M. Vassvik
2017
  • Effective rheology of two-phase flow in three-dimensional porous media: experiment and simulation, S. Sinha, A. T. Bender, M. Danczyk, K. Keepseagle, C. A. Prather, J. M. Bray, L. W. Thrane, J. D. Seymour, S. L. Codd and A. Hansen
  • Ensemble distribution for immiscible two-phase flow in porous media I. Savani, D. Bedeaux, S. Kjelstrup, M. Vassvik, S. Sinha and A. Hansen
2016
  • A Monte Carlo algorithm for immiscible two-phase flow in porous media, I. Savani, S. Sinha, A. Hansen, D. Bedeaux, S. Kjelstrup and M. Vassvik
2015
  • Dynamic wettability alteration in immiscible two-phase flow in porous media: Effect on transport properties and critical slowing down, V. Flovik, S. Sinha and A. Hansen
  • Local load-sharing fiber bundle model in higher dimensions, S. Sinha, J. T. Kjellstadli and A. Hansen
2013
  • History independence of steady state in simultaneous two-phase flow through two-dimensional porous media, M. Erpelding, S. Sinha, K. T. Tallakstad, A. Hansen, E. G. Flekkøy and K. J. Måløy
  • Effective rheology of bubbles moving in a capillary tube, S. Sinha, A. Hansen, D. Bedeaux and S. Kjelstrup
2012
2011
  • Local wettability reversal during steady-state two-phase flow in porous media, S. Sinha, M. Grøva, T. B. Ødegarden, E. Skjetne and A. Hansen
2009
  • Random walk on topologically biased anisotropic percolation clusters and transport properties, S. Sinha and S. B. Santra
2008
  • Invasion of a sticky random solid: Self-established potential gradient, phase separation, and criticality, S. B. Santra, S. Sinha and J. A. Ahmed
  • Finite-size scaling theory for anisotropic percolation models, S. Sinha and S. B. Santra
2007
  • Multifractality in rotational percolation models, S. Sinha and S. B. Santra
2006
2005
  • Directed spiral percolation hull on the square and triangular lattices, S. Sinha and S. B. Santra
  • Self-organized dynamical equilibrium in the corrosion of random solids, S. Sinha, V. Kishore and S. B. Santra
2004
Codes
C/C++

For large-scale simulations, it is hard to beat the speed and efficiency of C. But its standard library is minimal, lacking dynamic arrays or file parsing, which are common in Python. C++ improves container support, yet still falls short of Python-level convenience. The functions below fill some gaps, streamlining routine tasks and speeding up everyday workflows.

These days AI can generate almost any code one might need, so the point of this collection is not the code itself, but knowing what to look for. Each function here is one that is easy to overlook, yet useful in practice, and has been tested and refined for specific needs rather than produced on the fly.
init_Array
Single function for creating an array of any data type

                    #define init_Array_1D(type,  rows)  ((type*)array_1d((rows), sizeof(type)))
                    void* array_1d(size_t rows, size_t element_size) {
                        return calloc(rows, element_size);
                    }
                

                    #define init_Array_2D(type, rows, cols)  ((type**)array_2d((rows), (cols), sizeof(type)))
                    void** array_2d(size_t rows, size_t cols, size_t element_size) {
                        void **array = calloc(rows, sizeof(void*));
                        if (array == NULL) return NULL;
                        for (size_t i = 0; i < rows; i++) {
                            array[i] = calloc(cols, element_size);
                            if (array[i] == NULL) {
                                for (size_t j = 0; j < i; j++) free(array[j]);
                                free(array);
                                return NULL;
                            }       
                        }
                        return array;
                    }
                

The functions above can declare, allocate, and initialize a memory block in a single statement, with all elements set to zero. They are called as double *h = init_Array_1D(double,n); or double **h = init_Array_2D(double,m,n); for a 1D or 2D array of type double, respectively. You can replace double with int or any other type, including custom data types created with typedef struct. The functions return NULL if allocation fails, so the caller should check the return value before use. As with any calloc allocation, remember to free the memory when it is no longer needed.

make_Name
A function to create a string, based on input format

                    __attribute__((format(printf, 1, 2)))
                    char* make_Name(const char *pattern, ...) {
                        va_list args;
                        va_start(args, pattern);
                        int cLen = vsnprintf(NULL, 0, pattern, args) + 1;
                        va_end(args);
                        if (cLen < 2) return NULL;
                        char *fname = malloc(cLen);
                        if (!fname) return NULL;
                        va_start(args, pattern);
                        vsnprintf(fname, cLen, pattern, args);
                        va_end(args);
                        return fname;
                    }
                

This function creates a formatted string from variable values in a single statement. It uses C's standard formatting syntax as one of its parameters and accepts a variable number of arguments as needed. For example, calling const char *file_name = makeName("%s/S-%.2f_C-%.2e.dat",DIR,S,C); will set file_name to Data/S-0.50_C-1.20e-04.dat if DIR, S and C hold the values Data, 0.5 and 0.00012, respectively.

get_File_List
Get the list of existing file names matching a pattern

                    char **getFList(char *pat, int *count) {
                        glob_t gBuf;
                        int gR = glob(pat, 0, NULL, &gBuf);
                        if (gR != 0) {
                            if (count) *count = 0;
                            return NULL;
                        }
                        if (count) *count = gBuf.gl_pathc;
                        return gBuf.gl_pathv;
                    }
                

This function returns a list of file paths matching a given pattern, along with the number of matches. It is useful when reading data where the number of sample files varies with the parameters. Calling getFList("data/S-0.50_N-???.dat", &n) will return an array of n file paths matching the pattern, such as data/S-0.50_N-000.dat, data/S-0.50_N-009.dat, and so on. This function is intended for cases where only a few calls are necessary, as the list is allocated internally by glob and is not freed. The memory is released when the program exits. For a large number of calls, memory would accumulate, and a globfree call should be implemented.

read_Data
A python-like file reader
[Coming many more soon]
Plotting
Python
For data analysis and visualization, Python is hard to beat. Libraries like NumPy, SciPy, and Matplotlib make plotting and exploratory analysis fast and intuitive. However, as an interpreted language, Python is significantly slower than compiled C, and not ideal for long, large-scale simulations. The snippets below are designed to make plotting and routine data analysis even faster and more convenient.
init_Figure
A one-statement plot initializer
[Coming soon]
3D Modeling
Coming soon