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; 20*c6a7a370SJeremy L Thompson PetscCall(PetscStrncpy(options->filename, "", sizeof(options->filename))); 21*c6a7a370SJeremy 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, <og_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: 136c4762a1bSJed Brown requires: moab 137c4762a1bSJed Brown 138c4762a1bSJed Brown test: 139c4762a1bSJed Brown 140c4762a1bSJed Brown TEST*/ 141