# prosimengineering/prosim_calc architecture

> Architecture diagram of the GitHub repository prosimengineering/prosim_calc, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-30). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/prosimengineering/prosim_calc
- Repository: https://github.com/prosimengineering/prosim_calc

## Overview

Prosim is an Electron desktop application for importing Nastran FEA files, browsing and editing normalized model/results data, and running fastener-joint calculations. The main user workflow is selecting a project/file, parsing and normalizing it into a solver-independent dataset, then querying and viewing categories or opening the calculation workspace. The graph also preserves the fastener library and supporting engineering packages. The README is empty, and several main-process and library paths are unsampled, so those areas are shown without guessed call relationships.

Main entry points: [`packages/core/src/dataModel.ts`](https://github.com/prosimengineering/prosim_calc/blob/master/packages/core/src/dataModel.ts) (Standard FEA dataset), [`apps/desktop/src/renderer/App.tsx`](https://github.com/prosimengineering/prosim_calc/blob/master/apps/desktop/src/renderer/App.tsx) (Application shell), [`apps/desktop/src/shared/ipc.ts`](https://github.com/prosimengineering/prosim_calc/blob/master/apps/desktop/src/shared/ipc.ts) (Typed IPC contract), [`apps/desktop/src/renderer/calc/CalcWorkspace.tsx`](https://github.com/prosimengineering/prosim_calc/blob/master/apps/desktop/src/renderer/calc/CalcWorkspace.tsx) (Calculation workspace)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_desktop["Desktop experience"]
  node_app["Application shell<br/>[App.tsx]"]
  node_browser["Data browser<br/>[MainWorkspace.tsx]"]
  node_calcui["Calculation workspace<br/>[CalcWorkspace.tsx]"]
  node_fastenerui["Fastener definitions"]
  node_ipc["Typed IPC contract<br/>[ipc.ts]"]
  node_preload["Preload bridge<br/>[index.ts]"]
end

subgraph group_import["Import and parsing"]
  node_worker["Import worker"]
  node_protocol["Worker protocol"]
  node_registry["Parser registry"]
  node_parsercontract["Parser registry contract<br/>[parser.ts]"]
  node_op2["Nastran OP2 parser<br/>[feaParser.ts]"]
  node_op2reader["OP2 decoding<br/>[op2Reader.ts]"]
  node_demux["OP2 datablocks"]
  node_bdf["Nastran BDF parser<br/>[feaParser.ts]"]
end

subgraph group_engineering["Engineering domain"]
  node_dataset["Standard FEA dataset<br/>[dataModel.ts]"]
  node_query["Dataset query layer<br/>[query.ts]"]
  node_units["Units and quantities<br/>[units.ts]"]
  node_fastener["Fastener joint calculations<br/>[fastenerJoint.ts]"]
  node_assembly["FEA assembly<br/>[feaAssembly.ts]"]
  node_force["Plate force derivation"]
  node_calcengine["Calculation registry<br/>[registry.ts]"]
end

subgraph group_state["Application state"]
  node_projects[("Project storage<br/>[projectsStore.ts]")]
  node_library[("Fastener library storage<br/>[libraryStore.ts]")]
  node_settings[("Settings storage<br/>[settingsStore.ts]")]
end

node_user(("Engineer"))

node_user -->|"uses"| node_app
node_app -->|"renders"| node_browser
node_app -->|"renders"| node_calcui
node_app -->|"requests data"| node_ipc
node_browser -->|"requests data"| node_ipc
node_calcui -->|"renders"| node_fastenerui
node_calcui -->|"requests data"| node_ipc
node_ipc -->|"exposed by"| node_preload
node_worker -->|"creates registry"| node_registry
node_worker -->|"exchanges messages"| node_protocol
node_registry -->|"uses contract"| node_parsercontract
node_parsercontract -->|"normalizes into"| node_dataset
node_op2 -->|"decodes with"| node_op2reader
node_op2reader -->|"demultiplexes"| node_demux
node_bdf -->|"normalizes into"| node_dataset
node_op2 -->|"normalizes into"| node_dataset
node_query -->|"queries"| node_dataset
node_fastener -->|"uses domain model"| node_dataset
node_assembly -->|"derives forces with"| node_force

click node_app "https://github.com/prosimengineering/prosim_calc/blob/master/apps/desktop/src/renderer/App.tsx"
click node_browser "https://github.com/prosimengineering/prosim_calc/blob/master/apps/desktop/src/renderer/components/MainWorkspace.tsx"
click node_calcui "https://github.com/prosimengineering/prosim_calc/blob/master/apps/desktop/src/renderer/calc/CalcWorkspace.tsx"
click node_fastenerui "https://github.com/prosimengineering/prosim_calc/blob/master/apps/desktop/src/renderer/calc/FastenerDefinitionsTable.tsx"
click node_ipc "https://github.com/prosimengineering/prosim_calc/blob/master/apps/desktop/src/shared/ipc.ts"
click node_preload "https://github.com/prosimengineering/prosim_calc/blob/master/apps/desktop/src/preload/index.ts"
click node_worker "https://github.com/prosimengineering/prosim_calc/blob/master/apps/desktop/src/main/importWorkerEntry.ts"
click node_protocol "https://github.com/prosimengineering/prosim_calc/blob/master/apps/desktop/src/main/importWorkerProtocol.ts"
click node_registry "https://github.com/prosimengineering/prosim_calc/blob/master/apps/desktop/src/main/parserRegistrySetup.ts"
click node_parsercontract "https://github.com/prosimengineering/prosim_calc/blob/master/packages/core/src/parser.ts"
click node_op2 "https://github.com/prosimengineering/prosim_calc/blob/master/packages/fea-parsers/nastran/src/feaParser.ts"
click node_op2reader "https://github.com/prosimengineering/prosim_calc/blob/master/packages/fea-parsers/nastran/src/op2Reader.ts"
click node_demux "https://github.com/prosimengineering/prosim_calc/blob/master/packages/fea-parsers/nastran/src/container/datablockDemuxer.ts"
click node_bdf "https://github.com/prosimengineering/prosim_calc/blob/master/packages/fea-parsers/nastran-bdf/src/feaParser.ts"
click node_dataset "https://github.com/prosimengineering/prosim_calc/blob/master/packages/core/src/dataModel.ts"
click node_query "https://github.com/prosimengineering/prosim_calc/blob/master/packages/core/src/query.ts"
click node_units "https://github.com/prosimengineering/prosim_calc/blob/master/packages/core/src/units.ts"
click node_fastener "https://github.com/prosimengineering/prosim_calc/blob/master/packages/modules/fastener-joint/src/fastenerJoint.ts"
click node_assembly "https://github.com/prosimengineering/prosim_calc/blob/master/packages/modules/fastener-joint/src/feaAssembly.ts"
click node_force "https://github.com/prosimengineering/prosim_calc/blob/master/packages/modules/fastener-joint/src/middlePlateForceDerivation.ts"
click node_calcengine "https://github.com/prosimengineering/prosim_calc/blob/master/packages/calc-engine/src/registry.ts"
click node_projects "https://github.com/prosimengineering/prosim_calc/blob/master/apps/desktop/src/main/projectsStore.ts"
click node_library "https://github.com/prosimengineering/prosim_calc/blob/master/apps/desktop/src/main/libraryStore.ts"
click node_settings "https://github.com/prosimengineering/prosim_calc/blob/master/apps/desktop/src/main/settingsStore.ts"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_app,node_browser,node_calcui,node_fastenerui,node_ipc,node_preload toneBlue
class node_worker,node_protocol,node_registry,node_parsercontract,node_op2,node_op2reader,node_demux,node_bdf toneAmber
class node_dataset,node_query,node_units,node_fastener,node_assembly,node_force,node_calcengine toneMint
class node_projects,node_library,node_settings toneRose
class node_user toneIndigo
```

## Components

### Desktop experience

- [Application shell](https://github.com/prosimengineering/prosim_calc/blob/master/apps/desktop/src/renderer/App.tsx): `apps/desktop/src/renderer/App.tsx`
- [Data browser](https://github.com/prosimengineering/prosim_calc/blob/master/apps/desktop/src/renderer/components/MainWorkspace.tsx): `apps/desktop/src/renderer/components/MainWorkspace.tsx`
- [Calculation workspace](https://github.com/prosimengineering/prosim_calc/blob/master/apps/desktop/src/renderer/calc/CalcWorkspace.tsx): `apps/desktop/src/renderer/calc/CalcWorkspace.tsx`
- [Fastener definitions](https://github.com/prosimengineering/prosim_calc/blob/master/apps/desktop/src/renderer/calc/FastenerDefinitionsTable.tsx): `apps/desktop/src/renderer/calc/FastenerDefinitionsTable.tsx`
- [Typed IPC contract](https://github.com/prosimengineering/prosim_calc/blob/master/apps/desktop/src/shared/ipc.ts): `apps/desktop/src/shared/ipc.ts`
- [Preload bridge](https://github.com/prosimengineering/prosim_calc/blob/master/apps/desktop/src/preload/index.ts): `apps/desktop/src/preload/index.ts`

### Import and parsing

- [Import worker](https://github.com/prosimengineering/prosim_calc/blob/master/apps/desktop/src/main/importWorkerEntry.ts): `apps/desktop/src/main/importWorkerEntry.ts`
- [Worker protocol](https://github.com/prosimengineering/prosim_calc/blob/master/apps/desktop/src/main/importWorkerProtocol.ts): `apps/desktop/src/main/importWorkerProtocol.ts`
- [Parser registry](https://github.com/prosimengineering/prosim_calc/blob/master/apps/desktop/src/main/parserRegistrySetup.ts): `apps/desktop/src/main/parserRegistrySetup.ts`
- [Parser registry contract](https://github.com/prosimengineering/prosim_calc/blob/master/packages/core/src/parser.ts): `packages/core/src/parser.ts`
- [Nastran OP2 parser](https://github.com/prosimengineering/prosim_calc/blob/master/packages/fea-parsers/nastran/src/feaParser.ts): `packages/fea-parsers/nastran/src/feaParser.ts`
- [OP2 decoding](https://github.com/prosimengineering/prosim_calc/blob/master/packages/fea-parsers/nastran/src/op2Reader.ts): `packages/fea-parsers/nastran/src/op2Reader.ts`
- [OP2 datablocks](https://github.com/prosimengineering/prosim_calc/blob/master/packages/fea-parsers/nastran/src/container/datablockDemuxer.ts): `packages/fea-parsers/nastran/src/container/datablockDemuxer.ts`
- [Nastran BDF parser](https://github.com/prosimengineering/prosim_calc/blob/master/packages/fea-parsers/nastran-bdf/src/feaParser.ts): `packages/fea-parsers/nastran-bdf/src/feaParser.ts`

### Engineering domain

- [Standard FEA dataset](https://github.com/prosimengineering/prosim_calc/blob/master/packages/core/src/dataModel.ts): `packages/core/src/dataModel.ts`
- [Dataset query layer](https://github.com/prosimengineering/prosim_calc/blob/master/packages/core/src/query.ts): `packages/core/src/query.ts`
- [Units and quantities](https://github.com/prosimengineering/prosim_calc/blob/master/packages/core/src/units.ts): `packages/core/src/units.ts`
- [Fastener joint calculations](https://github.com/prosimengineering/prosim_calc/blob/master/packages/modules/fastener-joint/src/fastenerJoint.ts): `packages/modules/fastener-joint/src/fastenerJoint.ts`
- [FEA assembly](https://github.com/prosimengineering/prosim_calc/blob/master/packages/modules/fastener-joint/src/feaAssembly.ts): `packages/modules/fastener-joint/src/feaAssembly.ts`
- [Plate force derivation](https://github.com/prosimengineering/prosim_calc/blob/master/packages/modules/fastener-joint/src/middlePlateForceDerivation.ts): `packages/modules/fastener-joint/src/middlePlateForceDerivation.ts`
- [Calculation registry](https://github.com/prosimengineering/prosim_calc/blob/master/packages/calc-engine/src/registry.ts): `packages/calc-engine/src/registry.ts`

### Application state

- [Project storage](https://github.com/prosimengineering/prosim_calc/blob/master/apps/desktop/src/main/projectsStore.ts): `apps/desktop/src/main/projectsStore.ts`
- [Fastener library storage](https://github.com/prosimengineering/prosim_calc/blob/master/apps/desktop/src/main/libraryStore.ts): `apps/desktop/src/main/libraryStore.ts`
- [Settings storage](https://github.com/prosimengineering/prosim_calc/blob/master/apps/desktop/src/main/settingsStore.ts): `apps/desktop/src/main/settingsStore.ts`

### Other components

- **Engineer**

## Connections

- Engineer → Application shell: uses (evidence: `apps/desktop/src/renderer/App.tsx`)
- Application shell → Data browser: renders (evidence: `apps/desktop/src/renderer/App.tsx`)
- Application shell → Calculation workspace: renders (evidence: `apps/desktop/src/renderer/App.tsx`)
- Application shell → Typed IPC contract: requests data (evidence: `apps/desktop/src/renderer/App.tsx`)
- Data browser → Typed IPC contract: requests data (evidence: `apps/desktop/src/renderer/components/MainWorkspace.tsx`)
- Calculation workspace → Fastener definitions: renders (evidence: `apps/desktop/src/renderer/calc/CalcWorkspace.tsx`)
- Calculation workspace → Typed IPC contract: requests data (evidence: `apps/desktop/src/renderer/calc/CalcWorkspace.tsx`)
- Typed IPC contract → Preload bridge: exposed by (evidence: `apps/desktop/src/shared/ipc.ts`)
- Import worker → Parser registry: creates registry (evidence: `apps/desktop/src/main/importWorkerEntry.ts`)
- Import worker → Worker protocol: exchanges messages (evidence: `apps/desktop/src/main/importWorkerEntry.ts`)
- Parser registry → Parser registry contract: uses contract (evidence: `apps/desktop/src/main/parserRegistrySetup.ts`)
- Parser registry contract → Standard FEA dataset: normalizes into (evidence: `packages/core/src/parser.ts`)
- Nastran OP2 parser → OP2 decoding: decodes with (evidence: `packages/fea-parsers/nastran/src/feaParser.ts`)
- OP2 decoding → OP2 datablocks: demultiplexes (evidence: `packages/fea-parsers/nastran/src/op2Reader.ts`)
- Nastran BDF parser → Standard FEA dataset: normalizes into (evidence: `packages/fea-parsers/nastran-bdf/src/feaParser.ts`)
- Nastran OP2 parser → Standard FEA dataset: normalizes into (evidence: `packages/fea-parsers/nastran/src/feaParser.ts`)
- Dataset query layer → Standard FEA dataset: queries (evidence: `packages/core/src/query.ts`)
- Fastener joint calculations → Standard FEA dataset: uses domain model (evidence: `packages/modules/fastener-joint/src/fastenerJoint.ts`)
- FEA assembly → Plate force derivation: derives forces with (evidence: `packages/modules/fastener-joint/src/feaAssembly.ts`)
