Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"name": "MFC Container",
"image": "sbryngelson/mfc:latest-cpu",
"workspaceFolder": "/opt/MFC",
"settings": {
"terminal.integrated.shell.linux": "/bin/bash",
"editor.formatOnSave": true
},
}
82 changes: 82 additions & 0 deletions .github/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
node_modules/
package.json
yarn.lock

.venv/
.vscode/
src/*/autogen/

*.swo
*.swp

*:Zone.Identifier

.nfs*

__pycache__

*.egg-info

.DS_Store

# NVIDIA Nsight Compute
*.nsys-rep
*.sqlite

docs/*/initial*
docs/*/result*
docs/documentation/*-example.png
docs/documentation/examples.md

examples/*batch/*/
examples/**/D/*
examples/**/p*
examples/**/D_*
examples/**/*.inf
examples/**/*.inp
examples/**/*.dat
examples/**/*.o*
examples/**/silo*
examples/**/restart_data*
examples/**/*.out
examples/**/binary
examples/**/fort.1
examples/**/*.sh
examples/**/*.err
examples/**/viz/
examples/*.jpg
examples/*.png
examples/*/workloads/
examples/*/run-*/
examples/*/logs/
examples/**/*.f90
!examples/3D_lag_bubbles_shbubcollapse/input/lag_bubbles.dat
!examples/3D_lag_bubbles_bubblescreen/input/lag_bubbles.dat
workloads/

benchmarks/*batch/*/
benchmarks/*/D/*
benchmarks/*/p*
benchmarks/*/D_*
benchmarks/*/*.inf
benchmarks/*/*.inp
benchmarks/*/*.dat
benchmarks/*/*.o*
benchmarks/*/silo*
benchmarks/*/restart_data*
benchmarks/*/*.out
benchmarks/*/binary
benchmarks/*/fort.1
benchmarks/*/*.sh
benchmarks/*/*.err
benchmarks/*/viz/
benchmarks/*.jpg
benchmarks/*.png

*.mod

# Video Files
*.mp4
*.mov
*.mkv
*.avi
55 changes: 55 additions & 0 deletions .github/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
ARG BASE_IMAGE
FROM ${BASE_IMAGE}

ARG TARGET
ARG CC_COMPILER
ARG CXX_COMPILER
ARG FC_COMPILER
ARG COMPILER_PATH
ARG COMPILER_LD_LIBRARY_PATH

RUN apt-get update -y && \
if [ "$TARGET" != "gpu" ]; then \
apt-get install -y \
build-essential git make cmake gcc g++ gfortran bc\
python3 python3-venv python3-pip \
openmpi-bin libopenmpi-dev libfftw3-dev \
mpich libmpich-dev; \
else \
apt-get install -y \
build-essential git make cmake bc\
python3 python3-venv python3-pip \
libfftw3-dev \
openmpi-bin libopenmpi-dev; \
fi && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

ENV OMPI_ALLOW_RUN_AS_ROOT=1
ENV OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1
ENV PATH="/opt/MFC:$PATH"

COPY ../ /opt/MFC
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: Build Context Restricts Parent Directory Access

The COPY ../ instruction tries to access the parent directory of the build context. Since the build context is /mnt/share, ../ resolves to /mnt, preventing the repository files at /mnt/share from being copied into the image. This results in missing or incorrect files.

Fix in Cursor Fix in Web


ENV CC=${CC_COMPILER}
ENV CXX=${CXX_COMPILER}
ENV FC=${FC_COMPILER}
ENV PATH="${COMPILER_PATH}:$PATH"
ENV LD_LIBRARY_PATH="${COMPILER_LD_LIBRARY_PATH}:${LD_LIBRARY_PATH:-}"

RUN echo "TARGET=$TARGET CC=$CC_COMPILER FC=$FC_COMPILER" && \
cd /opt/MFC && \
if [ "$TARGET" = "gpu" ]; then \
./mfc.sh build --gpu -j $(nproc); \
else \
./mfc.sh build -j $(nproc); \
fi

RUN cd /opt/MFC && \
if [ "$TARGET" = "gpu" ]; then \
./mfc.sh test --dry-run --gpu -j $(nproc); \
else \
./mfc.sh test --dry-run -j $(nproc); \
fi

WORKDIR /opt/MFC
ENTRYPOINT ["tail", "-f", "/dev/null"]
132 changes: 132 additions & 0 deletions .github/workflows/docker.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
name: Containerization

on:
release:
types: [published]
workflow_dispatch:
inputs:
tag:
description: 'tag to containerize'
required: true

concurrency:
group: Containerization
cancel-in-progress: false

jobs:
Container:
strategy:
matrix:
config:
- { name: 'cpu', runner: 'ubuntu-22.04', base_image: 'ubuntu:22.04' }
- { name: 'gpu', runner: 'ubuntu-22.04', base_image: 'nvcr.io/nvidia/nvhpc:23.11-devel-cuda_multi-ubuntu22.04' }
- { name: 'gpu', runner: 'ubuntu-22.04-arm', base_image: 'nvcr.io/nvidia/nvhpc:23.11-devel-cuda_multi-ubuntu22.04' }
runs-on: ${{ matrix.config.runner }}
outputs:
tag: ${{ steps.clone.outputs.tag }}
steps:
- name: Free Disk Space
uses: jlumbroso/free-disk-space@main
with:
tool-cache: false
android: true
dotnet: true
haskell: true
large-packages: true
docker-images: true
swap-storage: true

- name: Login
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}

- name: Setup Buildx
uses: docker/setup-buildx-action@v3

- name: Setup QEMU
uses: docker/setup-qemu-action@v3

- name: Clone
id: clone
run: |
TAG="${{ github.event.inputs.tag || github.ref_name }}"
echo "tag=$TAG" >> $GITHUB_OUTPUT
echo "TAG=$TAG" >> $GITHUB_ENV
git clone --branch "$TAG" --depth 1 https://github.com/MFlowCode/MFC.git mfc

- name: Stage
run: |
sudo fallocate -l 8G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo mkdir -p /home/runner/tmp
export TMPDIR=/home/runner/tmp
free -h
sudo mkdir -p /mnt/share
sudo chmod 777 /mnt/share
cp -r mfc/* /mnt/share/
cp -r mfc/.git /mnt/share/.git
cp mfc/.github/Dockerfile /mnt/share/
cp mfc/.github/.dockerignore /mnt/share/
docker buildx create --name mfcbuilder --driver docker-container --use

- name: Build and push image (cpu)
if: ${{ matrix.config.name == 'cpu' }}
uses: docker/build-push-action@v6
with:
builder: mfcbuilder
context: /mnt/share
file: /mnt/share/Dockerfile
platforms: linux/amd64,linux/arm64
build-args: |
BASE_IMAGE=${{ matrix.config.base_image }}
TARGET=${{ matrix.config.name }}
CC_COMPILER=${{ 'gcc' }}
CXX_COMPILER=${{ 'g++' }}
FC_COMPILER=${{ 'gfortran' }}
COMPILER_PATH=${{ '/usr/bin' }}
COMPILER_LD_LIBRARY_PATH=${{ '/usr/lib' }}
tags: ${{ secrets.DOCKERHUB_USERNAME }}/mfc:${{ env.TAG }}-${{ matrix.config.name }}
push: true

- name: Build and push image (gpu)
if: ${{ matrix.config.name == 'gpu' }}
uses: docker/build-push-action@v5
with:
builder: default
context: /mnt/share
file: /mnt/share/Dockerfile
build-args: |
BASE_IMAGE=${{ matrix.config.base_image }}
TARGET=${{ matrix.config.name }}
CC_COMPILER=${{ 'nvc' }}
CXX_COMPILER=${{ 'nvc++' }}
FC_COMPILER=${{ 'nvfortran' }}
COMPILER_PATH=${{ '/opt/nvidia/hpc_sdk/Linux_x86_64/compilers/bin' }}
COMPILER_LD_LIBRARY_PATH=${{ '/opt/nvidia/hpc_sdk/Linux_x86_64/compilers/lib' }}
tags: ${{ secrets.DOCKERHUB_USERNAME }}/mfc:${{ env.TAG }}-${{ matrix.config.name }}-${{ matrix.config.runner}}
push: true

manifests:
runs-on: ubuntu-latest
needs: Container
steps:
- name: Login
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}

- name: Create and Push Manifest Lists
env:
TAG: ${{ needs.Container.outputs.tag }}
REGISTRY: ${{ secrets.DOCKERHUB_USERNAME }}/mfc
run: |
docker buildx imagetools create -t $REGISTRY:latest-cpu $REGISTRY:$TAG-cpu
docker manifest create $REGISTRY:$TAG-gpu $REGISTRY:$TAG-gpu-ubuntu-22.04 $REGISTRY:$TAG-gpu-ubuntu-22.04-arm
docker manifest create $REGISTRY:latest-gpu $REGISTRY:$TAG-gpu-ubuntu-22.04 $REGISTRY:$TAG-gpu-ubuntu-22.04-arm
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: Manifest Tags Overwritten, Causing Race Conditions

The latest-cpu and latest-gpu manifest tags are unconditionally overwritten by each workflow run. This means latest might point to an older or incorrect version, especially with concurrent runs or out-of-order processing, creating a race condition for the latest reference.

Fix in Cursor Fix in Web

docker manifest push $REGISTRY:$TAG-gpu
docker manifest push $REGISTRY:latest-gpu
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,11 @@ And here is a high amplitude acoustic wave reflecting and emerging through a cir


## Getting started
For a quick start, open a GitHub Codespace to load a pre-configured docker container to get familiar with MFC commands. Click <kbd> <> Code</kbd> (green button at top right) → <kbd>Codespaces</kbd> (right tab) → <kbd>+</kbd> (create a codespace).

You can navigate [to this webpage](https://mflowcode.github.io/documentation/md_getting-started.html) to get started using MFC!
****Notes:**** Codespaces is a free service with a monthly quota of compute time and storage usage. It is commended for testing commands, troubleshooting, and running simple case files without the need to install dependencies and build MFC on your device. Remember to save any important files locally before closing your codespace. To learn more, read through [how docker & containers work](https://mflowcode.github.io/documentation/docker.html).

Otherwise, you can navigate [to this webpage](https://mflowcode.github.io/documentation/md_getting-started.html) to get started using MFC!
It's rather straightforward.
We'll give a brief intro. here for MacOS.
Using [brew](https://brew.sh), install MFC's dependencies:
Expand Down
Loading