Compare commits
	
		
			4 Commits
		
	
	
		
			4661646b4f
			...
			075d11b948
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 075d11b948 | |||
| 1696d72a6f | |||
| 6de64dd5d0 | |||
| b36d8a748d | 
							
								
								
									
										1
									
								
								experiments/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								experiments/.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -7,3 +7,4 @@ batch/measurements/strong/* | |||||||
| configs/measurements/strong/* | configs/measurements/strong/* | ||||||
| *.dat | *.dat | ||||||
| *.db | *.db | ||||||
|  | eval/generated/* | ||||||
|  | |||||||
							
								
								
									
										24
									
								
								experiments/batch/julian-animation
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								experiments/batch/julian-animation
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | |||||||
|  | #!/usr/bin/env bash | ||||||
|  | 
 | ||||||
|  | #SBATCH --job-name=julian-animation | ||||||
|  | #SBATCH --account=hkf6 | ||||||
|  | #SBATCH --partition=booster | ||||||
|  | #SBATCH --nodes=8 | ||||||
|  | #SBATCH --ntasks=32 | ||||||
|  | # Counted per node | ||||||
|  | #SBATCH --gres=gpu:4 | ||||||
|  | #SBATCH --time=03:30:00 | ||||||
|  | #SBATCH --output=logs/%x-%A_%a.log | ||||||
|  | #SBATCH --error=logs/%x-%A_%a.log | ||||||
|  | 
 | ||||||
|  | SOURCE_DIR=/p/project/cellsinsilico/paulslustigebude | ||||||
|  | OUTPUT_DIR="/p/scratch/cellsinsilico/paul/nastja-out/${SLURM_JOB_NAME}" | ||||||
|  | 
 | ||||||
|  | echo "outdir is ${OUTPUT_DIR}" | ||||||
|  | 
 | ||||||
|  | mkdir -p "${OUTPUT_DIR}" | ||||||
|  | source "${SOURCE_DIR}/activate-nastja-modules" | ||||||
|  | 
 | ||||||
|  | srun --unbuffered "${SOURCE_DIR}/nastja/build-cuda/nastja" \ | ||||||
|  |   -c "${SOURCE_DIR}/ma/experiments/configs/${SLURM_JOB_NAME}.json" \ | ||||||
|  |   -o "${OUTPUT_DIR}" | ||||||
							
								
								
									
										0
									
								
								experiments/batch/measurements/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								experiments/batch/measurements/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										330
									
								
								experiments/configs/julian-animation.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										330
									
								
								experiments/configs/julian-animation.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,330 @@ | |||||||
|  | { | ||||||
|  |   "Comments": [ | ||||||
|  |     "Celltype         Usage", | ||||||
|  |     "0                Dynamic ECM", | ||||||
|  |     "1-5             Not Used", | ||||||
|  |     "6               Liquid  ", | ||||||
|  |     "7               Apoptotic cell Type ", | ||||||
|  |     "8               Basic Non Dividing Cell type (surrounding)", | ||||||
|  |     "9               Cancer" | ||||||
|  |   ], | ||||||
|  |   "Application": "Cells", | ||||||
|  |   "CellsInSilico": { | ||||||
|  |     "ecmdegradation": { | ||||||
|  |       "enabled": "false", | ||||||
|  |       "steps": 99999, | ||||||
|  |       "stochastic": "true", | ||||||
|  |       "probability": 0.5 | ||||||
|  |     }, | ||||||
|  |     "energyfunctions": [ | ||||||
|  |       "Volume00", | ||||||
|  |       "Surface01", | ||||||
|  |       "Motility00", | ||||||
|  |       "Adhesion01", | ||||||
|  |       "DynamicECM00" | ||||||
|  |     ], | ||||||
|  |     "liquid": 6, | ||||||
|  |     "volume": { | ||||||
|  |       "default": { | ||||||
|  |         "storage": "const", | ||||||
|  |         "value": 500 | ||||||
|  |       }, | ||||||
|  |       "lambda": [ | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         7.5, | ||||||
|  |         7.5, | ||||||
|  |         7.5 | ||||||
|  |       ], | ||||||
|  |       "sizechange": [ | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         -0.05, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0 | ||||||
|  |       ] | ||||||
|  |     }, | ||||||
|  |     "surface": { | ||||||
|  |       "default": { | ||||||
|  |         "storage": "const", | ||||||
|  |         "value": 400 | ||||||
|  |       }, | ||||||
|  |       "lambda": [ | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         5.625, | ||||||
|  |         5.625, | ||||||
|  |         1 | ||||||
|  |       ], | ||||||
|  |       "sizechange": [ | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         -0.05, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0 | ||||||
|  |       ] | ||||||
|  |     }, | ||||||
|  |     "adhesion": { | ||||||
|  |       "matrix": [ | ||||||
|  |         [ | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0 | ||||||
|  |         ], | ||||||
|  |         [ | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           450 | ||||||
|  |         ], | ||||||
|  |         [ | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0 | ||||||
|  |         ], | ||||||
|  |         [ | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0 | ||||||
|  |         ], | ||||||
|  |         [ | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0 | ||||||
|  |         ], | ||||||
|  |         [ | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0 | ||||||
|  |         ], | ||||||
|  |         [ | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0 | ||||||
|  |         ], | ||||||
|  |         [ | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0 | ||||||
|  |         ], | ||||||
|  |         [ | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0 | ||||||
|  |         ], | ||||||
|  |         [ | ||||||
|  |           0, | ||||||
|  |           450, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           0, | ||||||
|  |           50 | ||||||
|  |         ] | ||||||
|  |       ] | ||||||
|  |     }, | ||||||
|  |     "temperature": 50, | ||||||
|  |     "division": { | ||||||
|  |       "enabled": "true", | ||||||
|  |       "condition": [ | ||||||
|  |         "", | ||||||
|  |         "", | ||||||
|  |         "", | ||||||
|  |         "", | ||||||
|  |         "", | ||||||
|  |         "", | ||||||
|  |         "", | ||||||
|  |         "", | ||||||
|  |         "", | ||||||
|  |         "( volume >= 0.9 * volume0 )  & ( rnd() <= 0.00001 ) & generation < 1" | ||||||
|  |       ] | ||||||
|  |     }, | ||||||
|  |     "centerofmass": { | ||||||
|  |       "steps": 1 | ||||||
|  |     }, | ||||||
|  |     "signaling": { | ||||||
|  |       "enabled": false | ||||||
|  |     }, | ||||||
|  |     "orientation": { | ||||||
|  |       "enabled": true, | ||||||
|  |       "motility": "persistentRandomWalk", | ||||||
|  |       "persistenceMagnitude": 0.0, | ||||||
|  |       "recalculationtime": 200, | ||||||
|  |       "motilityamount": [ | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0, | ||||||
|  |         0 | ||||||
|  |       ] | ||||||
|  |     }, | ||||||
|  |     "visitor": { | ||||||
|  |       "stepwidth": 10, | ||||||
|  |       "checkerboard": "01" | ||||||
|  |     }, | ||||||
|  |     "cleaner": { | ||||||
|  |       "killDistance": 20 | ||||||
|  |     }, | ||||||
|  |     "dynamicecm": { | ||||||
|  |       "enabled": true, | ||||||
|  |       "stepsPerMcs": 100, | ||||||
|  |       "pushSteps": 10, | ||||||
|  |       "pushWeight": 2, | ||||||
|  |       "ecmCellID": 0, | ||||||
|  |       "deltat": 0.1, | ||||||
|  |       "eta": 0.25, | ||||||
|  |       "k0": 0.1, | ||||||
|  |       "k1": 0.1, | ||||||
|  |       "c": 4, | ||||||
|  |       "alpha": 2, | ||||||
|  |       "d": 0.3, | ||||||
|  |       "phi": 1 | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "Geometry": { | ||||||
|  |     "blockcount": [ | ||||||
|  |       2, | ||||||
|  |       4, | ||||||
|  |       4 | ||||||
|  |     ], | ||||||
|  |     "blocksize": [ | ||||||
|  |       200, | ||||||
|  |       100, | ||||||
|  |       100 | ||||||
|  |     ] | ||||||
|  |   }, | ||||||
|  |   "Settings": { | ||||||
|  |     "randomseed": 0, | ||||||
|  |     "timesteps": 5000, | ||||||
|  |     "statusoutput": 1 | ||||||
|  |   }, | ||||||
|  |   "WriteActions": ["ParallelVTK_Cells", "ParallelVTK_Displacement"], | ||||||
|  |   "Writers": { | ||||||
|  |     "CellInfo": { | ||||||
|  |       "field": "", | ||||||
|  |       "groupsize": 0, | ||||||
|  |       "steps": 1, | ||||||
|  |       "writer": "CellInfo" | ||||||
|  |     }, | ||||||
|  |     "ParallelVTK_Cells": { | ||||||
|  |       "field": "cells", | ||||||
|  |       "outputtype": "UInt32", | ||||||
|  |       "printhints": false, | ||||||
|  |       "steps": 100, | ||||||
|  |       "writer": "ParallelVtkImage" | ||||||
|  |     }, | ||||||
|  |     "ParallelVTK_Displacement": { | ||||||
|  |       "writer": "ParallelVtkImage", | ||||||
|  |       "outputtype": "Float32", | ||||||
|  |       "field": "dynamicecm", | ||||||
|  |       "components": [ | ||||||
|  |         0, | ||||||
|  |         1, | ||||||
|  |         2 | ||||||
|  |       ], | ||||||
|  |       "steps": 100 | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "Include": "measurements/strong/config_filling_1.json" | ||||||
|  | } | ||||||
							
								
								
									
										10
									
								
								experiments/eval/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								experiments/eval/Makefile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | |||||||
|  | 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 | ||||||
|  | 
 | ||||||
|  | clean-logs: | ||||||
|  | 	rm logs/* | ||||||
|  | 
 | ||||||
|  | .PHONY: generate-batch-strong-cpu clean-logs | ||||||
							
								
								
									
										17568
									
								
								experiments/eval/data/strong-cpu-timings.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17568
									
								
								experiments/eval/data/strong-cpu-timings.json
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										10
									
								
								experiments/eval/data/strong-cpu.tsv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								experiments/eval/data/strong-cpu.tsv
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | |||||||
|  | label	nodes	mean_time	std_time	speedup	speedup_std | ||||||
|  | 1	1	1132.1093720291667	18.428644622186628	1.0	0.016278148629010596 | ||||||
|  | 2	2	619.9614289104168	7.890810670766857	1.8260964621925766	0.029725469622481192 | ||||||
|  | 4	4	348.657283046875	3.3739994706945122	3.247054993762918	0.052856043795043856 | ||||||
|  | 8	8	200.79244575312498	1.259910347938215	5.63820699420684	0.09177957145282603 | ||||||
|  | 16	16	111.37033198671875	0.3943541234366863	10.16526889911915	0.16547175799372044 | ||||||
|  | 32	32	65.69918741145833	0.43464214827532205	17.231710415823503	0.28050034328084494 | ||||||
|  | 64	64	38.56257490957031	0.12227397957602136	29.35772247273364	0.4778893698204027 | ||||||
|  | 128	128	21.433497051595047	0.14016683538819355	52.81962944749218	0.8598057786755426 | ||||||
|  | 256	256	13.247708324598525	0.030540850807946187	85.45699711149668	1.3910817003698723 | ||||||
| 
 | 
							
								
								
									
										12312
									
								
								experiments/eval/data/strong-gpu-timings.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12312
									
								
								experiments/eval/data/strong-gpu-timings.json
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										8
									
								
								experiments/eval/data/strong-gpu.tsv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								experiments/eval/data/strong-gpu.tsv
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | |||||||
|  | label	nodes	tasks	mean_time	std_time	speedup	speedup_std | ||||||
|  | 1	1	1	157.5217688	0.5311809049610176	1.0	0.003372111099358209 | ||||||
|  | 1	1	2	120.15237200000001	0.299200156243067	1.3110167213344732	0.004420894037456185 | ||||||
|  | 1	1	4	75.69762635	0.5769735213369493	2.0809340582447473	0.007017140834839633 | ||||||
|  | 2	2	8	52.110670325	0.940887445857671	3.022831366735062	0.010193323203255446 | ||||||
|  | 4	4	16	28.215493675000005	0.5598524922936691	5.582811012077745	0.018825858979446598 | ||||||
|  | 8	8	32	12.422501156249998	0.31940690526235005	12.680358554102268	0.04275957782413007 | ||||||
|  | 16	16	64	7.70770194375	0.04068644910316383	20.43693048194875	0.06891560011499148 | ||||||
| 
 | 
							
								
								
									
										0
									
								
								experiments/eval/generated/batch/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								experiments/eval/generated/batch/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										0
									
								
								experiments/eval/generated/config/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								experiments/eval/generated/config/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										1
									
								
								experiments/eval/load-modules
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								experiments/eval/load-modules
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | module load SciPy-Stack | ||||||
							
								
								
									
										0
									
								
								experiments/eval/logs/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								experiments/eval/logs/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										36
									
								
								experiments/eval/scripts/build-pgf-datafiles.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										36
									
								
								experiments/eval/scripts/build-pgf-datafiles.py
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,36 @@ | |||||||
|  | #!/usr/bin/env python | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | import argparse | ||||||
|  | import json | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 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") | ||||||
|  |     args = p.parse_args() | ||||||
|  | 
 | ||||||
|  |     with open(args.timing_file, "r", encoding="utf8") as f: | ||||||
|  |         jobs = json.load(f) | ||||||
|  | 
 | ||||||
|  |     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"], | ||||||
|  |         "speedup_std": lambda job: jobs[0]["stds"]["TimeStep"] / job["means"]["TimeStep"], | ||||||
|  |     } | ||||||
|  |     print_table(jobs, scaling_spec) | ||||||
							
								
								
									
										35
									
								
								experiments/eval/scripts/generate-strong-cpu-configs.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										35
									
								
								experiments/eval/scripts/generate-strong-cpu-configs.py
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,35 @@ | |||||||
|  | #!/usr/bin/env python | ||||||
|  | 
 | ||||||
|  | import copy | ||||||
|  | import json | ||||||
|  | 
 | ||||||
|  | from pathlib import Path | ||||||
|  | 
 | ||||||
|  | SIZE = [384, 384, 384] | ||||||
|  | 
 | ||||||
|  | with (Path(__file__).parent.parent / "templates" / "strong-cpu.json").open(encoding="utf8") as f: | ||||||
|  |     template = json.load(f) | ||||||
|  | 
 | ||||||
|  | configs = [ | ||||||
|  |     [  4,  4,  3], | ||||||
|  |     [  4,  4,  6], | ||||||
|  |     [  4,  4, 12], | ||||||
|  |     [  4,  8, 12], | ||||||
|  |     [  8,  8, 12], | ||||||
|  |     [  8,  8, 24], | ||||||
|  |     [  8, 16, 24], | ||||||
|  |     [ 16, 16, 24], | ||||||
|  |     [ 16, 16, 48] | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | out_path = Path(__file__).parent.parent / "generated" / "config" | ||||||
|  | 
 | ||||||
|  | for c in configs: | ||||||
|  |     nc = copy.deepcopy(template) | ||||||
|  |     nc["Geometry"]["blockcount"] = c | ||||||
|  |     nc["Geometry"]["blocksize"] = [bs // bc for bc, bs in zip(c, SIZE)] | ||||||
|  | 
 | ||||||
|  |     nc_out_path = out_path / f"strong-cpu-{c[0]:02}-{c[1]:02}-{c[2]:02}.json" | ||||||
|  |     print(f"Dumping {(c[0] * c[1] * c[2]) // 48} to {nc_out_path}") | ||||||
|  |     with nc_out_path.open("w", encoding="utf8") as f: | ||||||
|  |         json.dump(nc, f) | ||||||
							
								
								
									
										34
									
								
								experiments/eval/scripts/generate-strong-gpu-configs.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										34
									
								
								experiments/eval/scripts/generate-strong-gpu-configs.py
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,34 @@ | |||||||
|  | #!/usr/bin/env python | ||||||
|  | 
 | ||||||
|  | import copy | ||||||
|  | import json | ||||||
|  | 
 | ||||||
|  | from pathlib import Path | ||||||
|  | 
 | ||||||
|  | SIZE = [384, 384, 384] | ||||||
|  | 
 | ||||||
|  | with (Path(__file__).parent.parent / "templates" / "strong-gpu.json").open(encoding="utf8") as f: | ||||||
|  |     template = json.load(f) | ||||||
|  | 
 | ||||||
|  | configs = [ | ||||||
|  |     [  1,  1,  1], | ||||||
|  |     [  1,  1,  2], | ||||||
|  |     [  1,  2,  2], | ||||||
|  |     [  2,  2,  2], | ||||||
|  |     [  2,  2,  4], | ||||||
|  |     [  2,  4,  4], | ||||||
|  |     [  4,  4,  4], | ||||||
|  |     [  4,  4,  8], | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | out_path = Path(__file__).parent.parent / "generated" / "config" | ||||||
|  | 
 | ||||||
|  | for c in configs: | ||||||
|  |     nc = copy.deepcopy(template) | ||||||
|  |     nc["Geometry"]["blockcount"] = c | ||||||
|  |     nc["Geometry"]["blocksize"] = [bs // bc for bc, bs in zip(c, SIZE)] | ||||||
|  | 
 | ||||||
|  |     nc_out_path = out_path / f"strong-gpu-{c[0]:02}-{c[1]:02}-{c[2]:02}.json" | ||||||
|  |     print(f"Dumping {(c[0] * c[1] * c[2])} to {nc_out_path}") | ||||||
|  |     with nc_out_path.open("w", encoding="utf8") as f: | ||||||
|  |         json.dump(nc, f) | ||||||
							
								
								
									
										21
									
								
								experiments/eval/scripts/substitute.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										21
									
								
								experiments/eval/scripts/substitute.py
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,21 @@ | |||||||
|  | #!/usr/bin/env python | ||||||
|  | 
 | ||||||
|  | import jinja2 | ||||||
|  | import json | ||||||
|  | import sys | ||||||
|  | 
 | ||||||
|  | from pathlib import Path | ||||||
|  | 
 | ||||||
|  | data = json.load(sys.stdin) | ||||||
|  | 
 | ||||||
|  | templates_env = jinja2.Environment( | ||||||
|  |     loader=jinja2.FileSystemLoader(Path(__file__).parent.parent / "templates"), | ||||||
|  |     autoescape=jinja2.select_autoescape() | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | for possibly_incomplete_batch in data["batches"]: | ||||||
|  |     batch = dict(list(data["common"].items()) + list(possibly_incomplete_batch.items())) | ||||||
|  |     out_path = Path(__file__).parent.parent / "generated" / "batch" / batch["name"] | ||||||
|  |     t = templates_env.get_template(sys.argv[1]) | ||||||
|  |     print(f"Dumping to {out_path}") | ||||||
|  |     t.stream(**batch).dump(str(out_path)) | ||||||
							
								
								
									
										92
									
								
								experiments/eval/scripts/timing.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										92
									
								
								experiments/eval/scripts/timing.py
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,92 @@ | |||||||
|  | #!/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): | ||||||
|  |     mts = [ | ||||||
|  |         load_mean_timings(outdir_path) | ||||||
|  |         for outdir_path | ||||||
|  |         in get_outdirs(jobid) | ||||||
|  |     ] | ||||||
|  | 
 | ||||||
|  |     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")) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 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") | ||||||
|  |     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) | ||||||
|  |         accounting_data = get_accounting_data(jobid) | ||||||
|  |         array_mean_timings = load_array_mean_timings(jobid) | ||||||
|  | 
 | ||||||
|  |         results.append({ | ||||||
|  |             "jobid": jobid, | ||||||
|  |             "means": array_mean_timings.mean().to_dict(), | ||||||
|  |             "stds": array_mean_timings.std().to_dict(), | ||||||
|  |             "accounting": [array_job["steps"][-1] for array_job in accounting_data["jobs"]] | ||||||
|  |         }) | ||||||
|  |     print(json.dumps(results, indent=2 if args.prettify else None)) | ||||||
							
								
								
									
										67
									
								
								experiments/eval/strong-cpu.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								experiments/eval/strong-cpu.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,67 @@ | |||||||
|  | { | ||||||
|  |   "common": { | ||||||
|  |     "account": "cellsinsilico", | ||||||
|  |     "partition": "batch", | ||||||
|  |     "extra_sbatch_line": "", | ||||||
|  |     "logfile_path": "/p/project/cellsinsilico/paulslustigebude/ma/experiments/eval/logs/%x-%A.%a", | ||||||
|  |     "nastja_binary_path": "/p/project/cellsinsilico/paulslustigebude/nastja/build-nocuda/nastja", | ||||||
|  |     "config_path": "/p/project/cellsinsilico/paulslustigebude/ma/experiments/eval/generated/config/${SLURM_JOB_NAME}.json", | ||||||
|  |     "output_dir_path": "/p/scratch/cellsinsilico/paul/nastja-out/${SLURM_JOB_NAME}-${SLURM_ARRAY_JOB_ID}.${SLURM_ARRAY_TASK_ID}" | ||||||
|  |   }, | ||||||
|  |   "batches": [ | ||||||
|  |     { | ||||||
|  |       "name": "strong-cpu-04-04-03", | ||||||
|  |       "nodes": 1, | ||||||
|  |       "tasks": 48, | ||||||
|  |       "time": "00:30:00" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "strong-cpu-04-04-06", | ||||||
|  |       "nodes": 2, | ||||||
|  |       "tasks": 96, | ||||||
|  |       "time": "00:30:00" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "strong-cpu-04-04-12", | ||||||
|  |       "nodes": 4, | ||||||
|  |       "tasks": 192, | ||||||
|  |       "time": "00:10:00" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "strong-cpu-04-08-12", | ||||||
|  |       "nodes": 8, | ||||||
|  |       "tasks": 384, | ||||||
|  |       "time": "00:10:00" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "strong-cpu-08-08-12", | ||||||
|  |       "nodes": 16, | ||||||
|  |       "tasks": 768, | ||||||
|  |       "time": "00:10:00" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "strong-cpu-08-08-24", | ||||||
|  |       "nodes": 32, | ||||||
|  |       "tasks": 1536, | ||||||
|  |       "time": "00:10:00" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "strong-cpu-08-16-24", | ||||||
|  |       "nodes": 64, | ||||||
|  |       "tasks": 3072, | ||||||
|  |       "time": "00:10:00" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "strong-cpu-16-16-24", | ||||||
|  |       "nodes": 128, | ||||||
|  |       "tasks": 6144, | ||||||
|  |       "time": "00:10:00" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "strong-cpu-16-16-48", | ||||||
|  |       "nodes": 256, | ||||||
|  |       "tasks": 12288, | ||||||
|  |       "time": "00:10:00" | ||||||
|  |     } | ||||||
|  |   ] | ||||||
|  | } | ||||||
							
								
								
									
										63
									
								
								experiments/eval/strong-gpu.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								experiments/eval/strong-gpu.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,63 @@ | |||||||
|  | { | ||||||
|  |   "common": { | ||||||
|  |     "account": "cellsinsilico", | ||||||
|  |     "partition": "gpus", | ||||||
|  |     "extra_sbatch_line": "#SBATCH --gres=gpu:4", | ||||||
|  |     "logfile_path": "/p/project/cellsinsilico/paulslustigebude/ma/experiments/eval/logs/%x-%A.%a", | ||||||
|  |     "nastja_binary_path": "/p/project/cellsinsilico/paulslustigebude/nastja/build-cuda/nastja", | ||||||
|  |     "config_path": "/p/project/cellsinsilico/paulslustigebude/ma/experiments/eval/generated/config/${SLURM_JOB_NAME}.json", | ||||||
|  |     "output_dir_path": "/p/scratch/cellsinsilico/paul/nastja-out/${SLURM_JOB_NAME}-${SLURM_ARRAY_JOB_ID}.${SLURM_ARRAY_TASK_ID}" | ||||||
|  |   }, | ||||||
|  |   "batches": [ | ||||||
|  |     { | ||||||
|  |       "name": "strong-gpu-01-01-01", | ||||||
|  |       "nodes": 1, | ||||||
|  |       "tasks": 1, | ||||||
|  |       "time": "00:15:00", | ||||||
|  |       "extra_sbatch_line": "#SBATCH --gres=gpu:1" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "strong-gpu-01-01-02", | ||||||
|  |       "nodes": 1, | ||||||
|  |       "tasks": 2, | ||||||
|  |       "time": "00:15:00", | ||||||
|  |       "extra_sbatch_line": "#SBATCH --gres=gpu:2" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "strong-gpu-01-02-02", | ||||||
|  |       "nodes": 1, | ||||||
|  |       "tasks": 4, | ||||||
|  |       "time": "00:15:00" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "strong-gpu-02-02-02", | ||||||
|  |       "nodes": 2, | ||||||
|  |       "tasks": 8, | ||||||
|  |       "time": "00:15:00" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "strong-gpu-02-02-04", | ||||||
|  |       "nodes": 4, | ||||||
|  |       "tasks": 16, | ||||||
|  |       "time": "00:15:00" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "strong-gpu-02-04-04", | ||||||
|  |       "nodes": 8, | ||||||
|  |       "tasks": 32, | ||||||
|  |       "time": "00:15:00" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "strong-gpu-04-04-04", | ||||||
|  |       "nodes": 16, | ||||||
|  |       "tasks": 64, | ||||||
|  |       "time": "00:15:00" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "name": "strong-gpu-04-04-08", | ||||||
|  |       "nodes": 32, | ||||||
|  |       "tasks": 128, | ||||||
|  |       "time": "00:15:00" | ||||||
|  |     } | ||||||
|  |   ] | ||||||
|  | } | ||||||
							
								
								
									
										31
									
								
								experiments/eval/templates/strong-batch.j2
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								experiments/eval/templates/strong-batch.j2
									
									
									
									
									
										Normal file
									
								
							| @ -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}" | ||||||
|  | 
 | ||||||
							
								
								
									
										258
									
								
								experiments/eval/templates/strong-cpu.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										258
									
								
								experiments/eval/templates/strong-cpu.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,258 @@ | |||||||
|  | { | ||||||
|  |   "Application": "Cells", | ||||||
|  |   "CellsInSilico": { | ||||||
|  |     "2D": false, | ||||||
|  |     "adhesion": { | ||||||
|  |       "matrix": [ | ||||||
|  |         [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], | ||||||
|  |         [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 450.0], | ||||||
|  |         [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], | ||||||
|  |         [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], | ||||||
|  |         [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], | ||||||
|  |         [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], | ||||||
|  |         [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], | ||||||
|  |         [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], | ||||||
|  |         [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], | ||||||
|  |         [0.0, 450.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 50.0] | ||||||
|  |       ], | ||||||
|  |       "polarityenabled": false | ||||||
|  |     }, | ||||||
|  |     "centerofmass": { | ||||||
|  |       "steps": 1 | ||||||
|  |     }, | ||||||
|  |     "cleaner": { | ||||||
|  |       "killdistance": 0, | ||||||
|  |       "steps": 100 | ||||||
|  |     }, | ||||||
|  |     "contactinhibition": { | ||||||
|  |       "enabled": false | ||||||
|  |     }, | ||||||
|  |     "division": { | ||||||
|  |       "condition": [ | ||||||
|  |         "", | ||||||
|  |         "", | ||||||
|  |         "", | ||||||
|  |         "", | ||||||
|  |         "", | ||||||
|  |         "", | ||||||
|  |         "", | ||||||
|  |         "", | ||||||
|  |         "", | ||||||
|  |         "( volume >= 0.9 * volume0 )  & ( rnd() <= 0.00001 ) & generation < 1" | ||||||
|  |       ], | ||||||
|  |       "enabled": true, | ||||||
|  |       "halveSignals": false | ||||||
|  |     }, | ||||||
|  |     "dynamicecm": { | ||||||
|  |       "alpha": 2.0, | ||||||
|  |       "beta": 0.5, | ||||||
|  |       "c": 4.0, | ||||||
|  |       "deltat": 0.10000000149011612, | ||||||
|  |       "ecmCellID": 0, | ||||||
|  |       "enabled": true, | ||||||
|  |       "eta": 0.25, | ||||||
|  |       "k0": 0.10000000149011612, | ||||||
|  |       "k1": 0.10000000149011612, | ||||||
|  |       "lambda": 10.0, | ||||||
|  |       "phi": 1.0, | ||||||
|  |       "pushSteps": 10, | ||||||
|  |       "pushWeight": 0.5, | ||||||
|  |       "stepsPerMcs": 100 | ||||||
|  |     }, | ||||||
|  |     "ecmdegradation": { | ||||||
|  |       "enabled": false | ||||||
|  |     }, | ||||||
|  |     "energyfunctions": [ | ||||||
|  |       "Volume00", | ||||||
|  |       "Surface01", | ||||||
|  |       "Motility00", | ||||||
|  |       "Adhesion01", | ||||||
|  |       "DynamicECM00" | ||||||
|  |     ], | ||||||
|  |     "liquid": 6, | ||||||
|  |     "logcellproperties": { | ||||||
|  |       "enabled": false | ||||||
|  |     }, | ||||||
|  |     "orientation": { | ||||||
|  |       "enabled": true, | ||||||
|  |       "motility": "persistentRandomWalk", | ||||||
|  |       "motilityamount": [ | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0 | ||||||
|  |       ], | ||||||
|  |       "numRandomNumbers": 5, | ||||||
|  |       "persistenceMagnitude": 0.0, | ||||||
|  |       "persistentDecay": 0.8, | ||||||
|  |       "recalculationtime": 200 | ||||||
|  |     }, | ||||||
|  |     "polarity": { | ||||||
|  |       "enabled": false | ||||||
|  |     }, | ||||||
|  |     "signaling": { | ||||||
|  |       "constant": false, | ||||||
|  |       "enabled": false | ||||||
|  |     }, | ||||||
|  |     "surface": { | ||||||
|  |       "default": { | ||||||
|  |         "storage": "const", | ||||||
|  |         "value": 400.0 | ||||||
|  |       }, | ||||||
|  |       "lambda": [ | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         5.625, | ||||||
|  |         5.625, | ||||||
|  |         1.0 | ||||||
|  |       ], | ||||||
|  |       "sizechange": [ | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         -0.05, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0 | ||||||
|  |       ] | ||||||
|  |     }, | ||||||
|  |     "temperature": 50.0, | ||||||
|  |     "visitor": { | ||||||
|  |       "checkerboard": "01", | ||||||
|  |       "stepwidth": 10 | ||||||
|  |     }, | ||||||
|  |     "volume": { | ||||||
|  |       "default": { | ||||||
|  |         "storage": "const", | ||||||
|  |         "value": 500.0 | ||||||
|  |       }, | ||||||
|  |       "lambda": [ | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         7.5, | ||||||
|  |         7.5, | ||||||
|  |         7.5 | ||||||
|  |       ], | ||||||
|  |       "sizechange": [ | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         -0.05, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0 | ||||||
|  |       ] | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "DefineFunctions": [ | ||||||
|  |     "r_angle()=360*rnd()", | ||||||
|  |     "r_size()=400*rnd()" | ||||||
|  |   ], | ||||||
|  |   "Filling": { | ||||||
|  |     "cells": [ | ||||||
|  |       { | ||||||
|  |         "box": [ | ||||||
|  |           [ | ||||||
|  |             0, | ||||||
|  |             0, | ||||||
|  |             0 | ||||||
|  |           ], | ||||||
|  |           [ | ||||||
|  |             384, | ||||||
|  |             384, | ||||||
|  |             384 | ||||||
|  |           ] | ||||||
|  |         ], | ||||||
|  |         "celltype": 0, | ||||||
|  |         "component": 0, | ||||||
|  |         "pattern": "const", | ||||||
|  |         "seed": 0, | ||||||
|  |         "shape": "cube", | ||||||
|  |         "value": 0 | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         "box": [ | ||||||
|  |           [117, 117, 177], | ||||||
|  |           [267, 267, 267] | ||||||
|  |         ], | ||||||
|  |         "celltype": 9, | ||||||
|  |         "center": [192, 192, 192], | ||||||
|  |         "component": 0, | ||||||
|  |         "count": 5500, | ||||||
|  |         "pattern": "voronoi", | ||||||
|  |         "radius": 75, | ||||||
|  |         "seed": 758960, | ||||||
|  |         "shape": "sphere", | ||||||
|  |         "value": 8 | ||||||
|  |       } | ||||||
|  |     ], | ||||||
|  |     "initialoutput": false, | ||||||
|  |     "randomseed": 758959 | ||||||
|  |   }, | ||||||
|  |   "Geometry": { | ||||||
|  |     "blockcount": [ | ||||||
|  |       4, | ||||||
|  |       4, | ||||||
|  |       3 | ||||||
|  |     ], | ||||||
|  |     "blockdefault": "fill", | ||||||
|  |     "blocksize": [ | ||||||
|  |       96, | ||||||
|  |       96, | ||||||
|  |       128 | ||||||
|  |     ], | ||||||
|  |     "blocktype": [ | ||||||
|  |       [ | ||||||
|  |         [ | ||||||
|  |           1 | ||||||
|  |         ] | ||||||
|  |       ] | ||||||
|  |     ] | ||||||
|  |   }, | ||||||
|  |   "Settings": { | ||||||
|  |     "deltat": 1.0, | ||||||
|  |     "deltax": 1.0, | ||||||
|  |     "handleFPE": "signal", | ||||||
|  |     "logger": { | ||||||
|  |       "group": 0, | ||||||
|  |       "steps": 100 | ||||||
|  |     }, | ||||||
|  |     "randomseed": 42, | ||||||
|  |     "statusoutput": 1, | ||||||
|  |     "timestepguard": 1, | ||||||
|  |     "timesteps": 5 | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										263
									
								
								experiments/eval/templates/strong-gpu.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										263
									
								
								experiments/eval/templates/strong-gpu.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,263 @@ | |||||||
|  | { | ||||||
|  |   "Application": "Cells", | ||||||
|  |   "CellsInSilico": { | ||||||
|  |     "2D": false, | ||||||
|  |     "adhesion": { | ||||||
|  |       "matrix": [ | ||||||
|  |         [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], | ||||||
|  |         [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 450.0], | ||||||
|  |         [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], | ||||||
|  |         [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], | ||||||
|  |         [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], | ||||||
|  |         [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], | ||||||
|  |         [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], | ||||||
|  |         [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], | ||||||
|  |         [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], | ||||||
|  |         [0.0, 450.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 50.0] | ||||||
|  |       ], | ||||||
|  |       "polarityenabled": false | ||||||
|  |     }, | ||||||
|  |     "centerofmass": { | ||||||
|  |       "steps": 1 | ||||||
|  |     }, | ||||||
|  |     "cleaner": { | ||||||
|  |       "killdistance": 0, | ||||||
|  |       "steps": 100 | ||||||
|  |     }, | ||||||
|  |     "contactinhibition": { | ||||||
|  |       "enabled": false | ||||||
|  |     }, | ||||||
|  |     "division": { | ||||||
|  |       "condition": [ | ||||||
|  |         "", | ||||||
|  |         "", | ||||||
|  |         "", | ||||||
|  |         "", | ||||||
|  |         "", | ||||||
|  |         "", | ||||||
|  |         "", | ||||||
|  |         "", | ||||||
|  |         "", | ||||||
|  |         "( volume >= 0.9 * volume0 )  & ( rnd() <= 0.00001 ) & generation < 1" | ||||||
|  |       ], | ||||||
|  |       "enabled": true, | ||||||
|  |       "halveSignals": false | ||||||
|  |     }, | ||||||
|  |     "dynamicecm": { | ||||||
|  |       "alpha": 2.0, | ||||||
|  |       "beta": 0.5, | ||||||
|  |       "c": 4.0, | ||||||
|  |       "deltat": 0.10000000149011612, | ||||||
|  |       "ecmCellID": 0, | ||||||
|  |       "enabled": true, | ||||||
|  |       "eta": 0.25, | ||||||
|  |       "k0": 0.10000000149011612, | ||||||
|  |       "k1": 0.10000000149011612, | ||||||
|  |       "lambda": 10.0, | ||||||
|  |       "phi": 1.0, | ||||||
|  |       "pushSteps": 10, | ||||||
|  |       "pushWeight": 0.5, | ||||||
|  |       "stepsPerMcs": 100 | ||||||
|  |     }, | ||||||
|  |     "ecmdegradation": { | ||||||
|  |       "enabled": false | ||||||
|  |     }, | ||||||
|  |     "energyfunctions": [ | ||||||
|  |       "Volume00", | ||||||
|  |       "Surface01", | ||||||
|  |       "Motility00", | ||||||
|  |       "Adhesion01", | ||||||
|  |       "DynamicECM00" | ||||||
|  |     ], | ||||||
|  |     "liquid": 6, | ||||||
|  |     "logcellproperties": { | ||||||
|  |       "enabled": false | ||||||
|  |     }, | ||||||
|  |     "orientation": { | ||||||
|  |       "enabled": true, | ||||||
|  |       "motility": "persistentRandomWalk", | ||||||
|  |       "motilityamount": [ | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0 | ||||||
|  |       ], | ||||||
|  |       "numRandomNumbers": 5, | ||||||
|  |       "persistenceMagnitude": 0.0, | ||||||
|  |       "persistentDecay": 0.8, | ||||||
|  |       "recalculationtime": 200 | ||||||
|  |     }, | ||||||
|  |     "polarity": { | ||||||
|  |       "enabled": false | ||||||
|  |     }, | ||||||
|  |     "signaling": { | ||||||
|  |       "constant": false, | ||||||
|  |       "enabled": false | ||||||
|  |     }, | ||||||
|  |     "surface": { | ||||||
|  |       "default": { | ||||||
|  |         "storage": "const", | ||||||
|  |         "value": 400.0 | ||||||
|  |       }, | ||||||
|  |       "lambda": [ | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         5.625, | ||||||
|  |         5.625, | ||||||
|  |         1.0 | ||||||
|  |       ], | ||||||
|  |       "sizechange": [ | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         -0.05, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0 | ||||||
|  |       ] | ||||||
|  |     }, | ||||||
|  |     "temperature": 50.0, | ||||||
|  |     "visitor": { | ||||||
|  |       "checkerboard": "01", | ||||||
|  |       "stepwidth": 10 | ||||||
|  |     }, | ||||||
|  |     "volume": { | ||||||
|  |       "default": { | ||||||
|  |         "storage": "const", | ||||||
|  |         "value": 500.0 | ||||||
|  |       }, | ||||||
|  |       "lambda": [ | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         7.5, | ||||||
|  |         7.5, | ||||||
|  |         7.5 | ||||||
|  |       ], | ||||||
|  |       "sizechange": [ | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         -0.05, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0, | ||||||
|  |         0.0 | ||||||
|  |       ] | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "DefineFunctions": [ | ||||||
|  |     "r_angle()=360*rnd()", | ||||||
|  |     "r_size()=400*rnd()" | ||||||
|  |   ], | ||||||
|  |   "Filling": { | ||||||
|  |     "cells": [ | ||||||
|  |       { | ||||||
|  |         "box": [ | ||||||
|  |           [ | ||||||
|  |             0, | ||||||
|  |             0, | ||||||
|  |             0 | ||||||
|  |           ], | ||||||
|  |           [ | ||||||
|  |             384, | ||||||
|  |             384, | ||||||
|  |             384 | ||||||
|  |           ] | ||||||
|  |         ], | ||||||
|  |         "celltype": 0, | ||||||
|  |         "component": 0, | ||||||
|  |         "pattern": "const", | ||||||
|  |         "seed": 0, | ||||||
|  |         "shape": "cube", | ||||||
|  |         "value": 0 | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         "box": [ | ||||||
|  |           [117, 117, 177], | ||||||
|  |           [267, 267, 267] | ||||||
|  |         ], | ||||||
|  |         "celltype": 9, | ||||||
|  |         "center": [192, 192, 192], | ||||||
|  |         "component": 0, | ||||||
|  |         "count": 5500, | ||||||
|  |         "pattern": "voronoi", | ||||||
|  |         "radius": 75, | ||||||
|  |         "seed": 758960, | ||||||
|  |         "shape": "sphere", | ||||||
|  |         "value": 8 | ||||||
|  |       } | ||||||
|  |     ], | ||||||
|  |     "initialoutput": false, | ||||||
|  |     "randomseed": 758959 | ||||||
|  |   }, | ||||||
|  |   "Geometry": { | ||||||
|  |     "blockcount": [ | ||||||
|  |       4, | ||||||
|  |       4, | ||||||
|  |       3 | ||||||
|  |     ], | ||||||
|  |     "blockdefault": "fill", | ||||||
|  |     "blocksize": [ | ||||||
|  |       96, | ||||||
|  |       96, | ||||||
|  |       128 | ||||||
|  |     ], | ||||||
|  |     "blocktype": [ | ||||||
|  |       [ | ||||||
|  |         [ | ||||||
|  |           1 | ||||||
|  |         ] | ||||||
|  |       ] | ||||||
|  |     ] | ||||||
|  |   }, | ||||||
|  |   "Settings": { | ||||||
|  |     "deltat": 1.0, | ||||||
|  |     "deltax": 1.0, | ||||||
|  |     "handleFPE": "signal", | ||||||
|  |     "logger": { | ||||||
|  |       "group": 0, | ||||||
|  |       "steps": 100 | ||||||
|  |     }, | ||||||
|  |     "randomseed": 42, | ||||||
|  |     "statusoutput": 1, | ||||||
|  |     "timestepguard": 1, | ||||||
|  |     "timesteps": 5, | ||||||
|  |     "cuda": { | ||||||
|  |       "subblocks": { | ||||||
|  |         "blockDim": [8, 8, 8] | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										107
									
								
								experiments/scripts/gen/weak.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								experiments/scripts/gen/weak.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,107 @@ | |||||||
|  | import copy | ||||||
|  | import json | ||||||
|  | 
 | ||||||
|  | from dataclasses import dataclass | ||||||
|  | 
 | ||||||
|  | configurations = [ | ||||||
|  |     (1, 1, 1), | ||||||
|  |     (1, 1, 2), | ||||||
|  |     (1, 2, 2), | ||||||
|  |     (2, 2, 2), | ||||||
|  |     (2, 2, 4), | ||||||
|  |     (2, 4, 4), | ||||||
|  |     (4, 4, 4), | ||||||
|  |     (4, 4, 8), | ||||||
|  |     (4, 8, 8), | ||||||
|  |     (8, 8, 8) | ||||||
|  | ] | ||||||
|  | 
 | ||||||
|  | with open("templates/spheroid_weak.json") as template_file: | ||||||
|  |     template = json.load(template_file) | ||||||
|  | 
 | ||||||
|  | SIZE_X = 400 | ||||||
|  | SIZE_Y = 400 | ||||||
|  | SIZE_Z = 400 | ||||||
|  | 
 | ||||||
|  | for bx, by, bz in configurations: | ||||||
|  |     nastja_config = copy.deepcopy(template) | ||||||
|  |     nastja_config["Geometry"]["blockcount"] = [bx, by, bz] | ||||||
|  |     nastja_config["Geometry"]["blocksize"] = [SIZE_X, SIZE_Y, SIZE_Z] | ||||||
|  | 
 | ||||||
|  |     # Fill the whole domain with ECM | ||||||
|  |     cells_filling = [ | ||||||
|  |         { | ||||||
|  |             "shape": "cube", | ||||||
|  |             "box": [ | ||||||
|  |               [0, 0, 0], | ||||||
|  |               [bx * SIZE_X, by * SIZE_Y, bz * SIZE_Z] | ||||||
|  |             ], | ||||||
|  |             "value": 0, | ||||||
|  |             "celltype": 0 | ||||||
|  |         } | ||||||
|  |     ] | ||||||
|  | 
 | ||||||
|  |     # Place a bunch of cells in each block to keep each rank busy | ||||||
|  |     for z in range(bz): | ||||||
|  |         for y in range(by): | ||||||
|  |             for x in range(bx): | ||||||
|  |                 sx = x * SIZE_X | ||||||
|  |                 sy = y * SIZE_Y | ||||||
|  |                 sz = z * SIZE_Z | ||||||
|  |                 cells_filling.append({ | ||||||
|  |                     "shape": "sphere", | ||||||
|  |                     "pattern": "voronoi", | ||||||
|  |                     "count": 5500, | ||||||
|  |                     "radius": 75, | ||||||
|  |                     "center": [sx + 200, sy + 200, sz + 200], | ||||||
|  |                     "box": [ | ||||||
|  |                         [sx + 110, sy + 110, sz + 110], | ||||||
|  |                         [sx + 290, sy + 290, sz + 290] | ||||||
|  |                     ], | ||||||
|  |                     "celltype": 9 | ||||||
|  |                 }) | ||||||
|  |     nastja_config["Filling"]["cells"] = cells_filling | ||||||
|  | 
 | ||||||
|  |     ntasks = bx * by * bz | ||||||
|  |     if ntasks < 4: | ||||||
|  |         nodes = 1 | ||||||
|  |         gpus_per_node = ntasks | ||||||
|  |     else: | ||||||
|  |         assert ntasks % 4 == 0 | ||||||
|  |         nodes = ntasks // 4 | ||||||
|  |         gpus_per_node = 4 | ||||||
|  | 
 | ||||||
|  |     label = f"weak400-t{ntasks:04}n{nodes:03}g{gpus_per_node}x{bx}y{by}z{bz}" | ||||||
|  | 
 | ||||||
|  |     with open(f"configs/measurements/weak/spheroid_{label}.json", "w") as config_file: | ||||||
|  |         json.dump(nastja_config, config_file, indent=2) | ||||||
|  | 
 | ||||||
|  |     batch_config = f"""#!/usr/bin/env bash | ||||||
|  | 
 | ||||||
|  | #SBATCH --job-name={label} | ||||||
|  | #SBATCH --account=hkf6 | ||||||
|  | #SBATCH --partition=booster | ||||||
|  | #SBATCH --nodes={nodes} | ||||||
|  | #SBATCH --ntasks={ntasks} | ||||||
|  | # Counted per node | ||||||
|  | #SBATCH --gres=gpu:{gpus_per_node} | ||||||
|  | #SBATCH --time=00:15:00 | ||||||
|  | #SBATCH --output=logs/{label}-%A_%a.log | ||||||
|  | #SBATCH --error=logs/{label}-%A_%a.log | ||||||
|  | #SBATCH --array=1-5 | ||||||
|  | 
 | ||||||
|  | SOURCE_DIR=/p/project/cellsinsilico/paulslustigebude | ||||||
|  | OUTPUT_DIR="/p/scratch/cellsinsilico/paul/nastja-out/{label}-${{SLURM_ARRAY_TASK_ID}}" | ||||||
|  | 
 | ||||||
|  | echo "outdir is ${{OUTPUT_DIR}}" | ||||||
|  | 
 | ||||||
|  | mkdir -p "${{OUTPUT_DIR}}" | ||||||
|  | source "${{SOURCE_DIR}}/activate-nastja-modules" | ||||||
|  | 
 | ||||||
|  | srun --unbuffered "${{SOURCE_DIR}}/nastja/build-cuda/nastja" \\ | ||||||
|  |   -c "${{SOURCE_DIR}}/ma/experiments/configs/measurements/weak/spheroid_{label}.json" \\ | ||||||
|  |   -o "${{OUTPUT_DIR}}" | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  |     with open(f"batch/measurements/weak/{label}", "w", encoding="utf8") as batch_config_file: | ||||||
|  |         batch_config_file.write(batch_config) | ||||||
| @ -128,5 +128,19 @@ def strong_dat(db, time): | |||||||
|         for tasks, time in values: |         for tasks, time in values: | ||||||
|             print(f"{tasks}\t{time}") |             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__": | if __name__ == "__main__": | ||||||
|     timing() |     timing() | ||||||
|  | |||||||
							
								
								
									
										100
									
								
								experiments/templates/spheroid_weak.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								experiments/templates/spheroid_weak.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,100 @@ | |||||||
|  | { | ||||||
|  |     "Comments": ["Celltype         Usage", "0                Dynamic ECM", "1-5             Not Used", "6               Liquid  ", "7               Apoptotic cell Type ", "8               Basic Non Dividing Cell type (surrounding)", "9               Cancer"], | ||||||
|  |     "Application": "Cells", | ||||||
|  |     "CellsInSilico": { | ||||||
|  |         "ecmdegradation": { | ||||||
|  |             "enabled": "false", | ||||||
|  |             "steps": 99999, | ||||||
|  |             "stochastic": "true", | ||||||
|  |             "probability": 0.5 | ||||||
|  |         }, | ||||||
|  |         "energyfunctions": ["Volume00", "Surface01", "Motility00", "Adhesion01", "DynamicECM00"], | ||||||
|  |         "liquid": 6, | ||||||
|  |         "volume": { | ||||||
|  |             "default": { | ||||||
|  |                 "storage": "const", | ||||||
|  |                 "value": 500 | ||||||
|  |             }, | ||||||
|  |             "lambda": [0, 0, 0, 0, 0, 0, 0, 7.5, 7.5, 7.5], | ||||||
|  |             "sizechange": [0, 0, 0, 0, 0, 0, 0, -0.05, 0, 0, 0, 0, 0, 0, 0] | ||||||
|  |         }, | ||||||
|  |         "surface": { | ||||||
|  |             "default": { | ||||||
|  |                 "storage": "const", | ||||||
|  |                 "value": 400 | ||||||
|  |             }, | ||||||
|  |             "lambda": [0, 0, 0, 0, 0, 0, 0, 5.625, 5.625, 1], | ||||||
|  |             "sizechange": [0, 0, 0, 0, 0, 0, 0, -0.05, 0, 0, 0, 0, 0, 0, 0, 0] | ||||||
|  |         }, | ||||||
|  |         "adhesion": { | ||||||
|  |             "matrix": [ | ||||||
|  |                 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], | ||||||
|  |                 [0, 0, 0, 0, 0, 0, 0, 0, 0, 450], | ||||||
|  |                 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], | ||||||
|  |                 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], | ||||||
|  |                 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], | ||||||
|  |                 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], | ||||||
|  |                 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], | ||||||
|  |                 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], | ||||||
|  |                 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], | ||||||
|  |                 [0, 450, 0, 0, 0, 0, 0, 0, 0, 50] | ||||||
|  |             ] | ||||||
|  |         }, | ||||||
|  |         "temperature": 50, | ||||||
|  |         "division": { | ||||||
|  |             "enabled": "true", | ||||||
|  |             "condition": ["", "", "", "", "", "", "", "", "", "( volume >= 0.9 * volume0 )  & ( rnd() <= 0.00001 ) & generation < 1"] | ||||||
|  |         }, | ||||||
|  |         "centerofmass": { | ||||||
|  |             "steps": 1 | ||||||
|  |         }, | ||||||
|  |         "signaling": { | ||||||
|  |             "enabled": false | ||||||
|  |         }, | ||||||
|  |         "orientation": { | ||||||
|  |             "enabled": true, | ||||||
|  |             "motility": "persistentRandomWalk", | ||||||
|  |             "persistenceMagnitude": 0.0, | ||||||
|  |             "recalculationtime": 200, | ||||||
|  |             "motilityamount": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] | ||||||
|  |         }, | ||||||
|  |         "visitor": { | ||||||
|  |             "stepwidth": 10, | ||||||
|  |             "checkerboard": "01" | ||||||
|  |         }, | ||||||
|  |         "cleaner": { | ||||||
|  |             "killDistance": 20 | ||||||
|  |         }, | ||||||
|  |         "dynamicecm": { | ||||||
|  |             "enabled": true, | ||||||
|  |             "stepsPerMcs": 100, | ||||||
|  |             "pushSteps": 10, | ||||||
|  |             "pushWeight": 2, | ||||||
|  |             "ecmCellID": 0, | ||||||
|  |             "deltat": 0.1, | ||||||
|  |             "eta": 0.25, | ||||||
|  |             "k0": 0.1, | ||||||
|  |             "k1": 0.1, | ||||||
|  |             "c": 4, | ||||||
|  |             "alpha": 2, | ||||||
|  |             "d": 0.3, | ||||||
|  |             "phi": 1 | ||||||
|  |         } | ||||||
|  |     }, | ||||||
|  |     "Geometry": { | ||||||
|  |         "blockcount": null, | ||||||
|  |         "blocksize": null | ||||||
|  |     }, | ||||||
|  |     "Settings": { | ||||||
|  |         "randomseed": 0, | ||||||
|  |         "timesteps": 20, | ||||||
|  |         "statusoutput": 1 | ||||||
|  |     }, | ||||||
|  |     "DefineFunctions": [ | ||||||
|  |         "r_angle()=360*rnd()", | ||||||
|  |         "r_size()=400*rnd()" | ||||||
|  |     ], | ||||||
|  |     "Filling": { | ||||||
|  |         "cells": null | ||||||
|  |     } | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user