Skip to content

Commit 8eb753f

Browse files
committed
Mostly error handling updates:
- Account for utilization of error handler module in recent PRs - Utilize error handler in VertCoord test - Update read of InitVertCoord stream to print warnings to log and use default values when minLevelCell or maxLevelCell are not present in mesh file, and call ABORT_ERROR if bottomDepth is not present
1 parent 884e211 commit 8eb753f

File tree

2 files changed

+118
-145
lines changed

2 files changed

+118
-145
lines changed

components/omega/src/ocn/VertCoord.cpp

Lines changed: 86 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,14 @@ VertCoord::VertCoord(const std::string &Name_, //< [in] Name for new VertCoord
5858
MeshFileName = Decomp->MeshFileName;
5959

6060
// Open the mesh file for reading (assume IO has already been initialized)
61-
I4 Err;
62-
Err = IO::openFile(MeshFileID, MeshFileName, IO::ModeRead);
61+
IO::openFile(MeshFileID, MeshFileName, IO::ModeRead);
6362

6463
// Set NVertLayers and NVertLayersP1 and create the vertical dimensions
64+
Error Err; // Error code
6565
I4 NVertLayersID;
6666
Err = IO::getDimFromFile(MeshFileID, "nVertLevels", NVertLayersID,
6767
NVertLayers);
68-
if (Err != 0) {
68+
if (!Err.isSuccess()) {
6969
LOG_WARN("VertCoord: error reading nVertLevels from mesh file, "
7070
"using NVertLayers = 1");
7171
NVertLayers = 1;
@@ -134,28 +134,70 @@ void VertCoord::completeSetup(Config *Options //< [in] configuration options
134134
// Define field metadata
135135
defineFields();
136136

137-
// Fill with default values + 1 in case arrays are not present in mesh file
138-
deepCopy(MinLayerCell, 1);
139-
deepCopy(MaxLayerCell, NVertLayers);
137+
I4 FillValueI4 = -1;
138+
Real FillValueReal = -999._Real;
139+
140+
deepCopy(MinLayerCell, FillValueI4);
141+
deepCopy(MaxLayerCell, FillValueI4);
142+
deepCopy(BottomDepth, FillValueReal);
143+
144+
OMEGA_SCOPE(LocMinLayerCell, MinLayerCell);
145+
OMEGA_SCOPE(LocMaxLayerCell, MaxLayerCell);
146+
OMEGA_SCOPE(LocBottomDepth, BottomDepth);
140147

141148
// Fetch input stream and validate
142149
std::string StreamName = "InitialVertCoord";
150+
if (Name != "Default") {
151+
StreamName.append(Name);
152+
}
143153

144154
auto VCoordStream = IOStream::get(StreamName);
145155

146156
bool IsValidated = VCoordStream->validate();
147157

148158
// Read InitialVertCoord stream
149-
I4 Err;
159+
Error Err; // Error code
150160
if (IsValidated) {
151161
Err = IOStream::read(StreamName);
162+
if (!Err.isSuccess()) {
163+
LOG_WARN("VertCoord: Error reading {} stream", StreamName);
164+
I4 Sum1 = 0;
165+
parallelReduce(
166+
{MinLayerCell.extent_int(0)},
167+
KOKKOS_LAMBDA(int I, int &Accum) { Accum += LocMinLayerCell(I); },
168+
Sum1);
169+
if (Sum1 < 0) {
170+
LOG_WARN("VertCoord: Error reading minLevelCell from {}, "
171+
"using MinLayerCell = 0",
172+
StreamName);
173+
deepCopy(MinLayerCell, 1);
174+
}
175+
I4 Sum2 = 0;
176+
parallelReduce(
177+
{MaxLayerCell.extent_int(0)},
178+
KOKKOS_LAMBDA(int I, int &Accum) { Accum += LocMaxLayerCell(I); },
179+
Sum2);
180+
if (Sum2 < 0) {
181+
LOG_WARN("VertCoord: Error reading maxLevelCell from {}, "
182+
"using MaxLayerCell = NVertLayers - 1",
183+
StreamName);
184+
deepCopy(MaxLayerCell, NVertLayers);
185+
}
186+
Real Sum3 = 0.;
187+
parallelReduce(
188+
{BottomDepth.extent_int(0)},
189+
KOKKOS_LAMBDA(int I, Real &Accum) { Accum += LocBottomDepth(I); },
190+
Sum3);
191+
if (Sum3 < 0.) {
192+
ABORT_ERROR("VertCoord: Error reading bottomDepth from {}",
193+
StreamName);
194+
}
195+
}
152196
} else {
153197
ABORT_ERROR("Error validating IO stream {}", StreamName);
154198
}
155199

156200
// Subtract 1 to convert to zero-based indexing
157-
OMEGA_SCOPE(LocMinLayerCell, MinLayerCell);
158-
OMEGA_SCOPE(LocMaxLayerCell, MaxLayerCell);
159201
parallelFor(
160202
{NCellsAll}, KOKKOS_LAMBDA(int ICell) {
161203
LocMinLayerCell(ICell) -= 1;
@@ -174,15 +216,14 @@ void VertCoord::completeSetup(Config *Options //< [in] configuration options
174216
MinLayerCellH = createHostMirrorCopy(MinLayerCell);
175217
BottomDepthH = createHostMirrorCopy(BottomDepth);
176218

177-
Error Err1;
178-
179219
// Fetch reference desnity from Config
180220
Config TendConfig("Tendencies");
181-
Err1 += Options->get(TendConfig);
182-
CHECK_ERROR_ABORT(Err1, "VertCoord: Tendencies group not found in Config");
221+
Err.reset();
222+
Err += Options->get(TendConfig);
223+
CHECK_ERROR_ABORT(Err, "VertCoord: Tendencies group not found in Config");
183224

184-
Err1 += TendConfig.get("Density0", Rho0);
185-
CHECK_ERROR_ABORT(Err1, "VertCoord: Density0 not found in TendConfig");
225+
Err += TendConfig.get("Density0", Rho0);
226+
CHECK_ERROR_ABORT(Err, "VertCoord: Density0 not found in TendConfig");
186227

187228
} // end completeSetup
188229

@@ -213,8 +254,6 @@ VertCoord::create(const std::string &Name, // [in] name for new VertCoord
213254
// Define IO fields and metadata
214255
void VertCoord::defineFields() {
215256

216-
I4 Err = 0; // default error code
217-
218257
// Set field names (append Name if not default)
219258
MinLayerCellFldName = "MinLevelCell";
220259
MaxLayerCellFldName = "MaxLevelCell";
@@ -368,28 +407,13 @@ void VertCoord::defineFields() {
368407
}
369408
auto InitVCoordGroup = FieldGroup::create(InitGroupName);
370409

371-
Err = InitVCoordGroup->addField(MinLayerCellFldName);
372-
if (Err != 0)
373-
LOG_ERROR("Error adding {} to field group {}", MinLayerCellFldName,
374-
InitGroupName);
375-
Err = InitVCoordGroup->addField(MaxLayerCellFldName);
376-
if (Err != 0)
377-
LOG_ERROR("Error adding {} to field group {}", MaxLayerCellFldName,
378-
InitGroupName);
379-
Err = InitVCoordGroup->addField(BottomDepthFldName);
380-
if (Err != 0)
381-
LOG_ERROR("Error adding {} to field group {}", BottomDepthFldName,
382-
InitGroupName);
383-
384-
Err = MinLayerCellField->attachData<Array1DI4>(MinLayerCell);
385-
if (Err != 0)
386-
LOG_ERROR("Error attaching data array to field {}", MinLayerCellFldName);
387-
Err = MaxLayerCellField->attachData<Array1DI4>(MaxLayerCell);
388-
if (Err != 0)
389-
LOG_ERROR("Error attaching data array to field {}", MaxLayerCellFldName);
390-
Err = BottomDepthField->attachData<Array1DReal>(BottomDepth);
391-
if (Err != 0)
392-
LOG_ERROR("Error attaching data array to field {}", BottomDepthFldName);
410+
InitVCoordGroup->addField(MinLayerCellFldName);
411+
InitVCoordGroup->addField(MaxLayerCellFldName);
412+
InitVCoordGroup->addField(BottomDepthFldName);
413+
414+
MinLayerCellField->attachData<Array1DI4>(MinLayerCell);
415+
MaxLayerCellField->attachData<Array1DI4>(MaxLayerCell);
416+
BottomDepthField->attachData<Array1DReal>(BottomDepth);
393417

394418
// Create a field group for VertCoord fields
395419
GroupName = "VertCoord";
@@ -398,95 +422,42 @@ void VertCoord::defineFields() {
398422
}
399423
auto VCoordGroup = FieldGroup::create(GroupName);
400424

401-
Err = VCoordGroup->addField(PressInterfFldName);
402-
if (Err != 0)
403-
LOG_ERROR("Error adding {} to field group {}", PressInterfFldName,
404-
GroupName);
405-
Err = VCoordGroup->addField(PressMidFldName);
406-
if (Err != 0)
407-
LOG_ERROR("Error adding {} to field group {}", PressMidFldName,
408-
GroupName);
409-
Err = VCoordGroup->addField(ZInterfFldName);
410-
if (Err != 0)
411-
LOG_ERROR("Error adding {} to field group {}", ZInterfFldName, GroupName);
412-
Err = VCoordGroup->addField(ZMidFldName);
413-
if (Err != 0)
414-
LOG_ERROR("Error adding {} to field group {}", ZMidFldName, GroupName);
415-
Err = VCoordGroup->addField(GeopotFldName);
416-
if (Err != 0)
417-
LOG_ERROR("Error adding {} to field group {}", GeopotFldName, GroupName);
418-
Err = VCoordGroup->addField(LyrThickTargetFldName);
419-
if (Err != 0)
420-
LOG_ERROR("Error adding {} to field group {}", LyrThickTargetFldName,
421-
GroupName);
425+
VCoordGroup->addField(PressInterfFldName);
426+
VCoordGroup->addField(PressMidFldName);
427+
VCoordGroup->addField(ZInterfFldName);
428+
VCoordGroup->addField(ZMidFldName);
429+
VCoordGroup->addField(GeopotFldName);
430+
VCoordGroup->addField(LyrThickTargetFldName);
422431

423432
// Associate Field with data
424-
Err = PressureInterfaceField->attachData<Array2DReal>(PressureInterface);
425-
if (Err != 0)
426-
LOG_ERROR("Error attaching data array to field {}", PressInterfFldName);
427-
Err = PressureMidField->attachData<Array2DReal>(PressureMid);
428-
if (Err != 0)
429-
LOG_ERROR("Error attaching data array to field {}", PressMidFldName);
430-
Err = ZInterfaceField->attachData<Array2DReal>(ZInterface);
431-
if (Err != 0)
432-
LOG_ERROR("Error attaching data array to field {}", ZInterfFldName);
433-
Err = ZMidField->attachData<Array2DReal>(ZMid);
434-
if (Err != 0)
435-
LOG_ERROR("Error attaching data array to field {}", ZMidFldName);
436-
Err = GeopotentialMidField->attachData<Array2DReal>(GeopotentialMid);
437-
if (Err != 0)
438-
LOG_ERROR("Error attaching data array to field {}", GeopotFldName);
439-
Err =
440-
LayerThicknessTargetField->attachData<Array2DReal>(LayerThicknessTarget);
441-
if (Err != 0)
442-
LOG_ERROR("Error attaching data array to field {}",
443-
LyrThickTargetFldName);
433+
PressureInterfaceField->attachData<Array2DReal>(PressureInterface);
434+
PressureMidField->attachData<Array2DReal>(PressureMid);
435+
ZInterfaceField->attachData<Array2DReal>(ZInterface);
436+
ZMidField->attachData<Array2DReal>(ZMid);
437+
GeopotentialMidField->attachData<Array2DReal>(GeopotentialMid);
438+
LayerThicknessTargetField->attachData<Array2DReal>(LayerThicknessTarget);
444439

445440
} // end defineFields
446441

447442
//------------------------------------------------------------------------------
448443
// Destroys a local VertCoord and deallocates all arrays
449444
VertCoord::~VertCoord() {
450445

451-
int Err;
452-
453446
if (FieldGroup::exists(InitGroupName)) {
454-
Err = Field::destroy(MinLayerCellFldName);
455-
if (Err != 0)
456-
LOG_ERROR("Error removing Field {}", MinLayerCellFldName);
457-
Err = Field::destroy(MaxLayerCellFldName);
458-
if (Err != 0)
459-
LOG_ERROR("Error removing Field {}", MaxLayerCellFldName);
460-
Err = Field::destroy(BottomDepthFldName);
461-
if (Err != 0)
462-
LOG_ERROR("Error removing Field {}", BottomDepthFldName);
463-
Err = FieldGroup::destroy(InitGroupName);
464-
if (Err != 0)
465-
LOG_ERROR("Error removing FieldGroup {}", InitGroupName);
447+
Field::destroy(MinLayerCellFldName);
448+
Field::destroy(MaxLayerCellFldName);
449+
Field::destroy(BottomDepthFldName);
450+
FieldGroup::destroy(InitGroupName);
466451
}
467452

468453
if (FieldGroup::exists(GroupName)) {
469-
Err = Field::destroy(PressInterfFldName);
470-
if (Err != 0)
471-
LOG_ERROR("Error removing Field {}", PressInterfFldName);
472-
Err = Field::destroy(PressMidFldName);
473-
if (Err != 0)
474-
LOG_ERROR("Error removing Field {}", PressMidFldName);
475-
Err = Field::destroy(ZInterfFldName);
476-
if (Err != 0)
477-
LOG_ERROR("Error removing Field {}", ZInterfFldName);
478-
Err = Field::destroy(ZMidFldName);
479-
if (Err != 0)
480-
LOG_ERROR("Error removing Field {}", ZMidFldName);
481-
Err = Field::destroy(GeopotFldName);
482-
if (Err != 0)
483-
LOG_ERROR("Error removing Field {}", GeopotFldName);
484-
Err = Field::destroy(LyrThickTargetFldName);
485-
if (Err != 0)
486-
LOG_ERROR("Error removing Field {}", LyrThickTargetFldName);
487-
Err = FieldGroup::destroy(GroupName);
488-
if (Err != 0)
489-
LOG_ERROR("Error removing FieldGroup {}", GroupName);
454+
Field::destroy(PressInterfFldName);
455+
Field::destroy(PressMidFldName);
456+
Field::destroy(ZInterfFldName);
457+
Field::destroy(ZMidFldName);
458+
Field::destroy(GeopotFldName);
459+
Field::destroy(LyrThickTargetFldName);
460+
FieldGroup::destroy(GroupName);
490461
}
491462

492463
} // end destructor

0 commit comments

Comments
 (0)