v0.14.0
Loading...
Searching...
No Matches
wavy_surface.cpp
Go to the documentation of this file.
1/** \file wavy_surface.cpp
2 \example wavy_surface.cpp
3 \brief Creating wavy surface
4
5*/
6
7/* This file is part of MoFEM.
8 * MoFEM is free software: you can redistribute it and/or modify it under
9 * the terms of the GNU Lesser General Public License as published by the
10 * Free Software Foundation, either version 3 of the License, or (at your
11 * option) any later version.
12 *
13 * MoFEM is distributed in the hope that it will be useful, but WITHOUT
14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
16 * License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with MoFEM. If not, see <http://www.gnu.org/licenses/>. */
20
21#include <MoFEM.hpp>
22
23namespace bio = boost::iostreams;
24using bio::stream;
25using bio::tee_device;
26
27using namespace MoFEM;
28
29static char help[] = "...\n\n";
30static int debug = 1;
31
32int main(int argc, char *argv[]) {
33
34 MoFEM::Core::Initialize(&argc, &argv, (char *)0, help);
35
36 try {
37
38 moab::Core mb_instance;
39 moab::Interface &moab = mb_instance;
40 int rank;
41 MPI_Comm_rank(PETSC_COMM_WORLD, &rank);
42
43 // Read parameters from line command
44 PetscBool flg_mesh_file = PETSC_TRUE;
45 PetscBool flg_out_file = PETSC_TRUE;
46 char mesh_file_name[255];
47 char out_file_name[255] = "out.h5m";
48
49 double lambda = 1.0;
50 double delta = 0.01;
51 double height = 1.0;
52 int dim = 2;
53
54 CHKERR PetscOptionsBegin(PETSC_COMM_WORLD, "", "ADD_PRISMS_LAYER", "none");
55
56 CHKERR PetscOptionsString("-my_file", "mesh file name", "", "mesh.h5m",
57 mesh_file_name, 255, &flg_mesh_file);
58 CHKERR PetscOptionsString("-my_out_file", "out file name", "", "out.h5m",
59 out_file_name, 255, &flg_out_file);
60
61 CHKERR PetscOptionsInt("-my_dim", "dimension (2 or 3)", "", dim, &dim,
62 PETSC_NULL);
63
64 CHKERR PetscOptionsReal("-my_lambda", "roughness wavelength", "", lambda,
65 &lambda, PETSC_NULL);
66 CHKERR PetscOptionsReal("-my_delta", "roughness amplitude", "", delta,
67 &delta, PETSC_NULL);
68 CHKERR PetscOptionsReal("-my_height", "vertical dimension of the mesh", "",
69 height, &height, PETSC_NULL);
70
71 int ierr = PetscOptionsEnd();
73
74 if (flg_mesh_file != PETSC_TRUE) {
75 SETERRQ(PETSC_COMM_SELF, 1, "*** ERROR -my_file (MESH FILE NEEDED)");
76 }
77
78 // Read mesh to MOAB
79 const char *option;
80 option = ""; //"PARALLEL=BCAST;";//;DEBUG_IO";
81 CHKERR moab.load_file(mesh_file_name, 0, option);
82 ParallelComm *pcomm = ParallelComm::get_pcomm(&moab, MYPCOMM_INDEX);
83 if (pcomm == NULL)
84 pcomm = new ParallelComm(&moab, PETSC_COMM_WORLD);
85
86 // Create MoFEM (Joseph) databas
87 MoFEM::Core core(moab);
88 MoFEM::Interface &m_field = core;
89
90 Range tets, tris, nodes, all_nodes;
92 if (bit->getName().compare(0, 11, "MAT_ELASTIC") == 0) {
93 const int id = bit->getMeshsetId();
94 if (id == 1) {
95 CHKERR m_field.get_moab().get_entities_by_dimension(bit->getMeshset(),
96 3, tets, true);
97 CHKERR m_field.get_moab().get_entities_by_dimension(bit->getMeshset(),
98 2, tris, true);
99 }
100 }
101 }
102
103 CHKERR m_field.get_moab().get_connectivity(tets, nodes);
104 all_nodes.merge(nodes);
105 nodes.clear();
106 CHKERR m_field.get_moab().get_connectivity(tris, nodes);
107 all_nodes.merge(nodes);
108
109 double coords[3];
110 for (Range::iterator nit = all_nodes.begin(); nit != all_nodes.end();
111 nit++) {
112 CHKERR moab.get_coords(&*nit, 1, coords);
113 double x = coords[0];
114 double y = coords[1];
115 double z = coords[2];
116 double coef = (height + z) / height;
117 switch (dim) {
118 case 2:
119 coords[2] -= coef * delta * (1. - cos(2. * M_PI * x / lambda));
120 break;
121 case 3:
122 coords[2] -=
123 coef * delta *
124 (1. - cos(2. * M_PI * x / lambda) * cos(2. * M_PI * y / lambda));
125 break;
126 default:
127 SETERRQ1(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
128 "Wrong dimension = %d", dim);
129 }
130
131 CHKERR moab.set_coords(&*nit, 1, coords);
132 }
133
134 EntityHandle rootset = moab.get_root_set();
135 CHKERR moab.write_file(out_file_name, "MOAB", "", &rootset, 1);
136 MOFEM_LOG_C("WORLD", Sev::inform, "Write file %s\n",
137 string(out_file_name).c_str());
138 }
140
142 return 0;
143}
#define MOFEM_LOG_C(channel, severity, format,...)
int main()
#define CATCH_ERRORS
Catch errors.
#define MYPCOMM_INDEX
default communicator number PCOMM
#define CHKERRG(n)
Check error code of MoFEM/MOAB/PETSc function.
@ BLOCKSET
@ MOFEM_DATA_INCONSISTENCY
Definition definitions.h:31
#define CHKERR
Inline error check.
#define _IT_CUBITMESHSETS_BY_SET_TYPE_FOR_LOOP_(MESHSET_MANAGER, CUBITBCTYPE, IT)
Iterator that loops over a specific Cubit MeshSet having a particular BC meshset in a moFEM field.
auto bit
set bit
static double lambda
char out_file_name[255]
char mesh_file_name[255]
static MoFEMErrorCodeGeneric< PetscErrorCode > ierr
implementation of Data Operators for Forces and Sources
Definition Common.hpp:10
static const bool debug
static constexpr double delta
virtual moab::Interface & get_moab()=0
Core (interface) class.
Definition Core.hpp:82
static MoFEMErrorCode Initialize(int *argc, char ***args, const char file[], const char help[])
Initializes the MoFEM database PETSc, MOAB and MPI.
Definition Core.cpp:72
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
Definition Core.cpp:112
Deprecated interface functions.
static char help[]