Skip to content

Commit 1b30ee3

Browse files
committed
test: add capAdapt -B and -A flags
- test/capAdapt.cc: make Args a struct and remove accessors in favor of simple members. - add before.vtk and after.vtk prefix name arguments - only write vtks if those arguments are given Signed-off-by: Aiden Woodruff <[email protected]>
1 parent 01aaa8b commit 1b30ee3

File tree

1 file changed

+45
-38
lines changed

1 file changed

+45
-38
lines changed

test/capAdapt.cc

Lines changed: 45 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -46,38 +46,31 @@ void printEdgeCuts(apf::Mesh2 *m);
4646
/** \brief Migrate all elements back to rank 0. */
4747
void migrateHome(apf::Mesh2* mesh);
4848

49-
/** \brief Take a serial MDS mesh, partition, adapt, then localize. */
50-
void parallelAdapt(ma::Mesh* mesh, gmi_model* mod, pcu::PCU& PCU, int maxiter);
51-
5249
/** \brief Command line argument processing class. */
53-
class Args {
50+
struct Args {
5451
public:
5552
Args() {}
5653
Args(int argc, char* argv[]) { parse(argc, argv); }
5754
void parse(int argc, char* argv[]);
5855
void print_usage(const char* argv0) const;
5956
/**
60-
* \brief Get maximum iterations argument.
57+
* \brief maximum iterations argument.
6158
*
6259
* Pass -1 to trust MeshAdapt or a number <= 10 to specify max iterations.
6360
*/
64-
int maxiter() const noexcept { return maxiter_; }
61+
int maxiter{-1};
6562
/**
6663
* \brief Get smoothing argument. If true, request smoothing if supported.
6764
*/
68-
bool smooth() const noexcept { return smooth_; }
69-
70-
const std::string& creFilename() const noexcept { return creFilename_; }
71-
const std::string& sizingFilename() const noexcept {
72-
return sizingFilename_;
73-
}
74-
private:
75-
int maxiter_{-1};
76-
bool smooth_{false};
77-
std::string creFilename_;
78-
std::string sizingFilename_;
65+
bool smooth{false};
66+
std::string creFilename, sizingFilename, before, after;
7967
};
8068

69+
/** \brief Take a serial MDS mesh, partition, adapt, then localize. */
70+
void parallelAdapt(
71+
ma::Mesh* mesh, gmi_model* mod, pcu::PCU& PCU, const Args& args
72+
);
73+
8174
} // namespace
8275

8376
int main(int argc, char** argv) {
@@ -107,13 +100,13 @@ int main(int argc, char** argv) {
107100
std::cout << "STATUS: Init Capstone" << std::endl;
108101

109102
if (PCU.Self() == 0)
110-
std::cout << "STATUS: Loading CRE file : " << args.creFilename();
103+
std::cout << "STATUS: Loading CRE file : " << args.creFilename;
111104
gmi_model* model = nullptr;
112105
// Load CRE file sequentially to avoid NFS errors.
113106
for (int i = 0; i < PCU.Peers(); ++i) {
114107
if (PCU.Self() == i) {
115-
if (PCU.Self() == 0) model = gmi_load(args.creFilename().c_str());
116-
else model = gmi_cap_load_selective(args.creFilename().c_str(), {});
108+
if (PCU.Self() == 0) model = gmi_load(args.creFilename.c_str());
109+
else model = gmi_cap_load_selective(args.creFilename.c_str(), {});
117110
}
118111
PCU.Barrier();
119112
}
@@ -130,13 +123,12 @@ int main(int argc, char** argv) {
130123
ma::Mesh* apfCapMesh = apf::createCapMesh(model, soloPCU.get());
131124
apf::disownCapModel(apfCapMesh);
132125
if (!apf::loadCapSizingFile(
133-
apfCapMesh, args.sizingFilename(),
134-
get_no_extension(args.creFilename()) + ".avm.vmap",
126+
apfCapMesh, args.sizingFilename,
127+
get_no_extension(args.creFilename) + ".avm.vmap",
135128
"adapt_scales", "adapt_frames", true, "Kestrel"
136129
)) {
137130
throw std::runtime_error("failed to load sizing file");
138131
}
139-
apf::writeVtkFiles("before", apfCapMesh);
140132
/* CONVERT TO APF MDS MESH AND WRITE VTK */
141133
std::cout << "STATUS: Convert to APF MDS Mesh" << std::endl;
142134
double t_start = pcu::Time();
@@ -148,12 +140,11 @@ int main(int argc, char** argv) {
148140
apf::destroyMesh(apfCapMesh);
149141
apfMesh->verify();
150142
apf::printStats(apfMesh);
151-
apf::writeVtkFiles("before-mds", apfMesh);
152143
}
153144

154145
PCU.Barrier();
155146

156-
parallelAdapt(apfMesh, model, PCU, args.maxiter());
147+
parallelAdapt(apfMesh, model, PCU, args);
157148

158149
if (original) {
159150
apf::Mesh2* mdsMesh = apfMesh;
@@ -168,7 +159,7 @@ int main(int argc, char** argv) {
168159
apf::destroyMesh(mdsMesh);
169160

170161
/* SAVE FINAL CRE FILE */
171-
auto creOFileName = get_no_extension(args.creFilename())
162+
auto creOFileName = get_no_extension(args.creFilename)
172163
+ "_adapted.cre";
173164
gmi_cap_write(model, creOFileName.c_str());
174165
apf::destroyMesh(apfMesh);
@@ -218,7 +209,9 @@ void migrateHome(apf::Mesh2* mesh) {
218209
<< " seconds" << std::endl;
219210
}
220211

221-
void parallelAdapt(ma::Mesh* mesh, gmi_model* model, pcu::PCU& PCU, int maxiter) {
212+
void parallelAdapt(
213+
ma::Mesh* mesh, gmi_model* model, pcu::PCU& PCU, const Args& args
214+
) {
222215
auto t0 = pcu::Time();
223216
bool original = false;
224217
pcu::PCU* oldPCU = nullptr;
@@ -256,10 +249,12 @@ void parallelAdapt(ma::Mesh* mesh, gmi_model* model, pcu::PCU& PCU, int maxiter)
256249
);
257250
plan = nullptr; // plan is freed by apf::repeatMdsMesh.
258251
apf::printStats(mesh);
259-
apf::writeVtkFiles("before-mds-split", mesh);
260252
}
261253
apf::disownMdsModel(mesh);
262254
printEdgeCuts(mesh);
255+
if (!args.before.empty()) {
256+
apf::writeVtkFiles(args.before.c_str(), mesh);
257+
}
263258

264259
apf::Field* mdsScaleField = mesh->findField("adapt_scales");
265260
apf::Field* mdsFrameField = mesh->findField("adapt_frames");
@@ -273,14 +268,16 @@ void parallelAdapt(ma::Mesh* mesh, gmi_model* model, pcu::PCU& PCU, int maxiter)
273268
ma::configure(mesh, mdsScaleField, mdsFrameField)
274269
);
275270
in->shouldForceAdaptation = true;
276-
if (maxiter != -1) in->maximumIterations = maxiter;
271+
if (args.maxiter != -1) in->maximumIterations = args.maxiter;
277272

278273
if (original) std::cout << "STATUS: Adapting" << std::endl;
279274
ma::adapt(in);
280275

281276
/* WRITE THE AFTER ADAPT MESH TO VTK USING APF VTK WRITER */
282-
if (original) std::cout << "STATUS: Writing VTK file (after)" << std::endl;
283-
apf::writeVtkFiles("after-mds", mesh);
277+
if (!args.after.empty()) {
278+
if (original) std::cout << "STATUS: Writing VTK file (after)" << std::endl;
279+
apf::writeVtkFiles(args.after.c_str(), mesh);
280+
}
284281

285282
if (parts > 1) migrateHome(mesh);
286283
if (original) {
@@ -324,20 +321,30 @@ void Args::parse(int argc, char* argv[]) {
324321
for (int i = 1; i < argc; ++i) {
325322
if (argv[i][0] == '-') {
326323
switch (argv[i][1]) {
324+
case 'B':
325+
if (argv[i][2]) before = &argv[i][2];
326+
else if (++i < argc) before = argv[i];
327+
else throw std::invalid_argument("missing argument to -B");
328+
break;
329+
case 'A':
330+
if (argv[i][2]) after = &argv[i][2];
331+
else if (++i < argc) after = argv[i];
332+
else throw std::invalid_argument("missing argument to -A");
333+
break;
327334
case 'i':
328-
if (argv[i][2]) maxiter_ = std::stoi(&argv[i][2]);
329-
else if (++i < argc) maxiter_ = std::stoi(argv[i]);
335+
if (argv[i][2]) maxiter = std::stoi(&argv[i][2]);
336+
else if (++i < argc) maxiter = std::stoi(argv[i]);
330337
else throw std::invalid_argument("missing argument to -i");
331338
break;
332339
case 's':
333-
smooth_ = true;
340+
smooth = true;
334341
break;
335342
default:
336343
throw std::invalid_argument("invalid option -" + argv[i][1]);
337344
}
338345
} else {
339-
if (creFilename_.empty()) creFilename_ = argv[i];
340-
else if (sizingFilename_.empty()) sizingFilename_ = argv[i];
346+
if (creFilename.empty()) creFilename = argv[i];
347+
else if (sizingFilename.empty()) sizingFilename = argv[i];
341348
else {
342349
throw std::invalid_argument(
343350
std::string("invalid argument `") + argv[i] + "`"
@@ -348,8 +355,8 @@ void Args::parse(int argc, char* argv[]) {
348355
}
349356

350357
void Args::print_usage(const char* argv0) const {
351-
std::cout << "USAGE: " << argv0 << " [-i MAXITER] [-s] INPUT.CRE SIZING.DAT"
352-
<< std::endl;
358+
std::cout << "USAGE: " << argv0 << " [-B BEFORE.VTK] [-A AFTER.VTK]"
359+
" [-i MAXITER] [-s] INPUT.CRE SIZING.DAT" << std::endl;
353360
}
354361

355362
} // namsepace

0 commit comments

Comments
 (0)