PerturbationsWriter.java
/* Copyright 2002-2024 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.
*/
package org.orekit.files.ccsds.ndm.odm.ocm;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.orekit.files.ccsds.definitions.BodyFacade;
import org.orekit.files.ccsds.definitions.TimeConverter;
import org.orekit.files.ccsds.definitions.Units;
import org.orekit.files.ccsds.section.AbstractWriter;
import org.orekit.files.ccsds.utils.generation.Generator;
import org.orekit.utils.units.Unit;
/** Writer for perturbations parameters data.
* @author Luc Maisonobe
* @since 11.0
*/
class PerturbationsWriter extends AbstractWriter {
/** Perturbation parameters block. */
private final Perturbations perturbations;
/** Converter for dates. */
private final TimeConverter timeConverter;
/** Create a writer.
* @param perturbations perturbations parameters to write
* @param timeConverter converter for dates
*/
PerturbationsWriter(final Perturbations perturbations, final TimeConverter timeConverter) {
super(OcmDataSubStructureKey.pert.name(), OcmDataSubStructureKey.PERT.name());
this.perturbations = perturbations;
this.timeConverter = timeConverter;
}
/** {@inheritDoc} */
@Override
protected void writeContent(final Generator generator) throws IOException {
// perturbations parameters block
generator.writeComments(perturbations.getComments());
// atmosphere
generator.writeEntry(PerturbationsKey.ATMOSPHERIC_MODEL.name(), perturbations.getAtmosphericModel(), null, false);
// gravity
if (perturbations.getGravityModel() != null) {
final String model =
new StringBuilder().
append(perturbations.getGravityModel()).
append(": ").
append(perturbations.getGravityDegree()).
append("D ").
append(perturbations.getGravityOrder()).
append('O').
toString();
generator.writeEntry(PerturbationsKey.GRAVITY_MODEL.name(), model, null, false);
}
generator.writeEntry(PerturbationsKey.EQUATORIAL_RADIUS.name(), perturbations.getEquatorialRadius(), Unit.KILOMETRE, false);
generator.writeEntry(PerturbationsKey.GM.name(), perturbations.getGm(), Units.KM3_PER_S2, false);
if (perturbations.getNBodyPerturbations() != null && !perturbations.getNBodyPerturbations().isEmpty()) {
final List<String> names = new ArrayList<>();
for (BodyFacade bf : perturbations.getNBodyPerturbations()) {
names.add(bf.getName());
}
generator.writeEntry(PerturbationsKey.N_BODY_PERTURBATIONS.name(), names, false);
}
generator.writeEntry(PerturbationsKey.CENTRAL_BODY_ROTATION.name(), perturbations.getCentralBodyRotation(), Units.DEG_PER_S, false);
generator.writeEntry(PerturbationsKey.OBLATE_FLATTENING.name(), perturbations.getOblateFlattening(), Unit.ONE, false);
generator.writeEntry(PerturbationsKey.OCEAN_TIDES_MODEL.name(), perturbations.getOceanTidesModel(), null, false);
generator.writeEntry(PerturbationsKey.SOLID_TIDES_MODEL.name(), perturbations.getSolidTidesModel(), null, false);
generator.writeEntry(PerturbationsKey.REDUCTION_THEORY.name(), perturbations.getReductionTheory(), null, false);
// radiation
generator.writeEntry(PerturbationsKey.ALBEDO_MODEL.name(), perturbations.getAlbedoModel(), null, false);
generator.writeEntry(PerturbationsKey.ALBEDO_GRID_SIZE.name(), perturbations.getAlbedoGridSize(), false);
generator.writeEntry(PerturbationsKey.SHADOW_MODEL.name(), perturbations.getShadowModel(), false);
if (perturbations.getShadowBodies() != null && !perturbations.getShadowBodies().isEmpty()) {
final List<String> names = new ArrayList<>();
for (BodyFacade bf : perturbations.getShadowBodies()) {
names.add(bf.getName());
}
generator.writeEntry(PerturbationsKey.SHADOW_BODIES.name(), names, false);
}
generator.writeEntry(PerturbationsKey.SRP_MODEL.name(), perturbations.getSrpModel(), null, false);
// data source
generator.writeEntry(PerturbationsKey.SW_DATA_SOURCE.name(), perturbations.getSpaceWeatherSource(), null, false);
generator.writeEntry(PerturbationsKey.SW_DATA_EPOCH.name(), timeConverter, perturbations.getSpaceWeatherEpoch(), true, false);
generator.writeEntry(PerturbationsKey.SW_INTERP_METHOD.name(), perturbations.getInterpMethodSW(), null, false);
generator.writeEntry(PerturbationsKey.FIXED_GEOMAG_KP.name(), perturbations.getFixedGeomagneticKp(), Units.NANO_TESLA, false);
generator.writeEntry(PerturbationsKey.FIXED_GEOMAG_AP.name(), perturbations.getFixedGeomagneticAp(), Units.NANO_TESLA, false);
generator.writeEntry(PerturbationsKey.FIXED_GEOMAG_DST.name(), perturbations.getFixedGeomagneticDst(), Units.NANO_TESLA, false);
generator.writeEntry(PerturbationsKey.FIXED_F10P7.name(), perturbations.getFixedF10P7(), Unit.SOLAR_FLUX_UNIT, false);
generator.writeEntry(PerturbationsKey.FIXED_F10P7_MEAN.name(), perturbations.getFixedF10P7Mean(), Unit.SOLAR_FLUX_UNIT, false);
generator.writeEntry(PerturbationsKey.FIXED_M10P7.name(), perturbations.getFixedM10P7(), Unit.SOLAR_FLUX_UNIT, false);
generator.writeEntry(PerturbationsKey.FIXED_M10P7_MEAN.name(), perturbations.getFixedM10P7Mean(), Unit.SOLAR_FLUX_UNIT, false);
generator.writeEntry(PerturbationsKey.FIXED_S10P7.name(), perturbations.getFixedS10P7(), Unit.SOLAR_FLUX_UNIT, false);
generator.writeEntry(PerturbationsKey.FIXED_S10P7_MEAN.name(), perturbations.getFixedS10P7Mean(), Unit.SOLAR_FLUX_UNIT, false);
generator.writeEntry(PerturbationsKey.FIXED_Y10P7.name(), perturbations.getFixedY10P7(), Unit.SOLAR_FLUX_UNIT, false);
generator.writeEntry(PerturbationsKey.FIXED_Y10P7_MEAN.name(), perturbations.getFixedY10P7Mean(), Unit.SOLAR_FLUX_UNIT, false);
}
}