1 /* Copyright 2002-2024 CS GROUP
2 * Licensed to CS GROUP (CS) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * CS licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.orekit.propagation.conversion;
18
19 import org.hipparchus.CalculusFieldElement;
20 import org.hipparchus.Field;
21 import org.hipparchus.exception.LocalizedCoreFormats;
22 import org.hipparchus.exception.MathIllegalArgumentException;
23
24 /**
25 * Abstract class for integrator builder using fixed step size.
26 *
27 * @param <T> Type of the field elements
28 *
29 * @author Vincent Cucchietti
30 */
31 public abstract class AbstractFixedStepFieldIntegratorBuilder<T extends CalculusFieldElement<T>>
32 extends AbstractFieldIntegratorBuilder<T> {
33
34 /** Step size (s). */
35 private double step;
36
37 /** Step size (s). */
38 private T fieldStep;
39
40 /**
41 * Constructor.
42 *
43 * @param step step size (s)
44 */
45 AbstractFixedStepFieldIntegratorBuilder(final double step) {
46 // Check that given step size is strictly positive
47 checkStep(step);
48
49 this.step = step;
50 }
51
52 /**
53 * Constructor using a "fielded" step.
54 * <p>
55 * <b>WARNING : Given "fielded" step must be using the same field as the one that will be used when calling
56 * {@link #buildIntegrator}</b>
57 *
58 * @param step step size (s)
59 */
60 AbstractFixedStepFieldIntegratorBuilder(final T step) {
61 // Check that given step size is strictly positive
62 checkStep(step.getReal());
63
64 this.fieldStep = step;
65 }
66
67 /**
68 * Check that given step size is not equal to 0.
69 *
70 * @param stepToCheck step size (s) to check
71 */
72 protected void checkStep(final double stepToCheck) {
73 if (stepToCheck == 0) {
74 throw new MathIllegalArgumentException(LocalizedCoreFormats.ZERO_NOT_ALLOWED, stepToCheck);
75 }
76 }
77
78 /**
79 * Get "fielded" step size (s).
80 *
81 * @param field field to which the element belong
82 *
83 * @return "fielded" step size (s)
84 */
85 protected T getFieldStep(final Field<T> field) {
86 return fieldStep != null ? fieldStep : field.getZero().newInstance(step);
87 }
88 }