50                                 {
   51 
   52  
   53  const char param_file[] = "param_file.petsc";
   55 
   56  
   57  auto core_log = logging::core::get();
   61  core_log->add_sink(
   65 
   66  #ifdef ENABLE_PYTHON_BINDING
   67  Py_Initialize();
   68  np::initialize();
   69  MOFEM_LOG(
"EP", Sev::inform) << 
"Python initialised";
 
   70#else
   71  MOFEM_LOG(
"EP", Sev::inform) << 
"Python NOT initialised";
 
   72#endif
   73 
   74  core_log->add_sink(
   78 
   79  try {
   80 
   81    
   82    PetscBool flg = PETSC_TRUE;
   85                                 255, &flg);
   87                                 255, &flg);
   88    char restart_file[255];
   89    PetscBool restart_flg = PETSC_TRUE;
   91                                 &restart_flg);
   92    double time = 0;
   94 
   95    
   96    DMType dm_name = "DMMOFEM";
   98    DMType dm_name_mg = "DMMOFEM_MG";
  100 
  101    
  102    moab::Core moab_core;
  103    moab::Interface &moab = moab_core;
  104 
  105    ParallelComm *pcomm = ParallelComm::get_pcomm(&moab, 
MYPCOMM_INDEX);
 
  106    if (pcomm == NULL)
  107      pcomm = new ParallelComm(&moab, PETSC_COMM_WORLD);
  108    
  109    PetscBool fully_distributed = PETSC_FALSE;
  111                               &fully_distributed, PETSC_NULLPTR);
  112    if (fully_distributed) {
  113      const char *option;
  114      if (pcomm->proc_config().proc_size() == 1)
  115        option = "";
  116      else
  117        option = "PARALLEL=READ_PART;"
  118                 "PARALLEL_RESOLVE_SHARED_ENTS;"
  119                 "PARTITION=PARALLEL_PARTITION";
  121    } else {
  124    }
  125 
  126    
  127    MOFEM_LOG(
"EP", Sev::inform) << 
"Initialise MoFEM database";
 
  130    MOFEM_LOG(
"EP", Sev::inform) << 
"Initialise MoFEM database <- done";
 
  131 
  133 
  134    
  136 
  139        0, 3, bit_level0);
  140 
  141    
  143 
  147    auto get_adj = [&](
Range ents, 
int dim) {
 
  149      CHKERR moab.get_adjacencies(ents, dim, 
false, adj,
 
  150                                  moab::Interface::UNION);
  151      return adj;
  152    };
  154        *meshset_ptr,
  157                2));
  159        *meshset_ptr,
  162                1));
  164        *meshset_ptr,
  167                0));
  168 
  169    
  170    CHKERR ep.createCrackSurfaceMeshset();
 
  171 
  172    CHKERR ep.getSpatialDispBc();
 
  173    CHKERR ep.getSpatialRotationBc();
 
  174    CHKERR ep.getSpatialTractionBc();
 
  175    CHKERR ep.getSpatialTractionFreeBc();
 
  176    CHKERR ep.getExternalStrain();
 
  177    CHKERR ep.setBlockTagsOnSkin();
 
  178 
  179    CHKERR ep.createExchangeVectors(Sev::inform);
 
  180 
  181    CHKERR ep.addFields(*meshset_ptr);
 
  182    CHKERR ep.projectGeometry(*meshset_ptr);
 
  183    CHKERR ep.addVolumeFiniteElement(*meshset_ptr);
 
  184    CHKERR ep.addBoundaryFiniteElement(*meshset_ptr);
 
  186 
  187    enum MaterialModel {
  188      StVenantKirchhoff,
  189      MooneyRivlin,
  190      Hencky,
  191      Neohookean,
  192      LastMaterial
  193    };
  194    const char *list_materials[LastMaterial] = {
  195        "stvenant_kirchhoff", "mooney_rivlin", "hencky", "neo_hookean"};
  196    PetscInt choice_material = MooneyRivlin;
  198                                LastMaterial, &choice_material, PETSC_NULLPTR);
  199 
  200    switch (choice_material) {
  201    case StVenantKirchhoff:
  202      MOFEM_LOG(
"EP", Sev::inform) << 
"StVenantKirchhoff material model";
 
  205      break;
  206    case MooneyRivlin:
  207      MOFEM_LOG(
"EP", Sev::inform) << 
"MooneyRivlin material model";
 
  208      MOFEM_LOG(
"EP", Sev::inform) << 
"MU(1, 0)/2 = " << 
MU(1, 0) / 2;
 
  212      break;
  213    case Hencky:
  214      MOFEM_LOG(
"EP", Sev::inform) << 
"Hencky material model";
 
  215      CHKERR ep.addMaterial_Hencky(5., 0.25);
 
  216      break;
  217    case Neohookean:
  218      MOFEM_LOG(
"EP", Sev::inform) << 
"Neo-Hookean material model";
 
  220      break;
  221    default:
  223      break;
  224    }
  225 
  227    CHKERR ep.setElasticElementToTs(ep.dmElastic);
 
  228 
  232    CHKERR VecSetOption(f_elastic, VEC_IGNORE_NEGATIVE_INDICES, PETSC_TRUE);
 
  233 
  234    PetscInt start_step = 0;
  235    if (restart_flg) {
  236      PetscViewer viewer;
  237      CHKERR PetscViewerBinaryOpen(PETSC_COMM_WORLD, restart_file,
 
  238                                   FILE_MODE_READ, &viewer);
  239      CHKERR VecLoad(x_elastic, viewer);
 
  240      CHKERR PetscViewerDestroy(&viewer);
 
  242                                     SCATTER_REVERSE);
  243 
  244      std::string restart_file_str(restart_file);
  245      std::regex restart_pattern(R"(restart_([1-9]\d*)\.dat)");
  246      std::smatch match;
  247      if (std::regex_match(restart_file_str, match, restart_pattern)) {
  248        start_step = std::stoi(match[1]);
  249      } else {
  251                "Restart file name must be in the format restart_##.dat");
  252      }
  253    }
  254 
  255    auto ts_elastic = 
createTS(PETSC_COMM_WORLD);
 
  256    CHKERR TSSetType(ts_elastic, TSBEULER);
 
  258    TSAdapt adapt;
  259    CHKERR TSGetAdapt(ts_elastic, &adapt);
 
  260    CHKERR TSAdaptSetType(adapt, TSADAPTNONE);
 
  261    CHKERR TSSetTime(ts_elastic, time);
 
  262    CHKERR TSSetStepNumber(ts_elastic, start_step);
 
  263 
  264    if(ep.dynamicRelaxation) {
  265      CHKERR ep.solveDynamicRelaxation(ts_elastic, x_elastic);
 
  266    } else {
  267      CHKERR ep.solveElastic(ts_elastic, x_elastic);
 
  268    }
  269 
  270  }
  272 
  273  
  275 
  276#ifdef ENABLE_PYTHON_BINDING
  277  if (Py_FinalizeEx() < 0) {
  278    exit(120);
  279  }
  280#endif
  281}
#define CATCH_ERRORS
Catch errors.
#define MYPCOMM_INDEX
default communicator number PCOMM
@ MOFEM_DATA_INCONSISTENCY
#define CHKERR
Inline error check.
PetscErrorCode DMoFEMMeshToLocalVector(DM dm, Vec l, InsertMode mode, ScatterMode scatter_mode)
set local (or ghosted) vector values on mesh for partition only
PetscErrorCode DMRegister_MoFEM(const char sname[])
Register MoFEM problem.
MoFEMErrorCode DMRegister_MGViaApproxOrders(const char sname[])
Register DM for Multi-Grid via approximation orders.
PetscErrorCode DMCreateGlobalVector_MoFEM(DM dm, Vec *g)
DMShellSetCreateGlobalVector.
static LoggerType & setLog(const std::string channel)
Set ans resset chanel logger.
#define MOFEM_LOG(channel, severity)
Log.
#define MOFEM_LOG_TAG(channel, tag)
Tag channel.
std::bitset< BITREFLEVEL_SIZE > BitRefLevel
Bit structure attached to each entity identifying to what mesh entity is attached.
PetscErrorCode PetscOptionsGetBool(PetscOptions *, const char pre[], const char name[], PetscBool *bval, PetscBool *set)
PetscErrorCode PetscOptionsGetScalar(PetscOptions *, const char pre[], const char name[], PetscScalar *dval, PetscBool *set)
SmartPetscObj< Vec > vectorDuplicate(Vec vec)
Create duplicate vector of smart vector.
auto createTS(MPI_Comm comm)
PetscErrorCode PetscOptionsGetEList(PetscOptions *, const char pre[], const char name[], const char *const *list, PetscInt next, PetscInt *value, PetscBool *set)
PetscErrorCode PetscOptionsGetString(PetscOptions *, const char pre[], const char name[], char str[], size_t size, PetscBool *set)
auto get_temp_meshset_ptr(moab::Interface &moab)
Create smart pointer to temporary meshset.
PetscErrorCode TSAdaptCreateMoFEM(TSAdapt adapt)
Craete MOFEM adapt.
static Range getPartEntities(moab::Interface &moab, int part)
static MoFEMErrorCode loadFileRootProcAllRestDistributed(moab::Interface &moab, const char *file_name, int dim, LoadFileFun proc_skin_fun=defaultProcSkinFun, const char *options="PARALLEL=BCAST;PARTITION=")
Root proc has whole mesh, other procs only part of it.
virtual MPI_Comm & get_comm() const =0
static MoFEMErrorCode Initialize(int *argc, char ***args, const char file[], const char help[])
Initializes the MoFEM database PETSc, MOAB and MPI.
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
Deprecated interface functions.
static boost::shared_ptr< SinkType > createSink(boost::shared_ptr< std::ostream > stream_ptr, std::string comm_filter)
Create a sink object.
static boost::shared_ptr< std::ostream > getStrmWorld()
Get the strm world object.
static boost::shared_ptr< std::ostream > getStrmSync()
Get the strm sync object.
static boost::shared_ptr< std::ostream > getStrmSelf()
Get the strm self object.
Interface for managing meshsets containing materials and boundary conditions.
intrusive_ptr for managing petsc objects
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.