preCICE v3.2.0
Loading...
Searching...
No Matches
preciceC.cpp
Go to the documentation of this file.
1extern "C" {
2#include "precice/preciceC.h"
3}
4#include <memory>
5#include <string>
7#include "logging/Logger.hpp"
8#include "precice/impl/versions.hpp"
9#include "precice/precice.hpp"
10#include "utils/assertion.hpp"
11
12#ifdef __GNUC__
13#pragma GCC diagnostic push
14#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
15#endif
16#ifdef __clang__
17#pragma clang diagnostic push
18#pragma clang diagnostic ignored "-Wdeprecated-declarations"
19#endif
20
22
23static precice::logging::Logger _log("precicec");
24
25static std::string errormsg = "preCICE has not been created properly. Be sure to call \"precicec_createParticipant\" or \"precicec_createParticipant_withCommunicator\" before any other call to preCICE.";
26static std::string errormsgCreate = "preCICE has been created already! Be sure to call either \"precicec_createParticipant\" or \"precicec_createParticipant_withCommunicator\" exactly once.";
27
29 const char *participantName,
30 const char *configFileName,
31 int solverProcessIndex,
32 int solverProcessSize,
33 void *communicator)
34try {
37 configFileName,
38 solverProcessIndex,
39 solverProcessSize,
40 communicator);
41} catch (::precice::Error &e) {
42 std::abort();
43}
44
46 const char *participantName,
47 const char *configFileName,
48 int solverProcessIndex,
49 int solverProcessSize)
50try {
53 configFileName,
54 solverProcessIndex,
55 solverProcessSize);
56} catch (::precice::Error &e) {
57 std::abort();
58}
59
61try {
62 PRECICE_CHECK(impl != nullptr, errormsg);
63 impl->initialize();
64} catch (::precice::Error &e) {
65 std::abort();
66}
67
68void precicec_advance(double computedTimeStepSize)
69try {
70 PRECICE_CHECK(impl != nullptr, errormsg);
71 impl->advance(computedTimeStepSize);
72} catch (::precice::Error &e) {
73 std::abort();
74}
75
77try {
78 PRECICE_CHECK(impl != nullptr, errormsg);
79 impl->finalize();
80 impl.reset();
81} catch (::precice::Error &e) {
82 std::abort();
83}
84
85int precicec_getMeshDimensions(const char *meshName)
86try {
87 PRECICE_CHECK(impl != nullptr, errormsg);
88 return impl->getMeshDimensions(meshName);
89} catch (::precice::Error &e) {
90 std::abort();
91 return -1;
92}
93
94int precicec_getDataDimensions(const char *meshName, const char *dataName)
95try {
96 PRECICE_CHECK(impl != nullptr, errormsg);
97 return impl->getDataDimensions(meshName, dataName);
98} catch (::precice::Error &e) {
99 std::abort();
100 return -1;
101}
102
104try {
105 PRECICE_CHECK(impl != nullptr, errormsg);
106 if (impl->isCouplingOngoing()) {
107 return 1;
108 }
109 return 0;
110} catch (::precice::Error &e) {
111 std::abort();
112 return -1;
113}
114
116try {
117 PRECICE_CHECK(impl != nullptr, errormsg);
118 if (impl->isTimeWindowComplete()) {
119 return 1;
120 }
121 return 0;
122} catch (::precice::Error &e) {
123 std::abort();
124 return -1;
125}
126
128try {
129 return impl->getMaxTimeStepSize();
130} catch (::precice::Error &e) {
131 std::abort();
132 return -1.0;
133}
134
136try {
137 PRECICE_CHECK(impl != nullptr, errormsg);
138 return impl->requiresInitialData() ? 1 : 0;
139} catch (::precice::Error &e) {
140 std::abort();
141 return -1;
142}
143
145try {
146 PRECICE_CHECK(impl != nullptr, errormsg);
147 return impl->requiresWritingCheckpoint() ? 1 : 0;
148} catch (::precice::Error &e) {
149 std::abort();
150 return -1;
151}
152
154try {
155 PRECICE_CHECK(impl != nullptr, errormsg);
156 return impl->requiresReadingCheckpoint() ? 1 : 0;
157} catch (::precice::Error &e) {
158 std::abort();
159 return -1;
160}
161
163try {
164 PRECICE_CHECK(impl != nullptr, errormsg);
165 if (impl->requiresMeshConnectivityFor(meshName)) {
166 return 1;
167 }
168 return 0;
169} catch (::precice::Error &e) {
170 std::abort();
171 return -1;
172}
173
174void precicec_resetMesh(const char *meshName)
175try {
176 PRECICE_CHECK(impl != nullptr, errormsg);
177 impl->resetMesh(meshName);
178} catch (::precice::Error &e) {
179 std::abort();
180}
181
183 const char *meshName,
184 const double *position)
185try {
186 PRECICE_CHECK(impl != nullptr, errormsg);
187 auto size = static_cast<long unsigned>(impl->getMeshDimensions(meshName));
188 return impl->setMeshVertex(meshName, {position, size});
189} catch (::precice::Error &e) {
190 std::abort();
191 return -1;
192}
193
195 const char *meshName,
196 int size,
197 const double *positions,
198 int *ids)
199try {
200 PRECICE_CHECK(impl != nullptr, errormsg);
201 auto idsSize = static_cast<long unsigned>(size);
202 auto posSize = static_cast<long unsigned>(impl->getMeshDimensions(meshName) * size);
203 impl->setMeshVertices(meshName, {positions, posSize}, {ids, idsSize});
204} catch (::precice::Error &e) {
205 std::abort();
206}
207
209 const char *meshName)
210try {
211 PRECICE_CHECK(impl != nullptr, errormsg);
212 return impl->getMeshVertexSize(meshName);
213} catch (::precice::Error &e) {
214 std::abort();
215 return -1;
216}
217
219 const char *meshName,
220 int firstVertexID,
221 int secondVertexID)
222try {
223 PRECICE_CHECK(impl != nullptr, errormsg);
224 impl->setMeshEdge(meshName, firstVertexID, secondVertexID);
225} catch (::precice::Error &e) {
226 std::abort();
227}
228
230 const char *meshName,
231 int size,
232 const int *vertices)
233try {
234 PRECICE_CHECK(impl != nullptr, errormsg);
235 auto verticesSize = static_cast<long unsigned>(size) * 2;
236 impl->setMeshEdges(meshName, {vertices, verticesSize});
237} catch (::precice::Error &e) {
238 std::abort();
239}
240
242 const char *meshName,
243 int firstVertexID,
244 int secondVertexID,
245 int thirdVertexID)
246try {
247 PRECICE_CHECK(impl != nullptr, errormsg);
248 impl->setMeshTriangle(meshName, firstVertexID, secondVertexID, thirdVertexID);
249} catch (::precice::Error &e) {
250 std::abort();
251}
252
254 const char *meshName,
255 int size,
256 const int *vertices)
257try {
258 PRECICE_CHECK(impl != nullptr, errormsg);
259 auto verticesSize = static_cast<long unsigned>(size) * 3;
260 impl->setMeshTriangles(meshName, {vertices, verticesSize});
261} catch (::precice::Error &e) {
262 std::abort();
263}
264
266 const char *meshName,
267 int firstVertexID,
268 int secondVertexID,
269 int thirdVertexID,
270 int fourthVertexID)
271try {
272 PRECICE_CHECK(impl != nullptr, errormsg);
273 impl->setMeshQuad(meshName, firstVertexID, secondVertexID, thirdVertexID, fourthVertexID);
274} catch (::precice::Error &e) {
275 std::abort();
276}
277
279 const char *meshName,
280 int size,
281 const int *vertices)
282try {
283 PRECICE_CHECK(impl != nullptr, errormsg);
284 auto verticesSize = static_cast<long unsigned>(size) * 4;
285 impl->setMeshQuads(meshName, {vertices, verticesSize});
286} catch (::precice::Error &e) {
287 std::abort();
288}
289
291 const char *meshName,
292 int firstVertexID,
293 int secondVertexID,
294 int thirdVertexID,
295 int fourthVertexID)
296try {
297 PRECICE_CHECK(impl != nullptr, errormsg);
298 impl->setMeshTetrahedron(meshName, firstVertexID, secondVertexID, thirdVertexID, fourthVertexID);
299} catch (::precice::Error &e) {
300 std::abort();
301}
302
304 const char *meshName,
305 int size,
306 const int *vertices)
307try {
308 PRECICE_CHECK(impl != nullptr, errormsg);
309 auto verticesSize = static_cast<long unsigned>(size) * 4;
310 impl->setMeshTetrahedra(meshName, {vertices, verticesSize});
311} catch (::precice::Error &e) {
312 std::abort();
313}
314
316 const char *meshName,
317 const char *dataName,
318 int size,
319 const int *valueIndices,
320 const double *values)
321try {
322 PRECICE_CHECK(impl != nullptr, errormsg);
323 auto dataSize = size * impl->getDataDimensions(meshName, dataName);
324 impl->writeData(meshName, dataName, {valueIndices, static_cast<unsigned long>(size)}, {values, static_cast<unsigned long>(dataSize)});
325} catch (::precice::Error &e) {
326 std::abort();
327}
328
330 const char *meshName,
331 const char *dataName,
332 int size,
333 const int *valueIndices,
334 double relativeReadTime,
335 double *values)
336try {
337 PRECICE_CHECK(impl != nullptr, errormsg);
338 auto dataSize = size * impl->getDataDimensions(meshName, dataName);
339 impl->readData(meshName, dataName, {valueIndices, static_cast<unsigned long>(size)}, relativeReadTime, {values, static_cast<unsigned long>(dataSize)});
340} catch (::precice::Error &e) {
341 std::abort();
342}
343
345 const char *meshName,
346 const char *dataName,
347 int size,
348 const double *coordinates,
349 const double *values)
350try {
351 PRECICE_CHECK(impl != nullptr, errormsg);
352 auto coordinatesSize = size * impl->getMeshDimensions(meshName);
353 auto dataSize = size * impl->getDataDimensions(meshName, dataName);
354 impl->writeAndMapData(meshName, dataName, {coordinates, static_cast<unsigned long>(coordinatesSize)}, {values, static_cast<unsigned long>(dataSize)});
355} catch (::precice::Error &e) {
356 std::abort();
357}
358
360 const char *meshName,
361 const char *dataName,
362 int size,
363 const double *coordinates,
364 double relativeReadTime,
365 double *values)
366try {
367 PRECICE_CHECK(impl != nullptr, errormsg);
368 auto coordinatesSize = size * impl->getMeshDimensions(meshName);
369 auto dataSize = size * impl->getDataDimensions(meshName, dataName);
370 impl->mapAndReadData(meshName, dataName, {coordinates, static_cast<unsigned long>(coordinatesSize)}, relativeReadTime, {values, static_cast<unsigned long>(dataSize)});
371} catch (::precice::Error &e) {
372 std::abort();
373}
374
375int precicec_requiresGradientDataFor(const char *meshName,
376 const char *dataName)
377try {
378 PRECICE_CHECK(impl != nullptr, errormsg);
379 if (impl->requiresGradientDataFor(meshName, dataName)) {
380 return 1;
381 }
382 return 0;
383} catch (::precice::Error &e) {
384 std::abort();
385 return -1;
386}
387
389 const char *meshName,
390 const char *dataName,
391 int size,
392 const int *valueIndices,
393 const double *gradients)
394try {
395 PRECICE_CHECK(impl != nullptr, errormsg);
396 auto gradientComponents = impl->getDataDimensions(meshName, dataName) * impl->getMeshDimensions(meshName);
397 auto gradientSize = size * gradientComponents;
398 impl->writeGradientData(meshName, dataName, {valueIndices, static_cast<unsigned long>(size)}, {gradients, static_cast<unsigned long>(gradientSize)});
399} catch (::precice::Error &e) {
400 std::abort();
401}
402
404{
405 return precice::versionInformation;
406}
407
409 const char *meshName,
410 const double *boundingBox)
411try {
412 auto bbSize = static_cast<long unsigned>(impl->getMeshDimensions(meshName)) * 2;
413 impl->setMeshAccessRegion(meshName, {boundingBox, bbSize});
414} catch (::precice::Error &e) {
415 std::abort();
416}
417
419 const char *meshName,
420 const int size,
421 int *ids,
422 double *coordinates)
423try {
424 auto coordinatesSize = static_cast<long unsigned>(impl->getMeshDimensions(meshName) * size);
425 impl->getMeshVertexIDsAndCoordinates(meshName, {ids, static_cast<unsigned long>(size)}, {coordinates, coordinatesSize});
426} catch (::precice::Error &e) {
427 std::abort();
428}
429
430void precicec_startProfilingSection(const char *sectionName)
431try {
432 impl->startProfilingSection(sectionName);
433} catch (::precice::Error &e) {
434 std::abort();
435}
436
438try {
439 impl->stopLastProfilingSection();
440} catch (::precice::Error &e) {
441 std::abort();
442}
443
444#ifdef __GNUC__
445#pragma GCC diagnostic pop
446#endif
447#ifdef __clang__
448#pragma clang diagnostic pop
449#endif
#define PRECICE_CHECK(check,...)
Definition LogMacros.hpp:32
T abort(T... args)
This class provides a lightweight logger.
Definition Logger.hpp:17
T make_unique(T... args)
double precicec_getMaxTimeStepSize()
Returns maximum allowed time step size.
Definition preciceC.cpp:127
void precicec_stopLastProfilingSection()
Definition preciceC.cpp:437
static precice::logging::Logger _log("precicec")
void precicec_setMeshTriangles(const char *meshName, int size, const int *vertices)
Sets multiple mesh triangles from vertex IDs.
Definition preciceC.cpp:253
void precicec_setMeshTetrahedra(const char *meshName, int size, const int *vertices)
Sets multiple mesh tetrahedra from vertex IDs.
Definition preciceC.cpp:303
int precicec_requiresReadingCheckpoint()
Definition preciceC.cpp:153
int precicec_isTimeWindowComplete()
Returns true (->1), if the coupling time window is completed.
Definition preciceC.cpp:115
static std::string errormsgCreate
Definition preciceC.cpp:26
void precicec_writeData(const char *meshName, const char *dataName, int size, const int *valueIndices, const double *values)
Writes vector data values given as block.
Definition preciceC.cpp:315
void precicec_readData(const char *meshName, const char *dataName, int size, const int *valueIndices, double relativeReadTime, double *values)
Reads vector data values given as block.
Definition preciceC.cpp:329
int precicec_getDataDimensions(const char *meshName, const char *dataName)
Returns the spatial dimensionality of the given data on the given mesh.
Definition preciceC.cpp:94
void precicec_setMeshEdge(const char *meshName, int firstVertexID, int secondVertexID)
Sets mesh edge from vertex IDs.
Definition preciceC.cpp:218
void precicec_createParticipant(const char *participantName, const char *configFileName, int solverProcessIndex, int solverProcessSize)
Creates the coupling interface and configures it.
Definition preciceC.cpp:45
void precicec_setMeshQuad(const char *meshName, int firstVertexID, int secondVertexID, int thirdVertexID, int fourthVertexID)
Sets surface mesh quadrangle from vertex IDs.
Definition preciceC.cpp:265
static std::unique_ptr< precice::Participant > impl
Definition preciceC.cpp:21
int precicec_getMeshDimensions(const char *meshName)
Returns the spatial dimensionality of the given mesh.
Definition preciceC.cpp:85
void precicec_writeAndMapData(const char *meshName, const char *dataName, int size, const double *coordinates, const double *values)
Writes data using just-in-time data mapping See.
Definition preciceC.cpp:344
void precicec_resetMesh(const char *meshName)
Removes all vertices and connectivity information from the mesh.
Definition preciceC.cpp:174
void precicec_initialize()
Initiates the coupling to the coupling supervisor and initializes coupling data.
Definition preciceC.cpp:60
void precicec_mapAndReadData(const char *meshName, const char *dataName, int size, const double *coordinates, double relativeReadTime, double *values)
Reads data using just-in-time data mapping. See.
Definition preciceC.cpp:359
static std::string errormsg
Definition preciceC.cpp:25
void precicec_setMeshEdges(const char *meshName, int size, const int *vertices)
Sets multiple mesh edge from vertex IDs.
Definition preciceC.cpp:229
int precicec_requiresInitialData()
Definition preciceC.cpp:135
int precicec_isCouplingOngoing()
Returns true (->1), if the coupled simulation is ongoing.
Definition preciceC.cpp:103
int precicec_getMeshVertexSize(const char *meshName)
Returns the number of vertices of a mesh.
Definition preciceC.cpp:208
void precicec_writeGradientData(const char *meshName, const char *dataName, int size, const int *valueIndices, const double *gradients)
Writes vector gradient data to a mesh.
Definition preciceC.cpp:388
void precicec_setMeshAccessRegion(const char *meshName, const double *boundingBox)
See precice::Participant::setMeshAccessRegion().
Definition preciceC.cpp:408
void precicec_setMeshTriangle(const char *meshName, int firstVertexID, int secondVertexID, int thirdVertexID)
Sets a triangle from vertex IDs. Creates missing edges.
Definition preciceC.cpp:241
int precicec_setMeshVertex(const char *meshName, const double *position)
Creates a mesh vertex.
Definition preciceC.cpp:182
void precicec_finalize()
Finalizes the coupling to the coupling supervisor.
Definition preciceC.cpp:76
int precicec_requiresMeshConnectivityFor(const char *meshName)
Definition preciceC.cpp:162
void precicec_setMeshVertices(const char *meshName, int size, const double *positions, int *ids)
Creates multiple mesh vertices.
Definition preciceC.cpp:194
void precicec_advance(double computedTimeStepSize)
Exchanges data between solver and coupling supervisor.
Definition preciceC.cpp:68
void precicec_createParticipant_withCommunicator(const char *participantName, const char *configFileName, int solverProcessIndex, int solverProcessSize, void *communicator)
Definition preciceC.cpp:28
void precicec_setMeshQuads(const char *meshName, int size, const int *vertices)
Sets multiple mesh quads from vertex IDs.
Definition preciceC.cpp:278
int precicec_requiresGradientDataFor(const char *meshName, const char *dataName)
Checks if the given data set requires gradient data. We check if the data object has been initialized...
Definition preciceC.cpp:375
void precicec_getMeshVertexIDsAndCoordinates(const char *meshName, const int size, int *ids, double *coordinates)
See precice::Participant::getMeshVertexIDsAndCoordinates().
Definition preciceC.cpp:418
int precicec_requiresWritingCheckpoint()
Definition preciceC.cpp:144
void precicec_startProfilingSection(const char *sectionName)
Definition preciceC.cpp:430
void precicec_setMeshTetrahedron(const char *meshName, int firstVertexID, int secondVertexID, int thirdVertexID, int fourthVertexID)
Sets mesh tetrahedron from vertex IDs.
Definition preciceC.cpp:290
const char * precicec_getVersionInformation()
Returns information on the version of preCICE.
Definition preciceC.cpp:403
C language bindings to main Application Programming Interface of preCICE.