This is the main class of this project. Following a nice concept, a physical model is able to represent any kind of 3D physical model that appeared, appears or will appear on earth. This include FEM meshes, spring-mass networks, phymulob etc... More...
#include <PhysicalModel.h>
Public Member Functions | |
properties general manipulation | |
const std::string | getName () const |
Return the name of the physical model. More... | |
void | setName (const std::string) |
set the name of the physical model More... | |
Properties * | getProperties () |
get all properties (beware of what you do with them!): please consider calling setModified(). More... | |
bool | isModified () |
check if something have changed More... | |
void | setModified () |
tell the physical model something has changed (for example: a property was modified/added). More... | |
export to files | |
void | xmlPrint (std::ostream &o, bool opt=false) |
print the physical model to an output stream in a XML format (see physicalmodel.xsd for detail about the XML format). More... | |
void | exportPatran (std::string filename) |
Save the geometry (atoms/cells) of this PhysicalModel in the Patran format. More... | |
void | exportAnsysMesh (std::string filename) |
Save the mesh (atoms/cells) of this PhysicalModel in the Ansys format. More... | |
constructors and destructors. | |
static const char * | VERSION |
Current PML library version. More... | |
PhysicalModel () noexcept | |
Default constructor : this one just initialize everything. More... | |
PhysicalModel (const char *fileName, PtrToSetProgressFunction pspf=nullptr) | |
instantiate a physical model object using a XML native format file This method may throw a PMLAbortException if a problem occurs. More... | |
virtual | ~PhysicalModel () |
destructor More... | |
component manipulations | |
Properties * | properties |
all physical model properties More... | |
bool | isModifiedFlag |
is the current property state modified More... | |
MultiComponent * | exclusiveComponents |
Exclusive components are the non-overlaping components : they defined all the components of the physicalModel and the physicalModel could be defined by all this components. More... | |
MultiComponent * | informativeComponents |
Informative components could be overlaping with other components : they are extra components that give information about group of cells. More... | |
StructuralComponent * | atoms |
List of all the atoms : this is the basic stuff for a physicall model. More... | |
std::GlobalIndexStructureMap | cellMap |
the association couple list, which contains the direct map between the cell's global index and the cell ptr More... | |
std::vector< Cell * > | optimizedCellList |
optimized consecutive cell vector (in here optimizedCellList[i]->getIndex() == i ) More... | |
bool | cellIndexOptimized |
tell if optimizedCellList can be used More... | |
std::GlobalIndexStructureMap | atomMap |
the association couple list, which contains the direct map between the atom's global index and the atom ptr More... | |
PtrToSetProgressFunction | setProgressFunction |
the progress function More... | |
double * | positionPtr |
the big memory space where all the atom's position are stored (it is one big block, optimizing the memory cache management). Size = 3*nrOfAtoms*sizeof(double) More... | |
unsigned int | getNumberOfExclusiveComponents () const |
get the total number of exclusive components More... | |
unsigned int | getNumberOfInformativeComponents () const |
get the total number of informative components More... | |
unsigned int | getNumberOfAtoms () const |
get the number of atoms More... | |
unsigned int | getNumberOfCells () const |
get the total nr of cell in the physical model (exclusive as well as informative) More... | |
Component * | getExclusiveComponent (const unsigned int) const |
get an exclusive component by its index in the list More... | |
void | setExclusiveComponents (MultiComponent *) |
set the exclusive multi component. Becareful: the physical model takes control of this MultiComponent More... | |
MultiComponent * | getExclusiveComponents () const |
get all the exclusive components More... | |
MultiComponent * | getInformativeComponents () const |
get all the informative components More... | |
StructuralComponent * | getAtoms () const |
get all the atoms More... | |
Component * | getInformativeComponent (const unsigned int) const |
get an informative component by its index in the list More... | |
void | setInformativeComponents (MultiComponent *) |
set the exclusive multi component. Becareful: the physical model takes control of this MultiComponent More... | |
void | setAtoms (StructuralComponent *, bool deleteOld=true) |
set the atom structural component. More... | |
bool | addAtom (Atom *) |
Add a new atom to the atoms' structural component. More... | |
Atom * | getAtom (const unsigned int id) |
Get the atom that has the global index given in parameters. More... | |
bool | addGlobalIndexAtomPair (std::GlobalIndexStructurePair) |
add or update a pair to the atom map. More... | |
bool | addGlobalIndexCellPair (std::GlobalIndexStructurePair) |
add or update a pair to the cell map. More... | |
Cell * | getCell (const unsigned int id) |
get the cell that has the global index given in parameters. More... | |
Structure * | getStructureByName (const std::string n) |
get a cell using its name More... | |
Component * | getComponentByName (const std::string n) |
get a structural or multi component by its name. More... | |
virtual void | setProgress (const float donePercentage) |
this method is called during a long process everytime a little bit of the process is finished. More... | |
virtual void | setAtomPosition (Atom *atom, const double pos[3]) |
Set the new position of an atom. More... | |
double * | getPositionPointer () const |
get the pointer to the memory space allocated for the atom's position. More... | |
double * | getPositionPointer (const unsigned int index) const |
get the pointer to the memory space allocated for atom #index's position (using global index) More... | |
double * | getPositionPointer (const Atom *a) const |
get the pointer to the memory space allocated for a given atom More... | |
void | xmlRead (const char *n) |
use the XML Parser/Reader to read an XML file conform to physicalmodel.dtd This method may throw a PMLAbortException if a problem occurs. More... | |
bool | parseTree (std::unique_ptr< physicalModel::PhysicalModel > root, std::string defaultName) |
read the xml tree and call other parse methods to build the physicalModel. More... | |
bool | parseAtoms (physicalModel::Atoms atomsRoot) |
read the atom list in the xml tree and build them. More... | |
bool | parseComponents (physicalModel::MultiComponent mcFather, Component *father, bool isExclusive) |
read the exclusive components list in the xml tree and build them. More... | |
void | clear () |
Clear everything. That allows one to restart an allready instantiated object from scratch. More... | |
void | optimizeIndexes () |
optimize atom and cell indexes so that each order number is equal to the index More... | |
void | optimizeIndexes (MultiComponent *, unsigned int *) |
optimize the indexes for a given multi component (new indexing will start using the parameter) More... | |
void | init () |
initialization method More... | |
This is the main class of this project. Following a nice concept, a physical model is able to represent any kind of 3D physical model that appeared, appears or will appear on earth. This include FEM meshes, spring-mass networks, phymulob etc...
|
noexcept |
Default constructor : this one just initialize everything.
Structures and atoms are empty.
References init().
PhysicalModel::PhysicalModel | ( | const char * | fileName, |
PtrToSetProgressFunction | pspf = nullptr |
||
) |
instantiate a physical model object using a XML native format file This method may throw a PMLAbortException if a problem occurs.
fileName | the name of the xml file to use |
pspf | is a pointer to the method that will be called by the setProgress(...) method (default = NULL) |
References init(), setProgressFunction, and xmlRead().
|
virtual |
bool PhysicalModel::addAtom | ( | Atom * | newA | ) |
Add a new atom to the atoms' structural component.
It does add the atom only if it has a unique index, otherwise nothing is done. (if index is correct, then it also call the addGlobalIndexAtomPair method).
References addGlobalIndexAtomPair(), StructuralComponent::addStructure(), atoms, and Structure::getIndex().
bool PhysicalModel::addGlobalIndexAtomPair | ( | std::GlobalIndexStructurePair | p | ) |
add or update a pair to the atom map.
It does nothing if the atom already exist in the map
References atomMap.
Referenced by addAtom(), setAtoms(), and Atom::setIndex().
bool PhysicalModel::addGlobalIndexCellPair | ( | std::GlobalIndexStructurePair | p | ) |
add or update a pair to the cell map.
It does nothing if the cell already exist in the map
References cellIndexOptimized, cellMap, and optimizedCellList.
Referenced by parseComponents(), and Cell::setIndex().
|
private |
Clear everything. That allows one to restart an allready instantiated object from scratch.
References atomMap, atoms, cellMap, exclusiveComponents, informativeComponents, positionPtr, properties, CellProperties::resetUniqueIndex(), and AtomProperties::resetUniqueIndex().
Referenced by xmlRead(), and ~PhysicalModel().
void PhysicalModel::exportAnsysMesh | ( | std::string | filename | ) |
Save the mesh (atoms/cells) of this PhysicalModel in the Ansys format.
//@@ This method is useful only for a FEM (?) mesh. Maybe it's better to put it in a femPM class that inherits PhysicalModel???
References atoms, Component::getCell(), getComponentByName(), Structure::getIndex(), getNumberOfAtoms(), Component::getNumberOfCells(), StructuralComponent::getNumberOfStructures(), Atom::getPosition(), StructuralComponent::getStructure(), Structure::getType(), StructureProperties::HEXAHEDRON, StructureProperties::QUAD, StructureProperties::TETRAHEDRON, and StructureProperties::WEDGE.
Referenced by ArtisynthSimulator::runArtisynth(), and PrepWriter::write().
void PhysicalModel::exportPatran | ( | std::string | filename | ) |
Save the geometry (atoms/cells) of this PhysicalModel in the Patran format.
%%% This method is useful only for a FEM (?) mesh. Maybe it's better to put it in a femPM class that inherits PhysicalModel???
References getAtom(), Component::getCell(), getExclusiveComponent(), Structure::getIndex(), getName(), getNumberOfAtoms(), Component::getNumberOfCells(), StructuralComponent::getNumberOfStructures(), Atom::getPosition(), StructuralComponent::getStructure(), Structure::getType(), StructureProperties::HEXAHEDRON, and StructureProperties::WEDGE.
|
inline |
Get the atom that has the global index given in parameters.
The global index of an atom is the index stored as its property. This is different from its rank in the atoms list as Physical Model do not nessecarily have consecutive indexes starting at 0.
Therefore:
id | the atom index in the physical model |
References atomMap, atoms, Structure::getIndex(), and StructuralComponent::getStructure().
Referenced by AtomIterator::AtomIterator(), MonitorNormDisplacement::calculate(), MonitorDisplacement::calculate(), MonitorRen::calculate(), Cell::Cell(), CreateSC::computeBoundsOfPointIds(), SofaSimulator::createPml(), exportPatran(), SurfaceExtractor::generateExternalSurface(), Facet::getCell(), parseComponents(), PMLComponentExtension::save(), GenerateModel::saveMMLFiles(), Colors::update(), Arrows::update(), and Simulator::updatePositions().
|
inline |
get all the atoms
References atoms.
Referenced by CreateSC::apply(), getComponentByName(), Position::Position(), SofaSimulator::SofaSimulator(), Simulator::updatePositions(), and Atom::xmlPrint().
|
inline |
get the cell that has the global index given in parameters.
id | the cell index in the physical model |
References cellIndexOptimized, cellMap, and optimizedCellList.
Referenced by CreateSC::computeBoundsOfCellIds().
Component * PhysicalModel::getComponentByName | ( | const std::string | n | ) |
get a structural or multi component by its name.
Becareful: this method never returns a cell (only a structural component or a multiple component. To get a cell, use getStructureByName(..)
References exclusiveComponents, getAtoms(), MultiComponent::getComponentByName(), getName(), and informativeComponents.
Referenced by AtomIterator::AtomIterator(), MonitorVolume::calculate(), MonitorForce::calculate(), MonitorSurface::calculate(), exportAnsysMesh(), CreateSC::getWidget(), and SofaSimulator::SofaSimulator().
Component * PhysicalModel::getExclusiveComponent | ( | const unsigned int | i | ) | const |
get an exclusive component by its index in the list
References exclusiveComponents, and MultiComponent::getSubComponent().
Referenced by exportPatran().
|
inline |
get all the exclusive components
References exclusiveComponents.
Referenced by ParametersWriter::write().
Component * PhysicalModel::getInformativeComponent | ( | const unsigned int | i | ) | const |
get an informative component by its index in the list
References MultiComponent::getSubComponent(), and informativeComponents.
|
inline |
get all the informative components
References informativeComponents.
Referenced by CreateSC::apply(), PMLComponentExtension::save(), and GenerateModel::saveMMLFiles().
|
inline |
Return the name of the physical model.
References Properties::getName(), and properties.
Referenced by exportPatran(), getComponentByName(), and xmlPrint().
unsigned int PhysicalModel::getNumberOfAtoms | ( | ) | const |
get the number of atoms
References atoms, and StructuralComponent::getNumberOfStructures().
Referenced by exportAnsysMesh(), exportPatran(), SofaSimulator::SofaSimulator(), Arrows::update(), and Colors::update().
unsigned int PhysicalModel::getNumberOfCells | ( | ) | const |
get the total nr of cell in the physical model (exclusive as well as informative)
References exclusiveComponents, MultiComponent::getNumberOfCells(), and informativeComponents.
Referenced by xmlPrint().
unsigned int PhysicalModel::getNumberOfExclusiveComponents | ( | ) | const |
get the total number of exclusive components
References exclusiveComponents, and MultiComponent::getNumberOfSubComponents().
unsigned int PhysicalModel::getNumberOfInformativeComponents | ( | ) | const |
get the total number of informative components
References MultiComponent::getNumberOfSubComponents(), and informativeComponents.
double * PhysicalModel::getPositionPointer | ( | ) | const |
get the pointer to the memory space allocated for the atom's position.
The memory is a big block of size getNumberOfAtoms()*3*sizeof(double). The atom positions are stored in the same order as in the atoms structural component
References positionPtr.
double * PhysicalModel::getPositionPointer | ( | const Atom * | a | ) | const |
get the pointer to the memory space allocated for a given atom
References a, atoms, StructuralComponent::getStructure(), and positionPtr.
double * PhysicalModel::getPositionPointer | ( | const unsigned int | index | ) | const |
get the pointer to the memory space allocated for atom #index's position (using global index)
References a, atoms, StructuralComponent::getStructure(), and positionPtr.
|
inline |
get all properties (beware of what you do with them!): please consider calling setModified().
When you modify/add a property (or the physical model or any component/structure), you should always call setModified() in order to specify that something has changed.
References properties.
|
inline |
|
private |
initialization method
References atoms, cellIndexOptimized, exclusiveComponents, informativeComponents, isModifiedFlag, positionPtr, properties, and setProgressFunction.
Referenced by PhysicalModel().
|
inline |
check if something have changed
References isModifiedFlag.
|
private |
optimize atom and cell indexes so that each order number is equal to the index
References atoms, exclusiveComponents, StructuralComponent::getNumberOfStructures(), StructuralComponent::getStructure(), and informativeComponents.
Referenced by optimizeIndexes(), and xmlPrint().
|
private |
optimize the indexes for a given multi component (new indexing will start using the parameter)
References StructuralComponent::getNumberOfStructures(), MultiComponent::getNumberOfSubComponents(), StructuralComponent::getStructure(), MultiComponent::getSubComponent(), Structure::isInstanceOf(), Component::isInstanceOf(), Cell::makePrintData(), optimizeIndexes(), and Cell::setIndex().
|
private |
read the atom list in the xml tree and build them.
References StructuralComponent::addStructure(), atoms, StructuralComponent::plannedNumberOfStructures(), and setAtoms().
Referenced by parseTree().
|
private |
read the exclusive components list in the xml tree and build them.
References a, addGlobalIndexCellPair(), StructuralComponent::addStructure(), cellIndexOptimized, getAtom(), Structure::getIndex(), Component::setExclusive(), and Component::setName().
Referenced by parseTree().
|
private |
read the xml tree and call other parse methods to build the physicalModel.
References a, atoms, StructuralComponent::getNumberOfStructures(), StructuralComponent::getStructure(), parseAtoms(), parseComponents(), positionPtr, properties, setExclusiveComponents(), setInformativeComponents(), and Properties::xmlToFields().
Referenced by xmlRead().
|
virtual |
Set the new position of an atom.
References Atom::setPosition().
void PhysicalModel::setAtoms | ( | StructuralComponent * | sc, |
bool | deleteOld = true |
||
) |
set the atom structural component.
Becareful: the physical model takes control of this structural component
sc | the new atom structural component |
deleteOld | if true, then the old atoms SC is delete (thus deleting its atoms as well) |
References a, addGlobalIndexAtomPair(), StructuralComponent::ATOMS, atoms, StructuralComponent::composedBy(), StructuralComponent::getNumberOfStructures(), and StructuralComponent::getStructure().
Referenced by SofaSimulator::createPml(), parseAtoms(), and PMLComponentExtension::save().
void PhysicalModel::setExclusiveComponents | ( | MultiComponent * | mc | ) |
set the exclusive multi component. Becareful: the physical model takes control of this MultiComponent
References exclusiveComponents, and MultiComponent::setPhysicalModel().
Referenced by SofaSimulator::createPml(), parseTree(), and PMLComponentExtension::save().
void PhysicalModel::setInformativeComponents | ( | MultiComponent * | mc | ) |
set the exclusive multi component. Becareful: the physical model takes control of this MultiComponent
References informativeComponents, and MultiComponent::setPhysicalModel().
Referenced by CreateSC::apply(), SofaSimulator::createPml(), parseTree(), and PMLComponentExtension::save().
|
inline |
tell the physical model something has changed (for example: a property was modified/added).
This can be useful to check if something has changed since the PhysicalModel was created.
References isModifiedFlag.
|
inline |
set the name of the physical model
References properties, and Properties::setName().
Referenced by SofaSimulator::createPml().
|
virtual |
this method is called during a long process everytime a little bit of the process is finished.
This method should be overloaded by the subclass to give a mean to produce a progress bar or equivalent gui/hmi stuff.
donePercentage | the percentage (between 0 and 100) of the work already done |
References setProgressFunction.
void PhysicalModel::xmlPrint | ( | std::ostream & | o, |
bool | opt = false |
||
) |
print the physical model to an output stream in a XML format (see physicalmodel.xsd for detail about the XML format).
By default the output is not optimized (optimized = faster loading). In order to optimize, the cell and atom indexes are renumbered to be consecutive, so access to celli or atomi is done in linear time. There are many reasons why you would not want to optimize the output, e.g. if you have a specific cell numbering that you are using somewhere else, in a different software or so.
o | the ostream to write to |
opt | a boolean indicating if yes or no you want the pm to optimize the output |
References atoms, cellIndexOptimized, exclusiveComponents, Properties::getField(), getName(), getNumberOfCells(), StructuralComponent::getNumberOfStructures(), MultiComponent::getNumberOfSubComponents(), Properties::getString(), informativeComponents, isModifiedFlag, Properties::numberOfFields(), optimizeIndexes(), properties, MultiComponent::xmlPrint(), and StructuralComponent::xmlPrint().
Referenced by SofaSimulator::createPml(), PMLComponentExtension::save(), and GenerateModel::saveMMLFiles().
|
private |
use the XML Parser/Reader to read an XML file conform to physicalmodel.dtd This method may throw a PMLAbortException if a problem occurs.
n | the name of the XML file |
References clear(), camitk::Initialize(), and parseTree().
Referenced by PhysicalModel().
|
private |
the association couple list, which contains the direct map between the atom's global index and the atom ptr
Referenced by addGlobalIndexAtomPair(), clear(), getAtom(), and getStructureByName().
|
private |
List of all the atoms : this is the basic stuff for a physicall model.
The smallest entity here
Referenced by addAtom(), clear(), exportAnsysMesh(), getAtom(), getAtoms(), getNumberOfAtoms(), getPositionPointer(), init(), optimizeIndexes(), parseAtoms(), parseTree(), setAtoms(), and xmlPrint().
|
private |
tell if optimizedCellList can be used
Referenced by addGlobalIndexCellPair(), getCell(), init(), parseComponents(), and xmlPrint().
|
private |
the association couple list, which contains the direct map between the cell's global index and the cell ptr
Referenced by addGlobalIndexCellPair(), clear(), getCell(), and getStructureByName().
|
private |
Exclusive components are the non-overlaping components : they defined all the components of the physicalModel and the physicalModel could be defined by all this components.
exclusiveComponents could only contains StructuralComponents...
Referenced by clear(), getComponentByName(), getExclusiveComponent(), getExclusiveComponents(), getNumberOfCells(), getNumberOfExclusiveComponents(), init(), optimizeIndexes(), setExclusiveComponents(), and xmlPrint().
|
private |
Informative components could be overlaping with other components : they are extra components that give information about group of cells.
This components are not mandatory.
Referenced by clear(), getComponentByName(), getInformativeComponent(), getInformativeComponents(), getNumberOfCells(), getNumberOfInformativeComponents(), init(), optimizeIndexes(), setInformativeComponents(), and xmlPrint().
|
private |
is the current property state modified
Referenced by init(), isModified(), setModified(), and xmlPrint().
|
private |
optimized consecutive cell vector (in here optimizedCellList[i]->getIndex() == i
)
Referenced by addGlobalIndexCellPair(), and getCell().
|
private |
the big memory space where all the atom's position are stored (it is one big block, optimizing the memory cache management). Size = 3*nrOfAtoms*sizeof(double)
Referenced by clear(), getPositionPointer(), init(), and parseTree().
|
private |
all physical model properties
Referenced by clear(), getName(), getProperties(), init(), parseTree(), setName(), and xmlPrint().
|
private |
the progress function
Referenced by init(), PhysicalModel(), and setProgress().
|
static |
Current PML library version.