Compare commits

..
27 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
75 changed files with 3963 additions and 117 deletions
+2
View File
@@ -1,2 +1,4 @@
*.swp
outdir
venv
dump
+8
View File
@@ -1,2 +1,10 @@
venv
.ipynb_checkpoints
logs
__pycache__
generated/*
batch/measurements/strong/*
configs/measurements/strong/*
*.dat
*.db
eval/generated/*
+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
Binary file not shown.
+3 -3
View File
@@ -5,11 +5,11 @@
#SBATCH --account=hkf6
#SBATCH --partition=develbooster
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=48
#SBATCH --time=01:00:00
#SBATCH --output=build-cuda-%j.out
#SBATCH --error=build-cuda-%j.err
#SBATCH --output=logs/build-cuda-%j.log
#SBATCH --error=logs/build-cuda-%j.log
SOURCE_DIR=/p/project/cellsinsilico/paulslustigebude
+3 -3
View File
@@ -5,11 +5,11 @@
#SBATCH --account=hkf6
#SBATCH --partition=develbooster
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=48
#SBATCH --time=01:00:00
#SBATCH --output=build-nocuda-%j.out
#SBATCH --error=build-nocuda-%j.err
#SBATCH --output=logs/build-nocuda-%j.log
#SBATCH --error=logs/build-nocuda-%j.log
SOURCE_DIR=/p/project/cellsinsilico/paulslustigebude
+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
+4 -4
View File
@@ -9,11 +9,11 @@
#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 --ntasks=16
#SBATCH --cpus-per-task=1
#SBATCH --time=01:00:00
#SBATCH --output=nocuda-%j.out
#SBATCH --error=nocuda-%j.err
#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
@@ -21,6 +21,6 @@ OUTPUT_DIR=/p/scratch/cellsinsilico/paul/nastja-out/nocuda
mkdir -p "${OUTPUT_DIR}"
source "${SOURCE_DIR}/activate-nastja-modules"
srun "${SOURCE_DIR}/nastja/build-nocuda/nastja" \
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}"
+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"]
}
+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"]
}
+4 -4
View File
@@ -4,11 +4,11 @@
},
"Application": "Cells",
"Geometry": {
"blocksize": [20, 20, 20],
"blockcount": [2, 1, 1]
"blocksize": [40, 20, 20],
"blockcount": [1, 1, 1]
},
"Settings": {
"timesteps": 500,
"timesteps": 200,
"randomseed": 42
},
"Filling": {
@@ -76,7 +76,7 @@
},
"dynamicecm": {
"enabled": true,
"stepsPerMcs": 100,
"stepsPerMcs": 10,
"pushSteps": 10,
"pushWeight": 2,
"ecmCellID": 0,
+27 -5
View File
@@ -1,21 +1,40 @@
{
"#Testing": {
"description": "Cellular Potts Model with dynamic ECM"
"description": "Minimal config for debugging CUDA code"
},
"Application": "Cells",
"Geometry": {
"blocksize": [15, 15, 15],
"blocksize": [5, 5, 5],
"blockcount": [1, 1, 1]
},
"Settings": {
"timesteps": 100,
"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],
@@ -53,12 +72,15 @@
"killdistance": 100
},
"checkerboard": "00",
"energyfunctions": ["Volume00", "Surface00", "Adhesion00", "Potential00"],
"energyfunctions": ["Volume00", "Surface00", "Adhesion00", "Potential00", "DynamicECM00"],
"centerofmass": {
"steps": 10
},
"dynamicecm": {
"enabled": true,
"ecmCellID": 0,
"stepsPerMcs": 1,
"pushSteps": 1,
"deltat": 0.1,
"eta": 0.5
}
@@ -67,7 +89,7 @@
"ParallelVTK_Displacement": {
"writer": "ParallelVtkImage",
"outputtype": "Float32",
"field": "dynamicecm_displacement",
"field": "dynamicecm",
"steps": 1
}
},
+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"]
}