/*                                                                            */
/* CDDL HEADER START                                                          */
/*                                                                            */
/* The contents of this file are subject to the terms of the Common           */
/* Development and Distribution License Version 1.0 (the "License").          */
/*                                                                            */
/* You can obtain a copy of the license at                                    */
/* http://www.opensource.org/licenses/CDDL-1.0.  See the License for the      */
/* specific language governing permissions and limitations under the License. */
/*                                                                            */
/* When distributing Covered Code, include this CDDL HEADER in each file and  */
/* include the License file in a prominent location with the name             */
/* LICENSE.CDDL.                                                              */
/* If applicable, add the following below this CDDL HEADER, with the fields   */
/* enclosed by brackets "[]" replaced with your own identifying information:  */
/*                                                                            */
/* Portions Copyright (c) [yyyy] [name of copyright owner].                   */
/* All rights reserved.                                                       */
/*                                                                            */
/* CDDL HEADER END                                                            */
/*                                                                            */

/*                                                                            */
/* Copyright (c) 2017--2018, Regents of the University of Minnesota.          */
/* All rights reserved.                                                       */
/*                                                                            */
/* Contributors:                                                              */
/*    Ryan S. Elliott                                                         */
/*    Ellad B. Tadmor                                                         */
/*                                                                            */

/*                                                                            */
/* Release: This file is part of the kim-api.git repository.                  */
/*                                                                            */

/**
\page version2_differences Summary of Differences Between kim-api-v1 and kim-api-v2

Previous Section: \ref implementation.

Experience with using and supporting the kim-api-v1 package has shown that the
package's complexity (in terms of the number of different "modes of operation";
e.g., neighbor lists: half, full, iterator, locator; NBCs: cluster, miopbc,
neigh_pure, neigh_rvec; etc.) makes it difficult for new users to become
competent kim-api-v1 code developers.  This also means that %KIM Models will
only work with KIM-compliant codes that support the same modes of operation,
thereby limiting the utility of the kim-api as a standard.  Further, the
kim-api's complexity results in Model implementations that are convoluted due
to developers' desire to support *all* modes of operation.  This experience has
led us to an approach that gives kim-api-v2 a dramatically simplified form,
while still retaining a high degree of flexibility.  Thus, in regard to feature
design and selection for the kim-api-v2 package, we have taken "simplicity" as
a guiding principle.

## High-level changes between kim-api-v1 and kim-api-v2

- **NBCs Have Been Eliminated**: kim-api-v2 supports only one type of
  configuration (as described in Section \ref theory).  This corresponds,
  roughly, to the kim-api-v1 NEIGH_PURE_F NBC.  Additionally:

  - All neighbor lists in kim-api-v2 are full, unordered, and random-access.
    (However, see \ref neighbor_list_hints "Neighbor List Hints".)

  - Particle Contributing (a.k.a., padding or ghost-atom) status (contributing
    or non-contributing) is explicitly specified in the *particleContributing*
    argument.  A particle with zero neighbors in (one of) its neighbor lists
    has no special meaning in kim-api-v2, as opposed to in kim-api-v1 where
    this indicates the particle is non-contributing.

- **Compute Routine Arguments and Callbacks Have Been Separated From the Model
    Object**: kim-api-v2 separates the arguments and callbacks of the compute
    routine from the model object.  These items are now stored in a separate
    compute-arguments object that must be provided to the model's compute
    routine.  This new approach provides a cleaner conceptual distinction
    between things the model is responsible for (influence distance, cutoffs,
    parameters, and create / compute / destroy routines), and things that the
    simulator is responsible for (the configuration, compute-arguments, and
    compute-callback routines).  One practical advantage of this separation
    occurs for multi-threaded simulators.  Such a simulator can use a single
    model object with multiple compute-arguments objects to compute (energy,
    forces, etc.) for many different configurations simultaneously.  Without
    the model/compute-arguments separation multiple model objects would be
    necessary.  This would require multiple in-memory copies of the model's
    parameter set, which can be very wasteful since (in particular, for
    "machine learning" models) a model's parameter set can be very large.

- **%KIM Descriptor Files Have Been Eliminated**: kim-api-v2 does not use *%KIM
  descriptor files*.  Instead, kim-api-v2 models register their units,
  conventions, and parameters in their *ModelCreate* initialization routine,
  and they register their arguments and callbacks in their
  * *ModelComputeArgumentsCreate* initialization routine.  Simulator--Model
  matching is now the responsibility of the simulator.  This is facilitated by
  kim-api-v2 through the availability of routines for obtaining the model's
  registered values of all necessary quantities at run-time.

  Best practice for kim-api-v2 simulators is to, first create a model object
  and an associated compute-arguments object (which also execute the model's
  initialization routines), second interrogate the model's capabilities to
  determine if the desired computation can be successfully performed with the
  model, and third, if possible, perform the desired computation.

  This scheme for Simulator--Model matching places a larger burden (as compared
  to kim-api-v1) on the simulator.  However, it has been determined that a
  full-featured "KIM descriptor file"--based matching specification (covering
  all possibilities) is too complex.  Thus, it is best to perform this matching
  process in the simulator's code at run-time.  In the worst-case, a simulator
  can simply *assume* that it matches with the model and attempt to perform the
  desired computation.  As long as the simulator carefully checks for any and
  all errors reported by the %KIM API, it should detect an error at some point
  during its processing if the simulator, in fact, does not match with the
  model.

- **A New Memory Management Scheme**: kim-api-v2 requires the simulator to be
  responsible for storage memory associated with all input and output
  compute-arguments communicated between the simulator and the model via a
  compute-arguments object.  Similarly, kim-api-v2 requires the model to be
  responsible for storage memory associated with its influence distance, its
  neighbor list cutoff values, and its published parameters.

  kim-api-v2 does not provide a routine analogous to the KIM_API_Allocate() of
  kim-api-v1.  This routine is now seen as a source of much confusion regarding
  the memory management model employed in kim-api-v1.  Thus, it is best not to
  provide such a capability as part of kim-api-v2.

- **Language Consistency**: kim-api-v2 aims to conform to standard practice and
  idioms of the native code language, as opposed to kim-api-v1 which aimed to
  maintain consistency of the api across languages.

  This means that using the kim-api-v2 in your preferred language feels more
  natural.  For example, the C++ api bindings extensively use namespaces,
  objects, std::string, and error codes as function return values.  The Fortran
  api binding provides error codes as arguments to SUBROUTINES, uses handles to
  objects, and hides (as much as possible) the effort of making Fortran
  interoperable with C and other languages.  In particular, the need for
  explicit use of the intrinsic C_F_POINTER() subroutine has been minimized.

  Consistent identifier naming schemes have been established within each
  language binding.  Abbreviations have been avoided to make names easier to
  remember.

- **Explicit Definitions**: Clear definitions for all concepts used by the
  kim-api-v2 package are provided in Section \ref theory.

  In many cases, these are the same concepts and definitions employed by
  kim-api-v1.  However, they were not explicitly stated in the kim-api-v1
  documentation.

- **Improved Logging Facilities and Error Messages**: kim-api-v2 has been
  redesigned and rewritten from the ground up.  Significantly improved
  facilities for logging events and execution progress have been included.
  Along with these general enhancements, all error messages have been rewritten
  with an eye toward improved clarity.


## Lower-level changes between kim-api-v2 and kim-api-v1

- **FIXED Parameters Have Been Eliminated**: kim-api-v2 defines only one type
  of "published" parameters for a model.  These are all changeable, and thus,
  would correspond to the "FREE" parameters of kim-api-v1.

  The FIXED parameters of kim-api-v1 must now be stored in the model buffer and
  are inaccessible to the simulator.

- **Argument Shape and Extent**: For simplicity, explicit api tracking of
  argument shape and extent has been eliminated from kim-api-v2.  These values
  are defined as part of the api documentation.  All arguments must have fixed
  shape and extent values that are either given numbers or defined in terms of
  * *numberOfParticles*.

  Published model parameters are always taken to be one-dimensional arrays with
  a specified extent that must be defined by the model and communicated to the
  API through the get/set routines for parameters.  Thus, scalar parameters
  have extent 1.  Multidimensional array parameters are treated by the API as
  one-dimensional arrays with extent equal to the total number of values in the
  multidimensional array.

- **Extensible Strongly-Typed Enumerations**: kim-api-v2 uses "extensible
  strongly-typed enumerations" as identifiers for quantities as opposed to
  kim-api-v1 which uses character arrays (strings) or "index" values.  Thus,
  all "index" values and the associated routines (such as KIM_API_get_index())
  have been eliminated.

- **Consistent and Descriptive Identifier Names**: The entire set of kim-api-v2
  identifier names (namespace, module, object, subroutine, function,
  enumerations) have been reviewed and selected for clarity and consistency.
  As a result many of the identifier names from kim-api-v1 have changed in
  kim-api-v2.  Here we provide a complete translation table.  The C and Fortran
  bindings are obtained from the C++ binding by the following transformations
  (Note: some exceptions to these rules exist):

  - C++ \f$\rightarrow\f$ C: Replace "::" with "_".  For example,
    KIM::Model::GetNumberOfParameters() becomes KIM_Model_GetNumberOfParameters().

  - C++ \f$\rightarrow\f$ Fortran: Replace "::" with "_".  Where camel-case is
    used in C++, convert to snake-case.  Convert to all lower-case.  For
    example, KIM::Model::GetNumberOfParameters() becomes
    kim_model_get_number_of_parameters().

Routine Identifier Name translation table:

kim-api-v1                             | kim-api-v2 C++ Binding               |
-------------------------------------- | ------------------------------------ |
KIM_API_file_init()                    | N/A                                  |
KIM_API_string_init()                  | KIM::Model::Create()                 |
KIM_API_get_version()                  | KIM::SEM_VER::GetSemVer()            |
KIM_API_get_version_major()            | N/A                                  |
KIM_API_get_version_minor()            | N/A                                  |
KIM_API_get_version_prerelease()       | N/A                                  |
KIM_API_get_version_build_metadata()   | N/A                                  |
N/A                                    | KIM::SEM_VER::ParseSemVer()          |
KIM_API_version_newer()                | KIM::SEM_VER::IsLessThan()           |
KIM_API_model_info()                   | N/A                                  |
KIM_API_allocate()                     | N/A                                  |
KIM_API_c_free()                       | N/A                                  |
KIM_API_free()                         | KIM::Model::Destroy()                |
KIM_API_print()                        | KIM::Model::String(), KIM::ModelCreate::String(), KIM::ModelComputeArgumentsCreate::String(), KIM::ModelComputeArgumentsDestroy::String(), KIM::ModelCompute::String(), KIM::ModelRefresh::String(), KIM::ModelDestroy::String(), KIM::ComputeArguments::String() |
KIM_API_model_compute()                | KIM::Model::Compute()                |
KIM_API_model_destroy()                | N/A                                  |
KIM_API_get_model_index_shift()        | N/A                                  |
N/A                                    | KIM::ModelCreate::SetModelNumbering(), KIM::ModelDriverCreate::SetModelNumbering() |
KIM_API_set_model_buffer()             | KIM::ModelCreate::SetModelBufferPointer(), KIM::ModelDriverCreate::SetModelBufferPointer(), KIM::ModelComputeArgumentsCreate::SetModelBufferPointer() |
KIM_API_set_sim_buffer()               | KIM::Model::SetSimulatorBufferPointer(), KIM::ComputeArguments::SetSimulatorBufferPointer() |
KIM_API_get_model_buffer()             | KIM::ModelCompute::GetModelBufferPointer(), KIM::ModelDestroy::GetModelBufferPointer(), KIM::ModelRefresh::GetModelBufferPointer(), KIM::ModelComputeArguments::GetModelBufferPointer(), KIM::ModelComputeArgumentsDestroy::GetModelBufferPointer() |
KIM_API_get_sim_buffer()               | KIM::Model::GetSimulatorBufferPointer(), KIM::ComputeArguments::GetSimulatorBufferPointer() |
KIM_API_is_half_neighbors()            | N/A                                  |
KIM_API_set_data()                     | KIM::ComputeArguments::SetArgumentPointer() |
N/A                                    | KIM::ModelComputeArgumentsCreate::SetArgumentSupportStatus() |
N/A                                    | KIM::ComputeArguments::GetArgumentSupportStatus() |
N/A                                    | KIM::ModelComputeArgumentsCreate::SetCallbackSupportStatus() |
N/A                                    | KIM::ComputeArguments::GetCallbackSupportStatus() |
KIM_API_set_method()                   | KIM::ComputeArguments::SetCallbackPointer() |
KIM_API_get_data()                     | KIM::ModelComputeArguments::GetArgumentPointer() |
KIM_API_get_method()                   | N/A                                  |
N/A                                    | KIM::ModelComputeArguments::IsCallbackPresent() |
N/A                                    | KIM::ComputeArguments::AreAllRequiredArgumentsAndCallbacksPresent() |
KIM_API_get_size()                     | N/A                                  |
KIM_API_get_rank()                     | N/A                                  |
KIM_API_get_shape()                    | N/A                                  |
KIM_API_set_shape()                    | N/A                                  |
KIM_API_set_compute()                  | N/A                                  |
KIM_API_get_compute()                  | N/A                                  |
N/A                                    | KIM::ModelCreate::SetInfluenceDistancePointer(), KIM::ModelDriverCreate::SetInfluenceDistancePointer(), KIM::ModelRefresh::SetInfluenceDistancePointer() |
N/A                                    | KIM::Model::GetInfluenceDistance()   |
N/A                                    | KIM::Model::GetNeighborListPointers() |
N/A                                    | KIM::ModelCreate::SetNeighborListPointers(), KIM::ModelDriverCreate::SetNeighborListPointers(), KIM::ModelRefresh::SetNeighborListPointers() |
N/A                                    | KIM::ModelCreate::SetRefreshPointer(), KIM::ModelDriverCreate::SetRefreshPointer() |
N/A                                    | KIM::ModelCreate::SetDestroyPointer(), KIM::ModelDriverCreate::SetDestroyPointer() |
N/A                                    | KIM::ModelCreate::SetComputeArgumentsCreatePointer(), KIM::ModelDriverCreate::SetComputeArgumentsCreatePointer() |
N/A                                    | KIM::ModelCreate::SetComputeArgumentsDestroyPointer(), KIM::ModelDriverCreate::SetComputeArgumentsDestroyPointer() |
N/A                                    | KIM::ModelCreate::SetComputePointer(), KIM::ModelDriverCreate::SetComputePointer() |
KIM_API_get_index()                    | N/A                                  |
KIM_API_model_init()                   | N/A                                  |
KIM_API_model_reinit()                 | KIM::Model::ClearThenRefresh()       |
KIM_API_get_num_model_species()        | N/A                                  |
KIM_API_get_model_species()            | KIM::Model::GetSpeciesSupportAndCode() |
KIM_API_get_num_sim_species()          | N/A                                  |
KIM_API_get_sim_species()              | N/A                                  |
N/A                                    | KIM::ModelDriverCreate::GetNumberOfParameterFiles() |
N/A                                    | KIM::ModelDriverCreate::GetParameterFileName() |
KIM_API_get_num_params()               | KIM::Model::GetNumberOfParameters()  |
KIM_API_get_parameter()                | KIM::Model::GetParameter()           |
N/A                                    | KIM::Model::SetParameter()           |
N/A                                    | KIM::Model::GetParameterDataTypeExtentAndDescription() |
N/A                                    | KIM::ModelCreate::SetParameterPointer(), KIM::ModelDriverCreate::SetParameterPointer() |
KIM_API_get_num_free_params()          | N/A                                  |
KIM_API_get_free_parameter()           | N/A                                  |
KIM_API_get_num_fixed_params()         | N/A                                  |
KIM_API_get_fixed_parameter()          | N/A                                  |
KIM_API_get_NBC_method()               | N/A                                  |
KIM_API_get_species_code()             | KIM::Model::GetSpeciesSupportAndCode() |
KIM_API_set_species_code()             | KIM::ModelCreate::SetSpeciesCode(), KIM::ModelDriverCreate::SetSpeciesCode() |
KIM_API_get_model_kim_str_len()        | N/A                                  |
KIM_API_get_model_kim_str()            | N/A                                  |
KIM_API_get_neigh_mode()               | N/A                                  |
KIM_API_get_neigh()                    | KIM::ModelComputeArguments::GetNeighborList()   |
KIM_API_process_dEdr()                 | KIM::ModelComputeArguments::ProcessDEDrTerm()   |
KIM_API_process_d2Edr2()               | KIM::ModelComputeArguments::ProcessD2EDr2Term() |
KIM_API_get_status_msg()               | N/A                                  |
KIM_API_report_error()                 | KIM::Log::LogEntry(), KIM::ModelCreate::LogEntry(), KIM::ModelCompute::LogEntry(), KIM::ModelRefresh::LogEntry(), KIM::ModelDestroy::LogEntry(), KIM::ModelComputeArguments::LogEntry(), KIM::ModelComputeArgumentsCreate::LogEntry(), KIM::ModelComputeArgumentsDestroy::LogEntry() |
N/A                                    | KIM::Model::SetLogID(), KIM::ComputeArguments::SetLogID() |
N/A                                    | KIM::Model::PushLogVerbosity(), KIM::ComputeArguments::PushLogVerbosity() |
N/A                                    | KIM::Model::PopLogVerbosity(), KIM::ComputeArguments::PopLogVerbosity() |
KIM_API_get_scale_conversion()         | KIM::ModelCreate::ConvertUnit(), KIM::ModelDriverCreate::ConvertUnit() |
KIM_API_get_unit_handling()            | N/A                                  |
KIM_API_get_unit_length()              | KIM::Model::GetUnits()               |
KIM_API_get_unit_energy()              | KIM::Model::GetUnits()               |
KIM_API_get_unit_charge()              | KIM::Model::GetUnits()               |
KIM_API_get_unit_temperature()         | KIM::Model::GetUnits()               |
KIM_API_get_unit_time()                | KIM::Model::GetUnits()               |
N/A                                    | KIM::ModelCreate::SetUnits(), KIM::ModelDriverCreate::SetUnits() |
KIM_API_convert_to_act_unit()          | N/A                                  |
KIM_API_set_data_by_index()            | N/A                                  |
KIM_API_set_method_by_index()          | N/A                                  |
KIM_API_get_data_by_index()            | N/A                                  |
KIM_API_get_method_by_index()          | N/A                                  |
KIM_API_get_size_by_index()            | N/A                                  |
KIM_API_get_rank_by_index()            | N/A                                  |
KIM_API_get_shape_by_index()           | N/A                                  |
KIM_API_set_compute_by_index()         | N/A                                  |
KIM_API_get_compute_by_index()         | N/A                                  |
KIM_API_getm_compute()                 | N/A                                  |
KIM_API_setm_compute()                 | N/A                                  |
KIM_API_getm_compute_by_index()        | N/A                                  |
KIM_API_setm_compute_by_index()        | N/A                                  |
KIM_API_getm_data()                    | N/A                                  |
KIM_API_getm_method()                  | N/A                                  |
KIM_API_setm_data()                    | N/A                                  |
KIM_API_setm_method()                  | N/A                                  |
KIM_API_getm_data_by_index()           | N/A                                  |
KIM_API_getm_method_by_index()         | N/A                                  |
KIM_API_setm_data_by_index()           | N/A                                  |
KIM_API_setm_method_by_index()         | N/A                                  |
KIM_API_getm_index()                   | N/A                                  |


Extensible enumeration Identifier Name translation table:

kim-api-v1                             | kim-api-v2 C++ Binding                               |
-------------------------------------- | ---------------------------------------------------- |
"numberOfParticles"                    | KIM::COMPUTE_ARGUMENT_NAME::numberOfParticles        |
"particleSpecies"                      | KIM::COMPUTE_ARGUMENT_NAME::particleSpeciesCodes     |
N/A                                    | KIM::COMPUTE_ARGUMENT_NAME::particleContributing     |
"coordinates"                          | KIM::COMPUTE_ARGUMENT_NAME::coordinates              |
"energy"                               | KIM::COMPUTE_ARGUMENT_NAME::partialEnergy            |
"forces"                               | KIM::COMPUTE_ARGUMENT_NAME::partialForces            |
"particleEnergy"                       | KIM::COMPUTE_ARGUMENT_NAME::partialParticleEnergy    |
"virial"                               | KIM::COMPUTE_ARGUMENT_NAME::partialVirial            |
"particleVirial"                       | KIM::COMPUTE_ARGUMENT_NAME::partialParticleVirial    |
"cutoff"                               | N/A                                                  |
"numberContributingParticles"          | N/A                                                  |
"numberOfSpecies"                      | N/A                                                  |
"particleCharge"                       | N/A                                                  |
"particleSize"                         | N/A                                                  |
"neighObject"                          | N/A                                                  |
"boxSideLengths"                       | N/A                                                  |
"temperature"                          | N/A                                                  |
"hessian"                              | N/A                                                  |
"PARAM_FREE_cutoff"                    | N/A                                                  |
"get_neigh"                            | KIM::COMPUTE_CALLBACK_NAME::GetNeighborList          |
"process_dEdr"                         | KIM::COMPUTE_CALLBACK_NAME::ProcessDEDrTerm          |
"process_d2Edr2"                       | KIM::COMPUTE_CALLBACK_NAME::ProcessD2EDr2Term        |
"ZeroBasedLists"                       | KIM::NUMBERING::zeroBased                            |
"OneBasedLists"                        | KIM::NUMBERING::oneBased                             |
"Neigh_IterAccess"                     | N/A                                                  |
"Neigh_LocaAccess"                     | N/A                                                  |
"Neigh_BothAccess"                     | N/A                                                  |
"CLUSTER"                              | N/A                                                  |
"NEIGH_PURE_H"                         | N/A                                                  |
"NEIGH_PURE_F"                         | N/A                                                  |
"NEIGH_RVEC_H"                         | N/A                                                  |
"NEIGH_RVEC_F"                         | N/A                                                  |
"MI_OPBC_H"                            | N/A                                                  |
"MI_OPBC_F"                            | N/A                                                  |
|                                      |                                                      |
"electron"                             | KIM::SPECIES_NAME::electron                          |
"H"                                    | KIM::SPECIES_NAME::H                                 |
"He"                                   | KIM::SPECIES_NAME::He                                |
etc.                                   | etc.                                                 |
"user20"                               | KIM::SPECIES_NAME::user20                            |
|                                      |                                                      |
"C"                                    | KIM::CHARGE_UNIT::C                                  |
"e"                                    | KIM::CHARGE_UNIT::e                                  |
"statC"                                | KIM::CHARGE_UNIT::statC                              |
N/A                                    | KIM::CHARGE_UNIT::unused                             |
"amu_A2_per_ps2"                       | KIM::ENERGY_UNIT::amu_A2_per_ps2                     |
"erg"                                  | KIM::ENERGY_UNIT::erg                                |
"eV"                                   | KIM::ENERGY_UNIT::eV                                 |
"Hartree"                              | KIM::ENERGY_UNIT::Hartree                            |
"J"                                    | KIM::ENERGY_UNIT::J                                  |
"kcal_mol"                             | KIM::ENERGY_UNIT::kcal_mol                           |
N/A                                    | KIM::ENERGY_UNIT::unused                             |
"A"                                    | KIM::LENGTH_UNIT::A                                  |
"Bohr"                                 | KIM::LENGTH_UNIT::Bohr                               |
"cm"                                   | KIM::LENGTH_UNIT::cm                                 |
"m"                                    | KIM::LENGTH_UNIT::m                                  |
"nm"                                   | KIM::LENGTH_UNIT::nm                                 |
N/A                                    | KIM::LENGTH_UNIT::unused                             |
"K"                                    | KIM::TEMPERATURE_UNIT::K                             |
N/A                                    | KIM::TEMPERATURE_UNIT::unused                        |
"fs"                                   | KIM::TIME_UNIT::fs                                   |
"ps"                                   | KIM::TIME_UNIT::ps                                   |
"ns"                                   | KIM::TIME_UNIT::ns                                   |
"s"                                    | KIM::TIME_UNIT::s                                    |
N/A                                    | KIM::TIME_UNIT::unused                               |


Each of the extensible enumerations in kim-api-v2 has an interface for
discovering all of the members of the enumeration.  This is implemented using
two functions.  One provides the number of members in the enumeration, and the
other provides a copy of the \f$i\f$-th enumeration member.  (The ordering is
undefined, but guaranteed to be stable during any single run-time program
execution using the %KIM API.)  For example, the KIM::ChargeUnit enumeration has
the KIM::CHARGE_UNIT::GetNumberOfChargeUnits() and the
KIM::CHARGE_UNIT::GetChargeUnit() functions.

In addition, the KIM::ComputeArgumentName enumeration also has the
KIM::COMPUTE_ARGUMENT_NAME::GetComputeArgumentDataType() function.


Next Section: \ref porting_content_from_v1_to_v2.

*/

LocalWords:  CDDL yyyy Ellad Tadmor kim api NBCs miopbc rvec api's ref init
LocalWords:  particleContributing ModelCreate rightarrow SetCallbackPointer
LocalWords:  prerelease metadata sim reinit num params str len dEdr Edr msg
LocalWords:  getm setm numberOfParticles ModelComputeArgumentsCreate
LocalWords:  GetNumberOfParameters
