xref: /petsc/src/dm/impls/moab/tests/ex1.cxx (revision b122ec5aa1bd4469eb4e0673542fb7de3f411254)
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 
15c4762a1bSJed Brown PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options)
16c4762a1bSJed Brown {
17c4762a1bSJed Brown   PetscErrorCode ierr;
18c4762a1bSJed Brown   PetscBool      flg;
19c4762a1bSJed Brown 
20c4762a1bSJed Brown   PetscFunctionBegin;
215f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrcpy(options->filename, ""));
225f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrcpy(options->tagname, "petsc_tag"));
23c4762a1bSJed Brown   options->dim = -1;
24c4762a1bSJed Brown 
25c4762a1bSJed Brown   ierr = PetscOptionsBegin(comm, "", "MOAB example options", "DMMOAB");CHKERRQ(ierr);
265f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsRangeInt("-dim", "The topological mesh dimension", "ex1.cxx", options->dim, &options->dim, NULL,PETSC_DECIDE,3));
275f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsString("-filename", "The file containing the mesh", "ex1.cxx", options->filename, options->filename, sizeof(options->filename), NULL));
285f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsString("-tagname", "The tag name from which to create a vector", "ex1.cxx", options->tagname, options->tagname, sizeof(options->tagname), &flg));
291e1ea65dSPierre Jolivet   ierr = PetscOptionsEnd();CHKERRQ(ierr);
30c4762a1bSJed Brown 
315f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogEventRegister("CreateMesh",          DM_CLASSID,   &options->createMeshEvent));
32c4762a1bSJed Brown   PetscFunctionReturn(0);
33c4762a1bSJed Brown }
34c4762a1bSJed Brown 
35c4762a1bSJed Brown PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *user, DM *dm)
36c4762a1bSJed Brown {
37c4762a1bSJed Brown   moab::Interface *iface=NULL;
38c4762a1bSJed Brown   moab::Tag tag=NULL;
39c4762a1bSJed Brown   moab::Tag ltog_tag=NULL;
40c4762a1bSJed Brown   moab::Range range;
41c4762a1bSJed Brown   PetscInt tagsize;
42c4762a1bSJed Brown   moab::ErrorCode merr;
43c4762a1bSJed Brown 
44c4762a1bSJed Brown   PetscFunctionBegin;
455f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogEventBegin(user->createMeshEvent,0,0,0,0));
465f80ce2aSJacob Faibussowitsch   CHKERRQ(DMMoabCreateMoab(comm, iface, &ltog_tag, &range, dm));
47c4762a1bSJed Brown   std::cout << "Created DMMoab using DMMoabCreateMoab." << std::endl;
485f80ce2aSJacob Faibussowitsch   CHKERRQ(DMMoabGetInterface(*dm, &iface));
49c4762a1bSJed Brown 
50c4762a1bSJed Brown     // load file and get entities of requested or max dimension
51c4762a1bSJed Brown   if (strlen(user->filename) > 0) {
52c4762a1bSJed Brown     merr = iface->load_file(user->filename);MBERRNM(merr);
53c4762a1bSJed Brown     std::cout << "Read mesh from file " << user->filename << std::endl;
54c4762a1bSJed Brown   }
55c4762a1bSJed Brown   else {
56c4762a1bSJed Brown       // make a simple structured mesh
57c4762a1bSJed Brown     moab::ScdInterface *scdi;
58c4762a1bSJed Brown     merr = iface->query_interface(scdi);
59c4762a1bSJed Brown 
60c4762a1bSJed Brown     moab::ScdBox *box;
61c4762a1bSJed Brown     merr = scdi->construct_box (moab::HomCoord(0,0,0), moab::HomCoord(5,5,5), NULL, 0, box);MBERRNM(merr);
62c4762a1bSJed Brown     user->dim = 3;
63c4762a1bSJed Brown     merr = iface->set_dimension(user->dim);MBERRNM(merr);
64c4762a1bSJed Brown     std::cout << "Created structured 5x5x5 mesh." << std::endl;
65c4762a1bSJed Brown   }
66c4762a1bSJed Brown   if (-1 == user->dim) {
67c4762a1bSJed Brown     moab::Range tmp_range;
68c4762a1bSJed Brown     merr = iface->get_entities_by_handle(0, tmp_range);MBERRNM(merr);
69c4762a1bSJed Brown     if (tmp_range.empty()) {
70c4762a1bSJed Brown       MBERRNM(moab::MB_FAILURE);
71c4762a1bSJed Brown     }
72c4762a1bSJed Brown     user->dim = iface->dimension_from_handle(*tmp_range.rbegin());
73c4762a1bSJed Brown   }
74c4762a1bSJed Brown   merr = iface->get_entities_by_dimension(0, user->dim, range);MBERRNM(merr);
755f80ce2aSJacob Faibussowitsch   CHKERRQ(DMMoabSetLocalVertices(*dm, &range));
76c4762a1bSJed Brown 
77c4762a1bSJed Brown     // get the requested tag and create if necessary
78c4762a1bSJed Brown   std::cout << "Creating tag with name: " << user->tagname << ";\n";
79c4762a1bSJed Brown   merr = iface->tag_get_handle(user->tagname, 1, moab::MB_TYPE_DOUBLE, tag, moab::MB_TAG_CREAT | moab::MB_TAG_DENSE);MBERRNM(merr);
80c4762a1bSJed Brown   {
81c4762a1bSJed Brown       // initialize new tag with gids
82c4762a1bSJed Brown     std::vector<double> tag_vals(range.size());
83c4762a1bSJed Brown     merr = iface->tag_get_data(ltog_tag, range, tag_vals.data());MBERRNM(merr); // read them into ints
84c4762a1bSJed Brown     double *dval = tag_vals.data(); int *ival = reinterpret_cast<int*>(dval); // "stretch" them into doubles, from the end
85c4762a1bSJed Brown     for (int i = tag_vals.size()-1; i >= 0; i--) dval[i] = ival[i];
86c4762a1bSJed Brown     merr = iface->tag_set_data(tag, range, tag_vals.data());MBERRNM(merr); // write them into doubles
87c4762a1bSJed Brown   }
88c4762a1bSJed Brown   merr = iface->tag_get_length(tag, tagsize);MBERRNM(merr);
89c4762a1bSJed Brown 
905f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSetUp(*dm));
91c4762a1bSJed Brown 
92c4762a1bSJed Brown     // create the dmmoab and initialize its data
935f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectSetName((PetscObject) *dm, "MOAB mesh"));
945f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogEventEnd(user->createMeshEvent,0,0,0,0));
95c4762a1bSJed Brown   user->dm = *dm;
96c4762a1bSJed Brown   PetscFunctionReturn(0);
97c4762a1bSJed Brown }
98c4762a1bSJed Brown 
99c4762a1bSJed Brown int main(int argc, char **argv)
100c4762a1bSJed Brown {
101c4762a1bSJed Brown   AppCtx            user;                 /* user-defined work context */
102c4762a1bSJed Brown   moab::ErrorCode   merr;
103c4762a1bSJed Brown   Vec               vec;
104c4762a1bSJed Brown   moab::Interface*  mbImpl=NULL;
105c4762a1bSJed Brown   moab::Tag         datatag=NULL;
106c4762a1bSJed Brown 
107*b122ec5aSJacob Faibussowitsch   CHKERRQ(PetscInitialize(&argc, &argv, NULL,help));
1085f80ce2aSJacob Faibussowitsch   CHKERRQ(ProcessOptions(PETSC_COMM_WORLD, &user));
109c4762a1bSJed Brown 
1105f80ce2aSJacob Faibussowitsch   CHKERRQ(CreateMesh(PETSC_COMM_WORLD, &user, &user.dm)); /* create the MOAB dm and the mesh */
111c4762a1bSJed Brown 
1125f80ce2aSJacob Faibussowitsch   CHKERRQ(DMMoabGetInterface(user.dm, &mbImpl));
113c4762a1bSJed Brown   merr = mbImpl->tag_get_handle(user.tagname, datatag);MBERRNM(merr);
1145f80ce2aSJacob Faibussowitsch   CHKERRQ(DMMoabCreateVector(user.dm, datatag, NULL, PETSC_TRUE, PETSC_FALSE,&vec)); /* create a vec from user-input tag */
115c4762a1bSJed Brown 
116c4762a1bSJed Brown   std::cout << "Created VecMoab from existing tag." << std::endl;
1175f80ce2aSJacob Faibussowitsch   CHKERRQ(VecDestroy(&vec));
118c4762a1bSJed Brown   std::cout << "Destroyed VecMoab." << std::endl;
1195f80ce2aSJacob Faibussowitsch   CHKERRQ(DMDestroy(&user.dm));
120c4762a1bSJed Brown   std::cout << "Destroyed DMMoab." << std::endl;
121*b122ec5aSJacob Faibussowitsch   CHKERRQ(PetscFinalize());
122*b122ec5aSJacob Faibussowitsch   return 0;
123c4762a1bSJed Brown }
124c4762a1bSJed Brown 
125c4762a1bSJed Brown /*TEST
126c4762a1bSJed Brown 
127c4762a1bSJed Brown      build:
128c4762a1bSJed Brown        requires: moab
129c4762a1bSJed Brown 
130c4762a1bSJed Brown      test:
131c4762a1bSJed Brown 
132c4762a1bSJed Brown TEST*/
133