[docs]classAverages(VerosDiagnostic):"""Time average output diagnostic. All registered variables are summed up when :meth:`diagnose` is called, and averaged and output upon calling :meth:`output`. """name="averages"#:output_path="{identifier}.averages.nc"#: File to write to. May contain format strings that are replaced with Veros attributes.output_variables=None#: Iterable containing all variables to be averaged. Changes have no effect after ``initialize`` has been called.output_frequency=None#: Frequency (in seconds) in which output is written.sampling_frequency=None#: Frequency (in seconds) in which variables are accumulated.def__init__(self,state):self.var_meta={"average_nitts":Variable("average_nitts",None,write_to_restart=True),}self.output_variables=[]definitialize(self,state):"""Register all variables to be averaged"""forvarinself.output_variables:var_meta=copy.copy(state.var_meta[var])var_meta.time_dependent=Truevar_meta.write_to_restart=Trueifself._has_timestep_dim(state,var):var_meta.dims=var_meta.dims[:-1]self.var_meta[var]=var_metaself.initialize_variables(state)self.initialize_output(state)@staticmethoddef_has_timestep_dim(state,var):ifstate.var_meta[var].dimsisNone:returnFalsereturnstate.var_meta[var].dims[-1]==TIMESTEPS[0]defdiagnose(self,state):vs=state.variablesavg_vs=self.variablesavg_vs.average_nitts=avg_vs.average_nitts+1forkeyinself.output_variables:var_data=getattr(avg_vs,key)ifself._has_timestep_dim(state,key):setattr(avg_vs,key,var_data+getattr(vs,key)[...,vs.tau])else:setattr(avg_vs,key,var_data+getattr(vs,key))defoutput(self,state):"""Write averages to netcdf file and zero array"""avg_vs=self.variablesifnotos.path.isfile(self.get_output_file_name(state)):self.initialize_output(state)ifavg_vs.average_nitts>0:forkeyinself.output_variables:val=getattr(avg_vs,key)setattr(avg_vs,key,val/avg_vs.average_nitts)self.write_output(state)forkeyinself.output_variables:val=getattr(avg_vs,key)setattr(avg_vs,key,0*val)avg_vs.average_nitts=0