EPANETConsoleCore C Migration Plan
Overview
This document outlines a plan to migrate the EPANETConsoleCore application from C# to C while maintaining all existing functionality. The goal is to achieve better performance while keeping the robust features of the current implementation.
Current Architecture
The current C# implementation includes:
- EPANET simulation engine integration
- PostgreSQL database connectivity
- SCADA system integration
- Configuration management
- Logging system
- Result collection and storage
- Quality analysis (single and multi-species)
Proposed C Architecture
Core Components
Main Application (
epanetconsolecore.c)- Entry point and main control flow
- Configuration parsing
- Simulation orchestration
- Error handling
Database Layer (
db_interface.c/h)- PostgreSQL connectivity using libpq
- Query execution and result handling
- Connection pooling
- Transaction management
SCADA Integration (
scada_interface.c/h)- SCADA system communication
- Tag value retrieval
- Data synchronization
Configuration Management (
config_parser.c/h)- JSON parsing using cJSON
- Configuration validation
- Runtime configuration updates
Logging System (
logger.c/h)- Log file management
- Console output
- Windows Event Log integration
Result Collection (
results_collector.c/h)- EPANET result processing
- Data transformation
- Batch processing
Required Libraries
Database
libpq: PostgreSQL C client librarylibpqxx: C++ wrapper for libpq (optional, for easier C++ integration)
Configuration
cJSON: Lightweight JSON parser for Clibconfig: Alternative configuration library
Logging
- Custom implementation using standard C I/O
- Windows Event Log API for Windows integration
Networking
libcurl: For HTTP/HTTPS communicationopenssl: For secure connections
Utilities
pthreads: For multi-threading supportlibuuid: For UUID generationlibiconv: For character encoding
Migration Steps
Phase 1: Core EPANET Integration
- Port basic EPANET simulation functionality
- Implement configuration parsing
- Set up basic logging
- Create test harness
Phase 2: Database Integration
- Implement PostgreSQL connectivity
- Port database schema and queries
- Add connection pooling
- Implement transaction management
Phase 3: SCADA Integration
- Port SCADA communication layer
- Implement tag management
- Add data synchronization
- Create error handling
Phase 4: Result Collection
- Port result processing logic
- Implement batch processing
- Add data transformation
- Create validation system
Phase 5: Quality Analysis
- Port quality analysis logic
- Implement MSX integration
- Add result storage
- Create validation system
Performance Optimizations
Memory Management
- Use memory pools for frequent allocations
- Implement custom allocators for specific data types
- Minimize memory copies
Database Operations
- Use prepared statements
- Implement connection pooling
- Batch database operations
- Use asynchronous operations where possible
SCADA Integration
- Implement efficient tag caching
- Use asynchronous updates
- Optimize data structures
Result Processing
- Use efficient data structures
- Implement parallel processing
- Optimize memory usage
Code Structure
// Example structure for main application
typedef struct {
Config* config;
Database* db;
ScadaSystem* scada;
Logger* logger;
ResultsCollector* collector;
} ApplicationContext;
// Example database interface
typedef struct {
PGconn* connection;
ConnectionPool* pool;
// ... other members
} Database;
// Example configuration structure
typedef struct {
char* input_file;
char* report_file;
bool do_quality;
bool do_msx;
// ... other settings
} Config;
Build System
CMake Configuration
- Platform-independent build system
- Dependency management
- Test integration
- Installation targets
Dependencies
- Package management using vcpkg or Conan
- Local dependency builds
- Version control
Testing Strategy
Unit Tests
- CUnit or Unity framework
- Component-level testing
- Mock implementations
Integration Tests
- End-to-end testing
- Database integration
- SCADA simulation
Performance Tests
- Benchmark comparisons
- Memory usage monitoring
- CPU profiling
Migration Challenges
Memory Management
- Manual memory management in C
- Resource cleanup
- Error handling
Error Handling
- Consistent error reporting
- Resource cleanup
- Error propagation
Thread Safety
- Multi-threading considerations
- Resource sharing
- Synchronization
Platform Compatibility
- Windows/Linux support
- Compiler differences
- Library availability
Performance Targets
Simulation Speed
- Target: 2x faster than C# implementation
- Measurement: Time per simulation step
- Benchmark: Large network simulations
Memory Usage
- Target: 50% of C# implementation
- Measurement: Peak memory usage
- Tools: Valgrind, Windows Performance Monitor
Database Operations
- Target: 3x faster than C# implementation
- Measurement: Query execution time
- Benchmark: Bulk operations
Implementation Timeline
Phase 1 (2 weeks)
- Core EPANET integration
- Basic testing
Phase 2 (3 weeks)
- Database integration
- Performance optimization
Phase 3 (2 weeks)
- SCADA integration
- Testing and validation
Phase 4 (2 weeks)
- Result collection
- Performance optimization
Phase 5 (2 weeks)
- Quality analysis
- Final testing
Total estimated time: 11 weeks
Maintenance Plan
Documentation
- Code documentation using Doxygen
- API documentation
- Usage examples
Version Control
- Git workflow
- Branch management
- Release process
Monitoring
- Performance metrics
- Error tracking
- Usage statistics
Conclusion
This migration plan outlines a comprehensive approach to moving from C# to C while maintaining and potentially improving the performance of the EPANETConsoleCore application. The plan focuses on maintaining all existing functionality while leveraging C's performance advantages and modern C libraries for required functionality.
The migration should be done in phases to ensure stability and allow for testing at each stage. Performance optimization should be a continuous focus throughout the migration process.