' Copyright 2002-2021 CS GROUP
' Licensed to CS GROUP (CS) under one or more
' contributor license agreements.  See the NOTICE file distributed with
' this work for additional information regarding copyright ownership.
' CS licenses this file to You under the Apache License, Version 2.0
' (the "License"); you may not use this file except in compliance with
' the License.  You may obtain a copy of the License at
'
'   http://www.apache.org/licenses/LICENSE-2.0
'
' Unless required by applicable law or agreed to in writing, software
' distributed under the License is distributed on an "AS IS" BASIS,
' WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
' See the License for the specific language governing permissions and
' limitations under the License.
 
@startuml

  skinparam svek                  true
  skinparam ClassBackgroundColor  #F3EFEB/CCC9C5
  skinparam ClassArrowColor       #691616
  skinparam ClassBorderColor      #691616
  skinparam NoteBackgroundColor   #F3EFEB
  skinparam NoteBorderColor       #691616
  skinparam NoteFontColor         #691616
  skinparam ClassFontSize         11
  skinparam PackageFontSize       12

  package org.orekit #ECEBD8 {

    package forces #DDEBD8 {

      interface ForceModel {
        +void addContribution()
        +FieldVector3D<DerivativeStructure> accelerationDerivatives()
        +EventDetector[] getEventsDetectors()
      }

      package radiation #EAECE6 {
        class SolarRadiationPressure
        ForceModel <|.. SolarRadiationPressure
      }

    }
 
    package propagation #DDEBD8 {

      interface Propagator {
        + SpacecraftState propagate(AbsoluteDate target)
      }

      Propagator <|.. AbstractPropagator

      package integration #EAECE6 {
        interface AdditionalEquations {
          +String getName()
          +void computeDerivatives()
        }
        class  AbstractIntegratedPropagator {
         +void addAdditionalEquations(AdditionalEquations addEqu)
        }
        AbstractPropagator <|-- AbstractIntegratedPropagator
        AdditionalEquations <---o AbstractIntegratedPropagator : additional
      }

      package numerical #EAECE6 {

        interface TimeDerivativesEquations {
          +void addKeplerContribution()
          +void addXYZAcceleration()
          +void addAcceleration()
          +void addMassDerivative()
        }

       class NumericalPropagator {
         +void addForceModel(ForceModel model)
       }

        class PartialDerivativesEquations {
          +List<String> getAvailableParameters()
          +void selectParameters(String ... parameters)
          +void selectParamAndStep(String parameter, double hP)
          +void setInitialJacobians()
       }
      class Jacobianizer

       TimeDerivativesEquations    <--      ForceModel : contributes
       AdditionalEquations         <|..     PartialDerivativesEquations
       PartialDerivativesEquations *-->     ForceModel
       AbstractIntegratedPropagator  <|--     NumericalPropagator
       NumericalPropagator         "1..*" *--> ForceModel
       NumericalPropagator         "1" *--> TimeDerivativesEquations : main

      }
    }

  }

  package user.application #F3EDF7 {
        class ComplexForceModel #EAE6F7/B9B3D2
        ComplexForceModel ..|> ForceModel
       Jacobianizer                  "1" <-->  "1" ComplexForceModel

  }
@enduml
