xref: /petsc/src/dm/impls/moab/tests/ex1.cxx (revision ca4445c7a2f5ca546b532f08b853c371604af17c)
1c4762a1bSJed Brown static char help[] = "Simple MOAB example\n\n";
2c4762a1bSJed Brown 
3c4762a1bSJed Brown #include <petscdmmoab.h>
4c4762a1bSJed Brown #include "moab/ScdInterface.hpp"
5c4762a1bSJed Brown 
6c4762a1bSJed Brown typedef struct {
7c4762a1bSJed Brown   DM            dm; /* DM implementation using the MOAB interface */
8c4762a1bSJed Brown   PetscLogEvent createMeshEvent;
9c4762a1bSJed Brown   /* Domain and mesh definition */
10c4762a1bSJed Brown   PetscInt dim;
11c4762a1bSJed Brown   char     filename[PETSC_MAX_PATH_LEN];
12c4762a1bSJed Brown   char     tagname[PETSC_MAX_PATH_LEN];
13c4762a1bSJed Brown } AppCtx;
14c4762a1bSJed Brown 
15d71ae5a4SJacob Faibussowitsch PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options)
16d71ae5a4SJacob Faibussowitsch {
17c4762a1bSJed Brown   PetscBool flg;
18c4762a1bSJed Brown 
19c4762a1bSJed Brown   PetscFunctionBegin;
20c6a7a370SJeremy L Thompson   PetscCall(PetscStrncpy(options->filename, "", sizeof(options->filename)));
21c6a7a370SJeremy L Thompson   PetscCall(PetscStrncpy(options->tagname, "petsc_tag", sizeof(options->tagname)));
22c4762a1bSJed Brown   options->dim = -1;
23c4762a1bSJed Brown 
24d0609cedSBarry Smith   PetscOptionsBegin(comm, "", "MOAB example options", "DMMOAB");
259566063dSJacob Faibussowitsch   PetscCall(PetscOptionsRangeInt("-dim", "The topological mesh dimension", "ex1.cxx", options->dim, &options->dim, NULL, PETSC_DECIDE, 3));
269566063dSJacob Faibussowitsch   PetscCall(PetscOptionsString("-filename", "The file containing the mesh", "ex1.cxx", options->filename, options->filename, sizeof(options->filename), NULL));
279566063dSJacob Faibussowitsch   PetscCall(PetscOptionsString("-tagname", "The tag name from which to create a vector", "ex1.cxx", options->tagname, options->tagname, sizeof(options->tagname), &flg));
28d0609cedSBarry Smith   PetscOptionsEnd();
29c4762a1bSJed Brown 
309566063dSJacob Faibussowitsch   PetscCall(PetscLogEventRegister("CreateMesh", DM_CLASSID, &options->createMeshEvent));
313ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
32c4762a1bSJed Brown }
33c4762a1bSJed Brown 
34d71ae5a4SJacob Faibussowitsch PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *user, DM *dm)
35d71ae5a4SJacob Faibussowitsch {
36c4762a1bSJed Brown   moab::Interface *iface    = NULL;
37c4762a1bSJed Brown   moab::Tag        tag      = NULL;
38c4762a1bSJed Brown   moab::Tag        ltog_tag = NULL;
39c4762a1bSJed Brown   moab::Range      range;
40c4762a1bSJed Brown   PetscInt         tagsize;
41c4762a1bSJed Brown   moab::ErrorCode  merr;
42c4762a1bSJed Brown 
43c4762a1bSJed Brown   PetscFunctionBegin;
449566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(user->createMeshEvent, 0, 0, 0, 0));
459566063dSJacob Faibussowitsch   PetscCall(DMMoabCreateMoab(comm, iface, &ltog_tag, &range, dm));
46c4762a1bSJed Brown   std::cout << "Created DMMoab using DMMoabCreateMoab." << std::endl;
479566063dSJacob Faibussowitsch   PetscCall(DMMoabGetInterface(*dm, &iface));
48c4762a1bSJed Brown 
49c4762a1bSJed Brown   // load file and get entities of requested or max dimension
50c4762a1bSJed Brown   if (strlen(user->filename) > 0) {
519371c9d4SSatish Balay     merr = iface->load_file(user->filename);
529371c9d4SSatish Balay     MBERRNM(merr);
53c4762a1bSJed Brown     std::cout << "Read mesh from file " << user->filename << std::endl;
549371c9d4SSatish Balay   } else {
55c4762a1bSJed Brown     // make a simple structured mesh
56c4762a1bSJed Brown     moab::ScdInterface *scdi;
57c4762a1bSJed Brown     merr = iface->query_interface(scdi);
58c4762a1bSJed Brown 
59c4762a1bSJed Brown     moab::ScdBox *box;
609371c9d4SSatish Balay     merr = scdi->construct_box(moab::HomCoord(0, 0, 0), moab::HomCoord(5, 5, 5), NULL, 0, box);
619371c9d4SSatish Balay     MBERRNM(merr);
62c4762a1bSJed Brown     user->dim = 3;
639371c9d4SSatish Balay     merr      = iface->set_dimension(user->dim);
649371c9d4SSatish Balay     MBERRNM(merr);
65c4762a1bSJed Brown     std::cout << "Created structured 5x5x5 mesh." << std::endl;
66c4762a1bSJed Brown   }
67c4762a1bSJed Brown   if (-1 == user->dim) {
68c4762a1bSJed Brown     moab::Range tmp_range;
699371c9d4SSatish Balay     merr = iface->get_entities_by_handle(0, tmp_range);
709371c9d4SSatish Balay     MBERRNM(merr);
71ad540459SPierre Jolivet     if (tmp_range.empty()) MBERRNM(moab::MB_FAILURE);
72c4762a1bSJed Brown     user->dim = iface->dimension_from_handle(*tmp_range.rbegin());
73c4762a1bSJed Brown   }
749371c9d4SSatish Balay   merr = iface->get_entities_by_dimension(0, user->dim, range);
759371c9d4SSatish Balay   MBERRNM(merr);
769566063dSJacob Faibussowitsch   PetscCall(DMMoabSetLocalVertices(*dm, &range));
77c4762a1bSJed Brown 
78c4762a1bSJed Brown   // get the requested tag and create if necessary
79c4762a1bSJed Brown   std::cout << "Creating tag with name: " << user->tagname << ";\n";
809371c9d4SSatish Balay   merr = iface->tag_get_handle(user->tagname, 1, moab::MB_TYPE_DOUBLE, tag, moab::MB_TAG_CREAT | moab::MB_TAG_DENSE);
819371c9d4SSatish Balay   MBERRNM(merr);
82c4762a1bSJed Brown   {
83c4762a1bSJed Brown     // initialize new tag with gids
84c4762a1bSJed Brown     std::vector<double> tag_vals(range.size());
859371c9d4SSatish Balay     merr = iface->tag_get_data(ltog_tag, range, tag_vals.data());
869371c9d4SSatish Balay     MBERRNM(merr); // read them into ints
879371c9d4SSatish Balay     double *dval = tag_vals.data();
889371c9d4SSatish Balay     int    *ival = reinterpret_cast<int *>(dval); // "stretch" them into doubles, from the end
89c4762a1bSJed Brown     for (int i = tag_vals.size() - 1; i >= 0; i--) dval[i] = ival[i];
909371c9d4SSatish Balay     merr = iface->tag_set_data(tag, range, tag_vals.data());
919371c9d4SSatish Balay     MBERRNM(merr); // write them into doubles
92c4762a1bSJed Brown   }
939371c9d4SSatish Balay   merr = iface->tag_get_length(tag, tagsize);
949371c9d4SSatish Balay   MBERRNM(merr);
95c4762a1bSJed Brown 
969566063dSJacob Faibussowitsch   PetscCall(DMSetUp(*dm));
97c4762a1bSJed Brown 
98c4762a1bSJed Brown   // create the dmmoab and initialize its data
999566063dSJacob Faibussowitsch   PetscCall(PetscObjectSetName((PetscObject)*dm, "MOAB mesh"));
1009566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(user->createMeshEvent, 0, 0, 0, 0));
101c4762a1bSJed Brown   user->dm = *dm;
1023ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
103c4762a1bSJed Brown }
104c4762a1bSJed Brown 
105d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
106d71ae5a4SJacob Faibussowitsch {
107c4762a1bSJed Brown   AppCtx           user; /* user-defined work context */
108c4762a1bSJed Brown   moab::ErrorCode  merr;
109c4762a1bSJed Brown   Vec              vec;
110c4762a1bSJed Brown   moab::Interface *mbImpl  = NULL;
111c4762a1bSJed Brown   moab::Tag        datatag = NULL;
112c4762a1bSJed Brown 
113327415f7SBarry Smith   PetscFunctionBeginUser;
1149566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
1159566063dSJacob Faibussowitsch   PetscCall(ProcessOptions(PETSC_COMM_WORLD, &user));
116c4762a1bSJed Brown 
1179566063dSJacob Faibussowitsch   PetscCall(CreateMesh(PETSC_COMM_WORLD, &user, &user.dm)); /* create the MOAB dm and the mesh */
118c4762a1bSJed Brown 
1199566063dSJacob Faibussowitsch   PetscCall(DMMoabGetInterface(user.dm, &mbImpl));
1209371c9d4SSatish Balay   merr = mbImpl->tag_get_handle(user.tagname, datatag);
1219371c9d4SSatish Balay   MBERRNM(merr);
1229566063dSJacob Faibussowitsch   PetscCall(DMMoabCreateVector(user.dm, datatag, NULL, PETSC_TRUE, PETSC_FALSE, &vec)); /* create a vec from user-input tag */
123c4762a1bSJed Brown 
124c4762a1bSJed Brown   std::cout << "Created VecMoab from existing tag." << std::endl;
1259566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&vec));
126c4762a1bSJed Brown   std::cout << "Destroyed VecMoab." << std::endl;
1279566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&user.dm));
128c4762a1bSJed Brown   std::cout << "Destroyed DMMoab." << std::endl;
1299566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
130b122ec5aSJacob Faibussowitsch   return 0;
131c4762a1bSJed Brown }
132c4762a1bSJed Brown 
133c4762a1bSJed Brown /*TEST
134c4762a1bSJed Brown 
135c4762a1bSJed Brown      build:
136*ca4445c7SIlya Fursov        requires: moab !complex
137c4762a1bSJed Brown 
138c4762a1bSJed Brown      test:
139c4762a1bSJed Brown 
140c4762a1bSJed Brown TEST*/
141