Compare commits

...
41 Commits
Author SHA1 Message Date
paul dee3c87c66 Add strong scaling GPU actions table 2024-03-11 07:00:58 +01:00
paul 3ba78c5f11 Add timing script for investigating action contribution 2024-03-11 04:31:14 +01:00
paul dac08095c4 Add weak timings 2024-03-11 01:45:18 +01:00
paul 79227e93d9 Add weak scaling config generation script 2024-03-11 00:14:03 +01:00
paul d41d8b564b Add booster strong scaling configs 2024-03-10 16:54:00 +01:00
paul 59d5935567 Add more... 2024-03-09 23:34:48 +01:00
paul 075d11b948 Add GPU strong scaling measurement files 2024-03-09 18:49:03 +01:00
paul 1696d72a6f Add pgf generation scripts 2024-03-09 17:47:50 +01:00
paul 6de64dd5d0 Add stuff for eval 2024-03-08 21:42:24 +01:00
paul b36d8a748d Check in stuff 2024-03-08 17:04:58 +01:00
paul 4661646b4f Add db and dat files to gitignore 2024-02-06 04:08:59 +01:00
paul f563cbf9e4 Add scripts for timing stuff and strong scaling configs 2024-02-06 04:08:28 +01:00
paul 6dbbf45043 Change medium for testing 2024-02-06 04:07:58 +01:00
paul 9d7b0028a6 Add Erics spheroid config for reference 2024-02-05 13:28:47 +01:00
paul fb187dd3c5 Add medium config 2024-02-05 13:28:28 +01:00
paul 54994d4587 Fix makefile 2024-02-05 13:28:19 +01:00
paul fb08f0af77 Add stuff for strong scaling measurements 2024-02-05 13:21:34 +01:00
paul 7e3778757c Add tiny configs for comparisons 2024-02-05 13:18:57 +01:00
paul 6c8c93589b Update small.json for CUDA testing 2024-01-17 18:46:35 +01:00
paul 744512e4b5 Add requirements.txt for python scripts 2024-01-07 11:57:56 +01:00
paul ac97d3094a Add --unbuffered to batch configs 2024-01-05 18:16:32 +01:00
paul 5c2dcddf95 Add single block configs 2024-01-05 14:15:12 +01:00
paul a2ad49bd11 Add new make target 2023-12-15 20:18:26 +01:00
paul 6863581568 Add cellinfo writer to varied fillings 2023-12-15 17:08:44 +01:00
paul 409ec8b4c2 Experiment state 2023-12-15 15:12:14 +01:00
paul c7d4a50a85 Add new batch files 2023-12-13 14:07:12 +01:00
paul 926ed90da4 Add __pycache__ and logs to .gitignore 2023-12-13 14:06:44 +01:00
paul a0eaa76b27 Add a few slurm scripts for the cluster 2023-12-11 19:06:11 +01:00
paul 7f747be334 Add two nastja configs 2023-12-09 17:49:19 +01:00
paul d68f8b9cd9 Add some recent stuff 2023-09-04 16:46:22 +02:00
paul 0aa9986ada Add formulae 2023-07-19 11:32:40 +02:00
paul 1d1f8719af Make slides 16:9 2023-07-19 10:59:10 +02:00
paul 938c3189a3 Add tiny talk 2023-07-19 10:49:52 +02:00
paul e8cc797016 Add changes to ELM 2023-07-18 11:20:51 +02:00
paul b79dfd3b39 Move exposé to Overleaf 2023-07-12 16:54:16 +02:00
paul 8d8aa29b49 Add timeline 2023-07-12 16:36:46 +02:00
paul 731563866a Add research questions 2023-07-12 15:03:24 +02:00
paul 52c9075a5b Use I instead of we 2023-07-12 13:58:06 +02:00
paul 516e781aa7 Do requested changes 2023-07-12 13:46:57 +02:00
paul c67a73803a Add contribution section 2023-07-11 13:40:01 +02:00
paul fe6bd7d200 Add sentence to lbm section 2023-07-10 19:09:59 +02:00
86 changed files with 6841 additions and 686 deletions
+3
View File
@@ -1 +1,4 @@
*.swp
outdir
venv
dump
+7
View File
@@ -0,0 +1,7 @@
# Documentation
## LaTeX
LaTeX documents are hosted on Overleaf:
- [Exposé](https://www.overleaf.com/project/64aebb0f1f9c35e8b5d1f294)
-20
View File
@@ -1,20 +0,0 @@
$pdf_mode = 1;
$pdf_previewer = 'start evince';
@default_files = ('expose.tex');
# Make latexmk -c remove .bbl file
$bibtex_use = 2;
# Make the glossaries package happy
add_cus_dep('glo', 'gls', 0, 'run_makeglossaries');
add_cus_dep('acn', 'acr', 0, 'run_makeglossaries');
sub run_makeglossaries {
my ($base_name, $path) = fileparse($_[0]);
system("makeglossaries '$base_name'");
}
push @generated_exts, 'glo', 'gls', 'glg';
push @generated_exts, 'acn', 'acr', 'alg';
$clean_ext .= ' %R.ist %R.xdy %R.run.xml';
-19
View File
@@ -1,19 +0,0 @@
## Building `expose.pdf`
```
latexmk
```
## Cleaning up intermediate files
```
latexmk -c
```
## With preview
Uses `evince` by default (you can change this in `.latexmkrc`).
```
latexmk -pvc
```
Binary file not shown.
-151
View File
@@ -1,151 +0,0 @@
\documentclass[a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[style=numeric]{biblatex}
\usepackage[acronym, nomain]{glossaries}
\usepackage{hyperref}
\usepackage{todonotes}
\addbibresource{references.bib}
\makeglossaries{}
\newacronym{cis}{CiS}{Cells in Silico}
\newacronym{cpu}{CPU}{Central Processing Unit}
\newacronym{cpm}{CPM}{Cellular Potts Model}
\newacronym{ecm}{ECM}{Extracellular Matrix}
\newacronym{fem}{FEM}{Finite Element Method}
\newacronym{gpu}{GPU}{Graphics Processing Unit}
\newacronym{lbm}{LBM}{Lattice Boltzmann Method}
\newacronym{mcs}{MCS}{Monte-Carlo Step}
\newacronym{mpi}{MPI}{Message Passing Interface}
\newacronym{nastja}{NAStJA}{Neoteric Autonomous Stencil code for Jolly Algorithms}
\newacronym{sls}{SLS}{Standard Linear Solid}
\begin{document}
\title{Exposé}
\author{Paul Brinkmeier}
\date{July 2023}
\maketitle
\section{Introduction}
Computational models of cell behavior can be useful to simulate and reiterate experiments.
In addition, they can show us how well our understanding models reality.
A popular approach is the \acrfull{cpm}, where each cell is modeled as a set of connected pixels or voxels on a two- or three-dimensional lattice.
To simulate biological processes involving thousands of cells, large lattices are needed.
Due to the local nature of the computations involved, the \acrshort{cpm} lends itself well to distributed programming.
In order to be true to \emph{in vivo}/\emph{in vitro} findings, such \emph{in silico} models must take into account a multitude of factors influencing cell behavior.
One such factor is the interaction with the \acrfull{ecm} that cells exist in.
In this work we will focus on the viscoelasticity of the collagen networks in the \acrshort{ecm}.
We explore models of viscoelasticity that, similar to the \acrshort{cpm} itself, employ local interactions to model global effects.
In this manner the simulations remain parallelizable.
Additionally, we investigate the performance of our model using different implementations on both \acrshort{cpu}s and \acrshort{gpu}s.
\section{Research}
\subsection{The \acrfull{cpm}}
The \acrshort{cpm}~\cite{graner1992} models cells as sets of sites on a square lattice which are usually connected.
Each lattice site is assigned the integer cell ID of the cell it belongs to.
The behavior of the cells is regulated by the Hamiltonian $H$, which represents the energy of a particular lattice.
The Hamiltonian contains at the least a term for the adhesion between cells on the lattice, but can be extended by other terms such as cell volume or alignment.
To advance the \acrshort{cpm}, a \acrfull{mcs} is performed:
The cell ID of a random lattice site is changed to the cell ID of one of its neighbors and the difference in energy $\Delta H$ is calculated.
The update is always accepted if the energy decreases.
If the energy does not decrease, the update is accepted probabilistically, where greater increases are less probable.
Repeated \acrshortpl{mcs} minimize $H$.
From an implementor's perspective, the \acrshort{cpm} has a great advantage over other approaches to cell simulation such as agent-based modeling:
Since updates happen on a square lattice and changes in energy can be calculated locally, it lends itself well to distributed programming.
\acrfull{cis}~\cite{berghoff2020} is a parallel implementation of the \acrshort{cpm} based on the \acrfull{nastja} framework~\cite{berghoff2018}.
\acrshort{nastja} offers an abstraction layer for implementing stencil codes on the \acrfull{mpi}, making it possible to leverage large-scale parallelism for \acrshort{cis}.
\subsection{The \acrfull{ecm}}
The \acrshort{ecm} is the part of a tissue that surrounds the cells.
It provides their physical and biochemical environment, thereby influencing cell behavior~\cite{frantz2010}.
While the \acrshort{ecm} consists of a variety of components, we focus on a single essential component:
Fibrous collagen networks and their viscoelasticity.
\acrshort{ecm} viscoelasticity has been established as an important factor in cell behavior~\cite{chaudhuri2020}.
For example, the \acrshort{ecm} confines cells and restricts processes such as migration, spreading, growth and mitosis.
These processes also affect the \acrshort{ecm} and can lead to permanent deformation.
In turn, this deformation can have an influence on cell behavior, resulting in self-reinforcing effects (see for example~\cite{mierke2021}).
\subsection{Models of the \acrshort{ecm} in the \acrshort{cpm}}
In this section we list current approaches to modeling the \acrshort{ecm} in \acrshort{cpm} simulations.
We focus on approaches that explicitly model the plasticity of \acrshort{ecm} collagens.
\paragraph{Static Cell}
A starting point is to model the \acrshort{ecm} as a static cell.
In this model, a cell ID is chosen to represent the solid parts of the \acrshort{ecm}.
Cell-matrix interactions are regulated by the hamiltonian just like cell-cell interactions.
\acrshort{ecm} lattice sites do not copy their neighbors and can not be copied by their neighbors during a \acrshort{mcs}.
Instead, simulations using this approach usually allow cells to degrade adjacent matrix sites over time.
This approach is used for example in~\cite{bauer2007}, where the \acrshort{ecm} is initialized by randomly placing fiber bundles across the domain and~\cite{scianna2013}, which investigates cell behavior in \acrshortpl{ecm} with regular patterns.
\paragraph{Hybrid \acrshort{cpm}-\acrshort{fem}}
An approach using a \acrfull{fem} is presented in~\cite{vanoers2014} and expanded upon in~\cite{rens2017, rens2019}.
Each lattice site is assigned a local directional strain on the \acrshort{ecm}.
Cells exert a traction forces on the \acrshort{ecm} used to calculate the lattice strains by a \acrshort{fem}.
The hamiltonian of the \acrshort{cpm} is modified such that cells respond to the strain.
\paragraph{Hybrid \acrshort{cpm} and Molecular Dynamics Methods}
Another approach is presented in~\cite{tsingos2022}.
This work models simulates matrix fibers using a bead-and-chain model.
Similar to the previous approach, the \acrshort{ecm} model is coupled with the \acrshort{cpm}.
However, in this work, cells interact with the \acrshort{ecm} only through a sparse subset of lattice sites.
\subsection{Lattice Models of Viscoelastic Materials}
The strain response of the collagen networks in the \acrshort{ecm} is not fully elastic.
It exhibits both elastic (spring-like) and viscuous (damper-like) behavior.
The behavior of such viscoelastic materials is modeled by serial or parallel configurations of springs and dampers~\cite{sengul2021, mierke2021}.
The most common configurations for describing viscoelastic solids are
\begin{itemize}
\item the Maxwell model, consisting of a spring and a damper in series,
\item the Kelvin-Voigt model, consisting of a spring and a damper in parallel
\item and the Zener or \acrfull{sls} model, which extends either the Maxwell or the Kelvin-Voigt model by another spring.
\end{itemize}
Depending on the specific viscoelastic characteristics that are to be predicted, a particular model can be chosen.
In order to align the viscoelastic \acrshort{ecm} model with the \acrshort{cpm}, we researched approaches that model viscoelastic materials on square lattices.
\paragraph{Discrete Particle Method}
A model for viscoelastic solids is presented in~\cite{obrien2008}.
This work extends the discrete particle method for elastic solids presented in~\cite{toomey2000}.
This model is based on a two- or three-dimensional square lattice of particles.
Each particle is connected to all of its Moore neighbors.
The model for the force acting between two particles can be elastic or viscoelastic.
Various models are explored in~\cite{obrien2008, obrien2009, obrien2014, obrien2021}.
\paragraph{\acrfull{lbm}}
The \acrshort{lbm} is an established approach for modeling the dynamics of fluids.~\cite{krueger2017}
Also based on a square lattice, this model discretizes the particles moving at a particular lattice space into the cardinal and diagonal directions.
Research suggests that the \acrshort{lbm} can be used for modeling both solids~\cite{maquart2022} and viscoelastic fluids~\cite{malaspinas2010}.
\section{Contribution}
\subsection{Method}
\subsection{Challenges}
\newpage
\printglossary[type=\acronymtype, nogroupskip]
\printbibliography{}
\end{document}
-350
View File
@@ -1,350 +0,0 @@
@article{scianna2013,
abstract = {Cell migration on and through extracellular matrix is fundamental in a wide variety of physiological and pathological phenomena, and is exploited in scaffold-based tissue engineering. Migration is regulated by a number of extracellular matrix- or cell-derived biophysical parameters, such as matrix fiber orientation, pore size, and elasticity, or cell deformation, proteolysis, and adhesion. We here present an extended Cellular Potts Model (CPM) able to qualitatively and quantitatively describe cell migration efficiencies and phenotypes both on two-dimensional substrates and within three-dimensional matrices, close to experimental evidence. As distinct features of our approach, cells are modeled as compartmentalized discrete objects, differentiated into nucleus and cytosolic region, while the extracellular matrix is composed of a fibrous mesh and a homogeneous fluid. Our model provides a strong correlation of the directionality of migration with the topological extracellular matrix distribution and a biphasic dependence of migration on the matrix structure, density, adhesion, and stiffness, and, moreover, simulates that cell locomotion in highly constrained fibrillar obstacles requires the deformation of the cell's nucleus and/or the activity of cell-derived proteolysis. In conclusion, we here propose a mathematical modeling approach that serves to characterize cell migration as a biological phenomenon in healthy and diseased tissues and in engineering applications.},
author = {Marco Scianna and Luigi Preziosi and Katarina Wolf},
doi = {10.3934/mbe.2013.10.235},
issn = {15471063},
issue = {1},
journal = {Mathematical Biosciences and Engineering},
keywords = {Cell migration,Cellular Potts model,Extracellular matrix},
month = {2},
pages = {235-261},
pmid = {23311371},
title = {A cellular potts model simulating cell migration on and in matrix environments},
volume = {10},
year = {2013},
}
@article{bauer2007,
abstract = {This work describes the first cell-based model of tumor-induced angiogenesis. At the extracellular level, the model describes diffusion, uptake, and decay of tumor-secreted pro-angiogenic factor. At the cellular level, the model uses the cellular Potts model based on system-energy reduction to describe endothelial cell migration, growth, division, cellular adhesion, and the evolving structure of the stroma. Numerical simulations show: 1), different tumor-secreted pro-angiogenic factor gradient profiles dramatically affect capillary sprout morphology; 2), average sprout extension speeds depend on the proximity of the proliferating region to the sprout tip, and the coordination of cellular functions; and 3), inhomogeneities in the extravascular tissue lead to sprout branching and anastomosis, phenomena that emerge without any prescribed rules. This model provides a quantitative framework to test hypotheses on the biochemical and biomechanical mechanisms that control tumor-induced angiogenesis. © 2007 by the Biophysical Society.},
author = {Amy L. Bauer and Trachette L. Jackson and Yi Jiang},
doi = {10.1529/biophysj.106.101501},
issn = {00063495},
issue = {9},
journal = {Biophysical Journal},
note = {All in all a model that seems very similar to Julians current model plus some blocky ECM cells minus radially aligned fibers},
pages = {3105-3121},
pmid = {17277180},
publisher = {Biophysical Society},
title = {A cell-based model exhibiting branching and anastomosis during tumor-induced angiogenesis},
volume = {92},
year = {2007},
}
@article{berghoff2020,
abstract = {Background: Discoveries in cellular dynamics and tissue development constantly reshape our understanding of fundamental biological processes such as embryogenesis, wound-healing, and tumorigenesis. High-quality microscopy data and ever-improving understanding of single-cell effects rapidly accelerate new discoveries. Still, many computational models either describe few cells highly detailed or larger cell ensembles and tissues more coarsely. Here, we connect these two scales in a joint theoretical model. Results: We developed a highly parallel version of the cellular Potts model that can be flexibly applied and provides an agent-based model driving cellular events. The model can be modular extended to a multi-model simulation on both scales. Based on the NAStJA framework, a scaling implementation running efficiently on high-performance computing systems was realized. We demonstrate independence of bias in our approach as well as excellent scaling behavior. Conclusions: Our model scales approximately linear beyond 10,000 cores and thus enables the simulation of large-scale three-dimensional tissues only confined by available computational resources. The strict modular design allows arbitrary models to be configured flexibly and enables applications in a wide range of research questions. Cells in Silico (CiS) can be easily molded to different model assumptions and help push computational scientists to expand their simulations to a new area in tissue simulations. As an example we highlight a 10003 voxel-sized cancerous tissue simulation at sub-cellular resolution.},
author = {Marco Berghoff and Jakob Rosenbauer and Felix Hoffmann and Alexander Schug},
doi = {10.1186/s12859-020-03728-7},
issn = {14712105},
issue = {1},
journal = {BMC Bioinformatics},
keywords = {Cellular Potts model,Massively parallel,Tissue growth},
month = {10},
pmid = {33023471},
publisher = {BioMed Central Ltd},
title = {Cells in Silico-introducing a high-performance framework for large-scale tissue modeling},
volume = {21},
year = {2020},
}
@generic{frantz2010,
author = {Christian Frantz and Kathleen M. Stewart and Valerie M. Weaver},
doi = {10.1242/jcs.023820},
issn = {00219533},
issue = {24},
journal = {Journal of Cell Science},
month = {12},
pages = {4195-4200},
pmid = {21123617},
title = {The extracellular matrix at a glance},
volume = {123},
year = {2010},
}
@article{berghoff2018,
abstract = {In the last decades, simulations have been established in several fields of science and industry to study various phenomena by solving, inter alia, partial differential equations. For an efficient use of current and future high performance computing systems, with many thousands of computation ranks, high node-level performance, scalable communication, and the omission of unnecessary calculations are of high priority in the development of new solvers. The challenge of contemporary simulation applications is to bridge the gap between the scales of the various physical processes. We introduce the NAStJA framework, a block-based MPI parallel solver for arbitrary algorithms, based on stencil code or other regular grid methods. NAStJA decomposes the domain of spatially complex structures into small cuboid blocks. A special feature of NAStJA is the dynamic block adaption which modifies the calculation domain around the region where the computation currently takes place, and hence avoids unnecessary calculations. This often occurs, inter alia, in phase-field simulations. Block creation and deletion is managed autonomously within local neighborhoods. A basic load balancing mechanism allows a re-distribution of newly created blocks to the involved computing ranks. The use of a multi-hop network, to distribute information to the entire domain, avoids collective all-gather communications. Thus, we can demonstrate excellent scaling. The present scaling tests substantiate the enormous advantage of this adaptive method. For certain simulation scenarios, we can show that the calculation effort and memory consumption can be reduced to only 3.5 percent, compared to the classical full-domain reference simulation. The overhead of 70-100 percent for the dynamic adapting block creation is significantly lower than the gain. The approach is not restricted to phase-field simulations, and can be employed in other domains of computational science to exploit sparsity of computing regions.},
author = {Marco Berghoff and Ivan Kondov and Johannes Hotzer},
doi = {10.1109/TPDS.2018.2819672},
issn = {15582183},
issue = {10},
journal = {IEEE Transactions on Parallel and Distributed Systems},
keywords = {Stencil code,distributed memory,load balancing,massively parallel performance,multi-hop network,partial differential equation,phase-field method,scalable parallel algorithms},
month = {10},
pages = {2282-2296},
publisher = {IEEE Computer Society},
title = {Massively Parallel Stencil Code Solver with Autonomous Adaptive Block Distribution},
volume = {29},
year = {2018},
}
@article{vanoers2014,
abstract = {In vitro cultures of endothelial cells are a widely used model system of the collective behavior of endothelial cells during vasculogenesis and angiogenesis. When seeded in an extracellular matrix, endothelial cells can form blood vessel-like structures, including vascular networks and sprouts. Endothelial morphogenesis depends on a large number of chemical and mechanical factors, including the compliancy of the extracellular matrix, the available growth factors, the adhesion of cells to the extracellular matrix, cell-cell signaling, etc. Although various computational models have been proposed to explain the role of each of these biochemical and biomechanical effects, the understanding of the mechanisms underlying in vitro angiogenesis is still incomplete. Most explanations focus on predicting the whole vascular network or sprout from the underlying cell behavior, and do not check if the same model also correctly captures the intermediate scale: the pairwise cell-cell interactions or single cell responses to ECM mechanics. Here we show, using a hybrid cellular Potts and finite element computational model, that a single set of biologically plausible rules describing (a) the contractile forces that endothelial cells exert on the ECM, (b) the resulting strains in the extracellular matrix, and (c) the cellular response to the strains, suffices for reproducing the behavior of individual endothelial cells and the interactions of endothelial cell pairs in compliant matrices. With the same set of rules, the model also reproduces network formation from scattered cells, and sprouting from endothelial spheroids. Combining the present mechanical model with aspects of previously proposed mechanical and chemical models may lead to a more complete understanding of in vitro angiogenesis.},
author = {René F.M. van Oers and Elisabeth G. Rens and Danielle J. LaValley and Cynthia A. Reinhart-King and Roeland M.H. Merks},
doi = {10.1371/JOURNAL.PCBI.1003774},
issn = {1553-7358},
issue = {8},
journal = {PLOS Computational Biology},
keywords = {Cell motility,Endothelial cells,Extracellular matrix,Extracellular matrix adhesions,Finite element analysis,Monte Carlo method,Simulation and modeling,Stiffness},
month = {8},
note = {Looks very promising<br/><br/>Simulates ECM using finite-element model},
pages = {e1003774},
pmid = {25121971},
publisher = {Public Library of Science},
title = {Mechanical Cell-Matrix Feedback Explains Pairwise and Collective Endothelial Cell Behavior In Vitro},
volume = {10},
url = {https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1003774},
year = {2014},
}
@article{tsingos2022,
author = {Erika Tsingos and Bente Hilde Bakker and Koen A.E. Keijzer and Hermen Jan Hupkes and Roeland M.H. Merks},
doi = {10.1101/2022.06.10.495667},
journal = {bioRxiv},
month = {7},
publisher = {Cold Spring Harbor Laboratory},
title = {Modelling the mechanical cross-talk between cells and fibrous extracellular matrix using hybrid cellular Potts and molecular dynamics methods},
url = {https://www.biorxiv.org/content/10.1101/2022.06.10.495667v3},
year = {2022},
}
@generic{Sree2020,
abstract = {Growth and remodeling (G&R) of biological tissues is an inherently multiscale and multiphysics process. In the past two decades, computational models of G&R have been developed to improve our fundamental understanding of how tissues adapt to mechanical cues. Models focused on tissue mechanics have successfully captured G&R of tissues but lacking a detailed description of the biological control at the cell level. In contrast, systems biology models of mechanotransduction and cellular processes associated to G&R events have been developed often without coupling to the tissue mechanical behavior at multiple scales. Here, we review novel approaches to fuse the systems biology approach to cell mechanobiology with the continuum mechanics descriptions of G&R.},
author = {Vivek D. Sree and Adrian B. Tepole},
doi = {10.1016/j.cobme.2020.01.002},
issn = {24684511},
journal = {Current Opinion in Biomedical Engineering},
keywords = {Multiphysics models,Multiscale models,Systems biology,Tissue mechanics},
month = {9},
pages = {75-80},
publisher = {Elsevier B.V.},
title = {Computational systems mechanobiology of growth and remodeling: Integration of tissue mechanics and cell regulatory network dynamics},
volume = {15},
year = {2020},
}
@article{rens2017,
abstract = {During animal development and homeostasis, the structure of tissues, including muscles, blood vessels, and connective tissues, adapts to mechanical strains in the extracellular matrix (ECM). These strains originate from the differential growth of tissues or forces due to muscle contraction or gravity. Here we show using a computational model that by amplifying local strain cues, active cell contractility can facilitate and accelerate the reorientation of single cells to static strains. At the collective cell level, the model simulations show that active cell contractility can facilitate the formation of strings along the orientation of stretch. The computational model is based on a hybrid cellular Potts and finite-element simulation framework describing a mechanical cell-substrate feedback, where: 1) cells apply forces on the ECM, such that 2) local strains are generated in the ECM and 3) cells preferentially extend protrusions along the strain orientation. In accordance with experimental observations, simulated cells align and form stringlike structures parallel to static uniaxial stretch. Our model simulations predict that the magnitude of the uniaxial stretch and the strength of the contractile forces regulate a gradual transition between stringlike patterns and vascular networklike patterns. Our simulations also suggest that at high population densities, less cell cohesion promotes string formation.},
author = {Elisabeth G. Rens and Roeland M.H. Merks},
doi = {10.1016/J.BPJ.2016.12.012},
issn = {0006-3495},
issue = {4},
journal = {Biophysical Journal},
month = {2},
pages = {755-766},
pmid = {28256235},
publisher = {Cell Press},
title = {Cell Contractility Facilitates Alignment of Cells and Tissues to Static Uniaxial Stretch},
volume = {112},
year = {2017},
}
@article{rens2019,
abstract = {Many animal cells change their shape depending on the stiffness of the
substrate on which they are cultured: they assume small, rounded shapes in soft
ECMs, they elongate within stiffer ECMs, and flatten out on hard substrates.
Cells tend to prefer stiffer parts of the substrate, a phenomenon known as
durotaxis. Such mechanosensitive responses to ECM mechanics are key to
understanding the regulation of biological tissues by mechanical cues, as it
occurs, e.g., during angiogenesis and the alignment of cells in muscles and
tendons. Although it is well established that the mechanical cell-ECM
interactions are mediated by focal adhesions, the mechanosensitive molecular
complexes linking the cytoskeleton to the substrate, it is poorly understood
how the stiffness-dependent kinetics of the focal adhesions eventually produce
the observed interdependence of substrate stiffness and cell shape and cell
behavior. Here we show that the mechanosensitive behavior of single-focal
adhesions, cell contractility and substrate adhesivity together suffice to
explain the observed stiffness-dependent behavior of cells. We introduce a
multiscale computational model that is based upon the following assumptions:
(1) cells apply forces onto the substrate through FAs; (2) the FAs grow and
stabilize due to these forces; (3) within a given time-interval, the force that
the FAs experience is lower on soft substrates than on stiffer substrates due
to the time it takes to reach mechanical equilibrium; and (4) smaller FAs are
pulled from the substrate more easily than larger FAs. Our model combines the
cellular Potts model for the cells with a finite-element model for the
substrate, and describes each FA using differential equations. Together these
assumptions provide a unifying model for cell spreading, cell elongation and
durotaxis in response to substrate mechanics.},
author = {Elisabeth G. Rens and Roeland M. H. Merks},
doi = {10.2139/ssrn.3569534},
journal = {SSRN Electronic Journal},
month = {6},
publisher = {Elsevier BV},
title = {Cell Shape and Durotaxis Follow from Mechanical Cell-Substrate Reciprocity and Focal Adhesion Dynamics: A Unifying Mathematical Model},
url = {https://arxiv.org/abs/1906.08962v1},
year = {2019},
}
@article{krueger2017,
author = {Timm Krüger and Halim Kusumaatmaja and Alexandr Kuzmin and Orest Shardt and Goncalo Silva and Erlend Magnus Viggen},
institution = {Springer International Publishing},
journal = {Springer International Publishing},
note = {https://github.com/lbm-principles-practice},
title = {The lattice Boltzmann method},
volume = {10},
year = {2017},
}
@article{mierke2021,
abstract = {Biological materials such as extracellular matrix scaffolds, cancer cells, and tissues are often assumed to respond elastically for simplicity; the viscoelastic response is quite commonly ignored. Extracellular matrix mechanics including the viscoelasticity has turned out to be a key feature of cellular behavior and the entire shape and function of healthy and diseased tissues, such as cancer. The interference of cells with their local microenvironment and the interaction among different cell types relies both on the mechanical phenotype of each involved element. However, there is still not yet clearly understood how viscoelasticity alters the functional phenotype of the tumor extracellular matrix environment. Especially the biophysical technologies are still under ongoing improvement and further development. In addition, the effect of matrix mechanics in the progression of cancer is the subject of discussion. Hence, the topic of this review is especially attractive to collect the existing endeavors to characterize the viscoelastic features of tumor extracellular matrices and to briefly highlight the present frontiers in cancer progression and escape of cancers from therapy. Finally, this review article illustrates the importance of the tumor extracellular matrix mechano-phenotype, including the phenomenon viscoelasticity in identifying, characterizing, and treating specific cancer types.},
author = {Claudia Tanja Mierke},
doi = {10.3389/FCELL.2021.785138},
issn = {2296634X},
journal = {Frontiers in Cell and Developmental Biology},
keywords = {cancer,collagen,confinement,extracellular matrix,homogeneities,hydrogels,matrix mechanics,viscoelasticity},
month = {12},
pages = {3536},
publisher = {Frontiers Media S.A.},
title = {Viscoelasticity Acts as a Marker for Tumor Extracellular Matrix Characteristics},
volume = {9},
year = {2021},
}
@article{malaspinas2010,
abstract = {The simulation of viscoelastic fluids is a challenging task from the theoretical and numerical points of view. This class of fluids has been extensively studied with the help of classical numerical methods. In this paper we propose a new approach based on the lattice Boltzmann method in order to simulate linear and non-linear viscoelastic fluids and in particular those described by the Oldroyd-B and FENE-P constitutive equations. We study the accuracy and stability of our model on three different benchmarks: the 3D Taylor-Green vortex decay, the simplified 2D four-rolls mill, and the 2D Poiseuille flow. To our knowledge, the methodology described in this work is a first attempt for the simulation of non-trivial flows of viscoelastic fluids using the lattice Boltzmann method to discretize the constitutive and conservation equations. © 2010 Elsevier B.V.},
author = {O. Malaspinas and N. Fiétier and M. Deville},
doi = {10.1016/J.JNNFM.2010.09.001},
issn = {0377-0257},
issue = {23-24},
journal = {Journal of Non-Newtonian Fluid Mechanics},
keywords = {Lattice Boltzmann method,Viscoelastic fluid flows},
month = {12},
pages = {1637-1653},
publisher = {Elsevier},
title = {Lattice Boltzmann method for the simulation of viscoelastic fluid flows},
volume = {165},
year = {2010},
}
@article{obrien2021,
abstract = {Nonlinear wave propagation is an important consideration in several geophysical problems as heterogeneities within the subsurface give rise to nonlinear stress-strain relationships in rocks. To address these problems, where the inclusion of subsurface complexity is accounted for, numerical solutions are required. Here, we outline a discrete particle or lattice numerical method that can simulate dynamic and static deformation in an isotropic viscoelastic nonlinear medium where the nonlinearity includes the fourth-order elastic tensor coefficients. The relationship between the local interaction constants in the lattice method and the macroscopic nonlinear coefficients is derived and the relationships presented. The theoretical dispersion properties of the system is determined from a nonlinear perturbation method and are validated against some numerical results. There is an excellent agreement between the theory and numerical results and the method reproduces the common features of nonlinear wave propagation, for example, harmonics, waveform distortion and spectra shifts. As expected the system is shown to be dependent on the wave amplitudes and an example is presented which shows the complexity that can arise in both dynamic and static deformation in a complex model where nonlinearity is included.},
author = {Gareth S. O'Brien},
doi = {10.1093/GJI/GGAA537},
issn = {0956-540X},
issue = {3},
journal = {Geophysical Journal International},
keywords = {Computational seismology,Numerical modelling,Wave propagation},
month = {1},
note = {Not very easy to discern the actual model parameters imo},
pages = {1572-1587},
publisher = {Oxford Academic},
title = {A lattice method for seismic wave propagation in nonlinear viscoelastic media},
volume = {224},
url = {https://academic.oup.com/gji/article/224/3/1572/5979782},
year = {2021},
}
@article{chaudhuri2020,
abstract = {Substantial research over the past two decades has established that extracellular matrix (ECM) elasticity, or stiffness, affects fundamental cellular processes, including spreading, growth, proliferation, migration, differentiation and organoid formation. Linearly elastic polyacrylamide hydrogels and polydimethylsiloxane (PDMS) elastomers coated with ECM proteins are widely used to assess the role of stiffness, and results from such experiments are often assumed to reproduce the effect of the mechanical environment experienced by cells in vivo. However, tissues and ECMs are not linearly elastic materials—they exhibit far more complex mechanical behaviours, including viscoelasticity (a time-dependent response to loading or deformation), as well as mechanical plasticity and nonlinear elasticity. Here we review the complex mechanical behaviours of tissues and ECMs, discuss the effect of ECM viscoelasticity on cells, and describe the potential use of viscoelastic biomaterials in regenerative medicine. Recent work has revealed that matrix viscoelasticity regulates these same fundamental cell processes, and can promote behaviours that are not observed with elastic hydrogels in both two- and three-dimensional culture microenvironments. These findings have provided insights into cell–matrix interactions and how these interactions differentially modulate mechano-sensitive molecular pathways in cells. Moreover, these results suggest design guidelines for the next generation of biomaterials, with the goal of matching tissue and ECM mechanics for in vitro tissue models and applications in regenerative medicine. This Review explores the role of viscoelasticity of tissues and extracellular matrices in cell–matrix interactions and mechanotransduction and the potential utility of viscoelastic biomaterials in regenerative medicine.},
author = {Ovijit Chaudhuri and Justin Cooper-White and Paul A. Janmey and David J. Mooney and Vivek B. Shenoy},
doi = {10.1038/s41586-020-2612-2},
issn = {1476-4687},
issue = {7822},
journal = {Nature 2020 584:7822},
keywords = {Humanities and Social Sciences,Science,multidisciplinary},
month = {8},
pages = {535-546},
pmid = {32848221},
publisher = {Nature Publishing Group},
title = {Effects of extracellular matrix viscoelasticity on cellular behaviour},
volume = {584},
url = {https://www.nature.com/articles/s41586-020-2612-2},
year = {2020},
}
@article{maquart2022,
abstract = {This work presents a novel method for simulating the behavior of solid objects with the Lattice Boltzmann Method (LBM). To introduce and validate our proposed framework, comparative studies are performed for computing the static equilibrium of isotropic materials. Remembering that the LBM has strong theoretical foundations in the Boltzmann equation; this latter is firstly adjusted to solid motions, through its Boltzmann-Vlasov special case. This is indeed the case when combined with a suitable mean-field external force term to set a reliable solid framework. Secondly, a library is built and plugged on the top of the well-known Parallel Lattice Boltzmann Solver (PaLaBoS) library. Numerical implementations based on the previous equation of motion for solids are led in a non-intrusive manner so as to present results with an easy and flawless reproducibility. A newly designed Lattice Boltzmann Method for Solids (LBMS) is exhibited through a few key algorithms, showing the overall operation plus the major improvements. Efficiency, robustness and accuracy of the proposed approach are illustrated and contrasted with a commercial Finite Element Analysis (FEA) software. The obtained results reveal considerable potential concerning static and further dynamic simulations involving solid constitutive laws within the LBM formalism.},
author = {Tristan Maquart and Romain Noël and Guy Courbebaisse and Laurent Navarro},
doi = {10.3390/APP12094627},
issn = {2076-3417},
issue = {9},
journal = {Applied Sciences 2022, Vol. 12, Page 4627},
keywords = {Lattice Boltzmann Method for solids,Maxwell equation,Vlasov,field external force term,mean,solid static equilibrium},
month = {5},
note = {LBM but for solids: Displacements are computed by summing the velocities over time; displacements then apply additional stress in the LBM.},
pages = {4627},
publisher = {Multidisciplinary Digital Publishing Institute},
title = {Toward a Lattice Boltzmann Method for Solids—Application to Static Equilibrium of Isotropic Materials},
volume = {12},
url = {https://www.mdpi.com/2076-3417/12/9/4627/htm https://www.mdpi.com/2076-3417/12/9/4627},
year = {2022},
}
@article{obrien2014,
abstract = {Elastic lattice methods (ELMs) have been shown to accurately model seismic wave propagation in a heterogeneous medium. These methods represent an elastic solid as a series of interconnected springs...},
author = {Gareth S. O'Brien},
doi = {10.1016/J.CAGEO.2014.03.011},
issn = {00983004},
journal = {Computers \& Geosciences},
keywords = {Computational seismic wave propagation,Discrete particle method,Elastic lattice method},
month = {6},
pages = {117-124},
publisher = {
Pergamon Press, Inc.
PUB1185
Elmsford, NY, USA
},
title = {Elastic lattice modelling of seismic waves including a free surface},
volume = {67},
url = {https://dl.acm.org/doi/10.1016/j.cageo.2014.03.011},
year = {2014},
}
@article{obrien2008,
author = {Gareth S. O'Brien},
doi = {10.1029/2007GL032214},
issn = {1944-8007},
issue = {2},
journal = {Geophysical Research Letters},
keywords = {elastic,numerical,seismology,visco,visco&hyphen},
month = {1},
publisher = {John Wiley & Sons, Ltd},
title = {Discrete visco-elastic lattice methods for seismic wave propagation},
volume = {35},
url = {https://onlinelibrary.wiley.com/doi/full/10.1029/2007GL032214 https://onlinelibrary.wiley.com/doi/abs/10.1029/2007GL032214 https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2007GL032214},
year = {2008},
}
@article{toomey2000,
abstract = {A particle-based model for the simulation of wave propagation is presented. The model is based on solid-state physics principles and considers a piece of rock to be a Hookean material composed of discrete particles representing fundamental intact rock units. These particles interact at their contact points and experience reversible elastic forces proportional to their displacement from equilibrium. Particles are followed through space by numerically solving their equations of motion. We demonstrate that a numerical implementation of this scheme is capable of modelling the propagation of elastic waves through heterogeneous isotropic media. The results obtained are compared with a high-order finite difference solution to the wave equation. The method is found to be accurate, and thus offers an alternative to traditional continuum-based wave simulators.},
author = {Aoife Toomey and Christopher J. Bean},
doi = {10.1046/J.1365-246X.2000.00094.X/2/141-3-595-FIG012.JPEG},
issn = {0956540X},
issue = {3},
journal = {Geophysical Journal International},
keywords = {Finite difference methods,Heterogeneity,Particle-based model,Wave propagation},
month = {6},
pages = {595-604},
publisher = {Oxford Academic},
title = {Numerical simulation of seismic waves using a discrete particle scheme},
volume = {141},
url = {https://dx.doi.org/10.1046/j.1365-246x.2000.00094.x},
year = {2000},
}
@article{obrien2009,
abstract = {Discrete particle methods or elastic lattice methods represent a 3D elastic solid by a series of interconnected springs arranged on a regular lattice. Generally, these methods only consider nearest neighbour interactions, i.e. they are first-order in space. These interconnected springs interacted through a force term (Hooke's Law for an elastic body), which when viewed on a macroscopic scale provide a numerical solution for the elastodynamic wave equations. Along with solving the elastodynamic wave equations these schemes are capable of simulating elastic static deformation. However, as these methods rely on nearest neighbour interactions they suffer from more pronounced numerical dispersion than traditional continuum methods. By including a new force term, the numerical dispersion can be reduced while keeping the flexibility of the nearest neighbour interaction rule. We present results of simulations where the additional force term reduces the numerical dispersion and increases the accuracy of the elastic lattice method solution. The computational efficiency and parallel scaling of this method on multiple processors is compared with a finite-difference solution to assess the computational cost of using this approach for simulating seismic wave propagation. We also show the applicability of this method to modelling seismic propagation in a complex Earth model. © 2009 Elsevier Ltd. All rights reserved.},
author = {Gareth S. O'Brien and Chris J. Bean and Honore Tapamo},
doi = {10.1016/J.CAGEO.2008.12.004},
issn = {0098-3004},
issue = {9},
journal = {Computers \& Geosciences},
keywords = {Computational seismic wave propagation,Discrete particle method,Elastic lattice method,Numerical seismic dispersion},
month = {9},
pages = {1768-1775},
publisher = {Pergamon},
title = {Dispersion analysis and computational efficiency of elastic lattice methods for seismic wave propagation},
volume = {35},
year = {2009},
}
@article{graner1992,
abstract = {We simulate the sorting of a mixture of two types of biological cells using a modified version of the large-Q Potts model with differential adhesivity. We find long-distance cell movement leading to sorting with a logarithmic increase in the length scale of homogeneous clusters. Sorted clusters then round. We find two successive phases: A rapid boundary-driven creation of a low-cohesivity cell monolayer around the aggregate, and a slower boundary-independent internal rearrangement. © 1992 The American Physical Society.},
author = {François Graner and James A. Glazier},
doi = {10.1103/PhysRevLett.69.2013},
issn = {00319007},
issue = {13},
journal = {Physical Review Letters},
month = {9},
pages = {2013},
publisher = {American Physical Society},
title = {Simulation of biological cell sorting using a two-dimensional extended Potts model},
volume = {69},
url = {https://journals.aps.org/prl/abstract/10.1103/PhysRevLett.69.2013},
year = {1992},
}
@article{sengul2021,
abstract = {There are some materials in nature that experience deformations that are not elastic. Viscoelastic materials are some of them. We come across many such materials in our daily lives through a number...},
author = {Yasemin Sengül},
doi = {10.1098/RSPA.2020.0715},
issn = {14712946},
issue = {2245},
journal = {Proceedings of the Royal Society A},
keywords = {nonlinear partial differential equations,solid mechanics,viscoelasticity},
month = {1},
publisher = {
The Royal Society Publishing
},
title = {Nonlinear viscoelasticity of strain rate type: an overview},
volume = {477},
url = {https://royalsocietypublishing.org/doi/10.1098/rspa.2020.0715},
year = {2021},
}
+8
View File
@@ -1,2 +1,10 @@
venv
.ipynb_checkpoints
logs
__pycache__
generated/*
batch/measurements/strong/*
configs/measurements/strong/*
*.dat
*.db
eval/generated/*
+73 -46
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -248,7 +248,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.13"
"version": "3.10.11"
}
},
"nbformat": 4,
+27
View File
@@ -0,0 +1,27 @@
VARIED_FILLINGS_IS := $(shell seq -w 0 10 100)
VARIED_FILLINGS_JOBS := $(addprefix generated/varied-fillings-, $(addsuffix .json, ${VARIED_FILLINGS_IS}))
all: varied-fillings strong
varied-fillings: ${VARIED_FILLINGS_JOBS}
strong:
python scripts/gen/strong.py
clean-strong:
rm -f batch/measurements/strong/*
rm -f configs/measurements/strong/spheroid*.json
clean:
rm -f generated/*
clean-logs:
rm -f logs/*
clean-outs:
rm -rf /p/scratch/cellsinsilico/paul/nastja-out/*
generated/varied-fillings-%.json: scripts/gen/varied_fillings.py templates/varied-fillings.json
python scripts/gen/varied_fillings.py $* > $@
.PHONY: varied-fillings strong clean clean-logs clean-outs
+15 -1
View File
@@ -9,4 +9,18 @@ pip install -r requirements.txt
jupyter-lab
```
The `shell.nix` contains a workaround for NixOS and is not necessary for normal use.
The `shell.nix` contains a workaround for NixOS and is not necessary for normal use.
## Building NAStJA for Experiments
Build it either with or without CUDA support.
When NAStJA is built with CUDA support it will automatically switch to the GPU implementation of the dynamic ECM.
I use the `mold` linker because it makes the code-build-test-loop slightly shorter.
This shouldn't have any impact on the performance of the produced binary.
If you would like to shorten the linking time even further you can add `-DNASTJA_ENABLE_IPO=OFF` to turn of Link Time Optimization (LTO).
However, it is likely that will have an impact on performance.
```
cmake .. -DCMAKE_CXX_FLAGS="-fuse-ld=mold"
cmake .. -DCMAKE_CXX_FLAGS="-fuse-ld=mold" -DNASTJA_ENABLE_CUDA=ON
```
+2389
View File
File diff suppressed because it is too large Load Diff
+19
View File
@@ -0,0 +1,19 @@
#!/usr/bin/env bash
#SBATCH --job-name=build-cuda
# Forschergruppe Schug
#SBATCH --account=hkf6
#SBATCH --partition=develbooster
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=48
#SBATCH --time=01:00:00
#SBATCH --output=logs/build-cuda-%j.log
#SBATCH --error=logs/build-cuda-%j.log
SOURCE_DIR=/p/project/cellsinsilico/paulslustigebude
source "${SOURCE_DIR}/activate-nastja-modules"
cd "${SOURCE_DIR}/nastja/build-cuda"
srun make -j48
+19
View File
@@ -0,0 +1,19 @@
#!/usr/bin/env bash
#SBATCH --job-name=build-nocuda
# Forschergruppe Schug
#SBATCH --account=hkf6
#SBATCH --partition=develbooster
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=48
#SBATCH --time=01:00:00
#SBATCH --output=logs/build-nocuda-%j.log
#SBATCH --error=logs/build-nocuda-%j.log
SOURCE_DIR=/p/project/cellsinsilico/paulslustigebude
source "${SOURCE_DIR}/activate-nastja-modules"
cd "${SOURCE_DIR}/nastja/build-nocuda"
srun make -j48
+32
View File
@@ -0,0 +1,32 @@
#!/usr/bin/env bash
#SBATCH --job-name=cuda
# Forschergruppe Schug
#SBATCH --account=hkf6
# 48 Cores, 512GiB RAM, 4x NVIDIA A100 GPUs
#SBATCH --partition=booster
# Right now we're using a single node
#SBATCH --nodes=1
# Number of MPI processes
# TODO: Change the config and set to this the maximum of 48
#SBATCH --ntasks=16
#SBATCH --cpus-per-task=1
# For now, we are using a single GPU only
#SBATCH --gres=gpu:1
#SBATCH --time=01:00:00
#SBATCH --output=logs/cuda-%j.log
#SBATCH --error=logs/cuda-%j.log
SOURCE_DIR=/p/project/cellsinsilico/paulslustigebude
OUTPUT_DIR=/p/scratch/cellsinsilico/paul/nastja-out/cuda
mkdir -p "${OUTPUT_DIR}"
source "${SOURCE_DIR}/activate-nastja-modules"
# This is actually the default behavior for a single task anyways
# However I'm leaving this here for documentation reasons
export CUDA_VISIBLE_DEVICES=0
srun --unbuffered "${SOURCE_DIR}/nastja/build-cuda/nastja" \
-c "${SOURCE_DIR}/ma/experiments/configs/genesis.json" \
-o "${OUTPUT_DIR}"
+30
View File
@@ -0,0 +1,30 @@
#!/usr/bin/env bash
#SBATCH --job-name=cuda-singleblock
# Forschergruppe Schug
#SBATCH --account=hkf6
# 48 Cores, 512GiB RAM, 4x NVIDIA A100 GPUs
#SBATCH --partition=booster
# Right now we're using a single node
#SBATCH --nodes=1
# Number of MPI processes
#SBATCH --ntasks=1
# For now, we are using a single GPU only
#SBATCH --gres=gpu:1
#SBATCH --time=01:00:00
#SBATCH --output=logs/cuda-singleblock-%j.log
#SBATCH --error=logs/cuda-singleblock-%j.log
SOURCE_DIR=/p/project/cellsinsilico/paulslustigebude
OUTPUT_DIR=/p/scratch/cellsinsilico/paul/nastja-out/cuda-singleblock
mkdir -p "${OUTPUT_DIR}"
source "${SOURCE_DIR}/activate-nastja-modules"
# This is actually the default behavior for a single task anyways
# However I'm leaving this here for documentation reasons
export CUDA_VISIBLE_DEVICES=0
srun --unbuffered "${SOURCE_DIR}/nastja/build-cuda/nastja" \
-c "${SOURCE_DIR}/ma/experiments/configs/genesis-singleblock.json" \
-o "${OUTPUT_DIR}"
+29
View File
@@ -0,0 +1,29 @@
#!/usr/bin/env bash
#SBATCH --job-name=ecm-debug
# Forschergruppe Schug
#SBATCH --account=hkf6
# 48 Cores, 512GiB RAM, 4x NVIDIA A100 GPUs
#SBATCH --partition=booster
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=1
# For now, we are using a single GPU only
#SBATCH --gres=gpu:1
#SBATCH --time=00:10:00
#SBATCH --output=logs/ecm-debug-%j.log
#SBATCH --error=logs/ecm-debug-%j.log
SOURCE_DIR=/p/project/cellsinsilico/paulslustigebude
OUTPUT_DIR=/p/scratch/cellsinsilico/paul/nastja-out/ecm-debug
mkdir -p "${OUTPUT_DIR}"
source "${SOURCE_DIR}/activate-nastja-modules"
# This is actually the default behavior for a single task anyways
# However I'm leaving this here for documentation reasons
export CUDA_VISIBLE_DEVICES=0
srun "${SOURCE_DIR}/nastja/build-cuda/nastja" \
-c "${SOURCE_DIR}/ma/experiments/configs/ecm-debug.json" \
-o "${OUTPUT_DIR}"
+24
View File
@@ -0,0 +1,24 @@
#!/usr/bin/env bash
#SBATCH --job-name=julian-animation
#SBATCH --account=hkf6
#SBATCH --partition=booster
#SBATCH --nodes=8
#SBATCH --ntasks=32
# Counted per node
#SBATCH --gres=gpu:4
#SBATCH --time=03:30:00
#SBATCH --output=logs/%x-%A_%a.log
#SBATCH --error=logs/%x-%A_%a.log
SOURCE_DIR=/p/project/cellsinsilico/paulslustigebude
OUTPUT_DIR="/p/scratch/cellsinsilico/paul/nastja-out/${SLURM_JOB_NAME}"
echo "outdir is ${OUTPUT_DIR}"
mkdir -p "${OUTPUT_DIR}"
source "${SOURCE_DIR}/activate-nastja-modules"
srun --unbuffered "${SOURCE_DIR}/nastja/build-cuda/nastja" \
-c "${SOURCE_DIR}/ma/experiments/configs/${SLURM_JOB_NAME}.json" \
-o "${OUTPUT_DIR}"
@@ -0,0 +1 @@
Generated by scripts/gen/strong.py
+26
View File
@@ -0,0 +1,26 @@
#!/usr/bin/env bash
#SBATCH --job-name=nocuda
# Forschergruppe Schug
#SBATCH --account=hkf6
# 48 Cores, 512GiB RAM, 4x NVIDIA A100 GPUs
#SBATCH --partition=booster
# Right now we're using a single node
#SBATCH --nodes=1
# Number of MPI processes
# TODO: Change the config and set to this the maximum of 48
#SBATCH --ntasks=16
#SBATCH --cpus-per-task=1
#SBATCH --time=01:00:00
#SBATCH --output=logs/nocuda-%j.log
#SBATCH --error=logs/nocuda-%j.log
SOURCE_DIR=/p/project/cellsinsilico/paulslustigebude
OUTPUT_DIR=/p/scratch/cellsinsilico/paul/nastja-out/nocuda
mkdir -p "${OUTPUT_DIR}"
source "${SOURCE_DIR}/activate-nastja-modules"
srun --unbuffered "${SOURCE_DIR}/nastja/build-nocuda/nastja" \
-c "${SOURCE_DIR}/ma/experiments/configs/genesis.json" \
-o "${OUTPUT_DIR}"
+26
View File
@@ -0,0 +1,26 @@
#!/usr/bin/env bash
#SBATCH --job-name=nocuda-noecm
# Forschergruppe Schug
#SBATCH --account=hkf6
# 48 Cores, 512GiB RAM, 4x NVIDIA A100 GPUs
#SBATCH --partition=booster
# Right now we're using a single node
#SBATCH --nodes=1
# Number of MPI processes
# TODO: Change the config and set to this the maximum of 48
#SBATCH --ntasks-per-node=16
#SBATCH --cpus-per-task=1
#SBATCH --time=01:00:00
#SBATCH --output=logs/nocuda-noecm-%j.log
#SBATCH --error=logs/nocuda-noecm-%j.log
SOURCE_DIR=/p/project/cellsinsilico/paulslustigebude
OUTPUT_DIR=/p/scratch/cellsinsilico/paul/nastja-out/nocuda-noecm
mkdir -p "${OUTPUT_DIR}"
source "${SOURCE_DIR}/activate-nastja-modules"
srun "${SOURCE_DIR}/nastja/build-nocuda/nastja" \
-c "${SOURCE_DIR}/ma/experiments/configs/genesis-noecm.json" \
-o "${OUTPUT_DIR}"
+24
View File
@@ -0,0 +1,24 @@
#!/usr/bin/env bash
#SBATCH --job-name=nocuda-singleblock
# Forschergruppe Schug
#SBATCH --account=hkf6
# 48 Cores, 512GiB RAM, 4x NVIDIA A100 GPUs
#SBATCH --partition=booster
# Right now we're using a single node
#SBATCH --nodes=1
# Number of MPI processes
#SBATCH --ntasks=1
#SBATCH --time=06:00:00
#SBATCH --output=logs/nocuda-singleblock-%j.log
#SBATCH --error=logs/nocuda-singleblock-%j.log
SOURCE_DIR=/p/project/cellsinsilico/paulslustigebude
OUTPUT_DIR=/p/scratch/cellsinsilico/paul/nastja-out/nocuda-singleblock
mkdir -p "${OUTPUT_DIR}"
source "${SOURCE_DIR}/activate-nastja-modules"
srun --unbuffered "${SOURCE_DIR}/nastja/build-nocuda/nastja" \
-c "${SOURCE_DIR}/ma/experiments/configs/genesis-singleblock.json" \
-o "${OUTPUT_DIR}"
+26
View File
@@ -0,0 +1,26 @@
#!/usr/bin/env bash
#SBATCH --job-name=varied-fillings-nocuda
# Forschergruppe Schug
#SBATCH --account=hkf6
# 48 Cores, 512GiB RAM, 4x NVIDIA A100 GPUs
#SBATCH --partition=booster
# Right now we're using a single node
#SBATCH --nodes=1
#SBATCH --ntasks=48
#SBATCH --cpus-per-task=1
#SBATCH --time=02:00:00
#SBATCH --output=logs/varied-fillings-nocuda-%A-%3a.log
#SBATCH --error=logs/varied-fillings-nocuda-%A-%3a.log
#SBATCH --array=0-100:10
IDENT=$(printf "%03d" "${SLURM_ARRAY_TASK_ID}")
SOURCE_DIR=/p/project/cellsinsilico/paulslustigebude
OUTPUT_DIR="/p/scratch/cellsinsilico/paul/nastja-out/varied-fillings-nocuda-${IDENT}"
mkdir -p "${OUTPUT_DIR}"
source "${SOURCE_DIR}/activate-nastja-modules"
srun "${SOURCE_DIR}/nastja/build-nocuda/nastja" \
-c "${SOURCE_DIR}/ma/experiments/generated/varied-fillings-${IDENT}.json" \
-o "${OUTPUT_DIR}"
+31
View File
@@ -0,0 +1,31 @@
import time
def collatz(x):
seq = [x]
while x != 1:
if x % 2 == 0:
x //= 2
else:
x = 3 * x + 1
seq.append(x)
return seq
if __name__ == "__main__":
best = None
try:
i = 1
start = time.time()
while True:
pair = (i, collatz(i))
if (not best or len(pair[1]) > len(best[1])) and not any(c >= 2**31 for c in pair[1]):
best = pair
if i % 10000 == 0:
now = time.time()
print(f"{i:>10} best: {best[0]:>10} {len(best[1]):>5} {(now - start) * 1000 / i:5.2}ns/seq")
i += 1
except KeyboardInterrupt:
pass
print(best)
+102
View File
@@ -0,0 +1,102 @@
{
"#Testing": {
"description": "Small experiment for comparing CPU and GPU implementations"
},
"Application": "Cells",
"Geometry": {
"blocksize": [10, 10, 10],
"blockcount": [1, 1, 1]
},
"Settings": {
"timesteps": 4,
"randomseed": 42
},
"Filling": {
"cells": [
{
"_comment": "This is for the dynamic ECM",
"shape": "cube",
"box": [
[0, 0, 0],
[9, 9, 9]
],
"value": 0,
"celltype": 0
},
{
"shape": "cube",
"box": [
[4, 4, 4],
[7, 7, 7]
],
"celltype": 2
}
]
},
"CellsInSilico": {
"liquid": 1,
"adhesion": {
"matrix": [
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 10, 5],
[0, 0, 5, 5]
]
},
"temperature": 15,
"volume": {
"default": [0, 0, 64, 64],
"lambda": {
"storage": "const",
"value": 10
}
},
"surface": {
"default": [0, 0, 80, 80],
"lambda": {
"storage": "const",
"value": 10
}
},
"cleaner": {
"killdistance": 100
},
"checkerboard": "00",
"energyfunctions": ["Volume00", "Surface00", "Adhesion00", "DynamicECM00"],
"centerofmass": {
"steps": 10
},
"dynamicecm": {
"enabled": true,
"stepsPerMcs": 10,
"pushSteps": 10,
"pushWeight": 2,
"ecmCellID": 0,
"deltat": 0.1,
"eta": 0.25,
"k0": 0.1,
"k1": 0.1,
"c": 4,
"alpha": 2,
"d": 0.3,
"phi": 1,
"lambda": 50
}
},
"Writers": {
"ParallelVTK_Cells": {
"writer": "ParallelVtkImage",
"outputtype": "UInt32",
"field": "cells",
"steps": 1
},
"ParallelVTK_Displacement": {
"writer": "ParallelVtkImage",
"outputtype": "Float32",
"field": "dynamicecm",
"components": [0, 1, 2],
"steps": 1
}
},
"WriteActions": ["ParallelVTK_Cells", "ParallelVTK_Displacement"]
}
+88
View File
@@ -0,0 +1,88 @@
{
"#Testing": {
"description": "Just dynamic ECM for debugging"
},
"Application": "Cells",
"Geometry": {
"blocksize": [5, 5, 5],
"blockcount": [1, 1, 1]
},
"Settings": {
"timesteps": 10,
"randomseed": 42
},
"Filling": {
"cells": [
{
"_comment": "This is for the dynamic ECM",
"shape": "cube",
"box": [
[0, 0, 0],
[4, 4, 4]
],
"value": 0,
"celltype": 0
}
]
},
"CellsInSilico": {
"liquid": 1,
"adhesion": {
"matrix": [
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 10, 5],
[0, 0, 5, 5]
]
},
"temperature": 15,
"volume": {
"default": [0, 0, 7000, 1000],
"lambda": {
"storage": "const",
"value": 10
}
},
"surface": {
"default": [0, 0, 2500, 1000],
"lambda": {
"storage": "const",
"value": 10
}
},
"checkerboard": "00",
"energyfunctions": ["Volume00", "Surface00", "Adhesion00", "DynamicECM00"],
"dynamicecm": {
"enabled": true,
"stepsPerMcs": 1,
"pushSteps": 1,
"pushWeight": 2,
"ecmCellID": 0,
"deltat": 0.1,
"eta": 0.25,
"k0": 0.1,
"k1": 0.1,
"c": 4,
"alpha": 2,
"d": 0.3,
"phi": 1,
"lambda": 50
}
},
"Writers": {
"ParallelVTK_Cells": {
"writer": "ParallelVtkImage",
"outputtype": "UInt32",
"field": "cells",
"steps": 1
},
"ParallelVTK_Displacement": {
"writer": "ParallelVtkImage",
"outputtype": "Float32",
"field": "dynamicecm",
"components": [0, 1, 2],
"steps": 1
}
},
"WriteActions": ["ParallelVTK_Cells", "ParallelVTK_Displacement"]
}
+109
View File
@@ -0,0 +1,109 @@
{
"#Testing": {
"description": "Cellular Potts Model with dynamic ECM"
},
"Application": "Cells",
"Geometry": {
"blocksize": [20, 40, 40],
"blockcount": [4, 2, 2]
},
"Settings": {
"timesteps": 250,
"randomseed": 42
},
"Filling": {
"cells": [
{
"_comment": "This is for the dynamic ECM",
"shape": "cube",
"box": [
[0, 0, 0],
[79, 79, 79]
],
"value": 0,
"celltype": 0
},
{
"shape": "cube",
"box": [
[41, 35, 10],
[45, 39, 15]
],
"celltype": 2
},
{
"shape": "cube",
"box": [
[40, 15, 14],
[47, 22, 20]
],
"celltype": 2
},
{
"shape": "cube",
"box": [
[40, 20, 20],
[47, 27, 26]
],
"celltype": 3
},
{
"shape": "cube",
"box": [
[38, 20, 60],
[45, 27, 66]
],
"celltype": 3
}
]
},
"CellsInSilico": {
"liquid": 1,
"adhesion": {
"matrix": [
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 10, 5],
[0, 0, 5, 5]
]
},
"temperature": 15,
"volume": {
"default": {
"storage": "const",
"value": 2000
},
"lambda": {
"storage": "const",
"value": 10
}
},
"surface": {
"default": {
"storage": "const",
"value": 800
},
"lambda": {
"storage": "const",
"value": 10
}
},
"cleaner": {
"killdistance": 100
},
"checkerboard": "00",
"energyfunctions": ["Volume00", "Surface00", "Adhesion00"],
"centerofmass": {
"steps": 10
}
},
"Writers": {
"ParallelVTK_Cells": {
"writer": "ParallelVtkImage",
"outputtype": "UInt32",
"field": "cells",
"steps": 1
}
},
"WriteActions": ["ParallelVTK_Cells"]
}
@@ -0,0 +1,131 @@
{
"#Testing": {
"description": "Cellular Potts Model with dynamic ECM"
},
"Application": "Cells",
"Geometry": {
"blocksize": [80, 80, 80],
"blockcount": [1, 1, 1]
},
"Settings": {
"timesteps": 250,
"randomseed": 42
},
"Filling": {
"cells": [
{
"_comment": "This is for the dynamic ECM",
"shape": "cube",
"box": [
[0, 0, 0],
[79, 79, 79]
],
"value": 0,
"celltype": 0
},
{
"shape": "cube",
"box": [
[41, 35, 10],
[45, 39, 15]
],
"celltype": 2
},
{
"shape": "cube",
"box": [
[40, 15, 14],
[47, 22, 20]
],
"celltype": 2
},
{
"shape": "cube",
"box": [
[40, 20, 20],
[47, 27, 26]
],
"celltype": 3
},
{
"shape": "cube",
"box": [
[38, 20, 60],
[45, 27, 66]
],
"celltype": 3
}
]
},
"CellsInSilico": {
"liquid": 1,
"adhesion": {
"matrix": [
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 10, 5],
[0, 0, 5, 5]
]
},
"temperature": 15,
"volume": {
"default": {
"storage": "const",
"value": 2000
},
"lambda": {
"storage": "const",
"value": 10
}
},
"surface": {
"default": {
"storage": "const",
"value": 800
},
"lambda": {
"storage": "const",
"value": 10
}
},
"cleaner": {
"killdistance": 100
},
"checkerboard": "00",
"energyfunctions": ["Volume00", "Surface00", "Adhesion00", "DynamicECM00"],
"centerofmass": {
"steps": 10
},
"dynamicecm": {
"enabled": true,
"stepsPerMcs": 100,
"pushSteps": 10,
"pushWeight": 2,
"ecmCellID": 0,
"deltat": 0.1,
"eta": 0.25,
"k0": 0.1,
"k1": 0.1,
"c": 4,
"alpha": 2,
"d": 0.3,
"phi": 1
}
},
"Writers": {
"ParallelVTK_Cells": {
"writer": "ParallelVtkImage",
"outputtype": "UInt32",
"field": "cells",
"steps": 1
},
"ParallelVTK_Displacement": {
"writer": "ParallelVtkImage",
"outputtype": "Float32",
"field": "dynamicecm",
"components": [0, 1, 2],
"steps": 1
}
},
"WriteActions": ["ParallelVTK_Cells", "ParallelVTK_Displacement"]
}
+131
View File
@@ -0,0 +1,131 @@
{
"#Testing": {
"description": "Cellular Potts Model with dynamic ECM"
},
"Application": "Cells",
"Geometry": {
"blocksize": [20, 40, 40],
"blockcount": [4, 2, 2]
},
"Settings": {
"timesteps": 250,
"randomseed": 42
},
"Filling": {
"cells": [
{
"_comment": "This is for the dynamic ECM",
"shape": "cube",
"box": [
[0, 0, 0],
[79, 79, 79]
],
"value": 0,
"celltype": 0
},
{
"shape": "cube",
"box": [
[41, 35, 10],
[45, 39, 15]
],
"celltype": 2
},
{
"shape": "cube",
"box": [
[40, 15, 14],
[47, 22, 20]
],
"celltype": 2
},
{
"shape": "cube",
"box": [
[40, 20, 20],
[47, 27, 26]
],
"celltype": 3
},
{
"shape": "cube",
"box": [
[38, 20, 60],
[45, 27, 66]
],
"celltype": 3
}
]
},
"CellsInSilico": {
"liquid": 1,
"adhesion": {
"matrix": [
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 10, 5],
[0, 0, 5, 5]
]
},
"temperature": 15,
"volume": {
"default": {
"storage": "const",
"value": 2000
},
"lambda": {
"storage": "const",
"value": 10
}
},
"surface": {
"default": {
"storage": "const",
"value": 800
},
"lambda": {
"storage": "const",
"value": 10
}
},
"cleaner": {
"killdistance": 100
},
"checkerboard": "00",
"energyfunctions": ["Volume00", "Surface00", "Adhesion00", "DynamicECM00"],
"centerofmass": {
"steps": 10
},
"dynamicecm": {
"enabled": true,
"stepsPerMcs": 100,
"pushSteps": 10,
"pushWeight": 2,
"ecmCellID": 0,
"deltat": 0.1,
"eta": 0.25,
"k0": 0.1,
"k1": 0.1,
"c": 4,
"alpha": 2,
"d": 0.3,
"phi": 1
}
},
"Writers": {
"ParallelVTK_Cells": {
"writer": "ParallelVtkImage",
"outputtype": "UInt32",
"field": "cells",
"steps": 1
},
"ParallelVTK_Displacement": {
"writer": "ParallelVtkImage",
"outputtype": "Float32",
"field": "dynamicecm",
"components": [0, 1, 2],
"steps": 1
}
},
"WriteActions": ["ParallelVTK_Cells", "ParallelVTK_Displacement"]
}
+330
View File
@@ -0,0 +1,330 @@
{
"Comments": [
"Celltype Usage",
"0 Dynamic ECM",
"1-5 Not Used",
"6 Liquid ",
"7 Apoptotic cell Type ",
"8 Basic Non Dividing Cell type (surrounding)",
"9 Cancer"
],
"Application": "Cells",
"CellsInSilico": {
"ecmdegradation": {
"enabled": "false",
"steps": 99999,
"stochastic": "true",
"probability": 0.5
},
"energyfunctions": [
"Volume00",
"Surface01",
"Motility00",
"Adhesion01",
"DynamicECM00"
],
"liquid": 6,
"volume": {
"default": {
"storage": "const",
"value": 500
},
"lambda": [
0,
0,
0,
0,
0,
0,
0,
7.5,
7.5,
7.5
],
"sizechange": [
0,
0,
0,
0,
0,
0,
0,
-0.05,
0,
0,
0,
0,
0,
0,
0
]
},
"surface": {
"default": {
"storage": "const",
"value": 400
},
"lambda": [
0,
0,
0,
0,
0,
0,
0,
5.625,
5.625,
1
],
"sizechange": [
0,
0,
0,
0,
0,
0,
0,
-0.05,
0,
0,
0,
0,
0,
0,
0,
0
]
},
"adhesion": {
"matrix": [
[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
[
0,
0,
0,
0,
0,
0,
0,
0,
0,
450
],
[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
[
0,
450,
0,
0,
0,
0,
0,
0,
0,
50
]
]
},
"temperature": 50,
"division": {
"enabled": "true",
"condition": [
"",
"",
"",
"",
"",
"",
"",
"",
"",
"( volume >= 0.9 * volume0 ) & ( rnd() <= 0.00001 ) & generation < 1"
]
},
"centerofmass": {
"steps": 1
},
"signaling": {
"enabled": false
},
"orientation": {
"enabled": true,
"motility": "persistentRandomWalk",
"persistenceMagnitude": 0.0,
"recalculationtime": 200,
"motilityamount": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
]
},
"visitor": {
"stepwidth": 10,
"checkerboard": "01"
},
"cleaner": {
"killDistance": 20
},
"dynamicecm": {
"enabled": true,
"stepsPerMcs": 100,
"pushSteps": 10,
"pushWeight": 2,
"ecmCellID": 0,
"deltat": 0.1,
"eta": 0.25,
"k0": 0.1,
"k1": 0.1,
"c": 4,
"alpha": 2,
"d": 0.3,
"phi": 1
}
},
"Geometry": {
"blockcount": [
2,
4,
4
],
"blocksize": [
200,
100,
100
]
},
"Settings": {
"randomseed": 0,
"timesteps": 5000,
"statusoutput": 1
},
"WriteActions": ["ParallelVTK_Cells", "ParallelVTK_Displacement"],
"Writers": {
"CellInfo": {
"field": "",
"groupsize": 0,
"steps": 1,
"writer": "CellInfo"
},
"ParallelVTK_Cells": {
"field": "cells",
"outputtype": "UInt32",
"printhints": false,
"steps": 100,
"writer": "ParallelVtkImage"
},
"ParallelVTK_Displacement": {
"writer": "ParallelVtkImage",
"outputtype": "Float32",
"field": "dynamicecm",
"components": [
0,
1,
2
],
"steps": 100
}
},
"Include": "measurements/strong/config_filling_1.json"
}
@@ -0,0 +1 @@
Autogenerated by scripts/gen/strong.py
@@ -0,0 +1,44 @@
{
"DefineFunctions": [
"r_angle()=360*rnd()",
"r_size()=400*rnd()"
],
"Filling": {
"cells": [
{
"_comment": "This is for the dynamic ECM",
"shape": "cube",
"box": [
[0, 0, 0],
[399, 399, 401]
],
"value": 0,
"celltype": 0
},
{
"shape": "sphere",
"pattern": "voronoi",
"count": 5500,
"radius": 75,
"center": [
200,
200,
200
],
"box": [
[
110,
110,
110
],
[
290,
290,
290
]
],
"celltype": 9
}
]
}
}
+110
View File
@@ -0,0 +1,110 @@
{
"#Testing": {
"description": "Cellular Potts Model with dynamic ECM"
},
"Application": "Cells",
"Geometry": {
"blocksize": [180, 180, 180],
"blockcount": [1, 1, 1]
},
"Settings": {
"timesteps": 100,
"randomseed": 42,
"statusoutput": 1
},
"Filling": {
"cells": [
{
"_comment": "This is for the dynamic ECM",
"shape": "cube",
"box": [
[0, 0, 0],
[179, 179, 179]
],
"value": 0,
"celltype": 0
},
{
"shape": "cube",
"pattern": "voronoi",
"box": [
[20, 20, 20],
[159, 159, 159]
],
"count": 1500,
"celltype": [0, 0, 750, 750]
}
]
},
"CellsInSilico": {
"liquid": 1,
"adhesion": {
"matrix": [
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 10, 5],
[0, 0, 5, 5]
]
},
"temperature": 15,
"volume": {
"default": {
"storage": "const",
"value": 2000
},
"lambda": {
"storage": "const",
"value": 10
}
},
"surface": {
"default": {
"storage": "const",
"value": 800
},
"lambda": {
"storage": "const",
"value": 10
}
},
"cleaner": {
"killdistance": 100
},
"checkerboard": "00",
"energyfunctions": ["Volume00", "Surface00", "Adhesion00", "DynamicECM00"],
"centerofmass": {
"steps": 10
},
"dynamicecm": {
"enabled": true,
"stepsPerMcs": 100,
"pushSteps": 10,
"pushWeight": 2,
"ecmCellID": 0,
"deltat": 0.1,
"eta": 0.25,
"k0": 0.1,
"k1": 0.1,
"c": 4,
"alpha": 2,
"d": 0.3,
"phi": 1
}
},
"Writers": {
"ParallelVTK_Cells": {
"writer": "ParallelVtkImage",
"outputtype": "UInt32",
"field": "cells",
"steps": 10
},
"ParallelVTK_Displacement": {
"writer": "ParallelVtkImage",
"outputtype": "Float32",
"field": "dynamicecm",
"components": [0, 1, 2],
"steps": 10
}
},
"WriteActions": ["ParallelVTK_Cells", "ParallelVTK_Displacement"]
}
+110
View File
@@ -0,0 +1,110 @@
{
"#Testing": {
"description": "Cellular Potts Model with dynamic ECM, small experiment"
},
"Application": "Cells",
"Geometry": {
"blocksize": [40, 20, 20],
"blockcount": [1, 1, 1]
},
"Settings": {
"timesteps": 200,
"randomseed": 42
},
"Filling": {
"cells": [
{
"_comment": "This is for the dynamic ECM",
"shape": "cube",
"box": [
[10, 0, 0],
[39, 19, 19]
],
"value": 0,
"celltype": 0
},
{
"shape": "cube",
"box": [
[2, 8, 8],
[9, 13, 13]
],
"celltype": 2
},
{
"shape": "cube",
"box": [
[30, 8, 8],
[37, 13, 13]
],
"celltype": 3
}
]
},
"CellsInSilico": {
"liquid": 1,
"adhesion": {
"matrix": [
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 10, 5],
[0, 0, 5, 5]
]
},
"temperature": 15,
"volume": {
"default": [0, 0, 7000, 1000],
"lambda": {
"storage": "const",
"value": 10
}
},
"surface": {
"default": [0, 0, 2500, 1000],
"lambda": {
"storage": "const",
"value": 10
}
},
"cleaner": {
"killdistance": 100
},
"checkerboard": "00",
"energyfunctions": ["Volume00", "Surface00", "Adhesion00", "DynamicECM00"],
"centerofmass": {
"steps": 10
},
"dynamicecm": {
"enabled": true,
"stepsPerMcs": 10,
"pushSteps": 10,
"pushWeight": 2,
"ecmCellID": 0,
"deltat": 0.1,
"eta": 0.25,
"k0": 0.1,
"k1": 0.1,
"c": 4,
"alpha": 2,
"d": 0.3,
"phi": 1,
"lambda": 50
}
},
"Writers": {
"ParallelVTK_Cells": {
"writer": "ParallelVtkImage",
"outputtype": "UInt32",
"field": "cells",
"steps": 1
},
"ParallelVTK_Displacement": {
"writer": "ParallelVtkImage",
"outputtype": "Float32",
"field": "dynamicecm",
"components": [0, 1, 2],
"steps": 1
}
},
"WriteActions": ["ParallelVTK_Cells", "ParallelVTK_Displacement"]
}
+97
View File
@@ -0,0 +1,97 @@
{
"#Testing": {
"description": "Minimal config for debugging CUDA code"
},
"Application": "Cells",
"Geometry": {
"blocksize": [5, 5, 5],
"blockcount": [1, 1, 1]
},
"Settings": {
"timesteps": 3,
"randomseed": 42
},
"Filling": {
"cells": [
{
"_comment": "This is for the dynamic ECM",
"shape": "cube",
"box": [
[0, 0, 0],
[4, 2, 4]
],
"value": 0,
"celltype": 0
},
{
"shape": "cube",
"box": [
[1, 1, 1],
[3, 3, 3]
],
"celltype": 2
}
]
},
"CellsInSilico": {
"liquid": 1,
"adhesion": {
"matrix": [
[0, 0, 0, 0],
[0, 20, 5, 5],
[0, 5, 10, 5],
[0, 5, 5, 5]
]
},
"temperature": 15,
"volume": {
"default": {
"storage": "const",
"value": 300
},
"lambda": {
"storage": "const",
"value": 10
}
},
"potential": {
"direction": [1, 1, 0],
"coupling": [0, 150, 100, 50]
},
"surface": {
"default": {
"storage": "const",
"value": 400
},
"lambda": {
"storage": "const",
"value": 10
}
},
"cleaner": {
"killdistance": 100
},
"checkerboard": "00",
"energyfunctions": ["Volume00", "Surface00", "Adhesion00", "Potential00", "DynamicECM00"],
"centerofmass": {
"steps": 10
},
"dynamicecm": {
"enabled": true,
"ecmCellID": 0,
"stepsPerMcs": 1,
"pushSteps": 1,
"deltat": 0.1,
"eta": 0.5
}
},
"Writers": {
"ParallelVTK_Displacement": {
"writer": "ParallelVtkImage",
"outputtype": "Float32",
"field": "dynamicecm",
"steps": 1
}
},
"WriteActions": ["ParallelVTK_Displacement"]
}
+116
View File
@@ -0,0 +1,116 @@
{
"Comments": ["Celltype Usage", "0 Not Used", "1-5 Solids for blood vessels / ECM", "6 Liquid ", "7 Apoptotic cell Type ", "8 Basic Non Dividing Cell type (surrounding)", "9 Cancer"],
"Application": "Cells",
"CellsInSilico": {
"ecmdegradation": {
"enabled": "false",
"steps": 99999,
"stochastic": "true",
"probability": 0.5
},
"energyfunctions": ["Volume00", "Surface01", "Motility00", "Adhesion01", "DynamicECM00"],
"liquid": 6,
"volume": {
"default": {
"storage": "const",
"value": 500
},
"lambda": [0, 0, 0, 0, 0, 0, 0, 7.5, 7.5, 7.5],
"sizechange": [0, 0, 0, 0, 0, 0, 0, -0.05, 0, 0, 0, 0, 0, 0, 0]
},
"surface": {
"default": {
"storage": "const",
"value": 400
},
"lambda": [0, 0, 0, 0, 0, 0, 0, 5.625, 5.625, 1],
"sizechange": [0, 0, 0, 0, 0, 0, 0, -0.05, 0, 0, 0, 0, 0, 0, 0, 0]
},
"adhesion": {
"matrix": [
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 450],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 450, 0, 0, 0, 0, 0, 0, 0, 50]
]
},
"temperature": 50,
"division": {
"enabled": "true",
"condition": ["", "", "", "", "", "", "", "", "", "( volume >= 0.9 * volume0 ) & ( rnd() <= 0.00001 ) & generation < 1"]
},
"centerofmass": {
"steps": 1
},
"signaling": {
"enabled": false
},
"orientation": {
"enabled": true,
"motility": "persistentRandomWalk",
"persistenceMagnitude": 0.0,
"recalculationtime": 200,
"motilityamount": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
},
"visitor": {
"stepwidth": 10,
"checkerboard": "01"
},
"cleaner": {
"killDistance": 20
},
"dynamicecm": {
"enabled": true,
"stepsPerMcs": 100,
"pushSteps": 10,
"pushWeight": 2,
"ecmCellID": 0,
"deltat": 0.1,
"eta": 0.25,
"k0": 0.1,
"k1": 0.1,
"c": 4,
"alpha": 2,
"d": 0.3,
"phi": 1
}
},
"Geometry": {
"blockcount": [8, 8, 6],
"blocksize": [50, 50, 67]
},
"Settings": {
"randomseed": 0,
"timesteps": 100
},
"WriteActions": ["CellInfo"],
"Writers": {
"CellInfo": {
"field": "",
"groupsize": 0,
"steps": 1,
"writer": "CellInfo"
},
"ParallelVTK_Cells": {
"field": "cells",
"outputtype": "UInt32",
"printhints": false,
"steps": 1,
"writer": "ParallelVtkImage"
},
"ParallelVTK_Displacement": {
"writer": "ParallelVtkImage",
"outputtype": "Float32",
"field": "dynamicecm",
"components": [0, 1, 2],
"steps": 1
}
},
"Include": "config_filling_1.json"
}
@@ -0,0 +1,44 @@
{
"DefineFunctions": [
"r_angle()=360*rnd()",
"r_size()=400*rnd()"
],
"Filling": {
"cells": [
{
"_comment": "This is for the dynamic ECM",
"shape": "cube",
"box": [
[0, 0, 0],
[399, 399, 401]
],
"value": 0,
"celltype": 0
},
{
"shape": "sphere",
"pattern": "voronoi",
"count": 5500,
"radius": 75,
"center": [
200,
200,
200
],
"box": [
[
110,
110,
110
],
[
290,
290,
290
]
],
"celltype": 9
}
]
}
}
+13
View File
@@ -0,0 +1,13 @@
generate-batch-strong-cpu:
python scripts/substitute.py strong-batch.j2 < strong-cpu.json
generate-batch-strong-gpu:
python scripts/substitute.py strong-batch.j2 < strong-gpu.json
generate-batch-strong-booster:
python scripts/substitute.py strong-batch.j2 < strong-booster.json
clean-logs:
rm logs/*
.PHONY: generate-batch-strong-cpu clean-logs
@@ -0,0 +1,4 @@
label,BC:cells,BC:dynamicecm,Sweep:Cells,Sweep:DynamicECM,Sweep:DynamicECMDampers,Filling,Other
CPU,0.04629667717328299,3.88243023434036,0.002164069189058585,82.18255346583861,13.842310640806883,0.005797982839735358,0.03844692981207934
GPU,0.034897486509106485,41.227398706349675,13.180664898871365,22.432483220415783,19.749714111977486,1.9939606413394697,1.3808809345371023
Booster,0.09128030041871667,42.736382370072874,12.260298369798207,22.36492489089858,16.070196185259338,4.364304866307413,2.1126130172448816
1 label BC:cells BC:dynamicecm Sweep:Cells Sweep:DynamicECM Sweep:DynamicECMDampers Filling Other
2 CPU 0.04629667717328299 3.88243023434036 0.002164069189058585 82.18255346583861 13.842310640806883 0.005797982839735358 0.03844692981207934
3 GPU 0.034897486509106485 41.227398706349675 13.180664898871365 22.432483220415783 19.749714111977486 1.9939606413394697 1.3808809345371023
4 Booster 0.09128030041871667 42.736382370072874 12.260298369798207 22.36492489089858 16.070196185259338 4.364304866307413 2.1126130172448816
+4
View File
@@ -0,0 +1,4 @@
label,BC:cells,BC:dynamicecm,Sweep:Cells,Sweep:DynamicECM,Sweep:DynamicECMDampers,Other
CPU,0.9047934333333334,75.87579921250001,0.04229322083333333,1606.12465625,270.5255006333333,0.8646950250000001
GPU,0.11372260000000001,134.35027680000002,42.952648800000006,73.102122,64.3596162,10.9978052
Booster,0.155221,72.67267939999999,20.848482800000003,38.0312728,27.327165999999995,11.013917200000002
1 label BC:cells BC:dynamicecm Sweep:Cells Sweep:DynamicECM Sweep:DynamicECMDampers Other
2 CPU 0.9047934333333334 75.87579921250001 0.04229322083333333 1606.12465625 270.5255006333333 0.8646950250000001
3 GPU 0.11372260000000001 134.35027680000002 42.952648800000006 73.102122 64.3596162 10.9978052
4 Booster 0.155221 72.67267939999999 20.848482800000003 38.0312728 27.327165999999995 11.013917200000002
File diff suppressed because one or more lines are too long
+9
View File
@@ -0,0 +1,9 @@
label nodes tasks mean_time std_time speedup speedup_std speedup_error
1 1 1 161.08257980000002 1.0725827874500897 1.0 0.0066585895804611986 0.004614167168572558
1 1 2 109.2771463 1.3498701967829918 1.474073813730255 0.018208823861030076 0.012618071172974463
1 1 4 94.5763083 2.921107861707173 1.7032022363258181 0.052605536545441436 0.03645377698685362
2 2 8 75.06436665 5.345617315509918 2.145926049720424 0.15281950626022228 0.10589851499069955
4 4 16 42.842002025 1.5314070839490197 3.759921856733072 0.13440013758310768 0.09313454370387199
8 8 32 16.40522446875 4.395440141154071 9.818980539208297 2.6307924825691393 1.823046180232846
16 16 64 9.361684956249999 5.010216046116417 17.206579857449583 9.208671612370724 6.381283859970849
32 32 128 5.214438346875 0.113661681579046 30.891645290338204 0.6733604113945479 0.4666149588180552
1 label nodes tasks mean_time std_time speedup speedup_std speedup_error
2 1 1 1 161.08257980000002 1.0725827874500897 1.0 0.0066585895804611986 0.004614167168572558
3 1 1 2 109.2771463 1.3498701967829918 1.474073813730255 0.018208823861030076 0.012618071172974463
4 1 1 4 94.5763083 2.921107861707173 1.7032022363258181 0.052605536545441436 0.03645377698685362
5 2 2 8 75.06436665 5.345617315509918 2.145926049720424 0.15281950626022228 0.10589851499069955
6 4 4 16 42.842002025 1.5314070839490197 3.759921856733072 0.13440013758310768 0.09313454370387199
7 8 8 32 16.40522446875 4.395440141154071 9.818980539208297 2.6307924825691393 1.823046180232846
8 16 16 64 9.361684956249999 5.010216046116417 17.206579857449583 9.208671612370724 6.381283859970849
9 32 32 128 5.214438346875 0.113661681579046 30.891645290338204 0.6733604113945479 0.4666149588180552
File diff suppressed because one or more lines are too long
+10
View File
@@ -0,0 +1,10 @@
label nodes tasks mean_time std_time speedup speedup_std speedup_error
1 1 48 1953.3832839708334 14.087268287606769 1.0 0.007211727674340593 0.004711662080569187
2 2 96 1046.3540047312501 6.0880471399828595 1.866847429396085 0.010861959816590314 0.007096480413505672
4 4 192 566.0709002166666 5.005298021298787 3.4507749527897755 0.030512356378918384 0.019934739500893344
8 8 384 318.1225953708333 9.706195475255436 6.1403475024896865 0.18734731205020752 0.12240024387280224
16 16 768 178.56471887994792 9.393026972005948 10.939357428631386 0.5754422263707719 0.375955587895571
32 32 1536 99.82801128216144 1.4413062581268035 19.56748670921274 0.28251330150299214 0.18457535698195485
64 64 3072 55.75610567220052 1.0303316198245824 35.034428255357376 0.6474103379133267 0.42297475410337343
128 128 6144 31.589132888118492 0.32226687791817415 61.83719226764697 0.6308523555205254 0.41215687227340997
256 256 12288 19.11704500200738 0.18528928846832715 102.18018965617955 0.9903672160087601 0.6470399144590566
1 label nodes tasks mean_time std_time speedup speedup_std speedup_error
2 1 1 48 1953.3832839708334 14.087268287606769 1.0 0.007211727674340593 0.004711662080569187
3 2 2 96 1046.3540047312501 6.0880471399828595 1.866847429396085 0.010861959816590314 0.007096480413505672
4 4 4 192 566.0709002166666 5.005298021298787 3.4507749527897755 0.030512356378918384 0.019934739500893344
5 8 8 384 318.1225953708333 9.706195475255436 6.1403475024896865 0.18734731205020752 0.12240024387280224
6 16 16 768 178.56471887994792 9.393026972005948 10.939357428631386 0.5754422263707719 0.375955587895571
7 32 32 1536 99.82801128216144 1.4413062581268035 19.56748670921274 0.28251330150299214 0.18457535698195485
8 64 64 3072 55.75610567220052 1.0303316198245824 35.034428255357376 0.6474103379133267 0.42297475410337343
9 128 128 6144 31.589132888118492 0.32226687791817415 61.83719226764697 0.6308523555205254 0.41215687227340997
10 256 256 12288 19.11704500200738 0.18528928846832715 102.18018965617955 0.9903672160087601 0.6470399144590566
@@ -0,0 +1,9 @@
label,BC:cells,BC:dynamicecm,Sweep:Cells,Sweep:DynamicECM,Sweep:DynamicECMDampers,Filling,Other
1,0.034897486509106485,41.227398706349675,13.180664898871365,22.432483220415783,19.749714111977486,1.9939606413394697,1.3808809345371023
2,0.7137918070198439,50.7137377526309,8.923981074147767,19.35772833011394,17.571497161475467,1.320924803923136,1.3983390706889622
4,0.6647403410134337,58.291944402330074,7.087118055335309,16.67352093599457,15.236952119238136,1.092645293437499,0.953078852650984
8,0.6788278363464717,65.05900206274784,5.2089254465999275,14.249993130938188,13.176763096049008,0.7851584656500297,0.8413299616685318
16,1.441574901760373,61.1245906198054,4.832237599492141,16.029377636605524,14.996293924006913,0.716990077435801,0.858935240893841
32,3.3736940900007966,47.94830950907802,5.622259685491874,21.238716402604393,19.97281149065964,0.8196124452570666,1.0245963769081996
64,6.284545018581091,45.28808866195176,4.502683326147901,21.66574860147326,20.522789117514915,0.6460791296539419,1.0900661446771265
128,11.788574344478201,40.04977497065291,3.2677482351392375,22.1995263401806,21.209134936528987,0.4598839494487746,1.0253572235712836
1 label BC:cells BC:dynamicecm Sweep:Cells Sweep:DynamicECM Sweep:DynamicECMDampers Filling Other
2 1 0.034897486509106485 41.227398706349675 13.180664898871365 22.432483220415783 19.749714111977486 1.9939606413394697 1.3808809345371023
3 2 0.7137918070198439 50.7137377526309 8.923981074147767 19.35772833011394 17.571497161475467 1.320924803923136 1.3983390706889622
4 4 0.6647403410134337 58.291944402330074 7.087118055335309 16.67352093599457 15.236952119238136 1.092645293437499 0.953078852650984
5 8 0.6788278363464717 65.05900206274784 5.2089254465999275 14.249993130938188 13.176763096049008 0.7851584656500297 0.8413299616685318
6 16 1.441574901760373 61.1245906198054 4.832237599492141 16.029377636605524 14.996293924006913 0.716990077435801 0.858935240893841
7 32 3.3736940900007966 47.94830950907802 5.622259685491874 21.238716402604393 19.97281149065964 0.8196124452570666 1.0245963769081996
8 64 6.284545018581091 45.28808866195176 4.502683326147901 21.66574860147326 20.522789117514915 0.6460791296539419 1.0900661446771265
9 128 11.788574344478201 40.04977497065291 3.2677482351392375 22.1995263401806 21.209134936528987 0.4598839494487746 1.0253572235712836
File diff suppressed because one or more lines are too long
+9
View File
@@ -0,0 +1,9 @@
label nodes tasks mean_time std_time speedup speedup_std speedup_error
1 1 1 316.56674059999995 1.3298279828832311 1.0 0.004200782370133899 0.002910993666206366
1 1 2 239.7297573 1.3705192585818793 1.3205150005797797 0.007549297425250635 0.00523139621453709
1 1 4 150.86725470000002 1.463195211854327 2.098313124537819 0.020350616990413285 0.014102258089746373
2 2 8 103.758313 1.3959932139830615 3.051001230137579 0.041049019495199714 0.028445519245192213
4 4 16 56.423368849999996 0.8293394846143929 5.610560784514376 0.08246688711191473 0.057146637198176795
8 8 32 24.168551143749998 0.5503559531334744 13.09829202078025 0.29826872726631265 0.20668968287257275
16 16 64 15.05716248125 0.04648043269670786 21.024329185144023 0.06490066896072916 0.044973869063161365
32 32 128 9.9111531140625 0.08848604506395903 31.940455056721632 0.28516203039001964 0.19760720531719309
1 label nodes tasks mean_time std_time speedup speedup_std speedup_error
2 1 1 1 316.56674059999995 1.3298279828832311 1.0 0.004200782370133899 0.002910993666206366
3 1 1 2 239.7297573 1.3705192585818793 1.3205150005797797 0.007549297425250635 0.00523139621453709
4 1 1 4 150.86725470000002 1.463195211854327 2.098313124537819 0.020350616990413285 0.014102258089746373
5 2 2 8 103.758313 1.3959932139830615 3.051001230137579 0.041049019495199714 0.028445519245192213
6 4 4 16 56.423368849999996 0.8293394846143929 5.610560784514376 0.08246688711191473 0.057146637198176795
7 8 8 32 24.168551143749998 0.5503559531334744 13.09829202078025 0.29826872726631265 0.20668968287257275
8 16 16 64 15.05716248125 0.04648043269670786 21.024329185144023 0.06490066896072916 0.044973869063161365
9 32 32 128 9.9111531140625 0.08848604506395903 31.940455056721632 0.28516203039001964 0.19760720531719309
File diff suppressed because one or more lines are too long
+9
View File
@@ -0,0 +1,9 @@
nodes tasks mean_time std_time efficiency efficiency_error
1 1 41.98463099999999 1.4067920862965122 1.0 0.023219381860496473
1 2 49.85189340000001 1.7669363566083227 0.8421872899214694 0.020685165974491628
1 4 59.9694977 2.209151778903949 0.7000997608822725 0.01787171173813342
2 8 72.810012625 0.5538313058789631 0.5766326565034021 0.003039461920431096
4 16 84.718001525 5.20969191162485 0.4955809892140865 0.021118450727088397
8 32 87.22569569999999 1.7018797711775082 0.4813332890390463 0.0065079080866405825
16 64 85.36740952500001 1.0197522041876155 0.49181099946232654 0.004071100890302765
32 128 87.5995021046875 0.8707125543332932 0.47927933368645675 0.003301208459097849
1 nodes tasks mean_time std_time efficiency efficiency_error
2 1 1 41.98463099999999 1.4067920862965122 1.0 0.023219381860496473
3 1 2 49.85189340000001 1.7669363566083227 0.8421872899214694 0.020685165974491628
4 1 4 59.9694977 2.209151778903949 0.7000997608822725 0.01787171173813342
5 2 8 72.810012625 0.5538313058789631 0.5766326565034021 0.003039461920431096
6 4 16 84.718001525 5.20969191162485 0.4955809892140865 0.021118450727088397
7 8 32 87.22569569999999 1.7018797711775082 0.4813332890390463 0.0065079080866405825
8 16 64 85.36740952500001 1.0197522041876155 0.49181099946232654 0.004071100890302765
9 32 128 87.5995021046875 0.8707125543332932 0.47927933368645675 0.003301208459097849
File diff suppressed because one or more lines are too long
+10
View File
@@ -0,0 +1,10 @@
nodes tasks mean_time std_time efficiency efficiency_error
1 48 234.09125610833334 4.9756238110995765 1.0 0.013886639526655382
2 96 234.09269640000002 1.9886350551995884 0.9999938473447108 0.005550081636855162
4 192 239.06532950520833 1.8931447841474947 0.9791936647310181 0.005066063671757703
8 384 241.32357499479167 0.977728668984766 0.9700306160033705 0.0025676679349660694
16 768 260.8008324059896 12.802824235961744 0.8975863073317291 0.028787758154736998
32 1536 266.59983470546877 13.970338204797093 0.8780622702446538 0.03006125980502309
64 3072 281.61153985800786 25.95560834859075 0.8312559074332151 0.05005532970709546
128 6144 293.4177162058594 10.8076489888669 0.7978088683101088 0.019198998510810975
256 12288 310.9775802693196 14.459893325743863 0.7527592693518308 0.022867934404056486
1 nodes tasks mean_time std_time efficiency efficiency_error
2 1 48 234.09125610833334 4.9756238110995765 1.0 0.013886639526655382
3 2 96 234.09269640000002 1.9886350551995884 0.9999938473447108 0.005550081636855162
4 4 192 239.06532950520833 1.8931447841474947 0.9791936647310181 0.005066063671757703
5 8 384 241.32357499479167 0.977728668984766 0.9700306160033705 0.0025676679349660694
6 16 768 260.8008324059896 12.802824235961744 0.8975863073317291 0.028787758154736998
7 32 1536 266.59983470546877 13.970338204797093 0.8780622702446538 0.03006125980502309
8 64 3072 281.61153985800786 25.95560834859075 0.8312559074332151 0.05005532970709546
9 128 6144 293.4177162058594 10.8076489888669 0.7978088683101088 0.019198998510810975
10 256 12288 310.9775802693196 14.459893325743863 0.7527592693518308 0.022867934404056486
File diff suppressed because one or more lines are too long
+9
View File
@@ -0,0 +1,9 @@
nodes tasks mean_time std_time efficiency efficiency_error
1 1 60.658062599999994 1.8711952545625232 1.0 0.021376748626269895
1 2 80.6903592 1.1554429061827625 0.751738661240214 0.007459415624087278
1 4 89.01234124999999 1.3979557323025515 0.6814567704677693 0.00741639040919915
2 8 101.357940575 4.784240687736861 0.5984539766286584 0.01957478845779047
4 16 106.2530252 1.5044057675724636 0.5708831582519497 0.005601211794070455
8 32 113.70197445 2.069642901549501 0.5334829310873062 0.006729131548114211
16 64 119.22770070624999 0.7600051865549382 0.5087581345667959 0.00224730403456563
32 128 121.8124414140625 0.5170666166834136 0.4979627852118346 0.0014647476739746731
1 nodes tasks mean_time std_time efficiency efficiency_error
2 1 1 60.658062599999994 1.8711952545625232 1.0 0.021376748626269895
3 1 2 80.6903592 1.1554429061827625 0.751738661240214 0.007459415624087278
4 1 4 89.01234124999999 1.3979557323025515 0.6814567704677693 0.00741639040919915
5 2 8 101.357940575 4.784240687736861 0.5984539766286584 0.01957478845779047
6 4 16 106.2530252 1.5044057675724636 0.5708831582519497 0.005601211794070455
7 8 32 113.70197445 2.069642901549501 0.5334829310873062 0.006729131548114211
8 16 64 119.22770070624999 0.7600051865549382 0.5087581345667959 0.00224730403456563
9 32 128 121.8124414140625 0.5170666166834136 0.4979627852118346 0.0014647476739746731
+1
View File
@@ -0,0 +1 @@
module load SciPy-Stack
View File
+52
View File
@@ -0,0 +1,52 @@
#!/usr/bin/env python
import argparse
import json
import math
def print_table(data, spec):
print("\t".join(column for column in spec.keys()))
for data_item in data:
values = []
for retrieve in spec.values():
raw_value = retrieve(data_item)
values.append(raw_value if isinstance(raw_value, str) else str(raw_value))
print("\t".join(values))
if __name__ == "__main__":
p = argparse.ArgumentParser(description="Turn files generated by timing.py into pgf datafiles")
p.add_argument("timing_file")
p.add_argument("--weak", action="store_true")
args = p.parse_args()
with open(args.timing_file, "r", encoding="utf8") as f:
jobs = json.load(f)
if not args.weak:
scaling_spec = {
"label": lambda job: job["accounting"][0]["nodes"]["count"],
"nodes": lambda job: job["accounting"][0]["nodes"]["count"],
"tasks": lambda job: job["accounting"][0]["tasks"]["count"],
"mean_time": lambda job: job["means"]["TimeStep"],
"std_time": lambda job: job["stds"]["TimeStep"],
"speedup": lambda job: jobs[0]["means"]["TimeStep"] / job["means"]["TimeStep"],
# Standard deviation scaled to speedup
"speedup_std": lambda job: (jobs[0]["means"]["TimeStep"] / job["means"]["TimeStep"]) * (job["stds"]["TimeStep"] / job["means"]["TimeStep"]),
# 95% confidence interval
"speedup_error": lambda job: (jobs[0]["means"]["TimeStep"] / job["means"]["TimeStep"]) * (job["stds"]["TimeStep"] / job["means"]["TimeStep"]) / math.sqrt(len(jobs)) * 1.96,
}
else:
scaling_spec = {
"nodes": lambda job: job["accounting"][0]["nodes"]["count"],
"tasks": lambda job: job["accounting"][0]["tasks"]["count"],
"mean_time": lambda job: job["means"]["TimeStep"],
"std_time": lambda job: job["stds"]["TimeStep"],
"efficiency": lambda job: jobs[0]["means"]["TimeStep"] / job["means"]["TimeStep"],
"efficiency_error": lambda job: (jobs[0]["means"]["TimeStep"] / job["means"]["TimeStep"]) * (job["stds"]["TimeStep"] / job["means"]["TimeStep"]) / math.sqrt(len(jobs)) * 1.96,
}
print_table(jobs, scaling_spec)
@@ -0,0 +1,34 @@
#!/usr/bin/env python
import copy
import json
from pathlib import Path
SIZE = [384, 384, 384]
with (Path(__file__).parent.parent / "templates" / "strong-booster.json").open(encoding="utf8") as f:
template = json.load(f)
configs = [
[ 1, 1, 1],
[ 1, 1, 2],
[ 1, 2, 2],
[ 2, 2, 2],
[ 2, 2, 4],
[ 2, 4, 4],
[ 4, 4, 4],
[ 4, 4, 8],
]
out_path = Path(__file__).parent.parent / "generated" / "config"
for c in configs:
nc = copy.deepcopy(template)
nc["Geometry"]["blockcount"] = c
nc["Geometry"]["blocksize"] = [bs // bc for bc, bs in zip(c, SIZE)]
nc_out_path = out_path / f"strong-booster-{c[0]:02}-{c[1]:02}-{c[2]:02}.json"
print(f"Dumping {(c[0] * c[1] * c[2])} to {nc_out_path}")
with nc_out_path.open("w", encoding="utf8") as f:
json.dump(nc, f)
+35
View File
@@ -0,0 +1,35 @@
#!/usr/bin/env python
import copy
import json
from pathlib import Path
SIZE = [384, 384, 384]
with (Path(__file__).parent.parent / "templates" / "strong-cpu.json").open(encoding="utf8") as f:
template = json.load(f)
configs = [
[ 4, 4, 3],
[ 4, 4, 6],
[ 4, 4, 12],
[ 4, 8, 12],
[ 8, 8, 12],
[ 8, 8, 24],
[ 8, 16, 24],
[ 16, 16, 24],
[ 16, 16, 48]
]
out_path = Path(__file__).parent.parent / "generated" / "config"
for c in configs:
nc = copy.deepcopy(template)
nc["Geometry"]["blockcount"] = c
nc["Geometry"]["blocksize"] = [bs // bc for bc, bs in zip(c, SIZE)]
nc_out_path = out_path / f"strong-cpu-{c[0]:02}-{c[1]:02}-{c[2]:02}.json"
print(f"Dumping {(c[0] * c[1] * c[2]) // 48} to {nc_out_path}")
with nc_out_path.open("w", encoding="utf8") as f:
json.dump(nc, f)
+34
View File
@@ -0,0 +1,34 @@
#!/usr/bin/env python
import copy
import json
from pathlib import Path
SIZE = [384, 384, 384]
with (Path(__file__).parent.parent / "templates" / "strong-gpu.json").open(encoding="utf8") as f:
template = json.load(f)
configs = [
[ 1, 1, 1],
[ 1, 1, 2],
[ 1, 2, 2],
[ 2, 2, 2],
[ 2, 2, 4],
[ 2, 4, 4],
[ 4, 4, 4],
[ 4, 4, 8],
]
out_path = Path(__file__).parent.parent / "generated" / "config"
for c in configs:
nc = copy.deepcopy(template)
nc["Geometry"]["blockcount"] = c
nc["Geometry"]["blocksize"] = [bs // bc for bc, bs in zip(c, SIZE)]
nc_out_path = out_path / f"strong-gpu-{c[0]:02}-{c[1]:02}-{c[2]:02}.json"
print(f"Dumping {(c[0] * c[1] * c[2])} to {nc_out_path}")
with nc_out_path.open("w", encoding="utf8") as f:
json.dump(nc, f)
+207
View File
@@ -0,0 +1,207 @@
#!/usr/bin/env python
import jinja2
import json
import sys
from dataclasses import dataclass
from pathlib import Path
from typing import Tuple
SIZE = (192, 192, 192)
templates_env = jinja2.Environment(
loader=jinja2.FileSystemLoader(Path(__file__).parent.parent / "templates"),
autoescape=jinja2.select_autoescape()
)
@dataclass
class Experiment:
job_name: str
account: str
partition: str
nastja_binary_path: str
nodes: int
tasks: int
num_blocks: Tuple[int, int, int]
domain_scale: Tuple[int, int, int]
time: str = "00:15:00"
extra_sbatch_line: str = ""
logfile_path: str = "/p/project/cellsinsilico/paulslustigebude/ma/experiments/eval/logs/%x-%A.%a"
config_path: str = "/p/project/cellsinsilico/paulslustigebude/ma/experiments/eval/generated/config/${SLURM_JOB_NAME}.json"
output_dir_path: str = "/p/scratch/cellsinsilico/paul/nastja-out/${SLURM_JOB_NAME}-${SLURM_ARRAY_JOB_ID}.${SLURM_ARRAY_TASK_ID}"
def get_config(self):
with (Path(__file__).parent.parent / "templates" / "weak.json").open(encoding="utf8") as f:
config = json.load(f)
size = (
SIZE[0] * self.domain_scale[0],
SIZE[1] * self.domain_scale[1],
SIZE[2] * self.domain_scale[2],
)
blocksize = (
size[0] // self.num_blocks[0],
size[1] // self.num_blocks[1],
size[2] // self.num_blocks[2],
)
config["Geometry"] = {
"blockcount": list(self.num_blocks),
"blocksize": list(blocksize),
}
cells_filling = [{
"box": [
[0, 0, 0],
list(size)
],
"celltype": 0,
"component": 0,
"pattern": "const",
"seed": 0,
"shape": "cube",
"value": 0,
}]
for z in range(self.domain_scale[2]):
for y in range(self.domain_scale[1]):
for x in range(self.domain_scale[0]):
cx = x * SIZE[0] + SIZE[0] // 2
cy = y * SIZE[1] + SIZE[1] // 2
cz = z * SIZE[2] + SIZE[2] // 2
cells_filling.append({
"shape": "sphere",
"pattern": "voronoi",
"count": 715,
"radius": 38,
"center": [cx, cy, cz],
"box": [
[cx - 38, cy - 38, cz - 38],
[cx + 38, cy + 38, cz + 38]
],
"celltype": 9,
"seed": 758960,
})
config["Filling"]["cells"] = cells_filling
return config
def write_batch_file(self, out_path: Path):
t = templates_env.get_template("strong-batch.j2")
t.stream(
name=self.job_name,
account=self.account,
partition=self.partition,
nodes=self.nodes,
tasks=self.tasks,
extra_sbatch_line=self.extra_sbatch_line,
time=self.time,
logfile_path=self.logfile_path,
nastja_binary_path=self.nastja_binary_path,
config_path=self.config_path,
output_dir_path=self.output_dir_path,
).dump(str(out_path))
def make_cpu_ex(x: int, y: int, z: int) -> Experiment:
num_blocks = x * y * z
assert num_blocks % 48 == 0
num_nodes = num_blocks // 48
assert x % 4 == 0
assert y % 4 == 0
assert z % 3 == 0
return Experiment(
job_name=f"weak-cpu-{x:02}-{y:02}-{z:02}",
account="cellsinsilico",
partition="batch",
nastja_binary_path="/p/project/cellsinsilico/paulslustigebude/nastja/build-nocuda/nastja",
nodes=num_nodes,
tasks=num_blocks,
num_blocks=(x, y, z),
domain_scale=(x // 4, y // 4, z // 3),
)
def make_gpu_ex(x: int, y: int, z: int) -> Experiment:
num_blocks = x * y * z
gpus_per_node = num_blocks if num_blocks <= 4 else 4
num_nodes = 1 if num_blocks <= 4 else num_blocks // 4
return Experiment(
job_name=f"weak-gpu-{x:02}-{y:02}-{z:02}",
account="cellsinsilico",
partition="gpus",
extra_sbatch_line=f"#SBATCH --gres=gpu:{gpus_per_node}",
nastja_binary_path="/p/project/cellsinsilico/paulslustigebude/nastja/build-cuda/nastja",
nodes=num_nodes,
tasks=num_blocks,
num_blocks=(x, y, z),
domain_scale=(x, y, z),
)
def make_booster_ex(x: int, y: int, z: int) -> Experiment:
num_blocks = x * y * z
gpus_per_node = num_blocks if num_blocks <= 4 else 4
num_nodes = 1 if num_blocks <= 4 else num_blocks // 4
return Experiment(
job_name=f"weak-booster-{x:02}-{y:02}-{z:02}",
account="hkf6",
partition="booster",
extra_sbatch_line=f"#SBATCH --gres=gpu:{gpus_per_node}",
nastja_binary_path="/p/project/cellsinsilico/paulslustigebude/nastja/build-cuda/nastja",
nodes=num_nodes,
tasks=num_blocks,
num_blocks=(x, y, z),
domain_scale=(x, y, z),
)
experiments = [
make_cpu_ex(4, 4, 3),
make_cpu_ex(4, 4, 6),
make_cpu_ex(4, 4, 12),
make_cpu_ex(4, 8, 12),
make_cpu_ex(8, 8, 12),
make_cpu_ex(8, 8, 24),
make_cpu_ex(8, 16, 24),
make_cpu_ex(16, 16, 24),
make_cpu_ex(16, 16, 48),
make_gpu_ex(1, 1, 1),
make_gpu_ex(1, 1, 2),
make_gpu_ex(1, 2, 2),
make_gpu_ex(2, 2, 2),
make_gpu_ex(2, 2, 4),
make_gpu_ex(2, 4, 4),
make_gpu_ex(4, 4, 4),
make_gpu_ex(4, 4, 8),
make_booster_ex(1, 1, 1),
make_booster_ex(1, 1, 2),
make_booster_ex(1, 2, 2),
make_booster_ex(2, 2, 2),
make_booster_ex(2, 2, 4),
make_booster_ex(2, 4, 4),
make_booster_ex(4, 4, 4),
make_booster_ex(4, 4, 8),
]
if __name__ == "__main__":
outdir = Path(__file__).parent.parent / "generated"
for e in experiments:
print(f"Generating config for {e.job_name}", file=sys.stderr)
config_path = (outdir / "config" / e.job_name).with_suffix(".json")
with config_path.open("w", encoding="utf8") as f:
json.dump(e.get_config(), f, indent=2)
print(f"Generating batch file for {e.job_name}", file=sys.stderr)
e.write_batch_file(outdir / "batch" / e.job_name)
+24
View File
@@ -0,0 +1,24 @@
#!/usr/bin/env python
import argparse
import pandas
def show_seconds(s: float) -> str:
return f"{s:.2f}s"
if __name__ == '__main__':
p = argparse.ArgumentParser(description="Make a latex table from a timings tsv")
p.add_argument("timingfile")
p.add_argument("--weak", action="store_true")
args = p.parse_args()
df = pandas.read_csv(args.timingfile, sep="\t")
for i in range(len(df)):
if not args.weak:
print(f"{df['nodes'][i]} & {df['tasks'][i]} & {show_seconds(df['mean_time'][i])} & {show_seconds(df['std_time'][i])} & {df['speedup'][i]:.02f} & {df['speedup_error'][i]:.02f} \\\\")
else:
print(f"{df['nodes'][i]} & {df['tasks'][i]} & {show_seconds(df['mean_time'][i])} & {show_seconds(df['std_time'][i])} & {df['efficiency'][i]:.02f} & {df['efficiency_error'][i]:.02f} \\\\")
+21
View File
@@ -0,0 +1,21 @@
#!/usr/bin/env python
import jinja2
import json
import sys
from pathlib import Path
data = json.load(sys.stdin)
templates_env = jinja2.Environment(
loader=jinja2.FileSystemLoader(Path(__file__).parent.parent / "templates"),
autoescape=jinja2.select_autoescape()
)
for possibly_incomplete_batch in data["batches"]:
batch = dict(list(data["common"].items()) + list(possibly_incomplete_batch.items()))
out_path = Path(__file__).parent.parent / "generated" / "batch" / batch["name"]
t = templates_env.get_template(sys.argv[1])
print(f"Dumping to {out_path}")
t.stream(**batch).dump(str(out_path))
+61
View File
@@ -0,0 +1,61 @@
#!/usr/bin/env python
import argparse
import sys
import timing
ignore = ["TimeStep"]
if __name__ == "__main__":
p = argparse.ArgumentParser()
p.add_argument("jobs", nargs="+")
p.add_argument("--normalize", action="store_true")
p.add_argument("--extra-columns", nargs="*")
args = p.parse_args()
columns = [
"BC:cells",
"BC:dynamicecm",
"Sweep:Cells",
"Sweep:DynamicECM",
"Sweep:DynamicECMDampers",
] + (args.extra_columns or [])
dfs = dict()
labels = []
for label, jobid in [jobarg.split(":") for jobarg in args.jobs]:
jobs, excluded_array_indices = timing.get_jobs(jobid)
df = timing.load_array_mean_timings(jobid, excluded_array_indices).mean()
dfs[label] = df
labels.extend(df.index)
labels = set(labels)
print(",".join(["label"] + columns + ["Other"]))
values_by_label = dict()
for label, df in dfs.items():
values = {"Other": 0}
for c in df.index:
if c in ignore:
continue
elif c not in columns:
values["Other"] += df[c]
print(f"Others+= {c}={df[c]}", file=sys.stderr)
else:
values[c] = df[c]
values_by_label[label] = values
if args.normalize:
print("Normalizing data to 100%...", file=sys.stderr)
for values in values_by_label.values():
row_length = sum(values.values())
for c in values.keys():
values[c] *= 100 / row_length
for label, values in values_by_label.items():
print(label + "," + ",".join(f"{values[c]}" for c in columns + ["Other"]))
+116
View File
@@ -0,0 +1,116 @@
#!/usr/bin/env python
import argparse
import json
import pandas
import subprocess
import sys
from pathlib import Path
def load_timing_file(timing_path: Path):
df = pandas.read_csv(timing_path, delim_whitespace=True)
headers = list(df["#Name"][1:])
times = list(df["TotalTime"][1:])
return pandas.DataFrame([times], columns=headers)
def load_all_timings(outdir_path: Path):
timingdir_path = outdir_path / "timing"
timing_paths = sorted(timingdir_path.iterdir())
print(f"Loading {len(timing_paths)} timing files from {timingdir_path}...", file=sys.stderr)
dfs = []
for i, timing_path in enumerate(timing_paths, 1):
dfs.append(load_timing_file(timing_path))
sys.stderr.write("\x1b[1K\r")
sys.stderr.flush()
print(f"[{i:8}/{len(timing_paths):8}] {i/len(timing_paths)*100:6.2f}%", file=sys.stderr, end="", flush=True)
print(file=sys.stderr, flush=True)
return pandas.concat(dfs)
def load_mean_timings(outdir_path: Path):
df = load_all_timings(outdir_path)
return df.mean() / 1000000
def get_outdirs(jobid: str):
print(f"Globbing for {jobid}...", file=sys.stderr)
return sorted(Path("/p/scratch/cellsinsilico/paul/nastja-out").glob(f"*{jobid}*"))
def load_array_mean_timings(jobid: str, excluded_array_indices):
mts = []
for outdir_path in get_outdirs(jobid):
if any(str(outdir_path).endswith(str(i)) for i in excluded_array_indices):
print(f"Not loading timings for {outdir_path} because it was excluded.", file=sys.stderr)
continue
mts.append(load_mean_timings(outdir_path))
return pandas.DataFrame(list(mts), columns=mts[0].index)
def get_mean_mean_totaltimes(jobid: str):
return load_array_mean_timings(jobid).mean()
def get_std_mean_totaltimes(jobid: str):
return load_array_mean_timings(jobid).std()
def get_accounting_data(jobid: str):
sacct_results = subprocess.run(
["sacct", "--json", "--jobs", jobid],
check=True, # Throw on non-zero exit code,
capture_output=True
)
return json.loads(sacct_results.stdout.decode("utf8"))
def get_jobs(jobid: str):
accounting_data = get_accounting_data(jobid)
jobs = []
excluded_array_indices = []
for array_job in accounting_data["jobs"]:
# Get metadata related to array
array_main_job = array_job["array"]["job_id"]
array_index = array_job["array"]["task_id"]
# The last step is the actual job we want the data for
# The steps before set up cluster etc.
last_step = array_job["steps"][-1]
if last_step["state"] != "COMPLETED":
print(f"WARNING: {array_main_job}.{array_index} has state {last_step['state']}, excluding it from measurements", file=sys.stderr)
excluded_array_indices.append(array_index)
continue
jobs.append(last_step)
return jobs, excluded_array_indices
if __name__ == "__main__":
p = argparse.ArgumentParser(description="Load and analzye data from nastja timing files")
p.add_argument("jobid", nargs="+")
p.add_argument("--prettify", action="store_true")
p.add_argument("--dump-timings", action="store_true")
args = p.parse_args()
results = []
for i, jobid in enumerate(args.jobid, 1):
print(f"({i:2}/{len(args.jobid):2}) Loading accounting data for {jobid}", file=sys.stderr)
jobs, excluded_array_indices = get_jobs(jobid)
array_mean_timings = load_array_mean_timings(jobid, excluded_array_indices)
if args.dump_timings:
print(array_mean_timings, file=sys.stderr)
results.append({
"jobid": jobid,
"means": array_mean_timings.mean().to_dict(),
"stds": array_mean_timings.std().to_dict(),
"accounting": jobs
})
print(json.dumps(results, indent=2 if args.prettify else None))
+63
View File
@@ -0,0 +1,63 @@
{
"common": {
"account": "hkf6",
"partition": "booster",
"extra_sbatch_line": "#SBATCH --gres=gpu:4",
"logfile_path": "/p/project/cellsinsilico/paulslustigebude/ma/experiments/eval/logs/%x-%A.%a",
"nastja_binary_path": "/p/project/cellsinsilico/paulslustigebude/nastja/build-cuda/nastja",
"config_path": "/p/project/cellsinsilico/paulslustigebude/ma/experiments/eval/generated/config/${SLURM_JOB_NAME}.json",
"output_dir_path": "/p/scratch/cellsinsilico/paul/nastja-out/${SLURM_JOB_NAME}-${SLURM_ARRAY_JOB_ID}.${SLURM_ARRAY_TASK_ID}"
},
"batches": [
{
"name": "strong-booster-01-01-01",
"nodes": 1,
"tasks": 1,
"time": "00:15:00",
"extra_sbatch_line": "#SBATCH --gres=gpu:1"
},
{
"name": "strong-booster-01-01-02",
"nodes": 1,
"tasks": 2,
"time": "00:15:00",
"extra_sbatch_line": "#SBATCH --gres=gpu:2"
},
{
"name": "strong-booster-01-02-02",
"nodes": 1,
"tasks": 4,
"time": "00:15:00"
},
{
"name": "strong-booster-02-02-02",
"nodes": 2,
"tasks": 8,
"time": "00:15:00"
},
{
"name": "strong-booster-02-02-04",
"nodes": 4,
"tasks": 16,
"time": "00:15:00"
},
{
"name": "strong-booster-02-04-04",
"nodes": 8,
"tasks": 32,
"time": "00:15:00"
},
{
"name": "strong-booster-04-04-04",
"nodes": 16,
"tasks": 64,
"time": "00:15:00"
},
{
"name": "strong-booster-04-04-08",
"nodes": 32,
"tasks": 128,
"time": "00:15:00"
}
]
}
+67
View File
@@ -0,0 +1,67 @@
{
"common": {
"account": "cellsinsilico",
"partition": "batch",
"extra_sbatch_line": "",
"logfile_path": "/p/project/cellsinsilico/paulslustigebude/ma/experiments/eval/logs/%x-%A.%a",
"nastja_binary_path": "/p/project/cellsinsilico/paulslustigebude/nastja/build-nocuda/nastja",
"config_path": "/p/project/cellsinsilico/paulslustigebude/ma/experiments/eval/generated/config/${SLURM_JOB_NAME}.json",
"output_dir_path": "/p/scratch/cellsinsilico/paul/nastja-out/${SLURM_JOB_NAME}-${SLURM_ARRAY_JOB_ID}.${SLURM_ARRAY_TASK_ID}"
},
"batches": [
{
"name": "strong-cpu-04-04-03",
"nodes": 1,
"tasks": 48,
"time": "01:00:00"
},
{
"name": "strong-cpu-04-04-06",
"nodes": 2,
"tasks": 96,
"time": "01:00:00"
},
{
"name": "strong-cpu-04-04-12",
"nodes": 4,
"tasks": 192,
"time": "00:20:00"
},
{
"name": "strong-cpu-04-08-12",
"nodes": 8,
"tasks": 384,
"time": "00:10:00"
},
{
"name": "strong-cpu-08-08-12",
"nodes": 16,
"tasks": 768,
"time": "00:10:00"
},
{
"name": "strong-cpu-08-08-24",
"nodes": 32,
"tasks": 1536,
"time": "00:10:00"
},
{
"name": "strong-cpu-08-16-24",
"nodes": 64,
"tasks": 3072,
"time": "00:10:00"
},
{
"name": "strong-cpu-16-16-24",
"nodes": 128,
"tasks": 6144,
"time": "00:10:00"
},
{
"name": "strong-cpu-16-16-48",
"nodes": 256,
"tasks": 12288,
"time": "00:10:00"
}
]
}
+63
View File
@@ -0,0 +1,63 @@
{
"common": {
"account": "cellsinsilico",
"partition": "gpus",
"extra_sbatch_line": "#SBATCH --gres=gpu:4",
"logfile_path": "/p/project/cellsinsilico/paulslustigebude/ma/experiments/eval/logs/%x-%A.%a",
"nastja_binary_path": "/p/project/cellsinsilico/paulslustigebude/nastja/build-cuda/nastja",
"config_path": "/p/project/cellsinsilico/paulslustigebude/ma/experiments/eval/generated/config/${SLURM_JOB_NAME}.json",
"output_dir_path": "/p/scratch/cellsinsilico/paul/nastja-out/${SLURM_JOB_NAME}-${SLURM_ARRAY_JOB_ID}.${SLURM_ARRAY_TASK_ID}"
},
"batches": [
{
"name": "strong-gpu-01-01-01",
"nodes": 1,
"tasks": 1,
"time": "00:15:00",
"extra_sbatch_line": "#SBATCH --gres=gpu:1"
},
{
"name": "strong-gpu-01-01-02",
"nodes": 1,
"tasks": 2,
"time": "00:15:00",
"extra_sbatch_line": "#SBATCH --gres=gpu:2"
},
{
"name": "strong-gpu-01-02-02",
"nodes": 1,
"tasks": 4,
"time": "00:15:00"
},
{
"name": "strong-gpu-02-02-02",
"nodes": 2,
"tasks": 8,
"time": "00:15:00"
},
{
"name": "strong-gpu-02-02-04",
"nodes": 4,
"tasks": 16,
"time": "00:15:00"
},
{
"name": "strong-gpu-02-04-04",
"nodes": 8,
"tasks": 32,
"time": "00:15:00"
},
{
"name": "strong-gpu-04-04-04",
"nodes": 16,
"tasks": 64,
"time": "00:15:00"
},
{
"name": "strong-gpu-04-04-08",
"nodes": 32,
"tasks": 128,
"time": "00:15:00"
}
]
}
@@ -0,0 +1,31 @@
#!/usr/bin/env bash
#SBATCH --job-name={{ name }}
#SBATCH --account={{ account }}
#SBATCH --partition={{ partition }}
#SBATCH --nodes={{ nodes }}
#SBATCH --ntasks={{ tasks }}
# Counted per node
{{ extra_sbatch_line }}
#SBATCH --time={{ time }}
#SBATCH --output={{ logfile_path }}
#SBATCH --error={{ logfile_path }}
#SBATCH --array=1-5
NASTJA_BINARY="{{ nastja_binary_path }}"
CONFIG_FILE="{{ config_path }}"
OUTPUT_DIR="{{ output_dir_path }}"
module load Stages/2024 GCC/12.3.0 ParaStationMPI/5.9.2-1 CMake/3.26.3 mold/1.11.0 jq/1.6 git Python
echo "${NASTJA_BINARY_PATH}"
echo "${CONFIG_FILE}"
echo "${OUTPUT_DIR}"
cat "${CONFIG_FILE}"
mkdir -p "${OUTPUT_DIR}"
srun "${NASTJA_BINARY}" \
-c "${CONFIG_FILE}" \
-o "${OUTPUT_DIR}"
@@ -0,0 +1,263 @@
{
"Application": "Cells",
"CellsInSilico": {
"2D": false,
"adhesion": {
"matrix": [
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 450.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 450.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 50.0]
],
"polarityenabled": false
},
"centerofmass": {
"steps": 1
},
"cleaner": {
"killdistance": 0,
"steps": 100
},
"contactinhibition": {
"enabled": false
},
"division": {
"condition": [
"",
"",
"",
"",
"",
"",
"",
"",
"",
"( volume >= 0.9 * volume0 ) & ( rnd() <= 0.00001 ) & generation < 1"
],
"enabled": true,
"halveSignals": false
},
"dynamicecm": {
"alpha": 2.0,
"beta": 0.5,
"c": 4.0,
"deltat": 0.10000000149011612,
"ecmCellID": 0,
"enabled": true,
"eta": 0.25,
"k0": 0.10000000149011612,
"k1": 0.10000000149011612,
"lambda": 10.0,
"phi": 1.0,
"pushSteps": 10,
"pushWeight": 0.5,
"stepsPerMcs": 100
},
"ecmdegradation": {
"enabled": false
},
"energyfunctions": [
"Volume00",
"Surface01",
"Motility00",
"Adhesion01",
"DynamicECM00"
],
"liquid": 6,
"logcellproperties": {
"enabled": false
},
"orientation": {
"enabled": true,
"motility": "persistentRandomWalk",
"motilityamount": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"numRandomNumbers": 5,
"persistenceMagnitude": 0.0,
"persistentDecay": 0.8,
"recalculationtime": 200
},
"polarity": {
"enabled": false
},
"signaling": {
"constant": false,
"enabled": false
},
"surface": {
"default": {
"storage": "const",
"value": 400.0
},
"lambda": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
5.625,
5.625,
1.0
],
"sizechange": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
-0.05,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
},
"temperature": 50.0,
"visitor": {
"checkerboard": "01",
"stepwidth": 10
},
"volume": {
"default": {
"storage": "const",
"value": 500.0
},
"lambda": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
7.5,
7.5,
7.5
],
"sizechange": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
-0.05,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
}
},
"DefineFunctions": [
"r_angle()=360*rnd()",
"r_size()=400*rnd()"
],
"Filling": {
"cells": [
{
"box": [
[
0,
0,
0
],
[
384,
384,
384
]
],
"celltype": 0,
"component": 0,
"pattern": "const",
"seed": 0,
"shape": "cube",
"value": 0
},
{
"box": [
[117, 117, 177],
[267, 267, 267]
],
"celltype": 9,
"center": [192, 192, 192],
"component": 0,
"count": 5500,
"pattern": "voronoi",
"radius": 75,
"seed": 758960,
"shape": "sphere",
"value": 8
}
],
"initialoutput": false,
"randomseed": 758959
},
"Geometry": {
"blockcount": [
4,
4,
3
],
"blockdefault": "fill",
"blocksize": [
96,
96,
128
],
"blocktype": [
[
[
1
]
]
]
},
"Settings": {
"deltat": 1.0,
"deltax": 1.0,
"handleFPE": "signal",
"logger": {
"group": 0,
"steps": 100
},
"randomseed": 42,
"statusoutput": 1,
"timestepguard": 1,
"timesteps": 10,
"cuda": {
"subblocks": {
"blockDim": [8, 8, 8]
}
}
}
}
+258
View File
@@ -0,0 +1,258 @@
{
"Application": "Cells",
"CellsInSilico": {
"2D": false,
"adhesion": {
"matrix": [
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 450.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 450.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 50.0]
],
"polarityenabled": false
},
"centerofmass": {
"steps": 1
},
"cleaner": {
"killdistance": 0,
"steps": 100
},
"contactinhibition": {
"enabled": false
},
"division": {
"condition": [
"",
"",
"",
"",
"",
"",
"",
"",
"",
"( volume >= 0.9 * volume0 ) & ( rnd() <= 0.00001 ) & generation < 1"
],
"enabled": true,
"halveSignals": false
},
"dynamicecm": {
"alpha": 2.0,
"beta": 0.5,
"c": 4.0,
"deltat": 0.10000000149011612,
"ecmCellID": 0,
"enabled": true,
"eta": 0.25,
"k0": 0.10000000149011612,
"k1": 0.10000000149011612,
"lambda": 10.0,
"phi": 1.0,
"pushSteps": 10,
"pushWeight": 0.5,
"stepsPerMcs": 100
},
"ecmdegradation": {
"enabled": false
},
"energyfunctions": [
"Volume00",
"Surface01",
"Motility00",
"Adhesion01",
"DynamicECM00"
],
"liquid": 6,
"logcellproperties": {
"enabled": false
},
"orientation": {
"enabled": true,
"motility": "persistentRandomWalk",
"motilityamount": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"numRandomNumbers": 5,
"persistenceMagnitude": 0.0,
"persistentDecay": 0.8,
"recalculationtime": 200
},
"polarity": {
"enabled": false
},
"signaling": {
"constant": false,
"enabled": false
},
"surface": {
"default": {
"storage": "const",
"value": 400.0
},
"lambda": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
5.625,
5.625,
1.0
],
"sizechange": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
-0.05,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
},
"temperature": 50.0,
"visitor": {
"checkerboard": "01",
"stepwidth": 10
},
"volume": {
"default": {
"storage": "const",
"value": 500.0
},
"lambda": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
7.5,
7.5,
7.5
],
"sizechange": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
-0.05,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
}
},
"DefineFunctions": [
"r_angle()=360*rnd()",
"r_size()=400*rnd()"
],
"Filling": {
"cells": [
{
"box": [
[
0,
0,
0
],
[
384,
384,
384
]
],
"celltype": 0,
"component": 0,
"pattern": "const",
"seed": 0,
"shape": "cube",
"value": 0
},
{
"box": [
[117, 117, 177],
[267, 267, 267]
],
"celltype": 9,
"center": [192, 192, 192],
"component": 0,
"count": 5500,
"pattern": "voronoi",
"radius": 75,
"seed": 758960,
"shape": "sphere",
"value": 8
}
],
"initialoutput": false,
"randomseed": 758959
},
"Geometry": {
"blockcount": [
4,
4,
3
],
"blockdefault": "fill",
"blocksize": [
96,
96,
128
],
"blocktype": [
[
[
1
]
]
]
},
"Settings": {
"deltat": 1.0,
"deltax": 1.0,
"handleFPE": "signal",
"logger": {
"group": 0,
"steps": 100
},
"randomseed": 42,
"statusoutput": 1,
"timestepguard": 1,
"timesteps": 10
}
}
+263
View File
@@ -0,0 +1,263 @@
{
"Application": "Cells",
"CellsInSilico": {
"2D": false,
"adhesion": {
"matrix": [
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 450.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 450.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 50.0]
],
"polarityenabled": false
},
"centerofmass": {
"steps": 1
},
"cleaner": {
"killdistance": 0,
"steps": 100
},
"contactinhibition": {
"enabled": false
},
"division": {
"condition": [
"",
"",
"",
"",
"",
"",
"",
"",
"",
"( volume >= 0.9 * volume0 ) & ( rnd() <= 0.00001 ) & generation < 1"
],
"enabled": true,
"halveSignals": false
},
"dynamicecm": {
"alpha": 2.0,
"beta": 0.5,
"c": 4.0,
"deltat": 0.10000000149011612,
"ecmCellID": 0,
"enabled": true,
"eta": 0.25,
"k0": 0.10000000149011612,
"k1": 0.10000000149011612,
"lambda": 10.0,
"phi": 1.0,
"pushSteps": 10,
"pushWeight": 0.5,
"stepsPerMcs": 100
},
"ecmdegradation": {
"enabled": false
},
"energyfunctions": [
"Volume00",
"Surface01",
"Motility00",
"Adhesion01",
"DynamicECM00"
],
"liquid": 6,
"logcellproperties": {
"enabled": false
},
"orientation": {
"enabled": true,
"motility": "persistentRandomWalk",
"motilityamount": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"numRandomNumbers": 5,
"persistenceMagnitude": 0.0,
"persistentDecay": 0.8,
"recalculationtime": 200
},
"polarity": {
"enabled": false
},
"signaling": {
"constant": false,
"enabled": false
},
"surface": {
"default": {
"storage": "const",
"value": 400.0
},
"lambda": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
5.625,
5.625,
1.0
],
"sizechange": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
-0.05,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
},
"temperature": 50.0,
"visitor": {
"checkerboard": "01",
"stepwidth": 10
},
"volume": {
"default": {
"storage": "const",
"value": 500.0
},
"lambda": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
7.5,
7.5,
7.5
],
"sizechange": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
-0.05,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
}
},
"DefineFunctions": [
"r_angle()=360*rnd()",
"r_size()=400*rnd()"
],
"Filling": {
"cells": [
{
"box": [
[
0,
0,
0
],
[
384,
384,
384
]
],
"celltype": 0,
"component": 0,
"pattern": "const",
"seed": 0,
"shape": "cube",
"value": 0
},
{
"box": [
[117, 117, 177],
[267, 267, 267]
],
"celltype": 9,
"center": [192, 192, 192],
"component": 0,
"count": 5500,
"pattern": "voronoi",
"radius": 75,
"seed": 758960,
"shape": "sphere",
"value": 8
}
],
"initialoutput": false,
"randomseed": 758959
},
"Geometry": {
"blockcount": [
4,
4,
3
],
"blockdefault": "fill",
"blocksize": [
96,
96,
128
],
"blocktype": [
[
[
1
]
]
]
},
"Settings": {
"deltat": 1.0,
"deltax": 1.0,
"handleFPE": "signal",
"logger": {
"group": 0,
"steps": 100
},
"randomseed": 42,
"statusoutput": 1,
"timestepguard": 1,
"timesteps": 10,
"cuda": {
"subblocks": {
"blockDim": [8, 8, 8]
}
}
}
}
+193
View File
@@ -0,0 +1,193 @@
{
"Application": "Cells",
"CellsInSilico": {
"2D": false,
"adhesion": {
"matrix": [
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 450.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[0.0, 450.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 50.0]
],
"polarityenabled": false
},
"centerofmass": {
"steps": 1
},
"cleaner": {
"killdistance": 0,
"steps": 100
},
"contactinhibition": {
"enabled": false
},
"division": {
"condition": [
"",
"",
"",
"",
"",
"",
"",
"",
"",
"( volume >= 0.9 * volume0 ) & ( rnd() <= 0.00001 ) & generation < 1"
],
"enabled": true,
"halveSignals": false
},
"dynamicecm": {
"alpha": 2.0,
"beta": 0.5,
"c": 4.0,
"deltat": 0.1,
"ecmCellID": 0,
"enabled": true,
"eta": 0.25,
"k0": 0.1,
"k1": 0.1,
"lambda": 10.0,
"phi": 1.0,
"pushSteps": 10,
"pushWeight": 0.5,
"stepsPerMcs": 100
},
"ecmdegradation": {
"enabled": false
},
"energyfunctions": [
"Volume00",
"Surface01",
"Motility00",
"Adhesion01",
"DynamicECM00"
],
"liquid": 6,
"logcellproperties": {
"enabled": false
},
"orientation": {
"enabled": true,
"motility": "persistentRandomWalk",
"motilityamount": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"numRandomNumbers": 5,
"persistenceMagnitude": 0.0,
"persistentDecay": 0.8,
"recalculationtime": 200
},
"polarity": {
"enabled": false
},
"signaling": {
"constant": false,
"enabled": false
},
"surface": {
"default": {
"storage": "const",
"value": 400.0
},
"lambda": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
5.625,
5.625,
1.0
],
"sizechange": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
-0.05,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
},
"temperature": 50.0,
"visitor": {
"checkerboard": "01",
"stepwidth": 10
},
"volume": {
"default": {
"storage": "const",
"value": 500.0
},
"lambda": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
7.5,
7.5,
7.5
],
"sizechange": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
-0.05,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
}
},
"DefineFunctions": [
"r_angle()=360*rnd()",
"r_size()=400*rnd()"
],
"Filling": {
"initialoutput": false,
"randomseed": 758959
},
"Settings": {
"randomseed": 42,
"statusoutput": 1,
"timesteps": 10
}
}
View File
+1 -98
View File
@@ -1,98 +1 @@
anyio==3.7.0
argon2-cffi==21.3.0
argon2-cffi-bindings==21.2.0
arrow==1.2.3
asttokens==2.2.1
async-lru==2.0.2
attrs==23.1.0
Babel==2.12.1
backcall==0.2.0
beautifulsoup4==4.12.2
bleach==6.0.0
certifi==2023.5.7
cffi==1.15.1
charset-normalizer==3.1.0
comm==0.1.3
contourpy==1.1.0
cycler==0.11.0
debugpy==1.6.7
decorator==5.1.1
defusedxml==0.7.1
exceptiongroup==1.1.1
executing==1.2.0
fastjsonschema==2.17.1
fonttools==4.40.0
fqdn==1.5.1
idna==3.4
ipykernel==6.23.2
ipython==8.14.0
ipywidgets==8.0.6
isoduration==20.11.0
jedi==0.18.2
Jinja2==3.1.2
json5==0.9.14
jsonpointer==2.3
jsonschema==4.17.3
jupyter-events==0.6.3
jupyter-lsp==2.2.0
jupyter_client==8.2.0
jupyter_core==5.3.1
jupyter_server==2.6.0
jupyter_server_terminals==0.4.4
jupyterlab==4.0.2
jupyterlab-pygments==0.2.2
jupyterlab-widgets==3.0.7
jupyterlab_server==2.23.0
kiwisolver==1.4.4
MarkupSafe==2.1.3
matplotlib==3.7.1
matplotlib-inline==0.1.6
mistune==2.0.5
nbclient==0.8.0
nbconvert==7.5.0
nbformat==5.9.0
nest-asyncio==1.5.6
notebook_shim==0.2.3
numpy==1.24.3
overrides==7.3.1
packaging==23.1
pandocfilters==1.5.0
parso==0.8.3
pexpect==4.8.0
pickleshare==0.7.5
Pillow==9.5.0
platformdirs==3.5.3
prometheus-client==0.17.0
prompt-toolkit==3.0.38
psutil==5.9.5
ptyprocess==0.7.0
pure-eval==0.2.2
pycparser==2.21
Pygments==2.15.1
pyparsing==3.0.9
pyrsistent==0.19.3
python-dateutil==2.8.2
python-json-logger==2.0.7
PyYAML==6.0
pyzmq==25.1.0
requests==2.31.0
rfc3339-validator==0.1.4
rfc3986-validator==0.1.1
Send2Trash==1.8.2
six==1.16.0
sniffio==1.3.0
soupsieve==2.4.1
stack-data==0.6.2
terminado==0.17.1
tinycss2==1.2.1
tomli==2.0.1
tornado==6.3.2
traitlets==5.9.0
typing_extensions==4.6.3
uri-template==1.2.0
urllib3==2.0.3
wcwidth==0.2.6
webcolors==1.13
webencodings==0.5.1
websocket-client==1.5.3
widgetsnbextension==4.0.7
click==8.1.7
+96
View File
@@ -0,0 +1,96 @@
import copy
import json
from typing import Tuple
from toolkit import Configuration
SIZE_X = 400
SIZE_Y = 400
SIZE_Z = 400
def make_config(gpus: int, blockcount: Tuple[int, int, int]) -> Configuration:
assert gpus % 4 == 0
assert SIZE_X % blockcount[0] == 0
assert SIZE_Y % blockcount[1] == 0
assert SIZE_Z % blockcount[2] == 0
assert blockcount[0] * blockcount[1] * blockcount[2] == gpus
return Configuration(
gpus // 4,
gpus,
4,
blockcount,
(SIZE_X // blockcount[0], SIZE_Y // blockcount[1], SIZE_Z // blockcount[2])
)
configurations = [
Configuration(1, 1, 1, (1, 1, 1), (400, 400, 400)),
Configuration(1, 2, 2, (1, 1, 2), (400, 400, 200)),
Configuration(1, 2, 2, (1, 2, 1), (400, 200, 400)),
Configuration(1, 2, 2, (2, 1, 1), (200, 400, 400)),
make_config(4, (1, 1, 4)),
make_config(4, (1, 4, 1)),
make_config(4, (4, 1, 1)),
make_config(4, (1, 2, 2)),
make_config(4, (2, 1, 2)),
make_config(4, (2, 2, 1)),
make_config(8, (2, 2, 2)),
make_config(8, (1, 2, 4)),
make_config(16, (1, 4, 4)),
make_config(16, (2, 2, 4)),
make_config(32, (2, 4, 4)),
make_config(64, (4, 4, 4)),
make_config(128, (4, 4, 8)),
make_config(256, (4, 8, 8)),
make_config(512, (8, 8, 8)),
make_config(1024, (8, 8, 16)),
make_config(2048, (8, 16, 16))
]
with open("templates/spheroid.json") as template_file:
template = json.load(template_file)
for c in configurations:
print(c)
assert(c.get_domain_size() == configurations[0].get_domain_size())
nastja_config = copy.deepcopy(template)
nastja_config["Geometry"]["blockcount"] = c.blockcount
nastja_config["Geometry"]["blocksize"] = c.blocksize
label = c.get_label()
with open(f"configs/measurements/strong/spheroid_{label}.json", "w") as config_file:
json.dump(nastja_config, config_file, indent=2)
batch_config = f"""#!/usr/bin/env bash
#SBATCH --job-name=strong-{label}
#SBATCH --account=hkf6
#SBATCH --partition=booster
#SBATCH --nodes={c.nodes}
#SBATCH --ntasks={c.tasks}
# Counted per node
#SBATCH --gres=gpu:{c.gpus_per_node}
#SBATCH --time=00:30:00
#SBATCH --output=logs/strong-{label}-%A_%a.log
#SBATCH --error=logs/strong-{label}-%A_%a.log
#SBATCH --array=1-5
SOURCE_DIR=/p/project/cellsinsilico/paulslustigebude
OUTPUT_DIR="/p/scratch/cellsinsilico/paul/nastja-out/strong-{label}-${{SLURM_ARRAY_TASK_ID}}"
echo "outdir is ${{OUTPUT_DIR}}"
mkdir -p "${{OUTPUT_DIR}}"
source "${{SOURCE_DIR}}/activate-nastja-modules"
srun --unbuffered "${{SOURCE_DIR}}/nastja/build-cuda/nastja" \\
-c "${{SOURCE_DIR}}/ma/experiments/configs/measurements/strong/spheroid_{label}.json" \\
-o "${{OUTPUT_DIR}}"
"""
with open(f"batch/measurements/strong/strong-{label}", "w", encoding="utf8") as batch_config_file:
batch_config_file.write(batch_config)
+16
View File
@@ -0,0 +1,16 @@
from dataclasses import dataclass
from typing import Tuple
@dataclass
class Configuration:
nodes: int
tasks: int
gpus_per_node: int
blockcount: Tuple[int, int, int]
blocksize: Tuple[int, int, int]
def get_domain_size(self) -> int:
return self.blockcount[0] * self.blocksize[0] * self.blockcount[1] * self.blocksize[1] * self.blockcount[2] * self.blocksize[2]
def get_label(self) -> str:
return f"t{self.tasks:04}n{self.nodes:03}g{self.gpus_per_node}x{self.blockcount[0]}y{self.blockcount[1]}z{self.blockcount[2]}"
@@ -0,0 +1,54 @@
#!/usr/bin/env python
import json
import sys
from functools import reduce
from operator import mul
from pathlib import Path
percent_filled = float(sys.argv[1])
template_path = Path("templates/varied-fillings.json")
initial_cell_size = 4200
with template_path.open(encoding="utf-8") as template_file:
config = json.load(template_file)
dims = [
size * count
for size, count
in zip(config["Geometry"]["blocksize"], config["Geometry"]["blockcount"])
]
total_volume = reduce(mul, dims, 1)
target_volume = total_volume * percent_filled / 100
n_cells = int(target_volume // initial_cell_size)
# If n_cells is odd, second type gets one more cell
n_cells_first_type = n_cells // 2
n_cells_second_type = n_cells - n_cells_first_type
edge_length = int(target_volume ** (1 / 3))
offsets = [
(dims[0] - edge_length) // 2,
(dims[1] - edge_length) // 2,
(dims[2] - edge_length) // 2
]
print(f"Target volume: {target_volume} ({percent_filled}%, edge length: {edge_length}), # of cells: {n_cells}", file=sys.stderr)
if target_volume > 0:
config["Filling"]["cells"].append({
"shape": "cube",
"pattern": "voronoi",
"box": [
offsets,
[
min(offsets[0] + edge_length, dims[0] - 1),
min(offsets[1] + edge_length, dims[1] - 1),
min(offsets[2] + edge_length, dims[2] - 1)
]
],
"count": n_cells,
"celltype": [0, 0, n_cells_first_type, n_cells_second_type]
})
json.dump(config, sys.stdout, indent=2)
+107
View File
@@ -0,0 +1,107 @@
import copy
import json
from dataclasses import dataclass
configurations = [
(1, 1, 1),
(1, 1, 2),
(1, 2, 2),
(2, 2, 2),
(2, 2, 4),
(2, 4, 4),
(4, 4, 4),
(4, 4, 8),
(4, 8, 8),
(8, 8, 8)
]
with open("templates/spheroid_weak.json") as template_file:
template = json.load(template_file)
SIZE_X = 400
SIZE_Y = 400
SIZE_Z = 400
for bx, by, bz in configurations:
nastja_config = copy.deepcopy(template)
nastja_config["Geometry"]["blockcount"] = [bx, by, bz]
nastja_config["Geometry"]["blocksize"] = [SIZE_X, SIZE_Y, SIZE_Z]
# Fill the whole domain with ECM
cells_filling = [
{
"shape": "cube",
"box": [
[0, 0, 0],
[bx * SIZE_X, by * SIZE_Y, bz * SIZE_Z]
],
"value": 0,
"celltype": 0
}
]
# Place a bunch of cells in each block to keep each rank busy
for z in range(bz):
for y in range(by):
for x in range(bx):
sx = x * SIZE_X
sy = y * SIZE_Y
sz = z * SIZE_Z
cells_filling.append({
"shape": "sphere",
"pattern": "voronoi",
"count": 5500,
"radius": 75,
"center": [sx + 200, sy + 200, sz + 200],
"box": [
[sx + 110, sy + 110, sz + 110],
[sx + 290, sy + 290, sz + 290]
],
"celltype": 9
})
nastja_config["Filling"]["cells"] = cells_filling
ntasks = bx * by * bz
if ntasks < 4:
nodes = 1
gpus_per_node = ntasks
else:
assert ntasks % 4 == 0
nodes = ntasks // 4
gpus_per_node = 4
label = f"weak400-t{ntasks:04}n{nodes:03}g{gpus_per_node}x{bx}y{by}z{bz}"
with open(f"configs/measurements/weak/spheroid_{label}.json", "w") as config_file:
json.dump(nastja_config, config_file, indent=2)
batch_config = f"""#!/usr/bin/env bash
#SBATCH --job-name={label}
#SBATCH --account=hkf6
#SBATCH --partition=booster
#SBATCH --nodes={nodes}
#SBATCH --ntasks={ntasks}
# Counted per node
#SBATCH --gres=gpu:{gpus_per_node}
#SBATCH --time=00:15:00
#SBATCH --output=logs/{label}-%A_%a.log
#SBATCH --error=logs/{label}-%A_%a.log
#SBATCH --array=1-5
SOURCE_DIR=/p/project/cellsinsilico/paulslustigebude
OUTPUT_DIR="/p/scratch/cellsinsilico/paul/nastja-out/{label}-${{SLURM_ARRAY_TASK_ID}}"
echo "outdir is ${{OUTPUT_DIR}}"
mkdir -p "${{OUTPUT_DIR}}"
source "${{SOURCE_DIR}}/activate-nastja-modules"
srun --unbuffered "${{SOURCE_DIR}}/nastja/build-cuda/nastja" \\
-c "${{SOURCE_DIR}}/ma/experiments/configs/measurements/weak/spheroid_{label}.json" \\
-o "${{OUTPUT_DIR}}"
"""
with open(f"batch/measurements/weak/{label}", "w", encoding="utf8") as batch_config_file:
batch_config_file.write(batch_config)
+146
View File
@@ -0,0 +1,146 @@
import click
import csv
import re
import sqlite3
from dataclasses import dataclass
from pathlib import Path
from typing import Tuple
@dataclass
class TimingData:
tasks: int
nodes: int
gpus_per_node: int
blockcount: Tuple[int, int, int]
array_index: int
# Given in seconds
timings_by_task: [float]
RUN_PATTERN = re.compile(r".*t([0-9]+)n([0-9]+)g([0-9]+)x([0-9]+)y([0-9]+)z([0-9]+)-([0-9]+)")
TIMING_PATTERN = re.compile(r"timing-([0-9]+)\.dat")
TIMING_ROW_PATTERN = re.compile(r"([^ ]+) +([^ ]+) +([^ ]+) +([^ ]+) +([^ ]+).*")
def get_timing(timing_path: Path, action: str) -> float:
with timing_path.open(encoding="utf8") as timing_file:
for line in timing_file:
m = TIMING_ROW_PATTERN.match(line)
if not m:
continue
if m.group(1) == action:
return float(m.group(5))
raise f"Could not find action '{action}' in {timing_path}"
def get_timings(d: Path, action: str) -> [float]:
timings = []
for timing_path in d.iterdir():
i = int(TIMING_PATTERN.match(timing_path.name).group(1))
timings.append((i, get_timing(timing_path, action) / 1_000_000))
return [timing for i, timing in sorted(timings, key=lambda t: t[0])]
def get_outdir_timing_data(d: Path, action: str) -> TimingData:
match_results = RUN_PATTERN.match(d.name)
tasks = int(match_results.group(1))
nodes = int(match_results.group(2))
gpus_per_node = int(match_results.group(3))
blockcount = (
int(match_results.group(4)),
int(match_results.group(5)),
int(match_results.group(6))
)
array_index = int(match_results.group(7))
timings_by_task = get_timings(d / "timing", action)
return TimingData(
tasks,
nodes,
gpus_per_node,
blockcount,
array_index,
timings_by_task
)
@click.group()
def timing():
pass
@timing.command()
@click.argument(
"directories",
type=click.Path(exists=True, file_okay=False, path_type=Path),
nargs=-1
)
@click.option("--db", default="timings.db", help="Path of sqlite database file")
def make_timing_db(directories, db):
"""
Collect NAStJA timing data from all passed directories and save them into a SQLite database.
Drops the timings table from the given database and creates a new timings table.
@param db asjdas
"""
db = sqlite3.connect(db)
c = db.cursor()
c.execute("drop table if exists timings")
c.execute("create table timings (tasks, blockcount_x, blockcount_y, blockcount_z, array_index, averagetime)")
print("Collecting timing info...")
for d in directories:
print(d)
t = get_outdir_timing_data(d, "Sweep:DynamicECM")
c.executemany(
"insert into timings values (?, ?, ?, ?, ?, ?)",
[
(t.tasks, t.blockcount[0], t.blockcount[1], t.blockcount[2], t.array_index, sum(t.timings_by_task) / len(t.timings_by_task))
]
)
print("Done, committing into DB...")
db.commit()
print("Done!")
@timing.command()
@click.option("--db", default="timings.db", help="Path of sqlite database file")
@click.option("--time/--no-time", default=False, help="Print average time of best run instead of speedup")
def strong_dat(db, time):
db = sqlite3.connect(db)
c = db.cursor()
res = c.execute("""
select tasks, min(avg)
from (
select tasks, blockcount_x, blockcount_y, blockcount_z, sum(averagetime) / count(*) as avg
from timings group by tasks, blockcount_x, blockcount_y, blockcount_z
) group by tasks order by tasks asc;
""")
values = res.fetchall()
if not time:
print("gpus\tspeedup")
for tasks, time in values:
print(f"{tasks}\t{values[0][1] / time}")
else:
print("gpus\ttime")
for tasks, time in values:
print(f"{tasks}\t{time}")
@timing.command()
@click.option("--db", default="timings.db", help="Path of sqlite database file")
def weak_dat(db):
db = sqlite3.connect(db)
c = db.cursor()
res = c.execute("""
select tasks, avg(averagetime) as mean from timings group by tasks order by tasks asc
""")
values = res.fetchall()
print("gpus\tefficiency")
for tasks, mean in values:
print(f"{tasks}\t{values[0][1] / mean}")
if __name__ == "__main__":
timing()
+117
View File
@@ -0,0 +1,117 @@
{
"Comments": ["Celltype Usage", "0 Dynamic ECM", "1-5 Not Used", "6 Liquid ", "7 Apoptotic cell Type ", "8 Basic Non Dividing Cell type (surrounding)", "9 Cancer"],
"Application": "Cells",
"CellsInSilico": {
"ecmdegradation": {
"enabled": "false",
"steps": 99999,
"stochastic": "true",
"probability": 0.5
},
"energyfunctions": ["Volume00", "Surface01", "Motility00", "Adhesion01", "DynamicECM00"],
"liquid": 6,
"volume": {
"default": {
"storage": "const",
"value": 500
},
"lambda": [0, 0, 0, 0, 0, 0, 0, 7.5, 7.5, 7.5],
"sizechange": [0, 0, 0, 0, 0, 0, 0, -0.05, 0, 0, 0, 0, 0, 0, 0]
},
"surface": {
"default": {
"storage": "const",
"value": 400
},
"lambda": [0, 0, 0, 0, 0, 0, 0, 5.625, 5.625, 1],
"sizechange": [0, 0, 0, 0, 0, 0, 0, -0.05, 0, 0, 0, 0, 0, 0, 0, 0]
},
"adhesion": {
"matrix": [
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 450],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 450, 0, 0, 0, 0, 0, 0, 0, 50]
]
},
"temperature": 50,
"division": {
"enabled": "true",
"condition": ["", "", "", "", "", "", "", "", "", "( volume >= 0.9 * volume0 ) & ( rnd() <= 0.00001 ) & generation < 1"]
},
"centerofmass": {
"steps": 1
},
"signaling": {
"enabled": false
},
"orientation": {
"enabled": true,
"motility": "persistentRandomWalk",
"persistenceMagnitude": 0.0,
"recalculationtime": 200,
"motilityamount": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
},
"visitor": {
"stepwidth": 10,
"checkerboard": "01"
},
"cleaner": {
"killDistance": 20
},
"dynamicecm": {
"enabled": true,
"stepsPerMcs": 100,
"pushSteps": 10,
"pushWeight": 2,
"ecmCellID": 0,
"deltat": 0.1,
"eta": 0.25,
"k0": 0.1,
"k1": 0.1,
"c": 4,
"alpha": 2,
"d": 0.3,
"phi": 1
}
},
"Geometry": {
"blockcount": null,
"blocksize": null
},
"Settings": {
"randomseed": 0,
"timesteps": 20,
"statusoutput": 1
},
"WriteActions": [],
"Writers": {
"CellInfo": {
"field": "",
"groupsize": 0,
"steps": 1,
"writer": "CellInfo"
},
"ParallelVTK_Cells": {
"field": "cells",
"outputtype": "UInt32",
"printhints": false,
"steps": 100,
"writer": "ParallelVtkImage"
},
"ParallelVTK_Displacement": {
"writer": "ParallelVtkImage",
"outputtype": "Float32",
"field": "dynamicecm",
"components": [0, 1, 2],
"steps": 100
}
},
"Include": "config_filling_1.json"
}
+100
View File
@@ -0,0 +1,100 @@
{
"Comments": ["Celltype Usage", "0 Dynamic ECM", "1-5 Not Used", "6 Liquid ", "7 Apoptotic cell Type ", "8 Basic Non Dividing Cell type (surrounding)", "9 Cancer"],
"Application": "Cells",
"CellsInSilico": {
"ecmdegradation": {
"enabled": "false",
"steps": 99999,
"stochastic": "true",
"probability": 0.5
},
"energyfunctions": ["Volume00", "Surface01", "Motility00", "Adhesion01", "DynamicECM00"],
"liquid": 6,
"volume": {
"default": {
"storage": "const",
"value": 500
},
"lambda": [0, 0, 0, 0, 0, 0, 0, 7.5, 7.5, 7.5],
"sizechange": [0, 0, 0, 0, 0, 0, 0, -0.05, 0, 0, 0, 0, 0, 0, 0]
},
"surface": {
"default": {
"storage": "const",
"value": 400
},
"lambda": [0, 0, 0, 0, 0, 0, 0, 5.625, 5.625, 1],
"sizechange": [0, 0, 0, 0, 0, 0, 0, -0.05, 0, 0, 0, 0, 0, 0, 0, 0]
},
"adhesion": {
"matrix": [
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 450],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 450, 0, 0, 0, 0, 0, 0, 0, 50]
]
},
"temperature": 50,
"division": {
"enabled": "true",
"condition": ["", "", "", "", "", "", "", "", "", "( volume >= 0.9 * volume0 ) & ( rnd() <= 0.00001 ) & generation < 1"]
},
"centerofmass": {
"steps": 1
},
"signaling": {
"enabled": false
},
"orientation": {
"enabled": true,
"motility": "persistentRandomWalk",
"persistenceMagnitude": 0.0,
"recalculationtime": 200,
"motilityamount": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
},
"visitor": {
"stepwidth": 10,
"checkerboard": "01"
},
"cleaner": {
"killDistance": 20
},
"dynamicecm": {
"enabled": true,
"stepsPerMcs": 100,
"pushSteps": 10,
"pushWeight": 2,
"ecmCellID": 0,
"deltat": 0.1,
"eta": 0.25,
"k0": 0.1,
"k1": 0.1,
"c": 4,
"alpha": 2,
"d": 0.3,
"phi": 1
}
},
"Geometry": {
"blockcount": null,
"blocksize": null
},
"Settings": {
"randomseed": 0,
"timesteps": 20,
"statusoutput": 1
},
"DefineFunctions": [
"r_angle()=360*rnd()",
"r_size()=400*rnd()"
],
"Filling": {
"cells": null
}
}
+103
View File
@@ -0,0 +1,103 @@
{
"#Testing": {
"description": "Cellular Potts Model with dynamic ECM"
},
"Application": "Cells",
"Geometry": {
"blocksize": [30, 30, 40],
"blockcount": [4, 4, 3]
},
"Settings": {
"timesteps": 750,
"randomseed": 42
},
"Filling": {
"cells": [
{
"_comment": "This is for the dynamic ECM",
"shape": "cube",
"box": [
[0, 0, 0],
[119, 119, 119]
],
"value": 0,
"celltype": 0
}
]
},
"CellsInSilico": {
"liquid": 1,
"adhesion": {
"matrix": [
[ 0, 0, 10, 10],
[ 0, 0, 0, 0],
[10, 0, 40, 5],
[10, 0, 5, 40]
]
},
"temperature": 15,
"volume": {
"default": {
"storage": "const",
"value": 6000
},
"lambda": {
"storage": "const",
"value": 10
}
},
"surface": {
"default": {
"storage": "const",
"value": 1000
},
"lambda": {
"storage": "const",
"value": 10
}
},
"cleaner": {
"killdistance": 100
},
"checkerboard": "00",
"energyfunctions": ["Volume00", "Surface00", "Adhesion00", "DynamicECM00"],
"centerofmass": {
"steps": 10
},
"dynamicecm": {
"enabled": true,
"stepsPerMcs": 200,
"pushSteps": 10,
"pushWeight": 2,
"ecmCellID": 0,
"deltat": 0.1,
"eta": 0.25,
"k0": 0.1,
"k1": 0.1,
"c": 4,
"alpha": 2,
"d": 0.3,
"phi": 1
}
},
"Writers": {
"ParallelVTK_Cells": {
"writer": "ParallelVtkImage",
"outputtype": "UInt32",
"field": "cells",
"steps": 10
},
"ParallelVTK_Displacement": {
"writer": "ParallelVtkImage",
"outputtype": "Float32",
"field": "dynamicecm",
"components": [0, 1, 2],
"steps": 10
},
"CellInfo": {
"writer": "CellInfo",
"steps": 10
}
},
"WriteActions": ["ParallelVTK_Cells", "ParallelVTK_Displacement", "CellInfo"]
}