Simulizer
CasesStackDocsDownload
WebAssembly · TensorFlow.js · KSA 2026

Less code.
More simulation.

블록 코딩이나 직접 코드 작성으로 시뮬레이션을 빠르게 제작하고, WebAssembly로 컴파일된 엔진이 브라우저에서 곧장 시각화하는 범용 시뮬레이션 툴킷입니다. 설치도, 학습 곡선도, 비싼 라이선스 비용도 없습니다.

02 · Live cases

Why Simulizer?

Simulizer를 이용하면 코딩을 할 줄 모르는 사람도, 코딩을 할 줄 아는 사람도 누구나 빠르게 시뮬레이션을 만들고, 결과를 보면서 아이디어를 발전시킬 수 있습니다. 연구자들이 Simulizer로 무엇을 만들고 있는지, 실제 사례를 통해 확인할 수 있습니다.

live · simulizer.net
heat-diffusion-2d.simulizer· BlockWorkspaceWASM
A · Heat diffusion 2D

Heat spreads out from the center.

100×100 격자 한가운데에 디랙 델타로 주어진 초기 온도가 시간에 따라 동심원으로 퍼집니다. 각 셀의 라플라시안 ∇²T를 이웃 네 방향의 온도 차이로 근사해 ∂T/∂t = α∇²T를 explicit FTCS로 적분, 매 스텝마다 show_mat으로 분포를 관찰합니다.

블록으로 라플라시안 연산자와 시간 적분 루프를 조립하기만 하면 됩니다. C·Python 연동도, 별도 플롯 코드도 전혀 필요하지 않습니다.

Simulizer Coding time1 hour40 min
B · EM wave packet in C++

A wave pushes particles around.

1차원 격자에서 외부 전류원이 만든 전자기파가 중앙의 전자 입자들을 가속·진동시키는 과정을 추적하는 플라즈마 모델입니다. 맥스웰 방정식을 FDTD로 풀어 전기장 E와 자기장 B를 갱신하고, 선형 보간으로 장을 샘플링한 뒤 Boris pusher(반가속 → 회전 → 반가속)로 입자를 적분합니다.

Monaco + clangd LSP로 C++을 직접 작성하고, simstd.hppshow_graph() 한 줄로 매 스텝 결과를 브라우저 패널로 스트림합니다. matplotlib도, Python FFI도 필요하지 않습니다.

Simulizer Coding time6 hour3 hours
em-wave-packet.cpp· ClangWorkspaceclangd
#include "simstd.hpp"

constexpr int    N3  = 500, Nt = 1000, Np = 30;
constexpr double dt  = 1e-16, dx = 4e-8;
constexpr double c   = 3e8,   mu = 1.257e-6;
constexpr double per = 2.5e-15;

int worker() {
    std::vector<double> E1(N3), E2(N3), B1(N3), B2(N3), J1(N3);
    std::vector<double> x3p(Np), v3p(Np);

    for (int p = 0; p < Np; ++p)
        x3p[p] = dx * (N3 / 2 + p);

    auto trail = simstd::series<double>();

    for (int i = 0; i < Nt; ++i) {
        double t = dt * i;
        J1[1] = 4.0 / (mu * c * dx)
              * std::cos(2 * M_PI / per * t)
              * std::exp(-std::pow((t - 6 * per) / per, 2));

        // Faraday: ∂B/∂t = −∇×E
        for (int k = 0; k < N3 - 1; ++k) {
            B1[k] += (E2[k + 1] - E2[k]) * dt / dx;
            B2[k] -= (E1[k + 1] - E1[k]) * dt / dx;
        }

        // Ampère: ∂E/∂t = c²(∇×B − μJ)
        for (int k = 1; k < N3; ++k) {
            E1[k] -= (B2[k] - B2[k - 1]) * c*c*dt/dx + J1[k]*mu*c*c*dt;
            E2[k] += (B1[k] - B1[k - 1]) * c*c*dt/dx;
        }

        // Boris pusher (half-accel → rotate → half-accel)
        push_particles(x3p, v3p, E1, B2, dt);

        simstd::push(trail, E1);
    }

    simstd::show_graph(trail);
    return 0;
}
03 · Block Workspace

Drag. Snap.
Simulate.

코딩을 전혀 할 줄 모르는 사람도 직관적인 인터페이스로 시뮬레이션을 만들 수 있습니다. 함수 정의, 변수 선언, 산술 연산부터 텐서·벡터 연산, 경계 조건까지 시뮬레이션에 필요한 모든 기능이 블록으로 제공되고, 블록을 조립하는 것만으로 시뮬레이션이 완성됩니다.

01 / 05Drag the blocks

Make a simulation with blocks.

함수 정의, 변수 선언(int·float), 산술 연산. 시뮬레이션을 짜는 데 필요한 모든 기본적인 기능들이 카테고리별로 정리돼 있습니다.
basics.simulizerBlockWorkspaceWASM
02 / 05Advanced math

Tensors and vectors, as blocks.

n차원 텐서 생성·인덱싱, 벡터 연산, 경계 조건까지 코드 블록으로 제공됩니다. 실제 열확산 시뮬에서 쓰는 텐서·벡터 블록 트리가 그대로 들어 있습니다.
heat-diffusion-2d.simulizerBlockWorkspace · tensor opsWASM
03 / 05Boundary tool

Draw the boundary, not the code.

스크립트 언어를 바탕으로 2D·3D 경계 조건을 정의할 수 있습니다. 모든 경계 조건은 코드 블록으로 사용할 수 있습니다.
boundary-3dBoundaryTool · outputWASM
3D boundary surface plot
04 / 05Export

Ship as Python or C++.

완성한 블록 트리는 번역 기능을 통해 Python, C++, Javascript 코드로 빠져나와 프로토타입을 넘어서 실제 개발에 사용됩니다.
em-wave-packet.pyblock2py outputPython
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
import numpy as np
from simstd import *

def main():
    N3 = 500
    Nt = 1000
    Np = 30
    dx3 = 4e-08
    dt = 1e-16
    VC = 299792458
    q = 1.602e-19
    m = 9.11e-31
    MU = 1.257e-06
    per = 2.5e-15

    E1 = np.zeros(500); E2 = np.zeros(500); E3 = np.zeros(500)
    B1 = np.zeros(500); B2 = np.zeros(500); B3 = np.zeros(500)
    B1avg = np.zeros(500); B2avg = np.zeros(500)
    J1 = np.zeros(500); J2 = np.zeros(500); J3 = np.zeros(500)
    x1p = np.zeros(30); x2p = np.zeros(30); x3p = np.zeros(30)
    v1p = np.zeros(30); v2p = np.zeros(30); v3p = np.zeros(30)
    E1p = np.zeros(30); E2p = np.zeros(30); E3p = np.zeros(30)
    B1p = np.zeros(30); B2p = np.zeros(30); B3p = np.zeros(30)

    for i in range(Np):
        x3p[i] = dx3 * (N3 // 2) + i * dx3

    progress = debug_bar(0, Nt)
    se1 = debug_series()
    se2 = debug_series()

    for i in range(Nt):
        debug_bar_set(progress, i)
        t = dt * i
        J1[1] = 4 / (MU * VC * dx3) * (
            np.cos(2 * 3.141592 / per * t)
            * np.exp(-((t - 6*per) ** 2) / (per * per))
        )

        # FDTD: B half-step
        for k in range(N3 - 1):
            B1avg[k] = B1[k]; B2avg[k] = B2[k]
            B1[k] += (E2[k+1] - E2[k]) * dt / dx3
            B2[k] += -(E1[k+1] - E1[k]) * dt / dx3
            B1avg[k] = (B1[k] + B1avg[k]) / 2
            B2avg[k] = (B2[k] + B2avg[k]) / 2

        # Boris pusher: half-accel → rotation → half-accel
        Th = 0.5 * dt * q / m
        for p in range(Np):
            k = int(x3p[p] / dx3)
            x3c = dx3 * k
            E1p[p] = ((x3p[p] - x3c) * E1[k+1] + (x3c + dx3 - x3p[p]) * E1[k]) / dx3
            E2p[p] = ((x3p[p] - x3c) * E2[k+1] + (x3c + dx3 - x3p[p]) * E2[k]) / dx3

            V1 = v1p[p] + Th * E1p[p]
            V2 = v2p[p] + Th * E2p[p]
            V3 = v3p[p] + Th * E3p[p]
            W1 = V1 / Th + V2*B3p[p] - V3*B2p[p]
            W2 = V2 / Th + V3*B1p[p] - V1*B3p[p]
            W3 = V3 / Th + V1*B2p[p] - V2*B1p[p]
            BBGG = B1p[p]**2 + B2p[p]**2 + B3p[p]**2 + 1/(Th*Th)
            W1 = W1 * 2 / BBGG; W2 = W2 * 2 / BBGG; W3 = W3 * 2 / BBGG

            v1p[p] = V1 + W2*B3p[p] - W3*B2p[p] + Th * E1p[p]
            v2p[p] = V2 + W3*B1p[p] - W1*B3p[p] + Th * E2p[p]
            v3p[p] = V3 + W1*B2p[p] - W2*B1p[p] + Th * E3p[p]
            x1p[p] += v1p[p] * dt
            x2p[p] += v2p[p] * dt
            x3p[p] += v3p[p] * dt

        # E full-step
        for k in range(1, N3):
            E1[k] += -(B2[k] - B2[k-1]) * VC * VC * dt / dx3
            E1[k] += -J1[k] * MU * VC * VC * dt
            E2[k] += (B1[k] - B1[k-1]) * VC * VC * dt / dx3

        if i > 63:
            debug_set_holder(se1)
            graph_arr_f64(E1)
            debug_set_holder(se2)
            graph_arr_range_f64(x1p, -1e-19, 1e-19)
05 / 05Run in browser

Compile and run, right here.

JSON → IR → WAT → WASM을 통해 WABT로 빌드된 바이트가 Web Worker로 넘어가고, 브라우저 화면에 실시간으로 그려집니다. 아무것도 설치하지 않아도 됩니다.
heat-diffusion-2d.simulizerBlockWorkspace · runningWASM
basics.simulizerBlockWorkspaceWASM
04 · Clang Workspace

C++. With one-line
visualization.

개발을 할 줄 아는 사람도 Monaco 에디터와 clangd LSP로 구성된 익숙한 개발 환경에서 작업할 수 있습니다. simstd.hpp 한 줄로 귀찮은 시각화 작업을 간단하게 넘기고, 빠르게 결과를 구현해 아이디어에 집중할 수 있는 환경을 제공합니다.

01 / 04Monaco editor

Full C++ editor, dark mode.

VS Code와 동일한 경험을 주는 Monaco 에디터에서 멀티탭·검색·단축키가 전부 동일하게 주어집니다. 시뮬레이션을 위해 새 IDE를 배울 필요가 없습니다.
1to10.cppClangWorkspace · MonacoMonaco
02 / 04simstd.hpp

Three lines, three plots.

simstd.hpp 한 줄을 include하고 아래 세 함수 중 하나만 부르면 매 스텝의 결과가 브라우저 패널에 바로 그려집니다. matplotlib도, Python FFI도 필요하지 않습니다.
simstd.hpp3 visualization functionsinclude
show_mat(matrix m)2D 행렬을 히트맵으로
show_graph(tensor1d t)1D 시계열을 라인 그래프로
show_field(tensor2d vx, vy)2D 벡터장을 quiver로
03 / 04Math types

Tensors and vectors, in C++.

블록에서 쓰던 텐서·벡터·경계조건 자료형을 C++에서도 동일한 API로 사용합니다. 아래는 열확산 5-point Laplacian을 텐서 그대로 푼 코드입니다.
heat-diffusion-2d.cppClangWorkspace · simstdC++17
123456789101112131415161718192021222324252627282930313233343536373839404142434445
#include "simstd.hpp"

void main() {
    std::vector<i32> S = {100, 100};
    Tensor<f64> Tf = Tensor<f64>({100, 100});
    Tensor<f64> T  = Tensor<f64>({100, 100});

    // Dirac delta seed at the center
    T(50, 50) = 50;
    T(49, 50) = 50; T(51, 50) = 50;
    T(50, 49) = 50; T(50, 51) = 50;
    Tf(50, 50) = 50;

    f64 dx = 0.01;
    f64 alpha = 0.01;
    i32 nt = 1000;
    f64 dt = 0.002;
    f64 lapl = 0;

    i32 p = debug_bar(0, nt);
    debug_set_holder(debug_series());

    for (i32 k = 0; k < nt; k++) {
        debug_bar_set(p, k);

        // 5-point Laplacian, FTCS step
        for (i32 i = 1; i < 98; i++) {
            for (i32 j = 1; j < 98; j++) {
                lapl = (T(i+1, j) + T(i-1, j) + T(i, j+1) + T(i, j-1)
                        - T(i, j) * 4) / (dx * dx);
                Tf(i, j) = T(i, j) + lapl * (dt * alpha);
            }
        }

        // Copy Tf -> T
        for (i32 i = 0; i < 99; i++)
            for (i32 j = 0; j < 99; j++)
                T(i, j) = Tf(i, j);

        show_mat(T);  // ← streams a frame to the result panel
    }
    debug_set_holder(0);
    debug_log(T);
}
04 / 04Run in browser

Compile and run, right here.

Emscripten이 WASM SIDE_MODULE을 빌드하고, 런타임에 동적으로 로드돼 Web Worker에서 실행됩니다. 결과는 postMessage로 결과 패널까지 곧장 전달됩니다.
em-wave-packet.cppClangWorkspace · runningWASM
1to10.cppClangWorkspace · MonacoMonaco
05 · Beyond the workspace

Built-in,
not bolt-on.

워크스페이스 옆에 자연어 LLM, LaTeX OCR, SAM2 트래커, 백엔드 선택까지 한 자리에 있습니다. 따로 설치할 도구도, 별도의 비싼 라이선스도 필요 없습니다. 시뮬레이션을 만들면서 필요한 도구가 생기면, 그 자리에서 바로 사용하면 됩니다.

01 / 07AI Assistant

Describe it in Korean.

Groq openai/gpt-oss-120b에 자연어로 묘사하면 응답이 SSE로 흘러나옵니다. 받은 Python을 py2block이 Blockly JSON으로 환원하고, 트리 diff가 새로 생긴·사라질 블록을 색깔로 미리 보여줍니다.
ai-assistantGroq · gpt-oss-120bstream
AI Assistant streaming response
02 / 07LaTeX Block

Type math, get blocks.

LaTeX 수식을 입력하면 그대로 Blockly 식으로 파싱됩니다. moo 렉서로 토큰화한 뒤 트리로 환원하고, KaTeX 미리보기까지 한 번에 보여줍니다.
latex-blockmoo lexer · KaTeXparse
LaTeX block
03 / 07LaTeX OCR

Paper screenshot → blocks.

논문 수식 이미지를 붙여넣으면 OCR이 LaTeX로 변환하고, 그 LaTeX가 다시 블록으로 환원됩니다. 손으로 옮겨 적을 일이 없습니다.
latex-ocrimage → LaTeX → blocksOCR
LaTeX OCR
04 / 07SAM2 Tracker

Pull data out of any video.

Meta SAM2 모델로 영상 속 객체를 추적합니다. AI 서버(NVIDIA H100)에서 무거운 GPU 작업을 처리하고, 추출된 궤적이 시뮬레이션 입력으로 직행합니다.
sam2-trackerMeta SAM2 · H100GPU
SAM2 video tracker
05 / 07Backend select

WebGPU. WebGL. CPU.

텐서 연산 백엔드를 워크스페이스에서 즉시 전환합니다. GPU가 있으면 WebGPU를, 없으면 WebGL이나 CPU로 자동 전환됩니다.
compute backendtfjs · 4.22WebGPU
WebGPUApple M3 · 8c GPUready
WebGLfallback · GPU
CPUsingle-thread
06 / 07EXE build

Compile to desktop.

동일한 워크스페이스를 MinGW로 cross-compile해 Windows·macOS·Linux 실행 파일로 빌드합니다. 클릭 한 번이면 끝납니다.
heat-diffusion-2dClangWorkspaceready
emcc · mingw-link → sim.exe
07 / 07File share

Send a link, not a zip.

워크스페이스를 링크 한 줄로 공유합니다. 받는 사람은 로그인 없이 같은 상태에서 시뮬레이션을 이어갈 수 있습니다.
share-dialogmodalshare
screenshot pending
ai-assistantGroq · gpt-oss-120bstream
AI Assistant streaming response
06 · Why us

Not MATLAB.
Not COMSOL.

MATLAB·COMSOL·LabVIEW는 강력하지만 라이선스 비용과 학습 난이도가 진입 장벽입니다. Simulizer는 라이선스 0원, 브라우저만 있으면 됩니다.

MATLABCOMSOLLabVIEW직접 코딩Simulizer
비용수백만원/년수백~수천만원유상 ($500–2,800/년)무료무료 · 웹
학습 난이도중~상매우 높음중~상매우 낮음
코드 작성필요부분 필요부분 필요필요선택
실행 환경데스크톱데스크톱데스크톱로컬브라우저
AI 보조△ Copilot 유상△ Chatbot (API키)△ Nigel AI○ 외부 도구○ 내장
시각화별도 작업××FFI 필요simstd.hpp 한 줄
영상 트래커△ CV Toolbox 유료×△ Vision Module 유료별도 라이브러리○ SAM2
LaTeX 지원××××○ OCR 내장
07 · Stack

Built with.

Frontend
FrameworkNext.js 16.2 · React 19 · TypeScript
Block codingBlockly 12.5.1
WASM compilewabt 1.0.39
TensorTensorFlow.js 4.22 + WebGPU
C++ editorMonaco · clangd LSP (monaco-vscode-api 25.1)
ChartsPlotly.js 3.5
LaTeXKaTeX 0.16.45 · moo 0.5 lexer
SSE@microsoft/fetch-event-source 2.0
backend-api
CompilerC++17 · libclang · Emscripten · MinGW g++
LLMGroq openai/gpt-oss-120b · Ollama gemma3:27b
LSP bridgeclangd ↔ WebSocket · per-session workspace
backend-ai
ML · GPUMeta SAM2 · PyTorch · NVIDIA H100 PCIe (CUDA 12.6)
InfraKSA Turing · Jupyter Hub + jupyter-server-proxy 4.4
backend-auth
AuthGoogle OAuth 2.0 + JWT HS256 cookie (30d)
DBSQLite WAL + yoyo-migrations · slowapi rate limit
08 · Impact

What changes.

상업 도구의 진입장벽 해소

라이선스 비용 없이, 학습 곡선 없이, 코드 작성 없이도 시뮬레이션을 만들 수 있습니다.

시각화 구현 부담 제거

simstd.hpp 한 줄로 matplotlib·Python FFI 파이프라인을 대체합니다.

Python·C++ 이식 확장성

블록 작업물을 코드로 내보내 자기 환경·도구에서 계속 발전시킬 수 있습니다.

외부 도구 의존도 감소

AI 보조·LaTeX OCR·영상 객체 추적까지 별도 설치나 라이선스 없이 단일 웹 환경에서 처리됩니다.

프로토타입 생산성 향상

첫 세션부터 결과에 도달하므로 도구 학습이 아닌 가설 검증에 집중할 수 있습니다.

FINAL · 06

No install.
No license.

KAIST 부설 한국과학영재학교25-059 백재원 · 25-126 홍준서정보과학 프로젝트 발표대회 · 2026