Skip to content

Commit b0217ae

Browse files
committed
Closes #64
1 parent d549913 commit b0217ae

File tree

7 files changed

+150
-6
lines changed

7 files changed

+150
-6
lines changed

iriclib.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -741,6 +741,18 @@ int cg_iRIC_Read_Sol_BaseIterative_Real_Mul(int fid, int step, const char* name,
741741
return f->Sol_Read_BaseIterative_Real(step, name, value);
742742
}
743743

744+
int cg_iRIC_Read_Sol_BaseIterative_StringLen_Mul(int fid, int step, const char* name, int* length)
745+
{
746+
GET_F(fid);
747+
return f->Sol_Read_BaseIterative_StringLen(step, name, length);
748+
}
749+
750+
int cg_iRIC_Read_Sol_BaseIterative_String_Mul(int fid, int step, const char* name, char* strvalue)
751+
{
752+
GET_F(fid);
753+
return f->Sol_Read_BaseIterative_String(step, name, strvalue);
754+
}
755+
744756
int cg_iRIC_Read_Sol_GridCoord2d_Mul(int fid, int step, double* x, double* y)
745757
{
746758
GET_F(fid);
@@ -821,6 +833,12 @@ int cg_iRIC_Write_Sol_BaseIterative_Real_Mul(int fid, const char *name, double v
821833
return f->Sol_Write_BaseIterative_Real(name, value);
822834
}
823835

836+
int cg_iRIC_Write_Sol_BaseIterative_String_Mul(int fid, const char *name, const char* strvalue)
837+
{
838+
GET_F(fid);
839+
return f->Sol_Write_BaseIterative_String(name, strvalue);
840+
}
841+
824842
int cg_iRIC_Write_Sol_GridCoord2d_Mul(int fid, double *x, double *y)
825843
{
826844
GET_F(fid);

iriclib.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,10 @@ int IRICLIBDLL cg_iRIC_Read_Sol_BaseIterative_Integer_Mul(int fid, int step, con
231231

232232
int IRICLIBDLL cg_iRIC_Read_Sol_BaseIterative_Real_Mul(int fid, int step, const char* name, double* value);
233233

234+
int IRICLIBDLL cg_iRIC_Read_Sol_BaseIterative_StringLen_Mul(int fid, int step, const char* name, int* length);
235+
236+
int IRICLIBDLL cg_iRIC_Read_Sol_BaseIterative_String_Mul(int fid, int step, const char* name, char* strvalue);
237+
234238
int IRICLIBDLL cg_iRIC_Read_Sol_GridCoord2d_Mul(int fid, int step, double* x, double* y);
235239

236240
int IRICLIBDLL cg_iRIC_Read_Sol_GridCoord3d_Mul(int fid, int step, double* x, double* y, double* z);
@@ -263,6 +267,8 @@ int IRICLIBDLL cg_iRIC_Write_Sol_BaseIterative_Integer_Mul(int fid, const char *
263267

264268
int IRICLIBDLL cg_iRIC_Write_Sol_BaseIterative_Real_Mul(int fid, const char *name, double value);
265269

270+
int IRICLIBDLL cg_iRIC_Write_Sol_BaseIterative_String_Mul(int fid, const char *name, const char* strvalue);
271+
266272
int IRICLIBDLL cg_iRIC_Write_Sol_GridCoord2d_Mul(int fid, double *x, double *y);
267273

268274
int IRICLIBDLL cg_iRIC_Write_Sol_GridCoord3d_Mul(int fid, double *x, double *y, double *z);
@@ -585,6 +591,10 @@ int IRICLIBDLL cg_iRIC_Read_Sol_BaseIterative_Integer(int step, const char* name
585591

586592
int IRICLIBDLL cg_iRIC_Read_Sol_BaseIterative_Real(int step, const char* name, double* value);
587593

594+
int IRICLIBDLL cg_iRIC_Read_Sol_BaseIterative_StringLen(int step, const char* name, int* length);
595+
596+
int IRICLIBDLL cg_iRIC_Read_Sol_BaseIterative_String(int step, const char* name, char* strvalue);
597+
588598
int IRICLIBDLL cg_iRIC_Read_Sol_GridCoord2d(int step, double* x, double* y);
589599

590600
int IRICLIBDLL cg_iRIC_Read_Sol_GridCoord3d(int step, double* x, double* y, double* z);
@@ -613,6 +623,8 @@ int IRICLIBDLL cg_iRIC_Write_Sol_BaseIterative_Integer(const char *name, int val
613623

614624
int IRICLIBDLL cg_iRIC_Write_Sol_BaseIterative_Real(const char *name, double value);
615625

626+
int IRICLIBDLL cg_iRIC_Write_Sol_BaseIterative_String(const char *name, const char* strvalue);
627+
616628
int IRICLIBDLL cg_iRIC_Write_Sol_GridCoord2d(double *x, double *y);
617629

618630
int IRICLIBDLL cg_iRIC_Write_Sol_GridCoord3d(double *x, double *y, double *z);

iriclib_cgnsfile.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,8 @@ class CgnsFile
156156
int Sol_Read_Iteration(int step, int* index);
157157
int Sol_Read_BaseIterative_Integer(int step, const char* name, int* value);
158158
int Sol_Read_BaseIterative_Real(int step, const char* name, double* value);
159+
int Sol_Read_BaseIterative_StringLen(int step, const char* name, int* length);
160+
int Sol_Read_BaseIterative_String(int step, const char* name, char* strvalue);
159161
int Sol_Read_GridCoord2d(int step, double* x, double* y);
160162
int Sol_Read_GridCoord3d(int step, double* x, double* y, double* z);
161163
int Sol_Read_Integer(int step, const char *name, int* data);
@@ -171,6 +173,7 @@ class CgnsFile
171173
int Sol_Write_Iteration(int index);
172174
int Sol_Write_BaseIterative_Integer(const char *name, int value);
173175
int Sol_Write_BaseIterative_Real(const char *name, double value);
176+
int Sol_Write_BaseIterative_String(const char* name, const char* value);
174177
int Sol_Write_GridCoord2d(double *x, double *y);
175178
int Sol_Write_GridCoord3d(double *x, double *y, double *z);
176179
int Sol_Write_Integer(const char *name, int* data);

iriclib_cgnsfile_base.cpp

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -235,34 +235,54 @@ int CgnsFile::Impl::loadResultData()
235235
char name[NAME_MAXLENGTH];
236236
DataType_t datatype;
237237
int dim;
238-
cgsize_t dimvec;
238+
cgsize_t dimvec[2];
239239

240-
ier = cg_array_info(i, name, &datatype, &dim, &dimvec);
240+
ier = cg_array_info(i, name, &datatype, &dim, dimvec);
241241
RETURN_IF_ERR;
242242

243243
if (strcmp(name, "TimeValues") == 0) {
244-
m_solTimes.assign(dimvec, 0);
244+
m_solTimes.assign(dimvec[0], 0);
245245
ier = cg_array_read(i, m_solTimes.data());
246246
RETURN_IF_ERR;
247247
} else if (strcmp(name, "IterationValues") == 0) {
248-
m_solIndices.assign(dimvec, 0);
248+
m_solIndices.assign(dimvec[0], 0);
249249
ier = cg_array_read(i, m_solIndices.data());
250250
} else if (datatype == RealDouble || datatype == RealSingle) {
251251
BaseIterativeT<double> biData = std::string(name);
252252
std::vector<double> vals;
253-
vals.assign(dimvec, 0);
253+
vals.assign(dimvec[0], 0);
254254
ier = cg_array_read_as(i, RealDouble, vals.data());
255255
RETURN_IF_ERR;
256256
biData.setValues(vals);
257257
m_solBaseIterReals.push_back(biData);
258258
} else if (datatype == Integer) {
259259
BaseIterativeT<int> biData = std::string(name);
260260
std::vector<int> vals;
261-
vals.assign(dimvec, 0);
261+
vals.assign(dimvec[0], 0);
262262
ier = cg_array_read_as(i, Integer, vals.data());
263263
RETURN_IF_ERR;
264264
biData.setValues(vals);
265265
m_solBaseIterInts.push_back(biData);
266+
} else if (datatype == Character) {
267+
BaseIterativeT<std::string> biData = std::string(name);
268+
std::vector<std::string> vals;
269+
std::vector<char> buffer;
270+
buffer.assign(dimvec[0] * dimvec[1], '\0');
271+
ier = cg_array_read(i, buffer.data());
272+
RETURN_IF_ERR;
273+
for (int i = 0; i < dimvec[1]; ++i) {
274+
std::vector<char> b;
275+
b.assign(dimvec[0] + 1, '\0');
276+
memcpy(b.data(), buffer.data() + dimvec[0] * i, dimvec[0]);
277+
int j = 0;
278+
while (j <= dimvec[0] && *(b.data() + dimvec[0] - j) == ' ') {
279+
*(b.data() + dimvec[0] - j) = '\0';
280+
++j;
281+
}
282+
vals.push_back(std::string(b.data()));
283+
}
284+
biData.setValues(vals);
285+
m_solBaseIterStrings.push_back(biData);
266286
}
267287
}
268288
return 0;

iriclib_cgnsfile_sol.cpp

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,32 @@
66

77
#include <assert.h>
88

9+
#include <cstring>
10+
911
using namespace iRICLib;
1012

1113
namespace {
1214

1315
static const std::string ECNODE = "ErrorCode";
1416

17+
void setupStringBuffer(const std::vector<std::string>& vals, cgsize_t* dims, std::vector<char>* buffer)
18+
{
19+
cgsize_t maxLen = 0;
20+
for (int i = 0; i < vals.size(); ++i) {
21+
const std::string& s = vals.at(i);
22+
if (i == 0 || s.length() > maxLen) {
23+
maxLen = s.length();
24+
}
25+
}
26+
*(dims + 0) = maxLen;
27+
*(dims + 1) = static_cast<cgsize_t> (vals.size());
28+
buffer->assign(maxLen * vals.size(), ' ');
29+
for (int i = 0; i < vals.size(); ++i) {
30+
const std::string& s = vals.at(i);
31+
memcpy(buffer->data() + maxLen * i, s.c_str(), s.length());
32+
}
33+
}
34+
1535
} // namespace
1636

1737
int CgnsFile::Sol_Read_Count(int* count)
@@ -78,6 +98,36 @@ int CgnsFile::Sol_Read_BaseIterative_Real(int step, const char *name, double* va
7898
return 2;
7999
}
80100

101+
int CgnsFile::Sol_Read_BaseIterative_StringLen(int step, const char* name, int* length)
102+
{
103+
if (step > impl->m_solId) {
104+
return 1;
105+
}
106+
for (const BaseIterativeT<std::string>& bit : impl->m_solBaseIterStrings) {
107+
if (bit.name() == name) {
108+
const std::string& v = bit.values().at(step - 1);
109+
*length = v.length();
110+
return 0;
111+
}
112+
}
113+
return 2;
114+
}
115+
116+
int CgnsFile::Sol_Read_BaseIterative_String(int step, const char* name, char* strvalue)
117+
{
118+
if (step > impl->m_solId) {
119+
return 1;
120+
}
121+
for (const BaseIterativeT<std::string>& bit : impl->m_solBaseIterStrings) {
122+
if (bit.name() == name) {
123+
const std::string& v = bit.values().at(step - 1);
124+
std::strcpy(strvalue, v.c_str());
125+
return 0;
126+
}
127+
}
128+
return 2;
129+
}
130+
81131
int CgnsFile::Sol_Read_GridCoord2d(int step, double* x, double* y)
82132
{
83133
int ier = cg_goto(impl->m_fileId, impl->m_baseId, "Zone_t", impl->m_zoneId,
@@ -242,6 +292,31 @@ int CgnsFile::Sol_Write_BaseIterative_Real(const char *name, double value)
242292
return cg_array_write(data.name().c_str(), RealDouble, 1, &dimVec, data.values().data());
243293
}
244294

295+
int CgnsFile::Sol_Write_BaseIterative_String(const char* name, const char* value)
296+
{
297+
bool found = false;
298+
BaseIterativeT<std::string> data(name);
299+
for (BaseIterativeT<std::string>& bit : impl->m_solBaseIterStrings) {
300+
if (bit.name() == name) {
301+
bit.addValue(std::string(value));
302+
data = bit;
303+
found = true;
304+
}
305+
}
306+
if (! found) {
307+
BaseIterativeT<std::string> newData(name);
308+
newData.addValue(std::string(value));
309+
impl->m_solBaseIterStrings.push_back(newData);
310+
data = newData;
311+
}
312+
// write the value.
313+
cgsize_t dimVec[2];
314+
std::vector<char> buffer;
315+
setupStringBuffer(data.values(), dimVec, &buffer);
316+
impl->gotoBaseIter();
317+
return cg_array_write(data.name().c_str(), Character, 2, dimVec, buffer.data());
318+
}
319+
245320
int CgnsFile::Sol_Write_GridCoord2d(double *x, double *y)
246321
{
247322
return impl->m_solutionWriter->Sol_Write_GridCoord2d(x, y);

iriclib_single.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,16 @@ int cg_iRIC_Read_Sol_BaseIterative_Real(int step, const char* name, double* valu
372372
return cg_iRIC_Read_Sol_BaseIterative_Real_Mul(lastfileid, step, name, value);
373373
}
374374

375+
int cg_iRIC_Read_Sol_BaseIterative_StringLen(int step, const char* name, int* length)
376+
{
377+
return cg_iRIC_Read_Sol_BaseIterative_StringLen_Mul(lastfileid, step, name, length);
378+
}
379+
380+
int cg_iRIC_Read_Sol_BaseIterative_String(int step, const char* name, char* strvalue)
381+
{
382+
return cg_iRIC_Read_Sol_BaseIterative_String_Mul(lastfileid, step, name, strvalue);
383+
}
384+
375385
int cg_iRIC_Read_Sol_GridCoord2d(int step, double* x, double* y)
376386
{
377387
return cg_iRIC_Read_Sol_GridCoord2d_Mul(lastfileid, step, x, y);
@@ -442,6 +452,11 @@ int cg_iRIC_Write_Sol_BaseIterative_Real(const char* name, double value)
442452
return cg_iRIC_Write_Sol_BaseIterative_Real_Mul(lastfileid, name, value);
443453
}
444454

455+
int cg_iRIC_Write_Sol_BaseIterative_String(const char *name, const char* strvalue)
456+
{
457+
return cg_iRIC_Write_Sol_BaseIterative_String_Mul(lastfileid, name, strvalue);
458+
}
459+
445460
int cg_iRIC_Write_Sol_GridCoord2d(double* x, double* y)
446461
{
447462
return cg_iRIC_Write_Sol_GridCoord2d_Mul(lastfileid, x, y);

private/iriclib_cgnsfile_impl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ class CgnsFile::Impl
145145

146146
std::vector<BaseIterativeT<int> > m_solBaseIterInts;
147147
std::vector<BaseIterativeT<double> > m_solBaseIterReals;
148+
std::vector<BaseIterativeT<std::string> > m_solBaseIterStrings;
148149

149150
SolutionWriter* m_solutionWriter;
150151

0 commit comments

Comments
 (0)