Mesh Oriented datABase  (version 5.6.0)
An array-based unstructured mesh library
moab::ScdNCWriteHelper Class Reference

Child helper class for scd mesh, e.g. CAM_EL or CAM_FV. More...

#include <NCWriteHelper.hpp>

+ Inheritance diagram for moab::ScdNCWriteHelper:
+ Collaboration diagram for moab::ScdNCWriteHelper:

Public Member Functions

 ScdNCWriteHelper (WriteNC *writeNC, int fileId, const FileOptions &opts, EntityHandle fileSet)
 
virtual ~ScdNCWriteHelper ()
 
- Public Member Functions inherited from moab::NCWriteHelper
 NCWriteHelper (WriteNC *writeNC, int fileId, const FileOptions &opts, EntityHandle fileSet)
 
virtual ~NCWriteHelper ()
 
ErrorCode init_file (std::vector< std::string > &var_names, std::vector< std::string > &desired_names, bool _append)
 Initialize file: this is where all defines are done The VarData dimension ids are filled up after define. More...
 
ErrorCode write_values (std::vector< std::string > &var_names, std::vector< int > &tstep_nums)
 Take the info from VarData and write first non-set variables, then set variables. More...
 

Protected Attributes

int lDims [6]
 Dimensions of my local part of grid. More...
 
int lCDims [6]
 Center dimensions of my local part of grid. More...
 
- Protected Attributes inherited from moab::NCWriteHelper
WriteNC_writeNC
 Allow NCWriteHelper to directly access members of WriteNC. More...
 
int _fileId
 Cache some information from WriteNC. More...
 
const FileOptions_opts
 
EntityHandle _fileSet
 
int nTimeSteps
 Dimensions of time and level. More...
 
int nLevels
 
int tDim
 Dimension numbers for time and level. More...
 
int levDim
 
Range localCellsOwned
 Local owned cells, edges and vertices. More...
 
Range localEdgesOwned
 
Range localVertsOwned
 
std::vector< double > timeStepVals
 Time values of output timesteps. More...
 

Private Member Functions

virtual ErrorCode collect_mesh_info ()
 Implementation of NCWriteHelper::collect_mesh_info() More...
 
virtual ErrorCode collect_variable_data (std::vector< std::string > &var_names, std::vector< int > &tstep_nums)
 Collect data for specified variables. More...
 
virtual ErrorCode write_nonset_variables (std::vector< WriteNC::VarData > &vdatas, std::vector< int > &tstep_nums)
 Implementation of NCWriteHelper::write_nonset_variables() More...
 
template<typename T >
void jik_to_kji (size_t ni, size_t nj, size_t nk, T *dest, T *source)
 

Additional Inherited Members

- Static Public Member Functions inherited from moab::NCWriteHelper
static NCWriteHelperget_nc_helper (WriteNC *writeNC, int fileId, const FileOptions &opts, EntityHandle fileSet)
 Get appropriate helper instance for WriteNC class based on some info in the file set. More...
 

Detailed Description

Child helper class for scd mesh, e.g. CAM_EL or CAM_FV.

Definition at line 81 of file NCWriteHelper.hpp.

Constructor & Destructor Documentation

◆ ScdNCWriteHelper()

moab::ScdNCWriteHelper::ScdNCWriteHelper ( WriteNC writeNC,
int  fileId,
const FileOptions opts,
EntityHandle  fileSet 
)
inline

Definition at line 84 of file NCWriteHelper.hpp.

85  : NCWriteHelper( writeNC, fileId, opts, fileSet )
86  {
87  for( unsigned int i = 0; i < 6; i++ )
88  {
89  lDims[i] = -1;
90  lCDims[i] = -1;
91  }
92  }

References lCDims, and lDims.

◆ ~ScdNCWriteHelper()

virtual moab::ScdNCWriteHelper::~ScdNCWriteHelper ( )
inlinevirtual

Definition at line 93 of file NCWriteHelper.hpp.

93 {}

Member Function Documentation

◆ collect_mesh_info()

ErrorCode moab::ScdNCWriteHelper::collect_mesh_info ( )
privatevirtual

Implementation of NCWriteHelper::collect_mesh_info()

Implements moab::NCWriteHelper.

Definition at line 594 of file NCWriteHelper.cpp.

595 {
596  Interface*& mbImpl = _writeNC->mbImpl;
597  std::vector< std::string >& dimNames = _writeNC->dimNames;
598  std::vector< int >& dimLens = _writeNC->dimLens;
599 
600  // Look for time dimension
601  std::vector< std::string >::iterator vecIt;
602  if( ( vecIt = std::find( dimNames.begin(), dimNames.end(), "time" ) ) != dimNames.end() )
603  tDim = vecIt - dimNames.begin();
604  else if( ( vecIt = std::find( dimNames.begin(), dimNames.end(), "t" ) ) != dimNames.end() )
605  tDim = vecIt - dimNames.begin();
606  else
607  {
608  MB_SET_ERR( MB_FAILURE, "Couldn't find 'time' or 't' dimension" );
609  }
610  nTimeSteps = dimLens[tDim];
611 
612  // Get number of levels
613  if( ( vecIt = std::find( dimNames.begin(), dimNames.end(), "lev" ) ) != dimNames.end() )
614  levDim = vecIt - dimNames.begin();
615  else if( ( vecIt = std::find( dimNames.begin(), dimNames.end(), "ilev" ) ) != dimNames.end() )
616  levDim = vecIt - dimNames.begin();
617  else
618  {
619  MB_SET_ERR( MB_FAILURE, "Couldn't find 'lev' or 'ilev' dimension" );
620  }
621  nLevels = dimLens[levDim];
622 
623  // __<dim_name>_LOC_MINMAX (for slon, slat, lon and lat)
624  Tag convTag = 0;
625  MB_CHK_SET_ERR( mbImpl->tag_get_handle( "__slon_LOC_MINMAX", 0, MB_TYPE_INTEGER, convTag, MB_TAG_ANY ),
626  "Trouble getting conventional tag __slon_LOC_MINMAX" );
627  int val[2];
628  MB_CHK_SET_ERR( mbImpl->tag_get_data( convTag, &_fileSet, 1, val ),
629  "Trouble getting data of conventional tag __slon_LOC_MINMAX" );
630  lDims[0] = val[0];
631  lDims[3] = val[1];
632 
633  MB_CHK_SET_ERR( mbImpl->tag_get_handle( "__slat_LOC_MINMAX", 0, MB_TYPE_INTEGER, convTag, MB_TAG_ANY ),
634  "Trouble getting conventional tag __slat_LOC_MINMAX" );
635  MB_CHK_SET_ERR( mbImpl->tag_get_data( convTag, &_fileSet, 1, val ),
636  "Trouble getting data of conventional tag __slat_LOC_MINMAX" );
637  lDims[1] = val[0];
638  lDims[4] = val[1];
639 
640  MB_CHK_SET_ERR( mbImpl->tag_get_handle( "__lon_LOC_MINMAX", 0, MB_TYPE_INTEGER, convTag, MB_TAG_ANY ),
641  "Trouble getting conventional tag __lon_LOC_MINMAX" );
642  MB_CHK_SET_ERR( mbImpl->tag_get_data( convTag, &_fileSet, 1, val ),
643  "Trouble getting data of conventional tag __lon_LOC_MINMAX" );
644  lCDims[0] = val[0];
645  lCDims[3] = val[1];
646 
647  MB_CHK_SET_ERR( mbImpl->tag_get_handle( "__lat_LOC_MINMAX", 0, MB_TYPE_INTEGER, convTag, MB_TAG_ANY ),
648  "Trouble getting conventional tag __lat_LOC_MINMAX" );
649  MB_CHK_SET_ERR( mbImpl->tag_get_data( convTag, &_fileSet, 1, val ),
650  "Trouble getting data of conventional tag __lat_LOC_MINMAX" );
651  lCDims[1] = val[0];
652  lCDims[4] = val[1];
653 
654  // Get local faces
655  MB_CHK_SET_ERR( mbImpl->get_entities_by_dimension( _fileSet, 2, localCellsOwned ),
656  "Trouble getting local faces in current file set" );
657  assert( !localCellsOwned.empty() );
658 
659 #ifdef MOAB_HAVE_MPI
660  bool& isParallel = _writeNC->isParallel;
661  if( isParallel )
662  {
663  ParallelComm*& myPcomm = _writeNC->myPcomm;
664  int procs = myPcomm->proc_config().proc_size();
665  if( procs > 1 )
666  {
667  MB_CHK_SET_ERR( myPcomm->filter_pstatus( localCellsOwned, PSTATUS_NOT_OWNED, PSTATUS_NOT ),
668  "Trouble getting owned faces in current file set" );
669  }
670  }
671 #endif
672 
673  return MB_SUCCESS;
674 }

References moab::NCWriteHelper::_fileSet, moab::NCWriteHelper::_writeNC, moab::WriteNC::dimLens, moab::WriteNC::dimNames, moab::Range::empty(), moab::ParallelComm::filter_pstatus(), moab::Interface::get_entities_by_dimension(), moab::WriteNC::isParallel, lCDims, lDims, moab::NCWriteHelper::levDim, moab::NCWriteHelper::localCellsOwned, MB_CHK_SET_ERR, MB_SET_ERR, MB_SUCCESS, MB_TAG_ANY, MB_TYPE_INTEGER, moab::WriteNC::mbImpl, moab::NCWriteHelper::nLevels, moab::NCWriteHelper::nTimeSteps, moab::ParallelComm::proc_config(), moab::ProcConfig::proc_size(), PSTATUS_NOT, PSTATUS_NOT_OWNED, moab::Interface::tag_get_data(), moab::Interface::tag_get_handle(), and moab::NCWriteHelper::tDim.

◆ collect_variable_data()

ErrorCode moab::ScdNCWriteHelper::collect_variable_data ( std::vector< std::string > &  var_names,
std::vector< int > &  tstep_nums 
)
privatevirtual

Collect data for specified variables.

Reimplemented from moab::NCWriteHelper.

Definition at line 676 of file NCWriteHelper.cpp.

678 {
679  NCWriteHelper::collect_variable_data( var_names, tstep_nums );
680 
681  std::map< std::string, WriteNC::VarData >& varInfo = _writeNC->varInfo;
682 
683  for( size_t i = 0; i < var_names.size(); i++ )
684  {
685  std::string varname = var_names[i];
686  std::map< std::string, WriteNC::VarData >::iterator vit = varInfo.find( varname );
687  if( vit == varInfo.end() ) MB_SET_ERR( MB_FAILURE, "Can't find variable " << varname );
688 
689  WriteNC::VarData& currentVarData = vit->second;
690 #ifndef NDEBUG
691  std::vector< int >& varDims = currentVarData.varDims;
692 #endif
693 
694  // Skip set variables, which were already processed in
695  // NCWriteHelper::collect_variable_data()
696  if( WriteNC::ENTLOCSET == currentVarData.entLoc ) continue;
697 
698  // Set up writeStarts and writeCounts (maximum number of dimensions is 4)
699  currentVarData.writeStarts.resize( 4 );
700  currentVarData.writeCounts.resize( 4 );
701  unsigned int dim_idx = 0;
702 
703  // First: time
704  if( currentVarData.has_tsteps )
705  {
706  // Non-set variables with timesteps
707  // 4 dimensions like (time, lev, lat, lon)
708  // 3 dimensions like (time, lat, lon)
709  assert( 4 == varDims.size() || 3 == varDims.size() );
710 
711  // Time should be the first dimension
712  assert( tDim == varDims[0] );
713 
714  currentVarData.writeStarts[dim_idx] = 0; // This value is timestep dependent, will be set later
715  currentVarData.writeCounts[dim_idx] = 1;
716  dim_idx++;
717  }
718  else
719  {
720  // Non-set variables without timesteps
721  // 3 dimensions like (lev, lat, lon)
722  // 2 dimensions like (lat, lon)
723  assert( 3 == varDims.size() || 2 == varDims.size() );
724  }
725 
726  // Next: lev
727  if( currentVarData.numLev > 0 )
728  {
729  // Non-set variables with levels
730  // 4 dimensions like (time, lev, lat, lon)
731  // 3 dimensions like (lev, lat, lon)
732  assert( 4 == varDims.size() || 3 == varDims.size() );
733 
734  currentVarData.writeStarts[dim_idx] = 0;
735  currentVarData.writeCounts[dim_idx] = currentVarData.numLev;
736  dim_idx++;
737  }
738  else
739  {
740  // Non-set variables without levels
741  // 3 dimensions like (time, lat, lon)
742  // 2 dimensions like (lat, lon)
743  assert( 3 == varDims.size() || 2 == varDims.size() );
744  }
745 
746  // Finally: lat and lon
747  switch( currentVarData.entLoc )
748  {
749  case WriteNC::ENTLOCFACE:
750  // Faces
751  currentVarData.writeStarts[dim_idx] = lCDims[1];
752  currentVarData.writeCounts[dim_idx] = lCDims[4] - lCDims[1] + 1;
753  currentVarData.writeStarts[dim_idx + 1] = lCDims[0];
754  currentVarData.writeCounts[dim_idx + 1] = lCDims[3] - lCDims[0] + 1;
755  break;
756  default:
757  MB_SET_ERR( MB_FAILURE, "Unexpected entity location type for variable " << varname );
758  }
759  dim_idx += 2;
760 
761  // Get variable size
762  currentVarData.sz = 1;
763  for( std::size_t idx = 0; idx < dim_idx; idx++ )
764  currentVarData.sz *= currentVarData.writeCounts[idx];
765  } // for (size_t i = 0; i < var_names.size(); i++)
766 
767  return MB_SUCCESS;
768 }

References moab::NCWriteHelper::_writeNC, moab::NCWriteHelper::collect_variable_data(), moab::WriteNC::VarData::entLoc, moab::WriteNC::ENTLOCFACE, moab::WriteNC::ENTLOCSET, moab::WriteNC::VarData::has_tsteps, lCDims, MB_SET_ERR, MB_SUCCESS, moab::WriteNC::VarData::numLev, moab::WriteNC::VarData::sz, moab::NCWriteHelper::tDim, moab::WriteNC::VarData::varDims, moab::WriteNC::varInfo, moab::WriteNC::VarData::writeCounts, and moab::WriteNC::VarData::writeStarts.

◆ jik_to_kji()

template<typename T >
void moab::ScdNCWriteHelper::jik_to_kji ( size_t  ni,
size_t  nj,
size_t  nk,
T *  dest,
T *  source 
)
inlineprivate

Definition at line 106 of file NCWriteHelper.hpp.

107  {
108  size_t nik = ni * nk, nij = ni * nj;
109  for( std::size_t k = 0; k != nk; k++ )
110  for( std::size_t j = 0; j != nj; j++ )
111  for( std::size_t i = 0; i != ni; i++ )
112  dest[k * nij + j * ni + i] = source[j * nik + i * nk + k];
113  }

Referenced by write_nonset_variables().

◆ write_nonset_variables()

ErrorCode moab::ScdNCWriteHelper::write_nonset_variables ( std::vector< WriteNC::VarData > &  vdatas,
std::vector< int > &  tstep_nums 
)
privatevirtual

Implementation of NCWriteHelper::write_nonset_variables()

Implements moab::NCWriteHelper.

Definition at line 773 of file NCWriteHelper.cpp.

775 {
776  Interface*& mbImpl = _writeNC->mbImpl;
777 
778  int success;
779 
780  // For each indexed variable tag, write a time step data
781  for( unsigned int i = 0; i < vdatas.size(); i++ )
782  {
783  WriteNC::VarData& variableData = vdatas[i];
784 
785  // Assume this variable is on faces for the time being
786  switch( variableData.entLoc )
787  {
788  case WriteNC::ENTLOCFACE:
789  // Faces
790  break;
791  default:
792  MB_SET_ERR( MB_FAILURE, "Unexpected entity location type for variable " << variableData.varName );
793  }
794 
795  unsigned int num_timesteps;
796  unsigned int lat_idx = 0;
797  unsigned int lon_idx = 1;
798  if( variableData.has_tsteps )
799  {
800  // Non-set variables with timesteps
801  // 4 dimensions like (time, lev, lat, lon)
802  // 3 dimensions like (time, lat, lon)
803  num_timesteps = tstep_nums.size();
804  lat_idx++;
805  lon_idx++;
806  }
807  else
808  {
809  // Non-set variables without timesteps
810  // 3 dimensions like (lev, lat, lon)
811  // 2 dimensions like (lat, lon)
812  num_timesteps = 1;
813  }
814 
815  unsigned int num_lev;
816  if( variableData.numLev > 0 )
817  {
818  // Non-set variables with levels
819  // 4 dimensions like (time, lev, lat, lon)
820  // 3 dimensions like (lev, lat, lon)
821  num_lev = variableData.numLev;
822  lat_idx++;
823  lon_idx++;
824  }
825  else
826  {
827  // Non-set variables without levels
828  // 3 dimensions like (time, lat, lon)
829  // 2 dimensions like (lat, lon)
830  num_lev = 1;
831  }
832 
833  size_t ni = variableData.writeCounts[lon_idx]; // lon
834  size_t nj = variableData.writeCounts[lat_idx]; // lat
835 
836  // At each timestep, we need to transpose tag format (lat, lon, lev) back
837  // to NC format (lev, lat, lon) for writing
838  for( unsigned int t = 0; t < num_timesteps; t++ )
839  {
840  // We will write one time step, and count will be one; start will be different
841  // Use tag_iterate to get tag data (assume that localCellsOwned is contiguous)
842  // We should also transpose for level so that means deep copy for transpose
843  if( tDim == variableData.varDims[0] ) variableData.writeStarts[0] = t; // This is start for time
844  int count;
845  void* dataptr;
846  MB_CHK_SET_ERR( mbImpl->tag_iterate( variableData.varTags[t], localCellsOwned.begin(),
847  localCellsOwned.end(), count, dataptr ),
848  "Failed to iterate tag on owned faces" );
849  assert( count == (int)localCellsOwned.size() );
850 
851  // Now transpose and write tag data
852  // Use collective I/O mode put (synchronous write) for the time being, we can try
853  // nonblocking put (request aggregation) later
854  switch( variableData.varDataType )
855  {
856  case NC_DOUBLE: {
857  std::vector< double > tmpdoubledata( ni * nj * num_lev );
858  if( num_lev > 1 )
859  // Transpose (lat, lon, lev) back to (lev, lat, lon)
860  jik_to_kji( ni, nj, num_lev, &tmpdoubledata[0], (double*)( dataptr ) );
861  success = NCFUNCAP( _vara_double )( _fileId, variableData.varId, &variableData.writeStarts[0],
862  &variableData.writeCounts[0], &tmpdoubledata[0] );
863  if( success )
864  MB_SET_ERR( MB_FAILURE, "Failed to write double data for variable " << variableData.varName );
865  break;
866  }
867  default:
868  MB_SET_ERR( MB_NOT_IMPLEMENTED, "Writing non-double data is not implemented yet" );
869  }
870  }
871  }
872 
873  return MB_SUCCESS;
874 }

References moab::NCWriteHelper::_fileId, moab::NCWriteHelper::_writeNC, moab::Range::begin(), moab::Range::end(), moab::WriteNC::VarData::entLoc, moab::WriteNC::ENTLOCFACE, moab::WriteNC::VarData::has_tsteps, jik_to_kji(), moab::NCWriteHelper::localCellsOwned, MB_CHK_SET_ERR, MB_NOT_IMPLEMENTED, MB_SET_ERR, MB_SUCCESS, moab::WriteNC::mbImpl, NCFUNCAP, moab::WriteNC::VarData::numLev, moab::Range::size(), moab::Interface::tag_iterate(), moab::NCWriteHelper::tDim, moab::WriteNC::VarData::varDataType, moab::WriteNC::VarData::varDims, moab::WriteNC::VarData::varId, moab::WriteNC::VarData::varName, moab::WriteNC::VarData::varTags, moab::WriteNC::VarData::writeCounts, and moab::WriteNC::VarData::writeStarts.

Member Data Documentation

◆ lCDims

int moab::ScdNCWriteHelper::lCDims[6]
protected

Center dimensions of my local part of grid.

Definition at line 120 of file NCWriteHelper.hpp.

Referenced by collect_mesh_info(), collect_variable_data(), and ScdNCWriteHelper().

◆ lDims

int moab::ScdNCWriteHelper::lDims[6]
protected

Dimensions of my local part of grid.

Definition at line 117 of file NCWriteHelper.hpp.

Referenced by collect_mesh_info(), and ScdNCWriteHelper().


The documentation for this class was generated from the following files: