Skip to content

BDFOdeSolver

Velocity-based ODE solver using Backward Differentiation Formula (BDF), at any order, supporting variable time step size.

Target: Sofa.Component.ODESolver.Backward

namespace: sofa::component::odesolver::backward

parents:

  • BaseLinearMultiStepMethod

Data

Name Description Default value
name object name unnamed
printLog if true, emits extra messages at runtime. 0
tags list of the subsets the object belongs to
bbox this object bounding box
componentState The state of the component among (Dirty, Valid, Undefined, Loading, Invalid). Undefined
listening if true, handle the events, otherwise ignore the events 0
order Order of the numerical method 1
rayleighStiffness Rayleigh damping coefficient related to stiffness, > 0 0
rayleighMass Rayleigh damping coefficient related to mass, > 0 0
Name Description Destination type name
context Graph Node containing this object (or BaseContext::getDefault() if no graph is used) BaseContext
slaves Sub-objects used internally by this object BaseObject
master nullptr for regular objects, or master object for which this object is one sub-objects BaseObject
linearSolver Linear solver used by this component LinearSolver
newtonSolver Link to a Newton-Raphson solver to solve the nonlinear equation produced by this numerical method NewtonRaphsonSolver

Examples

BDFOdeSolver.scn

<Node name="root" gravity="-1.8 0 100" dt="0.01">

    <Node name="plugins">
        <RequiredPlugin name="Sofa.Component.Constraint.Projective"/> <!-- Needed to use components [FixedProjectiveConstraint] -->
        <RequiredPlugin name="Sofa.Component.Engine.Select"/> <!-- Needed to use components [BoxROI] -->
        <RequiredPlugin name="Sofa.Component.IO.Mesh"/> <!-- Needed to use components [MeshGmshLoader,MeshOBJLoader] -->
        <RequiredPlugin name="Sofa.Component.LinearSolver.Direct"/> <!-- Needed to use components [EigenSimplicialLDLT] -->
        <RequiredPlugin name="Sofa.Component.LinearSystem"/> <!-- Needed to use components [ConstantSparsityPatternSystem] -->
        <RequiredPlugin name="Sofa.Component.Mapping.Linear"/> <!-- Needed to use components [BarycentricMapping] -->
        <RequiredPlugin name="Sofa.Component.Mass"/> <!-- Needed to use components [MeshMatrixMass] -->
        <RequiredPlugin name="Sofa.Component.ODESolver.Backward"/> <!-- Needed to use components [BDFOdeSolver,NewtonRaphsonSolver] -->
        <RequiredPlugin name="Sofa.Component.SolidMechanics.FEM.HyperElastic"/> <!-- Needed to use components [TetrahedronHyperelasticityFEMForceField] -->
        <RequiredPlugin name="Sofa.Component.StateContainer"/> <!-- Needed to use components [MechanicalObject] -->
        <RequiredPlugin name="Sofa.Component.Topology.Container.Dynamic"/> <!-- Needed to use components [TetrahedronSetGeometryAlgorithms,TetrahedronSetTopologyContainer] -->
        <RequiredPlugin name="Sofa.Component.Visual"/> <!-- Needed to use components [VisualStyle] -->
        <RequiredPlugin name="Sofa.GL.Component.Rendering3D"/> <!-- Needed to use components [OglModel] -->
    </Node>

    <VisualStyle displayFlags="showWireframe showVisual showBehaviorModels hideForceFields" />
    <DefaultAnimationLoop parallelODESolving="false"/>

    <Node name="DeformableObject">

        <BDFOdeSolver order="2" printLog="false" rayleighMass="0.01" rayleighStiffness="0.01"/>
        <NewtonRaphsonSolver name="newton" printLog="false"
                             maxNbIterationsNewton="10" absoluteResidualStoppingThreshold="1e-5"
                             maxNbIterationsLineSearch="5" lineSearchCoefficient="0.5"
                             relativeInitialStoppingThreshold="1e-3"
                             absoluteEstimateDifferenceThreshold="1e-5"
                             relativeEstimateDifferenceThreshold="1e-5"/>
        <ConstantSparsityPatternSystem template="CompressedRowSparseMatrix" name="A" checkIndices="false"/>
        <PCGLinearSolver name="PCG" iterations="1000" preconditioner="@preconditioner"/>
        <AsyncSparseLDLSolver name="preconditioner"/>

        <MeshGmshLoader name="loader" filename="mesh/truthcylinder1.msh" />
        <TetrahedronSetTopologyContainer src="@loader" name="topologyContainer"/>
        <TetrahedronSetGeometryAlgorithms name="geomAlgo"/>
        <MechanicalObject src="@loader" />
        <MeshMatrixMass totalMass="15" topology="@topologyContainer"/>

        <BoxROI name="box" box="-10 -20 -10  10 -17.5 10" drawBoxes="true"/>
        <FixedProjectiveConstraint indices="@box.indices" />
        <TetrahedronHyperelasticityFEMForceField name="FEM" ParameterSet="3448.2759 31034.483" materialName="StVenantKirchhoff"/>

        <Node name="visual">
            <MeshOBJLoader name="meshLoader_0" filename="mesh/truthcylinder1.obj" handleSeams="1" />
            <OglModel name="Visual" src="@meshLoader_0" color="red" />
            <BarycentricMapping input="@.." output="@Visual" />
        </Node>
    </Node>

</Node>
def createScene(root_node):

   root = root_node.addChild('root', gravity="-1.8 0 100", dt="0.01")

   plugins = root.addChild('plugins')

   plugins.addObject('RequiredPlugin', name="Sofa.Component.Constraint.Projective")
   plugins.addObject('RequiredPlugin', name="Sofa.Component.Engine.Select")
   plugins.addObject('RequiredPlugin', name="Sofa.Component.IO.Mesh")
   plugins.addObject('RequiredPlugin', name="Sofa.Component.LinearSolver.Direct")
   plugins.addObject('RequiredPlugin', name="Sofa.Component.LinearSystem")
   plugins.addObject('RequiredPlugin', name="Sofa.Component.Mapping.Linear")
   plugins.addObject('RequiredPlugin', name="Sofa.Component.Mass")
   plugins.addObject('RequiredPlugin', name="Sofa.Component.ODESolver.Backward")
   plugins.addObject('RequiredPlugin', name="Sofa.Component.SolidMechanics.FEM.HyperElastic")
   plugins.addObject('RequiredPlugin', name="Sofa.Component.StateContainer")
   plugins.addObject('RequiredPlugin', name="Sofa.Component.Topology.Container.Dynamic")
   plugins.addObject('RequiredPlugin', name="Sofa.Component.Visual")
   plugins.addObject('RequiredPlugin', name="Sofa.GL.Component.Rendering3D")

   root.addObject('VisualStyle', displayFlags="showWireframe showVisual showBehaviorModels hideForceFields")
   root.addObject('DefaultAnimationLoop', parallelODESolving="false")

   deformable_object = root.addChild('DeformableObject')

   deformable_object.addObject('BDFOdeSolver', order="2", printLog="false", rayleighMass="0.01", rayleighStiffness="0.01")
   deformable_object.addObject('NewtonRaphsonSolver', name="newton", printLog="false", maxNbIterationsNewton="10", absoluteResidualStoppingThreshold="1e-5", maxNbIterationsLineSearch="5", lineSearchCoefficient="0.5", relativeInitialStoppingThreshold="1e-3", absoluteEstimateDifferenceThreshold="1e-5", relativeEstimateDifferenceThreshold="1e-5")
   deformable_object.addObject('ConstantSparsityPatternSystem', template="CompressedRowSparseMatrix", name="A", checkIndices="false")
   deformable_object.addObject('PCGLinearSolver', name="PCG", iterations="1000", preconditioner="@preconditioner")
   deformable_object.addObject('AsyncSparseLDLSolver', name="preconditioner")
   deformable_object.addObject('MeshGmshLoader', name="loader", filename="mesh/truthcylinder1.msh")
   deformable_object.addObject('TetrahedronSetTopologyContainer', src="@loader", name="topologyContainer")
   deformable_object.addObject('TetrahedronSetGeometryAlgorithms', name="geomAlgo")
   deformable_object.addObject('MechanicalObject', src="@loader")
   deformable_object.addObject('MeshMatrixMass', totalMass="15", topology="@topologyContainer")
   deformable_object.addObject('BoxROI', name="box", box="-10 -20 -10  10 -17.5 10", drawBoxes="true")
   deformable_object.addObject('FixedProjectiveConstraint', indices="@box.indices")
   deformable_object.addObject('TetrahedronHyperelasticityFEMForceField', name="FEM", ParameterSet="3448.2759 31034.483", materialName="StVenantKirchhoff")

   visual = DeformableObject.addChild('visual')

   visual.addObject('MeshOBJLoader', name="meshLoader_0", filename="mesh/truthcylinder1.obj", handleSeams="1")
   visual.addObject('OglModel', name="Visual", src="@meshLoader_0", color="red")
   visual.addObject('BarycentricMapping', input="@..", output="@Visual")

BDFOdeSolver_spring1d.scn

<Node name="root" gravity="-9.81 0 0" dt="0.01">
    <RequiredPlugin name="Sofa.Component.Constraint.Projective"/> <!-- Needed to use components [FixedProjectiveConstraint] -->
    <RequiredPlugin name="Sofa.Component.LinearSolver.Direct"/> <!-- Needed to use components [EigenSimplicialLDLT] -->
    <RequiredPlugin name="Sofa.Component.Mass"/> <!-- Needed to use components [MeshMatrixMass] -->
    <RequiredPlugin name="Sofa.Component.ODESolver.Backward"/> <!-- Needed to use components [NewtonRaphsonSolver] -->
    <RequiredPlugin name="Sofa.Component.ODESolver.Integration"/> <!-- Needed to use components [BDF1] -->
    <RequiredPlugin name="Sofa.Component.SolidMechanics.Spring"/> <!-- Needed to use components [SpringForceField] -->
    <RequiredPlugin name="Sofa.Component.StateContainer"/> <!-- Needed to use components [MechanicalObject] -->
    <RequiredPlugin name="Sofa.Component.Visual"/> <!-- Needed to use components [VisualStyle] -->
    <RequiredPlugin name="Sofa.GL.Component.Rendering3D"/> <!-- Needed to use components [OglCylinderModel] -->
    <RequiredPlugin name="Sofa.Component.Topology.Container.Dynamic"/> <!-- Needed to use components [EdgeSetTopologyContainer] -->

    <VisualStyle displayFlags="showWireframe showVisual showBehaviorModels showForceFields" />
    <DefaultAnimationLoop/>
    <VisualGrid size="2"/>
    <LineAxis size="2"/>

    <Node name="BDF-1">

        <BDFOdeSolver order="1" printLog="false" rayleighMass="0.01" rayleighStiffness="0.01"/>
        <NewtonRaphsonSolver name="newton" printLog="false" maxNbIterationsNewton="4" maxNbIterationsLineSearch="2" absoluteResidualStoppingThreshold="1e-6"/>
        <EigenSimplicialLDLT template="CompressedRowSparseMatrix"/>

        <MechanicalObject name="dofs" template="Vec1" position="1 " rest_position="0" showObject="true" showObjectScale="20"/>
        <PointSetTopologyContainer name="topologyContainer" position="1"/>
        <UniformMass totalMass="1" topology="@topologyContainer"/>
        <RestShapeSpringsForceField points="0"/>
    </Node>

    <Node name="BDF-2">

        <BDFOdeSolver order="2" printLog="false" rayleighMass="0.01" rayleighStiffness="0.01"/>
        <NewtonRaphsonSolver name="newton" printLog="false" maxNbIterationsNewton="4" maxNbIterationsLineSearch="2" absoluteResidualStoppingThreshold="1e-6"/>
        <EigenSimplicialLDLT template="CompressedRowSparseMatrix"/>

        <MechanicalObject name="dofs" template="Vec1" position="1 " rest_position="0" showObject="true" showObjectScale="20"/>
        <PointSetTopologyContainer name="topologyContainer" position="1"/>
        <UniformMass totalMass="1" topology="@topologyContainer"/>
        <RestShapeSpringsForceField points="0"/>
    </Node>

    <Node name="BDF-3">

        <BDFOdeSolver order="3" printLog="false" rayleighMass="0.01" rayleighStiffness="0.01"/>
        <NewtonRaphsonSolver name="newton" printLog="false" maxNbIterationsNewton="4" maxNbIterationsLineSearch="2" absoluteResidualStoppingThreshold="1e-6"/>
        <EigenSimplicialLDLT template="CompressedRowSparseMatrix"/>

        <MechanicalObject name="dofs" template="Vec1" position="1 " rest_position="0" showObject="true" showObjectScale="20"/>
        <PointSetTopologyContainer name="topologyContainer" position="1"/>
        <UniformMass totalMass="1" topology="@topologyContainer"/>
        <RestShapeSpringsForceField points="0"/>
    </Node>

</Node>
def createScene(root_node):

   root = root_node.addChild('root', gravity="-9.81 0 0", dt="0.01")

   root.addObject('RequiredPlugin', name="Sofa.Component.Constraint.Projective")
   root.addObject('RequiredPlugin', name="Sofa.Component.LinearSolver.Direct")
   root.addObject('RequiredPlugin', name="Sofa.Component.Mass")
   root.addObject('RequiredPlugin', name="Sofa.Component.ODESolver.Backward")
   root.addObject('RequiredPlugin', name="Sofa.Component.ODESolver.Integration")
   root.addObject('RequiredPlugin', name="Sofa.Component.SolidMechanics.Spring")
   root.addObject('RequiredPlugin', name="Sofa.Component.StateContainer")
   root.addObject('RequiredPlugin', name="Sofa.Component.Visual")
   root.addObject('RequiredPlugin', name="Sofa.GL.Component.Rendering3D")
   root.addObject('RequiredPlugin', name="Sofa.Component.Topology.Container.Dynamic")
   root.addObject('VisualStyle', displayFlags="showWireframe showVisual showBehaviorModels showForceFields")
   root.addObject('DefaultAnimationLoop', )
   root.addObject('VisualGrid', size="2")
   root.addObject('LineAxis', size="2")

   bdf_1 = root.addChild('BDF-1')

   bdf_1.addObject('BDFOdeSolver', order="1", printLog="false", rayleighMass="0.01", rayleighStiffness="0.01")
   bdf_1.addObject('NewtonRaphsonSolver', name="newton", printLog="false", maxNbIterationsNewton="4", maxNbIterationsLineSearch="2", absoluteResidualStoppingThreshold="1e-6")
   bdf_1.addObject('EigenSimplicialLDLT', template="CompressedRowSparseMatrix")
   bdf_1.addObject('MechanicalObject', name="dofs", template="Vec1", position="1 ", rest_position="0", showObject="true", showObjectScale="20")
   bdf_1.addObject('PointSetTopologyContainer', name="topologyContainer", position="1")
   bdf_1.addObject('UniformMass', totalMass="1", topology="@topologyContainer")
   bdf_1.addObject('RestShapeSpringsForceField', points="0")

   bdf_2 = root.addChild('BDF-2')

   bdf_2.addObject('BDFOdeSolver', order="2", printLog="false", rayleighMass="0.01", rayleighStiffness="0.01")
   bdf_2.addObject('NewtonRaphsonSolver', name="newton", printLog="false", maxNbIterationsNewton="4", maxNbIterationsLineSearch="2", absoluteResidualStoppingThreshold="1e-6")
   bdf_2.addObject('EigenSimplicialLDLT', template="CompressedRowSparseMatrix")
   bdf_2.addObject('MechanicalObject', name="dofs", template="Vec1", position="1 ", rest_position="0", showObject="true", showObjectScale="20")
   bdf_2.addObject('PointSetTopologyContainer', name="topologyContainer", position="1")
   bdf_2.addObject('UniformMass', totalMass="1", topology="@topologyContainer")
   bdf_2.addObject('RestShapeSpringsForceField', points="0")

   bdf_3 = root.addChild('BDF-3')

   bdf_3.addObject('BDFOdeSolver', order="3", printLog="false", rayleighMass="0.01", rayleighStiffness="0.01")
   bdf_3.addObject('NewtonRaphsonSolver', name="newton", printLog="false", maxNbIterationsNewton="4", maxNbIterationsLineSearch="2", absoluteResidualStoppingThreshold="1e-6")
   bdf_3.addObject('EigenSimplicialLDLT', template="CompressedRowSparseMatrix")
   bdf_3.addObject('MechanicalObject', name="dofs", template="Vec1", position="1 ", rest_position="0", showObject="true", showObjectScale="20")
   bdf_3.addObject('PointSetTopologyContainer', name="topologyContainer", position="1")
   bdf_3.addObject('UniformMass', totalMass="1", topology="@topologyContainer")
   bdf_3.addObject('RestShapeSpringsForceField', points="0")

BDFOdeSolver_spring3d.scn

<Node name="root" gravity="0 -9.81 0" dt="0.01">

    <Node name="plugins">
        <RequiredPlugin name="Sofa.Component.Constraint.Projective"/> <!-- Needed to use components [FixedProjectiveConstraint] -->
        <RequiredPlugin name="Sofa.Component.LinearSolver.Direct"/> <!-- Needed to use components [EigenSimplicialLDLT] -->
        <RequiredPlugin name="Sofa.Component.Mass"/> <!-- Needed to use components [UniformMass] -->
        <RequiredPlugin name="Sofa.Component.ODESolver.Backward"/> <!-- Needed to use components [BDFOdeSolver,NewtonRaphsonSolver] -->
        <RequiredPlugin name="Sofa.Component.SolidMechanics.Spring"/> <!-- Needed to use components [SpringForceField] -->
        <RequiredPlugin name="Sofa.Component.StateContainer"/> <!-- Needed to use components [MechanicalObject] -->
        <RequiredPlugin name="Sofa.Component.Topology.Container.Dynamic"/> <!-- Needed to use components [EdgeSetTopologyContainer] -->
        <RequiredPlugin name="Sofa.Component.Visual"/> <!-- Needed to use components [LineAxis,VisualGrid,VisualStyle] -->
    </Node>

    <VisualStyle displayFlags="showWireframe showVisual showBehaviorModels showForceFields" />
    <DefaultAnimationLoop/>
    <VisualGrid size="2"/>
    <LineAxis size="2"/>

    <Node name="BDF-1">

        <BDFOdeSolver order="1" printLog="false" rayleighMass="0.01" rayleighStiffness="0.01"/>
        <NewtonRaphsonSolver name="newton" printLog="false" maxNbIterationsNewton="4" maxNbIterationsLineSearch="2" absoluteResidualStoppingThreshold="1e-6"/>
        <EigenSimplicialLDLT template="CompressedRowSparseMatrix"/>

        <MechanicalObject name="dofs" template="Vec3" position="0 0 0  1 1 0 " showObject="true" showObjectScale="20"/>
        <EdgeSetTopologyContainer name="topologyContainer" edges="0 1" position="@dofs.position"/>
        <UniformMass totalMass="15" topology="@topologyContainer"/>
        <SpringForceField spring="0 1 1000 0 1"/>
        <FixedProjectiveConstraint indices="0" />

    </Node>

    <Node name="BDF-2">

        <BDFOdeSolver order="2" printLog="false" rayleighMass="0.01" rayleighStiffness="0.01"/>
        <NewtonRaphsonSolver name="newton" printLog="false" maxNbIterationsNewton="4" maxNbIterationsLineSearch="2" absoluteResidualStoppingThreshold="1e-6"/>
        <EigenSimplicialLDLT template="CompressedRowSparseMatrix"/>

        <MechanicalObject name="dofs" template="Vec3" position="0 0 0  1 1 0 " showObject="true" showObjectScale="20"/>
        <EdgeSetTopologyContainer name="topologyContainer" edges="0 1" position="@dofs.position"/>
        <UniformMass totalMass="15" topology="@topologyContainer"/>
        <SpringForceField spring="0 1 1000 0 1"/>
        <FixedProjectiveConstraint indices="0" />

    </Node>

    <Node name="BDF-3">

        <BDFOdeSolver order="3" printLog="false" rayleighMass="0.01" rayleighStiffness="0.01"/>
        <NewtonRaphsonSolver name="newton" printLog="false" maxNbIterationsNewton="4" maxNbIterationsLineSearch="2" absoluteResidualStoppingThreshold="1e-6"/>
        <EigenSimplicialLDLT template="CompressedRowSparseMatrix"/>

        <MechanicalObject name="dofs" template="Vec3" position="0 0 0  1 1 0 " showObject="true" showObjectScale="20"/>
        <EdgeSetTopologyContainer name="topologyContainer" edges="0 1" position="@dofs.position"/>
        <UniformMass totalMass="15" topology="@topologyContainer"/>
        <SpringForceField spring="0 1 1000 0 1"/>
        <FixedProjectiveConstraint indices="0" />

    </Node>
</Node>
def createScene(root_node):

   root = root_node.addChild('root', gravity="0 -9.81 0", dt="0.01")

   plugins = root.addChild('plugins')

   plugins.addObject('RequiredPlugin', name="Sofa.Component.Constraint.Projective")
   plugins.addObject('RequiredPlugin', name="Sofa.Component.LinearSolver.Direct")
   plugins.addObject('RequiredPlugin', name="Sofa.Component.Mass")
   plugins.addObject('RequiredPlugin', name="Sofa.Component.ODESolver.Backward")
   plugins.addObject('RequiredPlugin', name="Sofa.Component.SolidMechanics.Spring")
   plugins.addObject('RequiredPlugin', name="Sofa.Component.StateContainer")
   plugins.addObject('RequiredPlugin', name="Sofa.Component.Topology.Container.Dynamic")
   plugins.addObject('RequiredPlugin', name="Sofa.Component.Visual")

   root.addObject('VisualStyle', displayFlags="showWireframe showVisual showBehaviorModels showForceFields")
   root.addObject('DefaultAnimationLoop', )
   root.addObject('VisualGrid', size="2")
   root.addObject('LineAxis', size="2")

   bdf_1 = root.addChild('BDF-1')

   bdf_1.addObject('BDFOdeSolver', order="1", printLog="false", rayleighMass="0.01", rayleighStiffness="0.01")
   bdf_1.addObject('NewtonRaphsonSolver', name="newton", printLog="false", maxNbIterationsNewton="4", maxNbIterationsLineSearch="2", absoluteResidualStoppingThreshold="1e-6")
   bdf_1.addObject('EigenSimplicialLDLT', template="CompressedRowSparseMatrix")
   bdf_1.addObject('MechanicalObject', name="dofs", template="Vec3", position="0 0 0  1 1 0 ", showObject="true", showObjectScale="20")
   bdf_1.addObject('EdgeSetTopologyContainer', name="topologyContainer", edges="0 1", position="@dofs.position")
   bdf_1.addObject('UniformMass', totalMass="15", topology="@topologyContainer")
   bdf_1.addObject('SpringForceField', spring="0 1 1000 0 1")
   bdf_1.addObject('FixedProjectiveConstraint', indices="0")

   bdf_2 = root.addChild('BDF-2')

   bdf_2.addObject('BDFOdeSolver', order="2", printLog="false", rayleighMass="0.01", rayleighStiffness="0.01")
   bdf_2.addObject('NewtonRaphsonSolver', name="newton", printLog="false", maxNbIterationsNewton="4", maxNbIterationsLineSearch="2", absoluteResidualStoppingThreshold="1e-6")
   bdf_2.addObject('EigenSimplicialLDLT', template="CompressedRowSparseMatrix")
   bdf_2.addObject('MechanicalObject', name="dofs", template="Vec3", position="0 0 0  1 1 0 ", showObject="true", showObjectScale="20")
   bdf_2.addObject('EdgeSetTopologyContainer', name="topologyContainer", edges="0 1", position="@dofs.position")
   bdf_2.addObject('UniformMass', totalMass="15", topology="@topologyContainer")
   bdf_2.addObject('SpringForceField', spring="0 1 1000 0 1")
   bdf_2.addObject('FixedProjectiveConstraint', indices="0")

   bdf_3 = root.addChild('BDF-3')

   bdf_3.addObject('BDFOdeSolver', order="3", printLog="false", rayleighMass="0.01", rayleighStiffness="0.01")
   bdf_3.addObject('NewtonRaphsonSolver', name="newton", printLog="false", maxNbIterationsNewton="4", maxNbIterationsLineSearch="2", absoluteResidualStoppingThreshold="1e-6")
   bdf_3.addObject('EigenSimplicialLDLT', template="CompressedRowSparseMatrix")
   bdf_3.addObject('MechanicalObject', name="dofs", template="Vec3", position="0 0 0  1 1 0 ", showObject="true", showObjectScale="20")
   bdf_3.addObject('EdgeSetTopologyContainer', name="topologyContainer", edges="0 1", position="@dofs.position")
   bdf_3.addObject('UniformMass', totalMass="15", topology="@topologyContainer")
   bdf_3.addObject('SpringForceField', spring="0 1 1000 0 1")
   bdf_3.addObject('FixedProjectiveConstraint', indices="0")