diff --git a/src/e3sm_quickview/plugins/eam_reader.py b/src/e3sm_quickview/plugins/eam_reader.py index ab7fa60..37bf7b1 100644 --- a/src/e3sm_quickview/plugins/eam_reader.py +++ b/src/e3sm_quickview/plugins/eam_reader.py @@ -9,6 +9,7 @@ try: import netCDF4 import numpy as np + import json _has_deps = True except ImportError as ie: @@ -230,9 +231,6 @@ def __init__(self): self._DataFileName = None self._ConnFileName = None self._dirty = False - self._surface_update = True - self._midpoint_update = True - self._interface_update = True # Variables for dimension sliders self._time = 0 @@ -396,23 +394,18 @@ def _get_cached_area(self, vardata): self._cached_area[mask] = np.nan return self._cached_area - def _load_variable(self, vardata, varmeta, timeInd): + def _load_variable(self, vardata, varmeta): """Load variable data with dimension-based slicing.""" try: # Build slice tuple based on variable's dimensions and user-selected slices slice_tuple = [] for dim in varmeta.dimensions: if dim == self._data_horizontal_dim: - continue - # elif dim == "time": - # # Use timeInd for time dimension - # slice_tuple.append(timeInd) - elif hasattr(self, "_slices") and dim in self._slices: - # Use user-specified slice for this dimension - slice_tuple.append(self._slices[dim]) + slice_tuple.append(slice(None)) else: # Use all data for unspecified dimensions - slice_tuple.append(slice(None)) + slice_tuple.append(self._slices.get(dim, 0)) + # Get data with proper slicing data = vardata[varmeta.name][tuple(slice_tuple)].data.flatten() data = np.where(data == varmeta.fillval, np.nan, data) @@ -511,7 +504,7 @@ def _populate_variable_metadata(self): if self._data_horizontal_dim not in dims: continue varmeta = VarMeta(name, info, self._data_horizontal_dim) - if len(dims) == 1 and "area" in name: + if len(dims) == 1 and "area" in name.lower(): self._areavar = varmeta if len(dims) > 1: all_dimensions.update(dims) @@ -588,20 +581,10 @@ def SetConnFileName(self, fname): def SetSlicing(self, slice_str): # Parse JSON string containing dimension slices and update self._slices - # Initialize _slices if not already done - if not hasattr(self, "_slices"): - self._slices = {} - - # Initialize dimensions if not already done - if not hasattr(self, "_dimensions"): - self._dimensions = {} if slice_str and slice_str.strip(): # Check for non-empty string try: - import json - slice_dict = json.loads(slice_str) - # Validate and update slices for provided dimensions invalid_slices = [] for dim, slice_val in slice_dict.items(): @@ -713,16 +696,6 @@ def RequestData(self, request, inInfo, outInfo): print_error("Required Python module 'netCDF4' or 'numpy' missing!") return 0 - # Getting the correct time index - executive = self.GetExecutive() - from_port = request.Get(executive.FROM_OUTPUT_PORT()) - timeInd = self.get_time_index(outInfo, executive, from_port) - if self._time != timeInd: - self._time = timeInd - self._surface_update = True - self._midpoint_update = True - self._interface_update = True - meshdata = self._get_mesh_dataset() vardata = self._get_var_dataset() @@ -766,9 +739,8 @@ def RequestData(self, request, inInfo, outInfo): if self._variable_selection.ArrayIsEnabled(name): if output_mesh.CellData.HasArray(name): to_remove.remove(name) - if not output_mesh.CellData.HasArray(name) or self._surface_update: - data = self._load_variable(vardata, varmeta, timeInd) - output_mesh.CellData.append(data, name) + data = self._load_variable(vardata, varmeta) + output_mesh.CellData.append(data, name) area_var_name = "area" if self._areavar and not output_mesh.CellData.HasArray(area_var_name): diff --git a/src/e3sm_quickview/utils/compute.py b/src/e3sm_quickview/utils/compute.py index ca2beeb..1d962e4 100644 --- a/src/e3sm_quickview/utils/compute.py +++ b/src/e3sm_quickview/utils/compute.py @@ -39,7 +39,12 @@ def extract_avgs(pv_data, array_names): area_array = vtk_data.GetCellData().GetArray("area") for name in array_names: vtk_array = vtk_data.GetCellData().GetArray(name) - avg_value = calculate_weighted_average(vtk_array, area_array) + if vtk_array is None: + results[name] = np.nan + continue + if area_array: + avg_value = calculate_weighted_average(vtk_array, area_array) + else: + avg_value = float(np.nanmean(np.array(vtk_array))) results[name] = avg_value - return results