OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
precice_coupling_adapter.h
Go to the documentation of this file.
1//Copyright> OpenRadioss
2//Copyright> Copyright (C) 1986-2025 Altair Engineering Inc.
3//Copyright>
4//Copyright> This program is free software: you can redistribute it and/or modify
5//Copyright> it under the terms of the GNU Affero General Public License as published by
6//Copyright> the Free Software Foundation, either version 3 of the License, or
7//Copyright> (at your option) any later version.
8//Copyright>
9//Copyright> This program is distributed in the hope that it will be useful,
10//Copyright> but WITHOUT ANY WARRANTY; without even the implied warranty of
11//Copyright> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12//Copyright> GNU Affero General Public License for more details.
13//Copyright>
14//Copyright> You should have received a copy of the GNU Affero General Public License
15//Copyright> along with this program. If not, see <https://www.gnu.org/licenses/>.
16//Copyright>
17//Copyright>
18//Copyright> Commercial Alternative: Altair Radioss Software
19//Copyright>
20//Copyright> As an alternative to this open-source version, Altair also offers Altair Radioss
21//Copyright> software under a commercial license. Contact Altair to discuss further if the
22//Copyright> commercial version may interest you: https://www.altair.com/radioss/.
23#ifndef PRECICE_COUPLING_ADAPTER_H
24#define PRECICE_COUPLING_ADAPTER_H
25
26#include "coupling.h"
27#include <memory>
28#include <array>
29
30#ifdef WITH_PRECICE
31#include "precice/precice.hpp"
32
33class PreciceCouplingAdapter : public CouplingAdapter {
34public:
35 PreciceCouplingAdapter();
36 ~PreciceCouplingAdapter() override;
37
38 // Implement abstract interface
39 bool configure(const std::string& configFile) override;
40 void setNodes(const std::vector<int>& nodeIds) override;
41 bool initialize(const double* coordinates, int totalNodes, int mpiRank, int mpiSize) override;
42 void writeData(const double* values, int totalNodes, double dt, int dataType) override;
43 void readData(double* values, int totalNodes, double dt, int dataType) override;
44 void advance(double& dt) override;
45 bool isCouplingOngoing() const override;
46 bool requiresWritingCheckpoint() const override;
47 bool requiresReadingCheckpoint() const override;
48 void finalize() override;
49 bool isActive() const override;
50 double getMaxTimeStepSize() const override;
51 int getNumberOfCouplingNodes() const override;
52
53 struct CouplingData {
54 bool isActive = false; // Whether this data type is active
55 Mode mode = Mode::SKIP; // Mode for this data type
56 std::vector<double> buffer;
57 };
58
59private:
60 // Configuration data
61 bool active_;
62 std::string participantName_;
63 std::string configFile_;
64 std::string meshName_;
65
66 std::array<CouplingData, static_cast<size_t>(DataType::DATA_COUNT)> readData_;
67 std::array<CouplingData, static_cast<size_t>(DataType::DATA_COUNT)> writeData_;
68
69 // Coupling data
70 std::vector<int> couplingNodeIds_; // Radioss node IDs
71 std::vector<int> vertexIds_; // preCICE vertex IDs
72 double maxTimeStepSize_;
73 std::unique_ptr<precice::Participant> precice_;
74
75 // Helper functions
76 void extractNodeData(const double* globalValues, int totalNodes, int dataType);
77 void injectNodeData(double* globalValues, int totalNodes, int dataType);
78
79 // Static helper for bounds checking
80 static constexpr int getDimensions() noexcept { return 3; }
81
82private:
83 static bool isNodeIdValid(int nodeId, int totalNodes) noexcept {
84 const auto idx = nodeId - 1; // Convert to 0-based indexing
85 return idx >= 0 && idx < totalNodes;
86 }
87};
88
89#endif
90#endif
virtual bool configure(const std::string &configFile)=0
virtual void setNodes(const std::vector< int > &nodeIds)=0
virtual double getMaxTimeStepSize() const =0
virtual void readData(double *values, int totalNodes, double dt, int dataType)=0
virtual void advance(double &dt)=0
virtual bool isCouplingOngoing() const =0
virtual void finalize()=0
virtual bool initialize(const double *coordinates, int totalNodes, int mpiRank, int mpiSize)=0
virtual void writeData(const double *values, int totalNodes, double dt, int dataType)=0
virtual int getNumberOfCouplingNodes() const =0
virtual bool isActive() const =0
virtual bool requiresReadingCheckpoint() const
Definition coupling.h:53
virtual bool requiresWritingCheckpoint() const
Definition coupling.h:52