{
  "schemaVersion": 1,
  "stats": {
    "total": 734,
    "implemented": 734,
    "needsMethod": 0,
    "planned": 0
  },
  "items": [
    {
      "id": "g1-1",
      "group": "g1",
      "groupTitle": "Швейное производство",
      "topic": "Расход ткани по раскладке и партии",
      "status": "implemented",
      "calculatorId": "g1-1",
      "href": "calculator.html?atlasTool=g1-1#labAtlasTools",
      "formula": "Расход = ceil(изделия/изделий на раскладку) × (длина раскладки + концевые потери).",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "marker",
          "label": "Длина раскладки, м",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "per",
          "label": "Изделий в одной раскладке",
          "example": 5,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "qty",
          "label": "Изделий в заказе",
          "example": 100,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "ends",
          "label": "Концевые потери на каждую раскладку, м",
          "example": 0.1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Каждая раскладка используется целиком; остатки последней не оптимизируются. Ширина и ассортимент должны соответствовать раскладке.",
      "reference": {
        "expected": 202,
        "actual": 202,
        "unit": "м",
        "tolerance": 0.00000202,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g1-2",
      "group": "g1",
      "groupTitle": "Швейное производство",
      "topic": "Процент усадки по длине",
      "status": "implemented",
      "calculatorId": "g1-2",
      "href": "calculator.html?atlasTool=g1-2#labAtlasTools",
      "formula": "Усадка = (до − после)/до × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "before",
          "label": "Исходный размер в выбранном направлении, см",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "after",
          "label": "Размер после обработки, см",
          "example": 95,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Направление длины/ширины считайте отдельно на одном образце. Отрицательный результат — рост.",
      "reference": {
        "expected": 5,
        "actual": 5,
        "unit": "%",
        "tolerance": 5e-8,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g1-3",
      "group": "g1",
      "groupTitle": "Швейное производство",
      "topic": "Процент усадки по ширине",
      "status": "implemented",
      "calculatorId": "g1-3",
      "href": "calculator.html?atlasTool=g1-3#labAtlasTools",
      "formula": "Усадка = (до − после)/до × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "before",
          "label": "Исходный размер в выбранном направлении, см",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "after",
          "label": "Размер после обработки, см",
          "example": 95,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Направление длины/ширины считайте отдельно на одном образце. Отрицательный результат — рост.",
      "reference": {
        "expected": 5,
        "actual": 5,
        "unit": "%",
        "tolerance": 5e-8,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g1-4",
      "group": "g1",
      "groupTitle": "Швейное производство",
      "topic": "Число настилов для одинаковых раскладок",
      "status": "implemented",
      "calculatorId": "g1-4",
      "href": "calculator.html?atlasTool=g1-4#labAtlasTools",
      "formula": "Настилы = ceil(изделия / (слои × изделий на слой)).",
      "outputUnit": "настилов",
      "trigger": "live",
      "inputs": [
        {
          "key": "pieces",
          "label": "Изделий в заказе, шт",
          "example": 100,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "layers",
          "label": "Слоёв в одном настиле",
          "example": 20,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "markers",
          "label": "Изделий в одной раскладке на слой",
          "example": 5,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Карта для одинаковых раскладок; последний настил может быть неполным. Размерный ассортимент и допустимую высоту задаёт технолог.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "настилов",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g1-5",
      "group": "g1",
      "groupTitle": "Швейное производство",
      "topic": "Число слоёв настила",
      "status": "implemented",
      "calculatorId": "g1-5",
      "href": "calculator.html?atlasTool=g1-5#labAtlasTools",
      "formula": "Число слоёв = floor(допустимая высота / толщина слоя).",
      "outputUnit": "слоёв",
      "trigger": "live",
      "inputs": [
        {
          "key": "height",
          "label": "Допустимая высота настила, мм",
          "example": 50,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "thickness",
          "label": "Толщина одного слоя, мм",
          "example": 0.5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Ограничение только по высоте; сжатие, свойства ткани и пределы раскройной машины проверяются отдельно.",
      "reference": {
        "expected": 100,
        "actual": 100,
        "unit": "слоёв",
        "tolerance": 0.000001,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g1-6",
      "group": "g1",
      "groupTitle": "Швейное производство",
      "topic": "Количество деталей в настиле",
      "status": "implemented",
      "calculatorId": "g1-6",
      "href": "calculator.html?atlasTool=g1-6#labAtlasTools",
      "formula": "Детали = слои × деталей на слой.",
      "outputUnit": "деталей",
      "trigger": "live",
      "inputs": [
        {
          "key": "layers",
          "label": "Слоёв",
          "example": 20,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "parts",
          "label": "Деталей на слой",
          "example": 12,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Без брака и неполных слоёв.",
      "reference": {
        "expected": 240,
        "actual": 240,
        "unit": "деталей",
        "tolerance": 0.0000024,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g1-7",
      "group": "g1",
      "groupTitle": "Швейное производство",
      "topic": "Норма материала на размерный ряд",
      "status": "implemented",
      "calculatorId": "g1-7",
      "href": "calculator.html?atlasTool=g1-7#labAtlasTools",
      "formula": "Материал = Σ(количество размера × норма размера).",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "quantities",
          "label": "Количество изделий по размерам; разделитель ;",
          "example": "10;20;30",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rates",
          "label": "Расход на изделие каждого размера, м; разделитель ;",
          "example": "1.5;1.6;1.8",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Массивы размеров должны иметь одинаковую длину; нормы задаёт ваша раскладка.",
      "reference": {
        "expected": 101,
        "actual": 101,
        "unit": "м",
        "tolerance": 0.00000101,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g1-8",
      "group": "g1",
      "groupTitle": "Швейное производство",
      "topic": "Припуск на шов и усадку",
      "status": "implemented",
      "calculatorId": "g1-8",
      "href": "calculator.html?atlasTool=g1-8#labAtlasTools",
      "formula": "Размер до усадки = (готовый размер + суммарный припуск)/(1 − усадка/100).",
      "outputUnit": "см",
      "trigger": "live",
      "inputs": [
        {
          "key": "size",
          "label": "Готовый размер, см",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "seam",
          "label": "Суммарный припуск на швы, см",
          "example": 4,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "shrink",
          "label": "Усадка, %",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Модель равномерной усадки; направление и фактическую усадку определяют испытанием ткани.",
      "reference": {
        "expected": 115.55555555555556,
        "actual": 115.555555556,
        "unit": "см",
        "tolerance": 0.0000011555555555555556,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g1-9",
      "group": "g1",
      "groupTitle": "Швейное производство",
      "topic": "Суммарная длина швов",
      "status": "implemented",
      "calculatorId": "g1-9",
      "href": "calculator.html?atlasTool=g1-9#labAtlasTools",
      "formula": "Длина швов = Σ длины на изделие × количество.",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "lengths",
          "label": "Длины швов на изделие, м; разделитель ;",
          "example": "1;2;0.5",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "qty",
          "label": "Изделий",
          "example": 100,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Не включает технологические концы нитей.",
      "reference": {
        "expected": 350,
        "actual": 350,
        "unit": "м",
        "tolerance": 0.0000035,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g1-10",
      "group": "g1",
      "groupTitle": "Швейное производство",
      "topic": "Расход нитей по типу стежка",
      "status": "implemented",
      "calculatorId": "g1-10",
      "href": "calculator.html?atlasTool=g1-10#labAtlasTools",
      "formula": "Расход = длина шва × фактический коэффициент стежка × (1 + потери/100).",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "seam",
          "label": "Суммарная длина шва, м",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "factor",
          "label": "Измеренный расход нити на метр данного стежка, м/м",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "loss",
          "label": "Дополнительные потери, %",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Коэффициент именно для ваших нитей, толщины, частоты и типа стежка. Универсальный коэффициент для всех стежков не подставляется.",
      "reference": {
        "expected": 550,
        "actual": 550,
        "unit": "м",
        "tolerance": 0.0000055,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g1-11",
      "group": "g1",
      "groupTitle": "Швейное производство",
      "topic": "Число бобин на заказ",
      "status": "implemented",
      "calculatorId": "g1-11",
      "href": "calculator.html?atlasTool=g1-11#labAtlasTools",
      "formula": "Бобины = ceil(общая длина / полезная длина бобины).",
      "outputUnit": "бобин",
      "trigger": "live",
      "inputs": [
        {
          "key": "total",
          "label": "Необходимая длина нитей, м",
          "example": 25000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "spool",
          "label": "Полезная длина одной бобины, м",
          "example": 5000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Для одной марки и цвета нити; раздельные позиции считают отдельно.",
      "reference": {
        "expected": 5,
        "actual": 5,
        "unit": "бобин",
        "tolerance": 5e-8,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g1-12",
      "group": "g1",
      "groupTitle": "Швейное производство",
      "topic": "Количество игл на смену",
      "status": "implemented",
      "calculatorId": "g1-12",
      "href": "calculator.html?atlasTool=g1-12#labAtlasTools",
      "formula": "Иглы = ceil(машины × ceil(часы смены/ресурс иглы) × (1 + запас/100)).",
      "outputUnit": "игл",
      "trigger": "live",
      "inputs": [
        {
          "key": "machines",
          "label": "Машин",
          "example": 20,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "hours",
          "label": "Длительность смены, ч",
          "example": 8,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "life",
          "label": "Плановая работа одной иглы, ч",
          "example": 4,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "reserve",
          "label": "Запас, %",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Ресурс иглы вводится по вашему процессу; это не универсальная норма замены.",
      "reference": {
        "expected": 44,
        "actual": 44,
        "unit": "игл",
        "tolerance": 4.4e-7,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g1-13",
      "group": "g1",
      "groupTitle": "Швейное производство",
      "topic": "Производительность раскройного стола",
      "status": "implemented",
      "calculatorId": "g1-13",
      "href": "calculator.html?atlasTool=g1-13#labAtlasTools",
      "formula": "Производительность = детали / время.",
      "outputUnit": "деталей/ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "qty",
          "label": "Вырезанных деталей, шт",
          "example": 1200,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "hours",
          "label": "Фактическое время, ч",
          "example": 8,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Фактическая выработка; наладка учитывается в выбранном времени.",
      "reference": {
        "expected": 150,
        "actual": 150,
        "unit": "деталей/ч",
        "tolerance": 0.0000015,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g1-14",
      "group": "g1",
      "groupTitle": "Швейное производство",
      "topic": "Коэффициент использования ширины",
      "status": "implemented",
      "calculatorId": "g1-14",
      "href": "calculator.html?atlasTool=g1-14#labAtlasTools",
      "formula": "Использование ширины = использованная / полезная × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "used",
          "label": "Использованная ширина, см",
          "example": 140,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "available",
          "label": "Полезная ширина, см",
          "example": 150,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Это использование ширины, а не КПД площади всей раскладки.",
      "reference": {
        "expected": 93.33333333333333,
        "actual": 93.3333333333,
        "unit": "%",
        "tolerance": 9.333333333333333e-7,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g1-15",
      "group": "g1",
      "groupTitle": "Швейное производство",
      "topic": "Количество смен для швейной партии",
      "status": "implemented",
      "calculatorId": "g1-15",
      "href": "calculator.html?atlasTool=g1-15#labAtlasTools",
      "formula": "Смены = ceil(изделия / (шт/ч × часов в смене)).",
      "outputUnit": "смен",
      "trigger": "live",
      "inputs": [
        {
          "key": "qty",
          "label": "Изделий в заказе",
          "example": 1000,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "rate",
          "label": "Производительность линии, шт/ч",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "shift",
          "label": "Часов работы в смене",
          "example": 8,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "План для одной линии с постоянной выработкой; без календаря выходных и переходов между моделями.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "смен",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g1-16",
      "group": "g1",
      "groupTitle": "Швейное производство",
      "topic": "Нижняя оценка рабочих мест по SMV",
      "status": "implemented",
      "calculatorId": "g1-16",
      "href": "calculator.html?atlasTool=g1-16#labAtlasTools",
      "formula": "Теоретические рабочие места = ceil(Σ SMV / такт).",
      "outputUnit": "мест",
      "trigger": "live",
      "inputs": [
        {
          "key": "operations",
          "label": "SMV операций, мин; разделитель ;",
          "example": "1;2;3",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "takt",
          "label": "Такт, мин/изделие",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Нижняя граница. Не решает распределение операций, предшествование и ограничения оборудования.",
      "reference": {
        "expected": 3,
        "actual": 3,
        "unit": "мест",
        "tolerance": 3.0000000000000004e-8,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g1-17",
      "group": "g1",
      "groupTitle": "Швейное производство",
      "topic": "Такт швейного потока",
      "status": "implemented",
      "calculatorId": "g1-17",
      "href": "calculator.html?atlasTool=g1-17#labAtlasTools",
      "formula": "Такт = доступное время / спрос.",
      "outputUnit": "мин/шт",
      "trigger": "live",
      "inputs": [
        {
          "key": "minutes",
          "label": "Доступное время, мин",
          "example": 450,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "demand",
          "label": "Спрос за смену, шт",
          "example": 150,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Доступное время задаётся за вычетом плановых перерывов.",
      "reference": {
        "expected": 3,
        "actual": 3,
        "unit": "мин/шт",
        "tolerance": 3.0000000000000004e-8,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g1-18",
      "group": "g1",
      "groupTitle": "Швейное производство",
      "topic": "Численность операторов по операциям",
      "status": "implemented",
      "calculatorId": "g1-18",
      "href": "calculator.html?atlasTool=g1-18#labAtlasTools",
      "formula": "Операторы = Σ ceil(SMV операции / такт).",
      "outputUnit": "человек",
      "trigger": "live",
      "inputs": [
        {
          "key": "operations",
          "label": "SMV операций, мин; разделитель ;",
          "example": "1;2;3",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "takt",
          "label": "Такт, мин/изделие",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Операции закреплены отдельно; совмещение, перерывы и навыки не моделируются.",
      "reference": {
        "expected": 4,
        "actual": 4,
        "unit": "человек",
        "tolerance": 4e-8,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g1-19",
      "group": "g1",
      "groupTitle": "Швейное производство",
      "topic": "Коэффициент загрузки рабочего места",
      "status": "implemented",
      "calculatorId": "g1-19",
      "href": "calculator.html?atlasTool=g1-19#labAtlasTools",
      "formula": "Загрузка = занятое / доступное × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "busy",
          "label": "Занятое время, мин",
          "example": 360,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "available",
          "label": "Доступное время, мин",
          "example": 450,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Периоды должны совпадать; наложение операций не допускается.",
      "reference": {
        "expected": 80,
        "actual": 80,
        "unit": "%",
        "tolerance": 8e-7,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g1-20",
      "group": "g1",
      "groupTitle": "Швейное производство",
      "topic": "Норма выработки за смену",
      "status": "implemented",
      "calculatorId": "g1-20",
      "href": "calculator.html?atlasTool=g1-20#labAtlasTools",
      "formula": "Выработка = floor(время × эффективность/100 / SMV).",
      "outputUnit": "шт",
      "trigger": "live",
      "inputs": [
        {
          "key": "minutes",
          "label": "Доступное время, мин",
          "example": 450,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "smv",
          "label": "Норма времени, мин/шт",
          "example": 3,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "efficiency",
          "label": "Плановая эффективность, %",
          "example": 80,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Норма времени и эффективность вводятся пользователем.",
      "reference": {
        "expected": 120,
        "actual": 120,
        "unit": "шт",
        "tolerance": 0.0000012,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g1-21",
      "group": "g1",
      "groupTitle": "Швейное производство",
      "topic": "Часовая мощность линии",
      "status": "implemented",
      "calculatorId": "g1-21",
      "href": "calculator.html?atlasTool=g1-21#labAtlasTools",
      "formula": "Мощность = операторы × 60 × эффективность/100 / SMV.",
      "outputUnit": "шт/ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "workers",
          "label": "Операторов",
          "example": 10,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "smv",
          "label": "Суммарная трудоёмкость, мин/шт",
          "example": 20,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "efficiency",
          "label": "Эффективность, %",
          "example": 80,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Баланс линии и узкие места проверяются отдельно.",
      "reference": {
        "expected": 24,
        "actual": 24,
        "unit": "шт/ч",
        "tolerance": 2.4000000000000003e-7,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g1-22",
      "group": "g1",
      "groupTitle": "Швейное производство",
      "topic": "Себестоимость пошива единицы",
      "status": "implemented",
      "calculatorId": "g1-22",
      "href": "calculator.html?atlasTool=g1-22#labAtlasTools",
      "formula": "Себестоимость = затраты на партию / годные изделия.",
      "outputUnit": "₽/шт",
      "trigger": "live",
      "inputs": [
        {
          "key": "cost",
          "label": "Затраты на партию, ₽",
          "example": 100000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "good",
          "label": "Годных изделий",
          "example": 500,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Все статьи затрат и единый порядок учёта налогов задаются пользователем.",
      "reference": {
        "expected": 200,
        "actual": 200,
        "unit": "₽/шт",
        "tolerance": 0.000002,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g1-23",
      "group": "g1",
      "groupTitle": "Швейное производство",
      "topic": "Расход фурнитуры на партию",
      "status": "implemented",
      "calculatorId": "g1-23",
      "href": "calculator.html?atlasTool=g1-23#labAtlasTools",
      "formula": "Потребность = ceil(изделия × единиц на изделие × (1 + запас/100)).",
      "outputUnit": "единиц",
      "trigger": "live",
      "inputs": [
        {
          "key": "qty",
          "label": "Изделий",
          "example": 100,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "per",
          "label": "Единиц фурнитуры на изделие",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "reserve",
          "label": "Запас, %",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Считайте каждый вид фурнитуры отдельно.",
      "reference": {
        "expected": 550,
        "actual": 550,
        "unit": "единиц",
        "tolerance": 0.0000055,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g1-24",
      "group": "g1",
      "groupTitle": "Швейное производство",
      "topic": "Расход кромочной ленты",
      "status": "implemented",
      "calculatorId": "g1-24",
      "href": "calculator.html?atlasTool=g1-24#labAtlasTools",
      "formula": "Лента = длина кромки × изделия × (1 + запас/100).",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "edge",
          "label": "Длина кромки на изделие, м",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "qty",
          "label": "Изделий",
          "example": 100,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "reserve",
          "label": "Запас, %",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Стыки и технологические концы включайте в запас.",
      "reference": {
        "expected": 220,
        "actual": 220,
        "unit": "м",
        "tolerance": 0.0000022,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g1-25",
      "group": "g1",
      "groupTitle": "Швейное производство",
      "topic": "Площадь лекал и межлекальные отходы",
      "status": "implemented",
      "calculatorId": "g1-25",
      "href": "calculator.html?atlasTool=g1-25#labAtlasTools",
      "formula": "Межлекальные отходы = (площадь раскладки − лекала)/площадь раскладки × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "marker",
          "label": "Площадь раскладки, м²",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "patterns",
          "label": "Суммарная площадь лекал, м²",
          "example": 8,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без концевых потерь, кромок и брака.",
      "reference": {
        "expected": 20,
        "actual": 20,
        "unit": "%",
        "tolerance": 2e-7,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g1-26",
      "group": "g1",
      "groupTitle": "Швейное производство",
      "topic": "Базовая карта операций пошива",
      "status": "implemented",
      "calculatorId": "g1-26",
      "href": "calculator.html?atlasTool=g1-26#labAtlasTools",
      "formula": "Базовая карта операций: последовательность, нормы, исполнители; общая трудоёмкость = сумма норм.",
      "outputUnit": "нормо-мин/изделие",
      "trigger": "live",
      "inputs": [
        {
          "key": "names",
          "label": "Названия операций по порядку, через ;",
          "example": "Раскрой;Сборка;Контроль",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": true,
          "pattern": "^[\\s\\S]+$",
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "minutes",
          "label": "Норма каждой операции, мин/изделие; через ;",
          "example": "1;2;3",
          "positive": true,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "workers",
          "label": "Одновременных исполнителей на операции; через ;",
          "example": "1;1;2",
          "positive": true,
          "integer": true,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Базовая редактируемая карта расчёта, не утверждённый производственный техпроцесс: оборудование, маршрут, контроль и подписи добавляются ответственными специалистами.",
      "reference": {
        "expected": 6,
        "actual": 6,
        "unit": "нормо-мин/изделие",
        "tolerance": 6.000000000000001e-8,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g2-1",
      "group": "g2",
      "groupTitle": "Ткань и текстильные свойства",
      "topic": "Плотность ткани GSM по образцу",
      "status": "implemented",
      "calculatorId": "gsm",
      "href": "calculator.html?atlasTool=gsm#labAtlasTools",
      "formula": "GSM = масса, г × 10 000 / (ширина, см × длина, см).",
      "outputUnit": "г/м²",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Масса образца, г",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "width",
          "label": "Ширина образца, см",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Длина образца, см",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Образец без упаковки; результат — поверхностная плотность, а не объёмная плотность.",
      "reference": {
        "expected": 500,
        "actual": 500,
        "unit": "г/м²",
        "tolerance": 0.000005,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g2-2",
      "group": "g2",
      "groupTitle": "Ткань и текстильные свойства",
      "topic": "Масса рулона по площади",
      "status": "implemented",
      "calculatorId": "g2-2",
      "href": "calculator.html?atlasTool=g2-2#labAtlasTools",
      "formula": "Масса = площадь × GSM / 1000.",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "area",
          "label": "Площадь полотна, м²",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "gsm",
          "label": "Поверхностная плотность, г/м²",
          "example": 200,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без втулки и упаковки.",
      "reference": {
        "expected": 20,
        "actual": 20,
        "unit": "кг",
        "tolerance": 2e-7,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g2-3",
      "group": "g2",
      "groupTitle": "Ткань и текстильные свойства",
      "topic": "Полезная ширина ткани",
      "status": "implemented",
      "calculatorId": "g2-3",
      "href": "calculator.html?atlasTool=g2-3#labAtlasTools",
      "formula": "Полезная ширина = полная − левая кромка − правая кромка.",
      "outputUnit": "см",
      "trigger": "live",
      "inputs": [
        {
          "key": "width",
          "label": "Полная ширина, см",
          "example": 150,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "left",
          "label": "Левая кромка, см",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "right",
          "label": "Правая кромка, см",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Проверьте фактическую ширину по длине рулона.",
      "reference": {
        "expected": 146,
        "actual": 146,
        "unit": "см",
        "tolerance": 0.00000146,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g2-4",
      "group": "g2",
      "groupTitle": "Ткань и текстильные свойства",
      "topic": "Коэффициент укладки полотна",
      "status": "implemented",
      "calculatorId": "g2-4",
      "href": "calculator.html?atlasTool=g2-4#labAtlasTools",
      "formula": "Коэффициент укладки = площадь лекал / площадь полотна × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "fabric",
          "label": "Полезная площадь полотна, м²",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "patterns",
          "label": "Площадь лекал, м²",
          "example": 85,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Относится к площади, не только к ширине.",
      "reference": {
        "expected": 85,
        "actual": 85,
        "unit": "%",
        "tolerance": 8.5e-7,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g2-5",
      "group": "g2",
      "groupTitle": "Ткань и текстильные свойства",
      "topic": "Линейная плотность нити tex",
      "status": "implemented",
      "calculatorId": "tex",
      "href": "calculator.html?atlasTool=tex#labAtlasTools",
      "formula": "tex = масса, г × 1000 / длина, м.",
      "outputUnit": "tex",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Масса нити, г",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Длина нити, м",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "1 tex = 1 г/км. Взвешивайте саму нить без бобины.",
      "reference": {
        "expected": 20,
        "actual": 20,
        "unit": "tex",
        "tolerance": 2e-7,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g2-6",
      "group": "g2",
      "groupTitle": "Ткань и текстильные свойства",
      "topic": "Номер нити Nm и Ne",
      "status": "implemented",
      "calculatorId": "g2-6",
      "href": "calculator.html?atlasTool=g2-6#labAtlasTools",
      "formula": "Nm = 1000 / tex.",
      "outputUnit": "Nm",
      "trigger": "live",
      "inputs": [
        {
          "key": "tex",
          "label": "Линейная плотность, tex",
          "example": 20,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Nm = 1000/tex; Ne = 590.541/tex. Ne здесь только для хлопковой английской системы.",
      "reference": {
        "expected": 50,
        "actual": 50,
        "unit": "Nm",
        "tolerance": 5e-7,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g2-7",
      "group": "g2",
      "groupTitle": "Ткань и текстильные свойства",
      "topic": "Длина нити по массе",
      "status": "implemented",
      "calculatorId": "g2-7",
      "href": "calculator.html?atlasTool=g2-7#labAtlasTools",
      "formula": "Длина = масса, г × 1000 / tex.",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Масса нити, г",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "tex",
          "label": "Линейная плотность, tex",
          "example": 20,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без бобины.",
      "reference": {
        "expected": 5000,
        "actual": 5000,
        "unit": "м",
        "tolerance": 0.00005,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g2-8",
      "group": "g2",
      "groupTitle": "Ткань и текстильные свойства",
      "topic": "Масса нити по длине",
      "status": "implemented",
      "calculatorId": "g2-8",
      "href": "calculator.html?atlasTool=g2-8#labAtlasTools",
      "formula": "Масса = длина × tex / 1000.",
      "outputUnit": "г",
      "trigger": "live",
      "inputs": [
        {
          "key": "length",
          "label": "Длина нити, м",
          "example": 5000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "tex",
          "label": "Линейная плотность, tex",
          "example": 20,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Фактическая масса зависит от равномерности нити.",
      "reference": {
        "expected": 100,
        "actual": 100,
        "unit": "г",
        "tolerance": 0.000001,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g2-9",
      "group": "g2",
      "groupTitle": "Ткань и текстильные свойства",
      "topic": "Соотношение основы и утка",
      "status": "implemented",
      "calculatorId": "g2-9",
      "href": "calculator.html?atlasTool=g2-9#labAtlasTools",
      "formula": "Доля основы = масса основы/(основа + уток) × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "warp",
          "label": "Масса основы, г",
          "example": 60,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "weft",
          "label": "Масса утка, г",
          "example": 40,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Взвесьте компоненты одного образца; доля утка = 100% − результат.",
      "reference": {
        "expected": 60,
        "actual": 60,
        "unit": "%",
        "tolerance": 6e-7,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g2-10",
      "group": "g2",
      "groupTitle": "Ткань и текстильные свойства",
      "topic": "Доля волокон в смеси",
      "status": "implemented",
      "calculatorId": "g2-10",
      "href": "calculator.html?atlasTool=g2-10#labAtlasTools",
      "formula": "Массовая доля = масса компонента / масса смеси × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "fiber",
          "label": "Масса выбранного волокна, кг",
          "example": 30,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "total",
          "label": "Общая масса смеси, кг",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Массы на одной базе влажности.",
      "reference": {
        "expected": 30,
        "actual": 30,
        "unit": "%",
        "tolerance": 3e-7,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g2-11",
      "group": "g2",
      "groupTitle": "Ткань и текстильные свойства",
      "topic": "Длина рулона по массе GSM",
      "status": "implemented",
      "calculatorId": "roll-length",
      "href": "calculator.html?atlasTool=roll-length#labAtlasTools",
      "formula": "L, м = масса, кг × 1000 / (GSM × ширина, м).",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Масса полотна без втулки, кг",
          "example": 6,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "gsm",
          "label": "Поверхностная плотность, г/м²",
          "example": 200,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "width",
          "label": "Ширина полотна, м",
          "example": 1.5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Оценка для постоянных ширины и поверхностной плотности; исключите упаковку и втулку.",
      "reference": {
        "expected": 20,
        "actual": 20,
        "unit": "м",
        "tolerance": 2e-7,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g2-12",
      "group": "g2",
      "groupTitle": "Ткань и текстильные свойства",
      "topic": "Масса ткани по метражу",
      "status": "implemented",
      "calculatorId": "fabric-mass",
      "href": "calculator.html?atlasTool=fabric-mass#labAtlasTools",
      "formula": "m, кг = GSM × ширина, м × длина, м / 1000.",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "gsm",
          "label": "Поверхностная плотность, г/м²",
          "example": 200,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "width",
          "label": "Ширина полотна, м",
          "example": 1.5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Длина полотна, м",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без массы втулки и упаковки. Ширину задавайте для всего взвешиваемого полотна.",
      "reference": {
        "expected": 6,
        "actual": 6,
        "unit": "кг",
        "tolerance": 6.000000000000001e-8,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g2-13",
      "group": "g2",
      "groupTitle": "Ткань и текстильные свойства",
      "topic": "Площадь тканого полотна",
      "status": "implemented",
      "calculatorId": "g2-13",
      "href": "calculator.html?atlasTool=g2-13#labAtlasTools",
      "formula": "Площадь = ширина × длина.",
      "outputUnit": "м²",
      "trigger": "live",
      "inputs": [
        {
          "key": "width",
          "label": "Ширина полотна, м",
          "example": 1.5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Длина полотна, м",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Прямоугольное полотно постоянной ширины.",
      "reference": {
        "expected": 30,
        "actual": 30,
        "unit": "м²",
        "tolerance": 3e-7,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g2-14",
      "group": "g2",
      "groupTitle": "Ткань и текстильные свойства",
      "topic": "Плотность переплетения EPI/PPI",
      "status": "implemented",
      "calculatorId": "g2-14",
      "href": "calculator.html?atlasTool=g2-14#labAtlasTools",
      "formula": "EPI или PPI = число нитей × 2.54 / длина участка, см.",
      "outputUnit": "нитей/дюйм",
      "trigger": "live",
      "inputs": [
        {
          "key": "threads",
          "label": "Число нитей на образце",
          "example": 100,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "width",
          "label": "Длина измеренного участка, см",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Считайте основу и уток отдельно.",
      "reference": {
        "expected": 50.8,
        "actual": 50.8,
        "unit": "нитей/дюйм",
        "tolerance": 5.079999999999999e-7,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g2-15",
      "group": "g2",
      "groupTitle": "Ткань и текстильные свойства",
      "topic": "Жёсткость изгиба ткани",
      "status": "implemented",
      "calculatorId": "g2-15",
      "href": "calculator.html?atlasTool=g2-15#labAtlasTools",
      "formula": "Изгибная длина C = свес/2; жёсткость на единицу ширины = (GSM/1000) g (C/100)³.",
      "outputUnit": "Н·м",
      "trigger": "live",
      "inputs": [
        {
          "key": "gsm",
          "label": "Поверхностная плотность, г/м²",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "overhang",
          "label": "Измеренный свес при угле 41.5°, см",
          "example": 4,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Консольная модель Peirce при геометрии 41.5°. Измерения и подготовка образца должны соответствовать выбранному методу; не жёсткость готового изделия.",
      "reference": {
        "expected": 0.00000784532,
        "actual": 0.00000784532,
        "unit": "Н·м",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g2-16",
      "group": "g2",
      "groupTitle": "Ткань и текстильные свойства",
      "topic": "Воздухопроницаемость образца",
      "status": "implemented",
      "calculatorId": "g2-16",
      "href": "calculator.html?atlasTool=g2-16#labAtlasTools",
      "formula": "Удельный расход = л/мин × 10 000 / (60 × см²).",
      "outputUnit": "мм/с",
      "trigger": "live",
      "inputs": [
        {
          "key": "flow",
          "label": "Объёмный расход воздуха, л/мин",
          "example": 60,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "area",
          "label": "Площадь испытания, см²",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Только пересчёт результата измерения; перепад давления и метод испытания задаются отдельно.",
      "reference": {
        "expected": 100,
        "actual": 100,
        "unit": "мм/с",
        "tolerance": 0.000001,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g2-17",
      "group": "g2",
      "groupTitle": "Ткань и текстильные свойства",
      "topic": "Влагопоглощение волокна",
      "status": "implemented",
      "calculatorId": "g2-17",
      "href": "calculator.html?atlasTool=g2-17#labAtlasTools",
      "formula": "Влагопоглощение = (влажная − сухая)/сухая × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "wet",
          "label": "Влажная масса, г",
          "example": 120,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "dry",
          "label": "Сухая масса, г",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Относительно сухой массы; не путать с влажностью по мокрой базе.",
      "reference": {
        "expected": 20,
        "actual": 20,
        "unit": "%",
        "tolerance": 2e-7,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g2-18",
      "group": "g2",
      "groupTitle": "Ткань и текстильные свойства",
      "topic": "Скорость сушки образца",
      "status": "implemented",
      "calculatorId": "g2-18",
      "href": "calculator.html?atlasTool=g2-18#labAtlasTools",
      "formula": "Средняя скорость потери массы = (до − после)/время.",
      "outputUnit": "кг/ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "before",
          "label": "Масса до сушки, кг",
          "example": 12,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "after",
          "label": "Масса после сушки, кг",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "hours",
          "label": "Время сушки, ч",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Средняя по интервалу, не прогноз кинетики сушки.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "кг/ч",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g2-19",
      "group": "g2",
      "groupTitle": "Ткань и текстильные свойства",
      "topic": "Разрывная сила на единицу ширины полосы",
      "status": "implemented",
      "calculatorId": "g2-19",
      "href": "calculator.html?atlasTool=g2-19#labAtlasTools",
      "formula": "Удельная разрывная сила = сила / ширина.",
      "outputUnit": "Н/мм",
      "trigger": "live",
      "inputs": [
        {
          "key": "force",
          "label": "Измеренная разрывная сила, Н",
          "example": 500,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "width",
          "label": "Ширина полосы, мм",
          "example": 50,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не является напряжением: толщина не учитывается. Метод испытания и направление указывайте отдельно.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "Н/мм",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g2-20",
      "group": "g2",
      "groupTitle": "Ткань и текстильные свойства",
      "topic": "Относительное удлинение ткани",
      "status": "implemented",
      "calculatorId": "g2-20",
      "href": "calculator.html?atlasTool=g2-20#labAtlasTools",
      "formula": "Удлинение = (после − до)/до × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "before",
          "label": "Исходная длина, мм",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "after",
          "label": "Длина после растяжения, мм",
          "example": 120,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Для растяжения, без снятия нагрузки.",
      "reference": {
        "expected": 20,
        "actual": 20,
        "unit": "%",
        "tolerance": 2e-7,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g2-21",
      "group": "g2",
      "groupTitle": "Ткань и текстильные свойства",
      "topic": "Процент перекоса полотна",
      "status": "implemented",
      "calculatorId": "g2-21",
      "href": "calculator.html?atlasTool=g2-21#labAtlasTools",
      "formula": "Перекос = смещение / ширина × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "offset",
          "label": "Смещение нити от перпендикуляра, см",
          "example": 3,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "width",
          "label": "Ширина образца, см",
          "example": 150,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Геометрическое отношение, методику отбора образца задайте отдельно.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "%",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g2-22",
      "group": "g2",
      "groupTitle": "Ткань и текстильные свойства",
      "topic": "Масса упаковки рулонов",
      "status": "implemented",
      "calculatorId": "g2-22",
      "href": "calculator.html?atlasTool=g2-22#labAtlasTools",
      "formula": "Упаковка = брутто − нетто.",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "gross",
          "label": "Масса брутто всех рулонов, кг",
          "example": 110,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "net",
          "label": "Масса нетто полотна, кг",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Включая втулки, если они входят в брутто и исключены из нетто.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "кг",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g3-1",
      "group": "g3",
      "groupTitle": "Прядение, ткачество, трикотаж",
      "topic": "Крутка пряжи TPI и TPM",
      "status": "implemented",
      "calculatorId": "g3-1",
      "href": "calculator.html?atlasTool=g3-1#labAtlasTools",
      "formula": "TPM = TPI / 0.0254.",
      "outputUnit": "оборотов/м",
      "trigger": "live",
      "inputs": [
        {
          "key": "tpi",
          "label": "Крутка, оборотов/дюйм",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Перевод единиц крутки; направление S/Z не меняется.",
      "reference": {
        "expected": 393.7007874015748,
        "actual": 393.700787402,
        "unit": "оборотов/м",
        "tolerance": 0.000003937007874015748,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g3-2",
      "group": "g3",
      "groupTitle": "Прядение, ткачество, трикотаж",
      "topic": "Коэффициент крутки",
      "status": "implemented",
      "calculatorId": "g3-2",
      "href": "calculator.html?atlasTool=g3-2#labAtlasTools",
      "formula": "αm = TPM / sqrt(Nm).",
      "outputUnit": "αm",
      "trigger": "live",
      "inputs": [
        {
          "key": "tpm",
          "label": "Крутка, оборотов/м",
          "example": 500,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "nm",
          "label": "Метрический номер Nm",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Метрический коэффициент крутки. Не применять это значение к формулам в Ne или tex без пересчёта.",
      "reference": {
        "expected": 50,
        "actual": 50,
        "unit": "αm",
        "tolerance": 5e-7,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g3-3",
      "group": "g3",
      "groupTitle": "Прядение, ткачество, трикотаж",
      "topic": "Производительность кольцепрядильной машины",
      "status": "implemented",
      "calculatorId": "g3-3",
      "href": "calculator.html?atlasTool=g3-3#labAtlasTools",
      "formula": "кг/ч = веретёна × rpm/TPM × tex × 60 / 1 000 000 × эффективность/100.",
      "outputUnit": "кг/ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "spindles",
          "label": "Веретён",
          "example": 100,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "rpm",
          "label": "Обороты веретена, об/мин",
          "example": 10000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "tpm",
          "label": "Крутка, об/м",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "tex",
          "label": "Линейная плотность, tex",
          "example": 20,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "eff",
          "label": "Рабочая эффективность, %",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Идеализированная кольцепрядильная кинематика; простои задаются эффективностью.",
      "reference": {
        "expected": 1.2,
        "actual": 1.2,
        "unit": "кг/ч",
        "tolerance": 1.2e-8,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g3-4",
      "group": "g3",
      "groupTitle": "Прядение, ткачество, трикотаж",
      "topic": "Выход пряжи из волокна",
      "status": "implemented",
      "calculatorId": "g3-4",
      "href": "calculator.html?atlasTool=g3-4#labAtlasTools",
      "formula": "Выход = готовая пряжа / исходное волокно × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "yarn",
          "label": "Масса готовой пряжи, кг",
          "example": 90,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "fiber",
          "label": "Масса исходного волокна, кг",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Массы должны быть на одной базе влажности.",
      "reference": {
        "expected": 90,
        "actual": 90,
        "unit": "%",
        "tolerance": 9.000000000000001e-7,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g3-5",
      "group": "g3",
      "groupTitle": "Прядение, ткачество, трикотаж",
      "topic": "Количество веретён",
      "status": "implemented",
      "calculatorId": "g3-5",
      "href": "calculator.html?atlasTool=g3-5#labAtlasTools",
      "formula": "Веретёна = ceil(план / выработка одного).",
      "outputUnit": "веретён",
      "trigger": "live",
      "inputs": [
        {
          "key": "target",
          "label": "Требуемая выработка, кг/ч",
          "example": 12,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "one",
          "label": "Фактическая выработка одного веретена, кг/ч",
          "example": 0.012,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Выработку одного веретена задайте с учётом простоев.",
      "reference": {
        "expected": 1000,
        "actual": 1000,
        "unit": "веретён",
        "tolerance": 0.00001,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g3-6",
      "group": "g3",
      "groupTitle": "Прядение, ткачество, трикотаж",
      "topic": "Сменная выработка прядильного участка",
      "status": "implemented",
      "calculatorId": "g3-6",
      "href": "calculator.html?atlasTool=g3-6#labAtlasTools",
      "formula": "Выработка смены = кг/ч × часы × эффективность/100.",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "rate",
          "label": "Выработка участка, кг/ч",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "hours",
          "label": "Рабочих часов",
          "example": 8,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "eff",
          "label": "Эффективность, %",
          "example": 80,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Не включайте простои дважды, если кг/ч уже фактическая ставка.",
      "reference": {
        "expected": 640,
        "actual": 640,
        "unit": "кг",
        "tolerance": 0.0000064,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g3-7",
      "group": "g3",
      "groupTitle": "Прядение, ткачество, трикотаж",
      "topic": "Скорость нитеукладчика",
      "status": "implemented",
      "calculatorId": "g3-7",
      "href": "calculator.html?atlasTool=g3-7#labAtlasTools",
      "formula": "Средняя скорость = 2 × ход × циклы / 1000.",
      "outputUnit": "м/мин",
      "trigger": "live",
      "inputs": [
        {
          "key": "stroke",
          "label": "Полный ход нитеводителя, мм",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "cycles",
          "label": "Полных циклов в минуту",
          "example": 60,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Возвратно-поступательное движение с двумя ходами на цикл; ускорения не моделируются.",
      "reference": {
        "expected": 12,
        "actual": 12,
        "unit": "м/мин",
        "tolerance": 1.2000000000000002e-7,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g3-8",
      "group": "g3",
      "groupTitle": "Прядение, ткачество, трикотаж",
      "topic": "Расход основы на партию",
      "status": "implemented",
      "calculatorId": "g3-8",
      "href": "calculator.html?atlasTool=g3-8#labAtlasTools",
      "formula": "Масса основы = нити × длина × tex / 1 000 000.",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "ends",
          "label": "Нитей основы",
          "example": 1000,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "length",
          "label": "Длина основы на нить, м",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "tex",
          "label": "Линейная плотность, tex",
          "example": 20,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "В длину включите уработку, заправку и концевые потери.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "кг",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g3-9",
      "group": "g3",
      "groupTitle": "Прядение, ткачество, трикотаж",
      "topic": "Длина основы с уработкой",
      "status": "implemented",
      "calculatorId": "g3-9",
      "href": "calculator.html?atlasTool=g3-9#labAtlasTools",
      "formula": "Длина основы = готовая длина / (1 − уработка/100).",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "cloth",
          "label": "Готовая длина ткани, м",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "crimp",
          "label": "Уработка от исходной длины основы, %",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Уработка определена относительно исходной нити; не путать с надбавкой к готовой длине.",
      "reference": {
        "expected": 111.11111111111111,
        "actual": 111.111111111,
        "unit": "м",
        "tolerance": 0.0000011111111111111112,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g3-10",
      "group": "g3",
      "groupTitle": "Прядение, ткачество, трикотаж",
      "topic": "Уточная нить на погонный метр",
      "status": "implemented",
      "calculatorId": "g3-10",
      "href": "calculator.html?atlasTool=g3-10#labAtlasTools",
      "formula": "Уток на метр = ширина × нитей/см × 100 × (1 + надбавка/100).",
      "outputUnit": "м/пог.м",
      "trigger": "live",
      "inputs": [
        {
          "key": "width",
          "label": "Ширина ткани, м",
          "example": 1.5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "picks",
          "label": "Уточных нитей на см",
          "example": 20,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "allowance",
          "label": "Надбавка на уработку и кромки, %",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Надбавка задаётся относительно прямолинейной длины; не является процентом сокращения.",
      "reference": {
        "expected": 3300,
        "actual": 3300,
        "unit": "м/пог.м",
        "tolerance": 0.000033,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g3-11",
      "group": "g3",
      "groupTitle": "Прядение, ткачество, трикотаж",
      "topic": "Число нитей основы",
      "status": "implemented",
      "calculatorId": "g3-11",
      "href": "calculator.html?atlasTool=g3-11#labAtlasTools",
      "formula": "Нити основы = ceil(ширина × плотность).",
      "outputUnit": "нитей",
      "trigger": "live",
      "inputs": [
        {
          "key": "width",
          "label": "Ширина заправки, см",
          "example": 150,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "ends",
          "label": "Нитей основы на см",
          "example": 20,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Дополнительные кромочные нити не включены.",
      "reference": {
        "expected": 3000,
        "actual": 3000,
        "unit": "нитей",
        "tolerance": 0.00003,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g3-12",
      "group": "g3",
      "groupTitle": "Прядение, ткачество, трикотаж",
      "topic": "Настройка плотности переплетения",
      "status": "implemented",
      "calculatorId": "g3-12",
      "href": "calculator.html?atlasTool=g3-12#labAtlasTools",
      "formula": "Плотность = число нитей / длина измерения.",
      "outputUnit": "нитей/см",
      "trigger": "live",
      "inputs": [
        {
          "key": "threads",
          "label": "Подсчитано нитей",
          "example": 100,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "length",
          "label": "Длина измерения, см",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Считайте основу и уток отдельно.",
      "reference": {
        "expected": 20,
        "actual": 20,
        "unit": "нитей/см",
        "tolerance": 2e-7,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g3-13",
      "group": "g3",
      "groupTitle": "Прядение, ткачество, трикотаж",
      "topic": "Производительность ткацкого станка",
      "status": "implemented",
      "calculatorId": "g3-13",
      "href": "calculator.html?atlasTool=g3-13#labAtlasTools",
      "formula": "Выработка = прокидки/мин × 60 × эффективность/100 / (нитей/см × 100).",
      "outputUnit": "м/ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "rpm",
          "label": "Прокидок утка в минуту",
          "example": 600,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "picks",
          "label": "Уточных нитей на см",
          "example": 20,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "eff",
          "label": "Эффективность, %",
          "example": 80,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Одна прокидка формирует одну уточную нить; многозевные схемы требуют своей модели.",
      "reference": {
        "expected": 14.4,
        "actual": 14.4,
        "unit": "м/ч",
        "tolerance": 1.4400000000000002e-7,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g3-14",
      "group": "g3",
      "groupTitle": "Прядение, ткачество, трикотаж",
      "topic": "Уработка основы",
      "status": "implemented",
      "calculatorId": "g3-14",
      "href": "calculator.html?atlasTool=g3-14#labAtlasTools",
      "formula": "Уработка = (распрямлённая нить − ткань)/распрямлённая нить × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "straight",
          "label": "Длина распрямлённой нити, мм",
          "example": 110,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "fabric",
          "label": "Соответствующая длина ткани, мм",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Одна выбранная система нитей; одинаковое натяжение при измерении.",
      "reference": {
        "expected": 9.090909090909092,
        "actual": 9.09090909091,
        "unit": "%",
        "tolerance": 9.090909090909091e-8,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g3-15",
      "group": "g3",
      "groupTitle": "Прядение, ткачество, трикотаж",
      "topic": "Уработка утка",
      "status": "implemented",
      "calculatorId": "g3-15",
      "href": "calculator.html?atlasTool=g3-15#labAtlasTools",
      "formula": "Уработка = (распрямлённая нить − ткань)/распрямлённая нить × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "straight",
          "label": "Длина распрямлённой нити, мм",
          "example": 110,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "fabric",
          "label": "Соответствующая длина ткани, мм",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Одна выбранная система нитей; одинаковое натяжение при измерении.",
      "reference": {
        "expected": 9.090909090909092,
        "actual": 9.09090909091,
        "unit": "%",
        "tolerance": 9.090909090909091e-8,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g3-16",
      "group": "g3",
      "groupTitle": "Прядение, ткачество, трикотаж",
      "topic": "Плотность петельных рядов",
      "status": "implemented",
      "calculatorId": "g3-16",
      "href": "calculator.html?atlasTool=g3-16#labAtlasTools",
      "formula": "Плотность = число элементов / длина.",
      "outputUnit": "элементов/см",
      "trigger": "live",
      "inputs": [
        {
          "key": "loops",
          "label": "Число рядов или столбиков",
          "example": 50,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "length",
          "label": "Длина измерения, см",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Отдельно для выбранного направления после принятой релаксации материала.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "элементов/см",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g3-17",
      "group": "g3",
      "groupTitle": "Прядение, ткачество, трикотаж",
      "topic": "Плотность петельных столбиков",
      "status": "implemented",
      "calculatorId": "g3-17",
      "href": "calculator.html?atlasTool=g3-17#labAtlasTools",
      "formula": "Плотность = число элементов / длина.",
      "outputUnit": "элементов/см",
      "trigger": "live",
      "inputs": [
        {
          "key": "loops",
          "label": "Число рядов или столбиков",
          "example": 50,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "length",
          "label": "Длина измерения, см",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Отдельно для выбранного направления после принятой релаксации материала.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "элементов/см",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g3-18",
      "group": "g3",
      "groupTitle": "Прядение, ткачество, трикотаж",
      "topic": "Производительность вязальной машины",
      "status": "implemented",
      "calculatorId": "g3-18",
      "href": "calculator.html?atlasTool=g3-18#labAtlasTools",
      "formula": "Длина = rpm × системы × 60 × эффективность/100 / (рядов/см × 100).",
      "outputUnit": "м/ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "rpm",
          "label": "Обороты машины, об/мин",
          "example": 30,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "feeds",
          "label": "Петлеобразующих систем",
          "example": 40,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "courses",
          "label": "Рядов на см",
          "example": 20,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "eff",
          "label": "Эффективность, %",
          "example": 80,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Кругловязальная машина: каждая система формирует ряд за оборот; не подходит любой вязальной машине.",
      "reference": {
        "expected": 28.8,
        "actual": 28.8,
        "unit": "м/ч",
        "tolerance": 2.8800000000000004e-7,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g3-19",
      "group": "g3",
      "groupTitle": "Прядение, ткачество, трикотаж",
      "topic": "Расход трикотажной пряжи",
      "status": "implemented",
      "calculatorId": "g3-19",
      "href": "calculator.html?atlasTool=g3-19#labAtlasTools",
      "formula": "Масса = петли × длина петли, мм × tex / 1 000 000.",
      "outputUnit": "г",
      "trigger": "live",
      "inputs": [
        {
          "key": "loops",
          "label": "Число петель",
          "example": 100000,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "loop",
          "label": "Длина нити в петле, мм",
          "example": 3,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "tex",
          "label": "Линейная плотность, tex",
          "example": 20,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не учитывает отходы и непетельные участки.",
      "reference": {
        "expected": 6,
        "actual": 6,
        "unit": "г",
        "tolerance": 6.000000000000001e-8,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g3-20",
      "group": "g3",
      "groupTitle": "Прядение, ткачество, трикотаж",
      "topic": "Длина петли по параметрам",
      "status": "implemented",
      "calculatorId": "g3-20",
      "href": "calculator.html?atlasTool=g3-20#labAtlasTools",
      "formula": "Средняя длина петли = длина нити / петли.",
      "outputUnit": "мм",
      "trigger": "live",
      "inputs": [
        {
          "key": "length",
          "label": "Длина распущенной нити, мм",
          "example": 300,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "loops",
          "label": "Число петель на участке",
          "example": 100,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Измеряется по распущенному образцу.",
      "reference": {
        "expected": 3,
        "actual": 3,
        "unit": "мм",
        "tolerance": 3.0000000000000004e-8,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g3-21",
      "group": "g3",
      "groupTitle": "Прядение, ткачество, трикотаж",
      "topic": "Масса трикотажа на изделие",
      "status": "implemented",
      "calculatorId": "g3-21",
      "href": "calculator.html?atlasTool=g3-21#labAtlasTools",
      "formula": "Масса = площадь × GSM.",
      "outputUnit": "г",
      "trigger": "live",
      "inputs": [
        {
          "key": "area",
          "label": "Площадь материала на изделие, м²",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "gsm",
          "label": "Поверхностная плотность, г/м²",
          "example": 200,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не включает швы, фурнитуру и отделку, если их нет в GSM.",
      "reference": {
        "expected": 400,
        "actual": 400,
        "unit": "г",
        "tolerance": 0.000004,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g3-22",
      "group": "g3",
      "groupTitle": "Прядение, ткачество, трикотаж",
      "topic": "Процент обрывов нити",
      "status": "implemented",
      "calculatorId": "g3-22",
      "href": "calculator.html?atlasTool=g3-22#labAtlasTools",
      "formula": "Доля = обрывы / заданное число наблюдений × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "breaks",
          "label": "Число обрывов",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "opportunities",
          "label": "Число наблюдаемых нитей/участков",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Это доля по введённому знаменателю, не нормированная частота на 1000 веретено-часов.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "%",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g4-1",
      "group": "g4",
      "groupTitle": "Окрашивание, отделка, нетканые",
      "topic": "Концентрация красителя % owf",
      "status": "implemented",
      "calculatorId": "g4-1",
      "href": "calculator.html?atlasTool=g4-1#labAtlasTools",
      "formula": "owf = краситель / сухое волокно × 100.",
      "outputUnit": "% owf",
      "trigger": "live",
      "inputs": [
        {
          "key": "dye",
          "label": "Масса красителя, кг",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "fiber",
          "label": "Масса сухого волокна, кг",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не является концентрацией красителя в растворе.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "% owf",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g4-2",
      "group": "g4",
      "groupTitle": "Окрашивание, отделка, нетканые",
      "topic": "Масса красителя на ванну",
      "status": "implemented",
      "calculatorId": "g4-2",
      "href": "calculator.html?atlasTool=g4-2#labAtlasTools",
      "formula": "Краситель = сухое волокно × owf/100.",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "owf",
          "label": "Доза, % owf",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        },
        {
          "key": "fiber",
          "label": "Сухое волокно, кг",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Для продукта с принятой концентрацией; поправку на активность задайте отдельно.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "кг",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g4-3",
      "group": "g4",
      "groupTitle": "Окрашивание, отделка, нетканые",
      "topic": "Модуль ванны при окрашивании",
      "status": "implemented",
      "calculatorId": "g4-3",
      "href": "calculator.html?atlasTool=g4-3#labAtlasTools",
      "formula": "Модуль = масса жидкости / масса сухого волокна.",
      "outputUnit": "кг/кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "liquid",
          "label": "Масса жидкости ванны, кг",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "fiber",
          "label": "Масса сухого волокна, кг",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Массовое отношение ванны к сухому материалу.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "кг/кг",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g4-4",
      "group": "g4",
      "groupTitle": "Окрашивание, отделка, нетканые",
      "topic": "Количество воды на загрузку",
      "status": "implemented",
      "calculatorId": "g4-4",
      "href": "calculator.html?atlasTool=g4-4#labAtlasTools",
      "formula": "Объём = модуль × масса волокна / плотность.",
      "outputUnit": "л",
      "trigger": "live",
      "inputs": [
        {
          "key": "module",
          "label": "Модуль ванны, кг/кг",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "fiber",
          "label": "Сухое волокно, кг",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Плотность жидкости, кг/л",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Для общей жидкой ванны; уже внесённые жидкие компоненты вычтите отдельно.",
      "reference": {
        "expected": 1000,
        "actual": 1000,
        "unit": "л",
        "tolerance": 0.00001,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g4-5",
      "group": "g4",
      "groupTitle": "Окрашивание, отделка, нетканые",
      "topic": "Концентрация текстильного реагента",
      "status": "implemented",
      "calculatorId": "g4-5",
      "href": "calculator.html?atlasTool=g4-5#labAtlasTools",
      "formula": "Концентрация = масса / объём.",
      "outputUnit": "г/л",
      "trigger": "live",
      "inputs": [
        {
          "key": "solute",
          "label": "Масса реагента, г",
          "example": 200,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "volume",
          "label": "Объём раствора, л",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не путать с массовыми процентами.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "г/л",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g4-6",
      "group": "g4",
      "groupTitle": "Окрашивание, отделка, нетканые",
      "topic": "Разведение раствора красителя",
      "status": "implemented",
      "calculatorId": "g4-6",
      "href": "calculator.html?atlasTool=g4-6#labAtlasTools",
      "formula": "Объём исходного раствора = C2 × V2 / C1.",
      "outputUnit": "л",
      "trigger": "live",
      "inputs": [
        {
          "key": "c1",
          "label": "Исходная концентрация, г/л",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "c2",
          "label": "Требуемая концентрация, г/л",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "v2",
          "label": "Конечный объём, л",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Довести растворителем до конечного объёма. Не предполагает аддитивность объёмов.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "л",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g4-7",
      "group": "g4",
      "groupTitle": "Окрашивание, отделка, нетканые",
      "topic": "Остаточная влажность полотна",
      "status": "implemented",
      "calculatorId": "g4-7",
      "href": "calculator.html?atlasTool=g4-7#labAtlasTools",
      "formula": "Влажность мокрой базы = (влажная − сухая)/влажная × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "wet",
          "label": "Влажная масса, кг",
          "example": 12,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "dry",
          "label": "Сухая масса, кг",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Знаменатель — влажная масса, не сухая.",
      "reference": {
        "expected": 16.666666666666668,
        "actual": 16.6666666667,
        "unit": "%",
        "tolerance": 1.6666666666666668e-7,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g4-8",
      "group": "g4",
      "groupTitle": "Окрашивание, отделка, нетканые",
      "topic": "Процент отжима на каландре",
      "status": "implemented",
      "calculatorId": "g4-8",
      "href": "calculator.html?atlasTool=g4-8#labAtlasTools",
      "formula": "Удалённая доля массы = (до − после)/до × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "before",
          "label": "Масса до отжима, кг",
          "example": 15,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "after",
          "label": "Масса после отжима, кг",
          "example": 12,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Массовая доля удалённой жидкости при отсутствии потерь волокна.",
      "reference": {
        "expected": 20,
        "actual": 20,
        "unit": "%",
        "tolerance": 2e-7,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g4-9",
      "group": "g4",
      "groupTitle": "Окрашивание, отделка, нетканые",
      "topic": "Усадка после отделки",
      "status": "implemented",
      "calculatorId": "g4-9",
      "href": "calculator.html?atlasTool=g4-9#labAtlasTools",
      "formula": "Усадка = (до − после)/до × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "before",
          "label": "Размер до отделки, см",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "after",
          "label": "Размер после отделки, см",
          "example": 95,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Отрицательный результат означает рост размера.",
      "reference": {
        "expected": 5,
        "actual": 5,
        "unit": "%",
        "tolerance": 5e-8,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g4-10",
      "group": "g4",
      "groupTitle": "Окрашивание, отделка, нетканые",
      "topic": "Масса нанесённого покрытия",
      "status": "implemented",
      "calculatorId": "g4-10",
      "href": "calculator.html?atlasTool=g4-10#labAtlasTools",
      "formula": "Масса покрытия = площадь × норма / 1000.",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "area",
          "label": "Площадь покрытия, м²",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rate",
          "label": "Наносимая масса, г/м²",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Уточните, относится норма к сухому остатку или мокрому продукту.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "кг",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g4-11",
      "group": "g4",
      "groupTitle": "Окрашивание, отделка, нетканые",
      "topic": "Толщина нанесённого слоя",
      "status": "implemented",
      "calculatorId": "g4-11",
      "href": "calculator.html?atlasTool=g4-11#labAtlasTools",
      "formula": "Толщина, мкм = г/м² × 1000 / кг/м³.",
      "outputUnit": "мкм",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Масса слоя, г/м²",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Плотность сухого слоя, кг/м³",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Равномерный сплошной сухой слой без пор.",
      "reference": {
        "expected": 20,
        "actual": 20,
        "unit": "мкм",
        "tolerance": 2e-7,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g4-12",
      "group": "g4",
      "groupTitle": "Окрашивание, отделка, нетканые",
      "topic": "Скорость сушильной линии",
      "status": "implemented",
      "calculatorId": "g4-12",
      "href": "calculator.html?atlasTool=g4-12#labAtlasTools",
      "formula": "Скорость = рабочая длина / время пребывания.",
      "outputUnit": "м/мин",
      "trigger": "live",
      "inputs": [
        {
          "key": "zone",
          "label": "Рабочая длина сушильной зоны, м",
          "example": 20,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "minutes",
          "label": "Требуемое время в зоне, мин",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Время задаётся проверенной технологией; тепломассообмен не прогнозируется.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "м/мин",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g4-13",
      "group": "g4",
      "groupTitle": "Окрашивание, отделка, нетканые",
      "topic": "Производительность отделочного агрегата",
      "status": "implemented",
      "calculatorId": "g4-13",
      "href": "calculator.html?atlasTool=g4-13#labAtlasTools",
      "formula": "Массовая выработка = скорость × ширина × GSM × 60 / 1000 × эффективность/100.",
      "outputUnit": "кг/ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "speed",
          "label": "Скорость полотна, м/мин",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "width",
          "label": "Ширина, м",
          "example": 1.5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "gsm",
          "label": "GSM, г/м²",
          "example": 200,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "eff",
          "label": "Эффективность, %",
          "example": 80,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Для непрерывного полотна постоянной ширины.",
      "reference": {
        "expected": 144,
        "actual": 144,
        "unit": "кг/ч",
        "tolerance": 0.00000144,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g4-14",
      "group": "g4",
      "groupTitle": "Окрашивание, отделка, нетканые",
      "topic": "Процент брака при окрашивании",
      "status": "implemented",
      "calculatorId": "g4-14",
      "href": "calculator.html?atlasTool=g4-14#labAtlasTools",
      "formula": "Брак = масса брака / обработанная масса × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "bad",
          "label": "Брак, кг",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "total",
          "label": "Обработано, кг",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Одна и та же база массы.",
      "reference": {
        "expected": 5,
        "actual": 5,
        "unit": "%",
        "tolerance": 5e-8,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g4-15",
      "group": "g4",
      "groupTitle": "Окрашивание, отделка, нетканые",
      "topic": "Разница оттенков ΔE",
      "status": "implemented",
      "calculatorId": "g4-15",
      "href": "calculator.html?atlasTool=g4-15#labAtlasTools",
      "formula": "ΔE*ab CIE76 = sqrt(ΔL² + Δa² + Δb²).",
      "outputUnit": "ΔE*ab",
      "trigger": "live",
      "inputs": [
        {
          "key": "l1",
          "label": "L* первого образца",
          "example": 50,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        },
        {
          "key": "a1",
          "label": "a* первого образца",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "b1",
          "label": "b* первого образца",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "l2",
          "label": "L* второго образца",
          "example": 53,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        },
        {
          "key": "a2",
          "label": "a* второго образца",
          "example": 4,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "b2",
          "label": "b* второго образца",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Только CIE76, не CIEDE2000. Измерения при одинаковых наблюдателе, освещении и геометрии.",
      "reference": {
        "expected": 5,
        "actual": 5,
        "unit": "ΔE*ab",
        "tolerance": 5e-8,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g4-16",
      "group": "g4",
      "groupTitle": "Окрашивание, отделка, нетканые",
      "topic": "Вариация числового показателя по точкам",
      "status": "implemented",
      "calculatorId": "g4-16",
      "href": "calculator.html?atlasTool=g4-16#labAtlasTools",
      "formula": "CV = выборочное стандартное отклонение / среднее × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "values",
          "label": "Однотипные измерения по точкам; разделитель ;",
          "example": "8;10;12",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Равномерность заданного числового показателя; не перцептивная разница цвета.",
      "reference": {
        "expected": 20,
        "actual": 20,
        "unit": "%",
        "tolerance": 2e-7,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g4-17",
      "group": "g4",
      "groupTitle": "Окрашивание, отделка, нетканые",
      "topic": "Расход аппрета на рулон",
      "status": "implemented",
      "calculatorId": "g4-17",
      "href": "calculator.html?atlasTool=g4-17#labAtlasTools",
      "formula": "Мокрый продукт = масса полотна × привес / сухой остаток.",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Сухая масса полотна, кг",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "dose",
          "label": "Сухой привес отделки, %",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        },
        {
          "key": "solids",
          "label": "Сухой остаток продукта, %",
          "example": 20,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Проценты в одной шкале. Перенос продукта считается 100%; потери задайте отдельно.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "кг",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g4-18",
      "group": "g4",
      "groupTitle": "Окрашивание, отделка, нетканые",
      "topic": "Масса нетканого полотна GSM",
      "status": "implemented",
      "calculatorId": "g4-18",
      "href": "calculator.html?atlasTool=g4-18#labAtlasTools",
      "formula": "GSM = масса, г × 10 000 / площадь, см².",
      "outputUnit": "г/м²",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Масса образца, г",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "area",
          "label": "Площадь образца, см²",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Поверхностная плотность нетканого материала.",
      "reference": {
        "expected": 500,
        "actual": 500,
        "unit": "г/м²",
        "tolerance": 0.000005,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g4-19",
      "group": "g4",
      "groupTitle": "Окрашивание, отделка, нетканые",
      "topic": "Производительность нетканой линии",
      "status": "implemented",
      "calculatorId": "g4-19",
      "href": "calculator.html?atlasTool=g4-19#labAtlasTools",
      "formula": "Выработка = скорость × ширина × GSM × 60 / 1000.",
      "outputUnit": "кг/ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "speed",
          "label": "Скорость, м/мин",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "width",
          "label": "Ширина, м",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "gsm",
          "label": "GSM, г/м²",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Идеальная производительность без простоев.",
      "reference": {
        "expected": 120,
        "actual": 120,
        "unit": "кг/ч",
        "tolerance": 0.0000012,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g4-20",
      "group": "g4",
      "groupTitle": "Окрашивание, отделка, нетканые",
      "topic": "Выход годного после отделки",
      "status": "implemented",
      "calculatorId": "g4-20",
      "href": "calculator.html?atlasTool=g4-20#labAtlasTools",
      "formula": "Выход = годный материал / вход × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "good",
          "label": "Годный материал, кг",
          "example": 95,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "input",
          "label": "Материал на входе, кг",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Материал сравнивается на одной базе влажности и отделочного привеса.",
      "reference": {
        "expected": 95,
        "actual": 95,
        "unit": "%",
        "tolerance": 9.5e-7,
        "status": "passed"
      },
      "researchSource": "https://www.textileschool.com/calculators/"
    },
    {
      "id": "g5-1",
      "group": "g5",
      "groupTitle": "Качество текстиля и швейки",
      "topic": "DHU — дефекты на сто изделий",
      "status": "implemented",
      "calculatorId": "g5-1",
      "href": "calculator.html?atlasTool=g5-1#labAtlasTools",
      "formula": "Показатель = события / проверенные единицы × 100.",
      "outputUnit": "дефектов/100 шт",
      "trigger": "live",
      "inputs": [
        {
          "key": "events",
          "label": "Количество дефектов (не дефектных изделий)",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "total",
          "label": "Количество проверенных единиц",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "DHU допускает несколько дефектов на одном изделии.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "дефектов/100 шт",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g5-2",
      "group": "g5",
      "groupTitle": "Качество текстиля и швейки",
      "topic": "RFT — годные с первого раза",
      "status": "implemented",
      "calculatorId": "g5-2",
      "href": "calculator.html?atlasTool=g5-2#labAtlasTools",
      "formula": "RFT = годные с первого раза / изготовлено × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "first",
          "label": "Годных с первого предъявления",
          "example": 90,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "total",
          "label": "Изготовлено",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Переделанные изделия не считаются прошедшими с первого раза.",
      "reference": {
        "expected": 90,
        "actual": 90,
        "unit": "%",
        "tolerance": 9.000000000000001e-7,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g5-3",
      "group": "g5",
      "groupTitle": "Качество текстиля и швейки",
      "topic": "Доля возвратов по качеству",
      "status": "implemented",
      "calculatorId": "g5-3",
      "href": "calculator.html?atlasTool=g5-3#labAtlasTools",
      "formula": "Показатель = события / проверенные единицы × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "events",
          "label": "Количество событий",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "total",
          "label": "Количество проверенных единиц",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Один заданный тип события на выбранную единицу наблюдения.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "%",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g5-4",
      "group": "g5",
      "groupTitle": "Качество текстиля и швейки",
      "topic": "Коэффициент переделок",
      "status": "implemented",
      "calculatorId": "g5-4",
      "href": "calculator.html?atlasTool=g5-4#labAtlasTools",
      "formula": "Показатель = события / проверенные единицы × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "events",
          "label": "Количество событий",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "total",
          "label": "Количество проверенных единиц",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Один заданный тип события на выбранную единицу наблюдения.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "%",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g5-5",
      "group": "g5",
      "groupTitle": "Качество текстиля и швейки",
      "topic": "AQL — подбор объёма выборки",
      "status": "implemented",
      "calculatorId": "g5-5",
      "href": "calculator.html?atlasTool=g5-5#labAtlasTools",
      "formula": "Поиск наименьшего n и Ac: P(X≤Ac | p=AQL)≥1−α и P(X≤Ac | p=LTPD)≤β, X~Bin(n,p).",
      "outputUnit": "образцов",
      "trigger": "submit",
      "inputs": [
        {
          "key": "aql",
          "label": "AQL хорошего процесса, %",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "ltpd",
          "label": "Предельная плохая доля LTPD, %",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "alpha",
          "label": "Риск производителя α, %",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "beta",
          "label": "Риск потребителя β, %",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "maxn",
          "label": "Предельный объём поиска n",
          "example": 500,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Биномиальный математический план для независимого случайного отбора, не нормативная таблица ISO 2859-1 с буквенными кодами, уровнями и правилами переключения. Для малого конечного лота нужна гипергеометрическая модель.",
      "reference": {
        "expected": 132,
        "actual": 132,
        "unit": "образцов",
        "tolerance": 0.00000132,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g5-6",
      "group": "g5",
      "groupTitle": "Качество текстиля и швейки",
      "topic": "Доверительный интервал доли дефектов швейной партии",
      "status": "implemented",
      "calculatorId": "g5-6",
      "href": "calculator.html?atlasTool=g5-6#labAtlasTools",
      "formula": "Ширина 95% интервала Wilson = 2z sqrt(p(1−p)/n + z²/(4n²))/(1+z²/n), z=1.95996398454.",
      "outputUnit": "п.п.",
      "trigger": "live",
      "inputs": [
        {
          "key": "bad",
          "label": "Дефектных изделий",
          "example": 10,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "n",
          "label": "Объём независимой выборки",
          "example": 100,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Двусторонний интервал Wilson для биномиальной доли. Здесь выводится полная ширина интервала, не границы и не AQL.",
      "reference": {
        "expected": 11.913652444423835,
        "actual": 11.9136524444,
        "unit": "п.п.",
        "tolerance": 1.1913652444423835e-7,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g5-7",
      "group": "g5",
      "groupTitle": "Качество текстиля и швейки",
      "topic": "Карта Парето дефектов",
      "status": "implemented",
      "calculatorId": "g5-7",
      "href": "calculator.html?atlasTool=g5-7#labAtlasTools",
      "formula": "Доля ведущих причин = сумма top наибольших частот / сумма всех частот × 100.",
      "outputUnit": "% ведущих причин",
      "trigger": "live",
      "inputs": [
        {
          "key": "counts",
          "label": "Количество дефектов по категориям; разделитель ;",
          "example": "50;30;20",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "top",
          "label": "Количество ведущих категорий",
          "example": 2,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Числовой анализ Парето по введённым категориям; категории предварительно независимы и не перекрываются.",
      "reference": {
        "expected": 80,
        "actual": 80,
        "unit": "% ведущих причин",
        "tolerance": 8e-7,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g5-8",
      "group": "g5",
      "groupTitle": "Качество текстиля и швейки",
      "topic": "Контрольная карта доли дефектных",
      "status": "implemented",
      "calculatorId": "g5-8",
      "href": "calculator.html?atlasTool=g5-8#labAtlasTools",
      "formula": "p̄ = сумма дефектных/(число подгрупп × n); UCL/LCL = p̄ ± 3sqrt(p̄(1−p̄)/n), с ограничением 0…1.",
      "outputUnit": "% средняя доля",
      "trigger": "live",
      "inputs": [
        {
          "key": "counts",
          "label": "Дефектных единиц по последовательным подгруппам; через ;",
          "example": "10;10;10",
          "positive": false,
          "integer": true,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "n",
          "label": "Одинаковый объём каждой подгруппы",
          "example": 100,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "p-карта для одинакового n, независимых биномиальных наблюдений и заданной базовой фазы. Контрольные пределы не равны допуску качества.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "% средняя доля",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g5-9",
      "group": "g5",
      "groupTitle": "Качество текстиля и швейки",
      "topic": "DPMO швейного производства",
      "status": "implemented",
      "calculatorId": "g5-9",
      "href": "calculator.html?atlasTool=g5-9#labAtlasTools",
      "formula": "DPMO = дефекты/(изделия × возможностей) × 10⁶.",
      "outputUnit": "DPMO",
      "trigger": "live",
      "inputs": [
        {
          "key": "defects",
          "label": "Дефектов",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "units",
          "label": "Изделий",
          "example": 1000,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "opportunities",
          "label": "Возможностей дефекта на изделие",
          "example": 5,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Число возможностей определяется процессом, не подбирается для улучшения показателя.",
      "reference": {
        "expected": 2000,
        "actual": 2000,
        "unit": "DPMO",
        "tolerance": 0.00002,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g5-10",
      "group": "g5",
      "groupTitle": "Качество текстиля и швейки",
      "topic": "Cp/Cpk по размерам изделия",
      "status": "implemented",
      "calculatorId": "g5-10",
      "href": "calculator.html?atlasTool=g5-10#labAtlasTools",
      "formula": "Cpk/Ppk = min(USL − среднее, среднее − LSL)/(3σ). Cp = (USL − LSL)/(6σ) при той же оценке σ.",
      "outputUnit": "CPK",
      "trigger": "live",
      "inputs": [
        {
          "key": "low",
          "label": "Нижняя граница допуска",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "high",
          "label": "Верхняя граница допуска",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "average",
          "label": "Среднее процесса",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "sigma",
          "label": "Оценка внутрипроцессного σ",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Для двухстороннего допуска. Cpk использует внутрипроцессную оценку σ, Ppk — общую. Интерпретация требует стабильности и подходящей модели распределения.",
      "reference": {
        "expected": 1.6666666666666667,
        "actual": 1.66666666667,
        "unit": "CPK",
        "tolerance": 1.6666666666666667e-8,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g5-11",
      "group": "g5",
      "groupTitle": "Качество текстиля и швейки",
      "topic": "Ширина контрольного интервала",
      "status": "implemented",
      "calculatorId": "g5-11",
      "href": "calculator.html?atlasTool=g5-11#labAtlasTools",
      "formula": "Полная ширина = 2 × множитель × σ.",
      "outputUnit": "единиц измерения",
      "trigger": "live",
      "inputs": [
        {
          "key": "sigma",
          "label": "Стандартное отклонение",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "multiplier",
          "label": "Множитель на одну сторону",
          "example": 3,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не является автоматически допуском изделия.",
      "reference": {
        "expected": 12,
        "actual": 12,
        "unit": "единиц измерения",
        "tolerance": 1.2000000000000002e-7,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g5-12",
      "group": "g5",
      "groupTitle": "Качество текстиля и швейки",
      "topic": "Разница фактической и лекальной мерки",
      "status": "implemented",
      "calculatorId": "g5-12",
      "href": "calculator.html?atlasTool=g5-12#labAtlasTools",
      "formula": "Разница = фактическая − лекальная.",
      "outputUnit": "см",
      "trigger": "live",
      "inputs": [
        {
          "key": "actual",
          "label": "Фактическая мерка, см",
          "example": 51,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "pattern",
          "label": "Мерка по лекалу, см",
          "example": 50,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Разные припуски и усадку учтите до сравнения.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "см",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g5-13",
      "group": "g5",
      "groupTitle": "Качество текстиля и швейки",
      "topic": "Усреднение результатов испытаний",
      "status": "implemented",
      "calculatorId": "g5-13",
      "href": "calculator.html?atlasTool=g5-13#labAtlasTools",
      "formula": "Среднее = Σx/n.",
      "outputUnit": "среднее",
      "trigger": "live",
      "inputs": [
        {
          "key": "values",
          "label": "Результаты через ;",
          "example": "2;4;6",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Равноценные наблюдения; медиана рассчитывается по отсортированному ряду.",
      "reference": {
        "expected": 4,
        "actual": 4,
        "unit": "среднее",
        "tolerance": 4e-8,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g5-14",
      "group": "g5",
      "groupTitle": "Качество текстиля и швейки",
      "topic": "Разброс повторных замеров",
      "status": "implemented",
      "calculatorId": "g5-14",
      "href": "calculator.html?atlasTool=g5-14#labAtlasTools",
      "formula": "Выборочное стандартное отклонение = sqrt(Σ(x−среднее)²/(n−1)).",
      "outputUnit": "единиц измерения",
      "trigger": "live",
      "inputs": [
        {
          "key": "values",
          "label": "Повторные замеры через ;",
          "example": "8;10;12",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Разброс повторных замеров в заданных условиях; не полная межлабораторная воспроизводимость.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "единиц измерения",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g5-15",
      "group": "g5",
      "groupTitle": "Качество текстиля и швейки",
      "topic": "Условный балл пиллингуемости",
      "status": "implemented",
      "calculatorId": "g5-15",
      "href": "calculator.html?atlasTool=g5-15#labAtlasTools",
      "formula": "Условный средний балл = сумма экспертных оценок / число оценок.",
      "outputUnit": "балла",
      "trigger": "live",
      "inputs": [
        {
          "key": "grades",
          "label": "Экспертные оценки по выбранным эталонам, 1…5; через ;",
          "example": "2;3;4",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": 1,
          "max": 5,
          "choices": null
        }
      ],
      "limits": "Оценки по эталонам задаёт человек. Калькулятор не определяет пиллингуемость по изображению и не заменяет стандартизированную визуальную оценку.",
      "reference": {
        "expected": 3,
        "actual": 3,
        "unit": "балла",
        "tolerance": 3.0000000000000004e-8,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g5-16",
      "group": "g5",
      "groupTitle": "Качество текстиля и швейки",
      "topic": "Скорость изменения числа дефектных единиц",
      "status": "implemented",
      "calculatorId": "g5-16",
      "href": "calculator.html?atlasTool=g5-16#labAtlasTools",
      "formula": "Наблюдаемая скорость изменения = (конец − начало)/время.",
      "outputUnit": "дефектных единиц/ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "before",
          "label": "Дефектных единиц в начале",
          "example": 10,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "after",
          "label": "Дефектных единиц в конце",
          "example": 30,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "hours",
          "label": "Интервал наблюдения, ч",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Измеренная линейная скорость изменения числа дефектных единиц. Не модель причинного распространения дефекта по материалу.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "дефектных единиц/ч",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g5-17",
      "group": "g5",
      "groupTitle": "Качество текстиля и швейки",
      "topic": "Потери от ремонта изделия",
      "status": "implemented",
      "calculatorId": "g5-17",
      "href": "calculator.html?atlasTool=g5-17#labAtlasTools",
      "formula": "Потери = часы × ставка + материалы.",
      "outputUnit": "₽",
      "trigger": "live",
      "inputs": [
        {
          "key": "hours",
          "label": "Часов ремонта",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rate",
          "label": "Стоимость часа, ₽/ч",
          "example": 500,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "materials",
          "label": "Материалы ремонта, ₽",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Простои, логистика и упущенная прибыль включаются отдельно.",
      "reference": {
        "expected": 6000,
        "actual": 6000,
        "unit": "₽",
        "tolerance": 0.00006,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g5-18",
      "group": "g5",
      "groupTitle": "Качество текстиля и швейки",
      "topic": "Чувствительность входного контроля",
      "status": "implemented",
      "calculatorId": "g5-18",
      "href": "calculator.html?atlasTool=g5-18#labAtlasTools",
      "formula": "Показатель = события / проверенные единицы × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "events",
          "label": "Выявленных истинно дефектных по входному контролю",
          "example": 10,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "total",
          "label": "Всего истинно дефектных по независимому эталонному контролю",
          "example": 100,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Чувствительность выявления дефектных, не общая точность и не доля правильно принятых изделий.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "%",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g5-19",
      "group": "g5",
      "groupTitle": "Качество текстиля и швейки",
      "topic": "Отношение разброса партии к базовому",
      "status": "implemented",
      "calculatorId": "g5-19",
      "href": "calculator.html?atlasTool=g5-19#labAtlasTools",
      "formula": "Отношение разброса = σ партии / σ базовой партии.",
      "outputUnit": "раз",
      "trigger": "live",
      "inputs": [
        {
          "key": "sigma",
          "label": "Разброс контролируемой партии",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "reference",
          "label": "Базовый разброс сравнения",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Условный показатель сравнения разброса; сам по себе не доказывает статистическую стабильность партии.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "раз",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g5-20",
      "group": "g5",
      "groupTitle": "Качество текстиля и швейки",
      "topic": "Частота дефектов на тысячу метров",
      "status": "implemented",
      "calculatorId": "g5-20",
      "href": "calculator.html?atlasTool=g5-20#labAtlasTools",
      "formula": "Дефекты/1000 м = дефекты × 1000 / длина.",
      "outputUnit": "дефектов/1000 м",
      "trigger": "live",
      "inputs": [
        {
          "key": "defects",
          "label": "Дефектов",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Проверено, м",
          "example": 2500,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Дефектов на одном метре может быть несколько.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "дефектов/1000 м",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://textilenotes.com/calculators"
    },
    {
      "id": "g6-1",
      "group": "g6",
      "groupTitle": "Морские переходы и навигация",
      "topic": "Время перехода по морским милям",
      "status": "implemented",
      "calculatorId": "g6-1",
      "href": "calculator.html?atlasTool=g6-1#labAtlasTools",
      "formula": "Время = морские мили / узлы.",
      "outputUnit": "ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "distance",
          "label": "Путь по грунту, морских миль",
          "example": 120,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "speed",
          "label": "Средняя путевая скорость, узлы",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Скорость именно по грунту; остановки и изменение скорости отдельно.",
      "reference": {
        "expected": 12,
        "actual": 12,
        "unit": "ч",
        "tolerance": 1.2000000000000002e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g6-2",
      "group": "g6",
      "groupTitle": "Морские переходы и навигация",
      "topic": "Скорость в узлах и км/ч",
      "status": "implemented",
      "calculatorId": "g6-2",
      "href": "calculator.html?atlasTool=g6-2#labAtlasTools",
      "formula": "км/ч = узлы × 1.852.",
      "outputUnit": "км/ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "knots",
          "label": "Скорость, узлы",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Международная морская миля ровно 1852 м.",
      "reference": {
        "expected": 18.52,
        "actual": 18.52,
        "unit": "км/ч",
        "tolerance": 1.852e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g6-3",
      "group": "g6",
      "groupTitle": "Морские переходы и навигация",
      "topic": "Пройденный путь за вахту",
      "status": "implemented",
      "calculatorId": "g6-3",
      "href": "calculator.html?atlasTool=g6-3#labAtlasTools",
      "formula": "Расстояние = скорость × время.",
      "outputUnit": "морских миль",
      "trigger": "live",
      "inputs": [
        {
          "key": "speed",
          "label": "Средняя путевая скорость, узлы",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "hours",
          "label": "Продолжительность движения, ч",
          "example": 4,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Постоянная или корректно осреднённая скорость.",
      "reference": {
        "expected": 40,
        "actual": 40,
        "unit": "морских миль",
        "tolerance": 4e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g6-4",
      "group": "g6",
      "groupTitle": "Морские переходы и навигация",
      "topic": "Оценка времени прибытия ETA",
      "status": "implemented",
      "calculatorId": "g6-4",
      "href": "calculator.html?atlasTool=g6-4#labAtlasTools",
      "formula": "ETA = UTC выхода + путь/скорость + стоянки.",
      "outputUnit": "ч до ETA",
      "trigger": "live",
      "inputs": [
        {
          "key": "departure",
          "label": "Время выхода UTC, YYYY-MM-DDTHH:MM:SSZ",
          "example": "2026-01-01T00:00:00Z",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": true,
          "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$",
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "distance",
          "label": "Путь по грунту, морские мили",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "speed",
          "label": "Средняя скорость по грунту, узлы",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "stops",
          "label": "Плановые стоянки, ч",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Оценка по заданной средней скорости, без прогноза погоды и ограничений маршрута.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "ч до ETA",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g6-5",
      "group": "g6",
      "groupTitle": "Морские переходы и навигация",
      "topic": "Течение: снос и путевая скорость",
      "status": "implemented",
      "calculatorId": "g6-5",
      "href": "calculator.html?atlasTool=g6-5#labAtlasTools",
      "formula": "Путевая скорость = длина векторной суммы скорости судна и течения.",
      "outputUnit": "узлов SOG",
      "trigger": "live",
      "inputs": [
        {
          "key": "speed",
          "label": "Скорость судна относительно воды, узлы",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "heading",
          "label": "Истинный курс судна, градусы",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 360,
          "choices": null
        },
        {
          "key": "current",
          "label": "Скорость течения, узлы",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "direction",
          "label": "Направление течения КУДА, градусы",
          "example": 90,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 360,
          "choices": null
        }
      ],
      "limits": "Углы от истинного севера по часовой стрелке; течение задаётся направлением КУДА.",
      "reference": {
        "expected": 10.198039027185569,
        "actual": 10.1980390272,
        "unit": "узлов SOG",
        "tolerance": 1.0198039027185569e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g6-6",
      "group": "g6",
      "groupTitle": "Морские переходы и навигация",
      "topic": "Компоненты истинного ветра относительно курса",
      "status": "implemented",
      "calculatorId": "g6-6",
      "href": "calculator.html?atlasTool=g6-6#labAtlasTools",
      "formula": "Встречная компонента = ветер × cos(откуда − курс).",
      "outputUnit": "узлов навстречу",
      "trigger": "live",
      "inputs": [
        {
          "key": "wind",
          "label": "Скорость истинного ветра, узлы",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "direction",
          "label": "Направление ветра ОТКУДА, градусы",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 360,
          "choices": null
        },
        {
          "key": "heading",
          "label": "Истинный курс судна, градусы",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 360,
          "choices": null
        }
      ],
      "limits": "Это компоненты истинного ветра в осях курса, не кажущийся ветер на движущемся судне.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "узлов навстречу",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g6-7",
      "group": "g6",
      "groupTitle": "Морские переходы и навигация",
      "topic": "Поперечная составляющая ветра для судна",
      "status": "implemented",
      "calculatorId": "g6-7",
      "href": "calculator.html?atlasTool=g6-7#labAtlasTools",
      "formula": "Поперечная компонента справа = ветер × sin(откуда − курс).",
      "outputUnit": "узлов справа",
      "trigger": "live",
      "inputs": [
        {
          "key": "wind",
          "label": "Скорость ветра, узлы",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "direction",
          "label": "Ветер ОТКУДА, градусы",
          "example": 90,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 360,
          "choices": null
        },
        {
          "key": "heading",
          "label": "Курс, градусы",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 360,
          "choices": null
        }
      ],
      "limits": "Положительное значение: ветер приходит справа; это не сила на корпусе.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "узлов справа",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g6-8",
      "group": "g6",
      "groupTitle": "Морские переходы и навигация",
      "topic": "Перевод координат DMS ↔ градусы",
      "status": "implemented",
      "calculatorId": "g6-8",
      "href": "calculator.html?atlasTool=g6-8#labAtlasTools",
      "formula": "Десятичные градусы = знак × (|градусы| + минуты/60 + секунды/3600).",
      "outputUnit": "градусы",
      "trigger": "live",
      "inputs": [
        {
          "key": "degrees",
          "label": "Градусы со знаком (для −0 введите −0)",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "minutes",
          "label": "Минуты",
          "example": 30,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 59.999999999,
          "choices": null
        },
        {
          "key": "seconds",
          "label": "Секунды",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 59.999999999,
          "choices": null
        }
      ],
      "limits": "Знак задаётся градусной частью. Для широты дополнительно контролируйте предел ±90°, для долготы ±180°.",
      "reference": {
        "expected": 10.5,
        "actual": 10.5,
        "unit": "градусы",
        "tolerance": 1.05e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g6-9",
      "group": "g6",
      "groupTitle": "Морские переходы и навигация",
      "topic": "Ортодромическое расстояние",
      "status": "implemented",
      "calculatorId": "g6-9",
      "href": "calculator.html?atlasTool=g6-9#labAtlasTools",
      "formula": "Расстояние большого круга на сфере: haversine, R=6371 км.",
      "outputUnit": "морских миль",
      "trigger": "live",
      "inputs": [
        {
          "key": "lat1",
          "label": "Широта точки 1, градусы",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": -90,
          "max": 90,
          "choices": null
        },
        {
          "key": "lon1",
          "label": "Долгота точки 1, градусы",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": -180,
          "max": 180,
          "choices": null
        },
        {
          "key": "lat2",
          "label": "Широта точки 2, градусы",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": -90,
          "max": 90,
          "choices": null
        },
        {
          "key": "lon2",
          "label": "Долгота точки 2, градусы",
          "example": 90,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": -180,
          "max": 180,
          "choices": null
        }
      ],
      "limits": "Сферическое приближение, не эллипсоид WGS84, маршрут с препятствиями или навигационная рекомендация.",
      "reference": {
        "expected": 5403.641143634063,
        "actual": 5403.64114363,
        "unit": "морских миль",
        "tolerance": 0.000054036411436340634,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g6-10",
      "group": "g6",
      "groupTitle": "Морские переходы и навигация",
      "topic": "Локсодромическое расстояние",
      "status": "implemented",
      "calculatorId": "g6-10",
      "href": "calculator.html?atlasTool=g6-10#labAtlasTools",
      "formula": "Локсодромия на сфере: d = R sqrt(Δφ² + q²Δλ²), q=Δφ/Δln(tan(π/4+φ/2)).",
      "outputUnit": "км",
      "trigger": "live",
      "inputs": [
        {
          "key": "lat1",
          "label": "Широта точки 1, градусы",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": -90,
          "max": 90,
          "choices": null
        },
        {
          "key": "lon1",
          "label": "Долгота точки 1, градусы",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": -180,
          "max": 180,
          "choices": null
        },
        {
          "key": "lat2",
          "label": "Широта точки 2, градусы",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": -90,
          "max": 90,
          "choices": null
        },
        {
          "key": "lon2",
          "label": "Долгота точки 2, градусы",
          "example": 90,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": -180,
          "max": 180,
          "choices": null
        }
      ],
      "limits": "Кратчайшее по долготе локсодромическое направление на сфере; полюса исключены.",
      "reference": {
        "expected": 10007.543398010286,
        "actual": 10007.543398,
        "unit": "км",
        "tolerance": 0.00010007543398010286,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g6-11",
      "group": "g6",
      "groupTitle": "Морские переходы и навигация",
      "topic": "Начальный азимут между координатами",
      "status": "implemented",
      "calculatorId": "g6-11",
      "href": "calculator.html?atlasTool=g6-11#labAtlasTools",
      "formula": "Начальный азимут = atan2(sin Δλ cos φ2, cos φ1 sin φ2 − sin φ1 cos φ2 cos Δλ).",
      "outputUnit": "градусы",
      "trigger": "live",
      "inputs": [
        {
          "key": "lat1",
          "label": "Широта точки 1, градусы",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": -90,
          "max": 90,
          "choices": null
        },
        {
          "key": "lon1",
          "label": "Долгота точки 1, градусы",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": -180,
          "max": 180,
          "choices": null
        },
        {
          "key": "lat2",
          "label": "Широта точки 2, градусы",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": -90,
          "max": 90,
          "choices": null
        },
        {
          "key": "lon2",
          "label": "Долгота точки 2, градусы",
          "example": 90,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": -180,
          "max": 180,
          "choices": null
        }
      ],
      "limits": "Начальный азимут большого круга на сфере; не постоянный курс всего маршрута.",
      "reference": {
        "expected": 90,
        "actual": 90,
        "unit": "градусы",
        "tolerance": 9.000000000000001e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g6-12",
      "group": "g6",
      "groupTitle": "Морские переходы и навигация",
      "topic": "Магнитное склонение при заданных данных",
      "status": "implemented",
      "calculatorId": "g6-12",
      "href": "calculator.html?atlasTool=g6-12#labAtlasTools",
      "formula": "Склонение E+ = истинное − магнитное, приведённое к [−180,180).",
      "outputUnit": "градусы E+",
      "trigger": "live",
      "inputs": [
        {
          "key": "true",
          "label": "Известное истинное направление, °",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 360,
          "choices": null
        },
        {
          "key": "magnetic",
          "label": "Измеренное магнитное направление, °",
          "example": 95,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 360,
          "choices": null
        }
      ],
      "limits": "Склонение по двум согласованным направлениям; не геомагнитная модель по координатам и дате.",
      "reference": {
        "expected": 5,
        "actual": 5,
        "unit": "градусы E+",
        "tolerance": 5e-8,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g6-13",
      "group": "g6",
      "groupTitle": "Морские переходы и навигация",
      "topic": "Истинный и компасный курс",
      "status": "implemented",
      "calculatorId": "g6-13",
      "href": "calculator.html?atlasTool=g6-13#labAtlasTools",
      "formula": "Истинный курс = компасный + девиация + склонение, modulo 360.",
      "outputUnit": "градусы истинные",
      "trigger": "live",
      "inputs": [
        {
          "key": "compass",
          "label": "Компасный курс, °",
          "example": 90,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 360,
          "choices": null
        },
        {
          "key": "deviation",
          "label": "Девиация, ° E+",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "variation",
          "label": "Магнитное склонение, ° E+",
          "example": 3,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Восточные поправки положительны; таблица девиации и склонение задаются пользователем.",
      "reference": {
        "expected": 95,
        "actual": 95,
        "unit": "градусы истинные",
        "tolerance": 9.5e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g6-14",
      "group": "g6",
      "groupTitle": "Морские переходы и навигация",
      "topic": "Поправка гирокомпаса",
      "status": "implemented",
      "calculatorId": "g6-14",
      "href": "calculator.html?atlasTool=g6-14#labAtlasTools",
      "formula": "Поправка гиро = истинный − гирокурс, в [−180,180).",
      "outputUnit": "градусы",
      "trigger": "live",
      "inputs": [
        {
          "key": "true",
          "label": "Истинный курс, °",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 360,
          "choices": null
        },
        {
          "key": "gyro",
          "label": "Показание гирокомпаса, °",
          "example": 98,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 360,
          "choices": null
        }
      ],
      "limits": "Не модель скоростной или широтной поправки гирокомпаса.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "градусы",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g6-15",
      "group": "g6",
      "groupTitle": "Морские переходы и навигация",
      "topic": "Разница показаний лага",
      "status": "implemented",
      "calculatorId": "g6-15",
      "href": "calculator.html?atlasTool=g6-15#labAtlasTools",
      "formula": "Относительная разница = (лаг − опорный)/опорный × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "log",
          "label": "Путь по лагу, морские мили",
          "example": 98,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "reference",
          "label": "Опорный путь, морские мили",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Опорный путь и путь по лагу должны относиться к одной базе: путь относительно воды и грунта различаются течением.",
      "reference": {
        "expected": -2,
        "actual": -2,
        "unit": "%",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g6-16",
      "group": "g6",
      "groupTitle": "Морские переходы и навигация",
      "topic": "Отношение пройденного пути к топливу",
      "status": "implemented",
      "calculatorId": "g6-16",
      "href": "calculator.html?atlasTool=g6-16#labAtlasTools",
      "formula": "Удельный пробег = путь/топливо.",
      "outputUnit": "морских миль/т",
      "trigger": "live",
      "inputs": [
        {
          "key": "distance",
          "label": "Пройдено, морские мили",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "fuel",
          "label": "Израсходовано топлива, т",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Один и тот же период и состав расхода.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "морских миль/т",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g6-17",
      "group": "g6",
      "groupTitle": "Морские переходы и навигация",
      "topic": "Средняя скорость по журналу",
      "status": "implemented",
      "calculatorId": "g6-17",
      "href": "calculator.html?atlasTool=g6-17#labAtlasTools",
      "formula": "Средняя скорость = сумма путей/сумма времени.",
      "outputUnit": "узлов",
      "trigger": "live",
      "inputs": [
        {
          "key": "distance",
          "label": "Пути по участкам, морские мили; через ;",
          "example": "20;40",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "hours",
          "label": "Времена участков, ч; через ;",
          "example": "2;4",
          "positive": true,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не среднее арифметическое скоростей участков.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "узлов",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g6-18",
      "group": "g6",
      "groupTitle": "Морские переходы и навигация",
      "topic": "Интервалы времени вахт",
      "status": "implemented",
      "calculatorId": "g6-18",
      "href": "calculator.html?atlasTool=g6-18#labAtlasTools",
      "formula": "Длительность = ((конец−начало+24) mod 24) + 24 × дополнительных суток.",
      "outputUnit": "ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "start",
          "label": "Час начала по одним часам, 0…24",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 23.999999,
          "choices": null
        },
        {
          "key": "end",
          "label": "Час окончания, 0…24",
          "example": 4,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 23.999999,
          "choices": null
        },
        {
          "key": "days",
          "label": "Дополнительных полных суток",
          "example": 0,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 365,
          "choices": null
        }
      ],
      "limits": "При одинаковых часах результат 0 без добавленных суток. Часы в одной временной шкале, без перехода DST.",
      "reference": {
        "expected": 8,
        "actual": 8,
        "unit": "ч",
        "tolerance": 8e-8,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g6-19",
      "group": "g6",
      "groupTitle": "Морские переходы и навигация",
      "topic": "Перевод UTC и судового времени",
      "status": "implemented",
      "calculatorId": "g6-19",
      "href": "calculator.html?atlasTool=g6-19#labAtlasTools",
      "formula": "Судовое время = UTC + заданное смещение.",
      "outputUnit": "час судового времени",
      "trigger": "live",
      "inputs": [
        {
          "key": "utc",
          "label": "Час UTC, 0…24",
          "example": 22,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 23.999999,
          "choices": null
        },
        {
          "key": "offset",
          "label": "Судовой пояс относительно UTC, ч",
          "example": 3,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": -14,
          "max": 14,
          "choices": null
        }
      ],
      "limits": "Пояс и его смену задаёт пользователь; исторические зоны/DST автоматически не определяются.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "час судового времени",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g6-20",
      "group": "g6",
      "groupTitle": "Морские переходы и навигация",
      "topic": "Коэффициент запаса хода",
      "status": "implemented",
      "calculatorId": "g6-20",
      "href": "calculator.html?atlasTool=g6-20#labAtlasTools",
      "formula": "Отношение запаса хода к маршруту = доступный/плановый.",
      "outputUnit": "раз",
      "trigger": "live",
      "inputs": [
        {
          "key": "available",
          "label": "Доступный запас хода, морские мили",
          "example": 1200,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "route",
          "label": "Плановый путь, морские мили",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не устанавливает безопасный резерв топлива и не учитывает погоду.",
      "reference": {
        "expected": 1.2,
        "actual": 1.2,
        "unit": "раз",
        "tolerance": 1.2e-8,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g7-1",
      "group": "g7",
      "groupTitle": "Гидростатика и остойчивость судна",
      "topic": "Приближённое водоизмещение по обводам",
      "status": "implemented",
      "calculatorId": "g7-1",
      "href": "calculator.html?atlasTool=g7-1#labAtlasTools",
      "formula": "Водоизмещение ≈ плотность × трапецеидальный интеграл площади погружённых сечений по длине.",
      "outputUnit": "т",
      "trigger": "live",
      "inputs": [
        {
          "key": "stations",
          "label": "Продольные координаты сечений, м; через ;",
          "example": "0;10;20",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "areas",
          "label": "Площади погружённых сечений, м²; через ;",
          "example": "0;10;0",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Плотность воды, т/м³",
          "example": 1.025,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Приближение по реальным сечениям на заданной ватерлинии; точность зависит от разбиения. Не расчёт устойчивости.",
      "reference": {
        "expected": 102.5,
        "actual": 102.5,
        "unit": "т",
        "tolerance": 0.000001025,
        "status": "passed"
      },
      "researchSource": "https://metacad.io/en/"
    },
    {
      "id": "g7-2",
      "group": "g7",
      "groupTitle": "Гидростатика и остойчивость судна",
      "topic": "Коэффициент общей полноты Cb",
      "status": "implemented",
      "calculatorId": "g7-2",
      "href": "calculator.html?atlasTool=g7-2#labAtlasTools",
      "formula": "Cb = ∇/(LBT).",
      "outputUnit": "Cb",
      "trigger": "live",
      "inputs": [
        {
          "key": "volume",
          "label": "Погружённый объём, м³",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Расчётная длина L, м",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "beam",
          "label": "Ширина B, м",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "draft",
          "label": "Осадка T, м",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Размеры и объём должны соответствовать одной конвенции и ватерлинии.",
      "reference": {
        "expected": 0.5,
        "actual": 0.5,
        "unit": "Cb",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://metacad.io/en/"
    },
    {
      "id": "g7-3",
      "group": "g7",
      "groupTitle": "Гидростатика и остойчивость судна",
      "topic": "Коэффициент полноты ватерлинии Cwp",
      "status": "implemented",
      "calculatorId": "g7-3",
      "href": "calculator.html?atlasTool=g7-3#labAtlasTools",
      "formula": "Cwp = Aw/(Lw Bw).",
      "outputUnit": "Cwp",
      "trigger": "live",
      "inputs": [
        {
          "key": "area",
          "label": "Площадь ватерлинии, м²",
          "example": 800,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Расчётная длина ватерлинии, м",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "beam",
          "label": "Ширина ватерлинии, м",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Размеры по одной ватерлинии.",
      "reference": {
        "expected": 0.8,
        "actual": 0.8,
        "unit": "Cwp",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://metacad.io/en/"
    },
    {
      "id": "g7-4",
      "group": "g7",
      "groupTitle": "Гидростатика и остойчивость судна",
      "topic": "Коэффициент мидель-шпангоута Cm",
      "status": "implemented",
      "calculatorId": "g7-4",
      "href": "calculator.html?atlasTool=g7-4#labAtlasTools",
      "formula": "Cm = Am/(BT).",
      "outputUnit": "Cm",
      "trigger": "live",
      "inputs": [
        {
          "key": "area",
          "label": "Погружённая площадь миделя, м²",
          "example": 18,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "beam",
          "label": "Ширина миделя B, м",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "draft",
          "label": "Осадка миделя T, м",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Одна принятая плоскость мидель-шпангоута и ватерлиния.",
      "reference": {
        "expected": 0.9,
        "actual": 0.9,
        "unit": "Cm",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://metacad.io/en/"
    },
    {
      "id": "g7-5",
      "group": "g7",
      "groupTitle": "Гидростатика и остойчивость судна",
      "topic": "Коэффициент призматической полноты Cp",
      "status": "implemented",
      "calculatorId": "g7-5",
      "href": "calculator.html?atlasTool=g7-5#labAtlasTools",
      "formula": "Cp = ∇/(Am L).",
      "outputUnit": "Cp",
      "trigger": "live",
      "inputs": [
        {
          "key": "volume",
          "label": "Погружённый объём, м³",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "area",
          "label": "Площадь миделя Am, м²",
          "example": 20,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Расчётная длина L, м",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Согласуйте длину и выбранное опорное сечение.",
      "reference": {
        "expected": 0.5,
        "actual": 0.5,
        "unit": "Cp",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://metacad.io/en/"
    },
    {
      "id": "g7-6",
      "group": "g7",
      "groupTitle": "Гидростатика и остойчивость судна",
      "topic": "Поправка осадки через TPC",
      "status": "implemented",
      "calculatorId": "g7-6",
      "href": "calculator.html?atlasTool=g7-6#labAtlasTools",
      "formula": "Изменение средней осадки = масса/TPC.",
      "outputUnit": "см",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Изменение массы, т (приём +)",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "tpc",
          "label": "Табличное TPC для текущей осадки, т/см",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Локальное малое изменение при неизменной площади ватерлинии; дифферент и плотность отдельно.",
      "reference": {
        "expected": 5,
        "actual": 5,
        "unit": "см",
        "tolerance": 5e-8,
        "status": "passed"
      },
      "researchSource": "https://metacad.io/en/"
    },
    {
      "id": "g7-7",
      "group": "g7",
      "groupTitle": "Гидростатика и остойчивость судна",
      "topic": "Момент изменения дифферента MCTC",
      "status": "implemented",
      "calculatorId": "g7-7",
      "href": "calculator.html?atlasTool=g7-7#labAtlasTools",
      "formula": "MCT1cm ≈ Δ × GML / (100L).",
      "outputUnit": "т·м/см",
      "trigger": "live",
      "inputs": [
        {
          "key": "displacement",
          "label": "Текущее водоизмещение, т",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "gml",
          "label": "Продольная метацентрическая высота GML, м",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Расчётная длина между точками дифферента, м",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Линеаризованная гидростатика малого дифферента; GML не поперечная GM.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "т·м/см",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://metacad.io/en/"
    },
    {
      "id": "g7-8",
      "group": "g7",
      "groupTitle": "Гидростатика и остойчивость судна",
      "topic": "Дифферент при перемещении груза",
      "status": "implemented",
      "calculatorId": "g7-8",
      "href": "calculator.html?atlasTool=g7-8#labAtlasTools",
      "formula": "Изменение дифферента = масса × перемещение/MCT1cm.",
      "outputUnit": "см",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Перемещаемый груз, т",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "distance",
          "label": "Продольное перемещение груза, м",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "mct",
          "label": "Табличное MCT1cm, т·м/см",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Малое перемещение уже находящегося на борту груза; не распределяет изменения осадки по оконечностям.",
      "reference": {
        "expected": 5,
        "actual": 5,
        "unit": "см",
        "tolerance": 5e-8,
        "status": "passed"
      },
      "researchSource": "https://metacad.io/en/"
    },
    {
      "id": "g7-9",
      "group": "g7",
      "groupTitle": "Гидростатика и остойчивость судна",
      "topic": "Изменение средней осадки",
      "status": "implemented",
      "calculatorId": "g7-9",
      "href": "calculator.html?atlasTool=g7-9#labAtlasTools",
      "formula": "Средняя осадка изменится на Δm/(ρAw) × 100.",
      "outputUnit": "см",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Изменение массы, т",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "area",
          "label": "Площадь ватерлинии, м²",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Плотность воды, т/м³",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Постоянная площадь ватерлинии; дифферент не включён.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "см",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://metacad.io/en/"
    },
    {
      "id": "g7-10",
      "group": "g7",
      "groupTitle": "Гидростатика и остойчивость судна",
      "topic": "Плечо остойчивости GZ по таблице",
      "status": "implemented",
      "calculatorId": "g7-10",
      "href": "calculator.html?atlasTool=g7-10#labAtlasTools",
      "formula": "GZ — линейная интерполяция между введёнными табличными точками.",
      "outputUnit": "м GZ",
      "trigger": "live",
      "inputs": [
        {
          "key": "angles",
          "label": "Углы из одобренной таблицы, градусы; через ;",
          "example": "0;30;60",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "gz",
          "label": "GZ из этой же таблицы, м; через ;",
          "example": "0;0.5;0.4",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "angle",
          "label": "Угол запроса, градусы",
          "example": 30,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Таблица должна относиться к конкретному судну и загрузке. Не строит GZ по массе и не проверяет критерии остойчивости.",
      "reference": {
        "expected": 0.5,
        "actual": 0.5,
        "unit": "м GZ",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://metacad.io/en/"
    },
    {
      "id": "g7-11",
      "group": "g7",
      "groupTitle": "Гидростатика и остойчивость судна",
      "topic": "Метацентрическая высота GM по исходным данным",
      "status": "implemented",
      "calculatorId": "g7-11",
      "href": "calculator.html?atlasTool=g7-11#labAtlasTools",
      "formula": "GM до поправок = KM − KG.",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "km",
          "label": "Метацентр KM из таблиц, м",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "kg",
          "label": "Вертикальная координата CG (KG), м",
          "example": 4,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Свободные поверхности, неучтённые массы и одобрение состояния отдельно. Само положительное GM не доказывает безопасность.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "м",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://metacad.io/en/"
    },
    {
      "id": "g7-12",
      "group": "g7",
      "groupTitle": "Гидростатика и остойчивость судна",
      "topic": "Поправка свободной поверхности",
      "status": "implemented",
      "calculatorId": "g7-12",
      "href": "calculator.html?atlasTool=g7-12#labAtlasTools",
      "formula": "Поправка GM = ρж (l b³/12)/Δ.",
      "outputUnit": "м снижения GM",
      "trigger": "live",
      "inputs": [
        {
          "key": "density",
          "label": "Плотность жидкости в танке, т/м³",
          "example": 0.8,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Длина свободной поверхности, м",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "width",
          "label": "Поперечная ширина свободной поверхности, м",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "displacement",
          "label": "Водоизмещение, т",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Один неперегороженный прямоугольный частично заполненный танк, малые крены. Для реальных танков применяйте табличный FSM.",
      "reference": {
        "expected": 0.005333333333333333,
        "actual": 0.00533333333333,
        "unit": "м снижения GM",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://metacad.io/en/"
    },
    {
      "id": "g7-13",
      "group": "g7",
      "groupTitle": "Гидростатика и остойчивость судна",
      "topic": "Оценка кренящего момента",
      "status": "implemented",
      "calculatorId": "g7-13",
      "href": "calculator.html?atlasTool=g7-13#labAtlasTools",
      "formula": "Кренящий массовый момент = масса × плечо.",
      "outputUnit": "т·м",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Масса перемещённого груза, т",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "offset",
          "label": "Поперечное перемещение, м",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Массовый эквивалент момента; направление знака задаётся выбранным бортом.",
      "reference": {
        "expected": 20,
        "actual": 20,
        "unit": "т·м",
        "tolerance": 2e-7,
        "status": "passed"
      },
      "researchSource": "https://metacad.io/en/"
    },
    {
      "id": "g7-14",
      "group": "g7",
      "groupTitle": "Гидростатика и остойчивость судна",
      "topic": "Расчёт перемещения центра тяжести",
      "status": "implemented",
      "calculatorId": "g7-14",
      "href": "calculator.html?atlasTool=g7-14#labAtlasTools",
      "formula": "Перемещение CG = масса груза × перемещение/общая масса.",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "displacement",
          "label": "Неизменная общая масса, т",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "mass",
          "label": "Перемещённая масса, т",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "distance",
          "label": "Перемещение груза по выбранной оси, м",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Только перемещение уже имеющегося груза, без приёма/снятия массы.",
      "reference": {
        "expected": 0.05,
        "actual": 0.05,
        "unit": "м",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://metacad.io/en/"
    },
    {
      "id": "g7-15",
      "group": "g7",
      "groupTitle": "Гидростатика и остойчивость судна",
      "topic": "Запас по введённым грузовым ограничениям",
      "status": "implemented",
      "calculatorId": "g7-15",
      "href": "calculator.html?atlasTool=g7-15#labAtlasTools",
      "formula": "Минимальный запас по введённым ограничениям = min(лимитi − фактическоеi).",
      "outputUnit": "единиц введённых таблиц",
      "trigger": "live",
      "inputs": [
        {
          "key": "actual",
          "label": "Фактические величины одной размерности по местам; через ;",
          "example": "80;90",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "limit",
          "label": "Соответствующие предельные значения из документа; через ;",
          "example": "100;100",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Сравнение только перечисленных одноразмерных ограничений. Не подтверждает все требования загрузки судна.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "единиц введённых таблиц",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://metacad.io/en/"
    },
    {
      "id": "g7-16",
      "group": "g7",
      "groupTitle": "Гидростатика и остойчивость судна",
      "topic": "Суммарная масса и продольный центр тяжести",
      "status": "implemented",
      "calculatorId": "g7-16",
      "href": "calculator.html?atlasTool=g7-16#labAtlasTools",
      "formula": "Суммарная масса = Σmi; продольный CG = Σmi xi/Σmi.",
      "outputUnit": "т",
      "trigger": "live",
      "inputs": [
        {
          "key": "positions",
          "label": "Продольные центры отсеков от datum, м; через ;",
          "example": "0;10;20",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "masses",
          "label": "Массы по отсекам, т; через ;",
          "example": "10;20;10",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "График заданных масс отсеков, не продольная прочность, эпюра изгибающих моментов или распределённая погонная нагрузка.",
      "reference": {
        "expected": 40,
        "actual": 40,
        "unit": "т",
        "tolerance": 4e-7,
        "status": "passed"
      },
      "researchSource": "https://metacad.io/en/"
    },
    {
      "id": "g7-17",
      "group": "g7",
      "groupTitle": "Гидростатика и остойчивость судна",
      "topic": "Запас плавучести по геометрии",
      "status": "implemented",
      "calculatorId": "g7-17",
      "href": "calculator.html?atlasTool=g7-17#labAtlasTools",
      "formula": "Эквивалент дополнительной плавучести = объём × плотность.",
      "outputUnit": "т",
      "trigger": "live",
      "inputs": [
        {
          "key": "volume",
          "label": "Водонепроницаемый объём над текущей ватерлинией, м³",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Плотность воды, т/м³",
          "example": 1.025,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Только заданный действительно водонепроницаемый объём; не расчёт непотопляемости или допустимого затопления.",
      "reference": {
        "expected": 102.5,
        "actual": 102.5,
        "unit": "т",
        "tolerance": 0.000001025,
        "status": "passed"
      },
      "researchSource": "https://metacad.io/en/"
    },
    {
      "id": "g7-18",
      "group": "g7",
      "groupTitle": "Гидростатика и остойчивость судна",
      "topic": "Интерполяция гидростатического параметра",
      "status": "implemented",
      "calculatorId": "g7-18",
      "href": "calculator.html?atlasTool=g7-18#labAtlasTools",
      "formula": "Линейная интерполяция одного табличного параметра по осадке.",
      "outputUnit": "единиц параметра",
      "trigger": "live",
      "inputs": [
        {
          "key": "draft",
          "label": "Осадки из гидростатической таблицы, м; через ;",
          "example": "1;2;3",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "values",
          "label": "Один выбранный параметр таблицы; через ;",
          "example": "100;250;450",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "query",
          "label": "Осадка запроса, м",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Реальная гидростатическая таблица задаётся пользователем; не генерирует характеристики неизвестного корпуса.",
      "reference": {
        "expected": 250,
        "actual": 250,
        "unit": "единиц параметра",
        "tolerance": 0.0000025,
        "status": "passed"
      },
      "researchSource": "https://metacad.io/en/"
    },
    {
      "id": "g7-19",
      "group": "g7",
      "groupTitle": "Гидростатика и остойчивость судна",
      "topic": "Приближённая площадь ватерлинии",
      "status": "implemented",
      "calculatorId": "g7-19",
      "href": "calculator.html?atlasTool=g7-19#labAtlasTools",
      "formula": "Aw ≈ трапецеидальный интеграл ширины по длине.",
      "outputUnit": "м²",
      "trigger": "live",
      "inputs": [
        {
          "key": "stations",
          "label": "Продольные координаты, м; через ;",
          "example": "0;50;100",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "widths",
          "label": "Полные ширины ватерлинии, м; через ;",
          "example": "0;10;0",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Площадь по табличным ординатам; точность зависит от частоты сечений.",
      "reference": {
        "expected": 500,
        "actual": 500,
        "unit": "м²",
        "tolerance": 0.000005,
        "status": "passed"
      },
      "researchSource": "https://metacad.io/en/"
    },
    {
      "id": "g7-20",
      "group": "g7",
      "groupTitle": "Гидростатика и остойчивость судна",
      "topic": "Оценка угла крена в ограниченной модели",
      "status": "implemented",
      "calculatorId": "g7-20",
      "href": "calculator.html?atlasTool=g7-20#labAtlasTools",
      "formula": "В ограниченной модели sinφ = M/(ΔGM).",
      "outputUnit": "градусы",
      "trigger": "live",
      "inputs": [
        {
          "key": "moment",
          "label": "Заданный кренящий массовый момент, т·м",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "displacement",
          "label": "Водоизмещение, т",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "gm",
          "label": "GM с поправками, м",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Только малая область GZ≈GM sinφ, постоянный заданный момент и положительное GM. Не критерий безопасности.",
      "reference": {
        "expected": 0.5729673448571527,
        "actual": 0.572967344857,
        "unit": "градусы",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://metacad.io/en/"
    },
    {
      "id": "g7-21",
      "group": "g7",
      "groupTitle": "Гидростатика и остойчивость судна",
      "topic": "Сравнение загрузочных состояний",
      "status": "implemented",
      "calculatorId": "g7-21",
      "href": "calculator.html?atlasTool=g7-21#labAtlasTools",
      "formula": "Разность KG = Σm2z2/Σm2 − Σm1z1/Σm1.",
      "outputUnit": "м (KG2 − KG1)",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass1",
          "label": "Массы состояния 1, т; через ;",
          "example": "100;100",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "z1",
          "label": "Высоты CG состояния 1, м; через ;",
          "example": "1;3",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "mass2",
          "label": "Массы состояния 2, т; через ;",
          "example": "100;100",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "z2",
          "label": "Высоты CG состояния 2, м; через ;",
          "example": "2;4",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Сравнивается только KG введённых масс. Различия водоизмещения, GZ и конструктивных ограничений не сводятся к этому одному числу.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "м (KG2 − KG1)",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://metacad.io/en/"
    },
    {
      "id": "g7-22",
      "group": "g7",
      "groupTitle": "Гидростатика и остойчивость судна",
      "topic": "Изменение плотности воды и осадки",
      "status": "implemented",
      "calculatorId": "g7-22",
      "href": "calculator.html?atlasTool=g7-22#labAtlasTools",
      "formula": "Изменение средней осадки = Δ(1/ρ2−1/ρ1)/Aw × 100.",
      "outputUnit": "см",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Неизменное водоизмещение, т",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "before",
          "label": "Исходная плотность воды, т/м³",
          "example": 1.025,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "after",
          "label": "Новая плотность воды, т/м³",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "area",
          "label": "Приблизительно постоянная площадь ватерлинии, м²",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Стеночный локальный переход плотности; реальную гидростатику и дифферент проверяйте по документации.",
      "reference": {
        "expected": 2.4390243902438935,
        "actual": 2.43902439024,
        "unit": "см",
        "tolerance": 2.4390243902438934e-8,
        "status": "passed"
      },
      "researchSource": "https://metacad.io/en/"
    },
    {
      "id": "g8-1",
      "group": "g8",
      "groupTitle": "Морские механизмы и судовые системы",
      "topic": "Проскальзывание гребного винта",
      "status": "implemented",
      "calculatorId": "g8-1",
      "href": "calculator.html?atlasTool=g8-1#labAtlasTools",
      "formula": "Кажущееся скольжение = (шаг × rpm × 60/1852 − скорость)/теоретическая скорость × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "pitch",
          "label": "Геометрический шаг винта, м",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rpm",
          "label": "Частота винта, об/мин",
          "example": 600,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "speed",
          "label": "Скорость судна относительно воды, узлы",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Скорость относительно воды; не гидродинамический КПД, влияние следа отдельно.",
      "reference": {
        "expected": 48.55555555555556,
        "actual": 48.5555555556,
        "unit": "%",
        "tolerance": 4.855555555555556e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g8-2",
      "group": "g8",
      "groupTitle": "Морские механизмы и судовые системы",
      "topic": "Теоретическая скорость от шага винта",
      "status": "implemented",
      "calculatorId": "g8-2",
      "href": "calculator.html?atlasTool=g8-2#labAtlasTools",
      "formula": "Теоретическая скорость = шаг × rpm × 60/1852.",
      "outputUnit": "узлов",
      "trigger": "live",
      "inputs": [
        {
          "key": "pitch",
          "label": "Шаг винта, м",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rpm",
          "label": "Частота винта, об/мин",
          "example": 600,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Нулевое скольжение, без попутного потока и кавитации; не прогноз фактической скорости судна.",
      "reference": {
        "expected": 19.438444924406046,
        "actual": 19.4384449244,
        "unit": "узлов",
        "tolerance": 1.9438444924406046e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g8-3",
      "group": "g8",
      "groupTitle": "Морские механизмы и судовые системы",
      "topic": "Время работы дизеля по запасу",
      "status": "implemented",
      "calculatorId": "g8-3",
      "href": "calculator.html?atlasTool=g8-3#labAtlasTools",
      "formula": "Время = полезный запас/расход.",
      "outputUnit": "ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "fuel",
          "label": "Полезный запас топлива после исключения резерва, т",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "burn",
          "label": "Измеренный расход, т/ч",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Резерв, режимы и условия должны быть определены до ввода.",
      "reference": {
        "expected": 50,
        "actual": 50,
        "unit": "ч",
        "tolerance": 5e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g8-4",
      "group": "g8",
      "groupTitle": "Морские механизмы и судовые системы",
      "topic": "Масса топлива по объёму и плотности",
      "status": "implemented",
      "calculatorId": "g8-4",
      "href": "calculator.html?atlasTool=g8-4#labAtlasTools",
      "formula": "Масса = объём × плотность.",
      "outputUnit": "т",
      "trigger": "live",
      "inputs": [
        {
          "key": "volume",
          "label": "Объём топлива при рабочей температуре, м³",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Плотность при той же температуре, т/м³",
          "example": 0.85,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не смешивать плотность при 15 °C с объёмом при другой температуре без поправки.",
      "reference": {
        "expected": 85,
        "actual": 85,
        "unit": "т",
        "tolerance": 8.5e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g8-5",
      "group": "g8",
      "groupTitle": "Морские механизмы и судовые системы",
      "topic": "Расход масла на моточас",
      "status": "implemented",
      "calculatorId": "g8-5",
      "href": "calculator.html?atlasTool=g8-5#labAtlasTools",
      "formula": "Расход масла = масса/моточасы.",
      "outputUnit": "кг/моточас",
      "trigger": "live",
      "inputs": [
        {
          "key": "oil",
          "label": "Израсходовано масла, кг",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "hours",
          "label": "Моточасов",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Учтите доливы, остатки и замену; не допустимая паспортная норма.",
      "reference": {
        "expected": 0.1,
        "actual": 0.1,
        "unit": "кг/моточас",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g8-6",
      "group": "g8",
      "groupTitle": "Морские механизмы и судовые системы",
      "topic": "Удельный расход топлива SFOC",
      "status": "implemented",
      "calculatorId": "g8-6",
      "href": "calculator.html?atlasTool=g8-6#labAtlasTools",
      "formula": "SFOC = топливо × 1000/энергия на валу.",
      "outputUnit": "г/(кВт·ч)",
      "trigger": "live",
      "inputs": [
        {
          "key": "fuel",
          "label": "Израсходовано топлива, кг",
          "example": 200,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "energy",
          "label": "Фактическая энергия на валу, кВт·ч",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Масса и энергия за один режим/период.",
      "reference": {
        "expected": 200,
        "actual": 200,
        "unit": "г/(кВт·ч)",
        "tolerance": 0.000002,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g8-7",
      "group": "g8",
      "groupTitle": "Морские механизмы и судовые системы",
      "topic": "Мощность на валу по моменту",
      "status": "implemented",
      "calculatorId": "g8-7",
      "href": "calculator.html?atlasTool=g8-7#labAtlasTools",
      "formula": "P = T × 2π × rpm/60/1000.",
      "outputUnit": "кВт",
      "trigger": "live",
      "inputs": [
        {
          "key": "torque",
          "label": "Момент, Н·м",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rpm",
          "label": "Обороты, об/мин",
          "example": 600,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Механическая мощность при согласованных моменте и скорости.",
      "reference": {
        "expected": 62.831853071795855,
        "actual": 62.8318530718,
        "unit": "кВт",
        "tolerance": 6.283185307179585e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g8-8",
      "group": "g8",
      "groupTitle": "Морские механизмы и судовые системы",
      "topic": "Часовой расход топлива на киловатт",
      "status": "implemented",
      "calculatorId": "g8-8",
      "href": "calculator.html?atlasTool=g8-8#labAtlasTools",
      "formula": "Часовой расход = мощность × SFOC/1000.",
      "outputUnit": "кг/ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "power",
          "label": "Средняя мощность, кВт",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "sfoc",
          "label": "SFOC для режима, г/(кВт·ч)",
          "example": 200,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "SFOC по характеристике именно данного режима, не универсальная константа дизеля.",
      "reference": {
        "expected": 200,
        "actual": 200,
        "unit": "кг/ч",
        "tolerance": 0.000002,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g8-9",
      "group": "g8",
      "groupTitle": "Морские механизмы и судовые системы",
      "topic": "Производительность балластного насоса",
      "status": "implemented",
      "calculatorId": "g8-9",
      "href": "calculator.html?atlasTool=g8-9#labAtlasTools",
      "formula": "Фактическая производительность = объём/время.",
      "outputUnit": "м³/ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "volume",
          "label": "Перекачано балласта, м³",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "hours",
          "label": "Время, ч",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не паспортная характеристика насоса при произвольном напоре.",
      "reference": {
        "expected": 50,
        "actual": 50,
        "unit": "м³/ч",
        "tolerance": 5e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g8-10",
      "group": "g8",
      "groupTitle": "Морские механизмы и судовые системы",
      "topic": "Время перекачки балласта",
      "status": "implemented",
      "calculatorId": "g8-10",
      "href": "calculator.html?atlasTool=g8-10#labAtlasTools",
      "formula": "Время = объём/подача.",
      "outputUnit": "ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "volume",
          "label": "Перемещаемый объём, м³",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "flow",
          "label": "Фактическая постоянная подача, м³/ч",
          "example": 50,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без изменения расхода по мере изменения уровня; остатки и режим зачистки отдельно.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "ч",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g8-11",
      "group": "g8",
      "groupTitle": "Морские механизмы и судовые системы",
      "topic": "Наполнение судовой цистерны",
      "status": "implemented",
      "calculatorId": "g8-11",
      "href": "calculator.html?atlasTool=g8-11#labAtlasTools",
      "formula": "Объём = начальный + подача × время.",
      "outputUnit": "м³",
      "trigger": "live",
      "inputs": [
        {
          "key": "initial",
          "label": "Начальный объём, м³",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "flow",
          "label": "Постоянная подача, м³/ч",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "hours",
          "label": "Время, ч",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "capacity",
          "label": "Рабочая геометрическая вместимость, м³",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Превышение заданной вместимости отклоняется; вентиляция и безопасный уровень заполнения отдельно.",
      "reference": {
        "expected": 50,
        "actual": 50,
        "unit": "м³",
        "tolerance": 5e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g8-12",
      "group": "g8",
      "groupTitle": "Морские механизмы и судовые системы",
      "topic": "Центр тяжести простой цистерны",
      "status": "implemented",
      "calculatorId": "g8-12",
      "href": "calculator.html?atlasTool=g8-12#labAtlasTools",
      "formula": "Высота CG жидкости = отметка дна + высота жидкости/2.",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "bottom",
          "label": "Отметка дна, м",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "height",
          "label": "Высота жидкости в прямоугольной цистерне, м",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Прямоугольная призматическая цистерна на ровном киле без внутренних объёмов; не геометрия произвольного танка.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "м",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g8-13",
      "group": "g8",
      "groupTitle": "Морские механизмы и судовые системы",
      "topic": "Водоотливная производительность",
      "status": "implemented",
      "calculatorId": "g8-13",
      "href": "calculator.html?atlasTool=g8-13#labAtlasTools",
      "formula": "Заданная подача = приток × (1 + запас/100).",
      "outputUnit": "м³/ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "inflow",
          "label": "Расчётный приток, м³/ч",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "reserve",
          "label": "Заданный запас производительности, %",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Арифметика по заданным притоку и запасу; не выполнение правил класса или аварийная оценка затопления.",
      "reference": {
        "expected": 12,
        "actual": 12,
        "unit": "м³/ч",
        "tolerance": 1.2000000000000002e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g8-14",
      "group": "g8",
      "groupTitle": "Морские механизмы и судовые системы",
      "topic": "Время опорожнения танка",
      "status": "implemented",
      "calculatorId": "g8-14",
      "href": "calculator.html?atlasTool=g8-14#labAtlasTools",
      "formula": "Время = объём/подача.",
      "outputUnit": "ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "volume",
          "label": "Перемещаемый объём, м³",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "flow",
          "label": "Фактическая постоянная подача, м³/ч",
          "example": 50,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без изменения расхода по мере изменения уровня; остатки и режим зачистки отдельно.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "ч",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g8-15",
      "group": "g8",
      "groupTitle": "Морские механизмы и судовые системы",
      "topic": "Смена плотности бункерного топлива",
      "status": "implemented",
      "calculatorId": "g8-15",
      "href": "calculator.html?atlasTool=g8-15#labAtlasTools",
      "formula": "ρ(T) = ρ0/(1 + αΔT).",
      "outputUnit": "т/м³",
      "trigger": "live",
      "inputs": [
        {
          "key": "density",
          "label": "Плотность топлива при T0, т/м³",
          "example": 0.85,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "alpha",
          "label": "Заданный объёмный коэффициент расширения, 1/К",
          "example": 0.0008,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "dt",
          "label": "T−T0, К",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Линейная оценка, не стандартная таблица коррекции объёма нефтепродуктов; α для данной партии и диапазона.",
      "reference": {
        "expected": 0.8366141732283465,
        "actual": 0.836614173228,
        "unit": "т/м³",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g8-16",
      "group": "g8",
      "groupTitle": "Морские механизмы и судовые системы",
      "topic": "Коэффициент использования цистерны",
      "status": "implemented",
      "calculatorId": "g8-16",
      "href": "calculator.html?atlasTool=g8-16#labAtlasTools",
      "formula": "Заполнение = объём/вместимость × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "volume",
          "label": "Фактический объём, м³",
          "example": 80,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "capacity",
          "label": "Геометрическая вместимость, м³",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не допустимая степень заполнения при данной температуре.",
      "reference": {
        "expected": 80,
        "actual": 80,
        "unit": "%",
        "tolerance": 8e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g8-17",
      "group": "g8",
      "groupTitle": "Морские механизмы и судовые системы",
      "topic": "Расход пресной воды экипажем",
      "status": "implemented",
      "calculatorId": "g8-17",
      "href": "calculator.html?atlasTool=g8-17#labAtlasTools",
      "formula": "Вода = люди × норма × сутки / 1000.",
      "outputUnit": "м³",
      "trigger": "live",
      "inputs": [
        {
          "key": "people",
          "label": "Человек",
          "example": 20,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "norm",
          "label": "Заданное потребление, л/(чел·сут)",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "days",
          "label": "Суток",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Норма и резерв задаются планом снабжения, не определяются этим расчётом.",
      "reference": {
        "expected": 20,
        "actual": 20,
        "unit": "м³",
        "tolerance": 2e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g8-18",
      "group": "g8",
      "groupTitle": "Морские механизмы и судовые системы",
      "topic": "Вентиляция машинного отделения",
      "status": "implemented",
      "calculatorId": "g8-18",
      "href": "calculator.html?atlasTool=g8-18#labAtlasTools",
      "formula": "Подача = теплопоступления/(ρ cp ΔT) × 3600.",
      "outputUnit": "м³/ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "heat",
          "label": "Явные теплопоступления, кВт",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Плотность воздуха, кг/м³",
          "example": 1.2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "cp",
          "label": "cp воздуха, кДж/(кг·К)",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "dt",
          "label": "Допустимый подъём температуры воздуха, К",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Только явная тепловая нагрузка; воздух на горение, газы, нормативные обмены и резерв отдельно.",
      "reference": {
        "expected": 30000,
        "actual": 30000,
        "unit": "м³/ч",
        "tolerance": 0.00030000000000000003,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g8-19",
      "group": "g8",
      "groupTitle": "Морские механизмы и судовые системы",
      "topic": "Тепловой баланс дизеля",
      "status": "implemented",
      "calculatorId": "g8-19",
      "href": "calculator.html?atlasTool=g8-19#labAtlasTools",
      "formula": "Прочая тепловая/потерянная мощность = топливо × НТС/3600 − мощность вала.",
      "outputUnit": "кВт",
      "trigger": "live",
      "inputs": [
        {
          "key": "fuel",
          "label": "Часовой расход топлива, кг/ч",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "lhv",
          "label": "НТС топлива, кДж/кг",
          "example": 42000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "shaft",
          "label": "Мощность на валу, кВт",
          "example": 300,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Агрегированный баланс; не разделяет охлаждение, выхлоп и излучение.",
      "reference": {
        "expected": 866.6666666666667,
        "actual": 866.666666667,
        "unit": "кВт",
        "tolerance": 0.000008666666666666668,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g8-20",
      "group": "g8",
      "groupTitle": "Морские механизмы и судовые системы",
      "topic": "Условное сопротивление хода по коэффициентам",
      "status": "implemented",
      "calculatorId": "g8-20",
      "href": "calculator.html?atlasTool=g8-20#labAtlasTools",
      "formula": "R = 0.5ρV²A C.",
      "outputUnit": "Н",
      "trigger": "live",
      "inputs": [
        {
          "key": "density",
          "label": "Плотность воды, кг/м³",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "speed",
          "label": "Скорость относительно воды, м/с",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "area",
          "label": "Заданная опорная площадь, м²",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "coefficient",
          "label": "Заданный коэффициент сопротивления",
          "example": 0.01,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Только условная коэффициентная модель. C и опорная площадь должны быть согласованы; не прогноз ходкости реального судна.",
      "reference": {
        "expected": 12500,
        "actual": 12500,
        "unit": "Н",
        "tolerance": 0.000125,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g9-1",
      "group": "g9",
      "groupTitle": "Порт, груз и морская логистика",
      "topic": "Количество контейнеров по массе",
      "status": "implemented",
      "calculatorId": "g9-1",
      "href": "calculator.html?atlasTool=g9-1#labAtlasTools",
      "formula": "Контейнеров по массе ≥ ceil(масса груза/полезная нагрузка).",
      "outputUnit": "контейнеров",
      "trigger": "live",
      "inputs": [
        {
          "key": "cargo",
          "label": "Масса груза, т",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "payload",
          "label": "Допустимая полезная нагрузка контейнера по документу, т",
          "example": 20,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Нижняя оценка по массе. Объём, распределение массы, осевые ограничения и крепление отдельно.",
      "reference": {
        "expected": 5,
        "actual": 5,
        "unit": "контейнеров",
        "tolerance": 5e-8,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g9-2",
      "group": "g9",
      "groupTitle": "Порт, груз и морская логистика",
      "topic": "TEU/FEU эквивалент",
      "status": "implemented",
      "calculatorId": "g9-2",
      "href": "calculator.html?atlasTool=g9-2#labAtlasTools",
      "formula": "TEU = 20-футовые + 2 × 40-футовые.",
      "outputUnit": "TEU",
      "trigger": "live",
      "inputs": [
        {
          "key": "twenty",
          "label": "20-футовых контейнеров",
          "example": 10,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "forty",
          "label": "40-футовых контейнеров",
          "example": 5,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Геометрический эквивалент; не масса и не доступные слоты конкретного судна.",
      "reference": {
        "expected": 20,
        "actual": 20,
        "unit": "TEU",
        "tolerance": 2e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g9-3",
      "group": "g9",
      "groupTitle": "Порт, груз и морская логистика",
      "topic": "Тариф перевалки за тонну",
      "status": "implemented",
      "calculatorId": "g9-3",
      "href": "calculator.html?atlasTool=g9-3#labAtlasTools",
      "formula": "Тариф = стоимость/тонны.",
      "outputUnit": "₽/т",
      "trigger": "live",
      "inputs": [
        {
          "key": "cost",
          "label": "Общая стоимость перевалки, ₽",
          "example": 10000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "mass",
          "label": "Перевалено, т",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Согласуйте состав включённых услуг и налогов.",
      "reference": {
        "expected": 100,
        "actual": 100,
        "unit": "₽/т",
        "tolerance": 0.000001,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g9-4",
      "group": "g9",
      "groupTitle": "Порт, груз и морская логистика",
      "topic": "Время погрузки трюма",
      "status": "implemented",
      "calculatorId": "g9-4",
      "href": "calculator.html?atlasTool=g9-4#labAtlasTools",
      "formula": "Время = масса/производительность.",
      "outputUnit": "ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "cargo",
          "label": "Масса к погрузке, т",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rate",
          "label": "Фактическая производительность, т/ч",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без ожидания и дополнительных перерывов.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "ч",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g9-5",
      "group": "g9",
      "groupTitle": "Порт, груз и морская логистика",
      "topic": "Производительность портового крана",
      "status": "implemented",
      "calculatorId": "g9-5",
      "href": "calculator.html?atlasTool=g9-5#labAtlasTools",
      "formula": "Производительность = груз за цикл × 60/цикл × доля работы.",
      "outputUnit": "т/ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "one",
          "label": "Средний груз за рабочий цикл, т",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "cycle",
          "label": "Полный цикл крана, мин",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "eff",
          "label": "Доля рабочего времени, %",
          "example": 80,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Цикл включает обратный ход; не проверяет грузовую характеристику крана.",
      "reference": {
        "expected": 96,
        "actual": 96,
        "unit": "т/ч",
        "tolerance": 9.600000000000001e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g9-6",
      "group": "g9",
      "groupTitle": "Порт, груз и морская логистика",
      "topic": "Масса груза из объёма и плотности",
      "status": "implemented",
      "calculatorId": "g9-6",
      "href": "calculator.html?atlasTool=g9-6#labAtlasTools",
      "formula": "Масса = объём × плотность.",
      "outputUnit": "т",
      "trigger": "live",
      "inputs": [
        {
          "key": "volume",
          "label": "Объём груза, м³",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Насыпная плотность, т/м³",
          "example": 0.8,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Плотность в транспортном состоянии.",
      "reference": {
        "expected": 80,
        "actual": 80,
        "unit": "т",
        "tolerance": 8e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g9-7",
      "group": "g9",
      "groupTitle": "Порт, груз и морская логистика",
      "topic": "Stowage factor м³/т",
      "status": "implemented",
      "calculatorId": "g9-7",
      "href": "calculator.html?atlasTool=g9-7#labAtlasTools",
      "formula": "Stowage factor = объём/масса.",
      "outputUnit": "м³/т",
      "trigger": "live",
      "inputs": [
        {
          "key": "volume",
          "label": "Занятый объём, м³",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "mass",
          "label": "Масса груза, т",
          "example": 50,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Уточните включение потерь укладки; это обратная величина к насыпной плотности только на одной базе.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "м³/т",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g9-8",
      "group": "g9",
      "groupTitle": "Порт, груз и морская логистика",
      "topic": "Дедвейт и загрузка",
      "status": "implemented",
      "calculatorId": "g9-8",
      "href": "calculator.html?atlasTool=g9-8#labAtlasTools",
      "formula": "Остаток дедвейта под груз = дедвейт − прочие переменные массы.",
      "outputUnit": "т",
      "trigger": "live",
      "inputs": [
        {
          "key": "dwt",
          "label": "Доступный дедвейт по заданному состоянию, т",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "fuel",
          "label": "Топливо, вода, снабжение и прочие переменные массы, т",
          "example": 200,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не проверяет грузовую марку, остойчивость, местную прочность или распределение груза.",
      "reference": {
        "expected": 800,
        "actual": 800,
        "unit": "т",
        "tolerance": 0.000008,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g9-9",
      "group": "g9",
      "groupTitle": "Порт, груз и морская логистика",
      "topic": "Плотность навалочного груза",
      "status": "implemented",
      "calculatorId": "g9-9",
      "href": "calculator.html?atlasTool=g9-9#labAtlasTools",
      "formula": "Насыпная плотность = масса/объём.",
      "outputUnit": "т/м³",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Масса, т",
          "example": 50,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "volume",
          "label": "Измеренный объём, м³",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Состояние уплотнения, влажность и метод замера влияют на значение.",
      "reference": {
        "expected": 0.5,
        "actual": 0.5,
        "unit": "т/м³",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g9-10",
      "group": "g9",
      "groupTitle": "Порт, груз и морская логистика",
      "topic": "Заполняемость трюма",
      "status": "implemented",
      "calculatorId": "g9-10",
      "href": "calculator.html?atlasTool=g9-10#labAtlasTools",
      "formula": "Объёмная заполненность = занятый/доступный × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "cargo",
          "label": "Занятый объём, м³",
          "example": 800,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "hold",
          "label": "Доступный объём трюма, м³",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не критерий безопасности загрузки.",
      "reference": {
        "expected": 80,
        "actual": 80,
        "unit": "%",
        "tolerance": 8e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g9-11",
      "group": "g9",
      "groupTitle": "Порт, груз и морская логистика",
      "topic": "Ограничение массы по грузовому месту",
      "status": "implemented",
      "calculatorId": "g9-11",
      "href": "calculator.html?atlasTool=g9-11#labAtlasTools",
      "formula": "Запас по одному введённому пределу = предел − масса.",
      "outputUnit": "т",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Масса грузового места, т",
          "example": 8,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "limit",
          "label": "Указанный документом предел, т",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не оценивает грузоподъёмность средств, распределение давления, крепления и все ограничения маршрута.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "т",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g9-12",
      "group": "g9",
      "groupTitle": "Порт, груз и морская логистика",
      "topic": "Время стоянки судна",
      "status": "implemented",
      "calculatorId": "g9-12",
      "href": "calculator.html?atlasTool=g9-12#labAtlasTools",
      "formula": "Стоянка = сумма неперекрывающихся интервалов.",
      "outputUnit": "ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "cargo",
          "label": "Грузовые работы, ч",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "waiting",
          "label": "Ожидание, ч",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "other",
          "label": "Прочие операции, ч",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Параллельные работы нельзя суммировать дважды.",
      "reference": {
        "expected": 13,
        "actual": 13,
        "unit": "ч",
        "tolerance": 1.3e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g9-13",
      "group": "g9",
      "groupTitle": "Порт, груз и морская логистика",
      "topic": "Расход топлива за стоянку",
      "status": "implemented",
      "calculatorId": "g9-13",
      "href": "calculator.html?atlasTool=g9-13#labAtlasTools",
      "formula": "Топливо = время × средний расход.",
      "outputUnit": "т",
      "trigger": "live",
      "inputs": [
        {
          "key": "hours",
          "label": "Стоянка, ч",
          "example": 24,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "burn",
          "label": "Средний расход на стоянке, т/ч",
          "example": 0.1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Состав работающих потребителей и фактический режим задаются пользователем.",
      "reference": {
        "expected": 2.4,
        "actual": 2.4,
        "unit": "т",
        "tolerance": 2.4e-8,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g9-14",
      "group": "g9",
      "groupTitle": "Порт, груз и морская логистика",
      "topic": "Портовые сборы по тарифу",
      "status": "implemented",
      "calculatorId": "g9-14",
      "href": "calculator.html?atlasTool=g9-14#labAtlasTools",
      "formula": "Сбор = база × тариф + фиксированные части.",
      "outputUnit": "₽",
      "trigger": "live",
      "inputs": [
        {
          "key": "basis",
          "label": "База начисления по тарифу",
          "example": 10000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rate",
          "label": "Тариф, ₽ на единицу базы",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "fixed",
          "label": "Фиксированные сборы, ₽",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "База (GT, масса, время и т.д.) и применимость тарифа задаются договором; это не актуальный тариф порта.",
      "reference": {
        "expected": 21000,
        "actual": 21000,
        "unit": "₽",
        "tolerance": 0.00021,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g9-15",
      "group": "g9",
      "groupTitle": "Порт, груз и морская логистика",
      "topic": "Баланс грузовых мест",
      "status": "implemented",
      "calculatorId": "g9-15",
      "href": "calculator.html?atlasTool=g9-15#labAtlasTools",
      "formula": "Остаток = поступило − отгружено − списано.",
      "outputUnit": "мест",
      "trigger": "live",
      "inputs": [
        {
          "key": "received",
          "label": "Поступило мест",
          "example": 100,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "loaded",
          "label": "Отгружено мест",
          "example": 80,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "loss",
          "label": "Списано мест",
          "example": 5,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Начальный остаток при необходимости включите в поступило.",
      "reference": {
        "expected": 15,
        "actual": 15,
        "unit": "мест",
        "tolerance": 1.5e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g9-16",
      "group": "g9",
      "groupTitle": "Порт, груз и морская логистика",
      "topic": "Раскладка контейнеров по рядам",
      "status": "implemented",
      "calculatorId": "g9-16",
      "href": "calculator.html?atlasTool=g9-16#labAtlasTools",
      "formula": "Рядов = ceil(контейнеры/места в ряду).",
      "outputUnit": "рядов",
      "trigger": "live",
      "inputs": [
        {
          "key": "count",
          "label": "Одинаковых контейнеров",
          "example": 23,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "row",
          "label": "Доступных мест в одном ряду по плану",
          "example": 10,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Только счёт мест по заданному плану, не автоматическая схема безопасной загрузки.",
      "reference": {
        "expected": 3,
        "actual": 3,
        "unit": "рядов",
        "tolerance": 3.0000000000000004e-8,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g9-17",
      "group": "g9",
      "groupTitle": "Порт, груз и морская логистика",
      "topic": "Простая оценка инерции груза",
      "status": "implemented",
      "calculatorId": "g9-17",
      "href": "calculator.html?atlasTool=g9-17#labAtlasTools",
      "formula": "Инерционная сила = масса × 1000 × ускорение.",
      "outputUnit": "Н",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Масса груза, т",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "accel",
          "label": "Заданное ускорение, м/с²",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Коэффициенты динамики и расчётное ускорение должны быть обоснованы; не расчёт крепления.",
      "reference": {
        "expected": 20000,
        "actual": 20000,
        "unit": "Н",
        "tolerance": 0.0002,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g9-18",
      "group": "g9",
      "groupTitle": "Порт, груз и морская логистика",
      "topic": "График работы причала",
      "status": "implemented",
      "calculatorId": "g9-18",
      "href": "calculator.html?atlasTool=g9-18#labAtlasTools",
      "formula": "Длительность волн обслуживания = ceil(заходы/причалы) × обслуживание.",
      "outputUnit": "ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "ships",
          "label": "Одинаковых последовательных судозаходов",
          "example": 5,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "hours",
          "label": "Время обслуживания одного, ч",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "berths",
          "label": "Идентичных независимых причалов",
          "example": 2,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Одинаковое время, все суда доступны в начале; не общий оптимизатор расписаний.",
      "reference": {
        "expected": 30,
        "actual": 30,
        "unit": "ч",
        "tolerance": 3e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g9-19",
      "group": "g9",
      "groupTitle": "Порт, груз и морская логистика",
      "topic": "Ставка фрахта на тонну",
      "status": "implemented",
      "calculatorId": "g9-19",
      "href": "calculator.html?atlasTool=g9-19#labAtlasTools",
      "formula": "Удельная ставка = фрахт/масса.",
      "outputUnit": "₽/т",
      "trigger": "live",
      "inputs": [
        {
          "key": "freight",
          "label": "Суммарная стоимость фрахта, ₽",
          "example": 1000000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "mass",
          "label": "Оплачиваемая масса, т",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без автоматически добавленных demurrage, сборов и условий договора.",
      "reference": {
        "expected": 1000,
        "actual": 1000,
        "unit": "₽/т",
        "tolerance": 0.00001,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g9-20",
      "group": "g9",
      "groupTitle": "Порт, груз и морская логистика",
      "topic": "Доля порожних контейнеров",
      "status": "implemented",
      "calculatorId": "g9-20",
      "href": "calculator.html?atlasTool=g9-20#labAtlasTools",
      "formula": "Порожние = порожние/все × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "empty",
          "label": "Порожних контейнеров",
          "example": 20,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "total",
          "label": "Всего контейнеров",
          "example": 100,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Одна единица учёта: контейнеры или TEU должны использоваться последовательно.",
      "reference": {
        "expected": 20,
        "actual": 20,
        "unit": "%",
        "tolerance": 2e-7,
        "status": "passed"
      },
      "researchSource": "https://shipcalculators.com/"
    },
    {
      "id": "g10-1",
      "group": "g10",
      "groupTitle": "Станки, ЧПУ и резание",
      "topic": "Обороты по скорости резания",
      "status": "implemented",
      "calculatorId": "g10-1",
      "href": "calculator.html?atlasTool=g10-1#labAtlasTools",
      "formula": "n = 1000 Vc / (πD).",
      "outputUnit": "об/мин",
      "trigger": "live",
      "inputs": [
        {
          "key": "speed",
          "label": "Скорость резания, м/мин",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "diameter",
          "label": "Диаметр, мм",
          "example": 50,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Скорость резания должна соответствовать материалу, инструменту и режиму.",
      "reference": {
        "expected": 636.6197723675814,
        "actual": 636.619772368,
        "unit": "об/мин",
        "tolerance": 0.000006366197723675814,
        "status": "passed"
      },
      "researchSource": "https://btengineering.net/"
    },
    {
      "id": "g10-2",
      "group": "g10",
      "groupTitle": "Станки, ЧПУ и резание",
      "topic": "Подача на зуб",
      "status": "implemented",
      "calculatorId": "g10-2",
      "href": "calculator.html?atlasTool=g10-2#labAtlasTools",
      "formula": "fz = минутная подача / (обороты × зубья).",
      "outputUnit": "мм/зуб",
      "trigger": "live",
      "inputs": [
        {
          "key": "feed",
          "label": "Минутная подача, мм/мин",
          "example": 400,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rpm",
          "label": "Обороты, об/мин",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "teeth",
          "label": "Зубьев",
          "example": 4,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Для фрезерования при заданных оборотах.",
      "reference": {
        "expected": 0.1,
        "actual": 0.1,
        "unit": "мм/зуб",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://btengineering.net/"
    },
    {
      "id": "g10-3",
      "group": "g10",
      "groupTitle": "Станки, ЧПУ и резание",
      "topic": "Подача на оборот",
      "status": "implemented",
      "calculatorId": "g10-3",
      "href": "calculator.html?atlasTool=g10-3#labAtlasTools",
      "formula": "f = минутная подача / обороты.",
      "outputUnit": "мм/об",
      "trigger": "live",
      "inputs": [
        {
          "key": "feed",
          "label": "Минутная подача, мм/мин",
          "example": 200,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rpm",
          "label": "Обороты, об/мин",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Подача на один оборот.",
      "reference": {
        "expected": 0.2,
        "actual": 0.2,
        "unit": "мм/об",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://btengineering.net/"
    },
    {
      "id": "g10-4",
      "group": "g10",
      "groupTitle": "Станки, ЧПУ и резание",
      "topic": "Минутная подача фрезы",
      "status": "implemented",
      "calculatorId": "g10-4",
      "href": "calculator.html?atlasTool=g10-4#labAtlasTools",
      "formula": "Vf = fz × n × z.",
      "outputUnit": "мм/мин",
      "trigger": "live",
      "inputs": [
        {
          "key": "fz",
          "label": "Подача на зуб, мм",
          "example": 0.1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rpm",
          "label": "Обороты, об/мин",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "teeth",
          "label": "Зубьев",
          "example": 4,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Без ограничений ускорений и коррекции на дугах.",
      "reference": {
        "expected": 400,
        "actual": 400,
        "unit": "мм/мин",
        "tolerance": 0.000004,
        "status": "passed"
      },
      "researchSource": "https://btengineering.net/"
    },
    {
      "id": "g10-5",
      "group": "g10",
      "groupTitle": "Станки, ЧПУ и резание",
      "topic": "Машинное время сверления",
      "status": "implemented",
      "calculatorId": "g10-5",
      "href": "calculator.html?atlasTool=g10-5#labAtlasTools",
      "formula": "Время = путь × проходы / подача.",
      "outputUnit": "мин",
      "trigger": "live",
      "inputs": [
        {
          "key": "length",
          "label": "Полный путь резания с врезанием, мм",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "feed",
          "label": "Подача, мм/мин",
          "example": 200,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "passes",
          "label": "Число проходов",
          "example": 2,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Идеальное машинное время, без смены инструмента, разгонов и холостых перемещений.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "мин",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://btengineering.net/"
    },
    {
      "id": "g10-6",
      "group": "g10",
      "groupTitle": "Станки, ЧПУ и резание",
      "topic": "Машинное время точения",
      "status": "implemented",
      "calculatorId": "g10-6",
      "href": "calculator.html?atlasTool=g10-6#labAtlasTools",
      "formula": "Время = путь × проходы / подача.",
      "outputUnit": "мин",
      "trigger": "live",
      "inputs": [
        {
          "key": "length",
          "label": "Полный путь резания с врезанием, мм",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "feed",
          "label": "Подача, мм/мин",
          "example": 200,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "passes",
          "label": "Число проходов",
          "example": 2,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Идеальное машинное время, без смены инструмента, разгонов и холостых перемещений.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "мин",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://btengineering.net/"
    },
    {
      "id": "g10-7",
      "group": "g10",
      "groupTitle": "Станки, ЧПУ и резание",
      "topic": "Машинное время фрезерования",
      "status": "implemented",
      "calculatorId": "g10-7",
      "href": "calculator.html?atlasTool=g10-7#labAtlasTools",
      "formula": "Время = путь × проходы / подача.",
      "outputUnit": "мин",
      "trigger": "live",
      "inputs": [
        {
          "key": "length",
          "label": "Полный путь резания с врезанием, мм",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "feed",
          "label": "Подача, мм/мин",
          "example": 200,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "passes",
          "label": "Число проходов",
          "example": 2,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Идеальное машинное время, без смены инструмента, разгонов и холостых перемещений.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "мин",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://btengineering.net/"
    },
    {
      "id": "g10-8",
      "group": "g10",
      "groupTitle": "Станки, ЧПУ и резание",
      "topic": "Съём металла MRR",
      "status": "implemented",
      "calculatorId": "g10-8",
      "href": "calculator.html?atlasTool=g10-8#labAtlasTools",
      "formula": "MRR = ширина × глубина × подача / 1000.",
      "outputUnit": "см³/мин",
      "trigger": "live",
      "inputs": [
        {
          "key": "width",
          "label": "Ширина резания, мм",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "depth",
          "label": "Глубина резания, мм",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "feed",
          "label": "Подача, мм/мин",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Прямоугольный объём съёма при фрезеровании.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "см³/мин",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://btengineering.net/"
    },
    {
      "id": "g10-9",
      "group": "g10",
      "groupTitle": "Станки, ЧПУ и резание",
      "topic": "Длина обработки по контуру",
      "status": "implemented",
      "calculatorId": "g10-9",
      "href": "calculator.html?atlasTool=g10-9#labAtlasTools",
      "formula": "Путь = сумма длин участков.",
      "outputUnit": "мм",
      "trigger": "live",
      "inputs": [
        {
          "key": "segments",
          "label": "Длины последовательных участков, мм; через ;",
          "example": "10;20;30",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Дуги предварительно переведите в длину по радиусу и углу.",
      "reference": {
        "expected": 60,
        "actual": 60,
        "unit": "мм",
        "tolerance": 6e-7,
        "status": "passed"
      },
      "researchSource": "https://btengineering.net/"
    },
    {
      "id": "g10-10",
      "group": "g10",
      "groupTitle": "Станки, ЧПУ и резание",
      "topic": "Высота конической вершины сверла",
      "status": "implemented",
      "calculatorId": "g10-10",
      "href": "calculator.html?atlasTool=g10-10#labAtlasTools",
      "formula": "Высота вершины = D / (2 tan(угол/2)).",
      "outputUnit": "мм",
      "trigger": "live",
      "inputs": [
        {
          "key": "diameter",
          "label": "Диаметр сверла, мм",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "angle",
          "label": "Полный угол при вершине, градусы",
          "example": 118,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Геометрия симметричного конического острия; не учитывает переточку и перемычку.",
      "reference": {
        "expected": 3.004303095137802,
        "actual": 3.00430309514,
        "unit": "мм",
        "tolerance": 3.004303095137802e-8,
        "status": "passed"
      },
      "researchSource": "https://btengineering.net/"
    },
    {
      "id": "g10-11",
      "group": "g10",
      "groupTitle": "Станки, ЧПУ и резание",
      "topic": "Шаг резьбы и обороты",
      "status": "implemented",
      "calculatorId": "g10-11",
      "href": "calculator.html?atlasTool=g10-11#labAtlasTools",
      "formula": "Синхронная подача = шаг × обороты.",
      "outputUnit": "мм/мин",
      "trigger": "live",
      "inputs": [
        {
          "key": "pitch",
          "label": "Шаг резьбы, мм",
          "example": 1.5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rpm",
          "label": "Обороты, об/мин",
          "example": 400,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Однозаходная резьба; для многозаходной задайте ход, а не шаг.",
      "reference": {
        "expected": 600,
        "actual": 600,
        "unit": "мм/мин",
        "tolerance": 0.000006,
        "status": "passed"
      },
      "researchSource": "https://btengineering.net/"
    },
    {
      "id": "g10-12",
      "group": "g10",
      "groupTitle": "Станки, ЧПУ и резание",
      "topic": "Диаметр сверла под метчик",
      "status": "implemented",
      "calculatorId": "g10-12",
      "href": "calculator.html?atlasTool=g10-12#labAtlasTools",
      "formula": "Ориентировочный диаметр = номинальный диаметр − шаг.",
      "outputUnit": "мм",
      "trigger": "live",
      "inputs": [
        {
          "key": "diameter",
          "label": "Наружный номинальный диаметр, мм",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "pitch",
          "label": "Шаг, мм",
          "example": 1.5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Приближение для метрической резьбы под режущий метчик, не нормативная таблица. Не для раскатников.",
      "reference": {
        "expected": 8.5,
        "actual": 8.5,
        "unit": "мм",
        "tolerance": 8.500000000000001e-8,
        "status": "passed"
      },
      "researchSource": "https://btengineering.net/"
    },
    {
      "id": "g10-13",
      "group": "g10",
      "groupTitle": "Станки, ЧПУ и резание",
      "topic": "Прямой и обратный конус",
      "status": "implemented",
      "calculatorId": "g10-13",
      "href": "calculator.html?atlasTool=g10-13#labAtlasTools",
      "formula": "Полуугол конуса = atan((D − d)/(2L)).",
      "outputUnit": "градусы",
      "trigger": "live",
      "inputs": [
        {
          "key": "large",
          "label": "Большой диаметр, мм",
          "example": 20,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "small",
          "label": "Малый диаметр, мм",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Осевая длина конуса, мм",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Прямой круговой конус; полный угол вдвое больше.",
      "reference": {
        "expected": 2.862405226111748,
        "actual": 2.86240522611,
        "unit": "градусы",
        "tolerance": 2.862405226111748e-8,
        "status": "passed"
      },
      "researchSource": "https://btengineering.net/"
    },
    {
      "id": "g10-14",
      "group": "g10",
      "groupTitle": "Станки, ЧПУ и резание",
      "topic": "Радиус окружности по сторонам треугольника",
      "status": "implemented",
      "calculatorId": "g10-14",
      "href": "calculator.html?atlasTool=g10-14#labAtlasTools",
      "formula": "R = abc/(4 sqrt(s(s−a)(s−b)(s−c))).",
      "outputUnit": "мм",
      "trigger": "live",
      "inputs": [
        {
          "key": "a",
          "label": "Сторона между точками a, мм",
          "example": 3,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "b",
          "label": "Сторона b, мм",
          "example": 4,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "c",
          "label": "Сторона c, мм",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Радиус окружности через три неколлинеарные точки; на входе расстояния между ними.",
      "reference": {
        "expected": 2.5,
        "actual": 2.5,
        "unit": "мм",
        "tolerance": 2.5e-8,
        "status": "passed"
      },
      "researchSource": "https://btengineering.net/"
    },
    {
      "id": "g10-15",
      "group": "g10",
      "groupTitle": "Станки, ЧПУ и резание",
      "topic": "Делительная окружность отверстий",
      "status": "implemented",
      "calculatorId": "g10-15",
      "href": "calculator.html?atlasTool=g10-15#labAtlasTools",
      "formula": "Делительный диаметр = хорда / sin(π/n).",
      "outputUnit": "мм",
      "trigger": "live",
      "inputs": [
        {
          "key": "chord",
          "label": "Расстояние между соседними центрами, мм",
          "example": 50,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "holes",
          "label": "Равномерных отверстий на окружности",
          "example": 6,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Соседние отверстия расположены равномерно; n ≥ 2.",
      "reference": {
        "expected": 100,
        "actual": 100,
        "unit": "мм",
        "tolerance": 0.000001,
        "status": "passed"
      },
      "researchSource": "https://btengineering.net/"
    },
    {
      "id": "g10-16",
      "group": "g10",
      "groupTitle": "Станки, ЧПУ и резание",
      "topic": "Высота гребешка после фрезерования",
      "status": "implemented",
      "calculatorId": "g10-16",
      "href": "calculator.html?atlasTool=g10-16#labAtlasTools",
      "formula": "Гребешок = R − sqrt(R² − (шаг/2)²).",
      "outputUnit": "мм",
      "trigger": "live",
      "inputs": [
        {
          "key": "step",
          "label": "Поперечный шаг, мм",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "radius",
          "label": "Радиус сферической фрезы, мм",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Точная геометрия сферической фрезы на плоскости, без биений и прогиба.",
      "reference": {
        "expected": 0.02506281446690023,
        "actual": 0.0250628144669,
        "unit": "мм",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://btengineering.net/"
    },
    {
      "id": "g10-17",
      "group": "g10",
      "groupTitle": "Станки, ЧПУ и резание",
      "topic": "Отклонение поверхности после точения",
      "status": "implemented",
      "calculatorId": "g10-17",
      "href": "calculator.html?atlasTool=g10-17#labAtlasTools",
      "formula": "Теоретическая высота профиля ≈ f²/(8r).",
      "outputUnit": "мкм",
      "trigger": "live",
      "inputs": [
        {
          "key": "feed",
          "label": "Подача на оборот, мм",
          "example": 0.2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "radius",
          "label": "Радиус вершины резца, мм",
          "example": 0.8,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Геометрическое приближение для точения; вибрации, пластичность, нарост и износ не учтены.",
      "reference": {
        "expected": 6.25,
        "actual": 6.25,
        "unit": "мкм",
        "tolerance": 6.25e-8,
        "status": "passed"
      },
      "researchSource": "https://btengineering.net/"
    },
    {
      "id": "g10-18",
      "group": "g10",
      "groupTitle": "Станки, ЧПУ и резание",
      "topic": "Шероховатость по подаче и радиусу",
      "status": "implemented",
      "calculatorId": "g10-18",
      "href": "calculator.html?atlasTool=g10-18#labAtlasTools",
      "formula": "Теоретический Ra ≈ f²/(32r).",
      "outputUnit": "мкм",
      "trigger": "live",
      "inputs": [
        {
          "key": "feed",
          "label": "Подача на оборот, мм",
          "example": 0.2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "radius",
          "label": "Радиус вершины резца, мм",
          "example": 0.8,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Геометрическое приближение для точения; вибрации, пластичность, нарост и износ не учтены.",
      "reference": {
        "expected": 1.5625,
        "actual": 1.5625,
        "unit": "мкм",
        "tolerance": 1.5625e-8,
        "status": "passed"
      },
      "researchSource": "https://btengineering.net/"
    },
    {
      "id": "g10-19",
      "group": "g10",
      "groupTitle": "Станки, ЧПУ и резание",
      "topic": "Число деталей из прутка",
      "status": "implemented",
      "calculatorId": "g10-19",
      "href": "calculator.html?atlasTool=g10-19#labAtlasTools",
      "formula": "Штуки = floor(полезная длина/(длина детали + пропил)).",
      "outputUnit": "шт",
      "trigger": "live",
      "inputs": [
        {
          "key": "stock",
          "label": "Полезная длина прутка, мм",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "part",
          "label": "Длина детали, мм",
          "example": 90,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "kerf",
          "label": "Пропил на деталь, мм",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Пропил резервируется на каждую деталь; зажимные концы уже исключены из полезной длины.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "шт",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://btengineering.net/"
    },
    {
      "id": "g10-20",
      "group": "g10",
      "groupTitle": "Станки, ЧПУ и резание",
      "topic": "Себестоимость станочного часа",
      "status": "implemented",
      "calculatorId": "g10-20",
      "href": "calculator.html?atlasTool=g10-20#labAtlasTools",
      "formula": "Ставка = затраты / полезные часы.",
      "outputUnit": "₽/ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "cost",
          "label": "Полные затраты за период, ₽",
          "example": 80000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "hours",
          "label": "Полезные станко-часы за период",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Амортизация, труд и энергия включаются ровно один раз по вашей методике.",
      "reference": {
        "expected": 800,
        "actual": 800,
        "unit": "₽/ч",
        "tolerance": 0.000008,
        "status": "passed"
      },
      "researchSource": "https://btengineering.net/"
    },
    {
      "id": "g10-21",
      "group": "g10",
      "groupTitle": "Станки, ЧПУ и резание",
      "topic": "Остаток допуска на износ инструмента",
      "status": "implemented",
      "calculatorId": "g10-21",
      "href": "calculator.html?atlasTool=g10-21#labAtlasTools",
      "formula": "Остаток допустимого износа = предел − измеренный износ.",
      "outputUnit": "мм",
      "trigger": "live",
      "inputs": [
        {
          "key": "wear",
          "label": "Измеренный износ, мм",
          "example": 0.2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "limit",
          "label": "Предельный износ, мм",
          "example": 0.3,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не прогнозирует срок службы; предельный износ задаётся для конкретного инструмента.",
      "reference": {
        "expected": 0.1,
        "actual": 0.1,
        "unit": "мм",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://btengineering.net/"
    },
    {
      "id": "g10-22",
      "group": "g10",
      "groupTitle": "Станки, ЧПУ и резание",
      "topic": "Коэффициент использования станка",
      "status": "implemented",
      "calculatorId": "g10-22",
      "href": "calculator.html?atlasTool=g10-22#labAtlasTools",
      "formula": "Использование = работа / доступное время × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "busy",
          "label": "Работа под нагрузкой, ч",
          "example": 6,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "available",
          "label": "Доступное время, ч",
          "example": 8,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Длительности относятся к одному периоду.",
      "reference": {
        "expected": 75,
        "actual": 75,
        "unit": "%",
        "tolerance": 7.5e-7,
        "status": "passed"
      },
      "researchSource": "https://btengineering.net/"
    },
    {
      "id": "g11-1",
      "group": "g11",
      "groupTitle": "Сварка, резка и металлообработка",
      "topic": "Тепловложение сварки по току и напряжению",
      "status": "implemented",
      "calculatorId": "g11-1",
      "href": "calculator.html?atlasTool=g11-1#labAtlasTools",
      "formula": "Тепловложение = η U I / скорость / 1000.",
      "outputUnit": "кДж/мм",
      "trigger": "live",
      "inputs": [
        {
          "key": "voltage",
          "label": "Среднее напряжение дуги, В",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "current",
          "label": "Средний ток, А",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "speed",
          "label": "Скорость сварки, мм/с",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "eff",
          "label": "Заданный тепловой КПД дуги",
          "example": 0.8,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Для усреднённой стационарной дуги; параметры импульсов требуют корректной интегральной мощности. Не подтверждение режима сварки.",
      "reference": {
        "expected": 0.32,
        "actual": 0.32,
        "unit": "кДж/мм",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://uscalculators.com/machining/"
    },
    {
      "id": "g11-2",
      "group": "g11",
      "groupTitle": "Сварка, резка и металлообработка",
      "topic": "Длина сварного шва на изделие",
      "status": "implemented",
      "calculatorId": "g11-2",
      "href": "calculator.html?atlasTool=g11-2#labAtlasTools",
      "formula": "Суммарная длина = сумма длин швов.",
      "outputUnit": "мм",
      "trigger": "live",
      "inputs": [
        {
          "key": "lengths",
          "label": "Длины отдельных швов, мм; через ;",
          "example": "100;200;300",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Повторные проходы учитывайте отдельно в технологическом времени.",
      "reference": {
        "expected": 600,
        "actual": 600,
        "unit": "мм",
        "tolerance": 0.000006,
        "status": "passed"
      },
      "researchSource": "https://uscalculators.com/machining/"
    },
    {
      "id": "g11-3",
      "group": "g11",
      "groupTitle": "Сварка, резка и металлообработка",
      "topic": "Масса наплавленного металла",
      "status": "implemented",
      "calculatorId": "g11-3",
      "href": "calculator.html?atlasTool=g11-3#labAtlasTools",
      "formula": "Масса = площадь сечения, мм² × длина, м × плотность /1000.",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "area",
          "label": "Фактическое сечение наплавки, мм²",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Длина наплавки, м",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Плотность, г/см³",
          "example": 7.85,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Сечение должно учитывать усиление и реальную разделку; не масса расходуемых электродов.",
      "reference": {
        "expected": 0.785,
        "actual": 0.785,
        "unit": "кг",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://uscalculators.com/machining/"
    },
    {
      "id": "g11-4",
      "group": "g11",
      "groupTitle": "Сварка, резка и металлообработка",
      "topic": "Расход электродов на длину шва",
      "status": "implemented",
      "calculatorId": "g11-4",
      "href": "calculator.html?atlasTool=g11-4#labAtlasTools",
      "formula": "Расход электродов = наплавленный металл/выход металла.",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "deposit",
          "label": "Требуемая масса наплавленного металла, кг",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "deposition",
          "label": "Фактический коэффициент наплавки по массе электродов",
          "example": 0.6,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Коэффициент включает огарки и потери по вашему процессу; не универсальная норма.",
      "reference": {
        "expected": 1.6666666666666667,
        "actual": 1.66666666667,
        "unit": "кг",
        "tolerance": 1.6666666666666667e-8,
        "status": "passed"
      },
      "researchSource": "https://uscalculators.com/machining/"
    },
    {
      "id": "g11-5",
      "group": "g11",
      "groupTitle": "Сварка, резка и металлообработка",
      "topic": "Расход проволоки MIG/MAG",
      "status": "implemented",
      "calculatorId": "g11-5",
      "href": "calculator.html?atlasTool=g11-5#labAtlasTools",
      "formula": "Расход проволоки = πD²/4 × длина × плотность/1000.",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "diameter",
          "label": "Диаметр проволоки, мм",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Поданная длина, м",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Плотность проволоки, г/см³",
          "example": 7.85,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Полная масса поданной проволоки; не только масса наплавки.",
      "reference": {
        "expected": 0.616537558266997,
        "actual": 0.616537558267,
        "unit": "кг",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://uscalculators.com/machining/"
    },
    {
      "id": "g11-6",
      "group": "g11",
      "groupTitle": "Сварка, резка и металлообработка",
      "topic": "Расход защитного газа",
      "status": "implemented",
      "calculatorId": "g11-6",
      "href": "calculator.html?atlasTool=g11-6#labAtlasTools",
      "formula": "Газ = расход × время /1000.",
      "outputUnit": "м³ при условиях расходомера",
      "trigger": "live",
      "inputs": [
        {
          "key": "flow",
          "label": "Расход защитного газа, л/мин",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "minutes",
          "label": "Время подачи газа, мин",
          "example": 30,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Включите предварительную и последующую продувку; нормальные/рабочие условия не смешивать.",
      "reference": {
        "expected": 0.3,
        "actual": 0.3,
        "unit": "м³ при условиях расходомера",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://uscalculators.com/machining/"
    },
    {
      "id": "g11-7",
      "group": "g11",
      "groupTitle": "Сварка, резка и металлообработка",
      "topic": "Время сварки по скорости",
      "status": "implemented",
      "calculatorId": "g11-7",
      "href": "calculator.html?atlasTool=g11-7#labAtlasTools",
      "formula": "Дуговое время = длина проходов/скорость.",
      "outputUnit": "мин",
      "trigger": "live",
      "inputs": [
        {
          "key": "length",
          "label": "Длина всех проходов, мм",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "speed",
          "label": "Скорость, мм/мин",
          "example": 200,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Зачистка, смена положения и прочие паузы не включены.",
      "reference": {
        "expected": 5,
        "actual": 5,
        "unit": "мин",
        "tolerance": 5e-8,
        "status": "passed"
      },
      "researchSource": "https://uscalculators.com/machining/"
    },
    {
      "id": "g11-8",
      "group": "g11",
      "groupTitle": "Сварка, резка и металлообработка",
      "topic": "Себестоимость сварного шва",
      "status": "implemented",
      "calculatorId": "g11-8",
      "href": "calculator.html?atlasTool=g11-8#labAtlasTools",
      "formula": "Удельная себестоимость = (минуты/60 × ставка + расходники)/длина.",
      "outputUnit": "₽/м",
      "trigger": "live",
      "inputs": [
        {
          "key": "minutes",
          "label": "Оплачиваемое время, мин",
          "example": 30,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rate",
          "label": "Полная ставка, ₽/ч",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "consumables",
          "label": "Электроды/проволока/газ и прочее, ₽",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Длина готового шва, м",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Все повторные проходы входят во время, но в знаменателе длина готового соединения.",
      "reference": {
        "expected": 300,
        "actual": 300,
        "unit": "₽/м",
        "tolerance": 0.000003,
        "status": "passed"
      },
      "researchSource": "https://uscalculators.com/machining/"
    },
    {
      "id": "g11-9",
      "group": "g11",
      "groupTitle": "Сварка, резка и металлообработка",
      "topic": "Геометрия углового шва",
      "status": "implemented",
      "calculatorId": "g11-9",
      "href": "calculator.html?atlasTool=g11-9#labAtlasTools",
      "formula": "Идеальное сечение прямоугольного треугольника = катет1 × катет2/2.",
      "outputUnit": "мм²",
      "trigger": "live",
      "inputs": [
        {
          "key": "leg1",
          "label": "Катет 1, мм",
          "example": 4,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "leg2",
          "label": "Катет 2, мм",
          "example": 4,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без выпуклости/вогнутости, зазора и проплавления; не эффективное расчётное сечение по стандарту.",
      "reference": {
        "expected": 8,
        "actual": 8,
        "unit": "мм²",
        "tolerance": 8e-8,
        "status": "passed"
      },
      "researchSource": "https://uscalculators.com/machining/"
    },
    {
      "id": "g11-10",
      "group": "g11",
      "groupTitle": "Сварка, резка и металлообработка",
      "topic": "Катет и горло шва",
      "status": "implemented",
      "calculatorId": "g11-10",
      "href": "calculator.html?atlasTool=g11-10#labAtlasTools",
      "formula": "Геометрическое горло = катет/sqrt(2).",
      "outputUnit": "мм",
      "trigger": "live",
      "inputs": [
        {
          "key": "leg",
          "label": "Катет равнокатетного углового шва, мм",
          "example": 4,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Угол соединения 90°, равные катеты, плоская поверхность; не нормативное горло с учётом проплавления.",
      "reference": {
        "expected": 2.82842712474619,
        "actual": 2.82842712475,
        "unit": "мм",
        "tolerance": 2.82842712474619e-8,
        "status": "passed"
      },
      "researchSource": "https://uscalculators.com/machining/"
    },
    {
      "id": "g11-11",
      "group": "g11",
      "groupTitle": "Сварка, резка и металлообработка",
      "topic": "Площадь разделки кромок",
      "status": "implemented",
      "calculatorId": "g11-11",
      "href": "calculator.html?atlasTool=g11-11#labAtlasTools",
      "formula": "Площадь разделки = высота × зазор + высота² tan(полуугол).",
      "outputUnit": "мм²",
      "trigger": "live",
      "inputs": [
        {
          "key": "height",
          "label": "Глубина симметричной V-разделки, мм",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "gap",
          "label": "Корневой зазор, мм",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "angle",
          "label": "Полный угол раскрытия, градусы",
          "example": 60,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Одна симметричная V-разделка, без притупления и усиления; не подбор разделки по стандарту.",
      "reference": {
        "expected": 77.73502691896257,
        "actual": 77.735026919,
        "unit": "мм²",
        "tolerance": 7.773502691896258e-7,
        "status": "passed"
      },
      "researchSource": "https://uscalculators.com/machining/"
    },
    {
      "id": "g11-12",
      "group": "g11",
      "groupTitle": "Сварка, резка и металлообработка",
      "topic": "Усадка сварного соединения",
      "status": "implemented",
      "calculatorId": "g11-12",
      "href": "calculator.html?atlasTool=g11-12#labAtlasTools",
      "formula": "Наблюдаемое сокращение = до − после.",
      "outputUnit": "мм",
      "trigger": "live",
      "inputs": [
        {
          "key": "before",
          "label": "Измеренный размер до сварки, мм",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "after",
          "label": "Размер после остывания, мм",
          "example": 999,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Измеренный результат, не предсказание сварочной усадки по току или материалу.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "мм",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://uscalculators.com/machining/"
    },
    {
      "id": "g11-13",
      "group": "g11",
      "groupTitle": "Сварка, резка и металлообработка",
      "topic": "Скорость плазменной резки",
      "status": "implemented",
      "calculatorId": "g11-13",
      "href": "calculator.html?atlasTool=g11-13#labAtlasTools",
      "formula": "Скорость = длина/время.",
      "outputUnit": "мм/мин",
      "trigger": "live",
      "inputs": [
        {
          "key": "length",
          "label": "Фактически прорезанная длина, мм",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "minutes",
          "label": "Время резания, мин",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Измеренный процесс, не назначение скорости по толщине или мощности плазмы.",
      "reference": {
        "expected": 500,
        "actual": 500,
        "unit": "мм/мин",
        "tolerance": 0.000005,
        "status": "passed"
      },
      "researchSource": "https://uscalculators.com/machining/"
    },
    {
      "id": "g11-14",
      "group": "g11",
      "groupTitle": "Сварка, резка и металлообработка",
      "topic": "Ширина пропила и потери",
      "status": "implemented",
      "calculatorId": "g11-14",
      "href": "calculator.html?atlasTool=g11-14#labAtlasTools",
      "formula": "Потерянный объём = длина, м × ширина, мм × толщина, мм.",
      "outputUnit": "см³",
      "trigger": "live",
      "inputs": [
        {
          "key": "length",
          "label": "Суммарный рез, м",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "kerf",
          "label": "Ширина пропила, мм",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "thickness",
          "label": "Толщина листа, мм",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Постоянная ширина реза; заходы, прожиги и термоповреждённая зона отдельно.",
      "reference": {
        "expected": 200,
        "actual": 200,
        "unit": "см³",
        "tolerance": 0.000002,
        "status": "passed"
      },
      "researchSource": "https://uscalculators.com/machining/"
    },
    {
      "id": "g11-15",
      "group": "g11",
      "groupTitle": "Сварка, резка и металлообработка",
      "topic": "Раскладка деталей на листе",
      "status": "implemented",
      "calculatorId": "g11-15",
      "href": "calculator.html?atlasTool=g11-15#labAtlasTools",
      "formula": "Выход = max двух регулярных ориентаций целых прямоугольников.",
      "outputUnit": "деталей",
      "trigger": "live",
      "inputs": [
        {
          "key": "width",
          "label": "Полезная ширина листа, мм",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Полезная длина, мм",
          "example": 2000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "partw",
          "label": "Ширина прямоугольной детали с припуском, мм",
          "example": 250,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "partl",
          "label": "Длина с припуском, мм",
          "example": 500,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Пропил и зазоры уже включены в габариты; не nesting произвольных контуров.",
      "reference": {
        "expected": 16,
        "actual": 16,
        "unit": "деталей",
        "tolerance": 1.6e-7,
        "status": "passed"
      },
      "researchSource": "https://uscalculators.com/machining/"
    },
    {
      "id": "g11-16",
      "group": "g11",
      "groupTitle": "Сварка, резка и металлообработка",
      "topic": "Расход кислорода при резке",
      "status": "implemented",
      "calculatorId": "g11-16",
      "href": "calculator.html?atlasTool=g11-16#labAtlasTools",
      "formula": "Расход = м³/ч × минуты/60.",
      "outputUnit": "м³ при условиях расходомера",
      "trigger": "live",
      "inputs": [
        {
          "key": "flow",
          "label": "Измеренный расход кислорода, м³/ч",
          "example": 6,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "minutes",
          "label": "Полное время подачи, мин",
          "example": 30,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Параметры по паспорту/измерению, включая подогрев; не назначение режима резки.",
      "reference": {
        "expected": 3,
        "actual": 3,
        "unit": "м³ при условиях расходомера",
        "tolerance": 3.0000000000000004e-8,
        "status": "passed"
      },
      "researchSource": "https://uscalculators.com/machining/"
    },
    {
      "id": "g11-17",
      "group": "g11",
      "groupTitle": "Сварка, резка и металлообработка",
      "topic": "Деформация от нагрева в линейной модели",
      "status": "implemented",
      "calculatorId": "g11-17",
      "href": "calculator.html?atlasTool=g11-17#labAtlasTools",
      "formula": "ΔL = αLΔT.",
      "outputUnit": "мм",
      "trigger": "live",
      "inputs": [
        {
          "key": "length",
          "label": "Длина свободного участка, мм",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "alpha",
          "label": "α, 1/К",
          "example": 0.000012,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "dt",
          "label": "Повышение температуры, К",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Свободное обратимое тепловое расширение, не остаточная сварочная деформация после остывания.",
      "reference": {
        "expected": 1.2,
        "actual": 1.2,
        "unit": "мм",
        "tolerance": 1.2e-8,
        "status": "passed"
      },
      "researchSource": "https://uscalculators.com/machining/"
    },
    {
      "id": "g11-18",
      "group": "g11",
      "groupTitle": "Сварка, резка и металлообработка",
      "topic": "Площадь покрытия антикоррозионным слоем",
      "status": "implemented",
      "calculatorId": "g11-18",
      "href": "calculator.html?atlasTool=g11-18#labAtlasTools",
      "formula": "Площадь = сумма подготовленных участков.",
      "outputUnit": "м²",
      "trigger": "live",
      "inputs": [
        {
          "key": "areas",
          "label": "Площади под покрытие, м²; через ;",
          "example": "10;20;30",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Исключите непокрываемые поверхности; толщину и норму расхода покрытия задайте отдельно.",
      "reference": {
        "expected": 60,
        "actual": 60,
        "unit": "м²",
        "tolerance": 6e-7,
        "status": "passed"
      },
      "researchSource": "https://uscalculators.com/machining/"
    },
    {
      "id": "g11-19",
      "group": "g11",
      "groupTitle": "Сварка, резка и металлообработка",
      "topic": "Масса металлоконструкции по профилям",
      "status": "implemented",
      "calculatorId": "g11-19",
      "href": "calculator.html?atlasTool=g11-19#labAtlasTools",
      "formula": "Масса = Σ длина × табличная погонная масса.",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "length",
          "label": "Длины профилей, м; через ;",
          "example": "10;20",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "mass",
          "label": "Табличные массы одного метра, кг/м; через ;",
          "example": "2;3",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Точные профиль и марка должны соответствовать сортаменту; крепёж и наплавка отдельно.",
      "reference": {
        "expected": 80,
        "actual": 80,
        "unit": "кг",
        "tolerance": 8e-7,
        "status": "passed"
      },
      "researchSource": "https://uscalculators.com/machining/"
    },
    {
      "id": "g11-20",
      "group": "g11",
      "groupTitle": "Сварка, резка и металлообработка",
      "topic": "Время зачистки соединения",
      "status": "implemented",
      "calculatorId": "g11-20",
      "href": "calculator.html?atlasTool=g11-20#labAtlasTools",
      "formula": "Время = длина/фактическая производительность.",
      "outputUnit": "ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "length",
          "label": "Длина зачистки, м",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rate",
          "label": "Измеренная производительность, м/ч",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Ставка по вашему состоянию шва, инструменту и критерию поверхности.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "ч",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://uscalculators.com/machining/"
    },
    {
      "id": "g12-1",
      "group": "g12",
      "groupTitle": "Метрология, квалитеты и допуски",
      "topic": "Одномерная размерная цепь Worst Case",
      "status": "implemented",
      "calculatorId": "g12-1",
      "href": "calculator.html?atlasTool=g12-1#labAtlasTools",
      "formula": "Worst Case ±T = Σ |Ti|.",
      "outputUnit": "мм",
      "trigger": "live",
      "inputs": [
        {
          "key": "tolerances",
          "label": "Предельные ±допуски звеньев, мм; через ;",
          "example": "0.1;0.2;0.3",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Для линейной цепи с коэффициентами ±1 и симметричными допусками.",
      "reference": {
        "expected": 0.6,
        "actual": 0.6,
        "unit": "мм",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g12-2",
      "group": "g12",
      "groupTitle": "Метрология, квалитеты и допуски",
      "topic": "Размерная цепь RSS",
      "status": "implemented",
      "calculatorId": "g12-2",
      "href": "calculator.html?atlasTool=g12-2#labAtlasTools",
      "formula": "RSS = sqrt(Σ Ti²).",
      "outputUnit": "мм",
      "trigger": "live",
      "inputs": [
        {
          "key": "tolerances",
          "label": "Однотипные σ или ±допуски, мм; через ;",
          "example": "0.3;0.4",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Для независимых вкладов. Если вводятся пределы допуска, вероятностный смысл требует согласованной модели распределения.",
      "reference": {
        "expected": 0.5,
        "actual": 0.5,
        "unit": "мм",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g12-3",
      "group": "g12",
      "groupTitle": "Метрология, квалитеты и допуски",
      "topic": "Оценка Monte Carlo для допусков",
      "status": "implemented",
      "calculatorId": "g12-3",
      "href": "calculator.html?atlasTool=g12-3#labAtlasTools",
      "formula": "Monte Carlo линейной цепи: каждое отклонение ~Uniform(−Ti,+Ti), независимый xorshift32 с заданным зерном.",
      "outputUnit": "мм выборочного σ",
      "trigger": "submit",
      "inputs": [
        {
          "key": "tolerance",
          "label": "Полуширины независимых равномерных допусков ±Ti, мм; через ;",
          "example": "0.3;0.4",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "coefficients",
          "label": "Линейные коэффициенты звеньев через ;",
          "example": "1;1",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "samples",
          "label": "Число испытаний (до 100 000)",
          "example": 10000,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "seed",
          "label": "Целочисленное ненулевое зерно uint32",
          "example": 12345,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Статистическая оценка при явно заданном равномерном распределении и линейной независимой цепи, не гарантированный допуск. Не применяйте к коррелированным/нелинейным цепям.",
      "reference": {
        "expected": 0.28867513459481287,
        "actual": 0.290095902602,
        "unit": "мм выборочного σ",
        "tolerance": 0.02,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g12-4",
      "group": "g12",
      "groupTitle": "Метрология, квалитеты и допуски",
      "topic": "Посадка отверстие–вал H7/g6",
      "status": "implemented",
      "calculatorId": "g12-4",
      "href": "calculator.html?atlasTool=g12-4#labAtlasTools",
      "formula": "H7: EI=0, ES=IT7; g6: es по таблице, ei=es−IT6. Зазоры = отверстие − вал.",
      "outputUnit": "мкм минимального зазора",
      "trigger": "live",
      "inputs": [
        {
          "key": "nominal",
          "label": "Номинальный диаметр, мм (до 500)",
          "example": 20,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Табличные отклонения ISO 286 для H7/g6, 0<d≤500 мм. Нижняя граница интервала исключается, верхняя включается. Источник числовых данных: AmesWeb, IT6/IT7 сверены с Engineers Edge; проверьте применимую редакцию и чертёж.",
      "reference": {
        "expected": 7,
        "actual": 7,
        "unit": "мкм минимального зазора",
        "tolerance": 7e-8,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g12-5",
      "group": "g12",
      "groupTitle": "Метрология, квалитеты и допуски",
      "topic": "Верхнее и нижнее отклонение",
      "status": "implemented",
      "calculatorId": "g12-5",
      "href": "calculator.html?atlasTool=g12-5#labAtlasTools",
      "formula": "Верхнее отклонение = верхний размер − номинальный; нижнее = нижний размер − номинальный.",
      "outputUnit": "мм верхнего отклонения",
      "trigger": "live",
      "inputs": [
        {
          "key": "nominal",
          "label": "Номинальный размер, мм",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "upper",
          "label": "Верхний предельный размер, мм",
          "example": 10.02,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "lower",
          "label": "Нижний предельный размер, мм",
          "example": 9.99,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Верхнее и нижнее отклонения выводятся вместе; знак относительно номинального размера сохраняется.",
      "reference": {
        "expected": 0.02,
        "actual": 0.02,
        "unit": "мм верхнего отклонения",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g12-6",
      "group": "g12",
      "groupTitle": "Метрология, квалитеты и допуски",
      "topic": "Приведённая погрешность прибора",
      "status": "implemented",
      "calculatorId": "g12-6",
      "href": "calculator.html?atlasTool=g12-6#labAtlasTools",
      "formula": "Приведённая погрешность = Δ / нормирующее значение × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "error",
          "label": "Предельная абсолютная погрешность, единиц",
          "example": 0.5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "span",
          "label": "Нормирующее значение диапазона, единиц",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Это вычисление приведённой погрешности, а не присвоение прибору нормативного класса.",
      "reference": {
        "expected": 0.5,
        "actual": 0.5,
        "unit": "%",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g12-7",
      "group": "g12",
      "groupTitle": "Метрология, квалитеты и допуски",
      "topic": "Абсолютная погрешность измерения",
      "status": "implemented",
      "calculatorId": "g12-7",
      "href": "calculator.html?atlasTool=g12-7#labAtlasTools",
      "formula": "Погрешность = измеренное − опорное.",
      "outputUnit": "единиц",
      "trigger": "live",
      "inputs": [
        {
          "key": "measured",
          "label": "Измеренное значение",
          "example": 10.1,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "reference",
          "label": "Опорное значение",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Знак сохраняется; опорное значение должно иметь установленную неопределённость.",
      "reference": {
        "expected": 0.1,
        "actual": 0.1,
        "unit": "единиц",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g12-8",
      "group": "g12",
      "groupTitle": "Метрология, квалитеты и допуски",
      "topic": "Относительная погрешность",
      "status": "implemented",
      "calculatorId": "g12-8",
      "href": "calculator.html?atlasTool=g12-8#labAtlasTools",
      "formula": "Относительная погрешность = Δ / |опорное| × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "error",
          "label": "Абсолютная погрешность со знаком",
          "example": 0.1,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "reference",
          "label": "Модуль опорного значения",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не определена при нулевом опорном значении.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "%",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g12-9",
      "group": "g12",
      "groupTitle": "Метрология, квалитеты и допуски",
      "topic": "Стандартное отклонение ряда измерений",
      "status": "implemented",
      "calculatorId": "g12-9",
      "href": "calculator.html?atlasTool=g12-9#labAtlasTools",
      "formula": "s = sqrt(Σ(x−среднее)²/(n−1)).",
      "outputUnit": "единиц измерения",
      "trigger": "live",
      "inputs": [
        {
          "key": "values",
          "label": "Измерения через ;",
          "example": "8;10;12",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Выборочная оценка стандартного отклонения; n ≥ 2.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "единиц измерения",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g12-10",
      "group": "g12",
      "groupTitle": "Метрология, квалитеты и допуски",
      "topic": "Неопределённость типа A",
      "status": "implemented",
      "calculatorId": "g12-10",
      "href": "calculator.html?atlasTool=g12-10#labAtlasTools",
      "formula": "uA среднего = s/sqrt(n).",
      "outputUnit": "единиц",
      "trigger": "live",
      "inputs": [
        {
          "key": "values",
          "label": "Независимые измерения через ;",
          "example": "8;10;12",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Неопределённость среднего независимых однотипных измерений.",
      "reference": {
        "expected": 1.1547005383792517,
        "actual": 1.15470053838,
        "unit": "единиц",
        "tolerance": 1.1547005383792517e-8,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g12-11",
      "group": "g12",
      "groupTitle": "Метрология, квалитеты и допуски",
      "topic": "Неопределённость типа B",
      "status": "implemented",
      "calculatorId": "g12-11",
      "href": "calculator.html?atlasTool=g12-11#labAtlasTools",
      "formula": "uB = a/sqrt(3).",
      "outputUnit": "единиц",
      "trigger": "live",
      "inputs": [
        {
          "key": "half",
          "label": "Полуширина равномерного интервала ±a",
          "example": 3,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Только прямоугольное распределение; для других распределений нужен другой делитель.",
      "reference": {
        "expected": 1.7320508075688774,
        "actual": 1.73205080757,
        "unit": "единиц",
        "tolerance": 1.7320508075688775e-8,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g12-12",
      "group": "g12",
      "groupTitle": "Метрология, квалитеты и допуски",
      "topic": "Расширенная неопределённость",
      "status": "implemented",
      "calculatorId": "g12-12",
      "href": "calculator.html?atlasTool=g12-12#labAtlasTools",
      "formula": "U = k × sqrt(Σ ui²).",
      "outputUnit": "единиц",
      "trigger": "live",
      "inputs": [
        {
          "key": "uncertainties",
          "label": "Независимые стандартные неопределённости через ;",
          "example": "0.3;0.4",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "k",
          "label": "Коэффициент охвата k",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Единичные коэффициенты чувствительности. Доверительная вероятность не задаётся одним k без модели распределения.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "единиц",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g12-13",
      "group": "g12",
      "groupTitle": "Метрология, квалитеты и допуски",
      "topic": "Число эффективных степеней свободы",
      "status": "implemented",
      "calculatorId": "g12-13",
      "href": "calculator.html?atlasTool=g12-13#labAtlasTools",
      "formula": "νeff = (Σ ui²)² / Σ(ui⁴/νi).",
      "outputUnit": "степеней свободы",
      "trigger": "live",
      "inputs": [
        {
          "key": "u",
          "label": "Стандартные неопределённости через ;",
          "example": "1;1",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "degrees",
          "label": "Степени свободы вкладов через ;",
          "example": "10;10",
          "positive": true,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Welch–Satterthwaite, независимые вклады с единичной чувствительностью.",
      "reference": {
        "expected": 20,
        "actual": 20,
        "unit": "степеней свободы",
        "tolerance": 2e-7,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g12-14",
      "group": "g12",
      "groupTitle": "Метрология, квалитеты и допуски",
      "topic": "Диаметральная позиционная ошибка 2D",
      "status": "implemented",
      "calculatorId": "g12-14",
      "href": "calculator.html?atlasTool=g12-14#labAtlasTools",
      "formula": "Диаметральная позиционная ошибка = 2 sqrt(Δx² + Δy²).",
      "outputUnit": "мм",
      "trigger": "live",
      "inputs": [
        {
          "key": "dx",
          "label": "Отклонение центра по X, мм",
          "example": 0.3,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "dy",
          "label": "Отклонение центра по Y, мм",
          "example": 0.4,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Плоская диаметральная зона позиции; базирование и нормативные условия здесь не проверяются.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "мм",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g12-15",
      "group": "g12",
      "groupTitle": "Метрология, квалитеты и допуски",
      "topic": "Бонус допуска MMC",
      "status": "implemented",
      "calculatorId": "g12-15",
      "href": "calculator.html?atlasTool=g12-15#labAtlasTools",
      "formula": "Доступный допуск = базовый + (фактический диаметр отверстия − MMC).",
      "outputUnit": "мм",
      "trigger": "live",
      "inputs": [
        {
          "key": "actual",
          "label": "Фактический диаметр отверстия, мм",
          "example": 10.1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "mmc",
          "label": "MMC отверстия, мм",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "base",
          "label": "Позиционный допуск при MMC, мм",
          "example": 0.2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Только внутренний цилиндрический элемент: отверстие при условии MMC. Не формула для вала.",
      "reference": {
        "expected": 0.3,
        "actual": 0.3,
        "unit": "мм",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g12-16",
      "group": "g12",
      "groupTitle": "Метрология, квалитеты и допуски",
      "topic": "Повторяемость результатов",
      "status": "implemented",
      "calculatorId": "g12-16",
      "href": "calculator.html?atlasTool=g12-16#labAtlasTools",
      "formula": "s = sqrt(Σ(x−среднее)²/(n−1)).",
      "outputUnit": "единиц измерения",
      "trigger": "live",
      "inputs": [
        {
          "key": "values",
          "label": "Измерения через ;",
          "example": "8;10;12",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Выборочная оценка стандартного отклонения; n ≥ 2.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "единиц измерения",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g12-17",
      "group": "g12",
      "groupTitle": "Метрология, квалитеты и допуски",
      "topic": "GRR по заданным компонентам разброса",
      "status": "implemented",
      "calculatorId": "g12-17",
      "href": "calculator.html?atlasTool=g12-17#labAtlasTools",
      "formula": "%GRR = sqrt(σEV² + σAV²) / σtotal × 100.",
      "outputUnit": "% GRR",
      "trigger": "live",
      "inputs": [
        {
          "key": "repeat",
          "label": "Повторяемость σEV",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "operators",
          "label": "Воспроизводимость σAV",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "total",
          "label": "Полное σ процесса",
          "example": 4,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Компоненты должны быть получены из корректного исследования Gage R&R. Не определяет компоненты из произвольных повторов.",
      "reference": {
        "expected": 35.35533905932738,
        "actual": 35.3553390593,
        "unit": "% GRR",
        "tolerance": 3.535533905932738e-7,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g12-18",
      "group": "g12",
      "groupTitle": "Метрология, квалитеты и допуски",
      "topic": "Калибровочная линейная регрессия",
      "status": "implemented",
      "calculatorId": "g12-18",
      "href": "calculator.html?atlasTool=g12-18#labAtlasTools",
      "formula": "Наклон b = Σ(x−x̄)(y−ȳ)/Σ(x−x̄)².",
      "outputUnit": "наклон",
      "trigger": "live",
      "inputs": [
        {
          "key": "x",
          "label": "Опорные значения через ;",
          "example": "1;2;3",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "y",
          "label": "Показания прибора через ;",
          "example": "3;5;7",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Линейная МНК-регрессия Y от X, без учёта неопределённости X.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "наклон",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g12-19",
      "group": "g12",
      "groupTitle": "Метрология, квалитеты и допуски",
      "topic": "Перевод Ra в микродюймы",
      "status": "implemented",
      "calculatorId": "g12-19",
      "href": "calculator.html?atlasTool=g12-19#labAtlasTools",
      "formula": "микродюймы = мкм / 0.0254.",
      "outputUnit": "мкдюйм",
      "trigger": "live",
      "inputs": [
        {
          "key": "ra",
          "label": "Ra, мкм",
          "example": 0.8,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Только перевод единиц Ra, не перевод Ra в Rz.",
      "reference": {
        "expected": 31.496062992125985,
        "actual": 31.4960629921,
        "unit": "мкдюйм",
        "tolerance": 3.1496062992125984e-7,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g12-20",
      "group": "g12",
      "groupTitle": "Метрология, квалитеты и допуски",
      "topic": "Сравнение измерений с допуском",
      "status": "implemented",
      "calculatorId": "g12-20",
      "href": "calculator.html?atlasTool=g12-20#labAtlasTools",
      "formula": "Минимальный запас = min(значение − низ, верх − значение).",
      "outputUnit": "единиц",
      "trigger": "live",
      "inputs": [
        {
          "key": "value",
          "label": "Измеренное значение",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "low",
          "label": "Нижний предел",
          "example": 9,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "high",
          "label": "Верхний предел",
          "example": 11,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Положительный запас — внутри допуска, отрицательный — вне. Правило принятия решения с неопределённостью не задано.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "единиц",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g12-21",
      "group": "g12",
      "groupTitle": "Метрология, квалитеты и допуски",
      "topic": "Индекс Cp и Cpk",
      "status": "implemented",
      "calculatorId": "g12-21",
      "href": "calculator.html?atlasTool=g12-21#labAtlasTools",
      "formula": "Cpk/Ppk = min(USL − среднее, среднее − LSL)/(3σ). Cp = (USL − LSL)/(6σ) при той же оценке σ.",
      "outputUnit": "CPK",
      "trigger": "live",
      "inputs": [
        {
          "key": "low",
          "label": "Нижняя граница допуска",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "high",
          "label": "Верхняя граница допуска",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "average",
          "label": "Среднее процесса",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "sigma",
          "label": "Оценка внутрипроцессного σ",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Для двухстороннего допуска. Cpk использует внутрипроцессную оценку σ, Ppk — общую. Интерпретация требует стабильности и подходящей модели распределения.",
      "reference": {
        "expected": 1.6666666666666667,
        "actual": 1.66666666667,
        "unit": "CPK",
        "tolerance": 1.6666666666666667e-8,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g12-22",
      "group": "g12",
      "groupTitle": "Метрология, квалитеты и допуски",
      "topic": "Pp и Ppk",
      "status": "implemented",
      "calculatorId": "g12-22",
      "href": "calculator.html?atlasTool=g12-22#labAtlasTools",
      "formula": "Cpk/Ppk = min(USL − среднее, среднее − LSL)/(3σ). Pp = (USL − LSL)/(6σ) при той же оценке σ.",
      "outputUnit": "PPK",
      "trigger": "live",
      "inputs": [
        {
          "key": "low",
          "label": "Нижняя граница допуска",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "high",
          "label": "Верхняя граница допуска",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "average",
          "label": "Среднее процесса",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "sigma",
          "label": "Общее стандартное отклонение",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Для двухстороннего допуска. Cpk использует внутрипроцессную оценку σ, Ppk — общую. Интерпретация требует стабильности и подходящей модели распределения.",
      "reference": {
        "expected": 1.6666666666666667,
        "actual": 1.66666666667,
        "unit": "PPK",
        "tolerance": 1.6666666666666667e-8,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g13-1",
      "group": "g13",
      "groupTitle": "Материаловедение и прочность",
      "topic": "Плотность и масса сложной заготовки",
      "status": "implemented",
      "calculatorId": "g13-1",
      "href": "calculator.html?atlasTool=g13-1#labAtlasTools",
      "formula": "Масса = Σ объём части × плотность части.",
      "outputUnit": "г",
      "trigger": "live",
      "inputs": [
        {
          "key": "volumes",
          "label": "Объёмы частей, см³; через ;",
          "example": "100;200",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "densities",
          "label": "Плотности частей, г/см³; через ;",
          "example": "7.85;2.7",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Неперекрывающиеся объёмы. Полости исключаются из объёмов.",
      "reference": {
        "expected": 1325,
        "actual": 1325,
        "unit": "г",
        "tolerance": 0.00001325,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g13-2",
      "group": "g13",
      "groupTitle": "Материаловедение и прочность",
      "topic": "Линейное тепловое расширение",
      "status": "implemented",
      "calculatorId": "g13-2",
      "href": "calculator.html?atlasTool=g13-2#labAtlasTools",
      "formula": "ΔL = L × α × ΔT.",
      "outputUnit": "мм",
      "trigger": "live",
      "inputs": [
        {
          "key": "length",
          "label": "Исходная длина, мм",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "alpha",
          "label": "Коэффициент α, 1/°C",
          "example": 0.000012,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "dt",
          "label": "Изменение температуры, °C",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Свободное однородное линейное расширение с постоянным α.",
      "reference": {
        "expected": 1.2,
        "actual": 1.2,
        "unit": "мм",
        "tolerance": 1.2e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g13-3",
      "group": "g13",
      "groupTitle": "Материаловедение и прочность",
      "topic": "Напряжение σ=F/A",
      "status": "implemented",
      "calculatorId": "g13-3",
      "href": "calculator.html?atlasTool=g13-3#labAtlasTools",
      "formula": "σ = F/A.",
      "outputUnit": "МПа",
      "trigger": "live",
      "inputs": [
        {
          "key": "force",
          "label": "Осевая сила, Н",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "area",
          "label": "Площадь, мм²",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Среднее нормальное напряжение, без концентраций.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "МПа",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g13-4",
      "group": "g13",
      "groupTitle": "Материаловедение и прочность",
      "topic": "Относительная деформация",
      "status": "implemented",
      "calculatorId": "g13-4",
      "href": "calculator.html?atlasTool=g13-4#labAtlasTools",
      "formula": "ε = ΔL / L.",
      "outputUnit": "доля",
      "trigger": "live",
      "inputs": [
        {
          "key": "delta",
          "label": "Изменение длины, мм",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Исходная длина, мм",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Малая инженерная, не истинная логарифмическая деформация.",
      "reference": {
        "expected": 0.001,
        "actual": 0.001,
        "unit": "доля",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g13-5",
      "group": "g13",
      "groupTitle": "Материаловедение и прочность",
      "topic": "Модуль Юнга по диаграмме",
      "status": "implemented",
      "calculatorId": "g13-5",
      "href": "calculator.html?atlasTool=g13-5#labAtlasTools",
      "formula": "E = Δσ/Δε / 1000.",
      "outputUnit": "ГПа",
      "trigger": "live",
      "inputs": [
        {
          "key": "stress",
          "label": "Приращение напряжения Δσ, МПа",
          "example": 200,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "strain",
          "label": "Приращение деформации Δε",
          "example": 0.001,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Наклон в линейном упругом участке диаграммы; предварительно выберите этот участок.",
      "reference": {
        "expected": 200,
        "actual": 200,
        "unit": "ГПа",
        "tolerance": 0.000002,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g13-6",
      "group": "g13",
      "groupTitle": "Материаловедение и прочность",
      "topic": "Коэффициент Пуассона по деформациям",
      "status": "implemented",
      "calculatorId": "g13-6",
      "href": "calculator.html?atlasTool=g13-6#labAtlasTools",
      "formula": "ν = − εпоперечная / εпродольная.",
      "outputUnit": "ν",
      "trigger": "live",
      "inputs": [
        {
          "key": "transverse",
          "label": "Поперечная деформация",
          "example": -0.0003,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "axial",
          "label": "Продольная деформация",
          "example": 0.001,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Одноосное упругое нагружение; продольная деформация ненулевая.",
      "reference": {
        "expected": 0.3,
        "actual": 0.3,
        "unit": "ν",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g13-7",
      "group": "g13",
      "groupTitle": "Материаловедение и прочность",
      "topic": "Нормальная жёсткость прутка",
      "status": "implemented",
      "calculatorId": "g13-7",
      "href": "calculator.html?atlasTool=g13-7#labAtlasTools",
      "formula": "k = E × 1000 × A / L.",
      "outputUnit": "Н/мм",
      "trigger": "live",
      "inputs": [
        {
          "key": "e",
          "label": "Модуль E, ГПа",
          "example": 200,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "area",
          "label": "Сечение, мм²",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Длина, мм",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Прямой стержень постоянного сечения при осевой нагрузке.",
      "reference": {
        "expected": 20000,
        "actual": 20000,
        "unit": "Н/мм",
        "tolerance": 0.0002,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g13-8",
      "group": "g13",
      "groupTitle": "Материаловедение и прочность",
      "topic": "Энергия упругой деформации",
      "status": "implemented",
      "calculatorId": "g13-8",
      "href": "calculator.html?atlasTool=g13-8#labAtlasTools",
      "formula": "U = F²L/(2AE), с переводом Н·мм в Дж.",
      "outputUnit": "Дж",
      "trigger": "live",
      "inputs": [
        {
          "key": "force",
          "label": "Осевая сила, Н",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Длина, мм",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "area",
          "label": "Площадь, мм²",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "e",
          "label": "E, ГПа",
          "example": 200,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Линейно-упругий стержень при плавном приложении осевой силы.",
      "reference": {
        "expected": 0.025,
        "actual": 0.025,
        "unit": "Дж",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g13-9",
      "group": "g13",
      "groupTitle": "Материаловедение и прочность",
      "topic": "Момент инерции прямоугольника",
      "status": "implemented",
      "calculatorId": "g13-9",
      "href": "calculator.html?atlasTool=g13-9#labAtlasTools",
      "formula": "I = b h³ / 12.",
      "outputUnit": "мм⁴",
      "trigger": "live",
      "inputs": [
        {
          "key": "width",
          "label": "Ширина b, мм",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "height",
          "label": "Высота h, мм",
          "example": 20,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Центральная ось параллельна стороне b.",
      "reference": {
        "expected": 6666.666666666667,
        "actual": 6666.66666667,
        "unit": "мм⁴",
        "tolerance": 0.00006666666666666667,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g13-10",
      "group": "g13",
      "groupTitle": "Материаловедение и прочность",
      "topic": "Момент инерции трубы",
      "status": "implemented",
      "calculatorId": "g13-10",
      "href": "calculator.html?atlasTool=g13-10#labAtlasTools",
      "formula": "I = π(D⁴ − d⁴)/64.",
      "outputUnit": "мм⁴",
      "trigger": "live",
      "inputs": [
        {
          "key": "outer",
          "label": "Наружный диаметр, мм",
          "example": 20,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "inner",
          "label": "Внутренний диаметр, мм",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Центральный диаметральный момент инерции круглой трубы.",
      "reference": {
        "expected": 7363.107781851078,
        "actual": 7363.10778185,
        "unit": "мм⁴",
        "tolerance": 0.00007363107781851078,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g13-11",
      "group": "g13",
      "groupTitle": "Материаловедение и прочность",
      "topic": "Изгибное напряжение",
      "status": "implemented",
      "calculatorId": "g13-11",
      "href": "calculator.html?atlasTool=g13-11#labAtlasTools",
      "formula": "σ = M × 1000 × y / I.",
      "outputUnit": "МПа",
      "trigger": "live",
      "inputs": [
        {
          "key": "moment",
          "label": "Изгибающий момент, Н·м",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "distance",
          "label": "Расстояние до волокна, мм",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "inertia",
          "label": "Момент инерции, мм⁴",
          "example": 10000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Линейный упругий изгиб; знак задаётся выбранной системой осей.",
      "reference": {
        "expected": 100,
        "actual": 100,
        "unit": "МПа",
        "tolerance": 0.000001,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g13-12",
      "group": "g13",
      "groupTitle": "Материаловедение и прочность",
      "topic": "Прогиб балки с точечной нагрузкой",
      "status": "implemented",
      "calculatorId": "g13-12",
      "href": "calculator.html?atlasTool=g13-12#labAtlasTools",
      "formula": "δ = F L³ / (48 E I).",
      "outputUnit": "мм",
      "trigger": "live",
      "inputs": [
        {
          "key": "force",
          "label": "Сила в середине пролёта, Н",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Пролёт, мм",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "e",
          "label": "E, ГПа",
          "example": 200,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "inertia",
          "label": "I, мм⁴",
          "example": 100000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Шарнирно опёртая балка с центральной силой, постоянные EI и малые прогибы.",
      "reference": {
        "expected": 1.0416666666666667,
        "actual": 1.04166666667,
        "unit": "мм",
        "tolerance": 1.0416666666666667e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g13-13",
      "group": "g13",
      "groupTitle": "Материаловедение и прочность",
      "topic": "Прогиб балки с равномерной нагрузкой",
      "status": "implemented",
      "calculatorId": "g13-13",
      "href": "calculator.html?atlasTool=g13-13#labAtlasTools",
      "formula": "δ = 5 q L⁴ / (384 E I), q переводится в Н/мм.",
      "outputUnit": "мм",
      "trigger": "live",
      "inputs": [
        {
          "key": "load",
          "label": "Равномерная нагрузка, Н/м",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Пролёт, мм",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "e",
          "label": "E, ГПа",
          "example": 200,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "inertia",
          "label": "I, мм⁴",
          "example": 100000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Шарнирно опёртая балка, равномерная нагрузка по всему пролёту, малые прогибы.",
      "reference": {
        "expected": 0.6510416666666666,
        "actual": 0.651041666667,
        "unit": "мм",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g13-14",
      "group": "g13",
      "groupTitle": "Материаловедение и прочность",
      "topic": "Критическая нагрузка Эйлера",
      "status": "implemented",
      "calculatorId": "g13-14",
      "href": "calculator.html?atlasTool=g13-14#labAtlasTools",
      "formula": "Pcr = π²EI/(KL)².",
      "outputUnit": "Н",
      "trigger": "live",
      "inputs": [
        {
          "key": "e",
          "label": "E, ГПа",
          "example": 200,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "inertia",
          "label": "Минимальный I, мм⁴",
          "example": 10000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Длина, мм",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "k",
          "label": "Коэффициент расчётной длины K",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Формула Эйлера для идеального гибкого упругого стержня. Не проверяет местную потерю устойчивости и нормативную несущую способность.",
      "reference": {
        "expected": 19739.208802178713,
        "actual": 19739.2088022,
        "unit": "Н",
        "tolerance": 0.00019739208802178713,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g13-15",
      "group": "g13",
      "groupTitle": "Материаловедение и прочность",
      "topic": "Крутящий момент круглого вала",
      "status": "implemented",
      "calculatorId": "g13-15",
      "href": "calculator.html?atlasTool=g13-15#labAtlasTools",
      "formula": "T = τπd³/16, перевод Н·мм в Н·м.",
      "outputUnit": "Н·м",
      "trigger": "live",
      "inputs": [
        {
          "key": "stress",
          "label": "Допускаемое касательное напряжение, МПа",
          "example": 50,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "diameter",
          "label": "Диаметр сплошного вала, мм",
          "example": 20,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Сплошной круглый вал при упругом кручении; без изгиба, концентраторов и усталости.",
      "reference": {
        "expected": 78.53981633974483,
        "actual": 78.5398163397,
        "unit": "Н·м",
        "tolerance": 7.853981633974483e-7,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g13-16",
      "group": "g13",
      "groupTitle": "Материаловедение и прочность",
      "topic": "Угол закручивания",
      "status": "implemented",
      "calculatorId": "g13-16",
      "href": "calculator.html?atlasTool=g13-16#labAtlasTools",
      "formula": "φ = T L/(GJ), с переводом единиц и радиан в градусы.",
      "outputUnit": "градусы",
      "trigger": "live",
      "inputs": [
        {
          "key": "torque",
          "label": "Крутящий момент, Н·м",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Длина, мм",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "g",
          "label": "Модуль сдвига, ГПа",
          "example": 80,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "j",
          "label": "Полярный момент J, мм⁴",
          "example": 100000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Постоянное круглое сечение, упругое кручение, постоянный G.",
      "reference": {
        "expected": 0.716197243913529,
        "actual": 0.716197243914,
        "unit": "градусы",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g13-17",
      "group": "g13",
      "groupTitle": "Материаловедение и прочность",
      "topic": "Первая частота консольной балки",
      "status": "implemented",
      "calculatorId": "g13-17",
      "href": "calculator.html?atlasTool=g13-17#labAtlasTools",
      "formula": "f1 = 1.875104²/(2π L²) × sqrt(EI/(ρA)).",
      "outputUnit": "Гц",
      "trigger": "live",
      "inputs": [
        {
          "key": "e",
          "label": "E, ГПа",
          "example": 200,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "i",
          "label": "I, м⁴",
          "example": 1e-8,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Плотность, кг/м³",
          "example": 7850,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "area",
          "label": "Сечение, м²",
          "example": 0.0001,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Длина, м",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Однородная консольная балка Эйлера–Бернулли без сосредоточенных масс, один конец жёстко защемлён.",
      "reference": {
        "expected": 28.245616187627796,
        "actual": 28.2456161876,
        "unit": "Гц",
        "tolerance": 2.82456161876278e-7,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g13-18",
      "group": "g13",
      "groupTitle": "Материаловедение и прочность",
      "topic": "Запас прочности по напряжению",
      "status": "implemented",
      "calculatorId": "g13-18",
      "href": "calculator.html?atlasTool=g13-18#labAtlasTools",
      "formula": "n = предел / расчётное напряжение.",
      "outputUnit": "раз",
      "trigger": "live",
      "inputs": [
        {
          "key": "limit",
          "label": "Заданный предел напряжения, МПа",
          "example": 200,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "actual",
          "label": "Расчётное напряжение по модулю, МПа",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Предел и критерий разрушения задаются проектом. Не нормативная проверка конструкции.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "раз",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g13-19",
      "group": "g13",
      "groupTitle": "Материаловедение и прочность",
      "topic": "Площадь металла в сечении",
      "status": "implemented",
      "calculatorId": "g13-19",
      "href": "calculator.html?atlasTool=g13-19#labAtlasTools",
      "formula": "A = π(D² − d²)/4.",
      "outputUnit": "мм²",
      "trigger": "live",
      "inputs": [
        {
          "key": "outer",
          "label": "Наружный диаметр, мм",
          "example": 20,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "inner",
          "label": "Внутренний диаметр, мм",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Круглое или трубчатое сечение.",
      "reference": {
        "expected": 235.61944901923448,
        "actual": 235.619449019,
        "unit": "мм²",
        "tolerance": 0.0000023561944901923448,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g13-20",
      "group": "g13",
      "groupTitle": "Материаловедение и прочность",
      "topic": "Удельная прочность материала",
      "status": "implemented",
      "calculatorId": "g13-20",
      "href": "calculator.html?atlasTool=g13-20#labAtlasTools",
      "formula": "Удельная прочность = прочность × 10⁶ / плотность.",
      "outputUnit": "Н·м/кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "strength",
          "label": "Предел прочности, МПа",
          "example": 500,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Плотность, кг/м³",
          "example": 2500,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Сравнение при одинаковых условиях испытаний; не оценка работоспособности детали.",
      "reference": {
        "expected": 200000,
        "actual": 200000,
        "unit": "Н·м/кг",
        "tolerance": 0.002,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g13-21",
      "group": "g13",
      "groupTitle": "Материаловедение и прочность",
      "topic": "Сравнение теплопроводности",
      "status": "implemented",
      "calculatorId": "g13-21",
      "href": "calculator.html?atlasTool=g13-21#labAtlasTools",
      "formula": "Отношение теплопроводности = k1/k2.",
      "outputUnit": "раз",
      "trigger": "live",
      "inputs": [
        {
          "key": "k1",
          "label": "Теплопроводность материала 1, Вт/(м·К)",
          "example": 200,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "k2",
          "label": "Теплопроводность материала 2, Вт/(м·К)",
          "example": 50,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "При одинаковой температуре и направлении теплопереноса; не сравнение полной теплопередачи изделия.",
      "reference": {
        "expected": 4,
        "actual": 4,
        "unit": "раз",
        "tolerance": 4e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g13-22",
      "group": "g13",
      "groupTitle": "Материаловедение и прочность",
      "topic": "Тепловое сопротивление слоя",
      "status": "implemented",
      "calculatorId": "g13-22",
      "href": "calculator.html?atlasTool=g13-22#labAtlasTools",
      "formula": "R = толщина / теплопроводность.",
      "outputUnit": "м²·К/Вт",
      "trigger": "live",
      "inputs": [
        {
          "key": "thickness",
          "label": "Толщина слоя, м",
          "example": 0.1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "conductivity",
          "label": "Теплопроводность, Вт/(м·К)",
          "example": 0.05,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Одномерный стационарный поток, без поверхностных сопротивлений и мостиков холода.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "м²·К/Вт",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g14-1",
      "group": "g14",
      "groupTitle": "Электротехника и электропривод",
      "topic": "Закон Ома по двум величинам",
      "status": "implemented",
      "calculatorId": "g14-1",
      "href": "calculator.html?atlasTool=g14-1#labAtlasTools",
      "formula": "I = U/R.",
      "outputUnit": "А",
      "trigger": "live",
      "inputs": [
        {
          "key": "voltage",
          "label": "Напряжение U, В",
          "example": 12,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "resistance",
          "label": "Сопротивление R, Ом",
          "example": 6,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Постоянный ток и омическая нагрузка; другие формы: U=IR, R=U/I.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "А",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g14-2",
      "group": "g14",
      "groupTitle": "Электротехника и электропривод",
      "topic": "Мощность постоянного тока",
      "status": "implemented",
      "calculatorId": "g14-2",
      "href": "calculator.html?atlasTool=g14-2#labAtlasTools",
      "formula": "P = U I.",
      "outputUnit": "Вт",
      "trigger": "live",
      "inputs": [
        {
          "key": "voltage",
          "label": "Напряжение, В",
          "example": 12,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "current",
          "label": "Ток, А",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Постоянные напряжение и ток.",
      "reference": {
        "expected": 24,
        "actual": 24,
        "unit": "Вт",
        "tolerance": 2.4000000000000003e-7,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g14-3",
      "group": "g14",
      "groupTitle": "Электротехника и электропривод",
      "topic": "Полная мощность переменного тока",
      "status": "implemented",
      "calculatorId": "g14-3",
      "href": "calculator.html?atlasTool=g14-3#labAtlasTools",
      "formula": "S = U_rms I_rms.",
      "outputUnit": "ВА",
      "trigger": "live",
      "inputs": [
        {
          "key": "voltage",
          "label": "Действующее напряжение, В",
          "example": 230,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "current",
          "label": "Действующий ток, А",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Однофазная цепь; действующие значения.",
      "reference": {
        "expected": 2300,
        "actual": 2300,
        "unit": "ВА",
        "tolerance": 0.000023,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g14-4",
      "group": "g14",
      "groupTitle": "Электротехника и электропривод",
      "topic": "Активная мощность трёхфазной сети",
      "status": "implemented",
      "calculatorId": "g14-4",
      "href": "calculator.html?atlasTool=g14-4#labAtlasTools",
      "formula": "P = sqrt(3) Uл Iл cos φ.",
      "outputUnit": "Вт",
      "trigger": "live",
      "inputs": [
        {
          "key": "voltage",
          "label": "Линейное напряжение, В",
          "example": 400,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "current",
          "label": "Линейный ток, А",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "pf",
          "label": "cos φ",
          "example": 0.8,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1,
          "choices": null
        }
      ],
      "limits": "Симметричная синусоидальная трёхфазная нагрузка.",
      "reference": {
        "expected": 5542.562584220407,
        "actual": 5542.56258422,
        "unit": "Вт",
        "tolerance": 0.000055425625842204075,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g14-5",
      "group": "g14",
      "groupTitle": "Электротехника и электропривод",
      "topic": "Реактивная мощность",
      "status": "implemented",
      "calculatorId": "g14-5",
      "href": "calculator.html?atlasTool=g14-5#labAtlasTools",
      "formula": "Модуль Q = sqrt(S² − P²).",
      "outputUnit": "вар",
      "trigger": "live",
      "inputs": [
        {
          "key": "s",
          "label": "Полная мощность, ВА",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "p",
          "label": "Активная мощность, Вт",
          "example": 800,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Синусоидальная одночастотная модель. Знак реактивной мощности из этих двух чисел не определяется.",
      "reference": {
        "expected": 600,
        "actual": 600,
        "unit": "вар",
        "tolerance": 0.000006,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g14-6",
      "group": "g14",
      "groupTitle": "Электротехника и электропривод",
      "topic": "cos φ по мощностям",
      "status": "implemented",
      "calculatorId": "g14-6",
      "href": "calculator.html?atlasTool=g14-6#labAtlasTools",
      "formula": "Коэффициент мощности = P/S.",
      "outputUnit": "доля",
      "trigger": "live",
      "inputs": [
        {
          "key": "p",
          "label": "Активная мощность, Вт",
          "example": 800,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "s",
          "label": "Полная мощность, ВА",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Равен cos φ только для синусоидальной формы тока и напряжения.",
      "reference": {
        "expected": 0.8,
        "actual": 0.8,
        "unit": "доля",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g14-7",
      "group": "g14",
      "groupTitle": "Электротехника и электропривод",
      "topic": "Компенсация реактивной мощности",
      "status": "implemented",
      "calculatorId": "g14-7",
      "href": "calculator.html?atlasTool=g14-7#labAtlasTools",
      "formula": "Qc = P × (tan acos(cosφ1) − tan acos(cosφ2)).",
      "outputUnit": "квар",
      "trigger": "live",
      "inputs": [
        {
          "key": "p",
          "label": "Активная мощность, кВт",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "before",
          "label": "Исходный cos φ",
          "example": 0.8,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "after",
          "label": "Целевой cos φ",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Синусоидальная индуктивная нагрузка; гармоники, резонанс и переключения батареи отдельно.",
      "reference": {
        "expected": 75,
        "actual": 75,
        "unit": "квар",
        "tolerance": 7.5e-7,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g14-8",
      "group": "g14",
      "groupTitle": "Электротехника и электропривод",
      "topic": "Падение напряжения на линии",
      "status": "implemented",
      "calculatorId": "g14-8",
      "href": "calculator.html?atlasTool=g14-8#labAtlasTools",
      "formula": "ΔU = 2 I ρL/A.",
      "outputUnit": "В",
      "trigger": "live",
      "inputs": [
        {
          "key": "current",
          "label": "Ток, А",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Длина в одну сторону, м",
          "example": 50,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rho",
          "label": "Удельное сопротивление, Ом·мм²/м",
          "example": 0.0175,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "area",
          "label": "Сечение, мм²",
          "example": 2.5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Двухпроводная DC-цепь: учитываются прямой и обратный проводники, без реактивности.",
      "reference": {
        "expected": 7,
        "actual": 7,
        "unit": "В",
        "tolerance": 7e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g14-9",
      "group": "g14",
      "groupTitle": "Электротехника и электропривод",
      "topic": "Сопротивление медного проводника",
      "status": "implemented",
      "calculatorId": "g14-9",
      "href": "calculator.html?atlasTool=g14-9#labAtlasTools",
      "formula": "R = ρL/A.",
      "outputUnit": "Ом",
      "trigger": "live",
      "inputs": [
        {
          "key": "rho",
          "label": "Удельное сопротивление при рабочей температуре, Ом·мм²/м",
          "example": 0.0175,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Полная длина проводника, м",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "area",
          "label": "Сечение, мм²",
          "example": 2.5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Температурная поправка уже должна быть учтена в ρ.",
      "reference": {
        "expected": 0.7,
        "actual": 0.7,
        "unit": "Ом",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g14-10",
      "group": "g14",
      "groupTitle": "Электротехника и электропривод",
      "topic": "Ток трёхфазного двигателя",
      "status": "implemented",
      "calculatorId": "g14-10",
      "href": "calculator.html?atlasTool=g14-10#labAtlasTools",
      "formula": "I = Pвал × 1000/(sqrt(3) U η cosφ).",
      "outputUnit": "А",
      "trigger": "live",
      "inputs": [
        {
          "key": "p",
          "label": "Механическая мощность на валу, кВт",
          "example": 5.5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "u",
          "label": "Линейное напряжение, В",
          "example": 400,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "eff",
          "label": "КПД, доля",
          "example": 0.9,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "pf",
          "label": "cos φ",
          "example": 0.8,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Номинальный симметричный синусоидальный режим; не расчёт защиты или пуска.",
      "reference": {
        "expected": 11.025786390774101,
        "actual": 11.0257863908,
        "unit": "А",
        "tolerance": 1.1025786390774102e-7,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g14-11",
      "group": "g14",
      "groupTitle": "Электротехника и электропривод",
      "topic": "Ток пуска двигателя по кратности",
      "status": "implemented",
      "calculatorId": "g14-11",
      "href": "calculator.html?atlasTool=g14-11#labAtlasTools",
      "formula": "Iпуск = Iном × кратность.",
      "outputUnit": "А",
      "trigger": "live",
      "inputs": [
        {
          "key": "rated",
          "label": "Номинальный ток, А",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "multiple",
          "label": "Кратность пускового тока",
          "example": 6,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Кратность задаётся паспортом и способом пуска.",
      "reference": {
        "expected": 60,
        "actual": 60,
        "unit": "А",
        "tolerance": 6e-7,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g14-12",
      "group": "g14",
      "groupTitle": "Электротехника и электропривод",
      "topic": "КПД двигателя по мощностям",
      "status": "implemented",
      "calculatorId": "g14-12",
      "href": "calculator.html?atlasTool=g14-12#labAtlasTools",
      "formula": "η = Pвыход/Pвход × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "output",
          "label": "Механическая выходная мощность, кВт",
          "example": 9,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "input",
          "label": "Входная электрическая мощность, кВт",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Средние мощности за один режим.",
      "reference": {
        "expected": 90,
        "actual": 90,
        "unit": "%",
        "tolerance": 9.000000000000001e-7,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g14-13",
      "group": "g14",
      "groupTitle": "Электротехника и электропривод",
      "topic": "Потребление энергии кВт·ч",
      "status": "implemented",
      "calculatorId": "g14-13",
      "href": "calculator.html?atlasTool=g14-13#labAtlasTools",
      "formula": "E = P t.",
      "outputUnit": "кВт·ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "power",
          "label": "Постоянная активная мощность, кВт",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "hours",
          "label": "Работа, ч",
          "example": 8,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Для переменной мощности используйте интеграл или сумму по интервалам.",
      "reference": {
        "expected": 16,
        "actual": 16,
        "unit": "кВт·ч",
        "tolerance": 1.6e-7,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g14-14",
      "group": "g14",
      "groupTitle": "Электротехника и электропривод",
      "topic": "Ёмкость батареи в А·ч",
      "status": "implemented",
      "calculatorId": "g14-14",
      "href": "calculator.html?atlasTool=g14-14#labAtlasTools",
      "formula": "А·ч = Вт·ч / В.",
      "outputUnit": "А·ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "energy",
          "label": "Номинальная энергия, Вт·ч",
          "example": 1200,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "voltage",
          "label": "Номинальное напряжение, В",
          "example": 12,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Пересчёт по номинальному напряжению, не модель разряда батареи.",
      "reference": {
        "expected": 100,
        "actual": 100,
        "unit": "А·ч",
        "tolerance": 0.000001,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g14-15",
      "group": "g14",
      "groupTitle": "Электротехника и электропривод",
      "topic": "Время автономной работы ИБП",
      "status": "implemented",
      "calculatorId": "g14-15",
      "href": "calculator.html?atlasTool=g14-15#labAtlasTools",
      "formula": "t = энергия × используемая доля × КПД / нагрузка.",
      "outputUnit": "ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "energy",
          "label": "Номинальная энергия батареи, Вт·ч",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "usable",
          "label": "Используемая доля энергии, %",
          "example": 80,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        },
        {
          "key": "eff",
          "label": "КПД преобразования, %",
          "example": 90,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        },
        {
          "key": "load",
          "label": "Постоянная нагрузка, Вт",
          "example": 400,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без эффекта Пёйкерта, старения и зависимости КПД от нагрузки; не паспортная автономность ИБП.",
      "reference": {
        "expected": 1.8,
        "actual": 1.8,
        "unit": "ч",
        "tolerance": 1.8000000000000002e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g14-16",
      "group": "g14",
      "groupTitle": "Электротехника и электропривод",
      "topic": "Мощность трансформатора",
      "status": "implemented",
      "calculatorId": "g14-16",
      "href": "calculator.html?atlasTool=g14-16#labAtlasTools",
      "formula": "S = P/PF.",
      "outputUnit": "кВА",
      "trigger": "live",
      "inputs": [
        {
          "key": "active",
          "label": "Суммарная активная нагрузка, кВт",
          "example": 80,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "pf",
          "label": "Коэффициент мощности",
          "example": 0.8,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Только требуемая полная мощность нагрузки; резерв, пуск и нагрев трансформатора отдельно.",
      "reference": {
        "expected": 100,
        "actual": 100,
        "unit": "кВА",
        "tolerance": 0.000001,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g14-17",
      "group": "g14",
      "groupTitle": "Электротехника и электропривод",
      "topic": "Коэффициент трансформации",
      "status": "implemented",
      "calculatorId": "g14-17",
      "href": "calculator.html?atlasTool=g14-17#labAtlasTools",
      "formula": "k = U1/U2.",
      "outputUnit": "раз",
      "trigger": "live",
      "inputs": [
        {
          "key": "primary",
          "label": "Напряжение первичной обмотки, В",
          "example": 230,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "secondary",
          "label": "Напряжение вторичной обмотки, В",
          "example": 23,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Идеальный трансформатор, без падения напряжения под нагрузкой.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "раз",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g14-18",
      "group": "g14",
      "groupTitle": "Электротехника и электропривод",
      "topic": "Номинальный ток цепи по мощности",
      "status": "implemented",
      "calculatorId": "g14-18",
      "href": "calculator.html?atlasTool=g14-18#labAtlasTools",
      "formula": "I = P/U.",
      "outputUnit": "А",
      "trigger": "live",
      "inputs": [
        {
          "key": "power",
          "label": "Мощность DC-нагрузки, Вт",
          "example": 120,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "voltage",
          "label": "Напряжение, В",
          "example": 12,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Постоянный ток. Это не выбор номинала защитного аппарата.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "А",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g14-19",
      "group": "g14",
      "groupTitle": "Электротехника и электропривод",
      "topic": "Потери I²R",
      "status": "implemented",
      "calculatorId": "g14-19",
      "href": "calculator.html?atlasTool=g14-19#labAtlasTools",
      "formula": "Pпотерь = I²R.",
      "outputUnit": "Вт",
      "trigger": "live",
      "inputs": [
        {
          "key": "current",
          "label": "Действующий ток, А",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "resistance",
          "label": "Сопротивление полной цепи, Ом",
          "example": 0.5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Сопротивление при рабочей температуре. Не определяет допустимый ток или температуру кабеля.",
      "reference": {
        "expected": 50,
        "actual": 50,
        "unit": "Вт",
        "tolerance": 5e-7,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g14-20",
      "group": "g14",
      "groupTitle": "Электротехника и электропривод",
      "topic": "Тепловые потери I²R кабеля",
      "status": "implemented",
      "calculatorId": "g14-20",
      "href": "calculator.html?atlasTool=g14-20#labAtlasTools",
      "formula": "Pпотерь = I²R.",
      "outputUnit": "Вт",
      "trigger": "live",
      "inputs": [
        {
          "key": "current",
          "label": "Действующий ток, А",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "resistance",
          "label": "Сопротивление полной цепи, Ом",
          "example": 0.5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Сопротивление при рабочей температуре. Не определяет допустимый ток или температуру кабеля.",
      "reference": {
        "expected": 50,
        "actual": 50,
        "unit": "Вт",
        "tolerance": 5e-7,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g14-21",
      "group": "g14",
      "groupTitle": "Электротехника и электропривод",
      "topic": "Уравнение RL-переходного процесса",
      "status": "implemented",
      "calculatorId": "g14-21",
      "href": "calculator.html?atlasTool=g14-21#labAtlasTools",
      "formula": "I(t) = U/R × (1 − exp(−tR/L)).",
      "outputUnit": "А",
      "trigger": "live",
      "inputs": [
        {
          "key": "voltage",
          "label": "Ступень напряжения, В",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "resistance",
          "label": "R, Ом",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "inductance",
          "label": "L, Гн",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "time",
          "label": "Время от включения, с",
          "example": 0.1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Последовательная RL-цепь с нулевым начальным током и постоянной ступенью напряжения.",
      "reference": {
        "expected": 0.6321205588285577,
        "actual": 0.632120558829,
        "unit": "А",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g14-22",
      "group": "g14",
      "groupTitle": "Электротехника и электропривод",
      "topic": "Энергия импульса тормозного резистора",
      "status": "implemented",
      "calculatorId": "g14-22",
      "href": "calculator.html?atlasTool=g14-22#labAtlasTools",
      "formula": "Энергия импульса = U²/R × время.",
      "outputUnit": "Дж",
      "trigger": "live",
      "inputs": [
        {
          "key": "voltage",
          "label": "Напряжение на тормозном резисторе, В",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "resistance",
          "label": "Сопротивление, Ом",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "seconds",
          "label": "Длительность импульса, с",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Только постоянное напряжение на резисторе. Не рассчитывает тормозной путь или допустимость режима резистора.",
      "reference": {
        "expected": 2000,
        "actual": 2000,
        "unit": "Дж",
        "tolerance": 0.00002,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g15-1",
      "group": "g15",
      "groupTitle": "Электроника и печатные платы",
      "topic": "Последовательное сопротивление",
      "status": "implemented",
      "calculatorId": "g15-1",
      "href": "calculator.html?atlasTool=g15-1#labAtlasTools",
      "formula": "R = Σ Ri.",
      "outputUnit": "Ом",
      "trigger": "live",
      "inputs": [
        {
          "key": "r",
          "label": "Сопротивления, Ом; через ;",
          "example": "100;200;300",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Последовательное соединение идеальных резисторов.",
      "reference": {
        "expected": 600,
        "actual": 600,
        "unit": "Ом",
        "tolerance": 0.000006,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g15-2",
      "group": "g15",
      "groupTitle": "Электроника и печатные платы",
      "topic": "Параллельное сопротивление",
      "status": "implemented",
      "calculatorId": "g15-2",
      "href": "calculator.html?atlasTool=g15-2#labAtlasTools",
      "formula": "R = 1/Σ(1/Ri).",
      "outputUnit": "Ом",
      "trigger": "live",
      "inputs": [
        {
          "key": "r",
          "label": "Сопротивления, Ом; через ;",
          "example": "100;100",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Нулевой резистор шунтирует параллельную цепь.",
      "reference": {
        "expected": 50,
        "actual": 50,
        "unit": "Ом",
        "tolerance": 5e-7,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g15-3",
      "group": "g15",
      "groupTitle": "Электроника и печатные платы",
      "topic": "Последовательная ёмкость",
      "status": "implemented",
      "calculatorId": "g15-3",
      "href": "calculator.html?atlasTool=g15-3#labAtlasTools",
      "formula": "C = 1/Σ(1/Ci).",
      "outputUnit": "нФ",
      "trigger": "live",
      "inputs": [
        {
          "key": "c",
          "label": "Ёмкости, нФ; через ;",
          "example": "100;100",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Идеальные конденсаторы; не учитывает утечки и разброс напряжений.",
      "reference": {
        "expected": 50,
        "actual": 50,
        "unit": "нФ",
        "tolerance": 5e-7,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g15-4",
      "group": "g15",
      "groupTitle": "Электроника и печатные платы",
      "topic": "Параллельная ёмкость",
      "status": "implemented",
      "calculatorId": "g15-4",
      "href": "calculator.html?atlasTool=g15-4#labAtlasTools",
      "formula": "C = Σ Ci.",
      "outputUnit": "нФ",
      "trigger": "live",
      "inputs": [
        {
          "key": "c",
          "label": "Ёмкости, нФ; через ;",
          "example": "100;200",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Идеальные параллельные конденсаторы.",
      "reference": {
        "expected": 300,
        "actual": 300,
        "unit": "нФ",
        "tolerance": 0.000003,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g15-5",
      "group": "g15",
      "groupTitle": "Электроника и печатные платы",
      "topic": "Ограничивающий резистор LED",
      "status": "implemented",
      "calculatorId": "g15-5",
      "href": "calculator.html?atlasTool=g15-5#labAtlasTools",
      "formula": "R = (Uпит − ULED) / (IмА/1000).",
      "outputUnit": "Ом",
      "trigger": "live",
      "inputs": [
        {
          "key": "supply",
          "label": "Питание, В",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "forward",
          "label": "Падение на LED, В",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "current",
          "label": "Заданный ток LED, мА",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Проверьте разброс ULED, ток и мощность резистора отдельно. Не источник стабилизированного тока.",
      "reference": {
        "expected": 300,
        "actual": 300,
        "unit": "Ом",
        "tolerance": 0.000003,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g15-6",
      "group": "g15",
      "groupTitle": "Электроника и печатные платы",
      "topic": "Делитель напряжения",
      "status": "implemented",
      "calculatorId": "g15-6",
      "href": "calculator.html?atlasTool=g15-6#labAtlasTools",
      "formula": "Uвыход = Uвход × Rниз/(Rверх + Rниз).",
      "outputUnit": "В",
      "trigger": "live",
      "inputs": [
        {
          "key": "supply",
          "label": "Вход, В",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "top",
          "label": "Верхний резистор, Ом",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "bottom",
          "label": "Нижний резистор, Ом",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без нагрузки на средней точке.",
      "reference": {
        "expected": 5,
        "actual": 5,
        "unit": "В",
        "tolerance": 5e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g15-7",
      "group": "g15",
      "groupTitle": "Электроника и печатные платы",
      "topic": "Делитель тока",
      "status": "implemented",
      "calculatorId": "g15-7",
      "href": "calculator.html?atlasTool=g15-7#labAtlasTools",
      "formula": "Iветви = Iобщ × Rдругой/(Rветви + Rдругой).",
      "outputUnit": "А",
      "trigger": "live",
      "inputs": [
        {
          "key": "current",
          "label": "Общий ток, А",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "branch",
          "label": "Сопротивление выбранной ветви, Ом",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "other",
          "label": "Сопротивление другой ветви, Ом",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Две параллельные резистивные ветви.",
      "reference": {
        "expected": 0.5,
        "actual": 0.5,
        "unit": "А",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g15-8",
      "group": "g15",
      "groupTitle": "Электроника и печатные платы",
      "topic": "Частота среза RC",
      "status": "implemented",
      "calculatorId": "g15-8",
      "href": "calculator.html?atlasTool=g15-8#labAtlasTools",
      "formula": "fc = 1/(2πRC).",
      "outputUnit": "Гц",
      "trigger": "live",
      "inputs": [
        {
          "key": "r",
          "label": "R, Ом",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "c",
          "label": "C, мкФ",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Однополюсный ненагруженный RC-фильтр.",
      "reference": {
        "expected": 159.15494309189535,
        "actual": 159.154943092,
        "unit": "Гц",
        "tolerance": 0.0000015915494309189535,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g15-9",
      "group": "g15",
      "groupTitle": "Электроника и печатные платы",
      "topic": "Частота среза RL",
      "status": "implemented",
      "calculatorId": "g15-9",
      "href": "calculator.html?atlasTool=g15-9#labAtlasTools",
      "formula": "fc = R/(2πL).",
      "outputUnit": "Гц",
      "trigger": "live",
      "inputs": [
        {
          "key": "r",
          "label": "R, Ом",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "l",
          "label": "L, мГн",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Идеальная однополюсная RL-цепь.",
      "reference": {
        "expected": 159.15494309189535,
        "actual": 159.154943092,
        "unit": "Гц",
        "tolerance": 0.0000015915494309189535,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g15-10",
      "group": "g15",
      "groupTitle": "Электроника и печатные платы",
      "topic": "Резонанс RLC",
      "status": "implemented",
      "calculatorId": "g15-10",
      "href": "calculator.html?atlasTool=g15-10#labAtlasTools",
      "formula": "f0 = 1/(2π sqrt(LC)).",
      "outputUnit": "Гц",
      "trigger": "live",
      "inputs": [
        {
          "key": "l",
          "label": "L, мГн",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "c",
          "label": "C, мкФ",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Собственная частота идеального LC-контура; потери не учтены.",
      "reference": {
        "expected": 1591.5494309189535,
        "actual": 1591.54943092,
        "unit": "Гц",
        "tolerance": 0.000015915494309189534,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g15-11",
      "group": "g15",
      "groupTitle": "Электроника и печатные платы",
      "topic": "Добротность колебательного контура",
      "status": "implemented",
      "calculatorId": "g15-11",
      "href": "calculator.html?atlasTool=g15-11#labAtlasTools",
      "formula": "Q = sqrt(L/C)/R.",
      "outputUnit": "Q",
      "trigger": "live",
      "inputs": [
        {
          "key": "l",
          "label": "L, мГн",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "c",
          "label": "C, мкФ",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "r",
          "label": "Последовательное сопротивление потерь, Ом",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Последовательная RLC-модель; для параллельного сопротивления формула иная.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "Q",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g15-12",
      "group": "g15",
      "groupTitle": "Электроника и печатные платы",
      "topic": "Постоянная времени RC",
      "status": "implemented",
      "calculatorId": "g15-12",
      "href": "calculator.html?atlasTool=g15-12#labAtlasTools",
      "formula": "τ = RC.",
      "outputUnit": "мс",
      "trigger": "live",
      "inputs": [
        {
          "key": "r",
          "label": "R, кОм",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "c",
          "label": "C, мкФ",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Идеальная RC-цепь.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "мс",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g15-13",
      "group": "g15",
      "groupTitle": "Электроника и печатные платы",
      "topic": "Время заряда конденсатора",
      "status": "implemented",
      "calculatorId": "g15-13",
      "href": "calculator.html?atlasTool=g15-13#labAtlasTools",
      "formula": "U(t) = Uпит (1 − exp(−t/RC)).",
      "outputUnit": "В",
      "trigger": "live",
      "inputs": [
        {
          "key": "supply",
          "label": "Ступень питания, В",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "r",
          "label": "R, кОм",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "c",
          "label": "C, мкФ",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "time",
          "label": "Время, с",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Нулевое начальное напряжение, постоянная ступень питания.",
      "reference": {
        "expected": 6.321205588285577,
        "actual": 6.32120558829,
        "unit": "В",
        "tolerance": 6.321205588285577e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g15-14",
      "group": "g15",
      "groupTitle": "Электроника и печатные платы",
      "topic": "Разряд конденсатора",
      "status": "implemented",
      "calculatorId": "g15-14",
      "href": "calculator.html?atlasTool=g15-14#labAtlasTools",
      "formula": "U(t) = U0 exp(−t/RC).",
      "outputUnit": "В",
      "trigger": "live",
      "inputs": [
        {
          "key": "initial",
          "label": "Начальное напряжение, В",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "r",
          "label": "R, кОм",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "c",
          "label": "C, мкФ",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "time",
          "label": "Время, с",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Разряд через постоянное сопротивление без других источников.",
      "reference": {
        "expected": 3.6787944117144233,
        "actual": 3.67879441171,
        "unit": "В",
        "tolerance": 3.6787944117144233e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g15-15",
      "group": "g15",
      "groupTitle": "Электроника и печатные платы",
      "topic": "Идеальный ЦАП: напряжение по коду",
      "status": "implemented",
      "calculatorId": "g15-15",
      "href": "calculator.html?atlasTool=g15-15#labAtlasTools",
      "formula": "U = Uref × code / 2^bits.",
      "outputUnit": "В",
      "trigger": "live",
      "inputs": [
        {
          "key": "reference",
          "label": "Опорное напряжение DAC, В",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "bits",
          "label": "Разрядов DAC",
          "example": 8,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "code",
          "label": "Входной целочисленный код",
          "example": 128,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Идеальный униполярный двоичный DAC: старший код ниже Uref на один LSB. Не модель цифрового потенциометра.",
      "reference": {
        "expected": 2.5,
        "actual": 2.5,
        "unit": "В",
        "tolerance": 2.5e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g15-16",
      "group": "g15",
      "groupTitle": "Электроника и печатные платы",
      "topic": "Таймер 555 astable",
      "status": "implemented",
      "calculatorId": "g15-16",
      "href": "calculator.html?atlasTool=g15-16#labAtlasTools",
      "formula": "f = 1000 / (ln(2) × (Ra + 2Rb) × C).",
      "outputUnit": "Гц",
      "trigger": "live",
      "inputs": [
        {
          "key": "ra",
          "label": "Ra, кОм",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rb",
          "label": "Rb, кОм",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "c",
          "label": "C, мкФ",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Классический astable 555 с порогами 1/3 и 2/3 питания, без диодов изменения duty-cycle.",
      "reference": {
        "expected": 480.8983469629878,
        "actual": 480.898346963,
        "unit": "Гц",
        "tolerance": 0.0000048089834696298775,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g15-17",
      "group": "g15",
      "groupTitle": "Электроника и печатные платы",
      "topic": "Таймер 555 monostable",
      "status": "implemented",
      "calculatorId": "g15-17",
      "href": "calculator.html?atlasTool=g15-17#labAtlasTools",
      "formula": "t = ln(3) RC.",
      "outputUnit": "мс",
      "trigger": "live",
      "inputs": [
        {
          "key": "r",
          "label": "R, кОм",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "c",
          "label": "C, мкФ",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Идеальный monostable 555 с порогом 2/3 питания.",
      "reference": {
        "expected": 1.0986122886681096,
        "actual": 1.09861228867,
        "unit": "мс",
        "tolerance": 1.0986122886681096e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g15-18",
      "group": "g15",
      "groupTitle": "Электроника и печатные платы",
      "topic": "Код SMD-резистора",
      "status": "implemented",
      "calculatorId": "g15-18",
      "href": "calculator.html?atlasTool=g15-18#labAtlasTools",
      "formula": "Первые 2/3 цифры × 10^(последняя цифра).",
      "outputUnit": "Ом",
      "trigger": "live",
      "inputs": [
        {
          "key": "code",
          "label": "Трёх- или четырёхзначный цифровой код, например 103",
          "example": "103",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": true,
          "pattern": "^\\d{3,4}$",
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Только числовые 3/4-значные коды. EIA-96 и обозначения с R этой формулой не декодируются.",
      "reference": {
        "expected": 10000,
        "actual": 10000,
        "unit": "Ом",
        "tolerance": 0.0001,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g15-19",
      "group": "g15",
      "groupTitle": "Электроника и печатные платы",
      "topic": "Маркировка конденсатора",
      "status": "implemented",
      "calculatorId": "g15-19",
      "href": "calculator.html?atlasTool=g15-19#labAtlasTools",
      "formula": "Первые две цифры × 10^(третья цифра).",
      "outputUnit": "пФ",
      "trigger": "live",
      "inputs": [
        {
          "key": "code",
          "label": "Трёхзначный код ёмкости, например 104",
          "example": "104",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": true,
          "pattern": "^\\d{3}$",
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Числовой код в пикофарадах. Не декодирует допуск и рабочее напряжение.",
      "reference": {
        "expected": 100000,
        "actual": 100000,
        "unit": "пФ",
        "tolerance": 0.001,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g15-20",
      "group": "g15",
      "groupTitle": "Электроника и печатные платы",
      "topic": "Площадь меди печатной платы",
      "status": "implemented",
      "calculatorId": "g15-20",
      "href": "calculator.html?atlasTool=g15-20#labAtlasTools",
      "formula": "Площадь = ширина × длина.",
      "outputUnit": "мм²",
      "trigger": "live",
      "inputs": [
        {
          "key": "width",
          "label": "Ширина меди, мм",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Длина меди, мм",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Прямоугольный участок одного медного слоя.",
      "reference": {
        "expected": 200,
        "actual": 200,
        "unit": "мм²",
        "tolerance": 0.000002,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g15-21",
      "group": "g15",
      "groupTitle": "Электроника и печатные платы",
      "topic": "Сопротивление дорожки PCB",
      "status": "implemented",
      "calculatorId": "g15-21",
      "href": "calculator.html?atlasTool=g15-21#labAtlasTools",
      "formula": "R = ρ × длина / (ширина × толщина), с согласованием мм и мкм.",
      "outputUnit": "Ом",
      "trigger": "live",
      "inputs": [
        {
          "key": "rho",
          "label": "Удельное сопротивление, Ом·мм²/м",
          "example": 0.0175,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Длина дорожки, мм",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "width",
          "label": "Ширина дорожки, мм",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "thickness",
          "label": "Толщина меди, мкм",
          "example": 35,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "DC-сопротивление при температуре, которой соответствует ρ. Не допустимый ток PCB.",
      "reference": {
        "expected": 0.05,
        "actual": 0.05,
        "unit": "Ом",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g15-22",
      "group": "g15",
      "groupTitle": "Электроника и печатные платы",
      "topic": "Подбор резистора из E12/E24",
      "status": "implemented",
      "calculatorId": "g15-22",
      "href": "calculator.html?atlasTool=g15-22#labAtlasTools",
      "formula": "Ближайший номинал ряда по абсолютной разнице.",
      "outputUnit": "Ом",
      "trigger": "live",
      "inputs": [
        {
          "key": "target",
          "label": "Требуемое сопротивление, Ом",
          "example": 1700,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "series",
          "label": "Ряд",
          "example": 12,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": [
            12,
            24
          ]
        }
      ],
      "limits": "Подбор номинала без проверки мощности и допуска; при равных расстояниях выбирается меньший.",
      "reference": {
        "expected": 1800,
        "actual": 1800,
        "unit": "Ом",
        "tolerance": 0.000018,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g16-1",
      "group": "g16",
      "groupTitle": "Радиотехника и антенны",
      "topic": "Длина волны по частоте",
      "status": "implemented",
      "calculatorId": "g16-1",
      "href": "calculator.html?atlasTool=g16-1#labAtlasTools",
      "formula": "λ = c/f, c = 299 792 458 м/с.",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "frequency",
          "label": "Частота, МГц",
          "example": 299.792458,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Вакуум/свободное пространство; в среде скорость меняется.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "м",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://rfcalclab.com/en"
    },
    {
      "id": "g16-2",
      "group": "g16",
      "groupTitle": "Радиотехника и антенны",
      "topic": "Длина четвертьволновой антенны",
      "status": "implemented",
      "calculatorId": "g16-2",
      "href": "calculator.html?atlasTool=g16-2#labAtlasTools",
      "formula": "L = c/(4f) × коэффициент укорочения.",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "frequency",
          "label": "Частота, МГц",
          "example": 299.792458,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "factor",
          "label": "Заданный коэффициент укорочения",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Геометрический ориентир, не настроенная антенна; окружение и согласование не рассчитываются.",
      "reference": {
        "expected": 0.25,
        "actual": 0.25,
        "unit": "м",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://rfcalclab.com/en"
    },
    {
      "id": "g16-3",
      "group": "g16",
      "groupTitle": "Радиотехника и антенны",
      "topic": "Свободные потери FSPL",
      "status": "implemented",
      "calculatorId": "g16-3",
      "href": "calculator.html?atlasTool=g16-3#labAtlasTools",
      "formula": "FSPL = 20 log10(4π d f/c).",
      "outputUnit": "дБ",
      "trigger": "live",
      "inputs": [
        {
          "key": "distance",
          "label": "Расстояние, м",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "frequency",
          "label": "Частота, МГц",
          "example": 299.792458,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Дальнее поле и свободное пространство. Не учитывает препятствия, отражения и атмосферные потери.",
      "reference": {
        "expected": 21.984197280441926,
        "actual": 21.9841972804,
        "unit": "дБ",
        "tolerance": 2.1984197280441927e-7,
        "status": "passed"
      },
      "researchSource": "https://rfcalclab.com/en"
    },
    {
      "id": "g16-4",
      "group": "g16",
      "groupTitle": "Радиотехника и антенны",
      "topic": "Расчёт радиолинии link budget",
      "status": "implemented",
      "calculatorId": "g16-4",
      "href": "calculator.html?atlasTool=g16-4#labAtlasTools",
      "formula": "Pr = Pt + Gt + Gr − потери распространения − прочие потери.",
      "outputUnit": "dBm",
      "trigger": "live",
      "inputs": [
        {
          "key": "power",
          "label": "Мощность передатчика, dBm",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "tx",
          "label": "Усиление передающей антенны, dBi",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rx",
          "label": "Усиление приёмной антенны, dBi",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "path",
          "label": "Потери распространения, дБ",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "other",
          "label": "Прочие потери, дБ",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Все потери и усиления в согласованных логарифмических единицах; запас до чувствительности проверяется отдельно.",
      "reference": {
        "expected": -78,
        "actual": -78,
        "unit": "dBm",
        "tolerance": 7.8e-7,
        "status": "passed"
      },
      "researchSource": "https://rfcalclab.com/en"
    },
    {
      "id": "g16-5",
      "group": "g16",
      "groupTitle": "Радиотехника и антенны",
      "topic": "Коэффициент стоячей волны VSWR",
      "status": "implemented",
      "calculatorId": "g16-5",
      "href": "calculator.html?atlasTool=g16-5#labAtlasTools",
      "formula": "VSWR = (1 + |Γ|)/(1 − |Γ|).",
      "outputUnit": "КСВ",
      "trigger": "live",
      "inputs": [
        {
          "key": "gamma",
          "label": "Модуль коэффициента отражения |Γ|",
          "example": 0.5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Пассивная нагрузка, 0 ≤ |Γ| < 1. При |Γ|=1 КСВ неограничен.",
      "reference": {
        "expected": 3,
        "actual": 3,
        "unit": "КСВ",
        "tolerance": 3.0000000000000004e-8,
        "status": "passed"
      },
      "researchSource": "https://rfcalclab.com/en"
    },
    {
      "id": "g16-6",
      "group": "g16",
      "groupTitle": "Радиотехника и антенны",
      "topic": "Потери рассогласования",
      "status": "implemented",
      "calculatorId": "g16-6",
      "href": "calculator.html?atlasTool=g16-6#labAtlasTools",
      "formula": "Mismatch loss = −10 log10(1 − |Γ|²).",
      "outputUnit": "дБ",
      "trigger": "live",
      "inputs": [
        {
          "key": "gamma",
          "label": "Модуль коэффициента отражения |Γ|",
          "example": 0.5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Единственное рассогласование, без многократных отражений между двумя несогласованными портами.",
      "reference": {
        "expected": 1.2493873660829993,
        "actual": 1.24938736608,
        "unit": "дБ",
        "tolerance": 1.2493873660829992e-8,
        "status": "passed"
      },
      "researchSource": "https://rfcalclab.com/en"
    },
    {
      "id": "g16-7",
      "group": "g16",
      "groupTitle": "Радиотехника и антенны",
      "topic": "Обратные потери Return Loss",
      "status": "implemented",
      "calculatorId": "g16-7",
      "href": "calculator.html?atlasTool=g16-7#labAtlasTools",
      "formula": "Return loss = −20 log10 |Γ|.",
      "outputUnit": "дБ",
      "trigger": "live",
      "inputs": [
        {
          "key": "gamma",
          "label": "Модуль коэффициента отражения |Γ|",
          "example": 0.5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Для 0 < |Γ| ≤ 1; идеальное согласование |Γ|=0 даёт бесконечный return loss.",
      "reference": {
        "expected": 6.020599913279624,
        "actual": 6.02059991328,
        "unit": "дБ",
        "tolerance": 6.020599913279624e-8,
        "status": "passed"
      },
      "researchSource": "https://rfcalclab.com/en"
    },
    {
      "id": "g16-8",
      "group": "g16",
      "groupTitle": "Радиотехника и антенны",
      "topic": "Мощность в dBm и ваттах",
      "status": "implemented",
      "calculatorId": "g16-8",
      "href": "calculator.html?atlasTool=g16-8#labAtlasTools",
      "formula": "P, Вт = 10^((dBm − 30)/10).",
      "outputUnit": "Вт",
      "trigger": "live",
      "inputs": [
        {
          "key": "dbm",
          "label": "Мощность, dBm",
          "example": 30,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Мощность, не напряжение; dBm опирается на 1 мВт.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "Вт",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://rfcalclab.com/en"
    },
    {
      "id": "g16-9",
      "group": "g16",
      "groupTitle": "Радиотехника и антенны",
      "topic": "Коэффициент усиления в dBi",
      "status": "implemented",
      "calculatorId": "g16-9",
      "href": "calculator.html?atlasTool=g16-9#labAtlasTools",
      "formula": "G, dBi = 10 log10(Gлинейный).",
      "outputUnit": "dBi",
      "trigger": "live",
      "inputs": [
        {
          "key": "linear",
          "label": "Линейный коэффициент усиления относительно изотропной антенны",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Усиление по мощности, включает принятый КПД антенны; не направленность, если КПД не учтён.",
      "reference": {
        "expected": 3.010299956639812,
        "actual": 3.01029995664,
        "unit": "dBi",
        "tolerance": 3.010299956639812e-8,
        "status": "passed"
      },
      "researchSource": "https://rfcalclab.com/en"
    },
    {
      "id": "g16-10",
      "group": "g16",
      "groupTitle": "Радиотехника и антенны",
      "topic": "EIRP и ERP",
      "status": "implemented",
      "calculatorId": "g16-10",
      "href": "calculator.html?atlasTool=g16-10#labAtlasTools",
      "formula": "EIRP = Pt + GdBi − потери; ERP = EIRP − 2.15 дБ.",
      "outputUnit": "dBm EIRP",
      "trigger": "live",
      "inputs": [
        {
          "key": "power",
          "label": "Мощность передатчика, dBm",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "gain",
          "label": "Усиление антенны, dBi",
          "example": 3,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "loss",
          "label": "Потери фидера, дБ",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Сравнение ERP с полуволновым диполем; фактические нормативные ограничения не проверяются.",
      "reference": {
        "expected": 12,
        "actual": 12,
        "unit": "dBm EIRP",
        "tolerance": 1.2000000000000002e-7,
        "status": "passed"
      },
      "researchSource": "https://rfcalclab.com/en"
    },
    {
      "id": "g16-11",
      "group": "g16",
      "groupTitle": "Радиотехника и антенны",
      "topic": "Зона Френеля",
      "status": "implemented",
      "calculatorId": "g16-11",
      "href": "calculator.html?atlasTool=g16-11#labAtlasTools",
      "formula": "r1 = sqrt(λ d1 d2/(d1+d2)).",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "d1",
          "label": "От препятствия до передатчика, км",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "d2",
          "label": "От препятствия до приёмника, км",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "frequency",
          "label": "Частота, МГц",
          "example": 299.792458,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Радиус первой зоны Френеля в заданной точке; это не требуемый процент очистки.",
      "reference": {
        "expected": 22.360679774997898,
        "actual": 22.360679775,
        "unit": "м",
        "tolerance": 2.23606797749979e-7,
        "status": "passed"
      },
      "researchSource": "https://rfcalclab.com/en"
    },
    {
      "id": "g16-12",
      "group": "g16",
      "groupTitle": "Радиотехника и антенны",
      "topic": "Дальность прямой видимости",
      "status": "implemented",
      "calculatorId": "g16-12",
      "href": "calculator.html?atlasTool=g16-12#labAtlasTools",
      "formula": "d ≈ sqrt(2 k Re h1) + sqrt(2 k Re h2), Re=6 371 000 м.",
      "outputUnit": "км",
      "trigger": "live",
      "inputs": [
        {
          "key": "h1",
          "label": "Высота первой антенны, м",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "h2",
          "label": "Высота второй антенны, м",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "k",
          "label": "Эффективный коэффициент радиуса Земли k",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Радиогоризонт над гладкой сферой, без рельефа. k вводится для выбранной модели рефракции.",
      "reference": {
        "expected": 22.576093550479456,
        "actual": 22.5760935505,
        "unit": "км",
        "tolerance": 2.2576093550479456e-7,
        "status": "passed"
      },
      "researchSource": "https://rfcalclab.com/en"
    },
    {
      "id": "g16-13",
      "group": "g16",
      "groupTitle": "Радиотехника и антенны",
      "topic": "Глубина скин-слоя",
      "status": "implemented",
      "calculatorId": "g16-13",
      "href": "calculator.html?atlasTool=g16-13#labAtlasTools",
      "formula": "δ = sqrt(1/(π f μ0 μr σ)).",
      "outputUnit": "мкм",
      "trigger": "live",
      "inputs": [
        {
          "key": "frequency",
          "label": "Частота, Гц",
          "example": 1000000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "conductivity",
          "label": "Проводимость, См/м",
          "example": 58000000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "mur",
          "label": "Относительная магнитная проницаемость",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Хороший проводник, стационарная линейная магнитная проницаемость.",
      "reference": {
        "expected": 66.08549310080564,
        "actual": 66.0854931008,
        "unit": "мкм",
        "tolerance": 6.608549310080563e-7,
        "status": "passed"
      },
      "researchSource": "https://rfcalclab.com/en"
    },
    {
      "id": "g16-14",
      "group": "g16",
      "groupTitle": "Радиотехника и антенны",
      "topic": "Ширина микрополосковой линии",
      "status": "implemented",
      "calculatorId": "g16-14",
      "href": "calculator.html?atlasTool=g16-14#labAtlasTools",
      "formula": "Синтез W/h по приближению Hammerstad для микрополосковой линии с нулевой толщиной металла.",
      "outputUnit": "мм ширины",
      "trigger": "live",
      "inputs": [
        {
          "key": "z",
          "label": "Целевой импеданс, Ом",
          "example": 50,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "er",
          "label": "Относительная диэлектрическая проницаемость",
          "example": 4.4,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "height",
          "label": "Высота подложки, мм",
          "example": 1.6,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Квазистатика, без толщины меди, паяльной маски, дисперсии и производственных поправок. Для изготовления требуется EM-проверка.",
      "reference": {
        "expected": 3.0589,
        "actual": 3.05897498293,
        "unit": "мм ширины",
        "tolerance": 0.001,
        "status": "passed"
      },
      "researchSource": "https://rfcalclab.com/en"
    },
    {
      "id": "g16-15",
      "group": "g16",
      "groupTitle": "Радиотехника и антенны",
      "topic": "Импеданс stripline",
      "status": "implemented",
      "calculatorId": "g16-15",
      "href": "calculator.html?atlasTool=g16-15#labAtlasTools",
      "formula": "Z ≈ 60/sqrt(εr) × ln(4b/[0.67π(0.8w+t)]).",
      "outputUnit": "Ом",
      "trigger": "live",
      "inputs": [
        {
          "key": "er",
          "label": "εr",
          "example": 4,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "plane",
          "label": "Расстояние между двумя опорными плоскостями b, мм",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "width",
          "label": "Ширина полоски w, мм",
          "example": 0.2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "thickness",
          "label": "Толщина металла t, мм",
          "example": 0.035,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Приближённая симметричная stripline. Узкая линия w/b≤0.35 и t/b≤0.1, εr≥1; не общий EM-решатель.",
      "reference": {
        "expected": 68.30393286858018,
        "actual": 68.3039328686,
        "unit": "Ом",
        "tolerance": 0.01,
        "status": "passed"
      },
      "researchSource": "https://rfcalclab.com/en"
    },
    {
      "id": "g16-16",
      "group": "g16",
      "groupTitle": "Радиотехника и антенны",
      "topic": "Копланарная линия CPW",
      "status": "implemented",
      "calculatorId": "g16-16",
      "href": "calculator.html?atlasTool=g16-16#labAtlasTools",
      "formula": "Z = 30π/sqrt((εr+1)/2) × K(k′)/K(k), k=w/(w+2s).",
      "outputUnit": "Ом",
      "trigger": "live",
      "inputs": [
        {
          "key": "width",
          "label": "Ширина центральной полоски, мм",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "gap",
          "label": "Зазор до каждой coplanar-земли, мм",
          "example": 0.20710678118654757,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "er",
          "label": "εr подложки",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Идеальная CPW: бесконечная толщина подложки/земель, нулевая толщина металла, без обратной земли, потерь и дисперсии.",
      "reference": {
        "expected": 94.2477796076938,
        "actual": 94.2477796077,
        "unit": "Ом",
        "tolerance": 9.42477796076938e-7,
        "status": "passed"
      },
      "researchSource": "https://rfcalclab.com/en"
    },
    {
      "id": "g16-17",
      "group": "g16",
      "groupTitle": "Радиотехника и антенны",
      "topic": "Длины коаксиального кабеля по VF",
      "status": "implemented",
      "calculatorId": "g16-17",
      "href": "calculator.html?atlasTool=g16-17#labAtlasTools",
      "formula": "L = c/f × VF × доля волны.",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "frequency",
          "label": "Частота, МГц",
          "example": 299.792458,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "vf",
          "label": "Коэффициент скорости VF",
          "example": 0.66,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "fraction",
          "label": "Доля волны, например 0.25",
          "example": 0.25,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "VF по паспорту кабеля на рабочей частоте; концевые поправки не учтены.",
      "reference": {
        "expected": 0.165,
        "actual": 0.165,
        "unit": "м",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://rfcalclab.com/en"
    },
    {
      "id": "g16-18",
      "group": "g16",
      "groupTitle": "Радиотехника и антенны",
      "topic": "Потери в кабеле по дБ/м",
      "status": "implemented",
      "calculatorId": "g16-18",
      "href": "calculator.html?atlasTool=g16-18#labAtlasTools",
      "formula": "Потери = длина × удельное затухание.",
      "outputUnit": "дБ",
      "trigger": "live",
      "inputs": [
        {
          "key": "length",
          "label": "Длина кабеля, м",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "attenuation",
          "label": "Затухание на рабочей частоте, дБ/м",
          "example": 0.2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Разъёмы и переходы не включены.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "дБ",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://rfcalclab.com/en"
    },
    {
      "id": "g16-19",
      "group": "g16",
      "groupTitle": "Радиотехника и антенны",
      "topic": "Угловая ширина диаграммы антенны",
      "status": "implemented",
      "calculatorId": "g16-19",
      "href": "calculator.html?atlasTool=g16-19#labAtlasTools",
      "formula": "HPBW ≈ коэффициент × λ/D.",
      "outputUnit": "градусы",
      "trigger": "live",
      "inputs": [
        {
          "key": "wavelength",
          "label": "Длина волны, м",
          "example": 0.03,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "diameter",
          "label": "Диаметр апертуры, м",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "factor",
          "label": "Заданный коэффициент модели, градусы",
          "example": 70,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Приближение апертурной антенны; коэффициент зависит от распределения поля и не универсален.",
      "reference": {
        "expected": 2.1,
        "actual": 2.1,
        "unit": "градусы",
        "tolerance": 2.1000000000000003e-8,
        "status": "passed"
      },
      "researchSource": "https://rfcalclab.com/en"
    },
    {
      "id": "g16-20",
      "group": "g16",
      "groupTitle": "Радиотехника и антенны",
      "topic": "Коэффициент шума каскада",
      "status": "implemented",
      "calculatorId": "g16-20",
      "href": "calculator.html?atlasTool=g16-20#labAtlasTools",
      "formula": "F = F1 + (F2−1)/G1; NF = 10 log10 F.",
      "outputUnit": "дБ NF",
      "trigger": "live",
      "inputs": [
        {
          "key": "f1",
          "label": "Шум-фактор первого каскада, линейный",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "f2",
          "label": "Шум-фактор второго каскада, линейный",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "g1",
          "label": "Доступное усиление первого каскада, линейное",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Два согласованных каскада, одинаковая опорная шумовая температура; входы именно линейные.",
      "reference": {
        "expected": 3.222192947339193,
        "actual": 3.22219294734,
        "unit": "дБ NF",
        "tolerance": 3.2221929473391934e-8,
        "status": "passed"
      },
      "researchSource": "https://rfcalclab.com/en"
    },
    {
      "id": "g16-21",
      "group": "g16",
      "groupTitle": "Радиотехника и антенны",
      "topic": "C/N радиоканала",
      "status": "implemented",
      "calculatorId": "g16-21",
      "href": "calculator.html?atlasTool=g16-21#labAtlasTools",
      "formula": "C/N = C_dBm − N_dBm.",
      "outputUnit": "дБ",
      "trigger": "live",
      "inputs": [
        {
          "key": "carrier",
          "label": "Мощность несущей в полосе, dBm",
          "example": -50,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "noise",
          "label": "Мощность шума в той же полосе, dBm",
          "example": -80,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Мощности должны относиться к одной полосе и одной точке тракта.",
      "reference": {
        "expected": 30,
        "actual": 30,
        "unit": "дБ",
        "tolerance": 3e-7,
        "status": "passed"
      },
      "researchSource": "https://rfcalclab.com/en"
    },
    {
      "id": "g16-22",
      "group": "g16",
      "groupTitle": "Радиотехника и антенны",
      "topic": "Пропускная способность по Шеннону",
      "status": "implemented",
      "calculatorId": "g16-22",
      "href": "calculator.html?atlasTool=g16-22#labAtlasTools",
      "formula": "C = B log2(1 + 10^(SNR/10)).",
      "outputUnit": "Мбит/с",
      "trigger": "live",
      "inputs": [
        {
          "key": "bandwidth",
          "label": "Полоса канала, МГц",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "snr",
          "label": "SNR, дБ",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Предел Шеннона для AWGN-канала; не реальная скорость протокола.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "Мбит/с",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://rfcalclab.com/en"
    },
    {
      "id": "g17-1",
      "group": "g17",
      "groupTitle": "АСУ ТП, датчики и автоматика",
      "topic": "Линейная шкала 4–20 мА",
      "status": "implemented",
      "calculatorId": "g17-1",
      "href": "calculator.html?atlasTool=g17-1#labAtlasTools",
      "formula": "Значение = низ + (сигнал − 4)/(20 − 4) × (верх − низ).",
      "outputUnit": "единиц шкалы",
      "trigger": "live",
      "inputs": [
        {
          "key": "signal",
          "label": "Сигнал, мА",
          "example": 12,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "low",
          "label": "Нижняя граница инженерной шкалы",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "high",
          "label": "Верхняя граница инженерной шкалы",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Линейная шкала; выход за электрический диапазон отклоняется, диагностика обрыва/аварийные уровни не подменяются экстраполяцией.",
      "reference": {
        "expected": 50,
        "actual": 50,
        "unit": "единиц шкалы",
        "tolerance": 5e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g17-2",
      "group": "g17",
      "groupTitle": "АСУ ТП, датчики и автоматика",
      "topic": "Обратная шкала 4–20 мА",
      "status": "implemented",
      "calculatorId": "g17-2",
      "href": "calculator.html?atlasTool=g17-2#labAtlasTools",
      "formula": "I = 4 + (значение − низ)/(верх − низ) × 16.",
      "outputUnit": "мА",
      "trigger": "live",
      "inputs": [
        {
          "key": "value",
          "label": "Инженерное значение",
          "example": 50,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "low",
          "label": "Низ шкалы",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "high",
          "label": "Верх шкалы",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Линейный идеальный выход 4–20 мА.",
      "reference": {
        "expected": 12,
        "actual": 12,
        "unit": "мА",
        "tolerance": 1.2000000000000002e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g17-3",
      "group": "g17",
      "groupTitle": "АСУ ТП, датчики и автоматика",
      "topic": "Перевод 0–10 В в инженерные единицы",
      "status": "implemented",
      "calculatorId": "g17-3",
      "href": "calculator.html?atlasTool=g17-3#labAtlasTools",
      "formula": "Значение = низ + (сигнал − 0)/(10 − 0) × (верх − низ).",
      "outputUnit": "единиц шкалы",
      "trigger": "live",
      "inputs": [
        {
          "key": "signal",
          "label": "Сигнал, В",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "low",
          "label": "Нижняя граница инженерной шкалы",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "high",
          "label": "Верхняя граница инженерной шкалы",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Линейная шкала; выход за электрический диапазон отклоняется, диагностика обрыва/аварийные уровни не подменяются экстраполяцией.",
      "reference": {
        "expected": 50,
        "actual": 50,
        "unit": "единиц шкалы",
        "tolerance": 5e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g17-4",
      "group": "g17",
      "groupTitle": "АСУ ТП, датчики и автоматика",
      "topic": "Масштабирование 0–5 В",
      "status": "implemented",
      "calculatorId": "g17-4",
      "href": "calculator.html?atlasTool=g17-4#labAtlasTools",
      "formula": "Значение = низ + (сигнал − 0)/(5 − 0) × (верх − низ).",
      "outputUnit": "единиц шкалы",
      "trigger": "live",
      "inputs": [
        {
          "key": "signal",
          "label": "Сигнал, В",
          "example": 2.5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "low",
          "label": "Нижняя граница инженерной шкалы",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "high",
          "label": "Верхняя граница инженерной шкалы",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Линейная шкала; выход за электрический диапазон отклоняется, диагностика обрыва/аварийные уровни не подменяются экстраполяцией.",
      "reference": {
        "expected": 50,
        "actual": 50,
        "unit": "единиц шкалы",
        "tolerance": 5e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g17-5",
      "group": "g17",
      "groupTitle": "АСУ ТП, датчики и автоматика",
      "topic": "Масштабирование кода АЦП 12 бит",
      "status": "implemented",
      "calculatorId": "g17-5",
      "href": "calculator.html?atlasTool=g17-5#labAtlasTools",
      "formula": "Значение = низ + код/4095 × (верх − низ).",
      "outputUnit": "единиц",
      "trigger": "live",
      "inputs": [
        {
          "key": "code",
          "label": "12-битный код ADC",
          "example": 2048,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 4095,
          "choices": null
        },
        {
          "key": "low",
          "label": "Низ шкалы",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "high",
          "label": "Верх шкалы",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Двухконцевая привязка шкалы 0…4095, не размер LSB аналогового ADC.",
      "reference": {
        "expected": 50.01221001221001,
        "actual": 50.0122100122,
        "unit": "единиц",
        "tolerance": 5.001221001221001e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g17-6",
      "group": "g17",
      "groupTitle": "АСУ ТП, датчики и автоматика",
      "topic": "Разрешение ADC в микровольтах",
      "status": "implemented",
      "calculatorId": "g17-6",
      "href": "calculator.html?atlasTool=g17-6#labAtlasTools",
      "formula": "LSB = полный диапазон / 2^бит × 10⁶.",
      "outputUnit": "мкВ",
      "trigger": "live",
      "inputs": [
        {
          "key": "span",
          "label": "Полный аналоговый диапазон, В",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "bits",
          "label": "Разрядов",
          "example": 12,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Идеальный размер квантования; не ENOB и не точность.",
      "reference": {
        "expected": 1220.703125,
        "actual": 1220.703125,
        "unit": "мкВ",
        "tolerance": 0.00001220703125,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g17-7",
      "group": "g17",
      "groupTitle": "АСУ ТП, датчики и автоматика",
      "topic": "Сдвиг нуля аналогового входа",
      "status": "implemented",
      "calculatorId": "g17-7",
      "href": "calculator.html?atlasTool=g17-7#labAtlasTools",
      "formula": "Исправленное = измеренное − сдвиг нуля.",
      "outputUnit": "единиц",
      "trigger": "live",
      "inputs": [
        {
          "key": "raw",
          "label": "Измеренное значение",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "offset",
          "label": "Измеренный сдвиг нуля",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Только аддитивный сдвиг; чувствительность и нелинейность отдельно.",
      "reference": {
        "expected": 8,
        "actual": 8,
        "unit": "единиц",
        "tolerance": 8e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g17-8",
      "group": "g17",
      "groupTitle": "АСУ ТП, датчики и автоматика",
      "topic": "Количество кодов энкодера на оборот",
      "status": "implemented",
      "calculatorId": "g17-8",
      "href": "calculator.html?atlasTool=g17-8#labAtlasTools",
      "formula": "Отсчётов/оборот = PPR × кратность.",
      "outputUnit": "отсчётов/об",
      "trigger": "live",
      "inputs": [
        {
          "key": "ppr",
          "label": "Периодов A на оборот",
          "example": 1024,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "multiplier",
          "label": "Кратность обработки",
          "example": 4,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": [
            1,
            2,
            4
          ]
        }
      ],
      "limits": "Не путайте паспортный PPR с уже умноженным CPR.",
      "reference": {
        "expected": 4096,
        "actual": 4096,
        "unit": "отсчётов/об",
        "tolerance": 0.00004096,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g17-9",
      "group": "g17",
      "groupTitle": "АСУ ТП, датчики и автоматика",
      "topic": "Линейное перемещение по импульсам",
      "status": "implemented",
      "calculatorId": "g17-9",
      "href": "calculator.html?atlasTool=g17-9#labAtlasTools",
      "formula": "Перемещение = импульсы / импульсов на мм.",
      "outputUnit": "мм",
      "trigger": "live",
      "inputs": [
        {
          "key": "pulses",
          "label": "Отсчитано импульсов",
          "example": 1000,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "per",
          "label": "Импульсов на 1 мм",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Счёт и коэффициент на одной базе фронтов/периодов.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "мм",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g17-10",
      "group": "g17",
      "groupTitle": "АСУ ТП, датчики и автоматика",
      "topic": "Длина шага сервопривода",
      "status": "implemented",
      "calculatorId": "g17-10",
      "href": "calculator.html?atlasTool=g17-10#labAtlasTools",
      "formula": "Шаг перемещения = ход винта / импульсов на оборот.",
      "outputUnit": "мм/импульс",
      "trigger": "live",
      "inputs": [
        {
          "key": "lead",
          "label": "Ход винта на оборот, мм",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "counts",
          "label": "Командных импульсов на оборот винта",
          "example": 1000,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Редуктор и электронную передачу включите в импульсы на оборот винта.",
      "reference": {
        "expected": 0.005,
        "actual": 0.005,
        "unit": "мм/импульс",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g17-11",
      "group": "g17",
      "groupTitle": "АСУ ТП, датчики и автоматика",
      "topic": "ПИД P-компонента",
      "status": "implemented",
      "calculatorId": "g17-11",
      "href": "calculator.html?atlasTool=g17-11#labAtlasTools",
      "formula": "P = Kp × (задание − измерение).",
      "outputUnit": "единиц выхода",
      "trigger": "live",
      "inputs": [
        {
          "key": "setpoint",
          "label": "Задание",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "measured",
          "label": "Измеренное значение",
          "example": 8,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "gain",
          "label": "Пропорциональный коэффициент Kp",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Только P-компонента, без I/D, ограничителей и anti-windup.",
      "reference": {
        "expected": 4,
        "actual": 4,
        "unit": "единиц выхода",
        "tolerance": 4e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g17-12",
      "group": "g17",
      "groupTitle": "АСУ ТП, датчики и автоматика",
      "topic": "Время опроса ПЛК",
      "status": "implemented",
      "calculatorId": "g17-12",
      "href": "calculator.html?atlasTool=g17-12#labAtlasTools",
      "formula": "Скан ≈ инструкции × мкс/1000 + I/O.",
      "outputUnit": "мс",
      "trigger": "live",
      "inputs": [
        {
          "key": "instructions",
          "label": "Условных одинаковых инструкций",
          "example": 1000,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "time",
          "label": "Время одной, мкс",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "io",
          "label": "Заданное время I/O и служебных задач, мс",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Приближение по заданной одинаковой стоимости инструкции; не заменяет измерение цикла ПЛК.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "мс",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g17-13",
      "group": "g17",
      "groupTitle": "АСУ ТП, датчики и автоматика",
      "topic": "Задержка дискретизации",
      "status": "implemented",
      "calculatorId": "g17-13",
      "href": "calculator.html?atlasTool=g17-13#labAtlasTools",
      "formula": "Средняя задержка равномерного прихода = период/2.",
      "outputUnit": "мс (средняя)",
      "trigger": "live",
      "inputs": [
        {
          "key": "period",
          "label": "Период опроса, мс",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Асинхронное событие относительно периодического опроса; передача и обработка не включены.",
      "reference": {
        "expected": 5,
        "actual": 5,
        "unit": "мс (средняя)",
        "tolerance": 5e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g17-14",
      "group": "g17",
      "groupTitle": "АСУ ТП, датчики и автоматика",
      "topic": "Дребезг входа и тайм-аут",
      "status": "implemented",
      "calculatorId": "g17-14",
      "href": "calculator.html?atlasTool=g17-14#labAtlasTools",
      "formula": "Необходимых последовательных устойчивых отсчётов = ceil(стабильность/период) + 1.",
      "outputUnit": "отсчётов",
      "trigger": "live",
      "inputs": [
        {
          "key": "stable",
          "label": "Требуемая непрерывная стабильность входа, мс",
          "example": 20,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "period",
          "label": "Период опроса, мс",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Первый отсчёт начинает интервал; N отсчётов охватывают (N−1) периодов. Не обнаруживает изменения между опросами.",
      "reference": {
        "expected": 5,
        "actual": 5,
        "unit": "отсчётов",
        "tolerance": 5e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g17-15",
      "group": "g17",
      "groupTitle": "АСУ ТП, датчики и автоматика",
      "topic": "Декодирование Modbus Float32",
      "status": "implemented",
      "calculatorId": "g17-15",
      "href": "calculator.html?atlasTool=g17-15#labAtlasTools",
      "formula": "Два uint16 декодируются как IEEE-754 Float32 в выбранном порядке байтов.",
      "outputUnit": "Float32",
      "trigger": "live",
      "inputs": [
        {
          "key": "first",
          "label": "Первый регистр (десятичный uint16)",
          "example": 16256,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 65535,
          "choices": null
        },
        {
          "key": "second",
          "label": "Второй регистр (uint16)",
          "example": 0,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 65535,
          "choices": null
        },
        {
          "key": "order",
          "label": "Порядок: 0=ABCD, 1=CDAB, 2=BADC, 3=DCBA",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": [
            0,
            1,
            2,
            3
          ]
        }
      ],
      "limits": "Не конечные IEEE-754 значения показываются ошибкой диапазона в этом числовом инструменте.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "Float32",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g17-16",
      "group": "g17",
      "groupTitle": "АСУ ТП, датчики и автоматика",
      "topic": "Сборка Modbus Int32 из регистров",
      "status": "implemented",
      "calculatorId": "g17-16",
      "href": "calculator.html?atlasTool=g17-16#labAtlasTools",
      "formula": "u = старшее×65536 + младшее; signed = u≥2³¹ ? u−2³² : u.",
      "outputUnit": "Int32",
      "trigger": "live",
      "inputs": [
        {
          "key": "high",
          "label": "Старшее слово uint16",
          "example": 65535,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 65535,
          "choices": null
        },
        {
          "key": "low",
          "label": "Младшее слово uint16",
          "example": 65535,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 65535,
          "choices": null
        }
      ],
      "limits": "Порядок слов задан как старшее затем младшее.",
      "reference": {
        "expected": -1,
        "actual": -1,
        "unit": "Int32",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g17-17",
      "group": "g17",
      "groupTitle": "АСУ ТП, датчики и автоматика",
      "topic": "Маска битов PLC",
      "status": "implemented",
      "calculatorId": "g17-17",
      "href": "calculator.html?atlasTool=g17-17#labAtlasTools",
      "formula": "Результат = word AND mask (uint32).",
      "outputUnit": "uint32",
      "trigger": "live",
      "inputs": [
        {
          "key": "word",
          "label": "Слово uint32",
          "example": 10,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 4294967295,
          "choices": null
        },
        {
          "key": "mask",
          "label": "Маска uint32",
          "example": 12,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 4294967295,
          "choices": null
        }
      ],
      "limits": "Побитовое И; не адресация битов конкретного контроллера.",
      "reference": {
        "expected": 8,
        "actual": 8,
        "unit": "uint32",
        "tolerance": 8e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g17-18",
      "group": "g17",
      "groupTitle": "АСУ ТП, датчики и автоматика",
      "topic": "Разбор BCD-слова",
      "status": "implemented",
      "calculatorId": "g17-18",
      "href": "calculator.html?atlasTool=g17-18#labAtlasTools",
      "formula": "Каждая тетрада 0…9 преобразуется в десятичный разряд.",
      "outputUnit": "число",
      "trigger": "live",
      "inputs": [
        {
          "key": "word",
          "label": "BCD-слово как десятичный uint16 (0x1234 = 4660)",
          "example": 4660,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 65535,
          "choices": null
        }
      ],
      "limits": "Четыре упакованные BCD-цифры без знаковой тетрады.",
      "reference": {
        "expected": 1234,
        "actual": 1234,
        "unit": "число",
        "tolerance": 0.00001234,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g17-19",
      "group": "g17",
      "groupTitle": "АСУ ТП, датчики и автоматика",
      "topic": "Аналоговый фильтр первого порядка",
      "status": "implemented",
      "calculatorId": "g17-19",
      "href": "calculator.html?atlasTool=g17-19#labAtlasTools",
      "formula": "y = yпред + (1 − exp(−Δt/τ)) (вход − yпред).",
      "outputUnit": "единиц",
      "trigger": "live",
      "inputs": [
        {
          "key": "before",
          "label": "Предыдущее отфильтрованное значение",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "input",
          "label": "Текущее входное значение",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "dt",
          "label": "Шаг, с",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "tau",
          "label": "Постоянная времени, с",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Точная дискретизация апериодического первого порядка при постоянном входе на шаге.",
      "reference": {
        "expected": 6.321205588285577,
        "actual": 6.32120558829,
        "unit": "единиц",
        "tolerance": 6.321205588285577e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g17-20",
      "group": "g17",
      "groupTitle": "АСУ ТП, датчики и автоматика",
      "topic": "Погрешность датчика по диапазону",
      "status": "implemented",
      "calculatorId": "g17-20",
      "href": "calculator.html?atlasTool=g17-20#labAtlasTools",
      "formula": "Абсолютный предел = процент/100 × диапазон.",
      "outputUnit": "единиц",
      "trigger": "live",
      "inputs": [
        {
          "key": "percent",
          "label": "Заданная приведённая погрешность, % диапазона",
          "example": 0.5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "span",
          "label": "Полный диапазон, единиц",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не включает температурные, долговременные и монтажные составляющие, если их нет в проценте.",
      "reference": {
        "expected": 0.5,
        "actual": 0.5,
        "unit": "единиц",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g17-21",
      "group": "g17",
      "groupTitle": "АСУ ТП, датчики и автоматика",
      "topic": "Перевод расхода имп/л в л/мин",
      "status": "implemented",
      "calculatorId": "g17-21",
      "href": "calculator.html?atlasTool=g17-21#labAtlasTools",
      "formula": "Расход = Гц × 60 / импульсов на литр.",
      "outputUnit": "л/мин",
      "trigger": "live",
      "inputs": [
        {
          "key": "frequency",
          "label": "Частота импульсов, Гц",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "ppl",
          "label": "Импульсов на литр",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Для установленного K-фактора и диапазона расходомера.",
      "reference": {
        "expected": 6,
        "actual": 6,
        "unit": "л/мин",
        "tolerance": 6.000000000000001e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g17-22",
      "group": "g17",
      "groupTitle": "АСУ ТП, датчики и автоматика",
      "topic": "Расчёт времени накопления счётчика",
      "status": "implemented",
      "calculatorId": "g17-22",
      "href": "calculator.html?atlasTool=g17-22#labAtlasTools",
      "formula": "Время = количество/частота.",
      "outputUnit": "с",
      "trigger": "live",
      "inputs": [
        {
          "key": "target",
          "label": "Требуемое число импульсов",
          "example": 1000,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "frequency",
          "label": "Постоянная частота, Гц",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без переполнения и пропусков счётчика.",
      "reference": {
        "expected": 100,
        "actual": 100,
        "unit": "с",
        "tolerance": 0.000001,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g18-1",
      "group": "g18",
      "groupTitle": "Гидравлика, насосы и пневматика",
      "topic": "Расход по площади и скорости",
      "status": "implemented",
      "calculatorId": "g18-1",
      "href": "calculator.html?atlasTool=g18-1#labAtlasTools",
      "formula": "Q = A v × 3600.",
      "outputUnit": "м³/ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "area",
          "label": "Живое сечение, м²",
          "example": 0.01,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "velocity",
          "label": "Средняя скорость, м/с",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Равномерно осреднённая по сечению скорость.",
      "reference": {
        "expected": 72,
        "actual": 72,
        "unit": "м³/ч",
        "tolerance": 7.2e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g18-2",
      "group": "g18",
      "groupTitle": "Гидравлика, насосы и пневматика",
      "topic": "Скорость потока по расходу",
      "status": "implemented",
      "calculatorId": "g18-2",
      "href": "calculator.html?atlasTool=g18-2#labAtlasTools",
      "formula": "v = Q/(3600A).",
      "outputUnit": "м/с",
      "trigger": "live",
      "inputs": [
        {
          "key": "flow",
          "label": "Объёмный расход, м³/ч",
          "example": 72,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "area",
          "label": "Живое сечение, м²",
          "example": 0.01,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Расход и площадь относятся к одному состоянию среды.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "м/с",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g18-3",
      "group": "g18",
      "groupTitle": "Гидравлика, насосы и пневматика",
      "topic": "Число Рейнольдса",
      "status": "implemented",
      "calculatorId": "g18-3",
      "href": "calculator.html?atlasTool=g18-3#labAtlasTools",
      "formula": "Re = v D/ν.",
      "outputUnit": "Re",
      "trigger": "live",
      "inputs": [
        {
          "key": "velocity",
          "label": "Средняя скорость, м/с",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "diameter",
          "label": "Гидравлический диаметр, м",
          "example": 0.01,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "viscosity",
          "label": "Кинематическая вязкость, м²/с",
          "example": 0.000001,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Выбор режима и корреляции трения проверяется отдельно.",
      "reference": {
        "expected": 10000,
        "actual": 10000,
        "unit": "Re",
        "tolerance": 0.0001,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g18-4",
      "group": "g18",
      "groupTitle": "Гидравлика, насосы и пневматика",
      "topic": "Потери давления Дарси–Вейсбаха",
      "status": "implemented",
      "calculatorId": "g18-4",
      "href": "calculator.html?atlasTool=g18-4#labAtlasTools",
      "formula": "Δp = f (L/D) ρv²/2.",
      "outputUnit": "Па",
      "trigger": "live",
      "inputs": [
        {
          "key": "factor",
          "label": "Коэффициент Дарси f (не Фаннинга)",
          "example": 0.02,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Длина, м",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "diameter",
          "label": "Диаметр, м",
          "example": 0.1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Плотность, кг/м³",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "velocity",
          "label": "Средняя скорость, м/с",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Установившийся несжимаемый поток в заполненной трубе. f задаётся по проверенной корреляции.",
      "reference": {
        "expected": 40000,
        "actual": 40000,
        "unit": "Па",
        "tolerance": 0.0004,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g18-5",
      "group": "g18",
      "groupTitle": "Гидравлика, насосы и пневматика",
      "topic": "Потери напора на местных сопротивлениях",
      "status": "implemented",
      "calculatorId": "g18-5",
      "href": "calculator.html?atlasTool=g18-5#labAtlasTools",
      "formula": "h = Σζ v²/(2g), g=9.80665.",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "coefficient",
          "label": "Сумма местных коэффициентов ζ",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "velocity",
          "label": "Скорость в опорном сечении, м/с",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Коэффициенты ζ должны относиться к указанной скорости и геометрии.",
      "reference": {
        "expected": 0.4078864851911713,
        "actual": 0.407886485191,
        "unit": "м",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g18-6",
      "group": "g18",
      "groupTitle": "Гидравлика, насосы и пневматика",
      "topic": "Напор насоса по давлению",
      "status": "implemented",
      "calculatorId": "g18-6",
      "href": "calculator.html?atlasTool=g18-6#labAtlasTools",
      "formula": "H = Δp × 1000/(ρg).",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "pressure",
          "label": "Перепад давления, кПа",
          "example": 98.0665,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Плотность, кг/м³",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Только составляющая напора по давлению; разности скоростей и отметок добавляются отдельно.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "м",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g18-7",
      "group": "g18",
      "groupTitle": "Гидравлика, насосы и пневматика",
      "topic": "Мощность насоса по расходу",
      "status": "implemented",
      "calculatorId": "g18-7",
      "href": "calculator.html?atlasTool=g18-7#labAtlasTools",
      "formula": "Pвал = ρgQH/η.",
      "outputUnit": "кВт",
      "trigger": "live",
      "inputs": [
        {
          "key": "flow",
          "label": "Расход, м³/ч",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "head",
          "label": "Напор, м",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Плотность, кг/м³",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "eff",
          "label": "КПД насоса, доля",
          "example": 0.8,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Мощность на валу; КПД двигателя здесь не включён.",
      "reference": {
        "expected": 0.34050868055555555,
        "actual": 0.340508680556,
        "unit": "кВт",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g18-8",
      "group": "g18",
      "groupTitle": "Гидравлика, насосы и пневматика",
      "topic": "КПД насоса",
      "status": "implemented",
      "calculatorId": "g18-8",
      "href": "calculator.html?atlasTool=g18-8#labAtlasTools",
      "formula": "η = Pгидр/Pвал × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "hydraulic",
          "label": "Полезная гидравлическая мощность, кВт",
          "example": 8,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "shaft",
          "label": "Мощность на валу, кВт",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Мощности измерены в одной рабочей точке.",
      "reference": {
        "expected": 80,
        "actual": 80,
        "unit": "%",
        "tolerance": 8e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g18-9",
      "group": "g18",
      "groupTitle": "Гидравлика, насосы и пневматика",
      "topic": "NPSH available",
      "status": "implemented",
      "calculatorId": "g18-9",
      "href": "calculator.html?atlasTool=g18-9#labAtlasTools",
      "formula": "NPSHa = (pабс − pпара)/(ρg) + высота уровня − потери.",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "absolute",
          "label": "Абсолютное давление над жидкостью, кПа",
          "example": 101.325,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "vapour",
          "label": "Давление насыщенного пара, кПа",
          "example": 2.34,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "height",
          "label": "Отметка уровня относительно оси насоса, м",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "loss",
          "label": "Потери на всасывании, м",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Плотность, кг/м³",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Резервуар с пренебрежимо малой скоростью у свободной поверхности. NPSHr берётся из характеристики насоса.",
      "reference": {
        "expected": 11.093660934162022,
        "actual": 11.0936609342,
        "unit": "м",
        "tolerance": 1.1093660934162023e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g18-10",
      "group": "g18",
      "groupTitle": "Гидравлика, насосы и пневматика",
      "topic": "Давление от высоты столба жидкости",
      "status": "implemented",
      "calculatorId": "g18-10",
      "href": "calculator.html?atlasTool=g18-10#labAtlasTools",
      "formula": "Избыточное давление = ρgh.",
      "outputUnit": "кПа",
      "trigger": "live",
      "inputs": [
        {
          "key": "density",
          "label": "Плотность, кг/м³",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "height",
          "label": "Высота столба, м",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Гидростатический столб, без динамических потерь.",
      "reference": {
        "expected": 98.0665,
        "actual": 98.0665,
        "unit": "кПа",
        "tolerance": 9.80665e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g18-11",
      "group": "g18",
      "groupTitle": "Гидравлика, насосы и пневматика",
      "topic": "Расход через отверстие",
      "status": "implemented",
      "calculatorId": "g18-11",
      "href": "calculator.html?atlasTool=g18-11#labAtlasTools",
      "formula": "Q = Cd A sqrt(2Δp/ρ) × 3600.",
      "outputUnit": "м³/ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "cd",
          "label": "Коэффициент расхода Cd",
          "example": 0.6,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "diameter",
          "label": "Диаметр отверстия, м",
          "example": 0.01,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "pressure",
          "label": "Перепад давления, Па",
          "example": 100000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Плотность, кг/м³",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Несжимаемая жидкость; без кавитации, сжатия газа и поправки на отношение площадей.",
      "reference": {
        "expected": 2.399156786605518,
        "actual": 2.39915678661,
        "unit": "м³/ч",
        "tolerance": 2.399156786605518e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g18-12",
      "group": "g18",
      "groupTitle": "Гидравлика, насосы и пневматика",
      "topic": "Объём бака цилиндрического",
      "status": "implemented",
      "calculatorId": "g18-12",
      "href": "calculator.html?atlasTool=g18-12#labAtlasTools",
      "formula": "V = πD²h/4.",
      "outputUnit": "м³",
      "trigger": "live",
      "inputs": [
        {
          "key": "diameter",
          "label": "Внутренний диаметр бака, м",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "height",
          "label": "Высота заполнения, м",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Вертикальный цилиндр с плоским дном.",
      "reference": {
        "expected": 3.141592653589793,
        "actual": 3.14159265359,
        "unit": "м³",
        "tolerance": 3.141592653589793e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g18-13",
      "group": "g18",
      "groupTitle": "Гидравлика, насосы и пневматика",
      "topic": "Время заполнения бака",
      "status": "implemented",
      "calculatorId": "g18-13",
      "href": "calculator.html?atlasTool=g18-13#labAtlasTools",
      "formula": "Время = объём / расход.",
      "outputUnit": "ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "volume",
          "label": "Перемещаемый объём, м³",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "flow",
          "label": "Постоянный расход, м³/ч",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Расход считается постоянным; не опорожнение самотёком с падающим напором.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "ч",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g18-14",
      "group": "g18",
      "groupTitle": "Гидравлика, насосы и пневматика",
      "topic": "Время опорожнения при постоянном расходе",
      "status": "implemented",
      "calculatorId": "g18-14",
      "href": "calculator.html?atlasTool=g18-14#labAtlasTools",
      "formula": "Время = объём / расход.",
      "outputUnit": "ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "volume",
          "label": "Перемещаемый объём, м³",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "flow",
          "label": "Постоянный расход, м³/ч",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Расход считается постоянным; не опорожнение самотёком с падающим напором.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "ч",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g18-15",
      "group": "g18",
      "groupTitle": "Гидравлика, насосы и пневматика",
      "topic": "Усилие гидроцилиндра",
      "status": "implemented",
      "calculatorId": "g18-15",
      "href": "calculator.html?atlasTool=g18-15#labAtlasTools",
      "formula": "F = pπD²/4 × КПД.",
      "outputUnit": "Н",
      "trigger": "live",
      "inputs": [
        {
          "key": "pressure",
          "label": "Избыточное давление в поршневой полости, МПа",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "diameter",
          "label": "Диаметр поршня, мм",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "eff",
          "label": "Механический КПД, %",
          "example": 90,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Выдвижение, давление в штоковой полости принято нулевым избыточным. Для втягивания нужна кольцевая площадь.",
      "reference": {
        "expected": 70685.83470577035,
        "actual": 70685.8347058,
        "unit": "Н",
        "tolerance": 0.0007068583470577035,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g18-16",
      "group": "g18",
      "groupTitle": "Гидравлика, насосы и пневматика",
      "topic": "Усилие пневмоцилиндра",
      "status": "implemented",
      "calculatorId": "g18-16",
      "href": "calculator.html?atlasTool=g18-16#labAtlasTools",
      "formula": "F = p × 0.1 × πD²/4 × КПД.",
      "outputUnit": "Н",
      "trigger": "live",
      "inputs": [
        {
          "key": "pressure",
          "label": "Избыточное давление, бар",
          "example": 6,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "diameter",
          "label": "Диаметр поршня, мм",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "eff",
          "label": "Механический КПД, %",
          "example": 90,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Теоретическое усилие выдвижения за вычетом заданного КПД; без динамики сжатого воздуха.",
      "reference": {
        "expected": 4241.150082346221,
        "actual": 4241.15008235,
        "unit": "Н",
        "tolerance": 0.000042411500823462215,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g18-17",
      "group": "g18",
      "groupTitle": "Гидравлика, насосы и пневматика",
      "topic": "Скорость поршня по расходу",
      "status": "implemented",
      "calculatorId": "g18-17",
      "href": "calculator.html?atlasTool=g18-17#labAtlasTools",
      "formula": "v = Q × 10⁶/(60A).",
      "outputUnit": "мм/с",
      "trigger": "live",
      "inputs": [
        {
          "key": "flow",
          "label": "Расход жидкости, л/мин",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "area",
          "label": "Рабочая площадь поршня, мм²",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без утечек и сжимаемости.",
      "reference": {
        "expected": 166.66666666666666,
        "actual": 166.666666667,
        "unit": "мм/с",
        "tolerance": 0.0000016666666666666667,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g18-18",
      "group": "g18",
      "groupTitle": "Гидравлика, насосы и пневматика",
      "topic": "Объём рабочего хода цилиндра",
      "status": "implemented",
      "calculatorId": "g18-18",
      "href": "calculator.html?atlasTool=g18-18#labAtlasTools",
      "formula": "V = πD² × ход / 4 / 10⁶.",
      "outputUnit": "л",
      "trigger": "live",
      "inputs": [
        {
          "key": "diameter",
          "label": "Диаметр цилиндра, мм",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "stroke",
          "label": "Ход, мм",
          "example": 200,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Полная поршневая полость без мёртвого объёма.",
      "reference": {
        "expected": 1.5707963267948966,
        "actual": 1.57079632679,
        "unit": "л",
        "tolerance": 1.5707963267948965e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g18-19",
      "group": "g18",
      "groupTitle": "Гидравлика, насосы и пневматика",
      "topic": "Коэффициент утечки воздуха",
      "status": "implemented",
      "calculatorId": "g18-19",
      "href": "calculator.html?atlasTool=g18-19#labAtlasTools",
      "formula": "Утечка = расход утечки / подача × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "leak",
          "label": "Измеренная утечка, норм.м³/ч",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "supply",
          "label": "Поданный воздух, норм.м³/ч",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Оба расхода приведены к одним опорным условиям.",
      "reference": {
        "expected": 5,
        "actual": 5,
        "unit": "%",
        "tolerance": 5e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g18-20",
      "group": "g18",
      "groupTitle": "Гидравлика, насосы и пневматика",
      "topic": "Потребление сжатого воздуха",
      "status": "implemented",
      "calculatorId": "g18-20",
      "href": "calculator.html?atlasTool=g18-20#labAtlasTools",
      "formula": "Опорный объём = объём × pабс/pопорное × циклы.",
      "outputUnit": "опорных л/мин",
      "trigger": "live",
      "inputs": [
        {
          "key": "volume",
          "label": "Заполняемый рабочий объём за цикл, л",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "absolute",
          "label": "Абсолютное давление в объёме, бар",
          "example": 7,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "reference",
          "label": "Абсолютное опорное давление, бар",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "cycles",
          "label": "Циклов/мин",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Идеальный газ при одинаковой температуре; число заполняемых полостей включите в объём за цикл.",
      "reference": {
        "expected": 70,
        "actual": 70,
        "unit": "опорных л/мин",
        "tolerance": 7e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g18-21",
      "group": "g18",
      "groupTitle": "Гидравлика, насосы и пневматика",
      "topic": "Размер воздушного ресивера",
      "status": "implemented",
      "calculatorId": "g18-21",
      "href": "calculator.html?atlasTool=g18-21#labAtlasTools",
      "formula": "Объём ресивера = Q × t/60 × pопорное/(pвыс − pниз).",
      "outputUnit": "л",
      "trigger": "live",
      "inputs": [
        {
          "key": "flow",
          "label": "Необходимый расход при опорном давлении, л/мин",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "seconds",
          "label": "Время покрытия расхода, с",
          "example": 30,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "reference",
          "label": "Абсолютное опорное давление, бар",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "high",
          "label": "Начальное абсолютное давление, бар",
          "example": 9,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "low",
          "label": "Минимальное абсолютное давление, бар",
          "example": 7,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Изотермический идеальный газ, без подачи компрессора за интервал. Не расчёт прочности сосуда.",
      "reference": {
        "expected": 25,
        "actual": 25,
        "unit": "л",
        "tolerance": 2.5e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g18-22",
      "group": "g18",
      "groupTitle": "Гидравлика, насосы и пневматика",
      "topic": "Cv/Kv регулирующего клапана",
      "status": "implemented",
      "calculatorId": "g18-22",
      "href": "calculator.html?atlasTool=g18-22#labAtlasTools",
      "formula": "Kv = Q sqrt(SG/Δp); Cv ≈ 1.156 Kv.",
      "outputUnit": "Kv",
      "trigger": "live",
      "inputs": [
        {
          "key": "flow",
          "label": "Расход жидкости, м³/ч",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "drop",
          "label": "Перепад на клапане, бар",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "relative",
          "label": "Относительная плотность к воде",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Несжимаемая некавитирующая жидкость; не газ, пар или критический режим.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "Kv",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g19-1",
      "group": "g19",
      "groupTitle": "Теплотехника, HVAC, вентиляция",
      "topic": "Теплопотери через стену",
      "status": "implemented",
      "calculatorId": "g19-1",
      "href": "calculator.html?atlasTool=g19-1#labAtlasTools",
      "formula": "Q = U A ΔT.",
      "outputUnit": "Вт",
      "trigger": "live",
      "inputs": [
        {
          "key": "u",
          "label": "Коэффициент теплопередачи U, Вт/(м²·К)",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "area",
          "label": "Площадь, м²",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "dt",
          "label": "Разность температур, К",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Стационарная одномерная модель; U должен учитывать все слои и поверхностные сопротивления.",
      "reference": {
        "expected": 200,
        "actual": 200,
        "unit": "Вт",
        "tolerance": 0.000002,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g19-2",
      "group": "g19",
      "groupTitle": "Теплотехника, HVAC, вентиляция",
      "topic": "Теплосопротивление многослойной стены",
      "status": "implemented",
      "calculatorId": "g19-2",
      "href": "calculator.html?atlasTool=g19-2#labAtlasTools",
      "formula": "Rслоёв = Σ δi/λi.",
      "outputUnit": "м²·К/Вт",
      "trigger": "live",
      "inputs": [
        {
          "key": "thickness",
          "label": "Толщины слоёв, м; через ;",
          "example": "0.1;0.2",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "conductivity",
          "label": "Теплопроводности слоёв, Вт/(м·К); через ;",
          "example": "0.05;0.1",
          "positive": true,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без поверхностных сопротивлений, крепежа и мостиков холода.",
      "reference": {
        "expected": 4,
        "actual": 4,
        "unit": "м²·К/Вт",
        "tolerance": 4e-8,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g19-3",
      "group": "g19",
      "groupTitle": "Теплотехника, HVAC, вентиляция",
      "topic": "Теплопроводность слоя",
      "status": "implemented",
      "calculatorId": "g19-3",
      "href": "calculator.html?atlasTool=g19-3#labAtlasTools",
      "formula": "λ = δ/R.",
      "outputUnit": "Вт/(м·К)",
      "trigger": "live",
      "inputs": [
        {
          "key": "thickness",
          "label": "Толщина слоя, м",
          "example": 0.1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "resistance",
          "label": "Измеренное сопротивление слоя, м²·К/Вт",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "R только самого слоя, без поверхности и контактов.",
      "reference": {
        "expected": 0.05,
        "actual": 0.05,
        "unit": "Вт/(м·К)",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g19-4",
      "group": "g19",
      "groupTitle": "Теплотехника, HVAC, вентиляция",
      "topic": "Теплопередача через поверхность",
      "status": "implemented",
      "calculatorId": "g19-4",
      "href": "calculator.html?atlasTool=g19-4#labAtlasTools",
      "formula": "Q = U A ΔT.",
      "outputUnit": "Вт",
      "trigger": "live",
      "inputs": [
        {
          "key": "u",
          "label": "Коэффициент теплопередачи U, Вт/(м²·К)",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "area",
          "label": "Площадь, м²",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "dt",
          "label": "Разность температур, К",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Стационарная одномерная модель; U должен учитывать все слои и поверхностные сопротивления.",
      "reference": {
        "expected": 200,
        "actual": 200,
        "unit": "Вт",
        "tolerance": 0.000002,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g19-5",
      "group": "g19",
      "groupTitle": "Теплотехника, HVAC, вентиляция",
      "topic": "Нагрузка на отопление помещения",
      "status": "implemented",
      "calculatorId": "g19-5",
      "href": "calculator.html?atlasTool=g19-5#labAtlasTools",
      "formula": "Нагрузка = сумма потерь ограждений + потери вентиляции.",
      "outputUnit": "Вт",
      "trigger": "live",
      "inputs": [
        {
          "key": "losses",
          "label": "Расчётные потери ограждений, Вт; через ;",
          "example": "1000;500;500",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "ventilation",
          "label": "Расчётные потери вентиляции, Вт",
          "example": 500,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Нет универсальной нормы Вт/м²; все потери должны быть рассчитаны для заданной наружной температуры.",
      "reference": {
        "expected": 2500,
        "actual": 2500,
        "unit": "Вт",
        "tolerance": 0.000025,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g19-6",
      "group": "g19",
      "groupTitle": "Теплотехника, HVAC, вентиляция",
      "topic": "Охлаждающая мощность вентиляции",
      "status": "implemented",
      "calculatorId": "g19-6",
      "href": "calculator.html?atlasTool=g19-6#labAtlasTools",
      "formula": "Q = расход/3600 × ρ × cp × ΔT.",
      "outputUnit": "кВт",
      "trigger": "live",
      "inputs": [
        {
          "key": "flow",
          "label": "Подача воздуха, м³/ч",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Плотность воздуха, кг/м³",
          "example": 1.2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "cp",
          "label": "Теплоёмкость, кДж/(кг·К)",
          "example": 1.005,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "dt",
          "label": "Температурная разность, К",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Только явная теплота; конденсация и скрытая нагрузка не учтены.",
      "reference": {
        "expected": 3.35,
        "actual": 3.35,
        "unit": "кВт",
        "tolerance": 3.35e-8,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g19-7",
      "group": "g19",
      "groupTitle": "Теплотехника, HVAC, вентиляция",
      "topic": "Расход воздуха CFM↔м³/ч",
      "status": "implemented",
      "calculatorId": "g19-7",
      "href": "calculator.html?atlasTool=g19-7#labAtlasTools",
      "formula": "м³/ч = CFM × 0.028316846592 × 60.",
      "outputUnit": "м³/ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "cfm",
          "label": "Расход, ft³/min",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Точный перевод геометрического объёма, не приведение к нормальным условиям.",
      "reference": {
        "expected": 169.901079552,
        "actual": 169.901079552,
        "unit": "м³/ч",
        "tolerance": 0.00000169901079552,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g19-8",
      "group": "g19",
      "groupTitle": "Теплотехника, HVAC, вентиляция",
      "topic": "Диаметр воздуховода по скорости",
      "status": "implemented",
      "calculatorId": "g19-8",
      "href": "calculator.html?atlasTool=g19-8#labAtlasTools",
      "formula": "D = sqrt(4Q/(3600πv)).",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "flow",
          "label": "Расход, м³/ч",
          "example": 360,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "velocity",
          "label": "Заданная скорость, м/с",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Круглое живое сечение; не аэродинамический подбор всей сети.",
      "reference": {
        "expected": 0.11283791670955126,
        "actual": 0.11283791671,
        "unit": "м",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g19-9",
      "group": "g19",
      "groupTitle": "Теплотехника, HVAC, вентиляция",
      "topic": "Потери давления вентиляционного канала",
      "status": "implemented",
      "calculatorId": "g19-9",
      "href": "calculator.html?atlasTool=g19-9#labAtlasTools",
      "formula": "Δp = f L/D × ρv²/2.",
      "outputUnit": "Па",
      "trigger": "live",
      "inputs": [
        {
          "key": "factor",
          "label": "Коэффициент Дарси",
          "example": 0.02,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Длина, м",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "diameter",
          "label": "Гидравлический диаметр, м",
          "example": 0.2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Плотность воздуха, кг/м³",
          "example": 1.2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "velocity",
          "label": "Скорость, м/с",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Прямой участок, малая сжимаемость; местные сопротивления отдельно.",
      "reference": {
        "expected": 15,
        "actual": 15,
        "unit": "Па",
        "tolerance": 1.5e-7,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g19-10",
      "group": "g19",
      "groupTitle": "Теплотехника, HVAC, вентиляция",
      "topic": "Мощность вентилятора",
      "status": "implemented",
      "calculatorId": "g19-10",
      "href": "calculator.html?atlasTool=g19-10#labAtlasTools",
      "formula": "P = Q/3600 × Δp/η.",
      "outputUnit": "Вт",
      "trigger": "live",
      "inputs": [
        {
          "key": "flow",
          "label": "Расход, м³/ч",
          "example": 3600,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "pressure",
          "label": "Полное повышение давления, Па",
          "example": 500,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "eff",
          "label": "Полный КПД, доля",
          "example": 0.5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Согласуйте полное/статическое давление и тип КПД.",
      "reference": {
        "expected": 1000,
        "actual": 1000,
        "unit": "Вт",
        "tolerance": 0.00001,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g19-11",
      "group": "g19",
      "groupTitle": "Теплотехника, HVAC, вентиляция",
      "topic": "Относительная влажность",
      "status": "implemented",
      "calculatorId": "g19-11",
      "href": "calculator.html?atlasTool=g19-11#labAtlasTools",
      "formula": "RH = pпара / psat(T) × 100; psat по Magnus.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "pressure",
          "label": "Парциальное давление пара, кПа",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "temp",
          "label": "Температура, °C",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Magnus над жидкой водой, −45…60 °C; не модель насыщения над льдом.",
      "reference": {
        "expected": 42.87068958904661,
        "actual": 42.870689589,
        "unit": "%",
        "tolerance": 4.2870689589046614e-7,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g19-12",
      "group": "g19",
      "groupTitle": "Теплотехника, HVAC, вентиляция",
      "topic": "Точка росы по Magnus",
      "status": "implemented",
      "calculatorId": "g19-12",
      "href": "calculator.html?atlasTool=g19-12#labAtlasTools",
      "formula": "γ = ln(RH/100) + 17.62T/(243.12+T); Td = 243.12γ/(17.62−γ).",
      "outputUnit": "°C",
      "trigger": "live",
      "inputs": [
        {
          "key": "temp",
          "label": "Температура, °C",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rh",
          "label": "Относительная влажность, %",
          "example": 50,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Magnus над жидкой водой; вход −45…60 °C, RH 1…100%. Результат также ограничен −45…60 °C. Это точка росы, не инея.",
      "reference": {
        "expected": 9.255174598981256,
        "actual": 9.25517459898,
        "unit": "°C",
        "tolerance": 9.255174598981256e-8,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g19-13",
      "group": "g19",
      "groupTitle": "Теплотехника, HVAC, вентиляция",
      "topic": "Абсолютная влажность",
      "status": "implemented",
      "calculatorId": "g19-13",
      "href": "calculator.html?atlasTool=g19-13#labAtlasTools",
      "formula": "ρпара = 216.7 × psat_hPa(T) × RH/100 / (T+273.15).",
      "outputUnit": "г/м³",
      "trigger": "live",
      "inputs": [
        {
          "key": "temp",
          "label": "Температура, °C",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rh",
          "label": "Относительная влажность, %",
          "example": 50,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Идеальный пар и Magnus над водой; T −45…60 °C.",
      "reference": {
        "expected": 8.621414940961877,
        "actual": 8.62141494096,
        "unit": "г/м³",
        "tolerance": 8.621414940961877e-8,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g19-14",
      "group": "g19",
      "groupTitle": "Теплотехника, HVAC, вентиляция",
      "topic": "Влагосодержание воздуха",
      "status": "implemented",
      "calculatorId": "g19-14",
      "href": "calculator.html?atlasTool=g19-14#labAtlasTools",
      "formula": "w = 0.62198 pпара/(pобщ − pпара).",
      "outputUnit": "кг пара/кг сух.воздуха",
      "trigger": "live",
      "inputs": [
        {
          "key": "temp",
          "label": "Температура, °C",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rh",
          "label": "Относительная влажность, %",
          "example": 50,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        },
        {
          "key": "pressure",
          "label": "Абсолютное давление воздуха, кПа",
          "example": 101.325,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Идеальная смесь; T −45…60 °C. Парциальное давление должно быть ниже полного.",
      "reference": {
        "expected": 0.007242646145636156,
        "actual": 0.00724264614564,
        "unit": "кг пара/кг сух.воздуха",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g19-15",
      "group": "g19",
      "groupTitle": "Теплотехника, HVAC, вентиляция",
      "topic": "Вентиляция по кратности обмена",
      "status": "implemented",
      "calculatorId": "g19-15",
      "href": "calculator.html?atlasTool=g19-15#labAtlasTools",
      "formula": "Расход = объём × кратность.",
      "outputUnit": "м³/ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "volume",
          "label": "Объём помещения, м³",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "exchanges",
          "label": "Заданная кратность, 1/ч",
          "example": 3,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Кратность выбирается по применимой норме/задаче, а не определяется этим расчётом.",
      "reference": {
        "expected": 300,
        "actual": 300,
        "unit": "м³/ч",
        "tolerance": 0.000003,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g19-16",
      "group": "g19",
      "groupTitle": "Теплотехника, HVAC, вентиляция",
      "topic": "Температура смешения потоков",
      "status": "implemented",
      "calculatorId": "g19-16",
      "href": "calculator.html?atlasTool=g19-16#labAtlasTools",
      "formula": "Tсм = (m1 T1 + m2 T2)/(m1+m2).",
      "outputUnit": "°C",
      "trigger": "live",
      "inputs": [
        {
          "key": "flow1",
          "label": "Массовый расход первого потока, кг/с",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "temp1",
          "label": "Температура первого, °C",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "flow2",
          "label": "Массовый расход второго, кг/с",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "temp2",
          "label": "Температура второго, °C",
          "example": 40,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Одинаковая постоянная теплоёмкость потоков, адиабатическое смешение без фазового перехода.",
      "reference": {
        "expected": 30,
        "actual": 30,
        "unit": "°C",
        "tolerance": 3e-7,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g19-17",
      "group": "g19",
      "groupTitle": "Теплотехника, HVAC, вентиляция",
      "topic": "Логарифмическая средняя ΔT",
      "status": "implemented",
      "calculatorId": "g19-17",
      "href": "calculator.html?atlasTool=g19-17#labAtlasTools",
      "formula": "LMTD = (ΔT1−ΔT2)/ln(ΔT1/ΔT2).",
      "outputUnit": "К",
      "trigger": "live",
      "inputs": [
        {
          "key": "dt1",
          "label": "Положительная разность температур на конце 1, К",
          "example": 20,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "dt2",
          "label": "Положительная разность на конце 2, К",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не допускает пересечения температур. Для сложной схемы теплообменника нужен поправочный коэффициент.",
      "reference": {
        "expected": 14.426950408889635,
        "actual": 14.4269504089,
        "unit": "К",
        "tolerance": 1.4426950408889635e-7,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g19-18",
      "group": "g19",
      "groupTitle": "Теплотехника, HVAC, вентиляция",
      "topic": "Мощность теплообменника",
      "status": "implemented",
      "calculatorId": "g19-18",
      "href": "calculator.html?atlasTool=g19-18#labAtlasTools",
      "formula": "Q = U A F LMTD / 1000.",
      "outputUnit": "кВт",
      "trigger": "live",
      "inputs": [
        {
          "key": "u",
          "label": "Коэффициент U, Вт/(м²·К)",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "area",
          "label": "Площадь, м²",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "lmtd",
          "label": "LMTD, К",
          "example": 20,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "correction",
          "label": "Поправка схемы F",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Стационарный теплообмен, U и F должны быть обоснованы конструкцией.",
      "reference": {
        "expected": 20,
        "actual": 20,
        "unit": "кВт",
        "tolerance": 2e-7,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g19-19",
      "group": "g19",
      "groupTitle": "Теплотехника, HVAC, вентиляция",
      "topic": "Расход воды для отопления",
      "status": "implemented",
      "calculatorId": "g19-19",
      "href": "calculator.html?atlasTool=g19-19#labAtlasTools",
      "formula": "Массовый расход = Q/(cp ΔT).",
      "outputUnit": "кг/с",
      "trigger": "live",
      "inputs": [
        {
          "key": "power",
          "label": "Тепловая мощность, кВт",
          "example": 41.8,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "cp",
          "label": "Теплоёмкость воды, кДж/(кг·К)",
          "example": 4.18,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "dt",
          "label": "Перепад воды, К",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без фазового перехода; свойства воды задаются на рабочей температуре.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "кг/с",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g19-20",
      "group": "g19",
      "groupTitle": "Теплотехника, HVAC, вентиляция",
      "topic": "Мощность охлаждения жидкости",
      "status": "implemented",
      "calculatorId": "g19-20",
      "href": "calculator.html?atlasTool=g19-20#labAtlasTools",
      "formula": "Мощность охлаждения = массовый расход × cp × ΔT.",
      "outputUnit": "кВт",
      "trigger": "live",
      "inputs": [
        {
          "key": "flow",
          "label": "Массовый расход жидкости, кг/с",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "cp",
          "label": "Теплоёмкость, кДж/(кг·К)",
          "example": 4.18,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "dt",
          "label": "Снижение температуры, К",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Постоянная теплоёмкость, без фазового перехода.",
      "reference": {
        "expected": 41.8,
        "actual": 41.8,
        "unit": "кВт",
        "tolerance": 4.1799999999999996e-7,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g19-21",
      "group": "g19",
      "groupTitle": "Теплотехника, HVAC, вентиляция",
      "topic": "Коэффициент COP/ EER",
      "status": "implemented",
      "calculatorId": "g19-21",
      "href": "calculator.html?atlasTool=g19-21#labAtlasTools",
      "formula": "COP = Qполезная/Pэлектрическая; EER(BTU/ч/Вт) = COP × 3.412141633.",
      "outputUnit": "COP",
      "trigger": "live",
      "inputs": [
        {
          "key": "thermal",
          "label": "Полезная тепловая мощность, кВт",
          "example": 3,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "electric",
          "label": "Входная электрическая мощность, кВт",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Для EER вводите именно холодильную полезную мощность. Условия измерения должны совпадать.",
      "reference": {
        "expected": 3,
        "actual": 3,
        "unit": "COP",
        "tolerance": 3.0000000000000004e-8,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g19-22",
      "group": "g19",
      "groupTitle": "Теплотехника, HVAC, вентиляция",
      "topic": "Тепловое расширение труб",
      "status": "implemented",
      "calculatorId": "g19-22",
      "href": "calculator.html?atlasTool=g19-22#labAtlasTools",
      "formula": "ΔL = L α ΔT × 1000.",
      "outputUnit": "мм",
      "trigger": "live",
      "inputs": [
        {
          "key": "length",
          "label": "Длина трубы, м",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "alpha",
          "label": "α, 1/К",
          "example": 0.000012,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "dt",
          "label": "Изменение температуры, К",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Свободное линейное расширение; не расчёт компенсатора или сил закрепления.",
      "reference": {
        "expected": 12,
        "actual": 12,
        "unit": "мм",
        "tolerance": 1.2000000000000002e-7,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g20-1",
      "group": "g20",
      "groupTitle": "Химические процессы и аппараты",
      "topic": "Плотность газа по уравнению состояния",
      "status": "implemented",
      "calculatorId": "g20-1",
      "href": "calculator.html?atlasTool=g20-1#labAtlasTools",
      "formula": "ρ = pM/(ZRT), R=8.31446261815324 Дж/(моль·К).",
      "outputUnit": "кг/м³",
      "trigger": "live",
      "inputs": [
        {
          "key": "pressure",
          "label": "Абсолютное давление, бар",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "molar",
          "label": "Молярная масса, кг/кмоль",
          "example": 28,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "temp",
          "label": "Абсолютная температура, К",
          "example": 300,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "z",
          "label": "Коэффициент сжимаемости Z",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Уравнение состояния с заданным Z; не определяет фазовое состояние.",
      "reference": {
        "expected": 1.1225419803987764,
        "actual": 1.1225419804,
        "unit": "кг/м³",
        "tolerance": 1.1225419803987764e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g20-2",
      "group": "g20",
      "groupTitle": "Химические процессы и аппараты",
      "topic": "Массовый расход по объёмному",
      "status": "implemented",
      "calculatorId": "g20-2",
      "href": "calculator.html?atlasTool=g20-2#labAtlasTools",
      "formula": "Массовый расход = объёмный × плотность.",
      "outputUnit": "кг/ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "flow",
          "label": "Объёмный расход, м³/ч",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Плотность в рабочих условиях, кг/м³",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Объём и плотность при одинаковых давлении и температуре.",
      "reference": {
        "expected": 10000,
        "actual": 10000,
        "unit": "кг/ч",
        "tolerance": 0.0001,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g20-3",
      "group": "g20",
      "groupTitle": "Химические процессы и аппараты",
      "topic": "Молярный расход чистого компонента",
      "status": "implemented",
      "calculatorId": "g20-3",
      "href": "calculator.html?atlasTool=g20-3#labAtlasTools",
      "formula": "Молярный расход = массовый/молярная масса.",
      "outputUnit": "кмоль/ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Массовый расход чистого растворённого вещества, кг/ч",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "molar",
          "label": "Молярная масса вещества, кг/кмоль",
          "example": 50,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Для вещества, не всего раствора; массовую долю учтите до ввода.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "кмоль/ч",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g20-4",
      "group": "g20",
      "groupTitle": "Химические процессы и аппараты",
      "topic": "Разведение C1V1=C2V2",
      "status": "implemented",
      "calculatorId": "g20-4",
      "href": "calculator.html?atlasTool=g20-4#labAtlasTools",
      "formula": "V1 = C2 V2/C1.",
      "outputUnit": "л",
      "trigger": "live",
      "inputs": [
        {
          "key": "c1",
          "label": "Исходная концентрация на объёмной базе",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "c2",
          "label": "Целевая концентрация на той же базе",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "v2",
          "label": "Конечный объём, л",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Сохраняется количество растворённого вещества; довести до конечного объёма. Не предполагает сложение объёмов.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "л",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g20-5",
      "group": "g20",
      "groupTitle": "Химические процессы и аппараты",
      "topic": "Пересчёт ppm/ppb",
      "status": "implemented",
      "calculatorId": "g20-5",
      "href": "calculator.html?atlasTool=g20-5#labAtlasTools",
      "formula": "ppb = ppm × 1000.",
      "outputUnit": "ppb",
      "trigger": "live",
      "inputs": [
        {
          "key": "ppm",
          "label": "Массовая концентрация, ppm",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Одинаковая массовая база: 1 ppm=1 мг/кг, 1 ppb=1 мкг/кг. Не мг/л без плотности.",
      "reference": {
        "expected": 1000,
        "actual": 1000,
        "unit": "ppb",
        "tolerance": 0.00001,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g20-6",
      "group": "g20",
      "groupTitle": "Химические процессы и аппараты",
      "topic": "Смесь двух растворов заданной концентрации",
      "status": "implemented",
      "calculatorId": "g20-6",
      "href": "calculator.html?atlasTool=g20-6#labAtlasTools",
      "formula": "Cсм = (m1 C1 + m2 C2)/(m1+m2).",
      "outputUnit": "массовые %",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass1",
          "label": "Масса первого раствора, кг",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "c1",
          "label": "Концентрация первого, массовые %",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        },
        {
          "key": "mass2",
          "label": "Масса второго, кг",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "c2",
          "label": "Концентрация второго, массовые %",
          "example": 30,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Один компонент, без реакций, испарения и осаждения.",
      "reference": {
        "expected": 20,
        "actual": 20,
        "unit": "массовые %",
        "tolerance": 2e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g20-7",
      "group": "g20",
      "groupTitle": "Химические процессы и аппараты",
      "topic": "Мольная доля в смеси",
      "status": "implemented",
      "calculatorId": "g20-7",
      "href": "calculator.html?atlasTool=g20-7#labAtlasTools",
      "formula": "x = nкомпонента/nвсего.",
      "outputUnit": "мольная доля",
      "trigger": "live",
      "inputs": [
        {
          "key": "component",
          "label": "Количество выбранного компонента, моль",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "total",
          "label": "Общее количество всех компонентов, моль",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Безразмерная доля, не массовая.",
      "reference": {
        "expected": 0.2,
        "actual": 0.2,
        "unit": "мольная доля",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g20-8",
      "group": "g20",
      "groupTitle": "Химические процессы и аппараты",
      "topic": "Парциальное давление",
      "status": "implemented",
      "calculatorId": "g20-8",
      "href": "calculator.html?atlasTool=g20-8#labAtlasTools",
      "formula": "p_i = x_i pобщ.",
      "outputUnit": "кПа",
      "trigger": "live",
      "inputs": [
        {
          "key": "fraction",
          "label": "Мольная доля газа",
          "example": 0.2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1,
          "choices": null
        },
        {
          "key": "pressure",
          "label": "Полное абсолютное давление, кПа",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Закон Дальтона для идеальной газовой смеси.",
      "reference": {
        "expected": 20,
        "actual": 20,
        "unit": "кПа",
        "tolerance": 2e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g20-9",
      "group": "g20",
      "groupTitle": "Химические процессы и аппараты",
      "topic": "Температура смешения",
      "status": "implemented",
      "calculatorId": "g20-9",
      "href": "calculator.html?atlasTool=g20-9#labAtlasTools",
      "formula": "T = (m1 cp1 T1 + m2 cp2 T2)/(m1 cp1 + m2 cp2).",
      "outputUnit": "°C",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass1",
          "label": "Масса первого, кг",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "cp1",
          "label": "Теплоёмкость первого, кДж/(кг·К)",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "t1",
          "label": "Температура первого, °C",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "mass2",
          "label": "Масса второго, кг",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "cp2",
          "label": "Теплоёмкость второго, кДж/(кг·К)",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "t2",
          "label": "Температура второго, °C",
          "example": 40,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Адиабатическое смешение, постоянные cp, без реакции и фазового перехода.",
      "reference": {
        "expected": 30,
        "actual": 30,
        "unit": "°C",
        "tolerance": 3e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g20-10",
      "group": "g20",
      "groupTitle": "Химические процессы и аппараты",
      "topic": "Теплоёмкость смеси",
      "status": "implemented",
      "calculatorId": "g20-10",
      "href": "calculator.html?atlasTool=g20-10#labAtlasTools",
      "formula": "cp смеси = Σ wi cpi.",
      "outputUnit": "кДж/(кг·К)",
      "trigger": "live",
      "inputs": [
        {
          "key": "fractions",
          "label": "Массовые доли компонентов через ;",
          "example": "0.5;0.5",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "cp",
          "label": "Теплоёмкости, кДж/(кг·К); через ;",
          "example": "2;4",
          "positive": true,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Линейное идеальное смешение при заданной температуре.",
      "reference": {
        "expected": 3,
        "actual": 3,
        "unit": "кДж/(кг·К)",
        "tolerance": 3.0000000000000004e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g20-11",
      "group": "g20",
      "groupTitle": "Химические процессы и аппараты",
      "topic": "Средняя ΔT теплообменника LMTD",
      "status": "implemented",
      "calculatorId": "g20-11",
      "href": "calculator.html?atlasTool=g20-11#labAtlasTools",
      "formula": "LMTD = (ΔT1−ΔT2)/ln(ΔT1/ΔT2).",
      "outputUnit": "К",
      "trigger": "live",
      "inputs": [
        {
          "key": "dt1",
          "label": "Положительная разность температур на конце 1, К",
          "example": 20,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "dt2",
          "label": "Положительная разность на конце 2, К",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не допускает пересечения температур. Для сложной схемы теплообменника нужен поправочный коэффициент.",
      "reference": {
        "expected": 14.426950408889635,
        "actual": 14.4269504089,
        "unit": "К",
        "tolerance": 1.4426950408889635e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g20-12",
      "group": "g20",
      "groupTitle": "Химические процессы и аппараты",
      "topic": "Мощность мешалки",
      "status": "implemented",
      "calculatorId": "g20-12",
      "href": "calculator.html?atlasTool=g20-12#labAtlasTools",
      "formula": "P = Po ρ n³ D⁵, n в оборотах/с.",
      "outputUnit": "кВт",
      "trigger": "live",
      "inputs": [
        {
          "key": "po",
          "label": "Число мощности Po для вашего режима",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Плотность, кг/м³",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rpm",
          "label": "Частота вращения, об/мин",
          "example": 600,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "diameter",
          "label": "Диаметр мешалки, м",
          "example": 0.1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Po задаётся для конкретной геометрии и Re. Не выбирает двигатель или механическую прочность.",
      "reference": {
        "expected": 0.05,
        "actual": 0.05,
        "unit": "кВт",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g20-13",
      "group": "g20",
      "groupTitle": "Химические процессы и аппараты",
      "topic": "Время пребывания в реакторе",
      "status": "implemented",
      "calculatorId": "g20-13",
      "href": "calculator.html?atlasTool=g20-13#labAtlasTools",
      "formula": "Среднее время пребывания = объём/расход.",
      "outputUnit": "ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "volume",
          "label": "Рабочий объём, м³",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "flow",
          "label": "Объёмный расход, м³/ч",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Номинальное среднее, без распределения времени пребывания и кинетики.",
      "reference": {
        "expected": 5,
        "actual": 5,
        "unit": "ч",
        "tolerance": 5e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g20-14",
      "group": "g20",
      "groupTitle": "Химические процессы и аппараты",
      "topic": "Предварительная оценка объёма реактора",
      "status": "implemented",
      "calculatorId": "g20-14",
      "href": "calculator.html?atlasTool=g20-14#labAtlasTools",
      "formula": "Рабочий объём = расход × время пребывания.",
      "outputUnit": "м³",
      "trigger": "live",
      "inputs": [
        {
          "key": "flow",
          "label": "Расход, м³/ч",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "residence",
          "label": "Заданное время пребывания, ч",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Время вводится по подтверждённой кинетике; это не проектирование реактора и не оценка runaway.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "м³",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g20-15",
      "group": "g20",
      "groupTitle": "Химические процессы и аппараты",
      "topic": "Кратность концентрирования градирни",
      "status": "implemented",
      "calculatorId": "g20-15",
      "href": "calculator.html?atlasTool=g20-15#labAtlasTools",
      "formula": "Кратность концентрирования = концентрация оборотной / концентрация подпитки.",
      "outputUnit": "циклов",
      "trigger": "live",
      "inputs": [
        {
          "key": "circulating",
          "label": "Концентрация консервативных солей в оборотной воде, мг/л",
          "example": 300,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "makeup",
          "label": "Концентрация в подпитке, мг/л",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Модель циклов концентрирования в градирне, а не кратность полного испарения. Компонент должен быть консервативным.",
      "reference": {
        "expected": 3,
        "actual": 3,
        "unit": "циклов",
        "tolerance": 3.0000000000000004e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g20-16",
      "group": "g20",
      "groupTitle": "Химические процессы и аппараты",
      "topic": "Испарение и подпитка градирни",
      "status": "implemented",
      "calculatorId": "g20-16",
      "href": "calculator.html?atlasTool=g20-16#labAtlasTools",
      "formula": "Продувка = испарение/(циклы−1) − унос; подпитка = испарение + унос + продувка.",
      "outputUnit": "м³/ч подпитки",
      "trigger": "live",
      "inputs": [
        {
          "key": "evaporation",
          "label": "Испарение, м³/ч",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "cycles",
          "label": "Кратность концентрирования",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "drift",
          "label": "Капельный унос, м³/ч",
          "example": 0.5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Стационарный солевой баланс, испарение без солей, унос с концентрацией оборотной воды.",
      "reference": {
        "expected": 12.5,
        "actual": 12.5,
        "unit": "м³/ч подпитки",
        "tolerance": 1.25e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g20-17",
      "group": "g20",
      "groupTitle": "Химические процессы и аппараты",
      "topic": "Температура насыщенного пара по таблицам",
      "status": "implemented",
      "calculatorId": "g20-17",
      "href": "calculator.html?atlasTool=g20-17#labAtlasTools",
      "formula": "Температура насыщения — линейная интерполяция предоставленной таблицы по абсолютному давлению.",
      "outputUnit": "°C",
      "trigger": "live",
      "inputs": [
        {
          "key": "pressure",
          "label": "Абсолютные давления из таблицы насыщения, кПа; через ;",
          "example": "70.182;101.418",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "temperature",
          "label": "Соответствующие температуры, °C; через ;",
          "example": "90;100",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "query",
          "label": "Абсолютное давление запроса, кПа",
          "example": 85.8,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Примерные опорные значения воды 90°C/70.182кПа и 100°C/101.418кПа. Для рабочего расчёта используйте плотную проверенную таблицу IAPWS в нужном диапазоне; грубая двухточечная интерполяция не заменяет уравнение состояния.",
      "reference": {
        "expected": 95,
        "actual": 95,
        "unit": "°C",
        "tolerance": 9.5e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g20-18",
      "group": "g20",
      "groupTitle": "Химические процессы и аппараты",
      "topic": "NPSH и запас насоса",
      "status": "implemented",
      "calculatorId": "g20-18",
      "href": "calculator.html?atlasTool=g20-18#labAtlasTools",
      "formula": "Разность = NPSHa − NPSHr.",
      "outputUnit": "м запаса",
      "trigger": "live",
      "inputs": [
        {
          "key": "available",
          "label": "Рассчитанный NPSHa, м",
          "example": 6,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "required",
          "label": "Паспортный NPSHr при данном расходе, м",
          "example": 4,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не равнозначно достаточному нормативному запасу; требования производителя и условия среды проверяются отдельно.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "м запаса",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g20-19",
      "group": "g20",
      "groupTitle": "Химические процессы и аппараты",
      "topic": "Расход теплоносителя",
      "status": "implemented",
      "calculatorId": "g20-19",
      "href": "calculator.html?atlasTool=g20-19#labAtlasTools",
      "formula": "Массовый расход = нагрузка/(cp ΔT).",
      "outputUnit": "кг/с",
      "trigger": "live",
      "inputs": [
        {
          "key": "power",
          "label": "Тепловая нагрузка, кВт",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "cp",
          "label": "Теплоёмкость теплоносителя, кДж/(кг·К)",
          "example": 4,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "dt",
          "label": "Изменение температуры, К",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Однофазный теплоноситель, без изменения cp.",
      "reference": {
        "expected": 2.5,
        "actual": 2.5,
        "unit": "кг/с",
        "tolerance": 2.5e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g20-20",
      "group": "g20",
      "groupTitle": "Химические процессы и аппараты",
      "topic": "Ориентир объёма сепаратора",
      "status": "implemented",
      "calculatorId": "g20-20",
      "href": "calculator.html?atlasTool=g20-20#labAtlasTools",
      "formula": "Aгаз=Q/(K sqrt((ρж−ρг)/ρг)); полезный объём = Aгаз × заданная высота газовой зоны + заданный объём удержания жидкости.",
      "outputUnit": "м³ полезного объёма",
      "trigger": "live",
      "inputs": [
        {
          "key": "gas",
          "label": "Объёмный расход газа в рабочих условиях, м³/с",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "k",
          "label": "Заданный коэффициент Souders–Brown, м/с",
          "example": 0.1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "liquid",
          "label": "Плотность жидкости, кг/м³",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "gasrho",
          "label": "Плотность газа, кг/м³",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "gasHeight",
          "label": "Заданная высота газовой зоны, м",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "liquidVolume",
          "label": "Заданный объём удержания жидкости, м³",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Предварительная модель объёма газовой зоны и заданного жидкостного удержания. Не включает днища, внутренние устройства, прочность, унос и технологическую безопасность; K и высота требуют обоснования.",
      "reference": {
        "expected": 3.005037815259212,
        "actual": 3.00503781526,
        "unit": "м³ полезного объёма",
        "tolerance": 3.005037815259212e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g20-21",
      "group": "g20",
      "groupTitle": "Химические процессы и аппараты",
      "topic": "Тепловые потери трубопровода",
      "status": "implemented",
      "calculatorId": "g20-21",
      "href": "calculator.html?atlasTool=g20-21#labAtlasTools",
      "formula": "Q = 2π k L ΔT / ln(r2/r1).",
      "outputUnit": "Вт",
      "trigger": "live",
      "inputs": [
        {
          "key": "length",
          "label": "Длина трубы, м",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "inner",
          "label": "Внутренний радиус изоляционного слоя, м",
          "example": 0.05,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "outer",
          "label": "Наружный радиус слоя, м",
          "example": 0.1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "k",
          "label": "Теплопроводность изоляции, Вт/(м·К)",
          "example": 0.05,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "dt",
          "label": "Перепад между поверхностями слоя, К",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Стационарная теплопроводность цилиндрического слоя; не включает конвекцию и излучение снаружи.",
      "reference": {
        "expected": 453.2360141827194,
        "actual": 453.236014183,
        "unit": "Вт",
        "tolerance": 0.000004532360141827194,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g20-22",
      "group": "g20",
      "groupTitle": "Химические процессы и аппараты",
      "topic": "Коэффициент рециркуляции",
      "status": "implemented",
      "calculatorId": "g20-22",
      "href": "calculator.html?atlasTool=g20-22#labAtlasTools",
      "formula": "Коэффициент рециркуляции = возврат/свежая подача.",
      "outputUnit": "раз",
      "trigger": "live",
      "inputs": [
        {
          "key": "recycle",
          "label": "Возвращаемый поток, кг/ч",
          "example": 50,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "fresh",
          "label": "Свежая подача, кг/ч",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Массовая база обоих потоков одинакова; не доля возврата в суммарном потоке.",
      "reference": {
        "expected": 0.5,
        "actual": 0.5,
        "unit": "раз",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g21-1",
      "group": "g21",
      "groupTitle": "Строительство, строительные материалы",
      "topic": "Кубатура бетона",
      "status": "implemented",
      "calculatorId": "g21-1",
      "href": "calculator.html?atlasTool=g21-1#labAtlasTools",
      "formula": "Объём = длина × ширина × высота.",
      "outputUnit": "м³",
      "trigger": "live",
      "inputs": [
        {
          "key": "length",
          "label": "Длина, м",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "width",
          "label": "Ширина, м",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "height",
          "label": "Толщина/высота, м",
          "example": 0.2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Прямоугольный объём без пустот, вычетов и запаса.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "м³",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g21-2",
      "group": "g21",
      "groupTitle": "Строительство, строительные материалы",
      "topic": "Количество мешков цемента",
      "status": "implemented",
      "calculatorId": "g21-2",
      "href": "calculator.html?atlasTool=g21-2#labAtlasTools",
      "formula": "Мешки = ceil(объём × заданная доза цемента / масса мешка).",
      "outputUnit": "мешков",
      "trigger": "live",
      "inputs": [
        {
          "key": "volume",
          "label": "Объём бетонной смеси, м³",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "cement",
          "label": "Заданный расход цемента, кг/м³",
          "example": 300,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "bag",
          "label": "Масса мешка, кг",
          "example": 50,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Рецептура бетона задаётся проектом/лабораторией. Не определяет марку или прочность смеси.",
      "reference": {
        "expected": 60,
        "actual": 60,
        "unit": "мешков",
        "tolerance": 6e-7,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g21-3",
      "group": "g21",
      "groupTitle": "Строительство, строительные материалы",
      "topic": "Масса арматуры по длине",
      "status": "implemented",
      "calculatorId": "g21-3",
      "href": "calculator.html?atlasTool=g21-3#labAtlasTools",
      "formula": "Масса = πD²/4 × длина × плотность / 10⁶.",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "diameter",
          "label": "Номинальный диаметр, мм",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Суммарная длина, м",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Плотность стали, кг/м³",
          "example": 7850,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Теоретический круглый стержень; массу и допуски конкретного сортамента проверяйте отдельно.",
      "reference": {
        "expected": 61.65375582669969,
        "actual": 61.6537558267,
        "unit": "кг",
        "tolerance": 6.165375582669969e-7,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g21-4",
      "group": "g21",
      "groupTitle": "Строительство, строительные материалы",
      "topic": "Количество арматурных стержней",
      "status": "implemented",
      "calculatorId": "g21-4",
      "href": "calculator.html?atlasTool=g21-4#labAtlasTools",
      "formula": "Стержни = ceil(суммарная длина/длина стержня).",
      "outputUnit": "стержней",
      "trigger": "live",
      "inputs": [
        {
          "key": "required",
          "label": "Требуемая длина без раскроя, м",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "one",
          "label": "Полезная длина стержня, м",
          "example": 12,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Нижняя оценка по длине; не оптимизация раскроя, нахлёстов и анкеровки.",
      "reference": {
        "expected": 9,
        "actual": 9,
        "unit": "стержней",
        "tolerance": 9e-8,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g21-5",
      "group": "g21",
      "groupTitle": "Строительство, строительные материалы",
      "topic": "Количество кирпича на стену",
      "status": "implemented",
      "calculatorId": "g21-5",
      "href": "calculator.html?atlasTool=g21-5#labAtlasTools",
      "formula": "Кирпичи = ceil(площадь × толщина / объём модуля).",
      "outputUnit": "кирпичей",
      "trigger": "live",
      "inputs": [
        {
          "key": "area",
          "label": "Площадь кладки без проёмов, м²",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "thickness",
          "label": "Толщина стены, м",
          "example": 0.25,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "module",
          "label": "Объём кладочного модуля на кирпич с швами, м³",
          "example": 0.0025,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Модуль и перевязка задаются по фактической кладке; запас на бой отдельно.",
      "reference": {
        "expected": 1000,
        "actual": 1000,
        "unit": "кирпичей",
        "tolerance": 0.00001,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g21-6",
      "group": "g21",
      "groupTitle": "Строительство, строительные материалы",
      "topic": "Объём кладочного раствора",
      "status": "implemented",
      "calculatorId": "g21-6",
      "href": "calculator.html?atlasTool=g21-6#labAtlasTools",
      "formula": "Раствор = объём кладки − количество × внешний объём кирпича.",
      "outputUnit": "м³",
      "trigger": "live",
      "inputs": [
        {
          "key": "masonry",
          "label": "Геометрический объём кладки, м³",
          "example": 2.5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "bricks",
          "label": "Кирпичей",
          "example": 1000,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "brick",
          "label": "Геометрический объём одного кирпича, м³",
          "example": 0.00195,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без заполнения внутренних пустот, потерь и изменения объёма при твердении.",
      "reference": {
        "expected": 0.55,
        "actual": 0.55,
        "unit": "м³",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g21-7",
      "group": "g21",
      "groupTitle": "Строительство, строительные материалы",
      "topic": "Площадь стен за вычетом проёмов",
      "status": "implemented",
      "calculatorId": "g21-7",
      "href": "calculator.html?atlasTool=g21-7#labAtlasTools",
      "formula": "Чистая площадь = стены − проёмы.",
      "outputUnit": "м²",
      "trigger": "live",
      "inputs": [
        {
          "key": "walls",
          "label": "Общая площадь стен, м²",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "openings",
          "label": "Суммарная площадь проёмов, м²",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Откосы и торцы добавляются отдельно.",
      "reference": {
        "expected": 80,
        "actual": 80,
        "unit": "м²",
        "tolerance": 8e-7,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g21-8",
      "group": "g21",
      "groupTitle": "Строительство, строительные материалы",
      "topic": "Расход сухой смеси",
      "status": "implemented",
      "calculatorId": "g21-8",
      "href": "calculator.html?atlasTool=g21-8#labAtlasTools",
      "formula": "Смесь = площадь × толщина × норма расхода.",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "area",
          "label": "Площадь, м²",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "thickness",
          "label": "Толщина слоя, мм",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rate",
          "label": "Расход смеси, кг/(м²·мм)",
          "example": 1.5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Норму берите из паспорта выбранной смеси; это не универсальное значение.",
      "reference": {
        "expected": 150,
        "actual": 150,
        "unit": "кг",
        "tolerance": 0.0000015,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g21-9",
      "group": "g21",
      "groupTitle": "Строительство, строительные материалы",
      "topic": "Количество листов гипсокартона",
      "status": "implemented",
      "calculatorId": "g21-9",
      "href": "calculator.html?atlasTool=g21-9#labAtlasTools",
      "formula": "Листы = ceil(площадь × слои × (1 + запас/100) / площадь листа).",
      "outputUnit": "листов",
      "trigger": "live",
      "inputs": [
        {
          "key": "area",
          "label": "Площадь обшивки, м²",
          "example": 30,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "sheet",
          "label": "Площадь одного листа, м²",
          "example": 3,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "layers",
          "label": "Слоёв обшивки",
          "example": 2,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "waste",
          "label": "Запас к площади, %",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Оценка по площади, без оптимизации раскроя и схемы крепления.",
      "reference": {
        "expected": 22,
        "actual": 22,
        "unit": "листов",
        "tolerance": 2.2e-7,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g21-10",
      "group": "g21",
      "groupTitle": "Строительство, строительные материалы",
      "topic": "Расход краски по укрывистости",
      "status": "implemented",
      "calculatorId": "g21-10",
      "href": "calculator.html?atlasTool=g21-10#labAtlasTools",
      "formula": "Краска = площадь × слои/укрывистость × (1 + запас/100).",
      "outputUnit": "л",
      "trigger": "live",
      "inputs": [
        {
          "key": "area",
          "label": "Площадь окраски, м²",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "coverage",
          "label": "Укрывистость на слой, м²/л",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "layers",
          "label": "Слоёв",
          "example": 2,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "loss",
          "label": "Запас, %",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Укрывистость по паспорту для основания и метода нанесения.",
      "reference": {
        "expected": 22,
        "actual": 22,
        "unit": "л",
        "tolerance": 2.2e-7,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g21-11",
      "group": "g21",
      "groupTitle": "Строительство, строительные материалы",
      "topic": "Площадь кровельных скатов",
      "status": "implemented",
      "calculatorId": "g21-11",
      "href": "calculator.html?atlasTool=g21-11#labAtlasTools",
      "formula": "Площадь = Σ ширина ската × наклонная длина.",
      "outputUnit": "м²",
      "trigger": "live",
      "inputs": [
        {
          "key": "widths",
          "label": "Ширина каждого ската по поверхности, м; через ;",
          "example": "10;10",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "lengths",
          "label": "Наклонная длина каждого ската, м; через ;",
          "example": "5;5",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Прямоугольные скаты. Свесы должны входить в размеры; сложные вырезы отдельно.",
      "reference": {
        "expected": 100,
        "actual": 100,
        "unit": "м²",
        "tolerance": 0.000001,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g21-12",
      "group": "g21",
      "groupTitle": "Строительство, строительные материалы",
      "topic": "Уклон крыши и длина стропила",
      "status": "implemented",
      "calculatorId": "g21-12",
      "href": "calculator.html?atlasTool=g21-12#labAtlasTools",
      "formula": "Длина стропила по геометрии = sqrt(проекция² + подъём²).",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "run",
          "label": "Горизонтальная проекция, м",
          "example": 4,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rise",
          "label": "Подъём, м",
          "example": 3,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не расчёт сечения, узлов, прочности или свеса.",
      "reference": {
        "expected": 5,
        "actual": 5,
        "unit": "м",
        "tolerance": 5e-8,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g21-13",
      "group": "g21",
      "groupTitle": "Строительство, строительные материалы",
      "topic": "Объём земляных работ",
      "status": "implemented",
      "calculatorId": "g21-13",
      "href": "calculator.html?atlasTool=g21-13#labAtlasTools",
      "formula": "Геометрический объём = площадь × глубина.",
      "outputUnit": "м³",
      "trigger": "live",
      "inputs": [
        {
          "key": "area",
          "label": "Средняя площадь горизонтального сечения, м²",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "depth",
          "label": "Глубина, м",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Вертикальные стенки/заданное среднее сечение. Разрыхление грунта не включено.",
      "reference": {
        "expected": 200,
        "actual": 200,
        "unit": "м³",
        "tolerance": 0.000002,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g21-14",
      "group": "g21",
      "groupTitle": "Строительство, строительные материалы",
      "topic": "Перевод уклона % в градусы",
      "status": "implemented",
      "calculatorId": "g21-14",
      "href": "calculator.html?atlasTool=g21-14#labAtlasTools",
      "formula": "Угол = atan(уклон/100).",
      "outputUnit": "градусы",
      "trigger": "live",
      "inputs": [
        {
          "key": "slope",
          "label": "Уклон, %",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Уклон — отношение перепада к горизонтальному проложению.",
      "reference": {
        "expected": 45,
        "actual": 45,
        "unit": "градусы",
        "tolerance": 4.5000000000000003e-7,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g21-15",
      "group": "g21",
      "groupTitle": "Строительство, строительные материалы",
      "topic": "Потребность в утеплителе",
      "status": "implemented",
      "calculatorId": "g21-15",
      "href": "calculator.html?atlasTool=g21-15#labAtlasTools",
      "formula": "Объём = площадь × толщина/1000 × (1 + запас/100).",
      "outputUnit": "м³",
      "trigger": "live",
      "inputs": [
        {
          "key": "area",
          "label": "Площадь утепления, м²",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "thickness",
          "label": "Толщина, мм",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "reserve",
          "label": "Запас, %",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Не теплотехнический подбор толщины и не подтверждение пожарных свойств.",
      "reference": {
        "expected": 11,
        "actual": 11,
        "unit": "м³",
        "tolerance": 1.1e-7,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g21-16",
      "group": "g21",
      "groupTitle": "Строительство, строительные материалы",
      "topic": "Объём песчаной засыпки",
      "status": "implemented",
      "calculatorId": "g21-16",
      "href": "calculator.html?atlasTool=g21-16#labAtlasTools",
      "formula": "Заказываемый рыхлый объём = площадь × толщина × заданное отношение.",
      "outputUnit": "м³",
      "trigger": "live",
      "inputs": [
        {
          "key": "area",
          "label": "Площадь слоя, м²",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "thickness",
          "label": "Уплотнённая толщина, м",
          "example": 0.1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "ratio",
          "label": "Объём рыхлого к уплотнённому, раз",
          "example": 1.2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Отношение подтверждается поставщиком/испытаниями, а не универсальный коэффициент.",
      "reference": {
        "expected": 12,
        "actual": 12,
        "unit": "м³",
        "tolerance": 1.2000000000000002e-7,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g21-17",
      "group": "g21",
      "groupTitle": "Строительство, строительные материалы",
      "topic": "Расход щебня на подсыпку",
      "status": "implemented",
      "calculatorId": "g21-17",
      "href": "calculator.html?atlasTool=g21-17#labAtlasTools",
      "formula": "Масса = площадь × толщина × плотность.",
      "outputUnit": "т",
      "trigger": "live",
      "inputs": [
        {
          "key": "area",
          "label": "Площадь, м²",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "thickness",
          "label": "Уплотнённая толщина, м",
          "example": 0.1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Насыпная плотность в расчётном состоянии, т/м³",
          "example": 1.5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Плотность должна соответствовать выбранному состоянию уплотнения.",
      "reference": {
        "expected": 15,
        "actual": 15,
        "unit": "т",
        "tolerance": 1.5e-7,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g21-18",
      "group": "g21",
      "groupTitle": "Строительство, строительные материалы",
      "topic": "Количество плитки и подрезка",
      "status": "implemented",
      "calculatorId": "g21-18",
      "href": "calculator.html?atlasTool=g21-18#labAtlasTools",
      "formula": "Плитки = ceil(площадь × (1 + запас/100)/площадь плитки).",
      "outputUnit": "плиток",
      "trigger": "live",
      "inputs": [
        {
          "key": "area",
          "label": "Площадь облицовки, м²",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "tile",
          "label": "Площадь плитки, м²",
          "example": 0.25,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "waste",
          "label": "Запас на подрезку, %",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Не раскладка по рисунку, швам и партиям оттенка.",
      "reference": {
        "expected": 44,
        "actual": 44,
        "unit": "плиток",
        "tolerance": 4.4e-7,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g21-19",
      "group": "g21",
      "groupTitle": "Строительство, строительные материалы",
      "topic": "Масса металлоконструкции",
      "status": "implemented",
      "calculatorId": "g21-19",
      "href": "calculator.html?atlasTool=g21-19#labAtlasTools",
      "formula": "Масса = Σ длина × масса погонного метра.",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "lengths",
          "label": "Длины элементов, м; через ;",
          "example": "10;20",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "linear",
          "label": "Массы погонного метра, кг/м; через ;",
          "example": "2;3",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Точные массы сортамента и марки задаются пользователем; не включает сварку и крепёж.",
      "reference": {
        "expected": 80,
        "actual": 80,
        "unit": "кг",
        "tolerance": 8e-7,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g21-20",
      "group": "g21",
      "groupTitle": "Строительство, строительные материалы",
      "topic": "Длина профилей каркаса",
      "status": "implemented",
      "calculatorId": "g21-20",
      "href": "calculator.html?atlasTool=g21-20#labAtlasTools",
      "formula": "Длина = сумма длин элементов.",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "lengths",
          "label": "Длины всех элементов каркаса, м; через ;",
          "example": "1;2;3",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Перемычки, нахлёсты и отходы должны быть перечислены отдельно.",
      "reference": {
        "expected": 6,
        "actual": 6,
        "unit": "м",
        "tolerance": 6.000000000000001e-8,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g21-21",
      "group": "g21",
      "groupTitle": "Строительство, строительные материалы",
      "topic": "Прогиб балки",
      "status": "implemented",
      "calculatorId": "g21-21",
      "href": "calculator.html?atlasTool=g21-21#labAtlasTools",
      "formula": "δ = F L³/(48 E I).",
      "outputUnit": "мм",
      "trigger": "live",
      "inputs": [
        {
          "key": "force",
          "label": "Центральная сила, Н",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Пролёт, мм",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "e",
          "label": "E, ГПа",
          "example": 200,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "inertia",
          "label": "I, мм⁴",
          "example": 100000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Только шарнирно опёртая балка и центральная сила; не универсальный строительный расчёт.",
      "reference": {
        "expected": 1.0416666666666667,
        "actual": 1.04166666667,
        "unit": "мм",
        "tolerance": 1.0416666666666667e-8,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g21-22",
      "group": "g21",
      "groupTitle": "Строительство, строительные материалы",
      "topic": "Расчёт нагрузки на опору",
      "status": "implemented",
      "calculatorId": "g21-22",
      "href": "calculator.html?atlasTool=g21-22#labAtlasTools",
      "formula": "Rлевая = F(L−a)/L; Rправая = Fa/L.",
      "outputUnit": "Н на левой опоре",
      "trigger": "live",
      "inputs": [
        {
          "key": "force",
          "label": "Сосредоточенная вертикальная сила, Н",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "span",
          "label": "Пролёт между двумя опорами, м",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "distance",
          "label": "Положение силы от левой опоры, м",
          "example": 4,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Статически определимая шарнирно опёртая балка с одной силой; собственный вес не включён.",
      "reference": {
        "expected": 600,
        "actual": 600,
        "unit": "Н на левой опоре",
        "tolerance": 0.000006,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g21-23",
      "group": "g21",
      "groupTitle": "Строительство, строительные материалы",
      "topic": "Площадь опалубки",
      "status": "implemented",
      "calculatorId": "g21-23",
      "href": "calculator.html?atlasTool=g21-23#labAtlasTools",
      "formula": "Боковая площадь = 2(длина + ширина) × высота.",
      "outputUnit": "м²",
      "trigger": "live",
      "inputs": [
        {
          "key": "length",
          "label": "Длина, м",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "width",
          "label": "Ширина, м",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "height",
          "label": "Высота вертикальных граней, м",
          "example": 0.5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Четыре боковые грани прямоугольного элемента, без дна и верхней поверхности.",
      "reference": {
        "expected": 15,
        "actual": 15,
        "unit": "м²",
        "tolerance": 1.5e-7,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g21-24",
      "group": "g21",
      "groupTitle": "Строительство, строительные материалы",
      "topic": "Расход крепежа",
      "status": "implemented",
      "calculatorId": "g21-24",
      "href": "calculator.html?atlasTool=g21-24#labAtlasTools",
      "formula": "Крепёж = ceil(площадь × норма × (1 + запас/100)).",
      "outputUnit": "шт",
      "trigger": "live",
      "inputs": [
        {
          "key": "area",
          "label": "Площадь крепления, м²",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rate",
          "label": "Заданная норма крепежа, шт/м²",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "reserve",
          "label": "Запас, %",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Норму, расположение и несущую способность крепежа задаёт проект.",
      "reference": {
        "expected": 550,
        "actual": 550,
        "unit": "шт",
        "tolerance": 0.0000055,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g22-1",
      "group": "g22",
      "groupTitle": "Пищевое производство",
      "topic": "Выход готовой продукции от сырья",
      "status": "implemented",
      "calculatorId": "g22-1",
      "href": "calculator.html?atlasTool=g22-1#labAtlasTools",
      "formula": "Выход = продукт/сырьё × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "output",
          "label": "Готовый продукт, кг",
          "example": 90,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "input",
          "label": "Исходное сырьё, кг",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Привес воды и добавленных ингредиентов исключите либо включите во входной баланс.",
      "reference": {
        "expected": 90,
        "actual": 90,
        "unit": "%",
        "tolerance": 9.000000000000001e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g22-2",
      "group": "g22",
      "groupTitle": "Пищевое производство",
      "topic": "Технологические потери партии",
      "status": "implemented",
      "calculatorId": "g22-2",
      "href": "calculator.html?atlasTool=g22-2#labAtlasTools",
      "formula": "Неучтённая/потерянная масса = загрузка − продукт.",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "input",
          "label": "Масса всей загрузки, кг",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "output",
          "label": "Масса учтённого продукта, кг",
          "example": 95,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Побочные продукты и испарение включите в учтённые потоки при необходимости.",
      "reference": {
        "expected": 5,
        "actual": 5,
        "unit": "кг",
        "tolerance": 5e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g22-3",
      "group": "g22",
      "groupTitle": "Пищевое производство",
      "topic": "Баланс сухих веществ",
      "status": "implemented",
      "calculatorId": "g22-3",
      "href": "calculator.html?atlasTool=g22-3#labAtlasTools",
      "formula": "Сухое вещество = Σ масса потока × сухая доля/100.",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Массы потоков, кг; через ;",
          "example": "100;100",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "solids",
          "label": "Массовые доли сухого вещества, %; через ;",
          "example": "10;20",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Все потоки и методы определения сухого вещества согласованы.",
      "reference": {
        "expected": 30,
        "actual": 30,
        "unit": "кг",
        "tolerance": 3e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g22-4",
      "group": "g22",
      "groupTitle": "Пищевое производство",
      "topic": "Разведение сиропа по Brix",
      "status": "implemented",
      "calculatorId": "g22-4",
      "href": "calculator.html?atlasTool=g22-4#labAtlasTools",
      "formula": "Добавленная вода = масса × (Brix1/Brix2 − 1).",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Масса исходного сиропа, кг",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "before",
          "label": "Исходный °Brix",
          "example": 60,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "after",
          "label": "Целевой °Brix",
          "example": 30,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Только водный раствор сахарозы с °Brix как массовыми %; не универсальная рецептура напитка.",
      "reference": {
        "expected": 100,
        "actual": 100,
        "unit": "кг",
        "tolerance": 0.000001,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g22-5",
      "group": "g22",
      "groupTitle": "Пищевое производство",
      "topic": "Концентрация раствора соли",
      "status": "implemented",
      "calculatorId": "g22-5",
      "href": "calculator.html?atlasTool=g22-5#labAtlasTools",
      "formula": "Массовая концентрация = соль/раствор × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "salt",
          "label": "Масса соли, кг",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "solution",
          "label": "Конечная масса раствора, кг",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "В знаменателе готовый раствор, не одна вода.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "%",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g22-6",
      "group": "g22",
      "groupTitle": "Пищевое производство",
      "topic": "Доля ингредиента в рецептуре",
      "status": "implemented",
      "calculatorId": "g22-6",
      "href": "calculator.html?atlasTool=g22-6#labAtlasTools",
      "formula": "Доля = ингредиент/партия × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "ingredient",
          "label": "Ингредиент, кг",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "batch",
          "label": "Конечная масса рецептуры, кг",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без изменения массы при обработке.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "%",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g22-7",
      "group": "g22",
      "groupTitle": "Пищевое производство",
      "topic": "Масса ингредиентов на масштабируемую партию",
      "status": "implemented",
      "calculatorId": "g22-7",
      "href": "calculator.html?atlasTool=g22-7#labAtlasTools",
      "formula": "Новые массы = исходные доли × новая партия.",
      "outputUnit": "кг первого ингредиента",
      "trigger": "live",
      "inputs": [
        {
          "key": "recipe",
          "label": "Ингредиенты базовой рецептуры, кг; через ;",
          "example": "2;3;5",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "target",
          "label": "Новая общая масса, кг",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Пропорциональное масштабирование без корректировки потерь и химического взаимодействия.",
      "reference": {
        "expected": 20,
        "actual": 20,
        "unit": "кг первого ингредиента",
        "tolerance": 2e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g22-8",
      "group": "g22",
      "groupTitle": "Пищевое производство",
      "topic": "Объём жидкости по плотности",
      "status": "implemented",
      "calculatorId": "g22-8",
      "href": "calculator.html?atlasTool=g22-8#labAtlasTools",
      "formula": "Объём = масса/плотность.",
      "outputUnit": "л",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Масса жидкости, кг",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Плотность, кг/л",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Плотность при рабочей температуре.",
      "reference": {
        "expected": 100,
        "actual": 100,
        "unit": "л",
        "tolerance": 0.000001,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g22-9",
      "group": "g22",
      "groupTitle": "Пищевое производство",
      "topic": "Пересчёт °Brix в сухое вещество (допущения)",
      "status": "implemented",
      "calculatorId": "g22-9",
      "href": "calculator.html?atlasTool=g22-9#labAtlasTools",
      "formula": "Масса сахарозы = масса раствора × Brix/100.",
      "outputUnit": "кг сахарозы",
      "trigger": "live",
      "inputs": [
        {
          "key": "brix",
          "label": "Показание °Brix",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        },
        {
          "key": "mass",
          "label": "Масса раствора, кг",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Только раствор сахарозы в воде. В соке/многокомпонентной смеси рефрактометрический °Brix не является точным общим сухим остатком.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "кг сахарозы",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g22-10",
      "group": "g22",
      "groupTitle": "Пищевое производство",
      "topic": "Плотность смеси двух компонентов",
      "status": "implemented",
      "calculatorId": "g22-10",
      "href": "calculator.html?atlasTool=g22-10#labAtlasTools",
      "formula": "ρсм = (m1+m2)/(m1/ρ1+m2/ρ2).",
      "outputUnit": "кг/л",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass1",
          "label": "Масса компонента 1, кг",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rho1",
          "label": "Плотность 1, кг/л",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "mass2",
          "label": "Масса компонента 2, кг",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rho2",
          "label": "Плотность 2, кг/л",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Идеальное сложение объёмов, без контракции при смешении.",
      "reference": {
        "expected": 1.3333333333333333,
        "actual": 1.33333333333,
        "unit": "кг/л",
        "tolerance": 1.3333333333333334e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g22-11",
      "group": "g22",
      "groupTitle": "Пищевое производство",
      "topic": "Время заполнения ёмкости",
      "status": "implemented",
      "calculatorId": "g22-11",
      "href": "calculator.html?atlasTool=g22-11#labAtlasTools",
      "formula": "Время = объём/подача.",
      "outputUnit": "мин",
      "trigger": "live",
      "inputs": [
        {
          "key": "volume",
          "label": "Заполняемый объём, л",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "flow",
          "label": "Постоянная подача, л/мин",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без изменения расхода с уровнем и вспенивания.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "мин",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g22-12",
      "group": "g22",
      "groupTitle": "Пищевое производство",
      "topic": "Время перемешивания по заданной модели",
      "status": "implemented",
      "calculatorId": "g22-12",
      "href": "calculator.html?atlasTool=g22-12#labAtlasTools",
      "formula": "Время = −τ ln(остаточная доля).",
      "outputUnit": "с",
      "trigger": "live",
      "inputs": [
        {
          "key": "tau",
          "label": "Измеренная постоянная смешения τ, с",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "error",
          "label": "Допустимая остаточная неоднородность, доля",
          "example": 0.05,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Заданная экспоненциальная модель первого порядка; τ определяется испытанием, не только оборотами мешалки.",
      "reference": {
        "expected": 29.95732273553991,
        "actual": 29.9573227355,
        "unit": "с",
        "tolerance": 2.995732273553991e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g22-13",
      "group": "g22",
      "groupTitle": "Пищевое производство",
      "topic": "Расчёт дозы ингредиента ppm",
      "status": "implemented",
      "calculatorId": "g22-13",
      "href": "calculator.html?atlasTool=g22-13#labAtlasTools",
      "formula": "Доза, г = ppm × кг партии / 1000.",
      "outputUnit": "г",
      "trigger": "live",
      "inputs": [
        {
          "key": "ppm",
          "label": "Требуемая массовая доля, ppm",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "batch",
          "label": "Масса партии, кг",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Массовый ppm=мг/кг; допустимость дозы, активность продукта и ограничения проверяются отдельно.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "г",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g22-14",
      "group": "g22",
      "groupTitle": "Пищевое производство",
      "topic": "Тепловой баланс нагрева продукта",
      "status": "implemented",
      "calculatorId": "g22-14",
      "href": "calculator.html?atlasTool=g22-14#labAtlasTools",
      "formula": "Q = m cp ΔT / 3600.",
      "outputUnit": "кВт·ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Масса продукта, кг",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "cp",
          "label": "Средняя теплоёмкость, кДж/(кг·К)",
          "example": 4,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "dt",
          "label": "Повышение температуры, К",
          "example": 50,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Только явная теплота; не режим пастеризации/стерилизации и не энергетические потери установки.",
      "reference": {
        "expected": 5.555555555555555,
        "actual": 5.55555555556,
        "unit": "кВт·ч",
        "tolerance": 5.5555555555555555e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g22-15",
      "group": "g22",
      "groupTitle": "Пищевое производство",
      "topic": "Энергия охлаждения партии",
      "status": "implemented",
      "calculatorId": "g22-15",
      "href": "calculator.html?atlasTool=g22-15#labAtlasTools",
      "formula": "Отводимая энергия = m cp ΔT / 3600.",
      "outputUnit": "кВт·ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Масса, кг",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "cp",
          "label": "Средняя теплоёмкость, кДж/(кг·К)",
          "example": 4,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "dt",
          "label": "Снижение температуры, К",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без замораживания, фазовых переходов и теплопритоков.",
      "reference": {
        "expected": 2.2222222222222223,
        "actual": 2.22222222222,
        "unit": "кВт·ч",
        "tolerance": 2.2222222222222224e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g22-16",
      "group": "g22",
      "groupTitle": "Пищевое производство",
      "topic": "Выход фильтрации",
      "status": "implemented",
      "calculatorId": "g22-16",
      "href": "calculator.html?atlasTool=g22-16#labAtlasTools",
      "formula": "Выход фильтрата = фильтрат/подача × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "filtrate",
          "label": "Учтённая масса фильтрата, кг",
          "example": 90,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "feed",
          "label": "Масса подачи, кг",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не эффективность удаления загрязнения: это массовый выход.",
      "reference": {
        "expected": 90,
        "actual": 90,
        "unit": "%",
        "tolerance": 9.000000000000001e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g22-17",
      "group": "g22",
      "groupTitle": "Пищевое производство",
      "topic": "Влагосодержание продукта",
      "status": "implemented",
      "calculatorId": "g22-17",
      "href": "calculator.html?atlasTool=g22-17#labAtlasTools",
      "formula": "Влажность мокрой базы = (влажная − сухая)/влажная × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "wet",
          "label": "Масса влажного продукта, г",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "dry",
          "label": "Масса сухого остатка, г",
          "example": 80,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Метод высушивания и летучие вещества влияют на результат.",
      "reference": {
        "expected": 20,
        "actual": 20,
        "unit": "%",
        "tolerance": 2e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g22-18",
      "group": "g22",
      "groupTitle": "Пищевое производство",
      "topic": "Изменение массы при сушке",
      "status": "implemented",
      "calculatorId": "g22-18",
      "href": "calculator.html?atlasTool=g22-18#labAtlasTools",
      "formula": "Конечная масса = исходная × (100 − влажность1)/(100 − влажность2).",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Исходная масса, кг",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "before",
          "label": "Исходная влажность мокрой базы, %",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        },
        {
          "key": "after",
          "label": "Целевая влажность, %",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Сухое вещество сохраняется; без механических и химических потерь.",
      "reference": {
        "expected": 88.88888888888889,
        "actual": 88.8888888889,
        "unit": "кг",
        "tolerance": 8.888888888888889e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g22-19",
      "group": "g22",
      "groupTitle": "Пищевое производство",
      "topic": "Оборачиваемость тары",
      "status": "implemented",
      "calculatorId": "g22-19",
      "href": "calculator.html?atlasTool=g22-19#labAtlasTools",
      "formula": "Оборачиваемость = завершённые циклы/среднее количество тары.",
      "outputUnit": "циклов/единицу за период",
      "trigger": "live",
      "inputs": [
        {
          "key": "turns",
          "label": "Завершённые циклы оборотной тары за период",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "average",
          "label": "Среднее число единиц оборотной тары",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Одинаковый период и тип тары.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "циклов/единицу за период",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g22-20",
      "group": "g22",
      "groupTitle": "Пищевое производство",
      "topic": "Расход упаковки на смену",
      "status": "implemented",
      "calculatorId": "g22-20",
      "href": "calculator.html?atlasTool=g22-20#labAtlasTools",
      "formula": "Упаковка = ceil(изделия × единиц/изделие × (1 + запас/100)).",
      "outputUnit": "единиц",
      "trigger": "live",
      "inputs": [
        {
          "key": "products",
          "label": "Упаковываемых изделий",
          "example": 1000,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "per",
          "label": "Единиц упаковки на изделие",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "reserve",
          "label": "Запас на потери, %",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Каждый тип упаковки считайте отдельно.",
      "reference": {
        "expected": 1050,
        "actual": 1050,
        "unit": "единиц",
        "tolerance": 0.0000105,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g22-21",
      "group": "g22",
      "groupTitle": "Пищевое производство",
      "topic": "Стоимость рецептуры на килограмм",
      "status": "implemented",
      "calculatorId": "g22-21",
      "href": "calculator.html?atlasTool=g22-21#labAtlasTools",
      "formula": "Стоимость на кг = Σ(mi × ценаi)/Σmi.",
      "outputUnit": "₽/кг смеси",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Массы ингредиентов, кг; через ;",
          "example": "2;3",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "prices",
          "label": "Цены, ₽/кг; через ;",
          "example": "100;200",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Только ингредиенты до технологических потерь, труда и упаковки.",
      "reference": {
        "expected": 160,
        "actual": 160,
        "unit": "₽/кг смеси",
        "tolerance": 0.0000016,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g22-22",
      "group": "g22",
      "groupTitle": "Пищевое производство",
      "topic": "Отклонение дозатора от задания",
      "status": "implemented",
      "calculatorId": "g22-22",
      "href": "calculator.html?atlasTool=g22-22#labAtlasTools",
      "formula": "Отклонение = (факт − задание)/задание × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "actual",
          "label": "Фактическая доза, г",
          "example": 102,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "target",
          "label": "Заданная доза, г",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Знак положительный при перевесе.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "%",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g23-1",
      "group": "g23",
      "groupTitle": "Энергетика и возобновляемые",
      "topic": "Энергопотребление оборудования кВт·ч",
      "status": "implemented",
      "calculatorId": "g23-1",
      "href": "calculator.html?atlasTool=g23-1#labAtlasTools",
      "formula": "E = P t.",
      "outputUnit": "кВт·ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "power",
          "label": "Средняя активная мощность, кВт",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "hours",
          "label": "Время, ч",
          "example": 8,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Средняя фактическая активная мощность, не установленная мощность без коэффициента загрузки.",
      "reference": {
        "expected": 16,
        "actual": 16,
        "unit": "кВт·ч",
        "tolerance": 1.6e-7,
        "status": "passed"
      },
      "researchSource": "https://pvwatts.nrel.gov/"
    },
    {
      "id": "g23-2",
      "group": "g23",
      "groupTitle": "Энергетика и возобновляемые",
      "topic": "Сменный профиль нагрузки",
      "status": "implemented",
      "calculatorId": "g23-2",
      "href": "calculator.html?atlasTool=g23-2#labAtlasTools",
      "formula": "Энергия профиля = Σ Pi ti.",
      "outputUnit": "кВт·ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "power",
          "label": "Мощности последовательных интервалов, кВт; через ;",
          "example": "10;20;30",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "hours",
          "label": "Длительности интервалов, ч; через ;",
          "example": "1;2;1",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Интервалы не перекрываются. График показывает до 100 первых интервалов, энергия рассчитывается по всему профилю.",
      "reference": {
        "expected": 80,
        "actual": 80,
        "unit": "кВт·ч",
        "tolerance": 8e-7,
        "status": "passed"
      },
      "researchSource": "https://pvwatts.nrel.gov/"
    },
    {
      "id": "g23-3",
      "group": "g23",
      "groupTitle": "Энергетика и возобновляемые",
      "topic": "Коэффициент использования мощности",
      "status": "implemented",
      "calculatorId": "g23-3",
      "href": "calculator.html?atlasTool=g23-3#labAtlasTools",
      "formula": "Коэффициент использования = E/(Pустановленная × время) × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "actual",
          "label": "Фактическая энергия, кВт·ч",
          "example": 120,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rated",
          "label": "Установленная активная мощность, кВт",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "hours",
          "label": "Длительность периода, ч",
          "example": 24,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Согласуйте границу системы и номинальную мощность.",
      "reference": {
        "expected": 50,
        "actual": 50,
        "unit": "%",
        "tolerance": 5e-7,
        "status": "passed"
      },
      "researchSource": "https://pvwatts.nrel.gov/"
    },
    {
      "id": "g23-4",
      "group": "g23",
      "groupTitle": "Энергетика и возобновляемые",
      "topic": "Расчёт мощности солнечной станции",
      "status": "implemented",
      "calculatorId": "g23-4",
      "href": "calculator.html?atlasTool=g23-4#labAtlasTools",
      "formula": "Номинальная PV-мощность = энергия/(PSH × PR).",
      "outputUnit": "кВтпик",
      "trigger": "live",
      "inputs": [
        {
          "key": "need",
          "label": "Требуемая энергия за сутки, кВт·ч",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "psh",
          "label": "Эквивалентных солнечных часов за сутки, ч",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "pr",
          "label": "Заданный performance ratio",
          "example": 0.8,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Инсоляция и PR должны соответствовать региону и сезону; не гарантирует зимнюю автономность.",
      "reference": {
        "expected": 2.5,
        "actual": 2.5,
        "unit": "кВтпик",
        "tolerance": 2.5e-8,
        "status": "passed"
      },
      "researchSource": "https://pvwatts.nrel.gov/"
    },
    {
      "id": "g23-5",
      "group": "g23",
      "groupTitle": "Энергетика и возобновляемые",
      "topic": "Генерация PV по инсоляции",
      "status": "implemented",
      "calculatorId": "g23-5",
      "href": "calculator.html?atlasTool=g23-5#labAtlasTools",
      "formula": "E = Pпик × PSH × PR.",
      "outputUnit": "кВт·ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "rated",
          "label": "Номинальная PV-мощность, кВтпик",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "psh",
          "label": "Эквивалентных солнечных часов за период",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "pr",
          "label": "Performance ratio",
          "example": 0.8,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Инсоляция уже должна относиться к плоскости модулей.",
      "reference": {
        "expected": 40,
        "actual": 40,
        "unit": "кВт·ч",
        "tolerance": 4e-7,
        "status": "passed"
      },
      "researchSource": "https://pvwatts.nrel.gov/"
    },
    {
      "id": "g23-6",
      "group": "g23",
      "groupTitle": "Энергетика и возобновляемые",
      "topic": "Оценка потерь от наклона панели",
      "status": "implemented",
      "calculatorId": "g23-6",
      "href": "calculator.html?atlasTool=g23-6#labAtlasTools",
      "formula": "Относительное снижение = (эталон − фактическое)/эталон × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "reference",
          "label": "Облучение в эталонной ориентации за период, кВт·ч/м²",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "actual",
          "label": "Облучение в фактической ориентации за тот же период",
          "example": 90,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Сравниваются реальные/расчётные интегральные облучения. Одного угла наклона недостаточно для годовой оценки.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "%",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://pvwatts.nrel.gov/"
    },
    {
      "id": "g23-7",
      "group": "g23",
      "groupTitle": "Энергетика и возобновляемые",
      "topic": "Мощность инвертора",
      "status": "implemented",
      "calculatorId": "g23-7",
      "href": "calculator.html?atlasTool=g23-7#labAtlasTools",
      "formula": "Требуемая непрерывная S = P/PF × (1 + резерв/100).",
      "outputUnit": "кВА",
      "trigger": "live",
      "inputs": [
        {
          "key": "running",
          "label": "Одновременная активная нагрузка, кВт",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "pf",
          "label": "Заданный PF нагрузки",
          "example": 0.8,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "reserve",
          "label": "Резерв к полной мощности, %",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Пусковая мощность, форма волны, температура и допустимые кратковременные перегрузки отдельно.",
      "reference": {
        "expected": 3,
        "actual": 3,
        "unit": "кВА",
        "tolerance": 3.0000000000000004e-8,
        "status": "passed"
      },
      "researchSource": "https://pvwatts.nrel.gov/"
    },
    {
      "id": "g23-8",
      "group": "g23",
      "groupTitle": "Энергетика и возобновляемые",
      "topic": "Размер АКБ по суточной нагрузке",
      "status": "implemented",
      "calculatorId": "g23-8",
      "href": "calculator.html?atlasTool=g23-8#labAtlasTools",
      "formula": "Номинальная ёмкость = суточная энергия × сутки/(DoD × КПД).",
      "outputUnit": "кВт·ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "daily",
          "label": "Энергия нагрузки за сутки, кВт·ч",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "days",
          "label": "Суток автономии",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "dod",
          "label": "Используемая доля DoD",
          "example": 0.8,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "eff",
          "label": "КПД батареи/инвертора",
          "example": 0.9,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без зависимости от тока, температуры, старения и резервного генератора.",
      "reference": {
        "expected": 27.777777777777775,
        "actual": 27.7777777778,
        "unit": "кВт·ч",
        "tolerance": 2.7777777777777776e-7,
        "status": "passed"
      },
      "researchSource": "https://pvwatts.nrel.gov/"
    },
    {
      "id": "g23-9",
      "group": "g23",
      "groupTitle": "Энергетика и возобновляемые",
      "topic": "Время автономности батарей",
      "status": "implemented",
      "calculatorId": "g23-9",
      "href": "calculator.html?atlasTool=g23-9#labAtlasTools",
      "formula": "t = энергия × DoD × КПД / нагрузка.",
      "outputUnit": "ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "energy",
          "label": "Номинальная энергия АКБ, кВт·ч",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "dod",
          "label": "DoD, доля",
          "example": 0.8,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "eff",
          "label": "КПД преобразования",
          "example": 0.9,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "load",
          "label": "Постоянная нагрузка, кВт",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Постоянная мощность; реальный профиль разряда может уменьшить время.",
      "reference": {
        "expected": 3.6,
        "actual": 3.6,
        "unit": "ч",
        "tolerance": 3.6000000000000005e-8,
        "status": "passed"
      },
      "researchSource": "https://pvwatts.nrel.gov/"
    },
    {
      "id": "g23-10",
      "group": "g23",
      "groupTitle": "Энергетика и возобновляемые",
      "topic": "Глубина разряда DoD",
      "status": "implemented",
      "calculatorId": "g23-10",
      "href": "calculator.html?atlasTool=g23-10#labAtlasTools",
      "formula": "DoD = отданная энергия/полная × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "removed",
          "label": "Отданная энергия, кВт·ч",
          "example": 8,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "full",
          "label": "Номинальная полная энергия, кВт·ч",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Одна и та же база энергии и цикл; не расчёт ресурса.",
      "reference": {
        "expected": 80,
        "actual": 80,
        "unit": "%",
        "tolerance": 8e-7,
        "status": "passed"
      },
      "researchSource": "https://pvwatts.nrel.gov/"
    },
    {
      "id": "g23-11",
      "group": "g23",
      "groupTitle": "Энергетика и возобновляемые",
      "topic": "Средняя мощность ветропотока",
      "status": "implemented",
      "calculatorId": "g23-11",
      "href": "calculator.html?atlasTool=g23-11#labAtlasTools",
      "formula": "Средняя мощность потока = 0.5 ρ A × среднее(v³).",
      "outputUnit": "Вт",
      "trigger": "live",
      "inputs": [
        {
          "key": "density",
          "label": "Плотность воздуха, кг/м³",
          "example": 1.2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "area",
          "label": "Ометаемая площадь, м²",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "wind",
          "label": "Скорости ветра по равным временным интервалам, м/с; через ;",
          "example": "5;5",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Ветер по равным интервалам; куб среднего ветра не равен среднему кубу.",
      "reference": {
        "expected": 750,
        "actual": 750,
        "unit": "Вт",
        "tolerance": 0.0000075,
        "status": "passed"
      },
      "researchSource": "https://pvwatts.nrel.gov/"
    },
    {
      "id": "g23-12",
      "group": "g23",
      "groupTitle": "Энергетика и возобновляемые",
      "topic": "Энергия ветровой установки по Cp",
      "status": "implemented",
      "calculatorId": "g23-12",
      "href": "calculator.html?atlasTool=g23-12#labAtlasTools",
      "formula": "E = 0.5ρAv³Cp × часы/1000.",
      "outputUnit": "кВт·ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "density",
          "label": "Плотность воздуха, кг/м³",
          "example": 1.2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "area",
          "label": "Площадь ротора, м²",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "wind",
          "label": "Постоянная скорость ветра, м/с",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "cp",
          "label": "Заданный Cp",
          "example": 0.4,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "hours",
          "label": "Продолжительность, ч",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Постоянная скорость и Cp; без пускового порога, ограничения мощности, простоя и электрических потерь.",
      "reference": {
        "expected": 3,
        "actual": 3,
        "unit": "кВт·ч",
        "tolerance": 3.0000000000000004e-8,
        "status": "passed"
      },
      "researchSource": "https://pvwatts.nrel.gov/"
    },
    {
      "id": "g23-13",
      "group": "g23",
      "groupTitle": "Энергетика и возобновляемые",
      "topic": "Конверсия BTU↔кВт·ч",
      "status": "implemented",
      "calculatorId": "g23-13",
      "href": "calculator.html?atlasTool=g23-13#labAtlasTools",
      "formula": "кВт·ч = BTU_IT × 1055.05585262 / 3 600 000.",
      "outputUnit": "кВт·ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "btu",
          "label": "Энергия, BTU (IT)",
          "example": 3412.14163312794,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "International Table BTU; не термохимическая BTU.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "кВт·ч",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://pvwatts.nrel.gov/"
    },
    {
      "id": "g23-14",
      "group": "g23",
      "groupTitle": "Энергетика и возобновляемые",
      "topic": "Коэффициент мощности электростанции",
      "status": "implemented",
      "calculatorId": "g23-14",
      "href": "calculator.html?atlasTool=g23-14#labAtlasTools",
      "formula": "Capacity factor = выработка/(мощность × часы) × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "actual",
          "label": "Фактическая выработка, МВт·ч",
          "example": 4380,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rated",
          "label": "Номинальная мощность, МВт",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "hours",
          "label": "Часов в рассматриваемом году/периоде",
          "example": 8760,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Это коэффициент использования установленной мощности, не cos φ.",
      "reference": {
        "expected": 50,
        "actual": 50,
        "unit": "%",
        "tolerance": 5e-7,
        "status": "passed"
      },
      "researchSource": "https://pvwatts.nrel.gov/"
    },
    {
      "id": "g23-15",
      "group": "g23",
      "groupTitle": "Энергетика и возобновляемые",
      "topic": "Расход топлива генератора",
      "status": "implemented",
      "calculatorId": "g23-15",
      "href": "calculator.html?atlasTool=g23-15#labAtlasTools",
      "formula": "Топливо = мощность × часы × удельный расход / 1000.",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "power",
          "label": "Средняя электрическая нагрузка, кВт",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "hours",
          "label": "Часов",
          "example": 8,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "sfc",
          "label": "Заданный удельный расход, г/(кВт·ч)",
          "example": 250,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Удельный расход по характеристике генератора именно в заданном режиме.",
      "reference": {
        "expected": 20,
        "actual": 20,
        "unit": "кг",
        "tolerance": 2e-7,
        "status": "passed"
      },
      "researchSource": "https://pvwatts.nrel.gov/"
    },
    {
      "id": "g23-16",
      "group": "g23",
      "groupTitle": "Энергетика и возобновляемые",
      "topic": "Энергия пара по энтальпии",
      "status": "implemented",
      "calculatorId": "g23-16",
      "href": "calculator.html?atlasTool=g23-16#labAtlasTools",
      "formula": "Энергия = масса × (hподачи − hвозврата)/3600.",
      "outputUnit": "кВт·ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Масса пара, кг",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "h1",
          "label": "Энтальпия подачи, кДж/кг",
          "example": 2800,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "h2",
          "label": "Энтальпия возврата, кДж/кг",
          "example": 400,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Энтальпии берутся из проверенных таблиц для фактического состояния; это не определение состояния пара.",
      "reference": {
        "expected": 666.6666666666666,
        "actual": 666.666666667,
        "unit": "кВт·ч",
        "tolerance": 0.000006666666666666667,
        "status": "passed"
      },
      "researchSource": "https://pvwatts.nrel.gov/"
    },
    {
      "id": "g23-17",
      "group": "g23",
      "groupTitle": "Энергетика и возобновляемые",
      "topic": "КПД котельной установки",
      "status": "implemented",
      "calculatorId": "g23-17",
      "href": "calculator.html?atlasTool=g23-17#labAtlasTools",
      "formula": "КПД по НТС = полезная теплота/(топливо × НТС) × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "heat",
          "label": "Полезная теплота, кВт·ч",
          "example": 900,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "fuel",
          "label": "Масса топлива, кг",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "lhv",
          "label": "Низшая теплота сгорания, кВт·ч/кг",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не смешивайте НТС и ВТС; для конденсационных котлов выбранная база важна.",
      "reference": {
        "expected": 90,
        "actual": 90,
        "unit": "%",
        "tolerance": 9.000000000000001e-7,
        "status": "passed"
      },
      "researchSource": "https://pvwatts.nrel.gov/"
    },
    {
      "id": "g23-18",
      "group": "g23",
      "groupTitle": "Энергетика и возобновляемые",
      "topic": "Тепловая нагрузка горячей воды",
      "status": "implemented",
      "calculatorId": "g23-18",
      "href": "calculator.html?atlasTool=g23-18#labAtlasTools",
      "formula": "Q = m cp ΔT/3600.",
      "outputUnit": "кВт·ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Масса воды, кг",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "cp",
          "label": "Теплоёмкость, кДж/(кг·К)",
          "example": 4.18,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "dt",
          "label": "Повышение температуры, К",
          "example": 40,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без теплопотерь бака, циркуляции и нагрева до кипения.",
      "reference": {
        "expected": 4.644444444444445,
        "actual": 4.64444444444,
        "unit": "кВт·ч",
        "tolerance": 4.644444444444445e-8,
        "status": "passed"
      },
      "researchSource": "https://pvwatts.nrel.gov/"
    },
    {
      "id": "g23-19",
      "group": "g23",
      "groupTitle": "Энергетика и возобновляемые",
      "topic": "Условный коэффициент выбросов",
      "status": "implemented",
      "calculatorId": "g23-19",
      "href": "calculator.html?atlasTool=g23-19#labAtlasTools",
      "formula": "Коэффициент = выбросы/энергия.",
      "outputUnit": "кг CO₂-экв/кВт·ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "emissions",
          "label": "Масса выбросов, кг CO₂-экв",
          "example": 40,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "energy",
          "label": "Энергия на согласованной базе, кВт·ч",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не устанавливает коэффициент сети; границы учёта и источники выбросов задаются отдельно.",
      "reference": {
        "expected": 0.4,
        "actual": 0.4,
        "unit": "кг CO₂-экв/кВт·ч",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://pvwatts.nrel.gov/"
    },
    {
      "id": "g23-20",
      "group": "g23",
      "groupTitle": "Энергетика и возобновляемые",
      "topic": "Стоимость энергии смены",
      "status": "implemented",
      "calculatorId": "g23-20",
      "href": "calculator.html?atlasTool=g23-20#labAtlasTools",
      "formula": "Стоимость = энергия × тариф.",
      "outputUnit": "₽",
      "trigger": "live",
      "inputs": [
        {
          "key": "energy",
          "label": "Потребление за смену, кВт·ч",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "tariff",
          "label": "Тариф, ₽/кВт·ч",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без платежей за мощность и других составляющих договора.",
      "reference": {
        "expected": 500,
        "actual": 500,
        "unit": "₽",
        "tolerance": 0.000005,
        "status": "passed"
      },
      "researchSource": "https://pvwatts.nrel.gov/"
    },
    {
      "id": "g23-21",
      "group": "g23",
      "groupTitle": "Энергетика и возобновляемые",
      "topic": "Срок окупаемости по заданным потокам",
      "status": "implemented",
      "calculatorId": "g23-21",
      "href": "calculator.html?atlasTool=g23-21#labAtlasTools",
      "formula": "Накопленные дисконтированные поступления; интерполяция в годе возврата.",
      "outputUnit": "лет",
      "trigger": "live",
      "inputs": [
        {
          "key": "investment",
          "label": "Инвестиции, ₽",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "flows",
          "label": "Чистые годовые поступления, ₽; через ;",
          "example": "30;30;50",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "discount",
          "label": "Годовая ставка дисконтирования, %",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Положительные годовые потоки; интерполяция внутри года условна, потоки дисконтируются на конец года.",
      "reference": {
        "expected": 2.8,
        "actual": 2.8,
        "unit": "лет",
        "tolerance": 2.8e-8,
        "status": "passed"
      },
      "researchSource": "https://pvwatts.nrel.gov/"
    },
    {
      "id": "g23-22",
      "group": "g23",
      "groupTitle": "Энергетика и возобновляемые",
      "topic": "Сравнение тарифов",
      "status": "implemented",
      "calculatorId": "g23-22",
      "href": "calculator.html?atlasTool=g23-22#labAtlasTools",
      "formula": "Разница затрат = тариф2 × энергия + фикс2 − тариф1 × энергия − фикс1.",
      "outputUnit": "₽ (2 дороже 1)",
      "trigger": "live",
      "inputs": [
        {
          "key": "energy",
          "label": "Энергия за период, кВт·ч",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "first",
          "label": "Тариф 1, ₽/кВт·ч",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "second",
          "label": "Тариф 2, ₽/кВт·ч",
          "example": 6,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "fixed1",
          "label": "Фиксированные платежи 1, ₽",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "fixed2",
          "label": "Фиксированные платежи 2, ₽",
          "example": 50,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Одинаковый профиль потребления; многозонные тарифы надо считать по зонам.",
      "reference": {
        "expected": 50,
        "actual": 50,
        "unit": "₽ (2 дороже 1)",
        "tolerance": 5e-7,
        "status": "passed"
      },
      "researchSource": "https://pvwatts.nrel.gov/"
    },
    {
      "id": "g24-1",
      "group": "g24",
      "groupTitle": "Метрология качества и SPC",
      "topic": "Среднее и медиана выборки",
      "status": "implemented",
      "calculatorId": "g24-1",
      "href": "calculator.html?atlasTool=g24-1#labAtlasTools",
      "formula": "Среднее = Σx/n.",
      "outputUnit": "среднее",
      "trigger": "live",
      "inputs": [
        {
          "key": "values",
          "label": "Результаты через ;",
          "example": "2;4;6",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Равноценные наблюдения; медиана рассчитывается по отсортированному ряду.",
      "reference": {
        "expected": 4,
        "actual": 4,
        "unit": "среднее",
        "tolerance": 4e-8,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g24-2",
      "group": "g24",
      "groupTitle": "Метрология качества и SPC",
      "topic": "Стандартное отклонение измерений",
      "status": "implemented",
      "calculatorId": "g24-2",
      "href": "calculator.html?atlasTool=g24-2#labAtlasTools",
      "formula": "s = sqrt(Σ(x−среднее)²/(n−1)).",
      "outputUnit": "единиц измерения",
      "trigger": "live",
      "inputs": [
        {
          "key": "values",
          "label": "Измерения через ;",
          "example": "8;10;12",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Выборочная оценка стандартного отклонения; n ≥ 2.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "единиц измерения",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g24-3",
      "group": "g24",
      "groupTitle": "Метрология качества и SPC",
      "topic": "Коэффициент вариации",
      "status": "implemented",
      "calculatorId": "g24-3",
      "href": "calculator.html?atlasTool=g24-3#labAtlasTools",
      "formula": "CV = s/среднее × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "values",
          "label": "Измерения через ;",
          "example": "8;10;12",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Для величин с содержательным абсолютным нулём и положительным средним.",
      "reference": {
        "expected": 20,
        "actual": 20,
        "unit": "%",
        "tolerance": 2e-7,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g24-4",
      "group": "g24",
      "groupTitle": "Метрология качества и SPC",
      "topic": "Индекс процесса Cp",
      "status": "implemented",
      "calculatorId": "g24-4",
      "href": "calculator.html?atlasTool=g24-4#labAtlasTools",
      "formula": "Cp = (USL − LSL)/(6σ).",
      "outputUnit": "CP",
      "trigger": "live",
      "inputs": [
        {
          "key": "low",
          "label": "Нижняя граница допуска",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "high",
          "label": "Верхняя граница допуска",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "average",
          "label": "Среднее процесса",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "sigma",
          "label": "Оценка внутрипроцессного σ",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Для двухстороннего допуска. Cpk использует внутрипроцессную оценку σ, Ppk — общую. Интерпретация требует стабильности и подходящей модели распределения.",
      "reference": {
        "expected": 1.6666666666666667,
        "actual": 1.66666666667,
        "unit": "CP",
        "tolerance": 1.6666666666666667e-8,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g24-5",
      "group": "g24",
      "groupTitle": "Метрология качества и SPC",
      "topic": "Индекс процесса Cpk",
      "status": "implemented",
      "calculatorId": "g24-5",
      "href": "calculator.html?atlasTool=g24-5#labAtlasTools",
      "formula": "Cpk/Ppk = min(USL − среднее, среднее − LSL)/(3σ).",
      "outputUnit": "CPK",
      "trigger": "live",
      "inputs": [
        {
          "key": "low",
          "label": "Нижняя граница допуска",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "high",
          "label": "Верхняя граница допуска",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "average",
          "label": "Среднее процесса",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "sigma",
          "label": "Оценка внутрипроцессного σ",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Для двухстороннего допуска. Cpk использует внутрипроцессную оценку σ, Ppk — общую. Интерпретация требует стабильности и подходящей модели распределения.",
      "reference": {
        "expected": 1.6666666666666667,
        "actual": 1.66666666667,
        "unit": "CPK",
        "tolerance": 1.6666666666666667e-8,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g24-6",
      "group": "g24",
      "groupTitle": "Метрология качества и SPC",
      "topic": "Индекс Pp/Ppk",
      "status": "implemented",
      "calculatorId": "g24-6",
      "href": "calculator.html?atlasTool=g24-6#labAtlasTools",
      "formula": "Cpk/Ppk = min(USL − среднее, среднее − LSL)/(3σ). Pp = (USL − LSL)/(6σ) при той же оценке σ.",
      "outputUnit": "PPK",
      "trigger": "live",
      "inputs": [
        {
          "key": "low",
          "label": "Нижняя граница допуска",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "high",
          "label": "Верхняя граница допуска",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "average",
          "label": "Среднее процесса",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "sigma",
          "label": "Общее стандартное отклонение",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Для двухстороннего допуска. Cpk использует внутрипроцессную оценку σ, Ppk — общую. Интерпретация требует стабильности и подходящей модели распределения.",
      "reference": {
        "expected": 1.6666666666666667,
        "actual": 1.66666666667,
        "unit": "PPK",
        "tolerance": 1.6666666666666667e-8,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g24-7",
      "group": "g24",
      "groupTitle": "Метрология качества и SPC",
      "topic": "Брак в ppm",
      "status": "implemented",
      "calculatorId": "g24-7",
      "href": "calculator.html?atlasTool=g24-7#labAtlasTools",
      "formula": "Показатель = события / проверенные единицы × 1000000.",
      "outputUnit": "ppm",
      "trigger": "live",
      "inputs": [
        {
          "key": "events",
          "label": "Количество событий",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "total",
          "label": "Количество проверенных единиц",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Один заданный тип события на выбранную единицу наблюдения.",
      "reference": {
        "expected": 100000,
        "actual": 100000,
        "unit": "ppm",
        "tolerance": 0.001,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g24-8",
      "group": "g24",
      "groupTitle": "Метрология качества и SPC",
      "topic": "Доверительный интервал доли брака",
      "status": "implemented",
      "calculatorId": "g24-8",
      "href": "calculator.html?atlasTool=g24-8#labAtlasTools",
      "formula": "Ширина 95% интервала Wilson = 2z sqrt(p(1−p)/n + z²/(4n²))/(1+z²/n), z=1.95996398454.",
      "outputUnit": "п.п.",
      "trigger": "live",
      "inputs": [
        {
          "key": "bad",
          "label": "Дефектных изделий",
          "example": 10,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "n",
          "label": "Объём независимой выборки",
          "example": 100,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Двусторонний интервал Wilson для биномиальной доли. Здесь выводится полная ширина интервала, не границы и не AQL.",
      "reference": {
        "expected": 11.913652444423835,
        "actual": 11.9136524444,
        "unit": "п.п.",
        "tolerance": 1.1913652444423835e-7,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g24-9",
      "group": "g24",
      "groupTitle": "Метрология качества и SPC",
      "topic": "Доверительный интервал среднего",
      "status": "implemented",
      "calculatorId": "g24-9",
      "href": "calculator.html?atlasTool=g24-9#labAtlasTools",
      "formula": "Полуширина доверительного интервала среднего = t × s/sqrt(n).",
      "outputUnit": "единиц измерения",
      "trigger": "live",
      "inputs": [
        {
          "key": "values",
          "label": "Независимые измерения через ;",
          "example": "8;10;12",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "critical",
          "label": "Двусторонний критический t для ваших n и уровня доверия",
          "example": 4.30265272974946,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "t для n−1 степеней свободы задаётся по проверенной таблице. Пример: n=3, 95%.",
      "reference": {
        "expected": 4.96827542350066,
        "actual": 4.9682754235,
        "unit": "единиц измерения",
        "tolerance": 4.9682754235006595e-8,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g24-10",
      "group": "g24",
      "groupTitle": "Метрология качества и SPC",
      "topic": "Размер выборки для доли",
      "status": "implemented",
      "calculatorId": "g24-10",
      "href": "calculator.html?atlasTool=g24-10#labAtlasTools",
      "formula": "n = ceil(z² × p(1−p)/e²).",
      "outputUnit": "наблюдений",
      "trigger": "live",
      "inputs": [
        {
          "key": "confidence",
          "label": "Предполагаемая доля p, % (не уровень доверия)",
          "example": 50,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        },
        {
          "key": "z",
          "label": "Нормальный квантиль",
          "example": 1.96,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "error",
          "label": "Допустимая абсолютная ошибка, п.п.",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Нормальное приближение для планирования простой случайной выборки; квантиль задаёт двусторонний уровень доверия. Без поправки на конечную совокупность; при редких событиях нужен точный план, не AQL.",
      "reference": {
        "expected": 385,
        "actual": 385,
        "unit": "наблюдений",
        "tolerance": 0.00000385,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g24-11",
      "group": "g24",
      "groupTitle": "Метрология качества и SPC",
      "topic": "Ошибка первого рода",
      "status": "implemented",
      "calculatorId": "g24-11",
      "href": "calculator.html?atlasTool=g24-11#labAtlasTools",
      "formula": "α = 2 × (1 − Φ(z)) × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "critical",
          "label": "Двустороннее критическое |z| нормального Z-критерия",
          "example": 1.96,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Только двусторонний нормальный Z-критерий. Аппроксимация CDF: абсолютная ошибка вероятности порядка 10⁻⁷. Для t, χ² и других критериев эта модель не подходит.",
      "reference": {
        "expected": 4.999579029644087,
        "actual": 4.99956503133,
        "unit": "%",
        "tolerance": 0.00002,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g24-12",
      "group": "g24",
      "groupTitle": "Метрология качества и SPC",
      "topic": "Карта X-bar/R",
      "status": "implemented",
      "calculatorId": "g24-12",
      "href": "calculator.html?atlasTool=g24-12#labAtlasTools",
      "formula": "Xbar: CL=среднее средних, UCL/LCL=CL±0.577 Rbar; R: UCL=2.114 Rbar, LCL=0.",
      "outputUnit": "CL Xbar",
      "trigger": "live",
      "inputs": [
        {
          "key": "averages",
          "label": "Средние подгрупп размера ровно 5; через ;",
          "example": "9;10;11",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "ranges",
          "label": "Размахи тех же подгрупп; через ;",
          "example": "2;2;2",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Только постоянные рациональные подгруппы по 5 независимых измерений. Коэффициенты n=5; пределы не равны границам допуска.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "CL Xbar",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g24-13",
      "group": "g24",
      "groupTitle": "Метрология качества и SPC",
      "topic": "Карта I-MR",
      "status": "implemented",
      "calculatorId": "g24-13",
      "href": "calculator.html?atlasTool=g24-13#labAtlasTools",
      "formula": "I: CL=среднее, UCL/LCL=CL±2.66 MRbar; MR по соседним парам, UCL=3.267 MRbar.",
      "outputUnit": "CL I",
      "trigger": "live",
      "inputs": [
        {
          "key": "values",
          "label": "Последовательные одиночные измерения через ;",
          "example": "9;10;11",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Скользящий размах двух последовательных наблюдений; предполагаются независимые данные и установленная базовая фаза процесса.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "CL I",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g24-14",
      "group": "g24",
      "groupTitle": "Метрология качества и SPC",
      "topic": "Контрольная карта p",
      "status": "implemented",
      "calculatorId": "g24-14",
      "href": "calculator.html?atlasTool=g24-14#labAtlasTools",
      "formula": "p̄ = сумма дефектных/(число подгрупп × n); UCL/LCL = p̄ ± 3sqrt(p̄(1−p̄)/n), с ограничением 0…1.",
      "outputUnit": "% средняя доля",
      "trigger": "live",
      "inputs": [
        {
          "key": "counts",
          "label": "Дефектных единиц по последовательным подгруппам; через ;",
          "example": "10;10;10",
          "positive": false,
          "integer": true,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "n",
          "label": "Одинаковый объём каждой подгруппы",
          "example": 100,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "p-карта для одинакового n, независимых биномиальных наблюдений и заданной базовой фазы. Контрольные пределы не равны допуску качества.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "% средняя доля",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g24-15",
      "group": "g24",
      "groupTitle": "Метрология качества и SPC",
      "topic": "Индекс повторяемости",
      "status": "implemented",
      "calculatorId": "g24-15",
      "href": "calculator.html?atlasTool=g24-15#labAtlasTools",
      "formula": "Доля дисперсии повторяемости = s_repeat² / s_total² × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "repeat",
          "label": "Стандартное отклонение повторяемости",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "total",
          "label": "Полное стандартное отклонение",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не заменяет полный план Gage R&R.",
      "reference": {
        "expected": 25,
        "actual": 25,
        "unit": "%",
        "tolerance": 2.5e-7,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g24-16",
      "group": "g24",
      "groupTitle": "Метрология качества и SPC",
      "topic": "GRR по заданным компонентам σEV и σAV",
      "status": "implemented",
      "calculatorId": "g24-16",
      "href": "calculator.html?atlasTool=g24-16#labAtlasTools",
      "formula": "%GRR = sqrt(σEV² + σAV²) / σtotal × 100.",
      "outputUnit": "% GRR",
      "trigger": "live",
      "inputs": [
        {
          "key": "repeat",
          "label": "Повторяемость σEV",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "operators",
          "label": "Воспроизводимость σAV",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "total",
          "label": "Полное σ процесса",
          "example": 4,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Компоненты должны быть получены из корректного исследования Gage R&R. Не определяет компоненты из произвольных повторов.",
      "reference": {
        "expected": 35.35533905932738,
        "actual": 35.3553390593,
        "unit": "% GRR",
        "tolerance": 3.535533905932738e-7,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g24-17",
      "group": "g24",
      "groupTitle": "Метрология качества и SPC",
      "topic": "ANOVA по операторам",
      "status": "implemented",
      "calculatorId": "g24-17",
      "href": "calculator.html?atlasTool=g24-17#labAtlasTools",
      "formula": "Однофакторная ANOVA: F = (SSмежду/(k−1))/(SSвнутри/(N−k)).",
      "outputUnit": "F",
      "trigger": "live",
      "inputs": [
        {
          "key": "groups",
          "label": "Каждый оператор — отдельная строка; повторы через ;",
          "example": "1;2;3\n2;3;4",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": true,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Однофакторная модель: независимые нормальные ошибки с равной дисперсией. Без взаимодействия оператор×деталь; не полный crossed Gage R&R.",
      "reference": {
        "expected": 1.5,
        "actual": 1.5,
        "unit": "F",
        "tolerance": 1.5000000000000002e-8,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g24-18",
      "group": "g24",
      "groupTitle": "Метрология качества и SPC",
      "topic": "Линейность характеристики прибора по смещению",
      "status": "implemented",
      "calculatorId": "g24-18",
      "href": "calculator.html?atlasTool=g24-18#labAtlasTools",
      "formula": "Смещение=показание−опорное; линейность оценивается наклоном смещения по опорному значению.",
      "outputUnit": "наклон смещения",
      "trigger": "live",
      "inputs": [
        {
          "key": "reference",
          "label": "Опорные значения через ;",
          "example": "1;2;3",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "measured",
          "label": "Показания прибора через ;",
          "example": "1.1;2.2;3.3",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Линейность характеристики прибора по смещению в диапазоне. Не геометрическая прямолинейность поверхности и не нормативная поверка.",
      "reference": {
        "expected": 0.1,
        "actual": 0.1,
        "unit": "наклон смещения",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g24-19",
      "group": "g24",
      "groupTitle": "Метрология качества и SPC",
      "topic": "Коэффициент согласия двух замеров",
      "status": "implemented",
      "calculatorId": "g24-19",
      "href": "calculator.html?atlasTool=g24-19#labAtlasTools",
      "formula": "Коэффициент согласия Lin CCC = 2cov(x,y)/(var(x)+var(y)+(среднее x−среднее y)²), моменты с делителем n.",
      "outputUnit": "CCC Lin",
      "trigger": "live",
      "inputs": [
        {
          "key": "first",
          "label": "Первый набор измерений через ;",
          "example": "1;2;3",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "second",
          "label": "Второй набор измерений через ;",
          "example": "2;4;6",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Коэффициент согласия, учитывающий масштаб и постоянное смещение. Не подменяется корреляцией Pearson. Равные постоянные ряды не позволяют оценить этот коэффициент.",
      "reference": {
        "expected": 0.36363636363636365,
        "actual": 0.363636363636,
        "unit": "CCC Lin",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g24-20",
      "group": "g24",
      "groupTitle": "Метрология качества и SPC",
      "topic": "Анализ Парето дефектов",
      "status": "implemented",
      "calculatorId": "g24-20",
      "href": "calculator.html?atlasTool=g24-20#labAtlasTools",
      "formula": "Доля ведущих причин = сумма top наибольших частот / сумма всех частот × 100.",
      "outputUnit": "% ведущих причин",
      "trigger": "live",
      "inputs": [
        {
          "key": "counts",
          "label": "Количество дефектов по категориям; разделитель ;",
          "example": "50;30;20",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "top",
          "label": "Количество ведущих категорий",
          "example": 2,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Числовой анализ Парето по введённым категориям; категории предварительно независимы и не перекрываются.",
      "reference": {
        "expected": 80,
        "actual": 80,
        "unit": "% ведущих причин",
        "tolerance": 8e-7,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g24-21",
      "group": "g24",
      "groupTitle": "Метрология качества и SPC",
      "topic": "Сдвиг процесса по границам",
      "status": "implemented",
      "calculatorId": "g24-21",
      "href": "calculator.html?atlasTool=g24-21#labAtlasTools",
      "formula": "Сдвиг = (среднее − целевое)/σ.",
      "outputUnit": "σ",
      "trigger": "live",
      "inputs": [
        {
          "key": "mean",
          "label": "Среднее процесса",
          "example": 6,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "target",
          "label": "Целевое среднее",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "sigma",
          "label": "Внутрипроцессное σ",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Требуется согласованная оценка σ и стабильная базовая линия.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "σ",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g24-22",
      "group": "g24",
      "groupTitle": "Метрология качества и SPC",
      "topic": "Удельные затраты на брак",
      "status": "implemented",
      "calculatorId": "g24-22",
      "href": "calculator.html?atlasTool=g24-22#labAtlasTools",
      "formula": "Удельные потери = затраты на брак / произведено.",
      "outputUnit": "₽/шт",
      "trigger": "live",
      "inputs": [
        {
          "key": "loss",
          "label": "Полные затраты на брак, ₽",
          "example": 10000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "qty",
          "label": "Произведено изделий",
          "example": 1000,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Знаменатель — весь выпуск, не только брак.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "₽/шт",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://metricmech.com/"
    },
    {
      "id": "g25-1",
      "group": "g25",
      "groupTitle": "Авиация и аэродинамика",
      "topic": "Путевая скорость по ветру",
      "status": "implemented",
      "calculatorId": "g25-1",
      "href": "calculator.html?atlasTool=g25-1#labAtlasTools",
      "formula": "Путевая скорость = модуль суммы воздушного вектора и ветра КУДА.",
      "outputUnit": "узлов GS",
      "trigger": "live",
      "inputs": [
        {
          "key": "tas",
          "label": "TAS, узлы",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "heading",
          "label": "Истинный курс, °",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 360,
          "choices": null
        },
        {
          "key": "wind",
          "label": "Скорость ветра, узлы",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "from",
          "label": "Ветер ОТКУДА, °",
          "example": 180,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 360,
          "choices": null
        }
      ],
      "limits": "Скорости в одной горизонтальной плоскости; не прогноз по маршруту.",
      "reference": {
        "expected": 120,
        "actual": 120,
        "unit": "узлов GS",
        "tolerance": 0.0000012,
        "status": "passed"
      },
      "researchSource": "https://e6bcalculator.com/"
    },
    {
      "id": "g25-2",
      "group": "g25",
      "groupTitle": "Авиация и аэродинамика",
      "topic": "Поправка на боковой ветер",
      "status": "implemented",
      "calculatorId": "g25-2",
      "href": "calculator.html?atlasTool=g25-2#labAtlasTools",
      "formula": "WCA = asin(ветер × sin(откуда − путь)/TAS).",
      "outputUnit": "градусы поправки",
      "trigger": "live",
      "inputs": [
        {
          "key": "tas",
          "label": "Истинная воздушная скорость TAS, узлы",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "track",
          "label": "Заданный истинный путевой угол, °",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 360,
          "choices": null
        },
        {
          "key": "wind",
          "label": "Скорость ветра, узлы",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "from",
          "label": "Истинное направление ветра ОТКУДА, °",
          "example": 90,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 360,
          "choices": null
        }
      ],
      "limits": "Поправка прибавляется к заданному пути. Ветер справа даёт положительную поправку вправо.",
      "reference": {
        "expected": 5.739170477266787,
        "actual": 5.73917047727,
        "unit": "градусы поправки",
        "tolerance": 5.739170477266787e-8,
        "status": "passed"
      },
      "researchSource": "https://e6bcalculator.com/"
    },
    {
      "id": "g25-3",
      "group": "g25",
      "groupTitle": "Авиация и аэродинамика",
      "topic": "Курс с поправкой на ветер",
      "status": "implemented",
      "calculatorId": "g25-3",
      "href": "calculator.html?atlasTool=g25-3#labAtlasTools",
      "formula": "Истинный курс = заданный путь + WCA, modulo 360.",
      "outputUnit": "градусы курса",
      "trigger": "live",
      "inputs": [
        {
          "key": "tas",
          "label": "Истинная воздушная скорость TAS, узлы",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "track",
          "label": "Заданный истинный путевой угол, °",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 360,
          "choices": null
        },
        {
          "key": "wind",
          "label": "Скорость ветра, узлы",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "from",
          "label": "Истинное направление ветра ОТКУДА, °",
          "example": 90,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 360,
          "choices": null
        }
      ],
      "limits": "Горизонтальный треугольник скоростей по заданному ветру, не навигационная рекомендация.",
      "reference": {
        "expected": 5.739170477266787,
        "actual": 5.73917047727,
        "unit": "градусы курса",
        "tolerance": 5.739170477266787e-8,
        "status": "passed"
      },
      "researchSource": "https://e6bcalculator.com/"
    },
    {
      "id": "g25-4",
      "group": "g25",
      "groupTitle": "Авиация и аэродинамика",
      "topic": "Давление стандартной атмосферы ISA",
      "status": "implemented",
      "calculatorId": "g25-4",
      "href": "calculator.html?atlasTool=g25-4#labAtlasTools",
      "formula": "p = 101325 × (T/288.15)^(g/(RL)); T=288.15−0.0065h.",
      "outputUnit": "Па",
      "trigger": "live",
      "inputs": [
        {
          "key": "height",
          "label": "Геометрическая высота модели ISA, м",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": -500,
          "max": 11000,
          "choices": null
        }
      ],
      "limits": "Сухая ISA-тропосфера, диапазон −500…11 000 м; геопотенциальная/геометрическая разность пренебрежимо принята в учебной модели.",
      "reference": {
        "expected": 101325,
        "actual": 101325,
        "unit": "Па",
        "tolerance": 0.00101325,
        "status": "passed"
      },
      "researchSource": "https://e6bcalculator.com/"
    },
    {
      "id": "g25-5",
      "group": "g25",
      "groupTitle": "Авиация и аэродинамика",
      "topic": "Плотность воздуха на высоте",
      "status": "implemented",
      "calculatorId": "g25-5",
      "href": "calculator.html?atlasTool=g25-5#labAtlasTools",
      "formula": "ρ = pISA/(R TISA).",
      "outputUnit": "кг/м³",
      "trigger": "live",
      "inputs": [
        {
          "key": "height",
          "label": "Геометрическая высота модели ISA, м",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": -500,
          "max": 11000,
          "choices": null
        }
      ],
      "limits": "Те же границы сухой ISA-тропосферы, не фактическая плотность текущей атмосферы.",
      "reference": {
        "expected": 1.225000018124288,
        "actual": 1.22500001812,
        "unit": "кг/м³",
        "tolerance": 1.225000018124288e-8,
        "status": "passed"
      },
      "researchSource": "https://e6bcalculator.com/"
    },
    {
      "id": "g25-6",
      "group": "g25",
      "groupTitle": "Авиация и аэродинамика",
      "topic": "Высота по давлению",
      "status": "implemented",
      "calculatorId": "g25-6",
      "href": "calculator.html?atlasTool=g25-6#labAtlasTools",
      "formula": "hISA = (T0/L) × (1 − (p/p0)^(1/экспонента)).",
      "outputUnit": "м ISA",
      "trigger": "live",
      "inputs": [
        {
          "key": "pressure",
          "label": "Абсолютное статическое давление, Па",
          "example": 101325,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Барометрическая высота в заданной модели, не высота над местностью.",
      "reference": {
        "expected": 0,
        "actual": 0,
        "unit": "м ISA",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://e6bcalculator.com/"
    },
    {
      "id": "g25-7",
      "group": "g25",
      "groupTitle": "Авиация и аэродинамика",
      "topic": "Плотностная высота",
      "status": "implemented",
      "calculatorId": "g25-7",
      "href": "calculator.html?atlasTool=g25-7#labAtlasTools",
      "formula": "ρфакт = p/(RT); hρ = (T0/L)[1 − (ρфакт/ρ0)^(1/(экспонента−1))].",
      "outputUnit": "м плотностной высоты",
      "trigger": "live",
      "inputs": [
        {
          "key": "pressure",
          "label": "Абсолютное статическое давление, Па",
          "example": 101325,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "temperature",
          "label": "Фактическая температура, °C",
          "example": 15,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Сухой воздух, без влияния влажности; не сертифицированная лётная характеристика.",
      "reference": {
        "expected": 0,
        "actual": 0,
        "unit": "м плотностной высоты",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://e6bcalculator.com/"
    },
    {
      "id": "g25-8",
      "group": "g25",
      "groupTitle": "Авиация и аэродинамика",
      "topic": "Истинная воздушная скорость TAS",
      "status": "implemented",
      "calculatorId": "g25-8",
      "href": "calculator.html?atlasTool=g25-8#labAtlasTools",
      "formula": "TAS = EAS sqrt(1.225/ρ).",
      "outputUnit": "м/с TAS",
      "trigger": "live",
      "inputs": [
        {
          "key": "eas",
          "label": "Эквивалентная воздушная скорость EAS, м/с",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Фактическая плотность, кг/м³",
          "example": 1.225,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Вход именно EAS, не необработанная IAS. Коррекция прибора и сжимаемости должна быть сделана отдельно.",
      "reference": {
        "expected": 100,
        "actual": 100,
        "unit": "м/с TAS",
        "tolerance": 0.000001,
        "status": "passed"
      },
      "researchSource": "https://e6bcalculator.com/"
    },
    {
      "id": "g25-9",
      "group": "g25",
      "groupTitle": "Авиация и аэродинамика",
      "topic": "Скорость Маха",
      "status": "implemented",
      "calculatorId": "g25-9",
      "href": "calculator.html?atlasTool=g25-9#labAtlasTools",
      "formula": "M = V/a.",
      "outputUnit": "Mach",
      "trigger": "live",
      "inputs": [
        {
          "key": "velocity",
          "label": "Истинная скорость, м/с",
          "example": 340,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "sound",
          "label": "Локальная скорость звука, м/с",
          "example": 340,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Скорость звука для фактической температуры и среды.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "Mach",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://e6bcalculator.com/"
    },
    {
      "id": "g25-10",
      "group": "g25",
      "groupTitle": "Авиация и аэродинамика",
      "topic": "Продолжительность полёта по участкам",
      "status": "implemented",
      "calculatorId": "g25-10",
      "href": "calculator.html?atlasTool=g25-10#labAtlasTools",
      "formula": "Полётное время = Σ расстояние участка/GS участка.",
      "outputUnit": "ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "distance",
          "label": "Длины участков, км; через ;",
          "example": "100;200",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "speed",
          "label": "Путевые скорости участков, км/ч; через ;",
          "example": "100;100",
          "positive": true,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без ожидания, руления, резервов и погодного прогноза.",
      "reference": {
        "expected": 3,
        "actual": 3,
        "unit": "ч",
        "tolerance": 3.0000000000000004e-8,
        "status": "passed"
      },
      "researchSource": "https://e6bcalculator.com/"
    },
    {
      "id": "g25-11",
      "group": "g25",
      "groupTitle": "Авиация и аэродинамика",
      "topic": "Расчёт снижения по вертикальной скорости",
      "status": "implemented",
      "calculatorId": "g25-11",
      "href": "calculator.html?atlasTool=g25-11#labAtlasTools",
      "formula": "Время = потеря высоты/вертикальная скорость.",
      "outputUnit": "с",
      "trigger": "live",
      "inputs": [
        {
          "key": "height",
          "label": "Нужно потерять высоту, м",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "vertical",
          "label": "Заданная вертикальная скорость снижения, м/с",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Постоянная вертикальная скорость, без выравнивания и ограничений воздушного судна.",
      "reference": {
        "expected": 200,
        "actual": 200,
        "unit": "с",
        "tolerance": 0.000002,
        "status": "passed"
      },
      "researchSource": "https://e6bcalculator.com/"
    },
    {
      "id": "g25-12",
      "group": "g25",
      "groupTitle": "Авиация и аэродинамика",
      "topic": "Время набора высоты",
      "status": "implemented",
      "calculatorId": "g25-12",
      "href": "calculator.html?atlasTool=g25-12#labAtlasTools",
      "formula": "Время = высота/средняя вертикальная скорость.",
      "outputUnit": "с",
      "trigger": "live",
      "inputs": [
        {
          "key": "height",
          "label": "Набираемая высота, м",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "vertical",
          "label": "Средняя вертикальная скорость набора, м/с",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Средняя скороподъёмность должна быть подтверждена для условий.",
      "reference": {
        "expected": 200,
        "actual": 200,
        "unit": "с",
        "tolerance": 0.000002,
        "status": "passed"
      },
      "researchSource": "https://e6bcalculator.com/"
    },
    {
      "id": "g25-13",
      "group": "g25",
      "groupTitle": "Авиация и аэродинамика",
      "topic": "Дальность планирования",
      "status": "implemented",
      "calculatorId": "g25-13",
      "href": "calculator.html?atlasTool=g25-13#labAtlasTools",
      "formula": "Горизонтальная дальность в неподвижном воздухе = высота × L/D.",
      "outputUnit": "км",
      "trigger": "live",
      "inputs": [
        {
          "key": "height",
          "label": "Доступная высота, м",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "ratio",
          "label": "Заданное аэродинамическое качество L/D",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Стационарное планирование, без ветра, манёвров и безопасного запаса.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "км",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://e6bcalculator.com/"
    },
    {
      "id": "g25-14",
      "group": "g25",
      "groupTitle": "Авиация и аэродинамика",
      "topic": "Дальность по расходу топлива",
      "status": "implemented",
      "calculatorId": "g25-14",
      "href": "calculator.html?atlasTool=g25-14#labAtlasTools",
      "formula": "Дальность = доступное топливо/расход × GS.",
      "outputUnit": "км",
      "trigger": "live",
      "inputs": [
        {
          "key": "fuel",
          "label": "Доступная для данного этапа масса топлива, кг",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "burn",
          "label": "Заданный расход, кг/ч",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "gs",
          "label": "Средняя путевая скорость, км/ч",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Резервы уже исключаются из доступного топлива; не расчёт разрешённой дальности полёта.",
      "reference": {
        "expected": 1000,
        "actual": 1000,
        "unit": "км",
        "tolerance": 0.00001,
        "status": "passed"
      },
      "researchSource": "https://e6bcalculator.com/"
    },
    {
      "id": "g25-15",
      "group": "g25",
      "groupTitle": "Авиация и аэродинамика",
      "topic": "Масса топлива по плотности",
      "status": "implemented",
      "calculatorId": "g25-15",
      "href": "calculator.html?atlasTool=g25-15#labAtlasTools",
      "formula": "Масса = объём × плотность.",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "volume",
          "label": "Объём топлива, л",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Плотность при данной температуре, кг/л",
          "example": 0.8,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Плотность по партии/температуре, не универсальная плотность авиационного топлива.",
      "reference": {
        "expected": 80,
        "actual": 80,
        "unit": "кг",
        "tolerance": 8e-7,
        "status": "passed"
      },
      "researchSource": "https://e6bcalculator.com/"
    },
    {
      "id": "g25-16",
      "group": "g25",
      "groupTitle": "Авиация и аэродинамика",
      "topic": "Балансировка массы и центра тяжести",
      "status": "implemented",
      "calculatorId": "g25-16",
      "href": "calculator.html?atlasTool=g25-16#labAtlasTools",
      "formula": "CG = Σ(mi × плечоi)/Σmi.",
      "outputUnit": "м от datum",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Массы элементов, кг; через ;",
          "example": "100;100",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "arm",
          "label": "Плечи от одного datum, м; через ;",
          "example": "1;3",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не проверяет центровочный диапазон, предел массы или ограничения конкретного борта.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "м от datum",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://e6bcalculator.com/"
    },
    {
      "id": "g25-17",
      "group": "g25",
      "groupTitle": "Авиация и аэродинамика",
      "topic": "Поперечная составляющая ветра",
      "status": "implemented",
      "calculatorId": "g25-17",
      "href": "calculator.html?atlasTool=g25-17#labAtlasTools",
      "formula": "Компонента справа = скорость ветра × sin(откуда − направление).",
      "outputUnit": "узлов справа",
      "trigger": "live",
      "inputs": [
        {
          "key": "wind",
          "label": "Скорость ветра, узлы",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "from",
          "label": "Ветер ОТКУДА, °",
          "example": 90,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 360,
          "choices": null
        },
        {
          "key": "runway",
          "label": "Направление ВПП/пути, °",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 360,
          "choices": null
        }
      ],
      "limits": "Положительная компонента — ветер справа; допустимый боковой ветер берётся из документации воздушного судна.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "узлов справа",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://e6bcalculator.com/"
    },
    {
      "id": "g25-18",
      "group": "g25",
      "groupTitle": "Авиация и аэродинамика",
      "topic": "Базовая оценка подъёмной силы",
      "status": "implemented",
      "calculatorId": "g25-18",
      "href": "calculator.html?atlasTool=g25-18#labAtlasTools",
      "formula": "L = 0.5ρV²SCL.",
      "outputUnit": "Н",
      "trigger": "live",
      "inputs": [
        {
          "key": "density",
          "label": "Плотность воздуха, кг/м³",
          "example": 1.225,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "velocity",
          "label": "TAS, м/с",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "area",
          "label": "Опорная площадь крыла, м²",
          "example": 20,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "cl",
          "label": "Заданный коэффициент подъёмной силы CL",
          "example": 0.5,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "CL задаётся для конкретных угла атаки, конфигурации и режима; не прогноз сваливания.",
      "reference": {
        "expected": 61250,
        "actual": 61250,
        "unit": "Н",
        "tolerance": 0.0006125,
        "status": "passed"
      },
      "researchSource": "https://e6bcalculator.com/"
    },
    {
      "id": "g25-19",
      "group": "g25",
      "groupTitle": "Авиация и аэродинамика",
      "topic": "Индуктивное сопротивление (модель)",
      "status": "implemented",
      "calculatorId": "g25-19",
      "href": "calculator.html?atlasTool=g25-19#labAtlasTools",
      "formula": "Di = 0.5ρV²S × CL²/(πeAR).",
      "outputUnit": "Н",
      "trigger": "live",
      "inputs": [
        {
          "key": "density",
          "label": "Плотность, кг/м³",
          "example": 1.2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "velocity",
          "label": "TAS, м/с",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "area",
          "label": "Площадь, м²",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "cl",
          "label": "CL",
          "example": 0.5,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "eff",
          "label": "Коэффициент Освальда e",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "ar",
          "label": "Удлинение крыла AR",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Линейная классическая модель конечного крыла, вне срыва; без профильного сопротивления.",
      "reference": {
        "expected": 4.77464829275686,
        "actual": 4.77464829276,
        "unit": "Н",
        "tolerance": 4.77464829275686e-8,
        "status": "passed"
      },
      "researchSource": "https://e6bcalculator.com/"
    },
    {
      "id": "g25-20",
      "group": "g25",
      "groupTitle": "Авиация и аэродинамика",
      "topic": "Профиль скорости звука",
      "status": "implemented",
      "calculatorId": "g25-20",
      "href": "calculator.html?atlasTool=g25-20#labAtlasTools",
      "formula": "a = sqrt(1.4 R TISA).",
      "outputUnit": "м/с",
      "trigger": "live",
      "inputs": [
        {
          "key": "height",
          "label": "Геометрическая высота модели ISA, м",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": -500,
          "max": 11000,
          "choices": null
        }
      ],
      "limits": "Сухая ISA-тропосфера с постоянным γ=1.4.",
      "reference": {
        "expected": 340.293988026089,
        "actual": 340.293988026,
        "unit": "м/с",
        "tolerance": 0.00000340293988026089,
        "status": "passed"
      },
      "researchSource": "https://e6bcalculator.com/"
    },
    {
      "id": "g25-21",
      "group": "g25",
      "groupTitle": "Авиация и аэродинамика",
      "topic": "Удельная тяга к массе",
      "status": "implemented",
      "calculatorId": "g25-21",
      "href": "calculator.html?atlasTool=g25-21#labAtlasTools",
      "formula": "T/W = тяга/(масса × g).",
      "outputUnit": "раз",
      "trigger": "live",
      "inputs": [
        {
          "key": "thrust",
          "label": "Суммарная тяга, Н",
          "example": 10000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "mass",
          "label": "Масса аппарата, кг",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Тяга в фактических условиях; не ускорение и не гарантия взлёта.",
      "reference": {
        "expected": 1.0197162129779282,
        "actual": 1.01971621298,
        "unit": "раз",
        "tolerance": 1.0197162129779282e-8,
        "status": "passed"
      },
      "researchSource": "https://e6bcalculator.com/"
    },
    {
      "id": "g25-22",
      "group": "g25",
      "groupTitle": "Авиация и аэродинамика",
      "topic": "Средняя скорость этапа",
      "status": "implemented",
      "calculatorId": "g25-22",
      "href": "calculator.html?atlasTool=g25-22#labAtlasTools",
      "formula": "Средняя GS = путь/время.",
      "outputUnit": "км/ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "distance",
          "label": "Расстояние этапа, км",
          "example": 200,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "hours",
          "label": "Фактическое время этапа, ч",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Путь и время относятся к одному этапу, не скорость относительно воздуха.",
      "reference": {
        "expected": 100,
        "actual": 100,
        "unit": "км/ч",
        "tolerance": 0.000001,
        "status": "passed"
      },
      "researchSource": "https://e6bcalculator.com/"
    },
    {
      "id": "g26-1",
      "group": "g26",
      "groupTitle": "Логистика, закупки, склад",
      "topic": "Экономичный размер заказа EOQ",
      "status": "implemented",
      "calculatorId": "g26-1",
      "href": "calculator.html?atlasTool=g26-1#labAtlasTools",
      "formula": "EOQ = sqrt(2DS/H).",
      "outputUnit": "шт",
      "trigger": "live",
      "inputs": [
        {
          "key": "demand",
          "label": "Годовой спрос, шт/год",
          "example": 10000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "order",
          "label": "Затраты одного заказа, ₽",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "holding",
          "label": "Годовые затраты хранения единицы, ₽/(шт·год)",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Классическая модель Уилсона: постоянный спрос, мгновенное пополнение, без дефицита и скидок. Ответ непрерывный, размер упаковки отдельно.",
      "reference": {
        "expected": 1000,
        "actual": 1000,
        "unit": "шт",
        "tolerance": 0.00001,
        "status": "passed"
      },
      "researchSource": "https://supplychain.tools/calculators"
    },
    {
      "id": "g26-2",
      "group": "g26",
      "groupTitle": "Логистика, закупки, склад",
      "topic": "Точка повторного заказа ROP",
      "status": "implemented",
      "calculatorId": "g26-2",
      "href": "calculator.html?atlasTool=g26-2#labAtlasTools",
      "formula": "ROP = средний спрос × срок поставки + страховой запас.",
      "outputUnit": "шт",
      "trigger": "live",
      "inputs": [
        {
          "key": "daily",
          "label": "Средний спрос, шт/день",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "lead",
          "label": "Срок поставки, дней",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "safety",
          "label": "Страховой запас, шт",
          "example": 200,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Спрос и срок в одинаковых календарных/рабочих днях.",
      "reference": {
        "expected": 700,
        "actual": 700,
        "unit": "шт",
        "tolerance": 0.000007,
        "status": "passed"
      },
      "researchSource": "https://supplychain.tools/calculators"
    },
    {
      "id": "g26-3",
      "group": "g26",
      "groupTitle": "Логистика, закупки, склад",
      "topic": "Страховой запас",
      "status": "implemented",
      "calculatorId": "g26-3",
      "href": "calculator.html?atlasTool=g26-3#labAtlasTools",
      "formula": "SS = z σспроса sqrt(L).",
      "outputUnit": "шт",
      "trigger": "live",
      "inputs": [
        {
          "key": "z",
          "label": "Заданный нормальный квантиль уровня сервиса",
          "example": 1.645,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "sigma",
          "label": "σ суточного спроса, шт",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "lead",
          "label": "Постоянный срок поставки, дней",
          "example": 4,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Независимый суточный нормальный спрос, постоянный lead time; не fill rate и не модель переменного срока.",
      "reference": {
        "expected": 32.9,
        "actual": 32.9,
        "unit": "шт",
        "tolerance": 3.29e-7,
        "status": "passed"
      },
      "researchSource": "https://supplychain.tools/calculators"
    },
    {
      "id": "g26-4",
      "group": "g26",
      "groupTitle": "Логистика, закупки, склад",
      "topic": "Запас в днях",
      "status": "implemented",
      "calculatorId": "g26-4",
      "href": "calculator.html?atlasTool=g26-4#labAtlasTools",
      "formula": "Дней запаса = запас / суточный расход.",
      "outputUnit": "дней",
      "trigger": "live",
      "inputs": [
        {
          "key": "stock",
          "label": "Доступный запас, шт",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "daily",
          "label": "Средний расход, шт/день",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не учитывает будущие поступления и сезонность.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "дней",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://supplychain.tools/calculators"
    },
    {
      "id": "g26-5",
      "group": "g26",
      "groupTitle": "Логистика, закупки, склад",
      "topic": "Скорость оборота запаса",
      "status": "implemented",
      "calculatorId": "g26-5",
      "href": "calculator.html?atlasTool=g26-5#labAtlasTools",
      "formula": "Оборот = расход за период / средний запас.",
      "outputUnit": "оборотов/период",
      "trigger": "live",
      "inputs": [
        {
          "key": "consumed",
          "label": "Потребление за период, ₽",
          "example": 120000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "average",
          "label": "Средний запас за тот же период, ₽",
          "example": 10000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не смешивайте стоимость с количеством и разные периоды.",
      "reference": {
        "expected": 12,
        "actual": 12,
        "unit": "оборотов/период",
        "tolerance": 1.2000000000000002e-7,
        "status": "passed"
      },
      "researchSource": "https://supplychain.tools/calculators"
    },
    {
      "id": "g26-6",
      "group": "g26",
      "groupTitle": "Логистика, закупки, склад",
      "topic": "ABC-анализ SKU",
      "status": "implemented",
      "calculatorId": "g26-6",
      "href": "calculator.html?atlasTool=g26-6#labAtlasTools",
      "formula": "SKU сортируются по убыванию; класс по накопленной доле до включённой позиции.",
      "outputUnit": "SKU класса A",
      "trigger": "live",
      "inputs": [
        {
          "key": "values",
          "label": "Годовая стоимость потребления SKU, ₽; через ;",
          "example": "80;15;5",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "a",
          "label": "Верхняя кумулятивная граница A, %",
          "example": 80,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        },
        {
          "key": "b",
          "label": "Верхняя граница B, %",
          "example": 95,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Правило классификации явно задано кумулятивной долей после позиции; крупный SKU может сразу пересечь порог A.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "SKU класса A",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://supplychain.tools/calculators"
    },
    {
      "id": "g26-7",
      "group": "g26",
      "groupTitle": "Логистика, закупки, склад",
      "topic": "XYZ-анализ вариации спроса",
      "status": "implemented",
      "calculatorId": "g26-7",
      "href": "calculator.html?atlasTool=g26-7#labAtlasTools",
      "formula": "CV = выборочное s/среднее × 100; X ≤ порога X, Y ≤ порога Y, иначе Z.",
      "outputUnit": "% CV",
      "trigger": "live",
      "inputs": [
        {
          "key": "demand",
          "label": "Спрос по равным периодам через ;",
          "example": "90;100;110",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "x",
          "label": "Верхняя граница X по CV, %",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "y",
          "label": "Верхняя граница Y по CV, %",
          "example": 25,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Пороговые значения — выбранная политика, не универсальный стандарт. Без устранения сезонности.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "% CV",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://supplychain.tools/calculators"
    },
    {
      "id": "g26-8",
      "group": "g26",
      "groupTitle": "Логистика, закупки, склад",
      "topic": "Срок поставки Lead Time",
      "status": "implemented",
      "calculatorId": "g26-8",
      "href": "calculator.html?atlasTool=g26-8#labAtlasTools",
      "formula": "Lead time = приёмка − заказ.",
      "outputUnit": "рабочих дней",
      "trigger": "live",
      "inputs": [
        {
          "key": "ordered",
          "label": "Момент заказа, рабочие дни от начала периода",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "received",
          "label": "Момент приёмки, рабочие дни от начала периода",
          "example": 7,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Числовая шкала дней; календарь выходных и праздников не создаётся автоматически.",
      "reference": {
        "expected": 5,
        "actual": 5,
        "unit": "рабочих дней",
        "tolerance": 5e-8,
        "status": "passed"
      },
      "researchSource": "https://supplychain.tools/calculators"
    },
    {
      "id": "g26-9",
      "group": "g26",
      "groupTitle": "Логистика, закупки, склад",
      "topic": "Процент выполнения заказа OTIF",
      "status": "implemented",
      "calculatorId": "g26-9",
      "href": "calculator.html?atlasTool=g26-9#labAtlasTools",
      "formula": "OTIF = одновременно вовремя и полностью / все заказы × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "otif",
          "label": "Заказов одновременно вовремя и полностью",
          "example": 90,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "all",
          "label": "Заказов за период",
          "example": 100,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Не произведение двух отдельных процентов on-time и in-full.",
      "reference": {
        "expected": 90,
        "actual": 90,
        "unit": "%",
        "tolerance": 9.000000000000001e-7,
        "status": "passed"
      },
      "researchSource": "https://supplychain.tools/calculators"
    },
    {
      "id": "g26-10",
      "group": "g26",
      "groupTitle": "Логистика, закупки, склад",
      "topic": "Заполняемость паллеты",
      "status": "implemented",
      "calculatorId": "g26-10",
      "href": "calculator.html?atlasTool=g26-10#labAtlasTools",
      "formula": "Максимум из двух одинаково ориентированных прямоугольных раскладок.",
      "outputUnit": "коробов/слой",
      "trigger": "live",
      "inputs": [
        {
          "key": "width",
          "label": "Ширина паллеты, мм",
          "example": 1200,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Длина паллеты, мм",
          "example": 800,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "boxw",
          "label": "Ширина короба, мм",
          "example": 400,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "boxl",
          "label": "Длина короба, мм",
          "example": 200,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Один слой без свеса; смешанные ориентации, масса и высота не оптимизируются.",
      "reference": {
        "expected": 12,
        "actual": 12,
        "unit": "коробов/слой",
        "tolerance": 1.2000000000000002e-7,
        "status": "passed"
      },
      "researchSource": "https://supplychain.tools/calculators"
    },
    {
      "id": "g26-11",
      "group": "g26",
      "groupTitle": "Логистика, закупки, склад",
      "topic": "Объём груза CBM",
      "status": "implemented",
      "calculatorId": "g26-11",
      "href": "calculator.html?atlasTool=g26-11#labAtlasTools",
      "formula": "CBM = длина × ширина × высота × места.",
      "outputUnit": "м³",
      "trigger": "live",
      "inputs": [
        {
          "key": "width",
          "label": "Ширина места, м",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Длина, м",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "height",
          "label": "Высота, м",
          "example": 0.5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "qty",
          "label": "Мест",
          "example": 10,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Внешние габариты одинаковых грузовых мест.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "м³",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://supplychain.tools/calculators"
    },
    {
      "id": "g26-12",
      "group": "g26",
      "groupTitle": "Логистика, закупки, склад",
      "topic": "Размерно-весовой тариф",
      "status": "implemented",
      "calculatorId": "g26-12",
      "href": "calculator.html?atlasTool=g26-12#labAtlasTools",
      "formula": "Тарифицируемая масса = max(фактическая, Д×Ш×В/делитель).",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "width",
          "label": "Ширина, см",
          "example": 40,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Длина, см",
          "example": 50,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "height",
          "label": "Высота, см",
          "example": 30,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "divisor",
          "label": "Делитель перевозчика, см³/кг",
          "example": 5000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "actual",
          "label": "Фактическая масса, кг",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Делитель, округление и тариф проверяйте у перевозчика; цена здесь не рассчитывается.",
      "reference": {
        "expected": 12,
        "actual": 12,
        "unit": "кг",
        "tolerance": 1.2000000000000002e-7,
        "status": "passed"
      },
      "researchSource": "https://supplychain.tools/calculators"
    },
    {
      "id": "g26-13",
      "group": "g26",
      "groupTitle": "Логистика, закупки, склад",
      "topic": "Масса брутто и нетто",
      "status": "implemented",
      "calculatorId": "g26-13",
      "href": "calculator.html?atlasTool=g26-13#labAtlasTools",
      "formula": "Брутто = нетто + упаковка.",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "net",
          "label": "Масса нетто, кг",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "packaging",
          "label": "Масса всей упаковки, кг",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Включайте поддоны и крепления при их учёте в брутто.",
      "reference": {
        "expected": 110,
        "actual": 110,
        "unit": "кг",
        "tolerance": 0.0000011,
        "status": "passed"
      },
      "researchSource": "https://supplychain.tools/calculators"
    },
    {
      "id": "g26-14",
      "group": "g26",
      "groupTitle": "Логистика, закупки, склад",
      "topic": "Контейнерная загрузка по объёму",
      "status": "implemented",
      "calculatorId": "g26-14",
      "href": "calculator.html?atlasTool=g26-14#labAtlasTools",
      "formula": "Количество = floor(объём × использование/100 / объём места).",
      "outputUnit": "мест",
      "trigger": "live",
      "inputs": [
        {
          "key": "container",
          "label": "Полезный объём контейнера, м³",
          "example": 60,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "item",
          "label": "Объём одного места, м³",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "fill",
          "label": "Заданное полезное использование объёма, %",
          "example": 80,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Объёмная верхняя оценка. Не гарантирует укладку по габаритам, массе и креплению.",
      "reference": {
        "expected": 24,
        "actual": 24,
        "unit": "мест",
        "tolerance": 2.4000000000000003e-7,
        "status": "passed"
      },
      "researchSource": "https://supplychain.tools/calculators"
    },
    {
      "id": "g26-15",
      "group": "g26",
      "groupTitle": "Логистика, закупки, склад",
      "topic": "Стоимость импортной партии Landed Cost",
      "status": "implemented",
      "calculatorId": "g26-15",
      "href": "calculator.html?atlasTool=g26-15#labAtlasTools",
      "formula": "Денежный расход = товар + фрахт + пошлина + НДС на (товар + фрахт + пошлина) + прочее.",
      "outputUnit": "₽",
      "trigger": "live",
      "inputs": [
        {
          "key": "goods",
          "label": "Товар, ₽",
          "example": 100000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "freight",
          "label": "Фрахт и страхование до границы, ₽",
          "example": 10000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "duty",
          "label": "Пошлина, % таможенной базы",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        },
        {
          "key": "vat",
          "label": "НДС, % базы с пошлиной",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        },
        {
          "key": "other",
          "label": "Прочие денежные расходы, ₽",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Упрощённая заданная таможенная база, без акцизов, валют и специфических ставок. НДС показан как денежный платёж, не безусловная невозмещаемая себестоимость.",
      "reference": {
        "expected": 139600,
        "actual": 139600,
        "unit": "₽",
        "tolerance": 0.001396,
        "status": "passed"
      },
      "researchSource": "https://supplychain.tools/calculators"
    },
    {
      "id": "g26-16",
      "group": "g26",
      "groupTitle": "Логистика, закупки, склад",
      "topic": "Доля складских потерь",
      "status": "implemented",
      "calculatorId": "g26-16",
      "href": "calculator.html?atlasTool=g26-16#labAtlasTools",
      "formula": "Потери = потерянное / база × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "loss",
          "label": "Потерянное количество",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "available",
          "label": "Оборот/наличие на согласованной базе",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Выберите и зафиксируйте знаменатель для сопоставления периодов.",
      "reference": {
        "expected": 5,
        "actual": 5,
        "unit": "%",
        "tolerance": 5e-8,
        "status": "passed"
      },
      "researchSource": "https://supplychain.tools/calculators"
    },
    {
      "id": "g26-17",
      "group": "g26",
      "groupTitle": "Логистика, закупки, склад",
      "topic": "Часы комплектовщиков",
      "status": "implemented",
      "calculatorId": "g26-17",
      "href": "calculator.html?atlasTool=g26-17#labAtlasTools",
      "formula": "Трудозатраты = строки / производительность.",
      "outputUnit": "чел·ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "lines",
          "label": "Строк заказа",
          "example": 1000,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "rate",
          "label": "Строк на человеко-час",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Фактическая производительность должна учитывать выбранные операции.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "чел·ч",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://supplychain.tools/calculators"
    },
    {
      "id": "g26-18",
      "group": "g26",
      "groupTitle": "Логистика, закупки, склад",
      "topic": "Производительность пикинга",
      "status": "implemented",
      "calculatorId": "g26-18",
      "href": "calculator.html?atlasTool=g26-18#labAtlasTools",
      "formula": "Производительность = строки / человеко-часы.",
      "outputUnit": "строк/(чел·ч)",
      "trigger": "live",
      "inputs": [
        {
          "key": "lines",
          "label": "Скомплектованных строк",
          "example": 1000,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "hours",
          "label": "Затрачено человеко-часов",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Сравнивайте однотипные заказы и состав работ.",
      "reference": {
        "expected": 100,
        "actual": 100,
        "unit": "строк/(чел·ч)",
        "tolerance": 0.000001,
        "status": "passed"
      },
      "researchSource": "https://supplychain.tools/calculators"
    },
    {
      "id": "g26-19",
      "group": "g26",
      "groupTitle": "Логистика, закупки, склад",
      "topic": "Расчёт количества стеллажных мест",
      "status": "implemented",
      "calculatorId": "g26-19",
      "href": "calculator.html?atlasTool=g26-19#labAtlasTools",
      "formula": "Мест = ceil(паллет / доля занятости).",
      "outputUnit": "паллетомест",
      "trigger": "live",
      "inputs": [
        {
          "key": "pallets",
          "label": "Максимальное число паллет в запасе",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "occupancy",
          "label": "Целевая доля занятости мест",
          "example": 0.8,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без расчёта прочности стеллажей, проездов и совместимости SKU.",
      "reference": {
        "expected": 125,
        "actual": 125,
        "unit": "паллетомест",
        "tolerance": 0.00000125,
        "status": "passed"
      },
      "researchSource": "https://supplychain.tools/calculators"
    },
    {
      "id": "g26-20",
      "group": "g26",
      "groupTitle": "Логистика, закупки, склад",
      "topic": "Затраты хранения паллет",
      "status": "implemented",
      "calculatorId": "g26-20",
      "href": "calculator.html?atlasTool=g26-20#labAtlasTools",
      "formula": "Затраты = паллеты × дни × тариф.",
      "outputUnit": "₽",
      "trigger": "live",
      "inputs": [
        {
          "key": "pallets",
          "label": "Среднее число паллет",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "days",
          "label": "Дней хранения",
          "example": 30,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rate",
          "label": "Тариф, ₽/(паллету·день)",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Обработка, минимальные сборы и НДС отдельно.",
      "reference": {
        "expected": 30000,
        "actual": 30000,
        "unit": "₽",
        "tolerance": 0.00030000000000000003,
        "status": "passed"
      },
      "researchSource": "https://supplychain.tools/calculators"
    },
    {
      "id": "g26-21",
      "group": "g26",
      "groupTitle": "Логистика, закупки, склад",
      "topic": "Удельные транспортные расходы",
      "status": "implemented",
      "calculatorId": "g26-21",
      "href": "calculator.html?atlasTool=g26-21#labAtlasTools",
      "formula": "Удельная стоимость = расходы / тонны.",
      "outputUnit": "₽/т",
      "trigger": "live",
      "inputs": [
        {
          "key": "cost",
          "label": "Расходы перевозки, ₽",
          "example": 10000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "tonnes",
          "label": "Перевезено, т",
          "example": 20,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Один маршрут и согласованный состав расходов.",
      "reference": {
        "expected": 500,
        "actual": 500,
        "unit": "₽/т",
        "tolerance": 0.000005,
        "status": "passed"
      },
      "researchSource": "https://supplychain.tools/calculators"
    },
    {
      "id": "g26-22",
      "group": "g26",
      "groupTitle": "Логистика, закупки, склад",
      "topic": "Калькулятор консолидации партий",
      "status": "implemented",
      "calculatorId": "g26-22",
      "href": "calculator.html?atlasTool=g26-22#labAtlasTools",
      "formula": "Экономия = Σ отдельные отправки − объединённая − дополнительные расходы.",
      "outputUnit": "₽",
      "trigger": "live",
      "inputs": [
        {
          "key": "individual",
          "label": "Стоимость отдельных отправок, ₽; через ;",
          "example": "1000;2000;3000",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "combined",
          "label": "Стоимость объединённой отправки, ₽",
          "example": 4000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "extra",
          "label": "Консолидация и дополнительное хранение, ₽",
          "example": 500,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Отрицательный результат означает удорожание; сроки и риск повреждения отдельно.",
      "reference": {
        "expected": 1500,
        "actual": 1500,
        "unit": "₽",
        "tolerance": 0.000015,
        "status": "passed"
      },
      "researchSource": "https://supplychain.tools/calculators"
    },
    {
      "id": "g27-1",
      "group": "g27",
      "groupTitle": "Экономика производства и нормирование",
      "topic": "Норма выработки рабочего",
      "status": "implemented",
      "calculatorId": "g27-1",
      "href": "calculator.html?atlasTool=g27-1#labAtlasTools",
      "formula": "Норма = floor(рабочее время / время на изделие).",
      "outputUnit": "шт",
      "trigger": "live",
      "inputs": [
        {
          "key": "available",
          "label": "Рабочее время, мин",
          "example": 480,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "standard",
          "label": "Норма времени, мин/шт",
          "example": 4,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без дополнительных перерывов, если они не вычтены из рабочего времени.",
      "reference": {
        "expected": 120,
        "actual": 120,
        "unit": "шт",
        "tolerance": 0.0000012,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g27-2",
      "group": "g27",
      "groupTitle": "Экономика производства и нормирование",
      "topic": "Расчёт сменной мощности",
      "status": "implemented",
      "calculatorId": "g27-2",
      "href": "calculator.html?atlasTool=g27-2#labAtlasTools",
      "formula": "Мощность = места × floor(время/цикл).",
      "outputUnit": "шт/смену",
      "trigger": "live",
      "inputs": [
        {
          "key": "machines",
          "label": "Одинаковых параллельных рабочих мест",
          "example": 2,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "minutes",
          "label": "Полезное время смены, мин",
          "example": 480,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "cycle",
          "label": "Цикл на изделие, мин",
          "example": 4,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Полностью параллельные места, без общего узкого звена.",
      "reference": {
        "expected": 240,
        "actual": 240,
        "unit": "шт/смену",
        "tolerance": 0.0000024,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g27-3",
      "group": "g27",
      "groupTitle": "Экономика производства и нормирование",
      "topic": "Время цикла и такт",
      "status": "implemented",
      "calculatorId": "g27-3",
      "href": "calculator.html?atlasTool=g27-3#labAtlasTools",
      "formula": "Такт = доступное время/спрос.",
      "outputUnit": "с/шт",
      "trigger": "live",
      "inputs": [
        {
          "key": "available",
          "label": "Доступное время, с",
          "example": 28800,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "demand",
          "label": "Спрос за период, шт",
          "example": 120,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Сравнивайте фактический цикл с тактом; такт не равен машинному циклу автоматически.",
      "reference": {
        "expected": 240,
        "actual": 240,
        "unit": "с/шт",
        "tolerance": 0.0000024,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g27-4",
      "group": "g27",
      "groupTitle": "Экономика производства и нормирование",
      "topic": "Коэффициент ОЕЕ",
      "status": "implemented",
      "calculatorId": "g27-4",
      "href": "calculator.html?atlasTool=g27-4#labAtlasTools",
      "formula": "OEE = A/100 × P/100 × Q/100 × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "availability",
          "label": "Доступность, %",
          "example": 80,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        },
        {
          "key": "performance",
          "label": "Производительность, %",
          "example": 90,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        },
        {
          "key": "quality",
          "label": "Качество, %",
          "example": 95,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Каждая составляющая определяется на согласованном периоде; не заменяет анализ потерь.",
      "reference": {
        "expected": 68.4,
        "actual": 68.4,
        "unit": "%",
        "tolerance": 6.84e-7,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g27-5",
      "group": "g27",
      "groupTitle": "Экономика производства и нормирование",
      "topic": "Загрузка станков",
      "status": "implemented",
      "calculatorId": "g27-5",
      "href": "calculator.html?atlasTool=g27-5#labAtlasTools",
      "formula": "Загрузка = потребное время / доступное × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "required",
          "label": "Потребные станко-часы",
          "example": 60,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "available",
          "label": "Доступные станко-часы",
          "example": 80,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Может быть больше 100%: это перегрузка плана, а не фактическая доступность.",
      "reference": {
        "expected": 75,
        "actual": 75,
        "unit": "%",
        "tolerance": 7.5e-7,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g27-6",
      "group": "g27",
      "groupTitle": "Экономика производства и нормирование",
      "topic": "Потребное количество оборудования",
      "status": "implemented",
      "calculatorId": "g27-6",
      "href": "calculator.html?atlasTool=g27-6#labAtlasTools",
      "formula": "Машин = ceil(потребность / фонд одной).",
      "outputUnit": "машин",
      "trigger": "live",
      "inputs": [
        {
          "key": "required",
          "label": "Потребно станко-часов",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "one",
          "label": "Полезных часов одной машины",
          "example": 40,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Для одинаковых взаимозаменяемых машин.",
      "reference": {
        "expected": 3,
        "actual": 3,
        "unit": "машин",
        "tolerance": 3.0000000000000004e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g27-7",
      "group": "g27",
      "groupTitle": "Экономика производства и нормирование",
      "topic": "Фонд рабочего времени",
      "status": "implemented",
      "calculatorId": "g27-7",
      "href": "calculator.html?atlasTool=g27-7#labAtlasTools",
      "formula": "Фонд = дни × часы × смены − простои.",
      "outputUnit": "ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "days",
          "label": "Рабочих дней",
          "example": 20,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "hours",
          "label": "Часов в смене",
          "example": 8,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "shifts",
          "label": "Смен в день",
          "example": 2,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "downtime",
          "label": "Плановых простоев, ч",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Для одного рабочего места; календарь задаётся пользователем.",
      "reference": {
        "expected": 300,
        "actual": 300,
        "unit": "ч",
        "tolerance": 0.000003,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g27-8",
      "group": "g27",
      "groupTitle": "Экономика производства и нормирование",
      "topic": "План-факт выпуска",
      "status": "implemented",
      "calculatorId": "g27-8",
      "href": "calculator.html?atlasTool=g27-8#labAtlasTools",
      "formula": "Выполнение плана = факт/план × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "actual",
          "label": "Фактический выпуск, шт",
          "example": 110,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "plan",
          "label": "Плановый выпуск, шт",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Допускается перевыполнение выше 100%.",
      "reference": {
        "expected": 110,
        "actual": 110,
        "unit": "%",
        "tolerance": 0.0000011,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g27-9",
      "group": "g27",
      "groupTitle": "Экономика производства и нормирование",
      "topic": "Срок производственного заказа",
      "status": "implemented",
      "calculatorId": "g27-9",
      "href": "calculator.html?atlasTool=g27-9#labAtlasTools",
      "formula": "Время = подготовка + изделия/скорость.",
      "outputUnit": "ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "qty",
          "label": "Объём заказа, шт",
          "example": 1000,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "rate",
          "label": "Годный выпуск линии, шт/ч",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "setup",
          "label": "Подготовка заказа, ч",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без очереди, календаря и зависимых поставок.",
      "reference": {
        "expected": 12,
        "actual": 12,
        "unit": "ч",
        "tolerance": 1.2000000000000002e-7,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g27-10",
      "group": "g27",
      "groupTitle": "Экономика производства и нормирование",
      "topic": "Маржинальный доход изделия",
      "status": "implemented",
      "calculatorId": "g27-10",
      "href": "calculator.html?atlasTool=g27-10#labAtlasTools",
      "formula": "Маржинальный доход = цена − переменные затраты.",
      "outputUnit": "₽/шт",
      "trigger": "live",
      "inputs": [
        {
          "key": "price",
          "label": "Цена изделия, ₽",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "variable",
          "label": "Переменные затраты на изделие, ₽",
          "example": 60,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Это вклад в покрытие постоянных затрат, не чистая прибыль.",
      "reference": {
        "expected": 40,
        "actual": 40,
        "unit": "₽/шт",
        "tolerance": 4e-7,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g27-11",
      "group": "g27",
      "groupTitle": "Экономика производства и нормирование",
      "topic": "Себестоимость производственной операции",
      "status": "implemented",
      "calculatorId": "g27-11",
      "href": "calculator.html?atlasTool=g27-11#labAtlasTools",
      "formula": "Затраты = время/60 × ставка + расходники.",
      "outputUnit": "₽/операцию",
      "trigger": "live",
      "inputs": [
        {
          "key": "minutes",
          "label": "Время операции, мин",
          "example": 30,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rate",
          "label": "Полная ставка, ₽/ч",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "consumables",
          "label": "Расходники на операцию, ₽",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не включайте расходники повторно, если они уже учтены в ставке.",
      "reference": {
        "expected": 600,
        "actual": 600,
        "unit": "₽/операцию",
        "tolerance": 0.000006,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g27-12",
      "group": "g27",
      "groupTitle": "Экономика производства и нормирование",
      "topic": "Материалоёмкость на штуку",
      "status": "implemented",
      "calculatorId": "g27-12",
      "href": "calculator.html?atlasTool=g27-12#labAtlasTools",
      "formula": "Материалоёмкость = общий расход/годные изделия.",
      "outputUnit": "кг/шт",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Общий расход материала, кг",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "good",
          "label": "Годных изделий",
          "example": 50,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Включая технологические потери, если они вошли в общий расход.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "кг/шт",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g27-13",
      "group": "g27",
      "groupTitle": "Экономика производства и нормирование",
      "topic": "Процент отходов",
      "status": "implemented",
      "calculatorId": "g27-13",
      "href": "calculator.html?atlasTool=g27-13#labAtlasTools",
      "formula": "Отходы = масса отходов/сырьё × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "waste",
          "label": "Масса отходов, кг",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "input",
          "label": "Масса сырья, кг",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не от массы готового изделия.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "%",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g27-14",
      "group": "g27",
      "groupTitle": "Экономика производства и нормирование",
      "topic": "Затраты на переделку",
      "status": "implemented",
      "calculatorId": "g27-14",
      "href": "calculator.html?atlasTool=g27-14#labAtlasTools",
      "formula": "Затраты = часы × ставка + материал.",
      "outputUnit": "₽",
      "trigger": "live",
      "inputs": [
        {
          "key": "hours",
          "label": "Труд переделки, ч",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rate",
          "label": "Стоимость часа, ₽",
          "example": 500,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "material",
          "label": "Материал переделки, ₽",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Простои и упущенная прибыль задаются отдельно.",
      "reference": {
        "expected": 6000,
        "actual": 6000,
        "unit": "₽",
        "tolerance": 0.00006,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g27-15",
      "group": "g27",
      "groupTitle": "Экономика производства и нормирование",
      "topic": "Точка безубыточности",
      "status": "implemented",
      "calculatorId": "g27-15",
      "href": "calculator.html?atlasTool=g27-15#labAtlasTools",
      "formula": "Безубыточный объём = ceil(постоянные/(цена − переменные)).",
      "outputUnit": "шт",
      "trigger": "live",
      "inputs": [
        {
          "key": "fixed",
          "label": "Постоянные затраты за период, ₽",
          "example": 100000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "price",
          "label": "Цена за единицу, ₽",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "variable",
          "label": "Переменные затраты, ₽/шт",
          "example": 60,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Постоянные цена, структура продаж и переменные затраты; налоги отдельно.",
      "reference": {
        "expected": 2500,
        "actual": 2500,
        "unit": "шт",
        "tolerance": 0.000025,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g27-16",
      "group": "g27",
      "groupTitle": "Экономика производства и нормирование",
      "topic": "Маржинальность заказа",
      "status": "implemented",
      "calculatorId": "g27-16",
      "href": "calculator.html?atlasTool=g27-16#labAtlasTools",
      "formula": "Маржинальность = (выручка − затраты)/выручка × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "revenue",
          "label": "Выручка заказа, ₽",
          "example": 100000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "cost",
          "label": "Согласованные затраты заказа, ₽",
          "example": 80000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Это доля от выручки, не наценка к затратам. Состав затрат задайте явно.",
      "reference": {
        "expected": 20,
        "actual": 20,
        "unit": "%",
        "tolerance": 2e-7,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g27-17",
      "group": "g27",
      "groupTitle": "Экономика производства и нормирование",
      "topic": "Окупаемость нового оборудования",
      "status": "implemented",
      "calculatorId": "g27-17",
      "href": "calculator.html?atlasTool=g27-17#labAtlasTools",
      "formula": "Простой срок окупаемости = инвестиции/годовой эффект.",
      "outputUnit": "лет",
      "trigger": "live",
      "inputs": [
        {
          "key": "investment",
          "label": "Первоначальные инвестиции, ₽",
          "example": 1000000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "annual",
          "label": "Постоянный годовой чистый денежный эффект, ₽/год",
          "example": 250000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без дисконтирования, изменения эффекта и остаточной стоимости.",
      "reference": {
        "expected": 4,
        "actual": 4,
        "unit": "лет",
        "tolerance": 4e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g27-18",
      "group": "g27",
      "groupTitle": "Экономика производства и нормирование",
      "topic": "Срок возврата инвестиций",
      "status": "implemented",
      "calculatorId": "g27-18",
      "href": "calculator.html?atlasTool=g27-18#labAtlasTools",
      "formula": "Год пересечения накопленных поступлений с инвестициями, линейная интерполяция внутри года.",
      "outputUnit": "лет",
      "trigger": "live",
      "inputs": [
        {
          "key": "investment",
          "label": "Инвестиции, ₽",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "cash",
          "label": "Положительные денежные поступления по годам, ₽; через ;",
          "example": "30;30;50",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без дисконтирования. Предполагается равномерное поступление внутри года.",
      "reference": {
        "expected": 2.8,
        "actual": 2.8,
        "unit": "лет",
        "tolerance": 2.8e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g27-19",
      "group": "g27",
      "groupTitle": "Экономика производства и нормирование",
      "topic": "Динамика производительности",
      "status": "implemented",
      "calculatorId": "g27-19",
      "href": "calculator.html?atlasTool=g27-19#labAtlasTools",
      "formula": "Рост = (текущая/базовая − 1) × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "after",
          "label": "Текущая производительность, шт/ч",
          "example": 120,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "before",
          "label": "Базовая производительность, шт/ч",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Сравнивайте одинаковую номенклатуру и состав рабочего времени.",
      "reference": {
        "expected": 20,
        "actual": 20,
        "unit": "%",
        "tolerance": 2e-7,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g27-20",
      "group": "g27",
      "groupTitle": "Экономика производства и нормирование",
      "topic": "Уровень дефектов на миллион",
      "status": "implemented",
      "calculatorId": "g27-20",
      "href": "calculator.html?atlasTool=g27-20#labAtlasTools",
      "formula": "PPM = дефектные/все × 10⁶.",
      "outputUnit": "ppm",
      "trigger": "live",
      "inputs": [
        {
          "key": "bad",
          "label": "Дефектных единиц",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "all",
          "label": "Общее число единиц",
          "example": 100000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Считаются дефектные единицы, а не несколько дефектов на каждой.",
      "reference": {
        "expected": 50,
        "actual": 50,
        "unit": "ppm",
        "tolerance": 5e-7,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g27-21",
      "group": "g27",
      "groupTitle": "Экономика производства и нормирование",
      "topic": "Плановая потребность в персонале",
      "status": "implemented",
      "calculatorId": "g27-21",
      "href": "calculator.html?atlasTool=g27-21#labAtlasTools",
      "formula": "Персонал = ceil(трудоёмкость/фонд одного).",
      "outputUnit": "человек",
      "trigger": "live",
      "inputs": [
        {
          "key": "labor",
          "label": "Потребная трудоёмкость, чел·ч",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "fund",
          "label": "Полезный фонд одного человека, ч",
          "example": 160,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Однородные навыки и период, без сменного покрытия по отдельным профессиям.",
      "reference": {
        "expected": 7,
        "actual": 7,
        "unit": "человек",
        "tolerance": 7e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g27-22",
      "group": "g27",
      "groupTitle": "Экономика производства и нормирование",
      "topic": "Простои по причинам",
      "status": "implemented",
      "calculatorId": "g27-22",
      "href": "calculator.html?atlasTool=g27-22#labAtlasTools",
      "formula": "Доля простоя = сумма простоев/фонд × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "downtime",
          "label": "Простои по причинам, ч; через ;",
          "example": "2;3;5",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "fund",
          "label": "Плановый фонд, ч",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Причины не должны перекрываться по времени.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "%",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g28-1",
      "group": "g28",
      "groupTitle": "Аддитивное производство и 3D-печать",
      "topic": "Вес филамента по длине",
      "status": "implemented",
      "calculatorId": "g28-1",
      "href": "calculator.html?atlasTool=g28-1#labAtlasTools",
      "formula": "Масса, г = πDмм²/4 × длина, м × плотность, г/см³.",
      "outputUnit": "г",
      "trigger": "live",
      "inputs": [
        {
          "key": "diameter",
          "label": "Диаметр филамента, мм",
          "example": 1.75,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Длина филамента, м",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Плотность, г/см³",
          "example": 1.24,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Постоянный круглый диаметр и плотность; исключите катушку.",
      "reference": {
        "expected": 298.25495255018103,
        "actual": 298.25495255,
        "unit": "г",
        "tolerance": 0.0000029825495255018105,
        "status": "passed"
      },
      "researchSource": "https://lazytools.io/3d-printing/"
    },
    {
      "id": "g28-2",
      "group": "g28",
      "groupTitle": "Аддитивное производство и 3D-печать",
      "topic": "Длина филамента по массе",
      "status": "implemented",
      "calculatorId": "g28-2",
      "href": "calculator.html?atlasTool=g28-2#labAtlasTools",
      "formula": "Длина, м = масса/(πDмм²/4 × плотность).",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "diameter",
          "label": "Диаметр филамента, мм",
          "example": 1.75,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "mass",
          "label": "Масса филамента, г",
          "example": 298.25495255018103,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Плотность, г/см³",
          "example": 1.24,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Диаметр измерьте в нескольких сечениях; катушка исключена.",
      "reference": {
        "expected": 100,
        "actual": 100,
        "unit": "м",
        "tolerance": 0.000001,
        "status": "passed"
      },
      "researchSource": "https://lazytools.io/3d-printing/"
    },
    {
      "id": "g28-3",
      "group": "g28",
      "groupTitle": "Аддитивное производство и 3D-печать",
      "topic": "Себестоимость печати",
      "status": "implemented",
      "calculatorId": "g28-3",
      "href": "calculator.html?atlasTool=g28-3#labAtlasTools",
      "formula": "Себестоимость = масса/1000 × цена/кг + часы × ставка + труд.",
      "outputUnit": "₽",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Общий расход материала, г",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "material",
          "label": "Цена материала, ₽/кг",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "hours",
          "label": "Время печати, ч",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "machine",
          "label": "Ставка принтера, ₽/ч",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "labor",
          "label": "Труд и постобработка, ₽",
          "example": 200,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Поддержки и отходы включите в массу; не дублируйте энергию или труд в ставке.",
      "reference": {
        "expected": 800,
        "actual": 800,
        "unit": "₽",
        "tolerance": 0.000008,
        "status": "passed"
      },
      "researchSource": "https://lazytools.io/3d-printing/"
    },
    {
      "id": "g28-4",
      "group": "g28",
      "groupTitle": "Аддитивное производство и 3D-печать",
      "topic": "Расход электричества принтера",
      "status": "implemented",
      "calculatorId": "g28-4",
      "href": "calculator.html?atlasTool=g28-4#labAtlasTools",
      "formula": "Энергия = средняя мощность × время / 1000.",
      "outputUnit": "кВт·ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "power",
          "label": "Средняя измеренная мощность, Вт",
          "example": 200,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "hours",
          "label": "Время, ч",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Средняя потребляемая мощность, не сумма паспортных максимумов.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "кВт·ч",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://lazytools.io/3d-printing/"
    },
    {
      "id": "g28-5",
      "group": "g28",
      "groupTitle": "Аддитивное производство и 3D-печать",
      "topic": "Масса модели по объёму",
      "status": "implemented",
      "calculatorId": "g28-5",
      "href": "calculator.html?atlasTool=g28-5#labAtlasTools",
      "formula": "Масса = объём материала × плотность.",
      "outputUnit": "г",
      "trigger": "live",
      "inputs": [
        {
          "key": "volume",
          "label": "Реальный объём материала, см³",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Плотность, г/см³",
          "example": 1.24,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Объём должен уже учитывать оболочки, заполнение и пустоты, а не габаритный объём модели.",
      "reference": {
        "expected": 124,
        "actual": 124,
        "unit": "г",
        "tolerance": 0.00000124,
        "status": "passed"
      },
      "researchSource": "https://lazytools.io/3d-printing/"
    },
    {
      "id": "g28-6",
      "group": "g28",
      "groupTitle": "Аддитивное производство и 3D-печать",
      "topic": "Расход смолы на изделие",
      "status": "implemented",
      "calculatorId": "g28-6",
      "href": "calculator.html?atlasTool=g28-6#labAtlasTools",
      "formula": "Расход = объём × (1 + потери/100).",
      "outputUnit": "мл",
      "trigger": "live",
      "inputs": [
        {
          "key": "volume",
          "label": "Объём детали с поддержками, мл",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "loss",
          "label": "Дополнительные технологические потери, %",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Потери вводятся по вашему процессу, без универсального коэффициента.",
      "reference": {
        "expected": 110,
        "actual": 110,
        "unit": "мл",
        "tolerance": 0.0000011,
        "status": "passed"
      },
      "researchSource": "https://lazytools.io/3d-printing/"
    },
    {
      "id": "g28-7",
      "group": "g28",
      "groupTitle": "Аддитивное производство и 3D-печать",
      "topic": "Стоимость поддержки при печати",
      "status": "implemented",
      "calculatorId": "g28-7",
      "href": "calculator.html?atlasTool=g28-7#labAtlasTools",
      "formula": "Затраты на поддержки = масса/1000 × цена + удаление.",
      "outputUnit": "₽",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Масса поддержек, г",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rate",
          "label": "Цена материала, ₽/кг",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "removal",
          "label": "Удаление поддержек, ₽",
          "example": 50,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не включает изменение машинного времени, если оно не добавлено в труд.",
      "reference": {
        "expected": 70,
        "actual": 70,
        "unit": "₽",
        "tolerance": 7e-7,
        "status": "passed"
      },
      "researchSource": "https://lazytools.io/3d-printing/"
    },
    {
      "id": "g28-8",
      "group": "g28",
      "groupTitle": "Аддитивное производство и 3D-печать",
      "topic": "Масса поддержек по доле",
      "status": "implemented",
      "calculatorId": "g28-8",
      "href": "calculator.html?atlasTool=g28-8#labAtlasTools",
      "formula": "Поддержки = масса модели × доля/100.",
      "outputUnit": "г",
      "trigger": "live",
      "inputs": [
        {
          "key": "model",
          "label": "Масса модели без поддержек, г",
          "example": 50,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "ratio",
          "label": "Масса поддержек относительно модели, %",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Знаменатель — модель без поддержек; доля может превышать 100%.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "г",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://lazytools.io/3d-printing/"
    },
    {
      "id": "g28-9",
      "group": "g28",
      "groupTitle": "Аддитивное производство и 3D-печать",
      "topic": "Коэффициент заполнения Infill",
      "status": "implemented",
      "calculatorId": "g28-9",
      "href": "calculator.html?atlasTool=g28-9#labAtlasTools",
      "formula": "Эффективное заполнение = (масса − оболочка)/(сплошная масса − оболочка) × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "actual",
          "label": "Масса детали с неполным заполнением, г",
          "example": 40,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "shell",
          "label": "Масса неизменной оболочки, г",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "solid",
          "label": "Масса той же детали при 100% заполнении, г",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Грубая массовая оценка при одинаковой оболочке и материале; не параметр слайсера для любой геометрии.",
      "reference": {
        "expected": 25,
        "actual": 25,
        "unit": "%",
        "tolerance": 2.5e-7,
        "status": "passed"
      },
      "researchSource": "https://lazytools.io/3d-printing/"
    },
    {
      "id": "g28-10",
      "group": "g28",
      "groupTitle": "Аддитивное производство и 3D-печать",
      "topic": "Номинальное напряжение стенок печатной детали",
      "status": "implemented",
      "calculatorId": "g28-10",
      "href": "calculator.html?atlasTool=g28-10#labAtlasTools",
      "formula": "Среднее напряжение = сила/(суммарная ширина × толщина).",
      "outputUnit": "МПа",
      "trigger": "live",
      "inputs": [
        {
          "key": "force",
          "label": "Осевая сила, Н",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "width",
          "label": "Суммарная ширина несущих стенок, мм",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "thickness",
          "label": "Толщина стенки, мм",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "allowable",
          "label": "Заданное допустимое напряжение для вашей печати, МПа",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Только номинальное напряжение плоских стенок. Прочность печати зависит от ориентации, адгезии слоёв и испытаний; её эта формула не предсказывает. Допустимое напряжение должно быть подтверждено для материала, ориентации и условий печати.",
      "reference": {
        "expected": 5,
        "actual": 5,
        "unit": "МПа",
        "tolerance": 5e-8,
        "status": "passed"
      },
      "researchSource": "https://lazytools.io/3d-printing/"
    },
    {
      "id": "g28-11",
      "group": "g28",
      "groupTitle": "Аддитивное производство и 3D-печать",
      "topic": "Количество слоёв по высоте",
      "status": "implemented",
      "calculatorId": "g28-11",
      "href": "calculator.html?atlasTool=g28-11#labAtlasTools",
      "formula": "Число слоёв = ceil(высота / слой).",
      "outputUnit": "слоёв",
      "trigger": "live",
      "inputs": [
        {
          "key": "height",
          "label": "Высота печати, мм",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "layer",
          "label": "Постоянная высота слоя, мм",
          "example": 0.2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Первый слой считается той же высоты; переменная высота слоёв не моделируется.",
      "reference": {
        "expected": 50,
        "actual": 50,
        "unit": "слоёв",
        "tolerance": 5e-7,
        "status": "passed"
      },
      "researchSource": "https://lazytools.io/3d-printing/"
    },
    {
      "id": "g28-12",
      "group": "g28",
      "groupTitle": "Аддитивное производство и 3D-печать",
      "topic": "Линейная усадка детали",
      "status": "implemented",
      "calculatorId": "g28-12",
      "href": "calculator.html?atlasTool=g28-12#labAtlasTools",
      "formula": "Усадка = (CAD − готовый размер)/CAD × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "cad",
          "label": "Размер CAD, мм",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "printed",
          "label": "Измеренный размер после охлаждения, мм",
          "example": 99,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Измеряйте отдельно по каждой оси. Отрицательное значение означает увеличение.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "%",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://lazytools.io/3d-printing/"
    },
    {
      "id": "g28-13",
      "group": "g28",
      "groupTitle": "Аддитивное производство и 3D-печать",
      "topic": "Масштабирование модели и объёма",
      "status": "implemented",
      "calculatorId": "g28-13",
      "href": "calculator.html?atlasTool=g28-13#labAtlasTools",
      "formula": "Новый объём = исходный × масштаб³.",
      "outputUnit": "см³",
      "trigger": "live",
      "inputs": [
        {
          "key": "volume",
          "label": "Исходный объём, см³",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "scale",
          "label": "Линейный масштаб, раз",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Равномерное масштабирование всех трёх осей; не влияет одинаково на неизменяемую толщину оболочки в слайсере.",
      "reference": {
        "expected": 80,
        "actual": 80,
        "unit": "см³",
        "tolerance": 8e-7,
        "status": "passed"
      },
      "researchSource": "https://lazytools.io/3d-printing/"
    },
    {
      "id": "g28-14",
      "group": "g28",
      "groupTitle": "Аддитивное производство и 3D-печать",
      "topic": "Количество изделий на столе",
      "status": "implemented",
      "calculatorId": "g28-14",
      "href": "calculator.html?atlasTool=g28-14#labAtlasTools",
      "formula": "Максимум двух регулярных раскладок с поворотом всех деталей на 90°.",
      "outputUnit": "деталей",
      "trigger": "live",
      "inputs": [
        {
          "key": "bedw",
          "label": "Ширина стола, мм",
          "example": 200,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "bedl",
          "label": "Длина стола, мм",
          "example": 200,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "partw",
          "label": "Габарит детали по X, мм",
          "example": 50,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "partl",
          "label": "Габарит по Y, мм",
          "example": 50,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "gap",
          "label": "Зазор между деталями, мм",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Только прямоугольные габариты; не nesting произвольных контуров. Кромочный отступ уже исключён из полезного стола.",
      "reference": {
        "expected": 16,
        "actual": 16,
        "unit": "деталей",
        "tolerance": 1.6e-7,
        "status": "passed"
      },
      "researchSource": "https://lazytools.io/3d-printing/"
    },
    {
      "id": "g28-15",
      "group": "g28",
      "groupTitle": "Аддитивное производство и 3D-печать",
      "topic": "Время печати по слоям",
      "status": "implemented",
      "calculatorId": "g28-15",
      "href": "calculator.html?atlasTool=g28-15#labAtlasTools",
      "formula": "Время = слои × (экспозиция + перемещения)/60 + дополнительное.",
      "outputUnit": "мин",
      "trigger": "live",
      "inputs": [
        {
          "key": "layers",
          "label": "Слоёв",
          "example": 100,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "exposure",
          "label": "Экспозиция на слой, с",
          "example": 3,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "movement",
          "label": "Подъём, опускание и пауза на слой, с",
          "example": 7,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "setup",
          "label": "Дополнительное время, мин",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Модель послойной печати с постоянным циклом; нижние слои и нестандартные паузы включите отдельно.",
      "reference": {
        "expected": 21.666666666666668,
        "actual": 21.6666666667,
        "unit": "мин",
        "tolerance": 2.1666666666666667e-7,
        "status": "passed"
      },
      "researchSource": "https://lazytools.io/3d-printing/"
    },
    {
      "id": "g28-16",
      "group": "g28",
      "groupTitle": "Аддитивное производство и 3D-печать",
      "topic": "Подача экструдера E-steps",
      "status": "implemented",
      "calculatorId": "g28-16",
      "href": "calculator.html?atlasTool=g28-16#labAtlasTools",
      "formula": "Новое E-steps = старое × задано / фактически.",
      "outputUnit": "шагов/мм",
      "trigger": "live",
      "inputs": [
        {
          "key": "current",
          "label": "Текущее значение E-steps, шагов/мм",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "command",
          "label": "Задано перемещение, мм",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "actual",
          "label": "Измерено перемещение филамента, мм",
          "example": 95,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Кинематическая калибровка без проскальзывания. Не подменяет настройку extrusion multiplier.",
      "reference": {
        "expected": 105.26315789473684,
        "actual": 105.263157895,
        "unit": "шагов/мм",
        "tolerance": 0.0000010526315789473683,
        "status": "passed"
      },
      "researchSource": "https://lazytools.io/3d-printing/"
    },
    {
      "id": "g28-17",
      "group": "g28",
      "groupTitle": "Аддитивное производство и 3D-печать",
      "topic": "Поток пластика мм³/с",
      "status": "implemented",
      "calculatorId": "g28-17",
      "href": "calculator.html?atlasTool=g28-17#labAtlasTools",
      "formula": "Поток ≈ ширина × высота × скорость.",
      "outputUnit": "мм³/с",
      "trigger": "live",
      "inputs": [
        {
          "key": "width",
          "label": "Ширина линии, мм",
          "example": 0.4,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "height",
          "label": "Высота слоя, мм",
          "example": 0.2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "speed",
          "label": "Скорость, мм/с",
          "example": 50,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Прямоугольное приближение сечения дорожки; не предел хотэнда.",
      "reference": {
        "expected": 4,
        "actual": 4,
        "unit": "мм³/с",
        "tolerance": 4e-8,
        "status": "passed"
      },
      "researchSource": "https://lazytools.io/3d-printing/"
    },
    {
      "id": "g28-18",
      "group": "g28",
      "groupTitle": "Аддитивное производство и 3D-печать",
      "topic": "Частота смены катушки",
      "status": "implemented",
      "calculatorId": "g28-18",
      "href": "calculator.html?atlasTool=g28-18#labAtlasTools",
      "formula": "Время до исчерпания = остаток / средний расход.",
      "outputUnit": "ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "remaining",
          "label": "Остаток филамента, г",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rate",
          "label": "Средний расход, г/ч",
          "example": 50,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Средний стабильный расход; резерв на перезаправку задайте самостоятельно.",
      "reference": {
        "expected": 20,
        "actual": 20,
        "unit": "ч",
        "tolerance": 2e-7,
        "status": "passed"
      },
      "researchSource": "https://lazytools.io/3d-printing/"
    },
    {
      "id": "g28-19",
      "group": "g28",
      "groupTitle": "Аддитивное производство и 3D-печать",
      "topic": "Цена партии изделий",
      "status": "implemented",
      "calculatorId": "g28-19",
      "href": "calculator.html?atlasTool=g28-19#labAtlasTools",
      "formula": "Цена = (количество × себестоимость + подготовка) × (1 + наценка/100).",
      "outputUnit": "₽/партию",
      "trigger": "live",
      "inputs": [
        {
          "key": "qty",
          "label": "Годных изделий",
          "example": 10,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "unit",
          "label": "Себестоимость изделия, ₽",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "setup",
          "label": "Разовая подготовка партии, ₽",
          "example": 200,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "markup",
          "label": "Наценка к затратам, %",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не включает непредусмотренные брак, доставку или НДС. Наценка не равна маржинальности.",
      "reference": {
        "expected": 1440,
        "actual": 1440,
        "unit": "₽/партию",
        "tolerance": 0.000014400000000000001,
        "status": "passed"
      },
      "researchSource": "https://lazytools.io/3d-printing/"
    },
    {
      "id": "g28-20",
      "group": "g28",
      "groupTitle": "Аддитивное производство и 3D-печать",
      "topic": "Условная доля расхода FEP-плёнки",
      "status": "implemented",
      "calculatorId": "g28-20",
      "href": "calculator.html?atlasTool=g28-20#labAtlasTools",
      "formula": "Условный расход плёнки = площадь листа / число печатей.",
      "outputUnit": "м²/печать",
      "trigger": "live",
      "inputs": [
        {
          "key": "area",
          "label": "Площадь сменного FEP-листа, м²",
          "example": 0.1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "jobs",
          "label": "Фактический ресурс одного листа, печатей",
          "example": 100,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Ресурс — ваши наблюдения, не гарантированный срок. Замена зависит от повреждений и состояния плёнки.",
      "reference": {
        "expected": 0.001,
        "actual": 0.001,
        "unit": "м²/печать",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://lazytools.io/3d-printing/"
    },
    {
      "id": "g28-21",
      "group": "g28",
      "groupTitle": "Аддитивное производство и 3D-печать",
      "topic": "Габариты модели по масштабу",
      "status": "implemented",
      "calculatorId": "g28-21",
      "href": "calculator.html?atlasTool=g28-21#labAtlasTools",
      "formula": "Новый габарит = исходный × масштаб/100.",
      "outputUnit": "мм",
      "trigger": "live",
      "inputs": [
        {
          "key": "original",
          "label": "Исходный габарит, мм",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "scale",
          "label": "Линейный масштаб, %",
          "example": 150,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Повторите для каждой оси при неравномерном масштабировании.",
      "reference": {
        "expected": 150,
        "actual": 150,
        "unit": "мм",
        "tolerance": 0.0000015,
        "status": "passed"
      },
      "researchSource": "https://lazytools.io/3d-printing/"
    },
    {
      "id": "g28-22",
      "group": "g28",
      "groupTitle": "Аддитивное производство и 3D-печать",
      "topic": "Масса отходов поддержки",
      "status": "implemented",
      "calculatorId": "g28-22",
      "href": "calculator.html?atlasTool=g28-22#labAtlasTools",
      "formula": "Невозвращаемые отходы = масса поддержек × (1 − возврат/100).",
      "outputUnit": "г",
      "trigger": "live",
      "inputs": [
        {
          "key": "supports",
          "label": "Масса созданных поддержек, г",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "recovered",
          "label": "Фактически возвращаемая доля, %",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Доля возврата относится только к технологически пригодному повторному использованию.",
      "reference": {
        "expected": 80,
        "actual": 80,
        "unit": "г",
        "tolerance": 8e-7,
        "status": "passed"
      },
      "researchSource": "https://lazytools.io/3d-printing/"
    },
    {
      "id": "g29-1",
      "group": "g29",
      "groupTitle": "Геодезия и картография",
      "topic": "Угол между точками по координатам",
      "status": "implemented",
      "calculatorId": "g29-1",
      "href": "calculator.html?atlasTool=g29-1#labAtlasTools",
      "formula": "Угол от +X против часовой стрелки = atan2(Δy,Δx).",
      "outputUnit": "градусы",
      "trigger": "live",
      "inputs": [
        {
          "key": "x1",
          "label": "X1, м",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "y1",
          "label": "Y1, м",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "x2",
          "label": "X2, м",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "y2",
          "label": "Y2, м",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Плоские прямоугольные координаты; не географическая долгота/широта.",
      "reference": {
        "expected": 45,
        "actual": 45,
        "unit": "градусы",
        "tolerance": 4.5000000000000003e-7,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g29-2",
      "group": "g29",
      "groupTitle": "Геодезия и картография",
      "topic": "Длина отрезка 2D",
      "status": "implemented",
      "calculatorId": "g29-2",
      "href": "calculator.html?atlasTool=g29-2#labAtlasTools",
      "formula": "Длина = hypot(Δx,Δy).",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "x1",
          "label": "X1, м",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "y1",
          "label": "Y1, м",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "x2",
          "label": "X2, м",
          "example": 3,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "y2",
          "label": "Y2, м",
          "example": 4,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Плоское расстояние в одной системе координат.",
      "reference": {
        "expected": 5,
        "actual": 5,
        "unit": "м",
        "tolerance": 5e-8,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g29-3",
      "group": "g29",
      "groupTitle": "Геодезия и картография",
      "topic": "Пространственная длина 3D",
      "status": "implemented",
      "calculatorId": "g29-3",
      "href": "calculator.html?atlasTool=g29-3#labAtlasTools",
      "formula": "Длина = hypot(ΔX,ΔY,ΔZ).",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "dx",
          "label": "ΔX, м",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "dy",
          "label": "ΔY, м",
          "example": 3,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "dz",
          "label": "ΔZ, м",
          "example": 6,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Прямоугольные декартовы координаты в согласованных единицах.",
      "reference": {
        "expected": 7,
        "actual": 7,
        "unit": "м",
        "tolerance": 7e-8,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g29-4",
      "group": "g29",
      "groupTitle": "Геодезия и картография",
      "topic": "Площадь полигона Гаусса",
      "status": "implemented",
      "calculatorId": "g29-4",
      "href": "calculator.html?atlasTool=g29-4#labAtlasTools",
      "formula": "Площадь = |Σ(x_i y_(i+1) − x_(i+1)y_i)|/2; вычисление относительно первой вершины.",
      "outputUnit": "м²",
      "trigger": "live",
      "inputs": [
        {
          "key": "x",
          "label": "X вершин в порядке обхода, м; через ;",
          "example": "0;1;1;0",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "y",
          "label": "Y вершин в порядке обхода, м; через ;",
          "example": "0;0;1;1",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Простой плоский полигон без самопересечений и отверстий, до 200 вершин. Замыкание автоматически; повтор первой вершины в конце допустим. Геодезическая проекция и кривизна Земли не учитываются.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "м²",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g29-5",
      "group": "g29",
      "groupTitle": "Геодезия и картография",
      "topic": "Азимут линии",
      "status": "implemented",
      "calculatorId": "g29-5",
      "href": "calculator.html?atlasTool=g29-5#labAtlasTools",
      "formula": "Азимут от севера по часовой стрелке = atan2(ΔE,ΔN).",
      "outputUnit": "градусы",
      "trigger": "live",
      "inputs": [
        {
          "key": "east",
          "label": "Приращение восточной координаты, м",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "north",
          "label": "Приращение северной координаты, м",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Сетка плоской системы координат; сближение меридианов не включено.",
      "reference": {
        "expected": 90,
        "actual": 90,
        "unit": "градусы",
        "tolerance": 9.000000000000001e-7,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g29-6",
      "group": "g29",
      "groupTitle": "Геодезия и картография",
      "topic": "Обратная геодезическая задача (сферическая)",
      "status": "implemented",
      "calculatorId": "g29-6",
      "href": "calculator.html?atlasTool=g29-6#labAtlasTools",
      "formula": "Расстояние большого круга на сфере: haversine, R=6371 км.",
      "outputUnit": "км",
      "trigger": "live",
      "inputs": [
        {
          "key": "lat1",
          "label": "Широта точки 1, градусы",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": -90,
          "max": 90,
          "choices": null
        },
        {
          "key": "lon1",
          "label": "Долгота точки 1, градусы",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": -180,
          "max": 180,
          "choices": null
        },
        {
          "key": "lat2",
          "label": "Широта точки 2, градусы",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": -90,
          "max": 90,
          "choices": null
        },
        {
          "key": "lon2",
          "label": "Долгота точки 2, градусы",
          "example": 90,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": -180,
          "max": 180,
          "choices": null
        }
      ],
      "limits": "Сферическое приближение, не эллипсоид WGS84, маршрут с препятствиями или навигационная рекомендация.",
      "reference": {
        "expected": 10007.543398010286,
        "actual": 10007.543398,
        "unit": "км",
        "tolerance": 0.00010007543398010286,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g29-7",
      "group": "g29",
      "groupTitle": "Геодезия и картография",
      "topic": "Поправки за масштаб и проекцию",
      "status": "implemented",
      "calculatorId": "g29-7",
      "href": "calculator.html?atlasTool=g29-7#labAtlasTools",
      "formula": "Расстояние на сетке = наземное × совокупный коэффициент.",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "ground",
          "label": "Измеренное наземное расстояние, м",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "scale",
          "label": "Совокупный заданный масштабный коэффициент grid/ground",
          "example": 0.9996,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Коэффициент по выбранной проекции и высоте должен быть получен отдельно.",
      "reference": {
        "expected": 999.6,
        "actual": 999.6,
        "unit": "м",
        "tolerance": 0.000009996,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g29-8",
      "group": "g29",
      "groupTitle": "Геодезия и картография",
      "topic": "Уклон из перепада отметок",
      "status": "implemented",
      "calculatorId": "g29-8",
      "href": "calculator.html?atlasTool=g29-8#labAtlasTools",
      "formula": "Уклон = перепад/горизонтальное расстояние × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "height",
          "label": "Перепад отметок, м",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "horizontal",
          "label": "Горизонтальное проложение, м",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не по наклонной длине.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "%",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g29-9",
      "group": "g29",
      "groupTitle": "Геодезия и картография",
      "topic": "Перевод уклона %↔градусы",
      "status": "implemented",
      "calculatorId": "g29-9",
      "href": "calculator.html?atlasTool=g29-9#labAtlasTools",
      "formula": "Угол = atan(уклон/100).",
      "outputUnit": "градусы",
      "trigger": "live",
      "inputs": [
        {
          "key": "slope",
          "label": "Уклон, %",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Для обратного пересчёта: уклон=100 tan(угол).",
      "reference": {
        "expected": 45,
        "actual": 45,
        "unit": "градусы",
        "tolerance": 4.5000000000000003e-7,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g29-10",
      "group": "g29",
      "groupTitle": "Геодезия и картография",
      "topic": "Высотное превышение",
      "status": "implemented",
      "calculatorId": "g29-10",
      "href": "calculator.html?atlasTool=g29-10#labAtlasTools",
      "formula": "Превышение A→B = отметка B − отметка A.",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "b",
          "label": "Отметка B, м",
          "example": 105,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "a",
          "label": "Отметка A, м",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Одна высотная система.",
      "reference": {
        "expected": 5,
        "actual": 5,
        "unit": "м",
        "tolerance": 5e-8,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g29-11",
      "group": "g29",
      "groupTitle": "Геодезия и картография",
      "topic": "Среднее геометрическое нивелирование",
      "status": "implemented",
      "calculatorId": "g29-11",
      "href": "calculator.html?atlasTool=g29-11#labAtlasTools",
      "formula": "Среднее превышение = среднее(задний − передний).",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "back",
          "label": "Задние отсчёты повторов, м; через ;",
          "example": "1.2;1.4",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "front",
          "label": "Передние отсчёты повторов, м; через ;",
          "example": "0.2;0.4",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Повторные равноточные определения одного превышения методом геометрического нивелирования, не разные станции одного хода.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "м",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g29-12",
      "group": "g29",
      "groupTitle": "Геодезия и картография",
      "topic": "Ошибка замыкания хода",
      "status": "implemented",
      "calculatorId": "g29-12",
      "href": "calculator.html?atlasTool=g29-12#labAtlasTools",
      "formula": "Невязка = Σ превышений − (конечная − начальная отметка).",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "increments",
          "label": "Превышения последовательных станций, м; через ;",
          "example": "1;2;3",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "start",
          "label": "Известная начальная отметка, м",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "end",
          "label": "Известная конечная отметка, м",
          "example": 106,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не распределяет поправки и не назначает допустимую невязку класса работ.",
      "reference": {
        "expected": 0,
        "actual": 0,
        "unit": "м",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g29-13",
      "group": "g29",
      "groupTitle": "Геодезия и картография",
      "topic": "Объём насыпи по сечениям",
      "status": "implemented",
      "calculatorId": "g29-13",
      "href": "calculator.html?atlasTool=g29-13#labAtlasTools",
      "formula": "V = Σ (Ai + A_(i+1))/2 × (xi+1 − xi).",
      "outputUnit": "м³",
      "trigger": "live",
      "inputs": [
        {
          "key": "stations",
          "label": "Пикетаж сечений, м; через ;",
          "example": "0;10;20",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "areas",
          "label": "Площади выбранной насыпи/выемки, м²; через ;",
          "example": "10;20;30",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Метод средних концевых площадей. Насыпь и выемку считайте отдельно; смена знака между сечениями требует промежуточного сечения.",
      "reference": {
        "expected": 400,
        "actual": 400,
        "unit": "м³",
        "tolerance": 0.000004,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g29-14",
      "group": "g29",
      "groupTitle": "Геодезия и картография",
      "topic": "Объём выемки по сечениям",
      "status": "implemented",
      "calculatorId": "g29-14",
      "href": "calculator.html?atlasTool=g29-14#labAtlasTools",
      "formula": "V = Σ (Ai + A_(i+1))/2 × (xi+1 − xi).",
      "outputUnit": "м³",
      "trigger": "live",
      "inputs": [
        {
          "key": "stations",
          "label": "Пикетаж сечений, м; через ;",
          "example": "0;10;20",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "areas",
          "label": "Площади выбранной насыпи/выемки, м²; через ;",
          "example": "10;20;30",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Метод средних концевых площадей. Насыпь и выемку считайте отдельно; смена знака между сечениями требует промежуточного сечения.",
      "reference": {
        "expected": 400,
        "actual": 400,
        "unit": "м³",
        "tolerance": 0.000004,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g29-15",
      "group": "g29",
      "groupTitle": "Геодезия и картография",
      "topic": "Интерполяция высоты по точкам",
      "status": "implemented",
      "calculatorId": "g29-15",
      "href": "calculator.html?atlasTool=g29-15#labAtlasTools",
      "formula": "h = h1 + (x−x1)/(x2−x1) × (h2−h1).",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "x1",
          "label": "Координата x1",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "h1",
          "label": "Отметка h1, м",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "x2",
          "label": "Координата x2",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "h2",
          "label": "Отметка h2, м",
          "example": 110,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "x",
          "label": "Координата интерполяции",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Линейная интерполяция по отрезку; не модель сложного рельефа.",
      "reference": {
        "expected": 105,
        "actual": 105,
        "unit": "м",
        "tolerance": 0.0000010500000000000001,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g29-16",
      "group": "g29",
      "groupTitle": "Геодезия и картография",
      "topic": "Масштаб плана в метрах",
      "status": "implemented",
      "calculatorId": "g29-16",
      "href": "calculator.html?atlasTool=g29-16#labAtlasTools",
      "formula": "Длина на местности = см на плане × N/100.",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "cm",
          "label": "Длина на плане, см",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "scale",
          "label": "Знаменатель масштаба 1:N",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без поправки на масштаб проекции и усадку носителя.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "м",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g29-17",
      "group": "g29",
      "groupTitle": "Геодезия и картография",
      "topic": "Перевод координат градусов",
      "status": "implemented",
      "calculatorId": "g29-17",
      "href": "calculator.html?atlasTool=g29-17#labAtlasTools",
      "formula": "Десятичные градусы = знак × (|градусы| + минуты/60 + секунды/3600).",
      "outputUnit": "градусы",
      "trigger": "live",
      "inputs": [
        {
          "key": "degrees",
          "label": "Градусы со знаком (для −0 введите −0)",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "minutes",
          "label": "Минуты",
          "example": 30,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 59.999999999,
          "choices": null
        },
        {
          "key": "seconds",
          "label": "Секунды",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 59.999999999,
          "choices": null
        }
      ],
      "limits": "Знак задаётся градусной частью. Для широты дополнительно контролируйте предел ±90°, для долготы ±180°.",
      "reference": {
        "expected": 10.5,
        "actual": 10.5,
        "unit": "градусы",
        "tolerance": 1.05e-7,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g29-18",
      "group": "g29",
      "groupTitle": "Геодезия и картография",
      "topic": "Длина дуги окружности",
      "status": "implemented",
      "calculatorId": "g29-18",
      "href": "calculator.html?atlasTool=g29-18#labAtlasTools",
      "formula": "Длина дуги = радиус × угол × π/180.",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "radius",
          "label": "Радиус, м",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "angle",
          "label": "Центральный угол, градусы",
          "example": 90,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 360,
          "choices": null
        }
      ],
      "limits": "Круговая дуга, не хорда.",
      "reference": {
        "expected": 15.707963267948966,
        "actual": 15.7079632679,
        "unit": "м",
        "tolerance": 1.5707963267948966e-7,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g29-19",
      "group": "g29",
      "groupTitle": "Геодезия и картография",
      "topic": "Радиус по длине хорды",
      "status": "implemented",
      "calculatorId": "g29-19",
      "href": "calculator.html?atlasTool=g29-19#labAtlasTools",
      "formula": "R = хорда/(2sin(угол/2)).",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "chord",
          "label": "Длина хорды, м",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "angle",
          "label": "Центральный угол, градусы",
          "example": 60,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Нужен заданный центральный угол: одной длины хорды недостаточно.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "м",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g29-20",
      "group": "g29",
      "groupTitle": "Геодезия и картография",
      "topic": "Площадь полосы отвода",
      "status": "implemented",
      "calculatorId": "g29-20",
      "href": "calculator.html?atlasTool=g29-20#labAtlasTools",
      "formula": "Площадь = длина × средняя ширина / 10 000.",
      "outputUnit": "га",
      "trigger": "live",
      "inputs": [
        {
          "key": "length",
          "label": "Длина полосы, м",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "width",
          "label": "Средняя ширина полосы, м",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Геометрическое приближение; не кадастровое определение границ.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "га",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g30-1",
      "group": "g30",
      "groupTitle": "Экология и водоподготовка",
      "topic": "Концентрация загрязнителя мг/л",
      "status": "implemented",
      "calculatorId": "g30-1",
      "href": "calculator.html?atlasTool=g30-1#labAtlasTools",
      "formula": "C = масса/объём.",
      "outputUnit": "мг/л",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Масса вещества, мг",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "volume",
          "label": "Объём раствора, л",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Один компонент, согласованная проба.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "мг/л",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g30-2",
      "group": "g30",
      "groupTitle": "Экология и водоподготовка",
      "topic": "Перевод ppm в мг/л (плотность)",
      "status": "implemented",
      "calculatorId": "g30-2",
      "href": "calculator.html?atlasTool=g30-2#labAtlasTools",
      "formula": "мг/л = ppm × плотность, кг/л.",
      "outputUnit": "мг/л",
      "trigger": "live",
      "inputs": [
        {
          "key": "ppm",
          "label": "Массовая доля, ppm (мг/кг)",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Плотность раствора, кг/л",
          "example": 1.2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Приравнивание ppm и мг/л без плотности допустимо лишь приближённо для воды.",
      "reference": {
        "expected": 12,
        "actual": 12,
        "unit": "мг/л",
        "tolerance": 1.2000000000000002e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g30-3",
      "group": "g30",
      "groupTitle": "Экология и водоподготовка",
      "topic": "Средневзвешенная концентрация",
      "status": "implemented",
      "calculatorId": "g30-3",
      "href": "calculator.html?atlasTool=g30-3#labAtlasTools",
      "formula": "Средняя концентрация = Σ(mi Ci)/Σmi.",
      "outputUnit": "мг/кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Массы представляемых растворов, кг; через ;",
          "example": "1;3",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "concentration",
          "label": "Концентрации на массовой базе, мг/кг; через ;",
          "example": "10;30",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Массовое взвешивание; не смешивать с объёмными концентрациями без пересчёта плотности.",
      "reference": {
        "expected": 25,
        "actual": 25,
        "unit": "мг/кг",
        "tolerance": 2.5e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g30-4",
      "group": "g30",
      "groupTitle": "Экология и водоподготовка",
      "topic": "Смешение потоков стоков",
      "status": "implemented",
      "calculatorId": "g30-4",
      "href": "calculator.html?atlasTool=g30-4#labAtlasTools",
      "formula": "C = (Q1C1 + Q2C2)/(Q1+Q2).",
      "outputUnit": "мг/л",
      "trigger": "live",
      "inputs": [
        {
          "key": "q1",
          "label": "Расход 1, м³/ч",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "c1",
          "label": "Концентрация 1, мг/л",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "q2",
          "label": "Расход 2, м³/ч",
          "example": 3,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "c2",
          "label": "Концентрация 2, мг/л",
          "example": 30,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Стационарная смесь с аддитивными объёмами, без реакции и выпадения осадка.",
      "reference": {
        "expected": 25,
        "actual": 25,
        "unit": "мг/л",
        "tolerance": 2.5e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g30-5",
      "group": "g30",
      "groupTitle": "Экология и водоподготовка",
      "topic": "Масса загрязнения за сутки",
      "status": "implemented",
      "calculatorId": "g30-5",
      "href": "calculator.html?atlasTool=g30-5#labAtlasTools",
      "formula": "Нагрузка = м³/сут × мг/л / 1000.",
      "outputUnit": "кг/сут",
      "trigger": "live",
      "inputs": [
        {
          "key": "flow",
          "label": "Постоянный расход, м³/сут",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "concentration",
          "label": "Концентрация, мг/л",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Для переменных условий нужен интеграл по расходу и концентрации.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "кг/сут",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g30-6",
      "group": "g30",
      "groupTitle": "Экология и водоподготовка",
      "topic": "Средний расход стоков",
      "status": "implemented",
      "calculatorId": "g30-6",
      "href": "calculator.html?atlasTool=g30-6#labAtlasTools",
      "formula": "Средний расход = объём/время.",
      "outputUnit": "м³/ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "volume",
          "label": "Объём за интервал, м³",
          "example": 240,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "hours",
          "label": "Длительность интервала, ч",
          "example": 24,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не максимальный расчётный расход.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "м³/ч",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g30-7",
      "group": "g30",
      "groupTitle": "Экология и водоподготовка",
      "topic": "Гидравлическое время удержания",
      "status": "implemented",
      "calculatorId": "g30-7",
      "href": "calculator.html?atlasTool=g30-7#labAtlasTools",
      "formula": "HRT = объём/расход.",
      "outputUnit": "ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "volume",
          "label": "Рабочий жидкостный объём, м³",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "flow",
          "label": "Расход, м³/ч",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Номинальное среднее время удержания; не реальное распределение и не SRT.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "ч",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g30-8",
      "group": "g30",
      "groupTitle": "Экология и водоподготовка",
      "topic": "Объём по заданному времени удержания",
      "status": "implemented",
      "calculatorId": "g30-8",
      "href": "calculator.html?atlasTool=g30-8#labAtlasTools",
      "formula": "Рабочий объём = подача × время.",
      "outputUnit": "м³",
      "trigger": "live",
      "inputs": [
        {
          "key": "flow",
          "label": "Подача, м³/ч",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "time",
          "label": "Заданное время удержания, ч",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Только объём по заданному времени; осаждение, площадь и гидравлика требуют отдельного расчёта.",
      "reference": {
        "expected": 20,
        "actual": 20,
        "unit": "м³",
        "tolerance": 2e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g30-9",
      "group": "g30",
      "groupTitle": "Экология и водоподготовка",
      "topic": "Количество осадка по доле сухого вещества",
      "status": "implemented",
      "calculatorId": "g30-9",
      "href": "calculator.html?atlasTool=g30-9#labAtlasTools",
      "formula": "Влажная масса = сухое вещество/(сухая доля/100).",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "dry",
          "label": "Масса сухого вещества осадка, кг",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "solids",
          "label": "Сухое вещество во влажном осадке, %",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без добавления реагентов и потерь сухого вещества.",
      "reference": {
        "expected": 2000,
        "actual": 2000,
        "unit": "кг",
        "tolerance": 0.00002,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g30-10",
      "group": "g30",
      "groupTitle": "Экология и водоподготовка",
      "topic": "Энергия аэрации (приближение)",
      "status": "implemented",
      "calculatorId": "g30-10",
      "href": "calculator.html?atlasTool=g30-10#labAtlasTools",
      "formula": "Энергия = потребность O₂ / фактическая эффективность передачи.",
      "outputUnit": "кВт·ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "oxygen",
          "label": "Требуемый кислород за период, кг O₂",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "efficiency",
          "label": "Фактическая эффективность аэрации, кг O₂/кВт·ч",
          "example": 2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Эффективность в рабочих, не стандартных условиях; не прогноз БПК или режима биореактора.",
      "reference": {
        "expected": 50,
        "actual": 50,
        "unit": "кВт·ч",
        "tolerance": 5e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g30-11",
      "group": "g30",
      "groupTitle": "Экология и водоподготовка",
      "topic": "Расход реагента на тонну воды",
      "status": "implemented",
      "calculatorId": "g30-11",
      "href": "calculator.html?atlasTool=g30-11#labAtlasTools",
      "formula": "Реагент = тонны воды × г/т / 1000.",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "water",
          "label": "Обрабатываемая масса воды, т",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rate",
          "label": "Доза реагента, г/т",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Доза и активность продукта по испытаниям, не автоматическое назначение.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "кг",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g30-12",
      "group": "g30",
      "groupTitle": "Экология и водоподготовка",
      "topic": "Доля извлечённого загрязнителя",
      "status": "implemented",
      "calculatorId": "g30-12",
      "href": "calculator.html?atlasTool=g30-12#labAtlasTools",
      "formula": "Удаление = (вход − выход)/вход × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "before",
          "label": "Масса загрязнителя на входе, кг",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "after",
          "label": "Масса загрязнителя на выходе, кг",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Массы за согласованный интервал, не только концентрации при разном расходе.",
      "reference": {
        "expected": 90,
        "actual": 90,
        "unit": "%",
        "tolerance": 9.000000000000001e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g30-13",
      "group": "g30",
      "groupTitle": "Экология и водоподготовка",
      "topic": "Коэффициент рециркуляции стоков",
      "status": "implemented",
      "calculatorId": "g30-13",
      "href": "calculator.html?atlasTool=g30-13#labAtlasTools",
      "formula": "R = возврат/внешняя подача.",
      "outputUnit": "раз",
      "trigger": "live",
      "inputs": [
        {
          "key": "returned",
          "label": "Рециркуляционный поток, м³/ч",
          "example": 50,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "feed",
          "label": "Внешний входящий поток, м³/ч",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не доля возврата в суммарном потоке.",
      "reference": {
        "expected": 0.5,
        "actual": 0.5,
        "unit": "раз",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g30-14",
      "group": "g30",
      "groupTitle": "Экология и водоподготовка",
      "topic": "Средняя концентрация после разбавления",
      "status": "implemented",
      "calculatorId": "g30-14",
      "href": "calculator.html?atlasTool=g30-14#labAtlasTools",
      "formula": "C2 = C1 V1/(V1 + вода).",
      "outputUnit": "мг/л",
      "trigger": "live",
      "inputs": [
        {
          "key": "volume",
          "label": "Исходный объём, л",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "concentration",
          "label": "Исходная концентрация, мг/л",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "water",
          "label": "Объём чистой добавленной воды, л",
          "example": 90,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Аддитивные объёмы, без реакций и концентрации в воде разбавления.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "мг/л",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g30-15",
      "group": "g30",
      "groupTitle": "Экология и водоподготовка",
      "topic": "Эффективность фильтрации",
      "status": "implemented",
      "calculatorId": "g30-15",
      "href": "calculator.html?atlasTool=g30-15#labAtlasTools",
      "formula": "Эффективность = (Cвход − Cвыход)/Cвход × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "before",
          "label": "Входная концентрация, мг/л",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "after",
          "label": "Выходная концентрация, мг/л",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Только при одинаковом расходе; иначе сравнивайте массовые потоки. Отрицательный результат означает рост концентрации.",
      "reference": {
        "expected": 90,
        "actual": 90,
        "unit": "%",
        "tolerance": 9.000000000000001e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g30-16",
      "group": "g30",
      "groupTitle": "Экология и водоподготовка",
      "topic": "Суточный расход питьевой воды",
      "status": "implemented",
      "calculatorId": "g30-16",
      "href": "calculator.html?atlasTool=g30-16#labAtlasTools",
      "formula": "Суточный объём = люди × норма / 1000.",
      "outputUnit": "м³/сут",
      "trigger": "live",
      "inputs": [
        {
          "key": "people",
          "label": "Потребителей",
          "example": 100,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "norm",
          "label": "Заданная норма, л/(чел·сут)",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Норма выбирается по применимым условиям; не универсальная санитарная норма.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "м³/сут",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g30-17",
      "group": "g30",
      "groupTitle": "Экология и водоподготовка",
      "topic": "Площадь фильтра по скорости",
      "status": "implemented",
      "calculatorId": "g30-17",
      "href": "calculator.html?atlasTool=g30-17#labAtlasTools",
      "formula": "Площадь = расход/скорость.",
      "outputUnit": "м²",
      "trigger": "live",
      "inputs": [
        {
          "key": "flow",
          "label": "Расход через фильтр, м³/ч",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "velocity",
          "label": "Заданная скорость фильтрации, м/ч",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не определяет допустимую скорость, загрузку, перепад давления или эффективность.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "м²",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g30-18",
      "group": "g30",
      "groupTitle": "Экология и водоподготовка",
      "topic": "Выбросы CO₂ по коэффициенту",
      "status": "implemented",
      "calculatorId": "g30-18",
      "href": "calculator.html?atlasTool=g30-18#labAtlasTools",
      "formula": "Выбросы = деятельность × заданный коэффициент.",
      "outputUnit": "кг CO₂-экв",
      "trigger": "live",
      "inputs": [
        {
          "key": "activity",
          "label": "Объём деятельности на базе коэффициента",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "factor",
          "label": "Коэффициент, кг CO₂-экв/единицу",
          "example": 0.4,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Коэффициент, газовый состав, границы жизненного цикла и год задаются пользователем.",
      "reference": {
        "expected": 40,
        "actual": 40,
        "unit": "кг CO₂-экв",
        "tolerance": 4e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g30-19",
      "group": "g30",
      "groupTitle": "Экология и водоподготовка",
      "topic": "Водный баланс производства",
      "status": "implemented",
      "calculatorId": "g30-19",
      "href": "calculator.html?atlasTool=g30-19#labAtlasTools",
      "formula": "Балансовое накопление = Σ вход − Σ выход.",
      "outputUnit": "м³",
      "trigger": "live",
      "inputs": [
        {
          "key": "input",
          "label": "Входящие потоки за период, м³; через ;",
          "example": "100;50",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "output",
          "label": "Исходящие потоки за тот же период, м³; через ;",
          "example": "80;60",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Неучтённые потоки и погрешности также проявляются в небалансе; это не доказательство утечки.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "м³",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g30-20",
      "group": "g30",
      "groupTitle": "Экология и водоподготовка",
      "topic": "Процент оборотной воды",
      "status": "implemented",
      "calculatorId": "g30-20",
      "href": "calculator.html?atlasTool=g30-20#labAtlasTools",
      "formula": "Доля оборотной воды = повторный объём/общий объём × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "reused",
          "label": "Повторно использованная вода, м³",
          "example": 80,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "total",
          "label": "Общее водопотребление на той же базе, м³",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Определение общего водопотребления фиксируется для всей системы.",
      "reference": {
        "expected": 80,
        "actual": 80,
        "unit": "%",
        "tolerance": 8e-7,
        "status": "passed"
      },
      "researchSource": "https://processfunda.com/calculator-library/"
    },
    {
      "id": "g31-1",
      "group": "g31",
      "groupTitle": "Сельское хозяйство и агротехника",
      "topic": "Норма высева на гектар",
      "status": "implemented",
      "calculatorId": "g31-1",
      "href": "calculator.html?atlasTool=g31-1#labAtlasTools",
      "formula": "кг/га = растения/м² × масса 1000 семян / (100 × всхожесть/100 × чистота/100).",
      "outputUnit": "кг/га",
      "trigger": "live",
      "inputs": [
        {
          "key": "plants",
          "label": "Целевых растений на м²",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "thousand",
          "label": "Масса 1000 семян, г",
          "example": 40,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "germ",
          "label": "Всхожесть, %",
          "example": 90,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "purity",
          "label": "Чистота, %",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не учитывает полевую гибель после прорастания; целевую густоту задаёт агроном.",
      "reference": {
        "expected": 44.44444444444444,
        "actual": 44.4444444444,
        "unit": "кг/га",
        "tolerance": 4.4444444444444444e-7,
        "status": "passed"
      },
      "researchSource": "https://agriculturecalculators.com/"
    },
    {
      "id": "g31-2",
      "group": "g31",
      "groupTitle": "Сельское хозяйство и агротехника",
      "topic": "Число семян по площади",
      "status": "implemented",
      "calculatorId": "g31-2",
      "href": "calculator.html?atlasTool=g31-2#labAtlasTools",
      "formula": "Семена = площадь × 10 000 × семян/м².",
      "outputUnit": "семян",
      "trigger": "live",
      "inputs": [
        {
          "key": "area",
          "label": "Площадь, га",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Норма, семян/м²",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Это количество семян, не фактический выход растений.",
      "reference": {
        "expected": 2000000,
        "actual": 2000000,
        "unit": "семян",
        "tolerance": 0.02,
        "status": "passed"
      },
      "researchSource": "https://agriculturecalculators.com/"
    },
    {
      "id": "g31-3",
      "group": "g31",
      "groupTitle": "Сельское хозяйство и агротехника",
      "topic": "Длина рядов посева",
      "status": "implemented",
      "calculatorId": "g31-3",
      "href": "calculator.html?atlasTool=g31-3#labAtlasTools",
      "formula": "Общая длина рядов = площадь × 10 000 / междурядье.",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "area",
          "label": "Площадь поля, га",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "spacing",
          "label": "Расстояние между рядами, м",
          "example": 0.5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Регулярные параллельные ряды, без разворотных полос и краевых потерь.",
      "reference": {
        "expected": 20000,
        "actual": 20000,
        "unit": "м",
        "tolerance": 0.0002,
        "status": "passed"
      },
      "researchSource": "https://agriculturecalculators.com/"
    },
    {
      "id": "g31-4",
      "group": "g31",
      "groupTitle": "Сельское хозяйство и агротехника",
      "topic": "Густота растений на гектар",
      "status": "implemented",
      "calculatorId": "g31-4",
      "href": "calculator.html?atlasTool=g31-4#labAtlasTools",
      "formula": "Растений/га = 10 000/(междурядье × шаг).",
      "outputUnit": "растений/га",
      "trigger": "live",
      "inputs": [
        {
          "key": "row",
          "label": "Междурядье, м",
          "example": 0.5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "plant",
          "label": "Шаг в ряду, м",
          "example": 0.2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Одно растение на посадочное место в регулярной сетке.",
      "reference": {
        "expected": 100000,
        "actual": 100000,
        "unit": "растений/га",
        "tolerance": 0.001,
        "status": "passed"
      },
      "researchSource": "https://agriculturecalculators.com/"
    },
    {
      "id": "g31-5",
      "group": "g31",
      "groupTitle": "Сельское хозяйство и агротехника",
      "topic": "Площадь поля по геометрии",
      "status": "implemented",
      "calculatorId": "g31-5",
      "href": "calculator.html?atlasTool=g31-5#labAtlasTools",
      "formula": "Площадь, га = длина × ширина / 10 000.",
      "outputUnit": "га",
      "trigger": "live",
      "inputs": [
        {
          "key": "length",
          "label": "Длина прямоугольного поля, м",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "width",
          "label": "Ширина, м",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Для прямоугольника без исключаемых участков.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "га",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://agriculturecalculators.com/"
    },
    {
      "id": "g31-6",
      "group": "g31",
      "groupTitle": "Сельское хозяйство и агротехника",
      "topic": "Расход поливной воды",
      "status": "implemented",
      "calculatorId": "g31-6",
      "href": "calculator.html?atlasTool=g31-6#labAtlasTools",
      "formula": "Поданный объём = га × мм × 10 / (эффективность/100).",
      "outputUnit": "м³",
      "trigger": "live",
      "inputs": [
        {
          "key": "area",
          "label": "Поливаемая площадь, га",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "net",
          "label": "Требуемый слой воды, мм",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "eff",
          "label": "Эффективность подачи, %",
          "example": 80,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Норма полива задаётся извне; это не расчёт водопотребления культуры.",
      "reference": {
        "expected": 125,
        "actual": 125,
        "unit": "м³",
        "tolerance": 0.00000125,
        "status": "passed"
      },
      "researchSource": "https://agriculturecalculators.com/"
    },
    {
      "id": "g31-7",
      "group": "g31",
      "groupTitle": "Сельское хозяйство и агротехника",
      "topic": "Норма полива по мм осадков",
      "status": "implemented",
      "calculatorId": "g31-7",
      "href": "calculator.html?atlasTool=g31-7#labAtlasTools",
      "formula": "Слой = объём/(площадь × 10).",
      "outputUnit": "мм",
      "trigger": "live",
      "inputs": [
        {
          "key": "volume",
          "label": "Объём воды, м³",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "area",
          "label": "Площадь, га",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Равномерное распределение по всей площади.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "мм",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://agriculturecalculators.com/"
    },
    {
      "id": "g31-8",
      "group": "g31",
      "groupTitle": "Сельское хозяйство и агротехника",
      "topic": "Расход капельной линии",
      "status": "implemented",
      "calculatorId": "g31-8",
      "href": "calculator.html?atlasTool=g31-8#labAtlasTools",
      "formula": "Расход = капельницы × л/ч одной.",
      "outputUnit": "л/ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "emitters",
          "label": "Капельниц",
          "example": 100,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "rate",
          "label": "Расход одной капельницы, л/ч",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Расходы при рабочем давлении; не гидравлический расчёт линии.",
      "reference": {
        "expected": 200,
        "actual": 200,
        "unit": "л/ч",
        "tolerance": 0.000002,
        "status": "passed"
      },
      "researchSource": "https://agriculturecalculators.com/"
    },
    {
      "id": "g31-9",
      "group": "g31",
      "groupTitle": "Сельское хозяйство и агротехника",
      "topic": "Доза одного NPK-удобрения по трём потребностям",
      "status": "implemented",
      "calculatorId": "g31-9",
      "href": "calculator.html?atlasTool=g31-9#labAtlasTools",
      "formula": "Доза одного удобрения = max(потребность N/доля N, P₂O₅/доля, K₂O/доля).",
      "outputUnit": "кг/га",
      "trigger": "live",
      "inputs": [
        {
          "key": "n",
          "label": "Требуется N, кг/га",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "p",
          "label": "Требуется P₂O₅, кг/га",
          "example": 50,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "k",
          "label": "Требуется K₂O, кг/га",
          "example": 50,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "an",
          "label": "N в одном выбранном удобрении, %",
          "example": 20,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "ap",
          "label": "P₂O₅, %",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "ak",
          "label": "K₂O, %",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Одно удобрение с положительными NPK. Такая доза может дать избыток других компонентов: баланс и допустимость проверяет агроном. Не смешивайте P с P₂O₅ и K с K₂O.",
      "reference": {
        "expected": 500,
        "actual": 500,
        "unit": "кг/га",
        "tolerance": 0.000005,
        "status": "passed"
      },
      "researchSource": "https://agriculturecalculators.com/"
    },
    {
      "id": "g31-10",
      "group": "g31",
      "groupTitle": "Сельское хозяйство и агротехника",
      "topic": "Концентрация раствора удобрения",
      "status": "implemented",
      "calculatorId": "g31-10",
      "href": "calculator.html?atlasTool=g31-10#labAtlasTools",
      "formula": "Концентрация продукта = масса/конечный объём.",
      "outputUnit": "г/л",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Масса удобрения, г",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "volume",
          "label": "Конечный объём раствора, л",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Концентрация самого продукта, не отдельных элементов и не электропроводность.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "г/л",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://agriculturecalculators.com/"
    },
    {
      "id": "g31-11",
      "group": "g31",
      "groupTitle": "Сельское хозяйство и агротехника",
      "topic": "Расход топлива трактора",
      "status": "implemented",
      "calculatorId": "g31-11",
      "href": "calculator.html?atlasTool=g31-11#labAtlasTools",
      "formula": "Топливо = время × средний расход.",
      "outputUnit": "л",
      "trigger": "live",
      "inputs": [
        {
          "key": "hours",
          "label": "Часы работы",
          "example": 8,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rate",
          "label": "Измеренный расход, л/ч",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Расход зависит от нагрузки; не универсальная норма трактора.",
      "reference": {
        "expected": 80,
        "actual": 80,
        "unit": "л",
        "tolerance": 8e-7,
        "status": "passed"
      },
      "researchSource": "https://agriculturecalculators.com/"
    },
    {
      "id": "g31-12",
      "group": "g31",
      "groupTitle": "Сельское хозяйство и агротехника",
      "topic": "Выработка машины на гектар/ч",
      "status": "implemented",
      "calculatorId": "g31-12",
      "href": "calculator.html?atlasTool=g31-12#labAtlasTools",
      "formula": "га/ч = ширина × скорость / 10 × эффективность/100.",
      "outputUnit": "га/ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "width",
          "label": "Рабочая ширина, м",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "speed",
          "label": "Рабочая скорость, км/ч",
          "example": 8,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "eff",
          "label": "Полевая эффективность, %",
          "example": 75,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Эффективность учитывает развороты и остановки; её задают по условиям.",
      "reference": {
        "expected": 3,
        "actual": 3,
        "unit": "га/ч",
        "tolerance": 3.0000000000000004e-8,
        "status": "passed"
      },
      "researchSource": "https://agriculturecalculators.com/"
    },
    {
      "id": "g31-13",
      "group": "g31",
      "groupTitle": "Сельское хозяйство и агротехника",
      "topic": "Продолжительность уборки поля",
      "status": "implemented",
      "calculatorId": "g31-13",
      "href": "calculator.html?atlasTool=g31-13#labAtlasTools",
      "formula": "Время = площадь/производительность.",
      "outputUnit": "ч",
      "trigger": "live",
      "inputs": [
        {
          "key": "area",
          "label": "Убираемая площадь, га",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rate",
          "label": "Фактическая производительность, га/ч",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Без дополнительных погодных простоев.",
      "reference": {
        "expected": 20,
        "actual": 20,
        "unit": "ч",
        "tolerance": 2e-7,
        "status": "passed"
      },
      "researchSource": "https://agriculturecalculators.com/"
    },
    {
      "id": "g31-14",
      "group": "g31",
      "groupTitle": "Сельское хозяйство и агротехника",
      "topic": "Потери урожая при уборке",
      "status": "implemented",
      "calculatorId": "g31-14",
      "href": "calculator.html?atlasTool=g31-14#labAtlasTools",
      "formula": "Потери = потерянная масса / доступная масса × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "loss",
          "label": "Масса потерь, кг",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "potential",
          "label": "Масса доступного до уборки урожая, кг",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Одна площадь и одинаковая влажность.",
      "reference": {
        "expected": 5,
        "actual": 5,
        "unit": "%",
        "tolerance": 5e-8,
        "status": "passed"
      },
      "researchSource": "https://agriculturecalculators.com/"
    },
    {
      "id": "g31-15",
      "group": "g31",
      "groupTitle": "Сельское хозяйство и агротехника",
      "topic": "Влажность зерна и пересчёт массы",
      "status": "implemented",
      "calculatorId": "g31-15",
      "href": "calculator.html?atlasTool=g31-15#labAtlasTools",
      "formula": "Конечная масса = исходная × (100 − влажность1)/(100 − влажность2).",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Исходная масса зерна, кг",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "before",
          "label": "Исходная влажность мокрой базы, %",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        },
        {
          "key": "after",
          "label": "Целевая влажность мокрой базы, %",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Сухое вещество сохраняется. Не учитывает механические и биологические потери.",
      "reference": {
        "expected": 88.88888888888889,
        "actual": 88.8888888889,
        "unit": "кг",
        "tolerance": 8.888888888888889e-7,
        "status": "passed"
      },
      "researchSource": "https://agriculturecalculators.com/"
    },
    {
      "id": "g31-16",
      "group": "g31",
      "groupTitle": "Сельское хозяйство и агротехника",
      "topic": "Масса зерна после сушки",
      "status": "implemented",
      "calculatorId": "g31-16",
      "href": "calculator.html?atlasTool=g31-16#labAtlasTools",
      "formula": "Конечная масса = исходная × (100 − влажность1)/(100 − влажность2).",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Исходная масса зерна, кг",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "before",
          "label": "Исходная влажность мокрой базы, %",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        },
        {
          "key": "after",
          "label": "Целевая влажность мокрой базы, %",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Сухое вещество сохраняется. Не учитывает механические и биологические потери.",
      "reference": {
        "expected": 88.88888888888889,
        "actual": 88.8888888889,
        "unit": "кг",
        "tolerance": 8.888888888888889e-7,
        "status": "passed"
      },
      "researchSource": "https://agriculturecalculators.com/"
    },
    {
      "id": "g31-17",
      "group": "g31",
      "groupTitle": "Сельское хозяйство и агротехника",
      "topic": "Ёмкость хранилища",
      "status": "implemented",
      "calculatorId": "g31-17",
      "href": "calculator.html?atlasTool=g31-17#labAtlasTools",
      "formula": "Вместимость = полезный объём × насыпная плотность / 1000.",
      "outputUnit": "т",
      "trigger": "live",
      "inputs": [
        {
          "key": "volume",
          "label": "Полезный объём хранилища, м³",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Насыпная плотность, кг/м³",
          "example": 750,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не нагрузочная проверка сооружения; насыпная плотность по партии.",
      "reference": {
        "expected": 75,
        "actual": 75,
        "unit": "т",
        "tolerance": 7.5e-7,
        "status": "passed"
      },
      "researchSource": "https://agriculturecalculators.com/"
    },
    {
      "id": "g31-18",
      "group": "g31",
      "groupTitle": "Сельское хозяйство и агротехника",
      "topic": "Средний урожай по выборке",
      "status": "implemented",
      "calculatorId": "g31-18",
      "href": "calculator.html?atlasTool=g31-18#labAtlasTools",
      "formula": "Урожайность = средняя масса/площадь × 10.",
      "outputUnit": "т/га",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Масса урожая с площадок, кг; через ;",
          "example": "1;2;3",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "area",
          "label": "Площадь каждой одинаковой площадки, м²",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Одинаковые репрезентативные площадки; влажность и уборочные потери согласуйте отдельно.",
      "reference": {
        "expected": 20,
        "actual": 20,
        "unit": "т/га",
        "tolerance": 2e-7,
        "status": "passed"
      },
      "researchSource": "https://agriculturecalculators.com/"
    },
    {
      "id": "g31-19",
      "group": "g31",
      "groupTitle": "Сельское хозяйство и агротехника",
      "topic": "Себестоимость гектара",
      "status": "implemented",
      "calculatorId": "g31-19",
      "href": "calculator.html?atlasTool=g31-19#labAtlasTools",
      "formula": "Себестоимость обработки площади = расходы/гектары.",
      "outputUnit": "₽/га",
      "trigger": "live",
      "inputs": [
        {
          "key": "cost",
          "label": "Все расходы по участку, ₽",
          "example": 100000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "area",
          "label": "Площадь участка, га",
          "example": 10,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не себестоимость тонны продукции.",
      "reference": {
        "expected": 10000,
        "actual": 10000,
        "unit": "₽/га",
        "tolerance": 0.0001,
        "status": "passed"
      },
      "researchSource": "https://agriculturecalculators.com/"
    },
    {
      "id": "g31-20",
      "group": "g31",
      "groupTitle": "Сельское хозяйство и агротехника",
      "topic": "Расход кормов на голову",
      "status": "implemented",
      "calculatorId": "g31-20",
      "href": "calculator.html?atlasTool=g31-20#labAtlasTools",
      "formula": "Потребность = головы × заданная норма × дни / 1000.",
      "outputUnit": "т",
      "trigger": "live",
      "inputs": [
        {
          "key": "heads",
          "label": "Голов",
          "example": 100,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "daily",
          "label": "Заданная суточная норма, кг/голову",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "days",
          "label": "Дней",
          "example": 30,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Норма рациона задаётся специалистом; это не баланс питательности.",
      "reference": {
        "expected": 30,
        "actual": 30,
        "unit": "т",
        "tolerance": 3e-7,
        "status": "passed"
      },
      "researchSource": "https://agriculturecalculators.com/"
    },
    {
      "id": "g32-1",
      "group": "g32",
      "groupTitle": "Математика, физика, общие расчёты",
      "topic": "Решение квадратного уравнения",
      "status": "implemented",
      "calculatorId": "g32-1",
      "href": "calculator.html?atlasTool=g32-1#labAtlasTools",
      "formula": "a x² + b x + c = 0. Устойчивое вычисление через q = −(b + sign(b) sqrt(D))/2.",
      "outputUnit": "корень 1",
      "trigger": "live",
      "inputs": [
        {
          "key": "a",
          "label": "Коэффициент a",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "b",
          "label": "Коэффициент b",
          "example": -3,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "c",
          "label": "Коэффициент c",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Действительные коэффициенты. Показывает также комплексно-сопряжённые корни и линейный случай.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "корень 1",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g32-2",
      "group": "g32",
      "groupTitle": "Математика, физика, общие расчёты",
      "topic": "Линейная интерполяция",
      "status": "implemented",
      "calculatorId": "g32-2",
      "href": "calculator.html?atlasTool=g32-2#labAtlasTools",
      "formula": "y = y1 + (x−x1)(y2−y1)/(x2−x1).",
      "outputUnit": "y",
      "trigger": "live",
      "inputs": [
        {
          "key": "x1",
          "label": "x1",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "y1",
          "label": "y1",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "x2",
          "label": "x2",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "y2",
          "label": "y2",
          "example": 20,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "x",
          "label": "Запрос x",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Вне опорного интервала выполняется экстраполяция с повышенным риском.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "y",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g32-3",
      "group": "g32",
      "groupTitle": "Математика, физика, общие расчёты",
      "topic": "Полиномиальная регрессия",
      "status": "implemented",
      "calculatorId": "g32-3",
      "href": "calculator.html?atlasTool=g32-3#labAtlasTools",
      "formula": "МНК полинома через QR после центрирования и нормирования x.",
      "outputUnit": "прогноз y",
      "trigger": "live",
      "inputs": [
        {
          "key": "x",
          "label": "x наблюдений через ;",
          "example": "0;1;2",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "y",
          "label": "y наблюдений через ;",
          "example": "1;2;5",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "degree",
          "label": "Степень полинома",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": [
            1,
            2,
            3,
            4,
            5
          ]
        },
        {
          "key": "query",
          "label": "x для прогноза",
          "example": 3,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "До 5-й степени. Коэффициенты выводятся для z=(x−центр)/масштаб; экстраполяция не гарантирует точность модели.",
      "reference": {
        "expected": 10,
        "actual": 10,
        "unit": "прогноз y",
        "tolerance": 1e-7,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g32-4",
      "group": "g32",
      "groupTitle": "Математика, физика, общие расчёты",
      "topic": "Логарифмический график",
      "status": "implemented",
      "calculatorId": "g32-4",
      "href": "calculator.html?atlasTool=g32-4#labAtlasTools",
      "formula": "График log10(y) от log10(x); наклон линейной МНК в логарифмических координатах.",
      "outputUnit": "наклон log-log",
      "trigger": "live",
      "inputs": [
        {
          "key": "x",
          "label": "Положительные x через ;",
          "example": "1;10;100",
          "positive": true,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "y",
          "label": "Положительные y через ;",
          "example": "1;100;10000",
          "positive": true,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Обе оси логарифмические. Значения ≤0 не определены; наклон не доказывает степенной физический закон.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "наклон log-log",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g32-5",
      "group": "g32",
      "groupTitle": "Математика, физика, общие расчёты",
      "topic": "Средневзвешенное значение",
      "status": "implemented",
      "calculatorId": "g32-5",
      "href": "calculator.html?atlasTool=g32-5#labAtlasTools",
      "formula": "Средневзвешенное = Σ wi xi / Σ wi.",
      "outputUnit": "единиц",
      "trigger": "live",
      "inputs": [
        {
          "key": "values",
          "label": "Значения через ;",
          "example": "1;3",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "weights",
          "label": "Неотрицательные веса через ;",
          "example": "1;3",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Содержательный смысл весов задаётся задачей.",
      "reference": {
        "expected": 2.5,
        "actual": 2.5,
        "unit": "единиц",
        "tolerance": 2.5e-8,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g32-6",
      "group": "g32",
      "groupTitle": "Математика, физика, общие расчёты",
      "topic": "Стандартная ошибка среднего",
      "status": "implemented",
      "calculatorId": "g32-6",
      "href": "calculator.html?atlasTool=g32-6#labAtlasTools",
      "formula": "SE = выборочное s/sqrt(n).",
      "outputUnit": "единиц",
      "trigger": "live",
      "inputs": [
        {
          "key": "values",
          "label": "Независимые измерения через ;",
          "example": "8;10;12",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Стандартная ошибка среднего, не разброс отдельных наблюдений.",
      "reference": {
        "expected": 1.1547005383792517,
        "actual": 1.15470053838,
        "unit": "единиц",
        "tolerance": 1.1547005383792517e-8,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g32-7",
      "group": "g32",
      "groupTitle": "Математика, физика, общие расчёты",
      "topic": "Интервал по t-распределению",
      "status": "implemented",
      "calculatorId": "g32-7",
      "href": "calculator.html?atlasTool=g32-7#labAtlasTools",
      "formula": "Интервал среднего = среднее ± t(ν=n−1) × s/sqrt(n).",
      "outputUnit": "полуширина",
      "trigger": "live",
      "inputs": [
        {
          "key": "values",
          "label": "Независимые измерения через ;",
          "example": "8;10;12",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "confidence",
          "label": "Двусторонний уровень доверия, %",
          "example": 95,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Нормальная независимая выборка, неизвестная дисперсия; квантиль t вычисляется численно, не подставляется нормальный z.",
      "reference": {
        "expected": 4.96827542350066,
        "actual": 4.9682754235,
        "unit": "полуширина",
        "tolerance": 4.9682754235006595e-8,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g32-8",
      "group": "g32",
      "groupTitle": "Математика, физика, общие расчёты",
      "topic": "Численное интегрирование трапецией",
      "status": "implemented",
      "calculatorId": "g32-8",
      "href": "calculator.html?atlasTool=g32-8#labAtlasTools",
      "formula": "Интеграл ≈ Σ (yi+yi+1)(xi+1−xi)/2.",
      "outputUnit": "единиц y×x",
      "trigger": "live",
      "inputs": [
        {
          "key": "x",
          "label": "Строго возрастающие x через ;",
          "example": "0;1;2",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "y",
          "label": "Значения y через ;",
          "example": "0;1;4",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Трапецеидальная аппроксимация по заданной сетке; не оценка ошибки интегрирования.",
      "reference": {
        "expected": 3,
        "actual": 3,
        "unit": "единиц y×x",
        "tolerance": 3.0000000000000004e-8,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g32-9",
      "group": "g32",
      "groupTitle": "Математика, физика, общие расчёты",
      "topic": "Численное дифференцирование",
      "status": "implemented",
      "calculatorId": "g32-9",
      "href": "calculator.html?atlasTool=g32-9#labAtlasTools",
      "formula": "Производная в середине ≈ (yправ−yлев)/(xправ−xлев).",
      "outputUnit": "единиц y/x",
      "trigger": "live",
      "inputs": [
        {
          "key": "left",
          "label": "x слева",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "yleft",
          "label": "y слева",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "right",
          "label": "x справа",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "yright",
          "label": "y справа",
          "example": 4,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Центральная двухточечная разность для середины интервала; не производная в произвольном x.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "единиц y/x",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g32-10",
      "group": "g32",
      "groupTitle": "Математика, физика, общие расчёты",
      "topic": "Метод Ньютона для корней",
      "status": "implemented",
      "calculatorId": "g32-10",
      "href": "calculator.html?atlasTool=g32-10#labAtlasTools",
      "formula": "xслед = x − f(x)/f′(x) для введённого кубического полинома.",
      "outputUnit": "корень",
      "trigger": "live",
      "inputs": [
        {
          "key": "a",
          "label": "a в ax³+bx²+cx+d",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "b",
          "label": "b",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "c",
          "label": "c",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "d",
          "label": "d",
          "example": -2,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "initial",
          "label": "Начальное x",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "tolerance",
          "label": "Абсолютный критерий |f(x)|",
          "example": 1e-12,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Поддерживаются полиномы до степени 3; произвольный JavaScript не исполняется. Метод не гарантирует сходимость или нахождение всех корней.",
      "reference": {
        "expected": 1.4142135623730951,
        "actual": 1.41421356237,
        "unit": "корень",
        "tolerance": 1.4142135623730952e-8,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g32-11",
      "group": "g32",
      "groupTitle": "Математика, физика, общие расчёты",
      "topic": "Матрица 2×2 определитель",
      "status": "implemented",
      "calculatorId": "g32-11",
      "href": "calculator.html?atlasTool=g32-11#labAtlasTools",
      "formula": "det A = a11 a22 − a12 a21.",
      "outputUnit": "определитель",
      "trigger": "live",
      "inputs": [
        {
          "key": "a",
          "label": "a11",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "b",
          "label": "a12",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "c",
          "label": "a21",
          "example": 3,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "d",
          "label": "a22",
          "example": 4,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Матрица 2×2.",
      "reference": {
        "expected": -2,
        "actual": -2,
        "unit": "определитель",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g32-12",
      "group": "g32",
      "groupTitle": "Математика, физика, общие расчёты",
      "topic": "Система 3×3 линейных уравнений",
      "status": "implemented",
      "calculatorId": "g32-12",
      "href": "calculator.html?atlasTool=g32-12#labAtlasTools",
      "formula": "Ax=b: исключение Гаусса с выбором ведущего элемента.",
      "outputUnit": "x1",
      "trigger": "live",
      "inputs": [
        {
          "key": "matrix",
          "label": "Матрица A: три строки, элементы через ;",
          "example": "1;0;0\n0;1;0\n0;0;1",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": true,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rhs",
          "label": "Вектор b через ;",
          "example": "1;2;3",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Для невырожденной 3×3; масштабные/плохо обусловленные системы отклоняются, а не получают произвольный ответ.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "x1",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g32-13",
      "group": "g32",
      "groupTitle": "Математика, физика, общие расчёты",
      "topic": "Векторное произведение",
      "status": "implemented",
      "calculatorId": "g32-13",
      "href": "calculator.html?atlasTool=g32-13#labAtlasTools",
      "formula": "A×B = (AyBz−AzBy, AzBx−AxBz, AxBy−AyBx).",
      "outputUnit": "X",
      "trigger": "live",
      "inputs": [
        {
          "key": "a",
          "label": "Вектор A из трёх координат через ;",
          "example": "1;0;0",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "b",
          "label": "Вектор B через ;",
          "example": "0;1;0",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Правая тройка осей, порядок A×B существенен.",
      "reference": {
        "expected": 0,
        "actual": 0,
        "unit": "X",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g32-14",
      "group": "g32",
      "groupTitle": "Математика, физика, общие расчёты",
      "topic": "Угол между векторами",
      "status": "implemented",
      "calculatorId": "g32-14",
      "href": "calculator.html?atlasTool=g32-14#labAtlasTools",
      "formula": "Угол = acos((A·B)/(|A||B|)).",
      "outputUnit": "градусы",
      "trigger": "live",
      "inputs": [
        {
          "key": "a",
          "label": "Вектор A через ;",
          "example": "1;0;0",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "b",
          "label": "Вектор B через ;",
          "example": "0;1;0",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Угол от 0 до 180° между ненулевыми векторами одной размерности.",
      "reference": {
        "expected": 90,
        "actual": 90,
        "unit": "градусы",
        "tolerance": 9.000000000000001e-7,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g32-15",
      "group": "g32",
      "groupTitle": "Математика, физика, общие расчёты",
      "topic": "Движение с постоянным ускорением",
      "status": "implemented",
      "calculatorId": "g32-15",
      "href": "calculator.html?atlasTool=g32-15#labAtlasTools",
      "formula": "Перемещение = v0t + at²/2; скорость = v0 + at.",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "initial",
          "label": "Начальная скорость, м/с",
          "example": 0,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "acceleration",
          "label": "Постоянное ускорение, м/с²",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "seconds",
          "label": "Время, с",
          "example": 3,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Прямолинейное движение с постоянным ускорением.",
      "reference": {
        "expected": 9,
        "actual": 9,
        "unit": "м",
        "tolerance": 9e-8,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g32-16",
      "group": "g32",
      "groupTitle": "Математика, физика, общие расчёты",
      "topic": "Кинетическая энергия",
      "status": "implemented",
      "calculatorId": "g32-16",
      "href": "calculator.html?atlasTool=g32-16#labAtlasTools",
      "formula": "E = mv²/2.",
      "outputUnit": "Дж",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Масса, кг",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "speed",
          "label": "Скорость по модулю, м/с",
          "example": 3,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Классическая механика, не релятивистская энергия.",
      "reference": {
        "expected": 9,
        "actual": 9,
        "unit": "Дж",
        "tolerance": 9e-8,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g32-17",
      "group": "g32",
      "groupTitle": "Математика, физика, общие расчёты",
      "topic": "Потенциальная энергия",
      "status": "implemented",
      "calculatorId": "g32-17",
      "href": "calculator.html?atlasTool=g32-17#labAtlasTools",
      "formula": "Ep = mgh.",
      "outputUnit": "Дж",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Масса, кг",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "height",
          "label": "Высота относительно datum, м",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "g",
          "label": "Ускорение тяжести, м/с²",
          "example": 9.80665,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Постоянное g и выбранный нуль потенциальной энергии.",
      "reference": {
        "expected": 196.133,
        "actual": 196.133,
        "unit": "Дж",
        "tolerance": 0.00000196133,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g32-18",
      "group": "g32",
      "groupTitle": "Математика, физика, общие расчёты",
      "topic": "Импульс тела",
      "status": "implemented",
      "calculatorId": "g32-18",
      "href": "calculator.html?atlasTool=g32-18#labAtlasTools",
      "formula": "p = mv.",
      "outputUnit": "кг·м/с",
      "trigger": "live",
      "inputs": [
        {
          "key": "mass",
          "label": "Масса, кг",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "velocity",
          "label": "Скорость по выбранной оси, м/с",
          "example": 3,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Одна компонента импульса в классической механике.",
      "reference": {
        "expected": 6,
        "actual": 6,
        "unit": "кг·м/с",
        "tolerance": 6.000000000000001e-8,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g32-19",
      "group": "g32",
      "groupTitle": "Математика, физика, общие расчёты",
      "topic": "Период маятника",
      "status": "implemented",
      "calculatorId": "g32-19",
      "href": "calculator.html?atlasTool=g32-19#labAtlasTools",
      "formula": "T = 2π sqrt(L/g).",
      "outputUnit": "с",
      "trigger": "live",
      "inputs": [
        {
          "key": "length",
          "label": "Длина математического маятника, м",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "g",
          "label": "g, м/с²",
          "example": 9.80665,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Малые колебания точечной массы на невесомой нерастяжимой нити, без затухания.",
      "reference": {
        "expected": 2.0064092925890407,
        "actual": 2.00640929259,
        "unit": "с",
        "tolerance": 2.0064092925890407e-8,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g32-20",
      "group": "g32",
      "groupTitle": "Математика, физика, общие расчёты",
      "topic": "Частота колебаний",
      "status": "implemented",
      "calculatorId": "g32-20",
      "href": "calculator.html?atlasTool=g32-20#labAtlasTools",
      "formula": "f = 1/T.",
      "outputUnit": "Гц",
      "trigger": "live",
      "inputs": [
        {
          "key": "period",
          "label": "Период, с",
          "example": 0.5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Для установившихся периодических колебаний.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "Гц",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g32-21",
      "group": "g32",
      "groupTitle": "Математика, физика, общие расчёты",
      "topic": "Энергия конденсатора",
      "status": "implemented",
      "calculatorId": "g32-21",
      "href": "calculator.html?atlasTool=g32-21#labAtlasTools",
      "formula": "E = C U²/2.",
      "outputUnit": "Дж",
      "trigger": "live",
      "inputs": [
        {
          "key": "capacitance",
          "label": "Ёмкость, мкФ",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "voltage",
          "label": "Напряжение, В",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Идеальный линейный конденсатор, без потерь разряда.",
      "reference": {
        "expected": 0.05,
        "actual": 0.05,
        "unit": "Дж",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g32-22",
      "group": "g32",
      "groupTitle": "Математика, физика, общие расчёты",
      "topic": "Средняя погрешность измерений",
      "status": "implemented",
      "calculatorId": "g32-22",
      "href": "calculator.html?atlasTool=g32-22#labAtlasTools",
      "formula": "MAE = среднее абсолютных погрешностей.",
      "outputUnit": "единиц",
      "trigger": "live",
      "inputs": [
        {
          "key": "errors",
          "label": "Погрешности относительно опорного значения через ;",
          "example": "-1;0;1",
          "positive": false,
          "integer": false,
          "signed": true,
          "list": true,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "MAE, не средняя знаковая погрешность, RMSE или неопределённость.",
      "reference": {
        "expected": 0.6666666666666666,
        "actual": 0.666666666667,
        "unit": "единиц",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://turn2engineering.com/calculators"
    },
    {
      "id": "g33-1",
      "group": "g33",
      "groupTitle": "ИТ, вычислительные форматы и сети",
      "topic": "Перевод BIN/OCT/DEC/HEX",
      "status": "implemented",
      "calculatorId": "g33-1",
      "href": "calculator.html?atlasTool=g33-1#labAtlasTools",
      "formula": "Целое значение записывается в основаниях 2, 8 и 16.",
      "outputUnit": "DEC",
      "trigger": "live",
      "inputs": [
        {
          "key": "value",
          "label": "Десятичное целое число",
          "example": 255,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Беззнаковые целые в безопасном диапазоне JavaScript; текстовые коды сохраняются без округления.",
      "reference": {
        "expected": 255,
        "actual": 255,
        "unit": "DEC",
        "tolerance": 0.00000255,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g33-2",
      "group": "g33",
      "groupTitle": "ИТ, вычислительные форматы и сети",
      "topic": "IEEE-754 представление Float16",
      "status": "implemented",
      "calculatorId": "g33-2",
      "href": "calculator.html?atlasTool=g33-2#labAtlasTools",
      "formula": "Кодирование IEEE-754 выбранного формата с округлением.",
      "outputUnit": "fp16",
      "trigger": "live",
      "inputs": [
        {
          "key": "value",
          "label": "Конечное десятичное число",
          "example": 1.5,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Показываются реальное хранимое значение и его битовый код. Не конечные значения в этом числовом представлении отклоняются.",
      "reference": {
        "expected": 1.5,
        "actual": 1.5,
        "unit": "fp16",
        "tolerance": 1.5000000000000002e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g33-3",
      "group": "g33",
      "groupTitle": "ИТ, вычислительные форматы и сети",
      "topic": "IEEE-754 представление Float32",
      "status": "implemented",
      "calculatorId": "g33-3",
      "href": "calculator.html?atlasTool=g33-3#labAtlasTools",
      "formula": "Кодирование IEEE-754 выбранного формата с округлением.",
      "outputUnit": "fp32",
      "trigger": "live",
      "inputs": [
        {
          "key": "value",
          "label": "Конечное десятичное число",
          "example": 1.5,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Показываются реальное хранимое значение и его битовый код. Не конечные значения в этом числовом представлении отклоняются.",
      "reference": {
        "expected": 1.5,
        "actual": 1.5,
        "unit": "fp32",
        "tolerance": 1.5000000000000002e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g33-4",
      "group": "g33",
      "groupTitle": "ИТ, вычислительные форматы и сети",
      "topic": "IEEE-754 представление Float64",
      "status": "implemented",
      "calculatorId": "g33-4",
      "href": "calculator.html?atlasTool=g33-4#labAtlasTools",
      "formula": "Кодирование IEEE-754 выбранного формата с округлением.",
      "outputUnit": "fp64",
      "trigger": "live",
      "inputs": [
        {
          "key": "value",
          "label": "Конечное десятичное число",
          "example": 1.5,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Показываются реальное хранимое значение и его битовый код. Не конечные значения в этом числовом представлении отклоняются.",
      "reference": {
        "expected": 1.5,
        "actual": 1.5,
        "unit": "fp64",
        "tolerance": 1.5000000000000002e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g33-5",
      "group": "g33",
      "groupTitle": "ИТ, вычислительные форматы и сети",
      "topic": "bfloat16/TF32 конвертер",
      "status": "implemented",
      "calculatorId": "g33-5",
      "href": "calculator.html?atlasTool=g33-5#labAtlasTools",
      "formula": "Кодирование IEEE-754 выбранного формата с округлением.",
      "outputUnit": "bf16",
      "trigger": "live",
      "inputs": [
        {
          "key": "value",
          "label": "Конечное десятичное число",
          "example": 1.5,
          "positive": false,
          "integer": false,
          "signed": true,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Показываются bfloat16 и логический 19-битный TF32. Формат не является 32-битным аппаратным словом.",
      "reference": {
        "expected": 1.5,
        "actual": 1.5,
        "unit": "bf16",
        "tolerance": 1.5000000000000002e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g33-6",
      "group": "g33",
      "groupTitle": "ИТ, вычислительные форматы и сети",
      "topic": "CRC16 Modbus",
      "status": "implemented",
      "calculatorId": "g33-6",
      "href": "calculator.html?atlasTool=g33-6#labAtlasTools",
      "formula": "CRC-16/MODBUS: init FFFF, отражённый полином A001, xorout 0000.",
      "outputUnit": "CRC16",
      "trigger": "live",
      "inputs": [
        {
          "key": "hex",
          "label": "Байты HEX через пробел, например 31 32 33",
          "example": "31 32 33 34 35 36 37 38 39",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": true,
          "pattern": "^(?:[0-9A-Fa-f]{2}\\s*)+$",
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Вектор ASCII 123456789 → 4B37. В Modbus RTU младший байт CRC передаётся первым.",
      "reference": {
        "expected": 19255,
        "actual": 19255,
        "unit": "CRC16",
        "tolerance": 0.00019255,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g33-7",
      "group": "g33",
      "groupTitle": "ИТ, вычислительные форматы и сети",
      "topic": "CRC32 Ethernet",
      "status": "implemented",
      "calculatorId": "g33-7",
      "href": "calculator.html?atlasTool=g33-7#labAtlasTools",
      "formula": "CRC-32/ISO-HDLC (Ethernet): init FFFFFFFF, reflected EDB88320, xorout FFFFFFFF.",
      "outputUnit": "CRC32",
      "trigger": "live",
      "inputs": [
        {
          "key": "hex",
          "label": "Байты HEX через пробел, например 31 32 33",
          "example": "31 32 33 34 35 36 37 38 39",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": true,
          "pattern": "^(?:[0-9A-Fa-f]{2}\\s*)+$",
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Вектор ASCII 123456789 → CBF43926. Это не CRC-32C.",
      "reference": {
        "expected": 3421780262,
        "actual": 3421780262,
        "unit": "CRC32",
        "tolerance": 34.21780262,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g33-8",
      "group": "g33",
      "groupTitle": "ИТ, вычислительные форматы и сети",
      "topic": "Контрольная сумма XOR",
      "status": "implemented",
      "calculatorId": "g33-8",
      "href": "calculator.html?atlasTool=g33-8#labAtlasTools",
      "formula": "Checksum = побитовое XOR всех байтов.",
      "outputUnit": "uint8",
      "trigger": "live",
      "inputs": [
        {
          "key": "hex",
          "label": "Байты HEX через пробел, например 31 32 33",
          "example": "31 32 33 34 35 36 37 38 39",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": true,
          "pattern": "^(?:[0-9A-Fa-f]{2}\\s*)+$",
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не криптографическая контрольная сумма; начальное значение 0.",
      "reference": {
        "expected": 49,
        "actual": 49,
        "unit": "uint8",
        "tolerance": 4.9e-7,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g33-9",
      "group": "g33",
      "groupTitle": "ИТ, вычислительные форматы и сети",
      "topic": "Проверка паритета",
      "status": "implemented",
      "calculatorId": "g33-9",
      "href": "calculator.html?atlasTool=g33-9#labAtlasTools",
      "formula": "Бит even parity = число единиц mod 2.",
      "outputUnit": "even parity",
      "trigger": "live",
      "inputs": [
        {
          "key": "bits",
          "label": "Бинарная строка",
          "example": "1011",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": true,
          "pattern": "^[01]+$",
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Бит добавляется к введённым данным для чётного/нечётного общего числа единиц.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "even parity",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g33-10",
      "group": "g33",
      "groupTitle": "ИТ, вычислительные форматы и сети",
      "topic": "Декодирование BCD",
      "status": "implemented",
      "calculatorId": "g33-10",
      "href": "calculator.html?atlasTool=g33-10#labAtlasTools",
      "formula": "Четыре BCD-тетрады 0…9 переводятся в десятичное число.",
      "outputUnit": "число",
      "trigger": "live",
      "inputs": [
        {
          "key": "word",
          "label": "BCD как десятичный uint16 (0x1234=4660)",
          "example": 4660,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 65535,
          "choices": null
        }
      ],
      "limits": "Только упакованный 16-битный BCD без знакового разряда.",
      "reference": {
        "expected": 1234,
        "actual": 1234,
        "unit": "число",
        "tolerance": 0.00001234,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g33-11",
      "group": "g33",
      "groupTitle": "ИТ, вычислительные форматы и сети",
      "topic": "Signed/Unsigned целые",
      "status": "implemented",
      "calculatorId": "g33-11",
      "href": "calculator.html?atlasTool=g33-11#labAtlasTools",
      "formula": "Signed = u ≥ 2^(n−1) ? u−2^n : u.",
      "outputUnit": "signed",
      "trigger": "live",
      "inputs": [
        {
          "key": "word",
          "label": "Беззнаковое представление",
          "example": 255,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 4294967295,
          "choices": null
        },
        {
          "key": "bits",
          "label": "Разрядность",
          "example": 8,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": [
            8,
            16,
            32
          ]
        }
      ],
      "limits": "Двоичный дополнительный код заданной ширины; введённое значение должно помещаться в неё.",
      "reference": {
        "expected": -1,
        "actual": -1,
        "unit": "signed",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g33-12",
      "group": "g33",
      "groupTitle": "ИТ, вычислительные форматы и сети",
      "topic": "Двоичный дополнительный код",
      "status": "implemented",
      "calculatorId": "g33-12",
      "href": "calculator.html?atlasTool=g33-12#labAtlasTools",
      "formula": "Signed = u ≥ 2^(n−1) ? u−2^n : u.",
      "outputUnit": "signed",
      "trigger": "live",
      "inputs": [
        {
          "key": "word",
          "label": "Беззнаковое представление",
          "example": 255,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 4294967295,
          "choices": null
        },
        {
          "key": "bits",
          "label": "Разрядность",
          "example": 8,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": [
            8,
            16,
            32
          ]
        }
      ],
      "limits": "Двоичный дополнительный код заданной ширины; введённое значение должно помещаться в неё.",
      "reference": {
        "expected": -1,
        "actual": -1,
        "unit": "signed",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g33-13",
      "group": "g33",
      "groupTitle": "ИТ, вычислительные форматы и сети",
      "topic": "Битовые маски и сдвиги",
      "status": "implemented",
      "calculatorId": "g33-13",
      "href": "calculator.html?atlasTool=g33-13#labAtlasTools",
      "formula": "Результат = ((word << shift) AND mask) modulo 2³².",
      "outputUnit": "uint32",
      "trigger": "live",
      "inputs": [
        {
          "key": "word",
          "label": "Исходное uint32",
          "example": 10,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 4294967295,
          "choices": null
        },
        {
          "key": "shift",
          "label": "Сдвиг влево, бит",
          "example": 1,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 31,
          "choices": null
        },
        {
          "key": "mask",
          "label": "Маска uint32",
          "example": 255,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 4294967295,
          "choices": null
        }
      ],
      "limits": "32-битные операции, выходящие старшие биты отбрасываются.",
      "reference": {
        "expected": 20,
        "actual": 20,
        "unit": "uint32",
        "tolerance": 2e-7,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g33-14",
      "group": "g33",
      "groupTitle": "ИТ, вычислительные форматы и сети",
      "topic": "IPv4 адрес и CIDR",
      "status": "implemented",
      "calculatorId": "g33-14",
      "href": "calculator.html?atlasTool=g33-14#labAtlasTools",
      "formula": "Сеть = адрес AND маска; размер блока = 2^(32−префикс).",
      "outputUnit": "адресов узлов",
      "trigger": "live",
      "inputs": [
        {
          "key": "address",
          "label": "Адрес IPv4",
          "example": "192.168.1.10",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": true,
          "pattern": "^\\d{1,3}(?:\\.\\d{1,3}){3}$",
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "prefix",
          "label": "Длина CIDR",
          "example": 24,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 32,
          "choices": null
        }
      ],
      "limits": "Для /31 применяется point-to-point RFC 3021 (2 адреса), для /32 — один адрес. Не учитывает внешние ограничения использования диапазона.",
      "reference": {
        "expected": 254,
        "actual": 254,
        "unit": "адресов узлов",
        "tolerance": 0.0000025400000000000002,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g33-15",
      "group": "g33",
      "groupTitle": "ИТ, вычислительные форматы и сети",
      "topic": "Подсети IPv6",
      "status": "implemented",
      "calculatorId": "g33-15",
      "href": "calculator.html?atlasTool=g33-15#labAtlasTools",
      "formula": "Подсетей = 2^(новый−исходный); адреса и маски вычисляются как 128-битные целые.",
      "outputUnit": "добавленных бит",
      "trigger": "live",
      "inputs": [
        {
          "key": "address",
          "label": "IPv6 без зоны и IPv4-хвоста",
          "example": "2001:db8::",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": true,
          "pattern": "^[0-9A-Fa-f:]+$",
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "prefix",
          "label": "Исходный префикс",
          "example": 48,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 128,
          "choices": null
        },
        {
          "key": "next",
          "label": "Новый префикс",
          "example": 64,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 128,
          "choices": null
        },
        {
          "key": "index",
          "label": "Номер нужной подсети с нуля (десятичное целое)",
          "example": "0",
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": true,
          "pattern": "^(?:0|[1-9]\\d*)$",
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "IPv6 0…128, без zone-id и смешанной dotted IPv4 формы. Не вычитает broadcast: в IPv6 его нет.",
      "reference": {
        "expected": 16,
        "actual": 16,
        "unit": "добавленных бит",
        "tolerance": 1.6e-7,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g33-16",
      "group": "g33",
      "groupTitle": "ИТ, вычислительные форматы и сети",
      "topic": "Пропускная способность сети",
      "status": "implemented",
      "calculatorId": "g33-16",
      "href": "calculator.html?atlasTool=g33-16#labAtlasTools",
      "formula": "Полезная скорость = линия × полезные байты/все байты.",
      "outputUnit": "Мбит/с",
      "trigger": "live",
      "inputs": [
        {
          "key": "payload",
          "label": "Полезных байтов в пакете",
          "example": 1400,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "packet",
          "label": "Всего передаваемых байтов на пакет",
          "example": 1500,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "line",
          "label": "Скорость линии, Мбит/с",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Постоянный поток без пауз и повторных передач; полный overhead должен войти в размер пакета.",
      "reference": {
        "expected": 93.33333333333333,
        "actual": 93.3333333333,
        "unit": "Мбит/с",
        "tolerance": 9.333333333333333e-7,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g33-17",
      "group": "g33",
      "groupTitle": "ИТ, вычислительные форматы и сети",
      "topic": "Время передачи файла",
      "status": "implemented",
      "calculatorId": "transfer",
      "href": "calculator.html?atlasTool=transfer#labAtlasTools",
      "formula": "t, с = МиБ × 1 048 576 × 8 / (Мбит/с × 1 000 000 × доля/100).",
      "outputUnit": "с",
      "trigger": "live",
      "inputs": [
        {
          "key": "size",
          "label": "Размер файла, МиБ (1 МиБ = 1 048 576 байт)",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rate",
          "label": "Скорость канала, Мбит/с",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "efficiency",
          "label": "Доля скорости для полезных данных, %",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "Постоянная полезная скорость. Не учитывает установку соединения, паузы и повторные передачи; 100% — идеальная граница.",
      "reference": {
        "expected": 8.388608,
        "actual": 8.388608,
        "unit": "с",
        "tolerance": 8.388608e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g33-18",
      "group": "g33",
      "groupTitle": "ИТ, вычислительные форматы и сети",
      "topic": "RTT и задержка передачи",
      "status": "implemented",
      "calculatorId": "g33-18",
      "href": "calculator.html?atlasTool=g33-18#labAtlasTools",
      "formula": "RTT = 2 × расстояние/скорость × 1000 + обработка.",
      "outputUnit": "мс",
      "trigger": "live",
      "inputs": [
        {
          "key": "distance",
          "label": "Односторонняя длина пути, км",
          "example": 100,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "speed",
          "label": "Скорость распространения, км/с",
          "example": 200000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "processing",
          "label": "Обработка и очереди за полный цикл, мс",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Симметричный путь; сериализация пакета не включена.",
      "reference": {
        "expected": 2,
        "actual": 2,
        "unit": "мс",
        "tolerance": 2e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g33-19",
      "group": "g33",
      "groupTitle": "ИТ, вычислительные форматы и сети",
      "topic": "Частота дискретизации Найквиста",
      "status": "implemented",
      "calculatorId": "g33-19",
      "href": "calculator.html?atlasTool=g33-19#labAtlasTools",
      "formula": "Теоретическая граница fs = 2 fmax.",
      "outputUnit": "отсчётов/с",
      "trigger": "live",
      "inputs": [
        {
          "key": "frequency",
          "label": "Максимальная частота сигнала, Гц",
          "example": 20000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Для идеально ограниченного спектра. Практически требуется запас и антиалиасинговый фильтр; равенство не обеспечивает реальную реконструкцию любого сигнала.",
      "reference": {
        "expected": 40000,
        "actual": 40000,
        "unit": "отсчётов/с",
        "tolerance": 0.0004,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g33-20",
      "group": "g33",
      "groupTitle": "ИТ, вычислительные форматы и сети",
      "topic": "Размер PCM-аудио",
      "status": "implemented",
      "calculatorId": "pcm",
      "href": "calculator.html?atlasTool=pcm#labAtlasTools",
      "formula": "Байты = ceil(частота × длительность) × разрядность/8 × число каналов.",
      "outputUnit": "байт",
      "trigger": "live",
      "inputs": [
        {
          "key": "rate",
          "label": "Частота дискретизации, Гц",
          "example": 44100,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "bits",
          "label": "Разрядность отсчёта, бит",
          "example": 16,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": [
            8,
            16,
            24,
            32
          ]
        },
        {
          "key": "channels",
          "label": "Каналов",
          "example": 2,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 64,
          "choices": null
        },
        {
          "key": "duration",
          "label": "Длительность, с",
          "example": 60,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Несжатый PCM, без заголовка WAV и метаданных. Число отсчётов на канал округляется вверх до целого.",
      "reference": {
        "expected": 10584000,
        "actual": 10584000,
        "unit": "байт",
        "tolerance": 0.10584,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g33-21",
      "group": "g33",
      "groupTitle": "ИТ, вычислительные форматы и сети",
      "topic": "Полоса видеопотока по битрейту",
      "status": "implemented",
      "calculatorId": "g33-21",
      "href": "calculator.html?atlasTool=g33-21#labAtlasTools",
      "formula": "Полоса = (видео + аудио/1000) × (1 + надбавка/100).",
      "outputUnit": "Мбит/с",
      "trigger": "live",
      "inputs": [
        {
          "key": "video",
          "label": "Видеобитрейт, Мбит/с",
          "example": 5,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "audio",
          "label": "Аудиобитрейт, кбит/с",
          "example": 128,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "overhead",
          "label": "Надбавка протокола, %",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Средний поток, не достаточная гарантия для пиков VBR.",
      "reference": {
        "expected": 5.6408,
        "actual": 5.6408,
        "unit": "Мбит/с",
        "tolerance": 5.6408e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g33-22",
      "group": "g33",
      "groupTitle": "ИТ, вычислительные форматы и сети",
      "topic": "Коэффициент сжатия данных",
      "status": "implemented",
      "calculatorId": "g33-22",
      "href": "calculator.html?atlasTool=g33-22#labAtlasTools",
      "formula": "Коэффициент = исходный/сжатый; экономия = (1 − сжатый/исходный) × 100.",
      "outputUnit": "раз",
      "trigger": "live",
      "inputs": [
        {
          "key": "original",
          "label": "Исходный размер, байт",
          "example": 1000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "compressed",
          "label": "Сжатый размер, байт",
          "example": 250,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Отношение меньше единицы означает рост размера.",
      "reference": {
        "expected": 4,
        "actual": 4,
        "unit": "раз",
        "tolerance": 4e-8,
        "status": "passed"
      },
      "researchSource": "https://www.engineercalculators.com/"
    },
    {
      "id": "g34-1",
      "group": "g34",
      "groupTitle": "Полиграфия, древесина, упаковка",
      "topic": "Площадь печатного листа",
      "status": "implemented",
      "calculatorId": "g34-1",
      "href": "calculator.html?atlasTool=g34-1#labAtlasTools",
      "formula": "Площадь = ширина × длина / 10⁶.",
      "outputUnit": "м²",
      "trigger": "live",
      "inputs": [
        {
          "key": "width",
          "label": "Ширина листа, мм",
          "example": 500,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Длина листа, мм",
          "example": 700,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Физический лист, без вычета непечатаемых полей.",
      "reference": {
        "expected": 0.35,
        "actual": 0.35,
        "unit": "м²",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g34-2",
      "group": "g34",
      "groupTitle": "Полиграфия, древесина, упаковка",
      "topic": "Количество полос на печатном листе",
      "status": "implemented",
      "calculatorId": "g34-2",
      "href": "calculator.html?atlasTool=g34-2#labAtlasTools",
      "formula": "Полосы = максимум двух регулярных ориентаций прямоугольников.",
      "outputUnit": "полос/сторону",
      "trigger": "live",
      "inputs": [
        {
          "key": "sheetw",
          "label": "Полезная ширина печатного листа, мм",
          "example": 500,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "sheetl",
          "label": "Полезная длина листа, мм",
          "example": 700,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "pagew",
          "label": "Ширина полосы с припусками, мм",
          "example": 200,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "pagel",
          "label": "Длина полосы с припусками, мм",
          "example": 300,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не спуск полос книги, не фальцовка; только геометрическая укладка с уже включёнными припусками.",
      "reference": {
        "expected": 4,
        "actual": 4,
        "unit": "полос/сторону",
        "tolerance": 4e-8,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g34-3",
      "group": "g34",
      "groupTitle": "Полиграфия, древесина, упаковка",
      "topic": "Расход бумаги на тираж",
      "status": "implemented",
      "calculatorId": "g34-3",
      "href": "calculator.html?atlasTool=g34-3#labAtlasTools",
      "formula": "Листы = ceil(экземпляры × страницы/страниц на лист × (1 + запас/100)) + приладка.",
      "outputUnit": "листов",
      "trigger": "live",
      "inputs": [
        {
          "key": "copies",
          "label": "Экземпляров",
          "example": 1000,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "pages",
          "label": "Печатных страниц в экземпляре",
          "example": 16,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "per",
          "label": "Страниц на один физический лист с учётом сторон",
          "example": 8,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "setup",
          "label": "Листов на приладку",
          "example": 50,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "reserve",
          "label": "Процент запаса к тиражным листам",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 100,
          "choices": null
        }
      ],
      "limits": "В per учитываются стороны; не добавляйте двусторонность повторно.",
      "reference": {
        "expected": 2250,
        "actual": 2250,
        "unit": "листов",
        "tolerance": 0.0000225,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g34-4",
      "group": "g34",
      "groupTitle": "Полиграфия, древесина, упаковка",
      "topic": "Масса бумаги по GSM",
      "status": "implemented",
      "calculatorId": "g34-4",
      "href": "calculator.html?atlasTool=g34-4#labAtlasTools",
      "formula": "Масса = площадь × GSM / 1000.",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "area",
          "label": "Площадь бумаги, м²",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "gsm",
          "label": "Поверхностная плотность, г/м²",
          "example": 80,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Масса самой бумаги без покрытия сверх указанного GSM.",
      "reference": {
        "expected": 0.8,
        "actual": 0.8,
        "unit": "кг",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g34-5",
      "group": "g34",
      "groupTitle": "Полиграфия, древесина, упаковка",
      "topic": "Вес пачки листов",
      "status": "implemented",
      "calculatorId": "g34-5",
      "href": "calculator.html?atlasTool=g34-5#labAtlasTools",
      "formula": "Масса = ширина × высота/10⁶ × GSM × листы/1000.",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "width",
          "label": "Ширина листа, мм",
          "example": 210,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "height",
          "label": "Высота листа, мм",
          "example": 297,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "gsm",
          "label": "GSM, г/м²",
          "example": 80,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "qty",
          "label": "Листов в пачке",
          "example": 500,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Без упаковки пачки.",
      "reference": {
        "expected": 2.4948,
        "actual": 2.4948,
        "unit": "кг",
        "tolerance": 2.4948000000000003e-8,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g34-6",
      "group": "g34",
      "groupTitle": "Полиграфия, древесина, упаковка",
      "topic": "Печатные отходы при приладке",
      "status": "implemented",
      "calculatorId": "g34-6",
      "href": "calculator.html?atlasTool=g34-6#labAtlasTools",
      "formula": "Приладочные отходы = приладочные листы/все поданные × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "setup",
          "label": "Потрачено приладочных листов",
          "example": 50,
          "positive": false,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "total",
          "label": "Всего подано листов",
          "example": 1000,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Знаменатель включает приладочные листы.",
      "reference": {
        "expected": 5,
        "actual": 5,
        "unit": "%",
        "tolerance": 5e-8,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g34-7",
      "group": "g34",
      "groupTitle": "Полиграфия, древесина, упаковка",
      "topic": "Стоимость тиража",
      "status": "implemented",
      "calculatorId": "g34-7",
      "href": "calculator.html?atlasTool=g34-7#labAtlasTools",
      "formula": "Себестоимость единицы = сумма заданных затрат/годные экземпляры.",
      "outputUnit": "₽/экз",
      "trigger": "live",
      "inputs": [
        {
          "key": "paper",
          "label": "Бумага, ₽",
          "example": 10000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "printing",
          "label": "Печать, ₽",
          "example": 5000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "finishing",
          "label": "Послепечатные работы, ₽",
          "example": 3000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "setup",
          "label": "Разовая подготовка, ₽",
          "example": 2000,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "copies",
          "label": "Годных экземпляров",
          "example": 1000,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Наценка, налоги и доставка не добавляются автоматически.",
      "reference": {
        "expected": 20,
        "actual": 20,
        "unit": "₽/экз",
        "tolerance": 2e-7,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g34-8",
      "group": "g34",
      "groupTitle": "Полиграфия, древесина, упаковка",
      "topic": "Площадь этикеток на рулоне",
      "status": "implemented",
      "calculatorId": "g34-8",
      "href": "calculator.html?atlasTool=g34-8#labAtlasTools",
      "formula": "Площадь самих этикеток = ширина × высота × количество / 10⁶.",
      "outputUnit": "м²",
      "trigger": "live",
      "inputs": [
        {
          "key": "width",
          "label": "Ширина этикетки, мм",
          "example": 50,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "height",
          "label": "Высота этикетки, мм",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "qty",
          "label": "Этикеток",
          "example": 1000,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Без подложки, межэтикеточных зазоров и облоя.",
      "reference": {
        "expected": 5,
        "actual": 5,
        "unit": "м²",
        "tolerance": 5e-8,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g34-9",
      "group": "g34",
      "groupTitle": "Полиграфия, древесина, упаковка",
      "topic": "Длина рулона этикеток",
      "status": "implemented",
      "calculatorId": "g34-9",
      "href": "calculator.html?atlasTool=g34-9#labAtlasTools",
      "formula": "Длина = ceil(этикетки / число ручьёв) × шаг / 1000.",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "pitch",
          "label": "Шаг этикетки вдоль рулона, мм",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "qty",
          "label": "Этикеток",
          "example": 1000,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "lanes",
          "label": "Этикеток по ширине",
          "example": 2,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Стартовые и концевые участки добавляются отдельно.",
      "reference": {
        "expected": 50,
        "actual": 50,
        "unit": "м",
        "tolerance": 5e-7,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g34-10",
      "group": "g34",
      "groupTitle": "Полиграфия, древесина, упаковка",
      "topic": "Верхняя оценка коробов по площади",
      "status": "implemented",
      "calculatorId": "g34-10",
      "href": "calculator.html?atlasTool=g34-10#labAtlasTools",
      "formula": "Коробов по площади ≤ floor(площадь листа/площадь развёртки).",
      "outputUnit": "коробов (верхняя оценка)",
      "trigger": "live",
      "inputs": [
        {
          "key": "sheet",
          "label": "Полезная площадь гофролиста, м²",
          "example": 2,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "blank",
          "label": "Площадь одной развёртки короба с припусками, м²",
          "example": 0.3,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Только верхняя оценка по площади, не гарантированная раскладка. Форма развёртки, направление гофры и отходы могут уменьшить выход.",
      "reference": {
        "expected": 6,
        "actual": 6,
        "unit": "коробов (верхняя оценка)",
        "tolerance": 6.000000000000001e-8,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g34-11",
      "group": "g34",
      "groupTitle": "Полиграфия, древесина, упаковка",
      "topic": "Коэффициент использования листа",
      "status": "implemented",
      "calculatorId": "g34-11",
      "href": "calculator.html?atlasTool=g34-11#labAtlasTools",
      "formula": "Использование = площадь заготовок/площадь листа × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "useful",
          "label": "Суммарная площадь заготовок, м²",
          "example": 0.8,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "sheet",
          "label": "Площадь исходного листа, м²",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не включает неперечисленные остатки и рез.",
      "reference": {
        "expected": 80,
        "actual": 80,
        "unit": "%",
        "tolerance": 8e-7,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g34-12",
      "group": "g34",
      "groupTitle": "Полиграфия, древесина, упаковка",
      "topic": "Объём древесины в брусе",
      "status": "implemented",
      "calculatorId": "timber",
      "href": "calculator.html?atlasTool=timber#labAtlasTools",
      "formula": "V, м³ = длина, м × ширина, мм × высота, мм × количество / 1 000 000.",
      "outputUnit": "м³",
      "trigger": "live",
      "inputs": [
        {
          "key": "length",
          "label": "Длина одного бруса, м",
          "example": 6,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "width",
          "label": "Ширина сечения, мм",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "height",
          "label": "Высота сечения, мм",
          "example": 150,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "quantity",
          "label": "Количество одинаковых брусьев, шт",
          "example": 10,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Прямоугольное постоянное сечение. Без припусков, отходов, усушки и поправок на влажность.",
      "reference": {
        "expected": 0.9,
        "actual": 0.9,
        "unit": "м³",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g34-13",
      "group": "g34",
      "groupTitle": "Полиграфия, древесина, упаковка",
      "topic": "Объём кругляка по геометрии",
      "status": "implemented",
      "calculatorId": "g34-13",
      "href": "calculator.html?atlasTool=g34-13#labAtlasTools",
      "formula": "V = πD²L/4.",
      "outputUnit": "м³",
      "trigger": "live",
      "inputs": [
        {
          "key": "diameter",
          "label": "Диаметр цилиндрического бревна, м",
          "example": 0.2,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "length",
          "label": "Длина, м",
          "example": 5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Цилиндрическое приближение, без сбега, коры и нормативных таблиц круглого леса.",
      "reference": {
        "expected": 0.15707963267948966,
        "actual": 0.157079632679,
        "unit": "м³",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g34-14",
      "group": "g34",
      "groupTitle": "Полиграфия, древесина, упаковка",
      "topic": "Масса пиломатериала по плотности",
      "status": "implemented",
      "calculatorId": "g34-14",
      "href": "calculator.html?atlasTool=g34-14#labAtlasTools",
      "formula": "Масса = объём × плотность.",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "volume",
          "label": "Объём древесины, м³",
          "example": 1,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "density",
          "label": "Плотность при вашей влажности, кг/м³",
          "example": 500,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Плотность зависит от породы, влажности и направления отбора образца.",
      "reference": {
        "expected": 500,
        "actual": 500,
        "unit": "кг",
        "tolerance": 0.000005,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g34-15",
      "group": "g34",
      "groupTitle": "Полиграфия, древесина, упаковка",
      "topic": "Усадка древесины по направлению",
      "status": "implemented",
      "calculatorId": "g34-15",
      "href": "calculator.html?atlasTool=g34-15#labAtlasTools",
      "formula": "Усадка = (до − после)/до × 100.",
      "outputUnit": "%",
      "trigger": "live",
      "inputs": [
        {
          "key": "before",
          "label": "Размер до сушки в выбранном направлении, мм",
          "example": 100,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "after",
          "label": "Размер после сушки, мм",
          "example": 95,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Измеренные размеры в одном направлении; не прогноз усушки по произвольному изменению влажности.",
      "reference": {
        "expected": 5,
        "actual": 5,
        "unit": "%",
        "tolerance": 5e-8,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g34-16",
      "group": "g34",
      "groupTitle": "Полиграфия, древесина, упаковка",
      "topic": "Площадь лакировки детали",
      "status": "implemented",
      "calculatorId": "g34-16",
      "href": "calculator.html?atlasTool=g34-16#labAtlasTools",
      "formula": "Площадь всех 6 граней = 2(LW + LH + WH).",
      "outputUnit": "м²",
      "trigger": "live",
      "inputs": [
        {
          "key": "length",
          "label": "Длина бруска, м",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "width",
          "label": "Ширина, м",
          "example": 0.1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "height",
          "label": "Высота, м",
          "example": 0.05,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Прямоугольная деталь; скрытые и неокрашиваемые грани вычитайте отдельно.",
      "reference": {
        "expected": 0.31,
        "actual": 0.31,
        "unit": "м²",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g34-17",
      "group": "g34",
      "groupTitle": "Полиграфия, древесина, упаковка",
      "topic": "Расход клея г/м²",
      "status": "implemented",
      "calculatorId": "glue",
      "href": "calculator.html?atlasTool=glue#labAtlasTools",
      "formula": "m, кг = площадь всех слоёв, м² × норма, г/м² × (1 + запас/100) / 1000.",
      "outputUnit": "кг",
      "trigger": "live",
      "inputs": [
        {
          "key": "area",
          "label": "Суммарная площадь нанесения всех слоёв, м²",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "rate",
          "label": "Норма расхода на слой, г/м²",
          "example": 150,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "reserve",
          "label": "Дополнительный запас, %",
          "example": 10,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000,
          "choices": null
        }
      ],
      "limits": "Норму берите из паспорта выбранного клея для вашего основания. При нанесении с двух сторон учитывайте обе площади.",
      "reference": {
        "expected": 1.65,
        "actual": 1.65,
        "unit": "кг",
        "tolerance": 1.65e-8,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g34-18",
      "group": "g34",
      "groupTitle": "Полиграфия, древесина, упаковка",
      "topic": "Припуск при распиле",
      "status": "implemented",
      "calculatorId": "g34-18",
      "href": "calculator.html?atlasTool=g34-18#labAtlasTools",
      "formula": "Суммарная потеря длины на пропилы = число пропилов × ширина.",
      "outputUnit": "мм",
      "trigger": "live",
      "inputs": [
        {
          "key": "cuts",
          "label": "Число пропилов",
          "example": 10,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "kerf",
          "label": "Ширина пропила, мм",
          "example": 3,
          "positive": false,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Не включает припуски на торцовку и дефекты.",
      "reference": {
        "expected": 30,
        "actual": 30,
        "unit": "мм",
        "tolerance": 3e-7,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g34-19",
      "group": "g34",
      "groupTitle": "Полиграфия, древесина, упаковка",
      "topic": "Длина кромки на деталь",
      "status": "implemented",
      "calculatorId": "g34-19",
      "href": "calculator.html?atlasTool=g34-19#labAtlasTools",
      "formula": "Кромка четырёх сторон = 2(L + W) × количество.",
      "outputUnit": "м",
      "trigger": "live",
      "inputs": [
        {
          "key": "length",
          "label": "Длина прямоугольной детали, м",
          "example": 1,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "width",
          "label": "Ширина, м",
          "example": 0.5,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "qty",
          "label": "Одинаковых деталей",
          "example": 10,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        }
      ],
      "limits": "Только четыре стороны; отрезки и отходы ленты отдельно.",
      "reference": {
        "expected": 30,
        "actual": 30,
        "unit": "м",
        "tolerance": 3e-7,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    },
    {
      "id": "g34-20",
      "group": "g34",
      "groupTitle": "Полиграфия, древесина, упаковка",
      "topic": "План загрузки упаковочной линии",
      "status": "implemented",
      "calculatorId": "g34-20",
      "href": "calculator.html?atlasTool=g34-20#labAtlasTools",
      "formula": "Необходимо смен = ceil(единицы/(производительность × часы)).",
      "outputUnit": "смен",
      "trigger": "live",
      "inputs": [
        {
          "key": "qty",
          "label": "Единиц упаковки в заказе",
          "example": 1000,
          "positive": true,
          "integer": true,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": 1000000,
          "choices": null
        },
        {
          "key": "rate",
          "label": "Фактическая производительность линии, шт/ч",
          "example": 200,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        },
        {
          "key": "hours",
          "label": "Часов в смене",
          "example": 8,
          "positive": true,
          "integer": false,
          "signed": false,
          "list": false,
          "matrix": false,
          "text": false,
          "pattern": null,
          "min": null,
          "max": null,
          "choices": null
        }
      ],
      "limits": "Одна постоянная номенклатура; очередность заказов и переналадки не оптимизируются.",
      "reference": {
        "expected": 1,
        "actual": 1,
        "unit": "смен",
        "tolerance": 1e-8,
        "status": "passed"
      },
      "researchSource": "https://buildrefs.com/calculators/"
    }
  ]
}
