1c4762a1bSJed Brown static char help[] = "Simple MOAB example\n\n";
2c4762a1bSJed Brown
3c4762a1bSJed Brown #include <petscdmmoab.h>
4*57d50842SBarry Smith #if defined(__GNUC__) || defined(__GNUG__)
5*57d50842SBarry Smith #pragma GCC diagnostic push
6*57d50842SBarry Smith #pragma GCC diagnostic ignored "-Wunused-result"
7*57d50842SBarry Smith #endif
8c4762a1bSJed Brown #include "moab/ScdInterface.hpp"
9*57d50842SBarry Smith #if defined(__GNUC__) || defined(__GNUG__)
10*57d50842SBarry Smith #pragma GCC diagnostic pop
11*57d50842SBarry Smith #endif
12c4762a1bSJed Brown
13c4762a1bSJed Brown typedef struct {
14c4762a1bSJed Brown DM dm; /* DM implementation using the MOAB interface */
15c4762a1bSJed Brown PetscLogEvent createMeshEvent;
16c4762a1bSJed Brown /* Domain and mesh definition */
17c4762a1bSJed Brown PetscInt dim;
18c4762a1bSJed Brown char filename[PETSC_MAX_PATH_LEN];
19c4762a1bSJed Brown char tagname[PETSC_MAX_PATH_LEN];
20c4762a1bSJed Brown } AppCtx;
21c4762a1bSJed Brown
ProcessOptions(MPI_Comm comm,AppCtx * options)22d71ae5a4SJacob Faibussowitsch PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options)
23d71ae5a4SJacob Faibussowitsch {
24c4762a1bSJed Brown PetscBool flg;
25c4762a1bSJed Brown
26c4762a1bSJed Brown PetscFunctionBegin;
27c6a7a370SJeremy L Thompson PetscCall(PetscStrncpy(options->filename, "", sizeof(options->filename)));
28c6a7a370SJeremy L Thompson PetscCall(PetscStrncpy(options->tagname, "petsc_tag", sizeof(options->tagname)));
29c4762a1bSJed Brown options->dim = -1;
30c4762a1bSJed Brown
31d0609cedSBarry Smith PetscOptionsBegin(comm, "", "MOAB example options", "DMMOAB");
329566063dSJacob Faibussowitsch PetscCall(PetscOptionsRangeInt("-dim", "The topological mesh dimension", "ex1.cxx", options->dim, &options->dim, NULL, PETSC_DECIDE, 3));
339566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-filename", "The file containing the mesh", "ex1.cxx", options->filename, options->filename, sizeof(options->filename), NULL));
349566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-tagname", "The tag name from which to create a vector", "ex1.cxx", options->tagname, options->tagname, sizeof(options->tagname), &flg));
35d0609cedSBarry Smith PetscOptionsEnd();
36c4762a1bSJed Brown
379566063dSJacob Faibussowitsch PetscCall(PetscLogEventRegister("CreateMesh", DM_CLASSID, &options->createMeshEvent));
383ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
39c4762a1bSJed Brown }
40c4762a1bSJed Brown
CreateMesh(MPI_Comm comm,AppCtx * user,DM * dm)41d71ae5a4SJacob Faibussowitsch PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *user, DM *dm)
42d71ae5a4SJacob Faibussowitsch {
43c4762a1bSJed Brown moab::Interface *iface = NULL;
44c4762a1bSJed Brown moab::Tag tag = NULL;
45c4762a1bSJed Brown moab::Tag ltog_tag = NULL;
46c4762a1bSJed Brown moab::Range range;
47c4762a1bSJed Brown PetscInt tagsize;
48c4762a1bSJed Brown moab::ErrorCode merr;
49c4762a1bSJed Brown
50c4762a1bSJed Brown PetscFunctionBegin;
519566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(user->createMeshEvent, 0, 0, 0, 0));
529566063dSJacob Faibussowitsch PetscCall(DMMoabCreateMoab(comm, iface, <og_tag, &range, dm));
53c4762a1bSJed Brown std::cout << "Created DMMoab using DMMoabCreateMoab." << std::endl;
549566063dSJacob Faibussowitsch PetscCall(DMMoabGetInterface(*dm, &iface));
55c4762a1bSJed Brown
56c4762a1bSJed Brown // load file and get entities of requested or max dimension
57c4762a1bSJed Brown if (strlen(user->filename) > 0) {
589371c9d4SSatish Balay merr = iface->load_file(user->filename);
599371c9d4SSatish Balay MBERRNM(merr);
60c4762a1bSJed Brown std::cout << "Read mesh from file " << user->filename << std::endl;
619371c9d4SSatish Balay } else {
62c4762a1bSJed Brown // make a simple structured mesh
63c4762a1bSJed Brown moab::ScdInterface *scdi;
64c4762a1bSJed Brown merr = iface->query_interface(scdi);
65c4762a1bSJed Brown
66c4762a1bSJed Brown moab::ScdBox *box;
679371c9d4SSatish Balay merr = scdi->construct_box(moab::HomCoord(0, 0, 0), moab::HomCoord(5, 5, 5), NULL, 0, box);
689371c9d4SSatish Balay MBERRNM(merr);
69c4762a1bSJed Brown user->dim = 3;
709371c9d4SSatish Balay merr = iface->set_dimension(user->dim);
719371c9d4SSatish Balay MBERRNM(merr);
72c4762a1bSJed Brown std::cout << "Created structured 5x5x5 mesh." << std::endl;
73c4762a1bSJed Brown }
74c4762a1bSJed Brown if (-1 == user->dim) {
75c4762a1bSJed Brown moab::Range tmp_range;
769371c9d4SSatish Balay merr = iface->get_entities_by_handle(0, tmp_range);
779371c9d4SSatish Balay MBERRNM(merr);
78ad540459SPierre Jolivet if (tmp_range.empty()) MBERRNM(moab::MB_FAILURE);
79c4762a1bSJed Brown user->dim = iface->dimension_from_handle(*tmp_range.rbegin());
80c4762a1bSJed Brown }
819371c9d4SSatish Balay merr = iface->get_entities_by_dimension(0, user->dim, range);
829371c9d4SSatish Balay MBERRNM(merr);
839566063dSJacob Faibussowitsch PetscCall(DMMoabSetLocalVertices(*dm, &range));
84c4762a1bSJed Brown
85c4762a1bSJed Brown // get the requested tag and create if necessary
86c4762a1bSJed Brown std::cout << "Creating tag with name: " << user->tagname << ";\n";
879371c9d4SSatish Balay merr = iface->tag_get_handle(user->tagname, 1, moab::MB_TYPE_DOUBLE, tag, moab::MB_TAG_CREAT | moab::MB_TAG_DENSE);
889371c9d4SSatish Balay MBERRNM(merr);
89c4762a1bSJed Brown {
90c4762a1bSJed Brown // initialize new tag with gids
91c4762a1bSJed Brown std::vector<double> tag_vals(range.size());
929371c9d4SSatish Balay merr = iface->tag_get_data(ltog_tag, range, tag_vals.data());
939371c9d4SSatish Balay MBERRNM(merr); // read them into ints
949371c9d4SSatish Balay double *dval = tag_vals.data();
959371c9d4SSatish Balay int *ival = reinterpret_cast<int *>(dval); // "stretch" them into doubles, from the end
96c4762a1bSJed Brown for (int i = tag_vals.size() - 1; i >= 0; i--) dval[i] = ival[i];
979371c9d4SSatish Balay merr = iface->tag_set_data(tag, range, tag_vals.data());
989371c9d4SSatish Balay MBERRNM(merr); // write them into doubles
99c4762a1bSJed Brown }
1009371c9d4SSatish Balay merr = iface->tag_get_length(tag, tagsize);
1019371c9d4SSatish Balay MBERRNM(merr);
102c4762a1bSJed Brown
1039566063dSJacob Faibussowitsch PetscCall(DMSetUp(*dm));
104c4762a1bSJed Brown
105c4762a1bSJed Brown // create the dmmoab and initialize its data
1069566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)*dm, "MOAB mesh"));
1079566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(user->createMeshEvent, 0, 0, 0, 0));
108c4762a1bSJed Brown user->dm = *dm;
1093ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
110c4762a1bSJed Brown }
111c4762a1bSJed Brown
main(int argc,char ** argv)112d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
113d71ae5a4SJacob Faibussowitsch {
114c4762a1bSJed Brown AppCtx user; /* user-defined work context */
115c4762a1bSJed Brown moab::ErrorCode merr;
116c4762a1bSJed Brown Vec vec;
117c4762a1bSJed Brown moab::Interface *mbImpl = NULL;
118c4762a1bSJed Brown moab::Tag datatag = NULL;
119c4762a1bSJed Brown
120327415f7SBarry Smith PetscFunctionBeginUser;
1219566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, NULL, help));
1229566063dSJacob Faibussowitsch PetscCall(ProcessOptions(PETSC_COMM_WORLD, &user));
123c4762a1bSJed Brown
1249566063dSJacob Faibussowitsch PetscCall(CreateMesh(PETSC_COMM_WORLD, &user, &user.dm)); /* create the MOAB dm and the mesh */
125c4762a1bSJed Brown
1269566063dSJacob Faibussowitsch PetscCall(DMMoabGetInterface(user.dm, &mbImpl));
1279371c9d4SSatish Balay merr = mbImpl->tag_get_handle(user.tagname, datatag);
1289371c9d4SSatish Balay MBERRNM(merr);
1299566063dSJacob Faibussowitsch PetscCall(DMMoabCreateVector(user.dm, datatag, NULL, PETSC_TRUE, PETSC_FALSE, &vec)); /* create a vec from user-input tag */
130c4762a1bSJed Brown
131c4762a1bSJed Brown std::cout << "Created VecMoab from existing tag." << std::endl;
1329566063dSJacob Faibussowitsch PetscCall(VecDestroy(&vec));
133c4762a1bSJed Brown std::cout << "Destroyed VecMoab." << std::endl;
1349566063dSJacob Faibussowitsch PetscCall(DMDestroy(&user.dm));
135c4762a1bSJed Brown std::cout << "Destroyed DMMoab." << std::endl;
1369566063dSJacob Faibussowitsch PetscCall(PetscFinalize());
137b122ec5aSJacob Faibussowitsch return 0;
138c4762a1bSJed Brown }
139c4762a1bSJed Brown
140c4762a1bSJed Brown /*TEST
141c4762a1bSJed Brown
142c4762a1bSJed Brown build:
143ca4445c7SIlya Fursov requires: moab !complex
144c4762a1bSJed Brown
145c4762a1bSJed Brown test:
146c4762a1bSJed Brown
147c4762a1bSJed Brown TEST*/
148