Examples

This section provides short examples of populated setApiParametersTemplate() and starting() functions, along with the dialog boxes that are created.

  1. In the apiGuiTestPlugin Parameter Editor dialog box, add a custom particle temperature as a Body Force.
    void CApiTestParticleBodyForce::setApiParametersTemplate() const
    {
    	auto* apiManager = getApiManager();
    	auto* pluginParamaterManager = apiManager->getParameterManager();
    
    	pluginParamaterManager->startGroup(NPluginParamsGroupNames::PARTICLE_PARTICLE);
    	pluginParamaterManager->addDoubleValue(-273.15, "My Special Temperature", NApi::eTemperature);
    	pluginParamaterManager->endGroup();
    }
    bool CApiTestParticleBodyForce::starting(
    	int numThreads,
    	char guiPath[NApi::GUI_FILE_MAX_LENGTH])
    {
    
    	auto* apiManager = getApiManager();
    	auto* pluginParamaterManager = apiManager->getParameterManager();
    
    	pluginParamaterManager->startGroup(NPluginParamsGroupNames::PARTICLE_PARTICLE);
    		double specialTemperature = pluginParamaterManager->getDoubleValue("My Special Temperature");
    	pluginParamaterManager->endGroup();
    
    	return true;
    }


  2. Add a custom mass for all Particle-Particle contacts.
    void CApiContactModel::setApiParametersTemplate() const
    {
    	auto* apiManager = getApiManager();
    	auto* pluginParamaterManager = apiManager->getParameterManager();
    
    	pluginParamaterManager->startGroup(NPluginParamsGroupNames::PARTICLE_PARTICLE);
    	pluginParamaterManager->addDoubleValue(5.972E24, "My Special Mass", NApi::eMass);
    	pluginParamaterManager->endGroup();
    }
    bool CApiContactModel::starting(
    	int numThreads,
    	char guiPath[NApi::GUI_FILE_MAX_LENGTH])
    {
    
    	auto* apiManager = getApiManager();
    	auto* pluginParamaterManager = apiManager->getParameterManager();
    
    	pluginParamaterManager->startGroup(NPluginParamsGroupNames::PARTICLE_PARTICLE);
    		double specialMass = pluginParamaterManager->getDoubleValue("My Special Mass");
    	pluginParamaterManager->endGroup();
    
    	return true;
    }
  3. Add a custom checkbox for enabling the output of a print statement using a Body Force.
    void CApiTestParticleBodyForce::setApiParametersTemplate() const {
    
    	auto* apiManager = getApiManager();
    	auto* pluginParamaterManager = apiManager->getParameterManager();
    
    
    	pluginParamaterManager->startGroup(NPluginParamsGroupNames::PARTICLE_BODY_FORCE);
    		pluginParamaterManager->addBoolValue(false, "True or false?");
    	pluginParamaterManager->endGroup();
    }
    bool CApiTestParticleBodyForce::starting(
    	int numThreads,
    	char guiPath[NApi::GUI_FILE_MAX_LENGTH])
    {
    	auto* apiManager = getApiManager();
    	auto* pluginParamaterManager = apiManager->getParameterManager();
    
    	pluginParamaterManager->openGroup(NPluginParamsGroupNames::PARTICLE_BODY_FORCE);
    		m_myBoolean = pluginParamaterManager->getBoolValue("True or false?");
    	pluginParamaterManager->endGroup();
    
    	return true;
    }


    ECalculateResult CApiTestParticleBodyForce::externalForce(int threadID,
    	const NExternalForceTypes::STimeStepData& timeStepData,
    	const NExternalForceTypes::SParticle& particle,
    	NApiCore::ICustomPropertyDataApi_1_0* particleCustomProperties,
    	NApiCore::ICustomPropertyDataApi_1_0* simulationCustomProperties,
    	NExternalForceTypes::SResults& results)
    {
    	if (m_myBoolean) {
    		std::printf("Checkbox is ticked");
    	}
    	return eSuccess;
    }
  4. Add a custom force for Particle-Geometry contacts, defined as a Material Interaction.
    1. Open the Particle-Geometry group, and then open the materials Interactions Group.
    2. Within that group, define a parameter called 'force' as follows:
      pluginParamaterManager->startGroup(NPluginParamsGroupNames::PARTICLE_GEOMETRY);
      	pluginParamaterManager->startGroup(NPluginParamsGroupNames::LIST_INTERACTIONS);
      		pluginParamaterManager->startGroup(NPluginParamsGroupNames::LIST_TEMPLATE);
      			pluginParamaterManager->addDoubleValue(98.0, "Force", NApi::eForce, 0.0, 1000.0);
      		pluginParamaterManager->endGroup();
      	pluginParamaterManager->endGroup();
      pluginParamaterManager->endGroup();

      In this example, the minimum (0.0) and maximum (1000.0) values are defined.

    3. Define a force for each material pair as follows:


    4. To access force values in the code, iterate over all material pairs as follows:
      pluginParamaterManager->openGroup(NPluginParamsGroupNames::PARTICLE_GEOMETRY);
      	pluginParamaterManager->openGroup(NPluginParamsGroupNames::LIST_INTERACTIONS);
      		size_t count = pluginParamaterManager->getGroupCount();
      		for (int i = 0; i < count; i++) {
      			CSimpleString materialName1;
      			CSimpleString materialName2;
      			pluginParamaterManager->openInteractionGroup(i, materialName1, materialName2);
      				double force = pluginParamaterManager->getDoubleValue("Force");
      			pluginParamaterManager->endGroup();
      			printf("The force between %s and %s is %f\n", materialName1.getString(), materialName2.getString(), force);
      		}
      	pluginParamaterManager->endGroup();
      pluginParamaterManager->endGroup();
  5. To define parameters in a table (a table is similar to a group, except that values are defined in columns):
    pluginParamaterManager->startGroup(NPluginParamsGroupNames::PARTICLE_GEOMETRY);
    	pluginParamaterManager->startTable("Tabulated Parameters");
    		pluginParamaterManager->addTableBoolColumnHeader(true, "Enabled");
    		pluginParamaterManager->addTableDoubleColumnHeader(1000, "Density", NApi::eDensity);
    		pluginParamaterManager->addTableDoubleColumnHeader(100.0, "Temperature", NApi::eTemperature);
    		pluginParamaterManager->addTableDoubleColumnHeader(1000.0e3, "Pressure", NApi::ePressure);
    	pluginParamaterManager->endTable();
    pluginParamaterManager->endGroup();
    You can add as many rows as desired.

    1. Access the parameters by iterating over rows as follows:
      pluginParamaterManager->openGroup(NPluginParamsGroupNames::PARTICLE_GEOMETRY);
      	pluginParamaterManager->openTable("Tabulated Parameters");
      		for (int i = 0; i < pluginParamaterManager->getTableRowCount(); i++) {
      			pluginParamaterManager->openTableRow(i);
      				double dense = pluginParamaterManager->getDoubleValue("Density");
      				printf("Density of row %i is %f \n", i, dense);
      			pluginParamaterManager->endTableRow();
      		}
      	pluginParamaterManager->endTable();
      pluginParamaterManager->endGroup();
    2. Define a set of default rows.
      pluginParamaterManager->startGroup(NPluginParamsGroupNames::PARTICLE_GEOMETRY);
      	pluginParamaterManager->startTable("Tabulated Parameters");
      		pluginParamaterManager->addTableBoolColumnHeader(true, "Enabled");
      		pluginParamaterManager->addTableDoubleColumnHeader(1000, "Density", NApi::eDensity);
      		pluginParamaterManager->addTableDoubleColumnHeader(100.0, "Temperature", NApi::eTemperature);
      		pluginParamaterManager->addTableDoubleColumnHeader(1000.0e3, "Pressure", NApi::ePressure);
      
      		pluginParamaterManager->startTableRow();
      			pluginParamaterManager->addBoolValue(false, "Enabled");
      			pluginParamaterManager->addDoubleValue(42, "Density");
      			pluginParamaterManager->addDoubleValue(42, "Temperature");
      			pluginParamaterManager->addDoubleValue(42, "Pressure");
      			pluginParamaterManager->endTableRow();
      	pluginParamaterManager->endTable();
      pluginParamaterManager->endGroup();
      Note: In this case, you can still edit the values of those rows but you cannot remove the rows. Therefore, a minimum number of rows is enforced.

      The row is now editable, but the icon is disabled.