Skip to content

Commit

Permalink
a unit test for FieldSet concatenation
Browse files Browse the repository at this point in the history
  • Loading branch information
sbrdar committed Sep 7, 2023
1 parent 67600f3 commit 9a03a35
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 17 deletions.
10 changes: 7 additions & 3 deletions src/atlas/field/FieldSet.cc
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,12 @@ Field FieldSetImpl::add(const Field& field) {
return field;
}

void FieldSetImpl::add_fieldset(const FieldSet& fieldset) {
for( auto& field : fieldset) {
add(field);
}
}

bool FieldSetImpl::has(const std::string& name) const {
return index_.count(name);
}
Expand Down Expand Up @@ -173,9 +179,7 @@ void atlas__FieldSet__add_field(FieldSetImpl* This, FieldImpl* field) {
void atlas__FieldSet__add_fieldset(FieldSetImpl* This, FieldSetImpl* fieldset) {
ATLAS_ASSERT(This != nullptr, "Reason: Use of uninitialised atlas_FieldSet");
ATLAS_ASSERT(fieldset != nullptr, "Reason: Use of uninitialised atlas_FieldSet");
for(int i = 0; i < fieldset->size(); i++) {
This->add(fieldset->operator[](i));
}
This->add_fieldset(fieldset);
}

int atlas__FieldSet__has_field(const FieldSetImpl* This, char* name) {
Expand Down
2 changes: 2 additions & 0 deletions src/atlas/field/FieldSet.h
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ class FieldSetImpl : public util::Object {
std::vector<std::string> field_names() const;

Field add(const Field&);
void add_fieldset(const FieldSet& fieldset);

bool has(const std::string& name) const;

Expand Down Expand Up @@ -238,6 +239,7 @@ class FieldSet : DOXYGEN_HIDE(public util::ObjectHandle<field::FieldSetImpl>) {
std::vector<std::string> field_names() const { return get()->field_names(); }

Field add(const Field& field) { return get()->add(field); }
void add_fieldset(const FieldSet& fieldset) { return get()->add_fieldset(fieldset); }

bool has(const std::string& name) const { return get()->has(name); }

Expand Down
34 changes: 20 additions & 14 deletions src/tests/field/fctest_multifield_ifs.F90
Original file line number Diff line number Diff line change
Expand Up @@ -42,34 +42,40 @@ module fcta_MultiField_fixture
TEST( test_multifield )
implicit none

type(atlas_MultiField) :: mfield
type(atlas_config) :: config
type(atlas_MultiField) :: multifield
type(atlas_FieldSet) :: fieldset_1, fieldset_2
type(atlas_Field) :: field
type(atlas_config) :: config

integer, parameter :: nvar = 5;
integer, parameter :: nproma = 16;
integer, parameter :: nlev = 100;
integer, parameter :: ngptot = 2000;
type(atlas_Config), dimension(5) :: field_configs
character(len=12), parameter, dimension(nvar) :: var_names = (/ &
"temperature ", "pressure ", "density ", "clv ", "wind_u " &
/)

integer :: ivar

config = atlas_Config()
call config%set("type", "MultiFieldCreatorIFS");
call config%set("ngptot", ngptot);
call config%set("nproma", nproma);
call config%set("nlev", nlev);
call config%set("datatype", "real64");
field_configs(1) = atlas_Config()
field_configs(2) = atlas_Config()
field_configs(3) = atlas_Config()
field_configs(4) = atlas_Config()
field_configs(5) = atlas_Config()
call field_configs(1)%set("name", "temperature")
call field_configs(2)%set("name", "pressure")
call field_configs(3)%set("name", "density")
call field_configs(4)%set("name", "clv")
call field_configs(4)%set("nvar", 5)
call field_configs(5)%set("name", "wind_u")
do ivar = 1, 5
field_configs(ivar) = atlas_Config()
call field_configs(ivar)%set("name", trim(var_names(ivar)))
end do
call field_configs(4)%set("nvar", 5) ! clv has five subvariables
call config%set("fields", field_configs)

mfield = atlas_MultiField(config)
multifield = atlas_MultiField(config)

fieldset_1 = multifield%fieldset()
call fieldset_2%add(fieldset_1)
field = fieldset_2%field("density")
END_TEST

! -----------------------------------------------------------------------------
Expand Down
15 changes: 15 additions & 0 deletions src/tests/field/test_fieldset.cc
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,22 @@ CASE("test_rename") {
EXPECT(!fieldset.has("field_1"));
EXPECT_EQ(fieldset.field(1).name(),std::string(""));
EXPECT(fieldset.has("[1]"));
}

CASE("test_fieldset_concatenation") {
FieldSet fieldset_1;
FieldSet fieldset_2;
auto field_1 = fieldset_1.add(Field("0", make_datatype<double>(), array::make_shape(10,4)));
auto field_1_v = array::make_view<double,2>(field_1);
field_1_v(1,1) = 2.;

fieldset_2.add_fieldset(fieldset_1);
auto field_2 = fieldset_2.field("0");
field_2.rename("");
auto field_2_v = array::make_view<double,2>(field_2);
field_2_v(1,1) = 1.;

EXPECT_EQ( field_1_v(1,1), 1.);
}

//-----------------------------------------------------------------------------
Expand Down

0 comments on commit 9a03a35

Please sign in to comment.