IOSS  2.0
Iocgns_Utils.h
Go to the documentation of this file.
1 // Copyright(C) 1999-2017 National Technology & Engineering Solutions
2 // of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with
3 // NTESS, the U.S. Government retains certain rights in this software.
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are
7 // met:
8 //
9 // * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer.
11 //
12 // * Redistributions in binary form must reproduce the above
13 // copyright notice, this list of conditions and the following
14 // disclaimer in the documentation and/or other materials provided
15 // with the distribution.
16 //
17 // * Neither the name of NTESS nor the names of its
18 // contributors may be used to endorse or promote products derived
19 // from this software without specific prior written permission.
20 //
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 
33 #ifndef IOSS_IOCGNS_UTILS_H
34 #define IOSS_IOCGNS_UTILS_H
35 
36 #include <Ioss_CodeTypes.h>
37 #include <Ioss_DatabaseIO.h>
38 #include <Ioss_ElementTopology.h>
39 #include <Ioss_Region.h>
40 #include <Ioss_SideBlock.h>
41 #include <Ioss_SideSet.h>
42 #include <Ioss_StructuredBlock.h>
43 #include <Ioss_Utils.h>
44 #include <cgnslib.h>
45 #include <ostream>
46 #include <string>
47 
48 // Used in Iocgns_DatabaseIO.C and Iocgns_ParallelDatabase.C
49 #define CGCHECK(funcall) \
50  if ((funcall) != CG_OK) { \
51  Iocgns::Utils::cgns_error(cgnsFilePtr, __FILE__, __func__, __LINE__, myProcessor); \
52  }
53 
54 #define CGCHECKNP(funcall) \
55  if ((funcall) != CG_OK) { \
56  Iocgns::Utils::cgns_error(cgnsFilePtr, __FILE__, __func__, __LINE__, -1); \
57  }
58 
59 // Used in Iocgns_Decomposition.C
60 #define CGCHECK2(funcall) \
61  if ((funcall) != CG_OK) { \
62  Iocgns::Utils::cgns_error(filePtr, __FILE__, __func__, __LINE__, m_decomposition.m_processor); \
63  }
64 
65 namespace Iocgns {
66  class StructuredZoneData;
67 
68  class Utils
69  {
70  public:
71  Utils() = default;
72  ~Utils() = default;
73 
74  static const size_t CG_CELL_CENTER_FIELD_ID = 1ul << 33;
75  static const size_t CG_VERTEX_FIELD_ID = 1ul << 34;
76 
77  static size_t index(const Ioss::Field &field);
78 
79  static void cgns_error(int cgnsid, const char *file, const char *function, int lineno,
80  int processor);
81 
82  static void set_field_index(const Ioss::Field &field, size_t index, CG_GridLocation_t location);
83  static bool is_cell_field(const Ioss::Field &field);
84 
85  template <typename INT>
86  static void map_cgns_face_to_ioss(const Ioss::ElementTopology *parent_topo, size_t num_to_get,
87  INT *idata)
88  {
89  // The {topo}_map[] arrays map from CGNS face# to IOSS face#.
90  // See http://cgns.github.io/CGNS_docs_current/sids/conv.html#unstructgrid
91  // NOTE: '0' for first entry is to account for 1-based face numbering.
92 
93  switch (parent_topo->shape()) {
95  static int hex_map[] = {0, 5, 1, 2, 3, 4, 6};
96  for (size_t i = 0; i < num_to_get; i++) {
97  idata[2 * i + 1] = hex_map[idata[2 * i + 1]];
98  }
99  break;
100 
102  static int tet_map[] = {0, 4, 1, 2, 3};
103  for (size_t i = 0; i < num_to_get; i++) {
104  idata[2 * i + 1] = tet_map[idata[2 * i + 1]];
105  }
106  break;
107 
109  static int pyr_map[] = {0, 5, 1, 2, 3, 4};
110  for (size_t i = 0; i < num_to_get; i++) {
111  idata[2 * i + 1] = pyr_map[idata[2 * i + 1]];
112  }
113  break;
114 
116 #if 0
117  static int wed_map[] = {0, 1, 2, 3, 4, 5}; // Same
118  // Not needed -- maps 1 to 1
119  for (size_t i=0; i < num_to_get; i++) {
120  idata[2*i+1] = wed_map[idata[2*i+1]];
121  }
122 #endif
123  break;
124  default:;
125  }
126  }
127 
128  static void map_ioss_face_to_cgns(const Ioss::ElementTopology *parent_topo, size_t num_to_get,
129  std::vector<cgsize_t> &data)
130  {
131  // The {topo}_map[] arrays map from CGNS face# to IOSS face#.
132  // See http://cgns.github.io/CGNS_docs_current/sids/conv.html#unstructgrid
133  // NOTE: '0' for first entry is to account for 1-based face numbering.
134 
135  switch (parent_topo->shape()) {
137  static int hex_map[] = {0, 2, 3, 4, 5, 1, 6};
138  for (size_t i = 0; i < num_to_get; i++) {
139  data[num_to_get * 2 + i] = hex_map[data[num_to_get * 2 + i]];
140  }
141  break;
142 
144  static int tet_map[] = {0, 2, 3, 4, 1};
145  for (size_t i = 0; i < num_to_get; i++) {
146  data[num_to_get * 2 + i] = tet_map[data[num_to_get * 2 + i]];
147  }
148  break;
149 
151  static int pyr_map[] = {0, 2, 3, 4, 5, 1};
152  for (size_t i = 0; i < num_to_get; i++) {
153  data[num_to_get * 2 + i] = pyr_map[data[num_to_get * 2 + i]];
154  }
155  break;
156 
158 #if 0
159  static int wed_map[] = {0, 1, 2, 3, 4, 5}; // Same
160  // Not needed -- maps 1 to 1
161  for (size_t i=0; i < num_to_get; i++) {
162  data[num_to_get * 2 + i] = wed_map[data[num_to_get * 2 + i]];
163  }
164 #endif
165  break;
166  default:;
167  }
168  }
169 
170  static void write_flow_solution_metadata(int file_ptr, Ioss::Region *region, int state,
171  int *vertex_solution_index,
172  int *cell_center_solution_index);
173  static int find_solution_index(int cgnsFilePtr, int base, int zone, int step,
174  CG_GridLocation_t location);
175  static CG_ZoneType_t check_zone_type(int cgnsFilePtr);
176  static size_t common_write_meta_data(int file_ptr, const Ioss::Region &region,
177  std::vector<size_t> &zone_offset, bool is_parallel);
178  static size_t resolve_nodes(Ioss::Region &region, int my_processor, bool is_parallel);
179  static std::vector<std::vector<std::pair<size_t, size_t>>>
180  resolve_processor_shared_nodes(Ioss::Region &region, int my_processor);
181 
182  static CG_ElementType_t map_topology_to_cgns(const std::string &name);
183  static std::string map_cgns_to_topology_type(CG_ElementType_t type);
184  static void add_sidesets(int cgnsFilePtr, Ioss::DatabaseIO *db);
185  static void add_structured_boundary_conditions(int cgnsFilePtr, Ioss::StructuredBlock *block);
186  static void finalize_database(int cgnsFilePtr, const std::vector<double> &timesteps,
187  Ioss::Region *region, int myProcessor);
188  static int get_step_times(int cgnsFilePtr, std::vector<double> &timesteps, Ioss::Region *region,
189  double timeScaleFactor, int myProcessor);
190  static void add_transient_variables(int cgnsFilePtr, const std::vector<double> &timesteps,
191  Ioss::Region *region, bool enable_field_recognition,
192  char suffix_separator, int myProcessor);
193 
194  static size_t pre_split(std::vector<Iocgns::StructuredZoneData *> &zones, double avg_work,
195  double load_balance, int proc_rank, int proc_count);
196  static void assign_zones_to_procs(std::vector<Iocgns::StructuredZoneData *> &zones,
197  std::vector<size_t> & work_vector);
198  };
199 } // namespace Iocgns
200 
201 #endif
static void map_ioss_face_to_cgns(const Ioss::ElementTopology *parent_topo, size_t num_to_get, std::vector< cgsize_t > &data)
Definition: Iocgns_Utils.h:128
Represents an element topology.
Definition: Ioss_ElementTopology.h:72
static CG_ElementType_t map_topology_to_cgns(const std::string &name)
Definition: Iocgns_Utils.C:793
An input or output Database.
Definition: Ioss_DatabaseIO.h:80
static std::vector< std::vector< std::pair< size_t, size_t > > > resolve_processor_shared_nodes(Ioss::Region &region, int my_processor)
Definition: Iocgns_Utils.C:1137
static size_t resolve_nodes(Ioss::Region &region, int my_processor, bool is_parallel)
Definition: Iocgns_Utils.C:1020
A namespace for the CGNS database format.
Definition: Iocgns_DatabaseIO.C:89
static int get_step_times(int cgnsFilePtr, std::vector< double > &timesteps, Ioss::Region *region, double timeScaleFactor, int myProcessor)
Definition: Iocgns_Utils.C:1476
static void cgns_error(int cgnsid, const char *file, const char *function, int lineno, int processor)
Definition: Iocgns_Utils.C:203
~Utils()=default
static bool is_cell_field(const Ioss::Field &field)
Definition: Iocgns_Utils.C:267
static void add_structured_boundary_conditions(int cgnsFilePtr, Ioss::StructuredBlock *block)
Definition: Iocgns_Utils.C:1201
static size_t index(const Ioss::Field &field)
Definition: Iocgns_Utils.C:253
A structured zone – i,j,k.
Definition: Ioss_StructuredBlock.h:98
static const size_t CG_CELL_CENTER_FIELD_ID
Definition: Iocgns_Utils.h:74
static std::string map_cgns_to_topology_type(CG_ElementType_t type)
Definition: Iocgns_Utils.C:762
Utils()=default
static size_t common_write_meta_data(int file_ptr, const Ioss::Region &region, std::vector< size_t > &zone_offset, bool is_parallel)
Definition: Iocgns_Utils.C:533
virtual ElementShape shape() const =0
static void map_cgns_face_to_ioss(const Ioss::ElementTopology *parent_topo, size_t num_to_get, INT *idata)
Definition: Iocgns_Utils.h:86
static void assign_zones_to_procs(std::vector< Iocgns::StructuredZoneData *> &zones, std::vector< size_t > &work_vector)
Definition: Iocgns_Utils.C:1507
int INT
Definition: Ioss_StructuredBlock.h:53
A grouping entity that contains other grouping entities.
Definition: Ioss_Region.h:98
std::string name(Ioss::GroupingEntity *entity)
Definition: io_info.C:71
static void set_field_index(const Ioss::Field &field, size_t index, CG_GridLocation_t location)
Definition: Iocgns_Utils.C:255
static const size_t CG_VERTEX_FIELD_ID
Definition: Iocgns_Utils.h:75
Holds metadata for bulk data associated with a GroupingEntity.
Definition: Ioss_Field.h:47
static void add_transient_variables(int cgnsFilePtr, const std::vector< double > &timesteps, Ioss::Region *region, bool enable_field_recognition, char suffix_separator, int myProcessor)
Definition: Iocgns_Utils.C:1392
static size_t pre_split(std::vector< Iocgns::StructuredZoneData *> &zones, double avg_work, double load_balance, int proc_rank, int proc_count)
Definition: Iocgns_Utils.C:1583
static void add_sidesets(int cgnsFilePtr, Ioss::DatabaseIO *db)
Definition: Iocgns_Utils.C:961
static int find_solution_index(int cgnsFilePtr, int base, int zone, int step, CG_GridLocation_t location)
Definition: Iocgns_Utils.C:907
std::vector< char > data
Definition: Ioss_Utils.C:78
static void finalize_database(int cgnsFilePtr, const std::vector< double > &timesteps, Ioss::Region *region, int myProcessor)
Definition: Iocgns_Utils.C:1314
static CG_ZoneType_t check_zone_type(int cgnsFilePtr)
Definition: Iocgns_Utils.C:225
static void write_flow_solution_metadata(int file_ptr, Ioss::Region *region, int state, int *vertex_solution_index, int *cell_center_solution_index)
Definition: Iocgns_Utils.C:860
Definition: Iocgns_Utils.h:68