CArl
Code Arlequin / C++ implementation
rigid_body_nullspace_functions_3D.cpp File Reference

Go to the source code of this file.

Functions

void build_rigid_body_vectors (libMesh::ImplicitSystem &input_system, MatNullSpace &nullsp_sys)
 Build the rigid body modes associated to a given system. More...
 
void write_rigid_body_vectors (MatNullSpace &nullsp_sys, const std::string output_base, int rank)
 Export the rigid body mode vectors to a folder. More...
 

Function Documentation

void build_rigid_body_vectors ( libMesh::ImplicitSystem &  input_system,
MatNullSpace &  nullsp_sys 
)

Build the rigid body modes associated to a given system.

Mesh address

Definition at line 3 of file rigid_body_nullspace_functions_3D.cpp.

4 {
5  // --- Set up some temporary variables to simplify code
6 
7  // System matrix pointer (only used to get the proper vector dimensions)
8  libMesh::PetscMatrix<libMesh::Number> * mat_sys = libMesh::cast_ptr<libMesh::PetscMatrix<libMesh::Number>* >(input_system.matrix);
9 
11  const libMesh::MeshBase& mesh_sys = input_system.get_mesh();
12 
13  // System number
14  unsigned int sys_number = input_system.number();
15 
16  // --- Set the coordinates vector structure as the same of rigidity matrix
17  Vec coord_vec_PETSC;
18  PetscInt local_N;
19  MatGetLocalSize(mat_sys->mat(),NULL,&local_N);
20  VecCreate(mesh_sys.comm().get(),&coord_vec_PETSC);
21  VecSetSizes(coord_vec_PETSC,local_N,mat_sys->n());
22  VecSetBlockSize(coord_vec_PETSC,mesh_sys.mesh_dimension());
23  VecSetFromOptions(coord_vec_PETSC);
24 
25  libMesh::PetscVector<libMesh::Number> coord_vec(coord_vec_PETSC,mesh_sys.comm());
26 
27  // --- Fill the coordinates vector
28  auto node_it = mesh_sys.local_nodes_begin();
29  auto node_it_end = mesh_sys.local_nodes_end();
30 
31  unsigned int dof_number = 0;
32 
33  for( ; node_it != node_it_end; ++node_it)
34  {
35  const libMesh::Node* node = *node_it;
36 
37  for(unsigned int var=0; var<node->n_dofs(sys_number); var++)
38  {
39  dof_number = node->dof_number(sys_number,var,0);
40  coord_vec.set(dof_number,node->operator ()(var));
41  }
42  }
43 
44  MatNullSpaceCreateRigidBody(coord_vec.vec(),&nullsp_sys);
45  VecDestroy(&coord_vec_PETSC);
46 };
void write_rigid_body_vectors ( MatNullSpace &  nullsp_sys,
const std::string  output_base,
int  rank 
)

Export the rigid body mode vectors to a folder.

Definition at line 49 of file rigid_body_nullspace_functions_3D.cpp.

50 {
51  // PETSc variables
52  PetscInt nullsp_nvecs;
53  const Vec * nullsp_vecs;
54  PetscBool nullsp_has_const;
55 
56  // Get the vectors
57  MatNullSpaceGetVecs(nullsp_sys,&nullsp_has_const,&nullsp_nvecs,&nullsp_vecs);
58 
59  // Print them
60  std::string filename;
61  for(int iii = 0; iii < nullsp_nvecs; ++iii)
62  {
63  filename = output_base + "_rb_vector_" + std::to_string(iii) + "_n_" + std::to_string(nullsp_nvecs);
64 
65  // Export the RB vector
66  carl::write_PETSC_vector(nullsp_vecs[iii], filename + ".petscvec",rank,PETSC_COMM_WORLD);
67 
68 // Print MatLab debugging output? Variable defined at "carl_headers.h"
69 #ifdef PRINT_MATLAB_DEBUG
70  carl::write_PETSC_vector_MATLAB(nullsp_vecs[iii],filename + ".m",PETSC_COMM_WORLD);
71 #endif
72  };
73 };
void write_PETSC_vector(libMesh::PetscVector< libMesh::Number > &input_vec, const std::string &filename, int dim=1)
void write_PETSC_vector_MATLAB(Vec input_vec, const std::string &filename, MPI_Comm comm=PETSC_COMM_WORLD)