Skip to content

Commit

Permalink
#1580 Support int type variable without scale_factor and add_offset a…
Browse files Browse the repository at this point in the history
…ttributes
  • Loading branch information
hsoh-u committed Jan 5, 2021
1 parent 1d00f17 commit 05c9568
Showing 1 changed file with 80 additions and 99 deletions.
179 changes: 80 additions & 99 deletions met/src/libcode/vx_nc_util/nc_utils.cc
Expand Up @@ -1408,7 +1408,7 @@ void _apply_scale_factor(float *data, const T *packed_data,
if (data[idx] > 0) positive_cnt++;
if (min_value > data[idx]) min_value = data[idx];
if (max_value < data[idx]) max_value = data[idx];
unpacked_count++;
if (!is_eq(0., add_offset) && !is_eq(1., scale_factor)) unpacked_count++;
}
}
mlog << Debug(4) << method_name << " unpacked data: count="
Expand Down Expand Up @@ -1459,7 +1459,7 @@ bool get_nc_data(NcVar *var, float *data) {

switch ( type_id ) {
case NcType::nc_INT:
if (!is_eq(0., add_offset) && !is_eq(1., scale_factor)) {
{
int fill_value = bad_data_int;
int min_value = 2147483647;
int max_value = -2147483648;
Expand All @@ -1469,14 +1469,14 @@ bool get_nc_data(NcVar *var, float *data) {
fill_value = get_att_value_int(att_fill_value);

var->getVar(packed_data);
_apply_scale_factor(data, packed_data,
cell_count, fill_value, min_value, max_value, "int",
add_offset, scale_factor);
_apply_scale_factor(data, packed_data, cell_count,
fill_value, min_value, max_value, "int",
add_offset, scale_factor);
delete [] packed_data;
}
break;
case NcType::nc_SHORT:
if (!is_eq(0., add_offset) && !is_eq(1., scale_factor)) {
{
short fill_value = (short)bad_data_int;
short *packed_data = new short[cell_count];

Expand All @@ -1486,29 +1486,22 @@ bool get_nc_data(NcVar *var, float *data) {
var->getVar(packed_data);

if (unsigned_value) {
int value, unsigned_fill_value;
unsigned_fill_value = (unsigned short)fill_value;
unsigned short value;
int positive_cnt = 0;
int raw_min_value = 70000;
int raw_max_value = -70000;
float min_value = 10e10;
float max_value = -10e10;
unsigned short unsigned_fill_value = (unsigned short)fill_value;
for (int idx=0; idx<cell_count; idx++) {
value = (unsigned short)packed_data[idx];
if (unsigned_fill_value == value)
data[idx] = bad_data_float;
else {
data[idx] = (value * scale_factor) + add_offset;
unpacked_count++;
}
}

int positive_cnt = 0;
int raw_min_value = 70000;
int raw_max_value = -70000;
float min_value = 10e10;
float max_value = -10e10;
int tmp_value;
for (int idx=0; idx<cell_count; idx++) {
if (fill_value != packed_data[idx]) {
tmp_value = (unsigned short)packed_data[idx];
if (raw_min_value > tmp_value) raw_min_value = tmp_value;
if (raw_max_value < tmp_value) raw_max_value = tmp_value;
if (raw_min_value > value) raw_min_value = value;
if (raw_max_value < value) raw_max_value = value;
if (data[idx] > 0) positive_cnt++;
if (min_value > data[idx]) min_value = data[idx];
if (max_value < data[idx]) max_value = data[idx];
Expand All @@ -1532,25 +1525,25 @@ bool get_nc_data(NcVar *var, float *data) {
}
break;
case NcType::nc_USHORT:
if (!is_eq(0., add_offset) && !is_eq(1., scale_factor)) {
unsigned short fill_value = (unsigned short)bad_data_int;
{
unsigned short min_value = 65535;
unsigned short max_value = 0;
unsigned short fill_value = (unsigned short)bad_data_int;
unsigned short *packed_data = new unsigned short[cell_count];

if (IS_VALID_NC_P(att_fill_value))
fill_value = get_att_value_ushort(att_fill_value);

var->getVar(packed_data);

_apply_scale_factor(data, packed_data,
cell_count, fill_value, min_value, max_value, "unsigned short",
add_offset, scale_factor);
_apply_scale_factor(data, packed_data, cell_count,
fill_value, min_value, max_value, "unsigned short",
add_offset, scale_factor);
delete [] packed_data;
}
break;
case NcType::nc_BYTE:
if (!is_eq(0., add_offset) && !is_eq(1., scale_factor)) {
{
ncbyte fill_value = (ncbyte)bad_data_int;
ncbyte *packed_data = new ncbyte[cell_count];

Expand All @@ -1559,28 +1552,22 @@ bool get_nc_data(NcVar *var, float *data) {
}

if (unsigned_value) {
int value, unsigned_fill_value;
unsigned_fill_value = (ncbyte)fill_value;
for (int idx=0; idx<cell_count; idx++) {
value = (unsigned char)packed_data[idx];
if (unsigned_fill_value == value)
data[idx] = bad_data_float;
else {
data[idx] = (value * scale_factor) + add_offset;
unpacked_count++;
}
}
int value;
int positive_cnt = 0;
int raw_min_value = 70000;
int raw_max_value = -70000;
float min_value = 10e10;
float max_value = -10e10;
int tmp_value;
int unsigned_fill_value = (ncbyte)fill_value;
for (int idx=0; idx<cell_count; idx++) {
if (fill_value != packed_data[idx]) {
tmp_value = (unsigned char)packed_data[idx];
if (raw_min_value > tmp_value) raw_min_value = tmp_value;
if (raw_max_value < tmp_value) raw_max_value = tmp_value;
value = packed_data[idx];
if (unsigned_fill_value == value)
data[idx] = bad_data_float;
else {
data[idx] = (value * scale_factor) + add_offset;
unpacked_count++;
if (raw_min_value > value) raw_min_value = value;
if (raw_max_value < value) raw_max_value = value;
if (data[idx] > 0) positive_cnt++;
if (min_value > data[idx]) min_value = data[idx];
if (max_value < data[idx]) max_value = data[idx];
Expand All @@ -1596,15 +1583,15 @@ bool get_nc_data(NcVar *var, float *data) {
else {
ncbyte min_value = 127;
ncbyte max_value = -127;
_apply_scale_factor(data, packed_data,
cell_count, fill_value, min_value, max_value, "ncbyte",
add_offset, scale_factor);
_apply_scale_factor(data, packed_data, cell_count,
fill_value, min_value, max_value, "ncbyte",
add_offset, scale_factor);
}
delete [] packed_data;
}
break;
case NcType::nc_UBYTE:
if (!is_eq(0., add_offset) && !is_eq(1., scale_factor)) {
{
unsigned char min_value = 255;
unsigned char max_value = 0;
unsigned char fill_value = (unsigned char)-99;
Expand All @@ -1614,9 +1601,9 @@ bool get_nc_data(NcVar *var, float *data) {
fill_value = get_att_value_char(att_fill_value);
}

_apply_scale_factor(data, packed_data,
cell_count, fill_value, min_value, max_value, "unsigned char",
add_offset, scale_factor);
_apply_scale_factor(data, packed_data, cell_count,
fill_value, min_value, max_value, "unsigned char",
add_offset, scale_factor);
delete [] packed_data;
}
break;
Expand Down Expand Up @@ -1697,7 +1684,7 @@ int _apply_scale_factor(double *data, const T *packed_data,
if (data[idx] > 0) positive_cnt++;
if (min_value > data[idx]) min_value = data[idx];
if (max_value < data[idx]) max_value = data[idx];
unpacked_count++;
if (!is_eq(0., add_offset) && !is_eq(1., scale_factor)) unpacked_count++;
}
}
mlog << Debug(4) << method_name << " unpacked data: count="
Expand Down Expand Up @@ -1749,7 +1736,7 @@ bool get_nc_data(NcVar *var, double *data) {

switch ( type_id ) {
case NcType::nc_INT:
if (!is_eq(0., add_offset) && !is_eq(1., scale_factor)) {
{
int fill_value = bad_data_int;
int min_value = 2147483647;
int max_value = -2147483648;
Expand All @@ -1759,14 +1746,14 @@ bool get_nc_data(NcVar *var, double *data) {
fill_value = get_att_value_int(att_fill_value);

var->getVar(packed_data);
_apply_scale_factor(data, packed_data,
cell_count, fill_value, min_value, max_value, "int",
add_offset, scale_factor);
_apply_scale_factor(data, packed_data, cell_count,
fill_value, min_value, max_value, "int",
add_offset, scale_factor);
delete [] packed_data;
}
break;
case NcType::nc_SHORT:
if (!is_eq(0., add_offset) && !is_eq(1., scale_factor)) {
{
short fill_value = (short)bad_data_int;
short *packed_data = new short[cell_count];

Expand All @@ -1776,28 +1763,22 @@ bool get_nc_data(NcVar *var, double *data) {
var->getVar(packed_data);

if (unsigned_value) {
int value, unsigned_fill_value;
unsigned_fill_value = (unsigned short)fill_value;
int value;
int positive_cnt = 0;
int raw_min_value = 70000;
int raw_max_value = -70000;
float min_value = 10e10;
float max_value = -10e10;
int unsigned_fill_value = (unsigned short)fill_value;
for (int idx=0; idx<cell_count; idx++) {
value = (unsigned short)packed_data[idx];
if (unsigned_fill_value == value)
data[idx] = bad_data_double;
else {
data[idx] = (value * scale_factor) + add_offset;
unpacked_count++;
}
}
int positive_cnt = 0;
int raw_min_value = 70000;
int raw_max_value = -70000;
float min_value = 10e10;
float max_value = -10e10;
int tmp_value;
for (int idx=0; idx<cell_count; idx++) {
if (fill_value != packed_data[idx]) {
tmp_value = (unsigned short)packed_data[idx];
if (raw_min_value > tmp_value) raw_min_value = tmp_value;
if (raw_max_value < tmp_value) raw_max_value = tmp_value;
if (raw_min_value > value) raw_min_value = value;
if (raw_max_value < value) raw_max_value = value;
if (data[idx] > 0) positive_cnt++;
if (min_value > data[idx]) min_value = data[idx];
if (max_value < data[idx]) max_value = data[idx];
Expand All @@ -1821,7 +1802,7 @@ bool get_nc_data(NcVar *var, double *data) {
}
break;
case NcType::nc_USHORT:
if (!is_eq(0., add_offset) && !is_eq(1., scale_factor)) {
{
unsigned short fill_value = (unsigned short)bad_data_int;
unsigned short *packed_data = new unsigned short[cell_count];

Expand All @@ -1839,37 +1820,33 @@ bool get_nc_data(NcVar *var, double *data) {
}
break;
case NcType::nc_BYTE:
if (!is_eq(0., add_offset) && !is_eq(1., scale_factor)) {
{
ncbyte fill_value = (ncbyte)bad_data_int;
ncbyte *packed_data = new ncbyte[cell_count];

if (IS_VALID_NC_P(att_fill_value)) {
fill_value = get_att_value_char(att_fill_value);
}

var->getVar(packed_data);

if (unsigned_value) {
int value, unsigned_fill_value;
unsigned_fill_value = (ncbyte)fill_value;
for (int idx=0; idx<cell_count; idx++) {
value = (unsigned char)packed_data[idx];
if (unsigned_fill_value == value)
data[idx] = bad_data_double;
else {
data[idx] = (value * scale_factor) + add_offset;
unpacked_count++;
}
}
int value;
int positive_cnt = 0;
int raw_min_value = 70000;
int raw_max_value = -70000;
float min_value = 10e10;
float max_value = -10e10;
int tmp_value;
int unsigned_fill_value = (ncbyte)fill_value;
for (int idx=0; idx<cell_count; idx++) {
if (fill_value != packed_data[idx]) {
tmp_value = (unsigned char)packed_data[idx];
if (raw_min_value > tmp_value) raw_min_value = tmp_value;
if (raw_max_value < tmp_value) raw_max_value = tmp_value;
value = packed_data[idx];
if (unsigned_fill_value == value)
data[idx] = bad_data_double;
else {
data[idx] = (value * scale_factor) + add_offset;
unpacked_count++;
if (raw_min_value > value) raw_min_value = value;
if (raw_max_value < value) raw_max_value = value;
if (data[idx] > 0) positive_cnt++;
if (min_value > data[idx]) min_value = data[idx];
if (max_value < data[idx]) max_value = data[idx];
Expand All @@ -1885,27 +1862,29 @@ bool get_nc_data(NcVar *var, double *data) {
else {
ncbyte min_value = 127;
ncbyte max_value = -127;
_apply_scale_factor(data, packed_data,
cell_count, fill_value, min_value, max_value, "ncbyte",
add_offset, scale_factor);
_apply_scale_factor(data, packed_data, cell_count,
fill_value, min_value, max_value, "ncbyte",
add_offset, scale_factor);
}
delete [] packed_data;
}
break;
case NcType::nc_UBYTE:
if (!is_eq(0., add_offset) && !is_eq(1., scale_factor)) {
{
signed char min_value = 255;
signed char max_value = 0;
signed char fill_value = (signed char)bad_data_int;
signed char *packed_data = new signed char[cell_count];

if (IS_VALID_NC_P(att_fill_value)) {
fill_value = get_att_value_char(att_fill_value);
}

signed char min_value = 255;
signed char max_value = 0;
_apply_scale_factor(data, packed_data,
cell_count, fill_value, min_value, max_value, "ncbyte",
add_offset, scale_factor);
var->getVar(packed_data);

_apply_scale_factor(data, packed_data, cell_count,
fill_value, min_value, max_value, "ncbyte",
add_offset, scale_factor);
delete [] packed_data;
}
break;
Expand Down Expand Up @@ -3444,6 +3423,8 @@ NcVar get_nc_var_time(const NcFile *nc) {
//if (is_nc_name_time(name)) found = true;
if (get_nc_att_value(&(*itVar).second, "standard_name", name)) {
if (is_nc_name_time(name)) found = true;
mlog << Debug(7) << method_name << "checked variable \""
<< name << "\" is_time: " << found << "\n";
}
if (!found && get_nc_att_value(&(*itVar).second, "units", name)) {
if (is_nc_unit_time(name.c_str())) {
Expand Down

0 comments on commit 05c9568

Please sign in to comment.