1 //
2 // CDDL HEADER START
3 //
4 // The contents of this file are subject to the terms of the Common Development
5 // and Distribution License Version 1.0 (the "License").
6 //
7 // You can obtain a copy of the license at
8 // http://www.opensource.org/licenses/CDDL-1.0. See the License for the
9 // specific language governing permissions and limitations under the License.
10 //
11 // When distributing Covered Code, include this CDDL HEADER in each file and
12 // include the License file in a prominent location with the name LICENSE.CDDL.
13 // If applicable, add the following below this CDDL HEADER, with the fields
14 // enclosed by brackets "[]" replaced with your own identifying information:
15 //
16 // Portions Copyright (c) [yyyy] [name of copyright owner]. All rights reserved.
17 //
18 // CDDL HEADER END
19 //
20
21 //
22 // Copyright (c) 2016--2020, Regents of the University of Minnesota.
23 // All rights reserved.
24 //
25 // Contributors:
26 // Ryan S. Elliott
27 //
28
29 //
30 // Release: This file is part of the kim-api-2.2.1 package.
31 //
32
33
34 #include <cstddef>
35 #include <string>
36
37 #ifndef KIM_LOG_VERBOSITY_HPP_
38 #include "KIM_LogVerbosity.hpp"
39 #endif
40 extern "C" {
41 #ifndef KIM_LOG_VERBOSITY_H_
42 #include "KIM_LogVerbosity.h"
43 #endif
44 } // extern "C"
45
46 #ifndef KIM_LANGUAGE_NAME_HPP_
47 #include "KIM_LanguageName.hpp"
48 #endif
49 extern "C" {
50 #ifndef KIM_LANGUAGE_NAME_H_
51 #include "KIM_LanguageName.h"
52 #endif
53 } // extern "C"
54
55 #ifndef KIM_NUMBERING_HPP_
56 #include "KIM_Numbering.hpp"
57 #endif
58 extern "C" {
59 #ifndef KIM_NUMBERING_H_
60 #include "KIM_Numbering.h"
61 #endif
62 } // extern "C"
63
64 #ifndef KIM_MODEL_ROUTINE_NAME_HPP_
65 #include "KIM_ModelRoutineName.hpp"
66 #endif
67 extern "C" {
68 #ifndef KIM_MODEL_ROUTINE_NAME_H_
69 #include "KIM_ModelRoutineName.h"
70 #endif
71 } // extern "C"
72
73 #ifndef KIM_SPECIES_NAME_HPP_
74 #include "KIM_SpeciesName.hpp"
75 #endif
76 extern "C" {
77 #ifndef KIM_SPECIES_NAME_H_
78 #include "KIM_SpeciesName.h"
79 #endif
80 } // extern "C"
81
82 #ifndef KIM_UNIT_SYSTEM_HPP_
83 #include "KIM_UnitSystem.hpp"
84 #endif
85 extern "C" {
86 #ifndef KIM_UNIT_SYSTEM_H_
87 #include "KIM_UnitSystem.h"
88 #endif
89 } // extern "C"
90
91 #ifndef KIM_MODEL_DRIVER_CREATE_HPP_
92 #include "KIM_ModelDriverCreate.hpp"
93 #endif
94 extern "C" {
95 #ifndef KIM_MODEL_DRIVER_CREATE_H_
96 #include "KIM_ModelDriverCreate.h"
97 #endif
98 } // extern "C"
99
100
101 struct KIM_ModelDriverCreate
102 {
103 void * p;
104 };
105
106 #define CONVERT_POINTER \
107 KIM::ModelDriverCreate * pModelDriverCreate \
108 = reinterpret_cast<KIM::ModelDriverCreate *>(modelDriverCreate->p)
109
110 namespace
111 {
makeLogVerbosityCpp(KIM_LogVerbosity const logVerbosity)112 KIM::LogVerbosity makeLogVerbosityCpp(KIM_LogVerbosity const logVerbosity)
113 {
114 return KIM::LogVerbosity(logVerbosity.logVerbosityID);
115 }
116
makeNumberingCpp(KIM_Numbering const numbering)117 KIM::Numbering makeNumberingCpp(KIM_Numbering const numbering)
118 {
119 return KIM::Numbering(numbering.numberingID);
120 }
121
makeLengthUnitCpp(KIM_LengthUnit const lengthUnit)122 KIM::LengthUnit makeLengthUnitCpp(KIM_LengthUnit const lengthUnit)
123 {
124 return KIM::LengthUnit(lengthUnit.lengthUnitID);
125 }
126
makeEnergyUnitCpp(KIM_EnergyUnit const energyUnit)127 KIM::EnergyUnit makeEnergyUnitCpp(KIM_EnergyUnit const energyUnit)
128 {
129 return KIM::EnergyUnit(energyUnit.energyUnitID);
130 }
131
makeChargeUnitCpp(KIM_ChargeUnit const chargeUnit)132 KIM::ChargeUnit makeChargeUnitCpp(KIM_ChargeUnit const chargeUnit)
133 {
134 return KIM::ChargeUnit(chargeUnit.chargeUnitID);
135 }
136
137 KIM::TemperatureUnit
makeTemperatureUnitCpp(KIM_TemperatureUnit const temperatureUnit)138 makeTemperatureUnitCpp(KIM_TemperatureUnit const temperatureUnit)
139 {
140 return KIM::TemperatureUnit(temperatureUnit.temperatureUnitID);
141 }
142
makeTimeUnitCpp(KIM_TimeUnit const timeUnit)143 KIM::TimeUnit makeTimeUnitCpp(KIM_TimeUnit const timeUnit)
144 {
145 return KIM::TimeUnit(timeUnit.timeUnitID);
146 }
147
makeLanguageNameCpp(KIM_LanguageName const languageName)148 KIM::LanguageName makeLanguageNameCpp(KIM_LanguageName const languageName)
149 {
150 return KIM::LanguageName(languageName.languageNameID);
151 }
152
153 KIM::ModelRoutineName
makeRoutineNameCpp(KIM_ModelRoutineName const modelRoutineName)154 makeRoutineNameCpp(KIM_ModelRoutineName const modelRoutineName)
155 {
156 return KIM::ModelRoutineName(modelRoutineName.modelRoutineNameID);
157 }
158
makeSpeciesNameCpp(KIM_SpeciesName const speciesName)159 KIM::SpeciesName makeSpeciesNameCpp(KIM_SpeciesName const speciesName)
160 {
161 return KIM::SpeciesName(speciesName.speciesNameID);
162 }
163 } // namespace
164
165 extern "C" {
KIM_ModelDriverCreate_GetParameterFileDirectoryName(KIM_ModelDriverCreate const * const modelDriverCreate,char const ** const directoryName)166 void KIM_ModelDriverCreate_GetParameterFileDirectoryName(
167 KIM_ModelDriverCreate const * const modelDriverCreate,
168 char const ** const directoryName)
169 {
170 CONVERT_POINTER;
171
172 std::string const * pStr = NULL;
173 pModelDriverCreate->GetParameterFileDirectoryName(&pStr);
174 *directoryName = pStr->c_str();
175 }
176
KIM_ModelDriverCreate_GetNumberOfParameterFiles(KIM_ModelDriverCreate const * const modelDriverCreate,int * const numberOfParameterFiles)177 void KIM_ModelDriverCreate_GetNumberOfParameterFiles(
178 KIM_ModelDriverCreate const * const modelDriverCreate,
179 int * const numberOfParameterFiles)
180 {
181 CONVERT_POINTER;
182
183 pModelDriverCreate->GetNumberOfParameterFiles(numberOfParameterFiles);
184 }
185
KIM_ModelDriverCreate_GetParameterFileName(KIM_ModelDriverCreate const * const modelDriverCreate,int const index,char const ** const parameterFileName)186 int KIM_ModelDriverCreate_GetParameterFileName(
187 KIM_ModelDriverCreate const * const modelDriverCreate,
188 int const index,
189 char const ** const parameterFileName)
190 {
191 CONVERT_POINTER;
192
193 std::string const * pStr;
194 std::string const ** ppStr;
195 if (parameterFileName == NULL)
196 ppStr = NULL;
197 else
198 ppStr = &pStr;
199
200 int error = pModelDriverCreate->GetParameterFileName(index, ppStr);
201
202 if (error)
203 return true;
204 else
205 {
206 if (parameterFileName != NULL) *parameterFileName = pStr->c_str();
207 return false;
208 }
209 }
210
KIM_ModelDriverCreate_GetParameterFileBasename(KIM_ModelDriverCreate const * const modelDriverCreate,int const index,char const ** const parameterFileBasename)211 int KIM_ModelDriverCreate_GetParameterFileBasename(
212 KIM_ModelDriverCreate const * const modelDriverCreate,
213 int const index,
214 char const ** const parameterFileBasename)
215 {
216 CONVERT_POINTER;
217
218 std::string const * pStr;
219 std::string const ** ppStr;
220 if (parameterFileBasename == NULL)
221 ppStr = NULL;
222 else
223 ppStr = &pStr;
224
225 int error = pModelDriverCreate->GetParameterFileBasename(index, ppStr);
226
227 if (error)
228 return true;
229 else
230 {
231 if (parameterFileBasename != NULL) *parameterFileBasename = pStr->c_str();
232 return false;
233 }
234 }
235
KIM_ModelDriverCreate_SetModelNumbering(KIM_ModelDriverCreate * const modelDriverCreate,KIM_Numbering const numbering)236 int KIM_ModelDriverCreate_SetModelNumbering(
237 KIM_ModelDriverCreate * const modelDriverCreate,
238 KIM_Numbering const numbering)
239 {
240 CONVERT_POINTER;
241
242 return pModelDriverCreate->SetModelNumbering(makeNumberingCpp(numbering));
243 }
244
KIM_ModelDriverCreate_SetInfluenceDistancePointer(KIM_ModelDriverCreate * const modelDriverCreate,double const * const influenceDistance)245 void KIM_ModelDriverCreate_SetInfluenceDistancePointer(
246 KIM_ModelDriverCreate * const modelDriverCreate,
247 double const * const influenceDistance)
248 {
249 CONVERT_POINTER;
250
251 pModelDriverCreate->SetInfluenceDistancePointer(influenceDistance);
252 }
253
KIM_ModelDriverCreate_SetNeighborListPointers(KIM_ModelDriverCreate * const modelDriverCreate,int const numberOfNeighborLists,double const * const cutoffs,int const * const modelWillNotRequestNeighborsOfNoncontributingParticles)254 void KIM_ModelDriverCreate_SetNeighborListPointers(
255 KIM_ModelDriverCreate * const modelDriverCreate,
256 int const numberOfNeighborLists,
257 double const * const cutoffs,
258 int const * const modelWillNotRequestNeighborsOfNoncontributingParticles)
259 {
260 CONVERT_POINTER;
261
262 pModelDriverCreate->SetNeighborListPointers(
263 numberOfNeighborLists,
264 cutoffs,
265 modelWillNotRequestNeighborsOfNoncontributingParticles);
266 }
267
KIM_ModelDriverCreate_SetRoutinePointer(KIM_ModelDriverCreate * const modelDriverCreate,KIM_ModelRoutineName const modelRoutineName,KIM_LanguageName const languageName,int const required,KIM_Function * const fptr)268 int KIM_ModelDriverCreate_SetRoutinePointer(
269 KIM_ModelDriverCreate * const modelDriverCreate,
270 KIM_ModelRoutineName const modelRoutineName,
271 KIM_LanguageName const languageName,
272 int const required,
273 KIM_Function * const fptr)
274 {
275 CONVERT_POINTER;
276
277 KIM::ModelRoutineName routN = makeRoutineNameCpp(modelRoutineName);
278 KIM::LanguageName langN = makeLanguageNameCpp(languageName);
279 return pModelDriverCreate->SetRoutinePointer(
280 routN, langN, required, reinterpret_cast<KIM::Function *>(fptr));
281 }
282
KIM_ModelDriverCreate_SetSpeciesCode(KIM_ModelDriverCreate * const modelDriverCreate,KIM_SpeciesName const speciesName,int const code)283 int KIM_ModelDriverCreate_SetSpeciesCode(
284 KIM_ModelDriverCreate * const modelDriverCreate,
285 KIM_SpeciesName const speciesName,
286 int const code)
287 {
288 CONVERT_POINTER;
289
290 return pModelDriverCreate->SetSpeciesCode(makeSpeciesNameCpp(speciesName),
291 code);
292 }
293
KIM_ModelDriverCreate_SetParameterPointerInteger(KIM_ModelDriverCreate * const modelDriverCreate,int const extent,int * const ptr,char const * const name,char const * const description)294 int KIM_ModelDriverCreate_SetParameterPointerInteger(
295 KIM_ModelDriverCreate * const modelDriverCreate,
296 int const extent,
297 int * const ptr,
298 char const * const name,
299 char const * const description)
300 {
301 CONVERT_POINTER;
302
303 return pModelDriverCreate->SetParameterPointer(
304 extent, ptr, name, description);
305 }
306
KIM_ModelDriverCreate_SetParameterPointerDouble(KIM_ModelDriverCreate * const modelDriverCreate,int const extent,double * const ptr,char const * const name,char const * const description)307 int KIM_ModelDriverCreate_SetParameterPointerDouble(
308 KIM_ModelDriverCreate * const modelDriverCreate,
309 int const extent,
310 double * const ptr,
311 char const * const name,
312 char const * const description)
313 {
314 CONVERT_POINTER;
315
316 return pModelDriverCreate->SetParameterPointer(
317 extent, ptr, name, description);
318 }
319
KIM_ModelDriverCreate_SetModelBufferPointer(KIM_ModelDriverCreate * const modelDriverCreate,void * const ptr)320 void KIM_ModelDriverCreate_SetModelBufferPointer(
321 KIM_ModelDriverCreate * const modelDriverCreate, void * const ptr)
322 {
323 CONVERT_POINTER;
324
325 pModelDriverCreate->SetModelBufferPointer(ptr);
326 }
327
KIM_ModelDriverCreate_SetUnits(KIM_ModelDriverCreate * const modelDriverCreate,KIM_LengthUnit const lengthUnit,KIM_EnergyUnit const energyUnit,KIM_ChargeUnit const chargeUnit,KIM_TemperatureUnit const temperatureUnit,KIM_TimeUnit const timeUnit)328 int KIM_ModelDriverCreate_SetUnits(
329 KIM_ModelDriverCreate * const modelDriverCreate,
330 KIM_LengthUnit const lengthUnit,
331 KIM_EnergyUnit const energyUnit,
332 KIM_ChargeUnit const chargeUnit,
333 KIM_TemperatureUnit const temperatureUnit,
334 KIM_TimeUnit const timeUnit)
335 {
336 CONVERT_POINTER;
337
338 KIM::LengthUnit lengthU = makeLengthUnitCpp(lengthUnit);
339 KIM::EnergyUnit energyU = makeEnergyUnitCpp(energyUnit);
340 KIM::ChargeUnit chargeU = makeChargeUnitCpp(chargeUnit);
341 KIM::TemperatureUnit temperatureU = makeTemperatureUnitCpp(temperatureUnit);
342 KIM::TimeUnit timeU = makeTimeUnitCpp(timeUnit);
343
344 return pModelDriverCreate->SetUnits(
345 lengthU, energyU, chargeU, temperatureU, timeU);
346 }
347
KIM_ModelDriverCreate_ConvertUnit(KIM_LengthUnit const fromLengthUnit,KIM_EnergyUnit const fromEnergyUnit,KIM_ChargeUnit const fromChargeUnit,KIM_TemperatureUnit const fromTemperatureUnit,KIM_TimeUnit const fromTimeUnit,KIM_LengthUnit const toLengthUnit,KIM_EnergyUnit const toEnergyUnit,KIM_ChargeUnit const toChargeUnit,KIM_TemperatureUnit const toTemperatureUnit,KIM_TimeUnit const toTimeUnit,double const lengthExponent,double const energyExponent,double const chargeExponent,double const temperatureExponent,double const timeExponent,double * const conversionFactor)348 int KIM_ModelDriverCreate_ConvertUnit(
349 KIM_LengthUnit const fromLengthUnit,
350 KIM_EnergyUnit const fromEnergyUnit,
351 KIM_ChargeUnit const fromChargeUnit,
352 KIM_TemperatureUnit const fromTemperatureUnit,
353 KIM_TimeUnit const fromTimeUnit,
354 KIM_LengthUnit const toLengthUnit,
355 KIM_EnergyUnit const toEnergyUnit,
356 KIM_ChargeUnit const toChargeUnit,
357 KIM_TemperatureUnit const toTemperatureUnit,
358 KIM_TimeUnit const toTimeUnit,
359 double const lengthExponent,
360 double const energyExponent,
361 double const chargeExponent,
362 double const temperatureExponent,
363 double const timeExponent,
364 double * const conversionFactor)
365 {
366 return KIM::ModelDriverCreate::ConvertUnit(
367 makeLengthUnitCpp(fromLengthUnit),
368 makeEnergyUnitCpp(fromEnergyUnit),
369 makeChargeUnitCpp(fromChargeUnit),
370 makeTemperatureUnitCpp(fromTemperatureUnit),
371 makeTimeUnitCpp(fromTimeUnit),
372 makeLengthUnitCpp(toLengthUnit),
373 makeEnergyUnitCpp(toEnergyUnit),
374 makeChargeUnitCpp(toChargeUnit),
375 makeTemperatureUnitCpp(toTemperatureUnit),
376 makeTimeUnitCpp(toTimeUnit),
377 lengthExponent,
378 energyExponent,
379 chargeExponent,
380 temperatureExponent,
381 timeExponent,
382 conversionFactor);
383 }
384
KIM_ModelDriverCreate_LogEntry(KIM_ModelDriverCreate const * const modelDriverCreate,KIM_LogVerbosity const logVerbosity,char const * const message,int const lineNumber,char const * const fileName)385 void KIM_ModelDriverCreate_LogEntry(
386 KIM_ModelDriverCreate const * const modelDriverCreate,
387 KIM_LogVerbosity const logVerbosity,
388 char const * const message,
389 int const lineNumber,
390 char const * const fileName)
391 {
392 CONVERT_POINTER;
393
394 pModelDriverCreate->LogEntry(
395 makeLogVerbosityCpp(logVerbosity), message, lineNumber, fileName);
396 }
397
KIM_ModelDriverCreate_ToString(KIM_ModelDriverCreate const * const modelDriverCreate)398 char const * KIM_ModelDriverCreate_ToString(
399 KIM_ModelDriverCreate const * const modelDriverCreate)
400 {
401 CONVERT_POINTER;
402
403 return pModelDriverCreate->ToString().c_str();
404 }
405
406 } // extern "C"
407