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