Code Design#

Mixin and Composition#

Elastica package follows Mixin and composition design patterns that may be unfamiliar to users. Here is a collection of references that introduce the package design.

References#

Structural subtyping#

Elastica package uses structural subtyping to allow users to define their own classes and functions. Here is a typing.Protocol structure that is used in the package.

Systems#

            flowchart LR
      direction RL
      subgraph Systems Protocol
        direction RL
        SLBD(SlenderBodyGeometryProtool)
        SymST["SymplecticSystem:\n• KinematicStates/Rates\n• DynamicStates/Rates"]
        style SymST text-align:left
        ExpST["ExplicitSystem:\n• States (Unused)"]
        style ExpST text-align:left
        P((position\nvelocity\nacceleration\n..)) --> SLBD
        subgraph StaticSystemType
            Surface
            Mesh
        end
        subgraph SystemType
            direction TB
            Rod
            RigidBody
        end
        SLBD --> SymST
        SystemType --> SymST
        SLBD --> ExpST
        SystemType --> ExpST
      end
      subgraph Timestepper Protocol
        direction TB
        StP["StepperProtocol\n• step(SystemCollection, time, dt)"]
        style StP text-align:left
        SymplecticStepperProtocol["SymplecticStepperProtocol\n• PositionVerlet"]
        style SymplecticStepperProtocol text-align:left
        ExpplicitStepperProtocol["ExpplicitStepperProtocol\n(Unused)"]
      end

      subgraph SystemCollection

      end
      SymST --> SystemCollection --> SymplecticStepperProtocol
      ExpST --> SystemCollection --> ExpplicitStepperProtocol
      StaticSystemType --> SystemCollection

    

System Collection (Build memory block)#

            flowchart LR
      Sys((Systems))
      St((Stepper))
      subgraph SystemCollectionType
        direction LR
        StSys["StaticSystem:\n• Surface\n• Mesh"]
        style StSys text-align:left
        DynSys["DynamicSystem:\n• Rod\n  • CosseratRod\n• RigidBody\n  • Sphere\n  • Cylinder"]
        style DynSys text-align:left

        BlDynSys["BlockSystemType:\n• BlockCosseratRod\n• BlockRigidBody"]
        style BlDynSys text-align:left

        F{{"Feature Group (OperatorGroup):\n• Synchronize\n• Constrain values\n• Constrain rates\n• Callback"}}
        style F text-align:left
      end
      Sys --> StSys --> F
      Sys --> DynSys -->|Finalize| BlDynSys --> St
      DynSys --> F <--> St

    

System Collection (Features)#

            flowchart LR
      Sys((Systems))
      St((Stepper))
      subgraph SystemCollectionType
        direction LR
        StSys["StaticSystem:\n• Surface\n• Mesh"]
        style StSys text-align:left
        DynSys["DynamicSystem:\n• Rod\n&nbsp;&nbsp;• CosseratRod\n• RigidBody\n&nbsp;&nbsp;• Sphere\n&nbsp;&nbsp;• Cylinder"]
        style DynSys text-align:left

        subgraph Feature
        direction LR
        Forcing -->|add_forcing_to| Synchronize
        Constraints -->|constrain| ConstrainValues
        Constraints -->|constrain| ConstrainRates
        Contact -->|detect_contact_between| Synchronize
        Connection -->|connect| Synchronize
        Damping -->|dampen| ConstrainRates
        Callback -->|collect_diagnosis| CallbackGroup
        end
      end
      Sys --> StSys --> Feature
      Sys --> DynSys
      DynSys --> Feature <--> St