Compare commits
27
Commits
a0eaa76b27
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dee3c87c66 | ||
|
|
3ba78c5f11 | ||
|
|
dac08095c4 | ||
|
|
79227e93d9 | ||
|
|
d41d8b564b | ||
|
|
59d5935567 | ||
|
|
075d11b948 | ||
|
|
1696d72a6f | ||
|
|
6de64dd5d0 | ||
|
|
b36d8a748d | ||
|
|
4661646b4f | ||
|
|
f563cbf9e4 | ||
|
|
6dbbf45043 | ||
|
|
9d7b0028a6 | ||
|
|
fb187dd3c5 | ||
|
|
54994d4587 | ||
|
|
fb08f0af77 | ||
|
|
7e3778757c | ||
|
|
6c8c93589b | ||
|
|
744512e4b5 | ||
|
|
ac97d3094a | ||
|
|
5c2dcddf95 | ||
|
|
a2ad49bd11 | ||
|
|
6863581568 | ||
|
|
409ec8b4c2 | ||
|
|
c7d4a50a85 | ||
|
|
926ed90da4 |
@@ -1,2 +1,4 @@
|
|||||||
*.swp
|
*.swp
|
||||||
outdir
|
outdir
|
||||||
|
venv
|
||||||
|
dump
|
||||||
|
|||||||
@@ -1,2 +1,10 @@
|
|||||||
venv
|
venv
|
||||||
.ipynb_checkpoints
|
.ipynb_checkpoints
|
||||||
|
logs
|
||||||
|
__pycache__
|
||||||
|
generated/*
|
||||||
|
batch/measurements/strong/*
|
||||||
|
configs/measurements/strong/*
|
||||||
|
*.dat
|
||||||
|
*.db
|
||||||
|
eval/generated/*
|
||||||
|
|||||||
@@ -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.
@@ -5,11 +5,11 @@
|
|||||||
#SBATCH --account=hkf6
|
#SBATCH --account=hkf6
|
||||||
#SBATCH --partition=develbooster
|
#SBATCH --partition=develbooster
|
||||||
#SBATCH --nodes=1
|
#SBATCH --nodes=1
|
||||||
#SBATCH --ntasks-per-node=1
|
#SBATCH --ntasks=1
|
||||||
#SBATCH --cpus-per-task=48
|
#SBATCH --cpus-per-task=48
|
||||||
#SBATCH --time=01:00:00
|
#SBATCH --time=01:00:00
|
||||||
#SBATCH --output=build-cuda-%j.out
|
#SBATCH --output=logs/build-cuda-%j.log
|
||||||
#SBATCH --error=build-cuda-%j.err
|
#SBATCH --error=logs/build-cuda-%j.log
|
||||||
|
|
||||||
SOURCE_DIR=/p/project/cellsinsilico/paulslustigebude
|
SOURCE_DIR=/p/project/cellsinsilico/paulslustigebude
|
||||||
|
|
||||||
|
|||||||
@@ -5,11 +5,11 @@
|
|||||||
#SBATCH --account=hkf6
|
#SBATCH --account=hkf6
|
||||||
#SBATCH --partition=develbooster
|
#SBATCH --partition=develbooster
|
||||||
#SBATCH --nodes=1
|
#SBATCH --nodes=1
|
||||||
#SBATCH --ntasks-per-node=1
|
#SBATCH --ntasks=1
|
||||||
#SBATCH --cpus-per-task=48
|
#SBATCH --cpus-per-task=48
|
||||||
#SBATCH --time=01:00:00
|
#SBATCH --time=01:00:00
|
||||||
#SBATCH --output=build-nocuda-%j.out
|
#SBATCH --output=logs/build-nocuda-%j.log
|
||||||
#SBATCH --error=build-nocuda-%j.err
|
#SBATCH --error=logs/build-nocuda-%j.log
|
||||||
|
|
||||||
SOURCE_DIR=/p/project/cellsinsilico/paulslustigebude
|
SOURCE_DIR=/p/project/cellsinsilico/paulslustigebude
|
||||||
|
|
||||||
|
|||||||
@@ -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}"
|
||||||
@@ -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}"
|
||||||
@@ -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}"
|
||||||
@@ -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
|
||||||
@@ -9,11 +9,11 @@
|
|||||||
#SBATCH --nodes=1
|
#SBATCH --nodes=1
|
||||||
# Number of MPI processes
|
# Number of MPI processes
|
||||||
# TODO: Change the config and set to this the maximum of 48
|
# 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 --cpus-per-task=1
|
||||||
#SBATCH --time=01:00:00
|
#SBATCH --time=01:00:00
|
||||||
#SBATCH --output=nocuda-%j.out
|
#SBATCH --output=logs/nocuda-%j.log
|
||||||
#SBATCH --error=nocuda-%j.err
|
#SBATCH --error=logs/nocuda-%j.log
|
||||||
|
|
||||||
SOURCE_DIR=/p/project/cellsinsilico/paulslustigebude
|
SOURCE_DIR=/p/project/cellsinsilico/paulslustigebude
|
||||||
OUTPUT_DIR=/p/scratch/cellsinsilico/paul/nastja-out/nocuda
|
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}"
|
mkdir -p "${OUTPUT_DIR}"
|
||||||
source "${SOURCE_DIR}/activate-nastja-modules"
|
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" \
|
-c "${SOURCE_DIR}/ma/experiments/configs/genesis.json" \
|
||||||
-o "${OUTPUT_DIR}"
|
-o "${OUTPUT_DIR}"
|
||||||
|
|||||||
@@ -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}"
|
||||||
@@ -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}"
|
||||||
@@ -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}"
|
||||||
@@ -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"]
|
||||||
|
}
|
||||||
@@ -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"]
|
||||||
|
}
|
||||||
@@ -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"]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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,11 +4,11 @@
|
|||||||
},
|
},
|
||||||
"Application": "Cells",
|
"Application": "Cells",
|
||||||
"Geometry": {
|
"Geometry": {
|
||||||
"blocksize": [20, 20, 20],
|
"blocksize": [40, 20, 20],
|
||||||
"blockcount": [2, 1, 1]
|
"blockcount": [1, 1, 1]
|
||||||
},
|
},
|
||||||
"Settings": {
|
"Settings": {
|
||||||
"timesteps": 500,
|
"timesteps": 200,
|
||||||
"randomseed": 42
|
"randomseed": 42
|
||||||
},
|
},
|
||||||
"Filling": {
|
"Filling": {
|
||||||
@@ -76,7 +76,7 @@
|
|||||||
},
|
},
|
||||||
"dynamicecm": {
|
"dynamicecm": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"stepsPerMcs": 100,
|
"stepsPerMcs": 10,
|
||||||
"pushSteps": 10,
|
"pushSteps": 10,
|
||||||
"pushWeight": 2,
|
"pushWeight": 2,
|
||||||
"ecmCellID": 0,
|
"ecmCellID": 0,
|
||||||
|
|||||||
@@ -1,21 +1,40 @@
|
|||||||
{
|
{
|
||||||
"#Testing": {
|
"#Testing": {
|
||||||
"description": "Cellular Potts Model with dynamic ECM"
|
"description": "Minimal config for debugging CUDA code"
|
||||||
},
|
},
|
||||||
"Application": "Cells",
|
"Application": "Cells",
|
||||||
"Geometry": {
|
"Geometry": {
|
||||||
"blocksize": [15, 15, 15],
|
"blocksize": [5, 5, 5],
|
||||||
"blockcount": [1, 1, 1]
|
"blockcount": [1, 1, 1]
|
||||||
},
|
},
|
||||||
"Settings": {
|
"Settings": {
|
||||||
"timesteps": 100,
|
"timesteps": 3,
|
||||||
"randomseed": 42
|
"randomseed": 42
|
||||||
},
|
},
|
||||||
"Filling": {
|
"Filling": {
|
||||||
"cells": [
|
"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": {
|
"CellsInSilico": {
|
||||||
|
"liquid": 1,
|
||||||
"adhesion": {
|
"adhesion": {
|
||||||
"matrix": [
|
"matrix": [
|
||||||
[0, 0, 0, 0],
|
[0, 0, 0, 0],
|
||||||
@@ -53,12 +72,15 @@
|
|||||||
"killdistance": 100
|
"killdistance": 100
|
||||||
},
|
},
|
||||||
"checkerboard": "00",
|
"checkerboard": "00",
|
||||||
"energyfunctions": ["Volume00", "Surface00", "Adhesion00", "Potential00"],
|
"energyfunctions": ["Volume00", "Surface00", "Adhesion00", "Potential00", "DynamicECM00"],
|
||||||
"centerofmass": {
|
"centerofmass": {
|
||||||
"steps": 10
|
"steps": 10
|
||||||
},
|
},
|
||||||
"dynamicecm": {
|
"dynamicecm": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
|
"ecmCellID": 0,
|
||||||
|
"stepsPerMcs": 1,
|
||||||
|
"pushSteps": 1,
|
||||||
"deltat": 0.1,
|
"deltat": 0.1,
|
||||||
"eta": 0.5
|
"eta": 0.5
|
||||||
}
|
}
|
||||||
@@ -67,7 +89,7 @@
|
|||||||
"ParallelVTK_Displacement": {
|
"ParallelVTK_Displacement": {
|
||||||
"writer": "ParallelVtkImage",
|
"writer": "ParallelVtkImage",
|
||||||
"outputtype": "Float32",
|
"outputtype": "Float32",
|
||||||
"field": "dynamicecm_displacement",
|
"field": "dynamicecm",
|
||||||
"steps": 1
|
"steps": 1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
@@ -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
|
||||||
|
File diff suppressed because one or more lines are too long
@@ -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
|
||||||
|
File diff suppressed because one or more lines are too long
@@ -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
|
||||||
|
@@ -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
|
||||||
|
File diff suppressed because one or more lines are too long
@@ -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
|
||||||
|
File diff suppressed because one or more lines are too long
@@ -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
|
||||||
|
File diff suppressed because one or more lines are too long
@@ -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
|
||||||
|
File diff suppressed because one or more lines are too long
@@ -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
|
||||||
|
@@ -0,0 +1 @@
|
|||||||
|
module load SciPy-Stack
|
||||||
+52
@@ -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
@@ -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
@@ -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
@@ -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)
|
||||||
Executable
+24
@@ -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} \\\\")
|
||||||
Executable
+21
@@ -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))
|
||||||
Executable
+61
@@ -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"]))
|
||||||
Executable
+116
@@ -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))
|
||||||
@@ -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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,98 +1 @@
|
|||||||
anyio==3.7.0
|
click==8.1.7
|
||||||
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
|
|
||||||
|
|||||||
@@ -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)
|
||||||
@@ -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)
|
||||||
@@ -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)
|
||||||
@@ -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()
|
||||||
@@ -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"
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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"]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user