@@ -46,38 +46,31 @@ void printEdgeCuts(apf::Mesh2 *m);
4646/* * \brief Migrate all elements back to rank 0. */
4747void 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 {
5451public:
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
8376int 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
350357void 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