Skip to content

Commit

Permalink
windsat-coriolis problem in compute distance to land post processing …
Browse files Browse the repository at this point in the history
…plugin

solution convert longitude values to match the range -180 .. 180
NaN, negative infinity and positive infinity are now also taken into account.
  • Loading branch information
SabineEmbacher committed Apr 12, 2024
1 parent 5dbcc60 commit e1aae24
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 28 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,6 @@
target/
/ingestion-tool/src/temp/
temp.txt
temp.java
temp.xml
/out/
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package com.bc.fiduceo.post.plugin.era5;

import com.bc.fiduceo.FiduceoConstants;
import com.bc.fiduceo.post.util.PPUtils;
import com.bc.fiduceo.reader.ReaderUtils;
import com.bc.fiduceo.util.NetCDFUtils;
import ucar.ma2.Array;
import ucar.ma2.DataType;
import ucar.ma2.Index;
import ucar.ma2.IndexIterator;
import ucar.ma2.InvalidRangeException;
import ucar.nc2.*;
import ucar.nc2.Dimension;
Expand All @@ -16,6 +16,7 @@
import java.util.List;

import static com.bc.fiduceo.post.plugin.era5.VariableUtils.*;
import static com.bc.fiduceo.post.util.PPUtils.convertToFitTheRangeMinus180to180;

class SatelliteFields extends FieldsProcessor {

Expand Down Expand Up @@ -206,17 +207,6 @@ void compute(Configuration config, NetcdfFile reader, NetcdfFileWriter writer) t
}
}

private static void convertToFitTheRangeMinus180to180(Array lonArray) {
final IndexIterator indexIterator = lonArray.getIndexIterator();
while (indexIterator.hasNext()) {
double lonD = indexIterator.getDoubleNext();
while (lonD > 180) {
lonD -= 360;
}
indexIterator.setDoubleCurrent(lonD);
}
}

private void addTimeVariable(SatelliteFieldsConfiguration satFieldsConfig, NetcdfFileWriter writer) {
final String nwp_time_variable_name = satFieldsConfig.get_nwp_time_variable_name();
final Variable variable = writer.addVariable(nwp_time_variable_name, DataType.INT, FiduceoConstants.MATCHUP_COUNT);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
import java.nio.file.Paths;
import java.util.List;

import static com.bc.fiduceo.post.util.PPUtils.convertToFitTheRangeMinus180to180;


class AddLandDistance extends PostProcessing {

Expand Down Expand Up @@ -86,22 +88,6 @@ void setDistanceToLandMap(DistanceToLandMap distanceToLandMap) {
this.distanceToLandMap = distanceToLandMap;
}

private static void convertToFitTheRangeMinus180to180(Array lonArray) {
final IndexIterator indexIterator = lonArray.getIndexIterator();
while (indexIterator.hasNext()) {
double lonD = indexIterator.getDoubleNext();
if (Double.isFinite(lonD)) {
while (lonD > 180) {
lonD -= 360;
}
while (lonD < -180) {
lonD += 360;
}
}
indexIterator.setDoubleCurrent(lonD);
}
}

private void initDistanceToLandMap() {
if (distanceToLandMap == null) {
distanceToLandMap = new DistanceToLandMap(Paths.get(configuration.auxDataFilePath));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.bc.fiduceo.post.util;

import ucar.ma2.Array;
import ucar.ma2.IndexIterator;

public class PPUtils {

public static void convertToFitTheRangeMinus180to180(Array lonArray) {
final IndexIterator indexIterator = lonArray.getIndexIterator();
while (indexIterator.hasNext()) {
double lonD = indexIterator.getDoubleNext();
if (Double.isFinite(lonD)) {
while (lonD > 180) {
lonD -= 360;
}
while (lonD < -180) {
lonD += 360;
}
indexIterator.setDoubleCurrent(lonD);
}
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.bc.fiduceo.post.util;

import org.junit.Test;
import ucar.ma2.Array;

import static org.hamcrest.Matchers.*;
import static org.hamcrest.MatcherAssert.*;
import static org.junit.Assert.*;

public class PPUtilsTest {

@Test
public void convertToFitTheRangeMinus180to180() {
final int farOutside = 360 * 200;

final double[] lons = {
-180,
-179.999999999,
179.999999999,
180,
-190,
190,
-30 - farOutside,
40 + farOutside,
Double.NaN,
Double.NEGATIVE_INFINITY,
Double.POSITIVE_INFINITY
};

final Array lonArray = Array.makeFromJavaArray(lons);
PPUtils.convertToFitTheRangeMinus180to180(lonArray);

final double[] expected = {
/* Before: -180 after -> */ -180,
/* Before: -179.999999999 after -> */ -179.999999999,
/* Before: 179.999999999 after -> */ 179.999999999,
/* Before: 180 after -> */ 180,
/* Before: -190 after -> */ 170,
/* Before: 190 after -> */ -170,
/* Before: -30 - farOutside after -> */ -30,
/* Before: 40 + farOutside after -> */ 40,
/* Before: Double.NaN after -> */ Double.NaN,
/* Before: Double.NEGATIVE_INFINITY after -> */ Double.NEGATIVE_INFINITY,
/* Before: Double.POSITIVE_INFINITY after -> */ Double.POSITIVE_INFINITY
};

assertArrayEquals(expected, (double[]) lonArray.getStorage(), 0.000001);
}
}

0 comments on commit e1aae24

Please sign in to comment.