{"id":51641627,"url":"https://github.com/test1card/femrep","last_synced_at":"2026-07-13T19:33:02.548Z","repository":{"id":368364224,"uuid":"1284460799","full_name":"test1card/femrep","owner":"test1card","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-30T08:45:42.000Z","size":69,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-30T09:26:21.271Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/test1card.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-29T22:15:57.000Z","updated_at":"2026-06-30T08:45:46.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/test1card/femrep","commit_stats":null,"previous_names":["test1card/femrep"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/test1card/femrep","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/test1card%2Ffemrep","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/test1card%2Ffemrep/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/test1card%2Ffemrep/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/test1card%2Ffemrep/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/test1card","download_url":"https://codeload.github.com/test1card/femrep/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/test1card%2Ffemrep/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35434586,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-13T02:00:06.543Z","response_time":119,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-07-13T19:33:01.972Z","updated_at":"2026-07-13T19:33:02.538Z","avatar_url":"https://github.com/test1card.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# femrep — femis-governed FEM report generator\n\nTurns Ansys / Nastran result files (`.rst`, `.rth`, `.f06`) into **defensible,\nstandardized engineering reports** (PDF + DOCX). Reporter only — it ingests\nresults your solve scripts already produce; it never drives the solver.\n\nGoverned by [femis](https://github.com/test1card/femis-skill) (engineering claim\ndiscipline, provenance, gates, no autonomous sign-off) and disciplined by\n[ponytail](https://github.com/DietrichGebert/ponytail) (minimalism / YAGNI).\n\n## Why it exists\n\nA \"beautiful\" CAE report that omits provenance, gate verdicts, and honest claim\nphrasing is *worse than a plain one* — it looks authoritative while being\nuntrustworthy. femrep is the thin layer that makes a report **defensible**, not\njust pretty: every number is tied to its deck + result via a run manifest,\nphrased through public report language, and backed by a gates checklist that is\ncomputed — never invented to \"pass.\"\n\n## Supported backends\n\n| Format | Backend | Notes |\n|---|---|---|\n| Ansys `.rst` | DPF | structural: von-Mises stress, displacement, contour |\n| Ansys `.rth` | DPF | thermal: temperature; multi-set transient sequences |\n| Nastran `.f06` | stdlib parser | SOL 153/159 thermal, transient + steady |\n| Nastran `.op2` | pyNastran (not wired yet) | fails loudly with a `.f06` companion hint |\n\n## Quick start\n\n```bash\n# install (editable, from the repo)\npip install -e \".[gui]\"\n\n# CLI — any backend\nfemrep path/to/result.rst --log solve.mntr --out report.pdf --html --package\nfemrep path/to/result.f06 --out report.docx --template client\nfemrep doctor\n\n# project/run library\nfemrep init DemoProject\nfemrep path/to/result.f06 --project femrep_projects/DemoProject --run-name run001 --html --package\n\n# mesh convergence wizard: CSV with h,f or h,result columns\nfemrep gci grids.csv --out gci_runs.json --qoi peak_temperature_K\n\n# batch mode: JSON with {\"runs\":[{\"result\":\"...\",\"out\":\"...\"}]}\nfemrep batch runs.json\n\n# bundled demo data\nfemrep examples/tiny_thermal.f06 --out demo_report.pdf --html --package\nfemrep gci examples/gci_points.csv --out demo_gci_runs.json --qoi demo_temperature\nfemrep batch examples/runs.json\n\n# custom report template (branding + section layout)\nfemrep path/to/result.f06 --out report.pdf --template-file my_company.json\n\n# desktop GUI (build + reuse templates visually)\nfemrep-gui\n```\n\n## Report templates\n\nA **template** is a reusable report definition — branding / title block (logo,\ncompany, customer, document number, colours, fonts) plus the **section layout**\n(which of the nine sections appear, in what order, with optional per-section\nintro text). Templates are per-project JSON files under\n`\u003cproject\u003e/templates/\u003cname\u003e.json`.\n\nBuild and reuse them in the GUI: open a project, then **Manage templates…** to\ncreate one from scratch or **seed it from a result file**, tick/reorder\nsections, fill in your branding, and Save. Pick it from the **Template** dropdown\nbefore *Generate report*. From the CLI, pass `--template-file \u003cname\u003e.json`. With\nno template, the full nine-section report renders exactly as before.\n\n### Russian GOST report (ГОСТ 7.32-2017)\n\nA template can set `profile: \"gost_ru\"` to emit a **fully Russian отчёт о НИР** as\nDOCX, structured and formatted per ГОСТ 7.32-2017 (титульный лист, реферат,\nсодержание, введение, нумерованная основная часть, заключение; Times New Roman\n14, полуторный интервал, поля 30/15/20/20 мм, сквозная нумерация). The реферат,\nвведение, and заключение are auto-generated from the results to minimize manual\nediting. Select **Шаблон → ГОСТ 7.32-2017 (DOCX, рус.)** in the GUI (no project needed), or:\n\n```bash\nfemrep result.f06 --out отчёт.docx --profile gost_ru\n```\n\nThe profile uses extra title-page fields (организация, УДК, город, год,\nруководители) editable in the template. The English default profile is\nunaffected.\n\nBoth renderers (PDF via reportlab, DOCX via python-docx) emit the same content:\ncover, summary, readiness, model, meshing, composites/CFRP, solve +\nconvergence, results (contour + time-history figures), mesh-independence (GCI),\ngovernance (gates + manifest). The optional HTML review includes the evidence\ndashboard, figure gallery, and a rotatable PyVista contour viewer when geometry\nis available.\n\n## Architecture\n\n```\nresult file (.rst/.rth/.f06)\n      │  backends/ (one adapter per format — same results.json schema)\n      ▼\n   extract.py        → results.json\n      │\n      ▼  govern.py (femis): manifest + claim phrasing + gates + GCI + readiness\n   manifest.json + checks.json\n      │\n      ▼  figures.py: pyvista contour + matplotlib time-history\n   *.png\n      │\n      ▼  report_pdf.py / report_docx.py\n   report.pdf / report.docx\n```\n\nEach layer reads the previous layer's JSON and is runnable standalone — the\nrepo's incremental `stage()` philosophy.\n\n## femis governance, enforced\n\n- **Issued-report language** on the cover; internal execution modes stay out of\n  customer-facing PDFs/DOCX files.\n- **Gates checklist** — units, connectivity, equilibrium/heat balance,\n  convergence, singularity, mesh-independence (GCI) — each computed, never\n  invented.\n- **Evidence readiness** — complete/missing/blocked evidence is summarized before\n  export so limitations stay visible.\n- **Run manifest** — solver + version, deck + result SHA-256, command line, units,\n  mesh, material sources. NAFEMS R0033 traceability spine.\n- **No autonomous sign-off** — femrep *assembles evidence*; a qualified engineer\n  *accepts* it.\n\n## Composites / CFRP\n\nNo ACP/CFRP data ships with the project. The composite section renders a\nsynthetic `[0/90/0]` T300/5208 CLT validation case (`cases/clt_synthetic.py`) —\nABD matrix, B≈0 (symmetric), Tsai-Wu first-ply-failure — so the section's\ngovernance (failure philosophy, mesh-objectivity regularization, as-draped\nangles) is demonstrated. Real ACP/`.rmed` data is wired when supplied.\n\n## Honest limitations\n\n- **Reporter only** — no solver orchestration. GCI ingests 3 pre-run results.\n- **`.op2`** is intentionally blocked until the binary adapter is wired. Use `.f06`;\n  if a same-stem companion exists, femrep points to it instead of rendering an empty report.\n- **Convergence** is read from Ansys `.mntr` (substep history) or `.f06` output\n  tables. The corpus is linear thermal — no Newton-Raphson residual history, and\n  the claim phrasing says so honestly.\n- **Distributed `.rst`** — point femrep at the consolidated `file.rst` (e.g. in a\n  Workbench `..._files/dp0/.../MECH/` folder). The per-domain `file0.rst..fileN.rst`\n  written by a multi-core solve are *not* time steps; femrep reads the\n  consolidated file directly and never expands those domains. Numbered transient\n  sequences are an Ansys *thermal* (`.rth`) concept only.\n- **DPF transport** — femrep runs DPF locally against your own Ansys install and\n  forces an in-process / unsecured-gRPC channel (`DPF_GRPC_MODE=insecure`), so a\n  single-machine run never needs the mutual-TLS certificates that `ansys-dpf-core`\n  ≥ 0.15 (Ansys 2026 R1) require by default. Override the env var if you connect\n  to a secured remote DPF server.\n\n## License\n\nApache-2.0.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftest1card%2Ffemrep","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftest1card%2Ffemrep","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftest1card%2Ffemrep/lists"}