diff --git a/src/e3sm_quickview/plugins/eam_reader.py b/src/e3sm_quickview/plugins/eam_reader.py index 5636679..3ed5b5c 100644 --- a/src/e3sm_quickview/plugins/eam_reader.py +++ b/src/e3sm_quickview/plugins/eam_reader.py @@ -255,6 +255,7 @@ def __init__(self): self._timeSteps = [] # Dictionary to store dimension slices self._slices = {} + self._changed_dims = set() # vtkDataArraySelection to allow users choice for fields # to fetch from the netCDF data set @@ -422,8 +423,10 @@ def _load_variable(self, vardata, varmeta): 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) + data = vardata[varmeta.name][tuple(slice_tuple)].data.reshape(-1) + if not np.isnan(varmeta.fillval): + data = data.copy() + data[data == varmeta.fillval] = np.nan return data except Exception as e: print_error(f"Error loading variable {varmeta.name}: {e}") @@ -460,8 +463,8 @@ def _build_geometry(self, meshdata): londim = mvars[np.where(np.char.find(mvars, "corner_lon") > -1)][0] # Build coordinates - lat = meshdata[latdim][:].data.flatten() - lon = meshdata[londim][:].data.flatten() + lat = meshdata[latdim][:].data.reshape(-1) + lon = meshdata[londim][:].data.reshape(-1) if self._ForceFloatPoints: points_type = np.float32 @@ -561,7 +564,7 @@ def _populate_variable_metadata(self): # Clear old timestamps before adding new ones self._timeSteps.clear() if "time" in vardata.variables: - timesteps = vardata["time"][:].data.flatten() + timesteps = vardata["time"][:].data.reshape(-1) self._timeSteps.extend(timesteps) def SetDataFileName(self, fname): @@ -627,6 +630,8 @@ def SetSlicing(self, slice_str): f"{dim_display}={slice_val} (valid range: 0-{dim_size - 1})" ) else: + if self._slices.get(dim) != slice_val: + self._changed_dims.add(dim) self._slices[dim] = slice_val else: print_error( @@ -759,13 +764,20 @@ def RequestData(self, request, inInfo, outInfo): for i in range(last_num_arrays): to_remove.add(output_mesh.CellData.GetArrayName(i)) + changed_dims = self._changed_dims for name, varmeta in self._variables.items(): if self._variable_selection.ArrayIsEnabled(name): if output_mesh.CellData.HasArray(name): to_remove.remove(name) + if changed_dims and not changed_dims.intersection( + varmeta.dimensions + ): + continue data = self._load_variable(vardata, varmeta) output_mesh.CellData.append(data, name) + self._changed_dims = set() + area_var_name = "area" if self._areavar and not output_mesh.CellData.HasArray(area_var_name): data = self._get_cached_area(vardata)