Skip to content

Commit 210a535

Browse files
authored
mechanical design updates (#1949)
1 parent 83ddfaf commit 210a535

26 files changed

+7169
-18
lines changed

.github/skills/neqsim-capability-map/SKILL.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,27 @@ transport properties (viscosity, thermal conductivity, density).
298298
| `SURFCostEstimator` | Subsea CAPEX | `process.mechanicaldesign.subsea` |
299299
| `SubseaCostEstimator` | Regional cost factors | `process.mechanicaldesign.subsea` |
300300
| `FieldDevelopmentDesignOrchestrator` | Full field design | `process.mechanicaldesign` |
301+
| `MotorMechanicalDesign` | Motor foundation, vibration, cooling, bearings, noise, enclosure | `process.mechanicaldesign.motor` |
302+
| `EquipmentDesignReport` | Combined mech + elec + motor design report with verdict | `process.mechanicaldesign` |
303+
304+
### Electrical Design
305+
306+
| Class | Purpose | Package |
307+
|-------|---------|---------|
308+
| `ElectricalDesign` | Base class — sizes motor, VFD, cables, switchgear | `process.electricaldesign` |
309+
| `ElectricalMotor` | AC induction motor model (IEC 60034, IEEE 841) | `process.electricaldesign.components` |
310+
| `VariableFrequencyDrive` | VFD with topology, harmonics, efficiency | `process.electricaldesign.components` |
311+
| `ElectricalCable` | Cable sizing with derating (IEC 60502) | `process.electricaldesign.components` |
312+
| `Transformer` | Power transformer model (IEC 60076) | `process.electricaldesign.components` |
313+
| `Switchgear` | MCC / switchgear bucket (IEC 61439) | `process.electricaldesign.components` |
314+
| `HazardousAreaClassification` | Zone / Ex marking (IEC 60079) | `process.electricaldesign.components` |
315+
| `CompressorElectricalDesign` | Compressor-specific with auxiliary loads | `process.electricaldesign.compressor` |
316+
| `PumpElectricalDesign` | Pump-specific design | `process.electricaldesign.pump` |
317+
| `SeparatorElectricalDesign` | Separator auxiliary loads | `process.electricaldesign.separator` |
318+
| `HeatExchangerElectricalDesign` | Electric heater / air cooler / S&T detection | `process.electricaldesign.heatexchanger` |
319+
| `PipelineElectricalDesign` | Heat tracing, cathodic protection | `process.electricaldesign.pipeline` |
320+
| `SystemElectricalDesign` | Plant-wide load aggregation, transformer sizing | `process.electricaldesign.system` |
321+
| `ElectricalLoadList` | Load list with demand/diversity factors | `process.electricaldesign.loadanalysis` |
301322

302323
---
303324

@@ -435,3 +456,11 @@ transport properties (viscosity, thermal conductivity, density).
435456
| Scale prediction? || Not available |
436457
| Detailed HX design? || Use duty + LMTD |
437458
| Full reservoir sim? || `SimpleReservoir` only |
459+
| Motor sizing? || `ElectricalMotor.sizeMotor()` |
460+
| Motor foundation design? || `MotorMechanicalDesign` |
461+
| Motor vibration check? || `MotorMechanicalDesign.getVibrationZone()` |
462+
| Electrical load list? || `ElectricalLoadList` |
463+
| Combined design report? || `EquipmentDesignReport` |
464+
| VFD selection? || `VariableFrequencyDrive` |
465+
| Cable sizing? || `ElectricalCable` |
466+
| Hazardous area classification? || `HazardousAreaClassification` |

CHANGELOG_AGENT_NOTES.md

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,63 @@
99
1010
---
1111

12+
## 2026-03-22 — Motor Mechanical Design and Combined Equipment Design Report
13+
14+
### New Classes
15+
16+
- **`MotorMechanicalDesign`** (`process.mechanicaldesign.motor`) — Physical/mechanical design of electric motors:
17+
- Foundation loads (static + dynamic) and mass per IEEE 841 (3:1 ratio)
18+
- Cooling classification per IEC 60034-6 (IC411/IC611/IC81W)
19+
- Bearing selection and L10 life per ISO 281 (ball vs roller, lubrication)
20+
- Vibration limits per IEC 60034-14 Grade A and ISO 10816-3 zone classification
21+
- Noise assessment per IEC 60034-9 and NORSOK S-002 (83 dB(A) at 1m)
22+
- Enclosure/IP rating per IEC 60034-5, Ex marking per IEC 60079 (Zone 0/1/2)
23+
- Environmental derating per IEC 60034-1 (altitude: 1%/100m above 1000m; temperature: 2.5%/°C above 40°C)
24+
- Motor weight and dimensional estimation
25+
- Constructors: `MotorMechanicalDesign(double shaftPowerKW)`, `MotorMechanicalDesign(ElectricalDesign)`
26+
27+
- **`EquipmentDesignReport`** (`process.mechanicaldesign`) — Combined design report for any process equipment:
28+
- Orchestrates mechanical design + electrical design + motor mechanical design
29+
- Produces FEASIBLE / FEASIBLE_WITH_WARNINGS / NOT_FEASIBLE verdict
30+
- Checks: motor undersizing, excessive derating, noise exceedance, low bearing life
31+
- `toJson()` — comprehensive JSON with all three design disciplines
32+
- `toLoadListEntry()` — summary for electrical load list integration
33+
- Works with any `ProcessEquipmentInterface` (compressor, pump, separator, etc.)
34+
35+
### Key API Methods
36+
37+
```java
38+
// Motor mechanical design — standalone
39+
MotorMechanicalDesign motorDesign = new MotorMechanicalDesign(250.0);
40+
motorDesign.setPoles(4);
41+
motorDesign.setAmbientTemperatureC(45.0);
42+
motorDesign.setAltitudeM(500.0);
43+
motorDesign.setHazardousZone(1);
44+
motorDesign.calcDesign();
45+
motorDesign.toJson();
46+
47+
// Combined report — from any equipment
48+
EquipmentDesignReport report = new EquipmentDesignReport(compressor);
49+
report.setUseVFD(true);
50+
report.setRatedVoltageV(6600);
51+
report.setHazardousZone(1);
52+
report.generateReport();
53+
report.getVerdict(); // "FEASIBLE" / "FEASIBLE_WITH_WARNINGS" / "NOT_FEASIBLE"
54+
report.toJson();
55+
```
56+
57+
### Bug Fix
58+
- Fixed IP rating override in Zone 0 hazardous areas — IEEE 841 IP55 minimum no longer overrides Zone 0 IP66 requirement
59+
60+
### Test Coverage
61+
- 22 new tests in `MotorMechanicalDesignTest`: standalone design, small/large motors, altitude/temperature derating, hazardous area enclosure, vibration zones, NORSOK noise compliance, bearing L10 life, VFD notes, applied standards, compressor integration, JSON/Map output, combined reports
62+
63+
### Documentation
64+
- New doc: `docs/process/motor-mechanical-design.md`
65+
- Updated: `REFERENCE_MANUAL_INDEX.md`, capability map, `mechanical_design.md`, `electrical-design.md`
66+
67+
---
68+
1269
## 2026-03-22 — Heat Exchanger Mechanical Design Standards Expansion
1370

1471
### New Data Files

docs/REFERENCE_MANUAL_INDEX.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,8 @@ Fluid characterization handles plus fraction splitting, property estimation, and
438438
| Document | Path | Description |
439439
| --------------------------------- | ---------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
440440
| **Electrical Design Guide** | [docs/process/electrical-design.md](process/electrical-design) | **Comprehensive guide to electrical design: motor sizing (IEC 60034), VFD topology, cable sizing, transformer, switchgear, hazardous area, load list, equipment-specific designs (separator, heater/cooler, pipeline), plant-wide SystemElectricalDesign** |
441+
| **Motor Mechanical Design** | [docs/process/motor-mechanical-design.md](process/motor-mechanical-design) | **Motor physical/mechanical design: foundation loads (IEEE 841), cooling (IEC 60034-6), bearings (ISO 281), vibration (ISO 10816-3), noise (IEC 60034-9, NORSOK S-002), enclosure (IEC 60034-5, IEC 60079), derating (IEC 60034-1)** |
442+
| **Combined Equipment Design Report** | [docs/process/motor-mechanical-design.md#equipmentdesignreport](process/motor-mechanical-design#equipmentdesignreport) | **EquipmentDesignReport: combined mechanical + electrical + motor design report with feasibility verdict for any equipment** |
441443
| **Compressor Electrical Design** | [examples/notebooks/electrical/compressor_electrical_design.ipynb](../examples/notebooks/electrical/compressor_electrical_design.ipynb) | **Jupyter notebook: 2-stage compression electrical design with motor curves, power triangle, efficiency chain** |
442444
| **Process Plant Load List** | [examples/notebooks/electrical/process_plant_load_list.ipynb](../examples/notebooks/electrical/process_plant_load_list.ipynb) | **Jupyter notebook: plant-wide electrical load list, demand/diversity factors, transformer sizing** |
443445
| **Motor & VFD Analysis** | [examples/notebooks/electrical/motor_vfd_analysis.ipynb](../examples/notebooks/electrical/motor_vfd_analysis.ipynb) | **Jupyter notebook: motor efficiency classes IE1-IE4, VFD topology selection, harmonics, efficiency maps, cable sizing, hazardous area** |

docs/development/ELECTRICAL_DESIGN_PROPOSAL.md

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -753,6 +753,21 @@ print(ed.toJson())
753753
| 4.5 | Integration with cost estimation framework | Planned |
754754
| 4.6 | Subsea power distribution (power umbilicals, step-out distance) | Planned |
755755

756+
### Phase 5 — Motor Mechanical Design & Combined Reports ✅ IMPLEMENTED
757+
758+
| Task | Description | Status |
759+
|------|-------------|--------|
760+
| 5.1 | `MotorMechanicalDesign` — physical motor design (weight, dimensions, cooling, foundation, vibration, bearings, noise, enclosure) per IEC 60034 / ISO 10816-3 / ISO 281 / NORSOK S-002 | ✅ Done |
761+
| 5.2 | `setFromElectricalDesign()` — link motor mechanical to electrical design results | ✅ Done |
762+
| 5.3 | Altitude and temperature derating per IEC 60034-1 | ✅ Done |
763+
| 5.4 | Foundation design (concrete block / steel skid) with bolt pattern | ✅ Done |
764+
| 5.5 | Vibration assessment per ISO 10816-3 (zones A/B/C/D) | ✅ Done |
765+
| 5.6 | NORSOK S-002 noise assessment (85 dB(A) at 1 m limit) | ✅ Done |
766+
| 5.7 | Bearing L10 life per ISO 281 | ✅ Done |
767+
| 5.8 | `EquipmentDesignReport` — combined mechanical + electrical + motor design report with FEASIBLE / FEASIBLE_WITH_WARNINGS / NOT_FEASIBLE verdict | ✅ Done |
768+
| 5.9 | `toLoadListEntry()` — electrical load list integration from combined report | ✅ Done |
769+
| 5.10 | Unit tests (22 tests covering all Phase 5 features) | ✅ Done |
770+
756771
---
757772

758773
## 12. Relationship to Existing Code
@@ -786,7 +801,15 @@ Process Equipment (Compressor)
786801
787802
├── MechanicalDesign → wall thickness, materials, weights, vessel design
788803
789-
└── ElectricalDesign → motor, VFD, cables, switchgear, load list
804+
├── ElectricalDesign → motor, VFD, cables, switchgear, load list
805+
806+
├── MotorMechanicalDesign → motor weight, foundation, vibration, bearings,
807+
│ cooling, noise, enclosure (IEC 60034 / ISO 10816-3)
808+
809+
└── EquipmentDesignReport → combined report with FEASIBLE verdict
810+
├── runs MechanicalDesign.calcDesign()
811+
├── runs ElectricalDesign.calcDesign()
812+
└── runs MotorMechanicalDesign.calcDesign()
790813
```
791814

792815
The `calcDesign()` methods can reference each other if needed:

docs/process/electrical-design.md

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -759,3 +759,80 @@ System.out.println("Plant load: " + sysDesign.getTotalPlantLoadKW() + " kW"
759759
System.out.println("Main transformer: " + sysDesign.getMainTransformerKVA() + " kVA");
760760
System.out.println("Emergency gen: " + sysDesign.getEmergencyGeneratorKVA() + " kVA");
761761
```
762+
763+
---
764+
765+
## 11. Motor Mechanical Design Integration
766+
767+
The electrical design package sizes motor and cable from an electrical perspective.
768+
`MotorMechanicalDesign` complements this by computing the physical and mechanical
769+
aspects of the selected motor:
770+
771+
| Aspect | Electrical Design | Motor Mechanical Design |
772+
|:---|:---|:---|
773+
| Motor sizing | Rated power, voltage, efficiency class | Weight, frame dimensions, cooling |
774+
| Drive selection | VFD topology, harmonics, cable sizing | VFD derating notes, bearing currents |
775+
| Environment | Hazardous area zone, Ex marking | IP rating, enclosure type, NORSOK noise |
776+
| Structural || Foundation mass, bolt pattern, vibration zone |
777+
| Reliability || Bearing L10 life, lubrication interval |
778+
779+
### Linking Electrical and Mechanical Motor Design
780+
781+
`MotorMechanicalDesign` can take its inputs directly from a completed
782+
`ElectricalDesign`, avoiding manual re-entry of motor parameters:
783+
784+
```java
785+
// After running electrical design
786+
ElectricalDesign elecDesign = compressor.getElectricalDesign();
787+
elecDesign.calcDesign();
788+
789+
// Create motor mechanical design from electrical results
790+
MotorMechanicalDesign motorDesign = new MotorMechanicalDesign(compressor);
791+
motorDesign.setFromElectricalDesign(elecDesign);
792+
motorDesign.calcDesign();
793+
794+
// Motor physical properties
795+
System.out.println("Weight: " + motorDesign.getMotorWeightKg() + " kg");
796+
System.out.println("Foundation: " + motorDesign.getFoundationType());
797+
System.out.println("Vibration zone: " + motorDesign.getVibrationZone());
798+
System.out.println("Noise: " + motorDesign.getSoundPressureLevelAt1mDbA() + " dB(A)");
799+
System.out.println("Bearing L10: " + motorDesign.getBearingL10LifeHours() + " hours");
800+
```
801+
802+
See the [Motor Mechanical Design Guide](motor-mechanical-design.md) for full
803+
API reference and design calculation details.
804+
805+
---
806+
807+
## 12. Combined Equipment Design Report
808+
809+
`EquipmentDesignReport` aggregates mechanical design, electrical design, and
810+
motor mechanical design into a single report with an overall feasibility verdict:
811+
812+
```java
813+
EquipmentDesignReport report = new EquipmentDesignReport(compressor);
814+
report.setHazardousZone(1);
815+
report.setAmbientTemperatureC(45.0);
816+
report.generateReport();
817+
818+
String verdict = report.getVerdict(); // FEASIBLE / FEASIBLE_WITH_WARNINGS / NOT_FEASIBLE
819+
String json = report.toJson(); // Full combined JSON report
820+
Map<String, Object> loadEntry = report.toLoadListEntry(); // For electrical load list
821+
```
822+
823+
The report runs all three design layers in sequence and collects any issues:
824+
825+
1. **Mechanical design** — wall thickness, weight, materials (from equipment-specific `MechanicalDesign`)
826+
2. **Electrical design** — motor, cable, VFD, switchgear, hazardous area (from `ElectricalDesign`)
827+
3. **Motor mechanical design** — foundation, vibration, cooling, bearings, noise (from `MotorMechanicalDesign`)
828+
829+
See the [Motor Mechanical Design Guide — Combined Report](motor-mechanical-design.md#combined-equipment-design-report)
830+
for JSON output structure and full configuration options.
831+
832+
---
833+
834+
## Related Documentation
835+
836+
- [Motor Mechanical Design Guide](motor-mechanical-design.md) — foundation, vibration, cooling, bearings, noise, enclosure standards
837+
- [Mechanical Design Framework](mechanical_design.md) — base mechanical design architecture and class hierarchy
838+
- [Electrical Design Proposal](../development/ELECTRICAL_DESIGN_PROPOSAL.md) — original architecture blueprint

docs/process/mechanical_design.md

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,13 @@ MechanicalDesign (base class)
5252
└── WellMechanicalDesign → NORSOK D-010 / API 5CT / API Bull 5C3
5353
├── WellDesignCalculator (casing burst, collapse, tension)
5454
└── WellCostEstimator (drilling, completion, wellhead costs)
55+
56+
MotorMechanicalDesign (standalone) → IEC 60034, IEEE 841, ISO 10816-3, ISO 281, NORSOK S-002
57+
└── Foundation, vibration, cooling, bearings, noise, enclosure, derating
58+
59+
EquipmentDesignReport (aggregator)
60+
└── Combines MechanicalDesign + ElectricalDesign + MotorMechanicalDesign
61+
with feasibility verdict (FEASIBLE / FEASIBLE_WITH_WARNINGS / NOT_FEASIBLE)
5562
```
5663

5764
### Pipeline Mechanical Design Features
@@ -380,7 +387,7 @@ For equipment-specific data, use the typed response:
380387

381388
```java
382389
// Compressor-specific response
383-
CompressorMechanicalDesignResponse response =
390+
CompressorMechanicalDesignResponse response =
384391
(CompressorMechanicalDesignResponse) compressor.getMechanicalDesign().getResponse();
385392

386393
int stages = response.getNumberOfStages();
@@ -390,7 +397,7 @@ double driverPower = response.getDriverPower(); // kW
390397
double tripSpeed = response.getTripSpeed(); // rpm
391398

392399
// Valve-specific response
393-
ValveMechanicalDesignResponse valveResponse =
400+
ValveMechanicalDesignResponse valveResponse =
394401
(ValveMechanicalDesignResponse) valve.getMechanicalDesign().getResponse();
395402

396403
int ansiClass = valveResponse.getAnsiPressureClass();
@@ -519,7 +526,7 @@ if (!result.isValid()) {
519526
// Compressor validation
520527
CompressorMechanicalDesign.CompressorValidationResult result = compDesign.validateDesign();
521528

522-
// Pump validation
529+
// Pump validation
523530
PumpMechanicalDesign.PumpValidationResult result = pumpDesign.validateDesign();
524531

525532
// Heat exchanger validation
@@ -536,7 +543,7 @@ SeparatorMechanicalDesign sepDesign = (SeparatorMechanicalDesign) separator.getM
536543
// Validate gas velocity
537544
boolean gasVelOk = sepDesign.validateGasVelocity(actualVelocity); // m/s
538545

539-
// Validate liquid velocity
546+
// Validate liquid velocity
540547
boolean liqVelOk = sepDesign.validateLiquidVelocity(actualVelocity); // m/s
541548

542549
// Validate retention time (isOil = true for oil, false for water)
@@ -575,7 +582,7 @@ boolean npshOk = pumpDesign.validateNpshMargin(npshAvailable, npshRequired);
575582
// Validate operating in Preferred Operating Region
576583
boolean porOk = pumpDesign.validateOperatingInPOR(operatingFlow, bepFlow);
577584

578-
// Validate operating in Allowable Operating Region
585+
// Validate operating in Allowable Operating Region
579586
boolean aorOk = pumpDesign.validateOperatingInAOR(operatingFlow, bepFlow);
580587

581588
// Validate suction specific speed
@@ -630,7 +637,7 @@ for (String issue : result.getIssues()) {
630637
### Separators (API 12J / ASME VIII / NORSOK P-001)
631638

632639
```java
633-
SeparatorMechanicalDesign sepDesign =
640+
SeparatorMechanicalDesign sepDesign =
634641
(SeparatorMechanicalDesign) separator.getMechanicalDesign();
635642

636643
// Key parameters
@@ -655,7 +662,7 @@ Design calculations include:
655662
### Compressors (API 617)
656663

657664
```java
658-
CompressorMechanicalDesign compDesign =
665+
CompressorMechanicalDesign compDesign =
659666
(CompressorMechanicalDesign) compressor.getMechanicalDesign();
660667

661668
// Key parameters
@@ -687,7 +694,7 @@ Design calculations include:
687694
### Pumps (API 610)
688695

689696
```java
690-
PumpMechanicalDesign pumpDesign =
697+
PumpMechanicalDesign pumpDesign =
691698
(PumpMechanicalDesign) pump.getMechanicalDesign();
692699

693700
// Key parameters
@@ -718,7 +725,7 @@ Design calculations include:
718725
### Valves (IEC 60534)
719726

720727
```java
721-
ValveMechanicalDesign valveDesign =
728+
ValveMechanicalDesign valveDesign =
722729
(ValveMechanicalDesign) valve.getMechanicalDesign();
723730

724731
// Key parameters
@@ -738,7 +745,7 @@ Design calculations include:
738745
### Heat Exchangers (TEMA)
739746

740747
```java
741-
HeatExchangerMechanicalDesign hxDesign =
748+
HeatExchangerMechanicalDesign hxDesign =
742749
(HeatExchangerMechanicalDesign) heatExchanger.getMechanicalDesign();
743750

744751
// Key parameters
@@ -747,7 +754,7 @@ double uValue = hxDesign.getOverallHeatTransferCoefficient(); // W/m²K
747754
int tubeCount = hxDesign.getTubeCount();
748755
double shellDiameter = hxDesign.getShellDiameter(); // mm
749756

750-
// Process design parameters
757+
// Process design parameters
751758
double shellFouling = hxDesign.getFoulingResistanceShellHC(); // m²K/W
752759
double tubeFouling = hxDesign.getFoulingResistanceTubeHC(); // m²K/W
753760
double maxTubeVel = hxDesign.getMaxTubeVelocity(); // m/s
@@ -918,7 +925,7 @@ String json = sysMecDesign.toJson();
918925
Files.write(Paths.get("mechanical_design.json"), json.getBytes());
919926

920927
// 6. Access specific equipment details
921-
CompressorMechanicalDesignResponse compResponse =
928+
CompressorMechanicalDesignResponse compResponse =
922929
(CompressorMechanicalDesignResponse) compressor.getMechanicalDesign().getResponse();
923930
System.out.println("Compressor stages: " + compResponse.getNumberOfStages());
924931
System.out.println("Driver power: " + compResponse.getDriverPower() + " kW");

0 commit comments

Comments
 (0)