@@ -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
214255void 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
449444VertCoord::~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