diff --git a/Apps/Regrid_Util.F90 b/Apps/Regrid_Util.F90 index a018d016795..cb7aa8bd839 100644 --- a/Apps/Regrid_Util.F90 +++ b/Apps/Regrid_Util.F90 @@ -171,7 +171,7 @@ subroutine process_command_line(this,rc) if (.not.allocated(this%tripolar_file_out)) then this%tripolar_file_out = "empty" end if - this%regridMethod = get_regrid_method(regridMth) + this%regridMethod = regrid_method_string_to_int(regridMth) _ASSERT(this%regridMethod/=UNSPECIFIED_REGRID_METHOD,"improper regrid method chosen") this%filenames = split_string(cfilenames,',') diff --git a/CHANGELOG.md b/CHANGELOG.md index 74e8b55cd39..55f48c84963 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Renamed `get_regrid_method` and `translate_regrid_method` to `regrid_method_string_to_int` and `regrid_method_int_to_string` + respectively in `RegridMethods.F90`. This was done so we could add `get_regrid_method` to the AbstractRegridder. The new names + more accurately reflect what the RegridMethods functions do. - Changed call to `MAPL_SunOrbitCreate()` inside `MAPL_Generic.F90` to call to new function `MAPL_SunOrbitCreateFromConfig()`, the latter which get the orbital parameters from the MAPL state's Config. In this way no default orbital parameter values need appear in `MAPL_Generic.F90`. @@ -27,8 +30,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed -- Added the correct values to halo corner of LatLon grid +- Added the correct values to halo corner of LatLon grid - Fixed range in halo of LatLonGridFactory +- Corrected issue with native output having metadata saying it was bilinearly regridded. Now sets these files to have + `regrid_method: identity` - Fix bug in `mapl_acg.cmake` that caused unnecessary rebuilds ### Removed diff --git a/base/MAPL_AbstractRegridder.F90 b/base/MAPL_AbstractRegridder.F90 index 30ffeb83017..52aa6364a38 100644 --- a/base/MAPL_AbstractRegridder.F90 +++ b/base/MAPL_AbstractRegridder.F90 @@ -11,7 +11,7 @@ module MAPL_AbstractRegridderMod use, intrinsic :: iso_fortran_env, only: REAL32, REAL64 implicit none private - + public :: AbstractRegridder type, abstract :: AbstractRegridder @@ -29,7 +29,7 @@ module MAPL_AbstractRegridderMod procedure :: get_spec procedure :: set_spec procedure :: isTranspose - + procedure :: regrid_scalar_2d_real32 procedure :: regrid_scalar_2d_real64 procedure :: regrid_scalar_3d_real32 @@ -44,7 +44,7 @@ module MAPL_AbstractRegridderMod ! interfaces. procedure :: regrid_esmf_fields_scalar procedure :: regrid_esmf_fields_vector - + ! Generic overload generic :: regrid => regrid_esmf_fields_scalar generic :: regrid => regrid_esmf_fields_vector @@ -90,6 +90,7 @@ module MAPL_AbstractRegridderMod procedure :: get_undef_value procedure :: clear_undef_value procedure :: has_undef_value + procedure :: get_regrid_method end type AbstractRegridder @@ -105,7 +106,7 @@ subroutine initialize_subclass(this, unusable, rc) class (KeywordEnforcer), optional, intent(in) :: unusable integer, optional, intent(out) :: rc end subroutine initialize_subclass - + end interface character(len=*), parameter :: MOD_NAME = 'MAPL_AbstractRegridder::' @@ -272,7 +273,7 @@ subroutine regrid_esmf_fields_scalar(this, f_in, f_out, rc) type (ESMF_Field), intent(in) :: f_in type (ESMF_Field), intent(in) :: f_out integer, optional, intent(out) :: rc - + character(len=*), parameter :: Iam = MOD_NAME//'regrid_esmf_fields' integer :: rank_in type (ESMF_TypeKind_Flag) :: typekind_in @@ -298,7 +299,7 @@ subroutine regrid_esmf_fields_scalar(this, f_in, f_out, rc) block real(REAL32), pointer :: q_in(:,:), q_out(:,:) - + call ESMF_FieldGet(f_in , 0, q_in, rc=status) _VERIFY(status) call ESMF_FieldGet(f_out , 0, q_out, rc=status) @@ -311,7 +312,7 @@ subroutine regrid_esmf_fields_scalar(this, f_in, f_out, rc) block real(REAL64), pointer :: q_in(:,:), q_out(:,:) - + call ESMF_FieldGet(f_in , 0, q_in, rc=status) _VERIFY(status) call ESMF_FieldGet(f_out , 0, q_out, rc=status) @@ -356,13 +357,13 @@ subroutine regrid_esmf_fields_scalar(this, f_in, f_out, rc) case default ! unsupported type/kind _FAIL( 'unsupported type kind') end select - + case default ! unsupported rank _FAIL( 'unsupported rank') end select _RETURN(_SUCCESS) - + end subroutine regrid_esmf_fields_scalar @@ -377,7 +378,7 @@ subroutine regrid_esmf_fields_vector(this, f_in, f_out, rc) type (ESMF_Field), intent(in) :: f_in(NUM_DIM) type (ESMF_Field), intent(in) :: f_out(NUM_DIM) integer, optional, intent(out) :: rc - + character(len=*), parameter :: Iam = MOD_NAME//'regrid_esmf_fields' integer :: rank_in(NUM_DIM) type (ESMF_TypeKind_Flag) :: typekind_in(NUM_DIM) @@ -413,7 +414,7 @@ subroutine regrid_esmf_fields_vector(this, f_in, f_out, rc) block real(REAL32), pointer :: u_in(:,:), v_in(:,:) real(REAL32), pointer :: u_out(:,:), v_out(:,:) - + call ESMF_FieldGet(f_in(1) , 0, u_in, rc=status) _VERIFY(status) call ESMF_FieldGet(f_in(2) , 0, v_in, rc=status) @@ -431,7 +432,7 @@ subroutine regrid_esmf_fields_vector(this, f_in, f_out, rc) block real(REAL64), pointer :: u_in(:,:), v_in(:,:) real(REAL64), pointer :: u_out(:,:), v_out(:,:) - + call ESMF_FieldGet(f_in(1) , 0, u_in, rc=status) _VERIFY(status) call ESMF_FieldGet(f_in(2) , 0, v_in, rc=status) @@ -455,7 +456,7 @@ subroutine regrid_esmf_fields_vector(this, f_in, f_out, rc) block real(REAL32), pointer :: u_in(:,:,:), v_in(:,:,:) real(REAL32), pointer :: u_out(:,:,:), v_out(:,:,:) - + call ESMF_FieldGet(f_in(1) , 0, u_in, rc=status) _VERIFY(status) call ESMF_FieldGet(f_in(2) , 0, v_in, rc=status) @@ -473,7 +474,7 @@ subroutine regrid_esmf_fields_vector(this, f_in, f_out, rc) block real(REAL64), pointer :: u_in(:,:,:), v_in(:,:,:) real(REAL64), pointer :: u_out(:,:,:), v_out(:,:,:) - + call ESMF_FieldGet(f_in(1) , 0, u_in, rc=status) _VERIFY(status) call ESMF_FieldGet(f_in(2) , 0, v_in, rc=status) @@ -489,19 +490,19 @@ subroutine regrid_esmf_fields_vector(this, f_in, f_out, rc) case default ! unsupported type/kind _FAIL( 'unsupported type-kind') end select - + case default ! unsupported rank _FAIL( 'unsupported rank') end select _RETURN(_SUCCESS) - + end subroutine regrid_esmf_fields_vector ! Begin - transpose interfaces - + subroutine transpose_regrid_scalar_2d_real32(this, q_in, q_out, rc) class (AbstractRegridder), intent(in) :: this real(kind=REAL32), intent(in) :: q_in(:,:) @@ -531,7 +532,7 @@ subroutine transpose_regrid_scalar_2d_real64(this, q_in, q_out, rc) _RETURN(_FAILURE) end subroutine transpose_regrid_scalar_2d_real64 - + subroutine transpose_regrid_scalar_3d_real32(this, q_in, q_out, rc) class (AbstractRegridder), intent(in) :: this real(kind=REAL32), intent(in) :: q_in(:,:,:) @@ -563,7 +564,7 @@ subroutine transpose_regrid_scalar_3d_real64(this, q_in, q_out, rc) end subroutine transpose_regrid_scalar_3d_real64 - + subroutine transpose_regrid_vector_2d_real32(this, u_in, v_in, u_out, v_out, rotate, rc) class (AbstractRegridder), intent(in) :: this real(kind=REAL32), intent(in) :: u_in(:,:) @@ -585,7 +586,7 @@ subroutine transpose_regrid_vector_2d_real32(this, u_in, v_in, u_out, v_out, rot u_out = 0 v_out = 0 _RETURN(_FAILURE) - + end subroutine transpose_regrid_vector_2d_real32 @@ -610,7 +611,7 @@ subroutine transpose_regrid_vector_2d_real64(this, u_in, v_in, u_out, v_out, rot u_out = 0 v_out = 0 _RETURN(_FAILURE) - + end subroutine transpose_regrid_vector_2d_real64 @@ -635,7 +636,7 @@ subroutine transpose_regrid_vector_3d_real32(this, u_in, v_in, u_out, v_out, rot u_out = 0 v_out = 0 _RETURN(_FAILURE) - + end subroutine transpose_regrid_vector_3d_real32 @@ -658,7 +659,7 @@ subroutine transpose_regrid_vector_3d_real64(this, u_in, v_in, u_out, v_out, rc) u_out = 0 v_out = 0 _RETURN(_FAILURE) - + end subroutine transpose_regrid_vector_3d_real64 @@ -672,7 +673,7 @@ subroutine transpose_regrid_esmf_fields_scalar(this, f_in, f_out, rc) type (ESMF_Field), intent(in) :: f_in type (ESMF_Field), intent(in) :: f_out integer, optional, intent(out) :: rc - + character(len=*), parameter :: Iam = MOD_NAME//'transpose_regrid_esmf_fields' integer :: rank_in type (ESMF_TypeKind_Flag) :: typekind_in @@ -698,7 +699,7 @@ subroutine transpose_regrid_esmf_fields_scalar(this, f_in, f_out, rc) block real(REAL32), pointer :: q_in(:,:), q_out(:,:) - + call ESMF_FieldGet(f_in , 0, q_in, rc=status) _VERIFY(status) call ESMF_FieldGet(f_out , 0, q_out, rc=status) @@ -711,7 +712,7 @@ subroutine transpose_regrid_esmf_fields_scalar(this, f_in, f_out, rc) block real(REAL64), pointer :: q_in(:,:), q_out(:,:) - + call ESMF_FieldGet(f_in , 0, q_in, rc=status) _VERIFY(status) call ESMF_FieldGet(f_out , 0, q_out, rc=status) @@ -756,13 +757,13 @@ subroutine transpose_regrid_esmf_fields_scalar(this, f_in, f_out, rc) case default ! unsupported type/kind _FAIL( 'unsupported typekind') end select - + case default ! unsupported rank _FAIL( 'unsupported rank') end select _RETURN(_SUCCESS) - + end subroutine transpose_regrid_esmf_fields_scalar @@ -777,7 +778,7 @@ subroutine transpose_regrid_esmf_fields_vector(this, f_in, f_out, rc) type (ESMF_Field), intent(in) :: f_in(NUM_DIM) type (ESMF_Field), intent(in) :: f_out(NUM_DIM) integer, optional, intent(out) :: rc - + character(len=*), parameter :: Iam = MOD_NAME//'transpose_regrid_esmf_fields' integer :: rank_in(NUM_DIM) type (ESMF_TypeKind_Flag) :: typekind_in(NUM_DIM) @@ -813,7 +814,7 @@ subroutine transpose_regrid_esmf_fields_vector(this, f_in, f_out, rc) block real(REAL32), pointer :: u_in(:,:), v_in(:,:) real(REAL32), pointer :: u_out(:,:), v_out(:,:) - + call ESMF_FieldGet(f_in(1) , 0, u_in, rc=status) _VERIFY(status) call ESMF_FieldGet(f_in(2) , 0, v_in, rc=status) @@ -831,7 +832,7 @@ subroutine transpose_regrid_esmf_fields_vector(this, f_in, f_out, rc) block real(REAL64), pointer :: u_in(:,:), v_in(:,:) real(REAL64), pointer :: u_out(:,:), v_out(:,:) - + call ESMF_FieldGet(f_in(1) , 0, u_in, rc=status) _VERIFY(status) call ESMF_FieldGet(f_in(2) , 0, v_in, rc=status) @@ -855,7 +856,7 @@ subroutine transpose_regrid_esmf_fields_vector(this, f_in, f_out, rc) block real(REAL32), pointer :: u_in(:,:,:), v_in(:,:,:) real(REAL32), pointer :: u_out(:,:,:), v_out(:,:,:) - + call ESMF_FieldGet(f_in(1) , 0, u_in, rc=status) _VERIFY(status) call ESMF_FieldGet(f_in(2) , 0, v_in, rc=status) @@ -873,7 +874,7 @@ subroutine transpose_regrid_esmf_fields_vector(this, f_in, f_out, rc) block real(REAL64), pointer :: u_in(:,:,:), v_in(:,:,:) real(REAL64), pointer :: u_out(:,:,:), v_out(:,:,:) - + call ESMF_FieldGet(f_in(1) , 0, u_in, rc=status) _VERIFY(status) call ESMF_FieldGet(f_in(2) , 0, v_in, rc=status) @@ -889,13 +890,13 @@ subroutine transpose_regrid_esmf_fields_vector(this, f_in, f_out, rc) case default ! unsupported type/kind _FAIL( 'unsupported typekind') end select - + case default ! unsupported rank _FAIL( 'unsupported rank') end select _RETURN(_SUCCESS) - + end subroutine transpose_regrid_esmf_fields_vector @@ -940,7 +941,7 @@ function get_spec(this) result(spec) class (AbstractRegridder), intent(in) :: this spec = this%spec end function get_spec - + subroutine set_spec(this, spec) class(AbstractRegridder), intent(inout) :: this type(RegridderSpec), intent(in) :: spec @@ -974,7 +975,7 @@ subroutine initialize_base(this, spec, unusable, rc) _RETURN(_SUCCESS) end subroutine initialize_base - + function clone(this) class (AbstractRegridder), allocatable :: clone class (AbstractRegridder), intent(in) :: this @@ -1000,4 +1001,9 @@ logical function supports(spec, unusable, rc) end function supports + integer function get_regrid_method(this) result(method) + class (AbstractRegridder), intent(in) :: this + method = this%spec%regrid_method + end function get_regrid_method + end module MAPL_AbstractRegridderMod diff --git a/base/MAPL_IdentityRegridder.F90 b/base/MAPL_IdentityRegridder.F90 index c3514f4b59f..7b70900892d 100644 --- a/base/MAPL_IdentityRegridder.F90 +++ b/base/MAPL_IdentityRegridder.F90 @@ -8,7 +8,7 @@ module MAPL_IdentityRegridderMod use mapl_ErrorHandlingMod use mapl_RegridMethods use ESMF - + use, intrinsic :: iso_fortran_env, only: REAL32 use, intrinsic :: iso_fortran_env, only: REAL64 implicit none @@ -38,15 +38,23 @@ module MAPL_IdentityRegridderMod character(len=*), parameter :: MOD_NAME = 'MAPL_IdentityRegridder::' type (IdentityRegridder), save, target :: singleton - + contains function identity_regridder() result(regridder) use ESMF type (IdentityRegridder), pointer :: regridder + type (RegridderSpec) :: spec regridder => singleton + + ! Due to how MAPL is set up, the default regrid_method is + ! bilinear. But if an identity regridder is requested, we + ! want to reflect that in the metadata by updating the spec. + spec = regridder%get_spec() + spec%regrid_method = REGRID_METHOD_IDENTITY + call regridder%set_spec(spec) end function identity_regridder @@ -63,7 +71,7 @@ subroutine regrid_scalar_2d_real32(this, q_in, q_out, rc) q_out = q_in _RETURN(_SUCCESS) - + end subroutine regrid_scalar_2d_real32 @@ -85,7 +93,7 @@ subroutine regrid_scalar_3d_real32(this, q_in, q_out, rc) q_out = q_in _RETURN(_SUCCESS) - + end subroutine regrid_scalar_3d_real32 subroutine regrid_vector_2d_real32(this, u_in, v_in, u_out, v_out, rotate, rc) @@ -169,5 +177,5 @@ subroutine initialize_subclass(this, unusable, rc) _UNUSED_DUMMY(rc) end subroutine initialize_subclass - + end module MAPL_IdentityRegridderMod diff --git a/base/RegridMethods.F90 b/base/RegridMethods.F90 index 0253ab89305..33e8d23c394 100644 --- a/base/RegridMethods.F90 +++ b/base/RegridMethods.F90 @@ -18,8 +18,8 @@ module mapl_RegridMethods public :: REGRID_METHOD_CONSERVE_HFLUX public :: UNSPECIFIED_REGRID_METHOD public :: TILING_METHODS - public :: get_regrid_method - public :: translate_regrid_method + public :: regrid_method_string_to_int + public :: regrid_method_int_to_string enum, bind(c) enumerator :: REGRID_METHOD_IDENTITY @@ -41,7 +41,7 @@ module mapl_RegridMethods contains - function get_regrid_method(string_regrid_method) result(int_regrid_method) + function regrid_method_string_to_int(string_regrid_method) result(int_regrid_method) integer :: int_regrid_method character(len=*), intent(in) :: string_regrid_method @@ -78,7 +78,7 @@ function get_regrid_method(string_regrid_method) result(int_regrid_method) end select end function - function translate_regrid_method(int_regrid_method) result(string_regrid_method) + function regrid_method_int_to_string(int_regrid_method) result(string_regrid_method) integer, intent(in) :: int_regrid_method character(len=:), allocatable :: string_regrid_method diff --git a/base/RegridderSpec.F90 b/base/RegridderSpec.F90 index 0b7ca5ce385..f106fb19ac2 100644 --- a/base/RegridderSpec.F90 +++ b/base/RegridderSpec.F90 @@ -10,7 +10,7 @@ module mapl_RegridderSpec implicit none private - + public :: RegridderSpec type :: RegridderSpec @@ -25,7 +25,7 @@ module mapl_RegridderSpec procedure :: less_than generic :: operator (<) => less_than end type RegridderSpec - + interface RegridderSpec module procedure newRegridderSpec @@ -109,7 +109,7 @@ logical function less_than(a, b) integer (kind=INT64) :: a_out_id, b_out_id integer :: a_esmf_method, b_esmf_method - + select case (a%regrid_method) case (REGRID_METHOD_CONSERVE, REGRID_METHOD_VOTE, REGRID_METHOD_FRACTION) a_esmf_method = REGRID_METHOD_CONSERVE @@ -141,7 +141,7 @@ logical function less_than(a, b) less_than = .true. return end if - + a_out_id = get_factory_id(a%grid_out) b_out_id = get_factory_id(b%grid_out) if (a_out_id > b_out_id) then @@ -154,7 +154,7 @@ logical function less_than(a, b) less_than = .false. return - + end function less_than end module MAPL_RegridderSpec diff --git a/gridcomps/ExtData2G/ExtDataOldTypesCreator.F90 b/gridcomps/ExtData2G/ExtDataOldTypesCreator.F90 index 6c78d49c06f..f84d2936eaf 100644 --- a/gridcomps/ExtData2G/ExtDataOldTypesCreator.F90 +++ b/gridcomps/ExtData2G/ExtDataOldTypesCreator.F90 @@ -54,7 +54,7 @@ function new_ExtDataOldTypesCreator(config_file,current_time,unusable,rc ) resul _RETURN(_SUCCESS) end function new_ExtDataOldTypesCreator - + subroutine fillin_primary(this,item_name,base_name,primary_item,time,clock,unusable,rc) class(ExtDataOldTypesCreator), intent(inout) :: this character(len=*), intent(in) :: item_name @@ -77,7 +77,7 @@ subroutine fillin_primary(this,item_name,base_name,primary_item,time,clock,unusa _UNUSED_DUMMY(unusable) rule => this%rule_map%at(trim(item_name)) time_sample => this%sample_map%at(rule%sample_key) - + if(.not.associated(time_sample)) then call default_time_sample%set_defaults() time_sample=>default_time_sample @@ -106,14 +106,14 @@ subroutine fillin_primary(this,item_name,base_name,primary_item,time,clock,unusa primary_item%fileVars%itemType = ItemTypeScalar primary_item%fileVars%xname = trim(rule%file_var) end if - + ! regrid method if (index(rule%regrid_method,"FRACTION;")>0) then semi_pos = index(rule%regrid_method,";") read(rule%regrid_method(semi_pos+1:),*) primary_item%fracVal primary_item%trans = REGRID_METHOD_FRACTION else - primary_item%trans = get_regrid_method(rule%regrid_method) + primary_item%trans = regrid_method_string_to_int(rule%regrid_method) end if _ASSERT(primary_item%trans/=UNSPECIFIED_REGRID_METHOD,"improper regrid method chosen") @@ -131,7 +131,7 @@ subroutine fillin_primary(this,item_name,base_name,primary_item,time,clock,unusa call primary_item%update_freq%create_from_parameters(time_sample%refresh_time, & time_sample%refresh_frequency, time_sample%refresh_offset, time, clock, _RC) - disable_interpolation = .not.time_sample%time_interpolation + disable_interpolation = .not.time_sample%time_interpolation exact = time_sample%exact call primary_item%modelGridFields%comp1%set_parameters(linear_trans=rule%linear_trans,disable_interpolation=disable_interpolation,exact=exact) @@ -185,7 +185,7 @@ subroutine fillin_derived(this,item_name,derived_item,time,clock,unusable,rc) _UNUSED_DUMMY(unusable) rule => this%derived_map%at(trim(item_name)) - + derived_item%name = trim(item_name) derived_item%expression = rule%expression if (allocated(rule%sample_key)) then @@ -204,7 +204,7 @@ subroutine fillin_derived(this,item_name,derived_item,time,clock,unusable,rc) end if _RETURN(_SUCCESS) - + end subroutine fillin_derived end module MAPL_ExtDataOldTypesCreator diff --git a/gridcomps/History/MAPL_HistoryGridComp.F90 b/gridcomps/History/MAPL_HistoryGridComp.F90 index 8ec9f57c8f3..b5a5e179ba4 100644 --- a/gridcomps/History/MAPL_HistoryGridComp.F90 +++ b/gridcomps/History/MAPL_HistoryGridComp.F90 @@ -931,7 +931,7 @@ subroutine Initialize ( gc, import, dumexport, clock, rc ) call ESMF_ConfigGetAttribute ( cfg, regrid_method, default="REGRID_METHOD_BILINEAR", & label=trim(string) // 'regrid_method:' ,rc=status ) _VERIFY(STATUS) - list(n)%regrid_method = get_regrid_method(trim(regrid_method)) + list(n)%regrid_method = regrid_method_string_to_int(trim(regrid_method)) end if ! Get an optional file containing a 1-D track for the output diff --git a/griddedio/GriddedIO.F90 b/griddedio/GriddedIO.F90 index 351fcbda73d..a875388e015 100644 --- a/griddedio/GriddedIO.F90 +++ b/griddedio/GriddedIO.F90 @@ -142,6 +142,13 @@ subroutine CreateFileMetaData(this,items,bundle,timeInfo,vdata,ogrid,global_attr end if this%regrid_handle => new_regridder_manager%make_regridder(input_grid,this%output_grid,this%regrid_method,rc=status) _VERIFY(status) + + ! We get the regrid_method here because in the case of Identity, we set it to + ! REGRID_METHOD_IDENTITY in the regridder constructor if identity. Now we need + ! to change the regrid_method in the GriddedIO object to be the same as the + ! the regridder object. + this%regrid_method = this%regrid_handle%get_regrid_method() + call ESMF_FieldBundleSet(this%output_bundle,grid=this%output_grid,rc=status) _VERIFY(status) factory => get_factory(this%output_grid,rc=status) @@ -366,7 +373,7 @@ subroutine CreateVariable(this,itemName,rc) call v%add_attribute('add_offset',0.0) call v%add_attribute('_FillValue',MAPL_UNDEF) call v%add_attribute('valid_range',(/-MAPL_UNDEF,MAPL_UNDEF/)) - call v%add_attribute('regrid_method', translate_regrid_method(this%regrid_method)) + call v%add_attribute('regrid_method', regrid_method_int_to_string(this%regrid_method)) call factory%append_variable_metadata(v) call this%metadata%add_variable(trim(varName),v,rc=status) _VERIFY(status)