86 {
87
89
90 try {
91
92 moab::Core mb_instance;
93 moab::Interface& moab = mb_instance;
94 int rank;
95 MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
96
97
98 PetscBool flg = PETSC_TRUE;
101 if(flg != PETSC_TRUE) {
102 SETERRQ(PETSC_COMM_SELF,1,"*** ERROR -my_file (MESH FILE NEEDED)");
103 }
106 if(flg != PETSC_TRUE) {
108 }
109
110
111 const char *option;
112 option = "";
114 ParallelComm* pcomm = ParallelComm::get_pcomm(&moab,
MYPCOMM_INDEX);
115 if(pcomm == NULL) pcomm = new ParallelComm(&moab,PETSC_COMM_WORLD);
116
117
118 PetscLogDouble t1,t2;
119 PetscLogDouble v1,v2;
120 ierr = PetscTime(&v1); CHKERRQ(
ierr);
121 ierr = PetscGetCPUTime(&t1); CHKERRQ(
ierr);
122
123
126
127
129
130
132 bit_level0.set(0);
136 ierr = m_field.get_entities_by_ref_level(bit_level0,
BitRefLevel().set(),meshset_level0); CHKERRQ(
ierr);
137
138
139
140
141
142 int field_rank=3;
148
149
150
153
154
155
160
165
166
167
168
169
170 boost::shared_ptr<Hooke<adouble> > hooke_adouble(
new Hooke<adouble>);
171 boost::shared_ptr<Hooke<double> > hooke_double(
new Hooke<double>);
173 ierr = elastic.setBlocks(hooke_double,hooke_adouble); CHKERRQ(
ierr);
174 ierr = elastic.addElement(
"ELASTIC",
"DISPLACEMENT"); CHKERRQ(
ierr);
175 ierr = elastic.setOperators(
"DISPLACEMENT",
"MESH_NODE_POSITIONS",
false,
true); CHKERRQ(
ierr);
176
177
179 lagrangian_element.addLagrangiangElement("LAGRANGE_ELEM","DISPLACEMENT","LAGRANGE_MUL_TRAC","MESH_NODE_POSITIONS");
180 lagrangian_element.addLagrangiangElement("LAGRANGE_ELEM_TRANS","DISPLACEMENT","LAGRANGE_MUL_RIGID_TRANS","MESH_NODE_POSITIONS");
181 lagrangian_element.addLagrangiangElement("LAGRANGE_ELEM_ROT","DISPLACEMENT","LAGRANGE_MUL_RIGID_ROT","MESH_NODE_POSITIONS");
182
183
185
186
191
192
193
195
196
197
198
199
200
201
204 ierr = m_field.
loop_dofs(
"MESH_NODE_POSITIONS",ent_method_material); CHKERRQ(
ierr);
205
206
208
209
211
212
213 ierr = m_field.build_problems(); CHKERRQ(
ierr);
214
215
216
217
218
219 ierr = m_field.partition_problem(
"ELASTIC_MECHANICS"); CHKERRQ(
ierr);
220 ierr = m_field.partition_finite_elements(
"ELASTIC_MECHANICS"); CHKERRQ(
ierr);
221
222 ierr = m_field.partition_ghost_dofs(
"ELASTIC_MECHANICS"); CHKERRQ(
ierr);
223
224
225 ierr = m_field.print_cubit_displacement_set(); CHKERRQ(
ierr);
226 ierr = m_field.print_cubit_force_set(); CHKERRQ(
ierr);
227
228 ierr = m_field.print_cubit_materials_set(); CHKERRQ(
ierr);
229
230
232 ierr = m_field.VecCreateGhost(
"ELASTIC_MECHANICS",
ROW,&
F[0]); CHKERRQ(
ierr);
233 for(int ii = 1;ii<6;ii++) {
234 ierr = VecDuplicate(
F[0],&
F[ii]); CHKERRQ(
ierr);
235 }
236
238 ierr = m_field.VecCreateGhost(
"ELASTIC_MECHANICS",
COL,&
D); CHKERRQ(
ierr);
239
240 Mat Aij;
241 ierr = m_field.MatCreateMPIAIJWithArrays(
"ELASTIC_MECHANICS",&Aij); CHKERRQ(
ierr);
242
244 ierr = VecGhostUpdateBegin(
D,INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
245 ierr = VecGhostUpdateEnd(
D,INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
246 ierr = m_field.set_global_ghost_vector(
247 "ELASTIC_MECHANICS",
ROW,
D,INSERT_VALUES,SCATTER_REVERSE
249
250 for(int ii = 0;ii<6;ii++) {
251 ierr = VecZeroEntries(
F[ii]); CHKERRQ(
ierr);
252 ierr = VecGhostUpdateBegin(
F[ii],INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
253 ierr = VecGhostUpdateEnd(
F[ii],INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
254 }
255 ierr = MatZeroEntries(Aij); CHKERRQ(
ierr);
256
257
258 elastic.getLoopFeLhs().snes_B = Aij;
260 lagrangian_element.setRVEBCsOperators(
"DISPLACEMENT",
"LAGRANGE_MUL_TRAC",
"MESH_NODE_POSITIONS",Aij,
F);
263
265 lagrangian_element_rigid_body_trans.setRVEBCsRigidBodyTranOperators("DISPLACEMENT","LAGRANGE_MUL_RIGID_TRANS",Aij, lagrangian_element.setOfRVEBC);
266 ierr = m_field.
loop_finite_elements(
"ELASTIC_MECHANICS",
"LAGRANGE_ELEM_TRANS",lagrangian_element_rigid_body_trans.getLoopFeRVEBCLhs()); CHKERRQ(
ierr);
267
269 lagrangian_element_rigid_body_rot.setRVEBCsRigidBodyRotOperators("DISPLACEMENT","LAGRANGE_MUL_RIGID_ROT",Aij, lagrangian_element.setOfRVEBC);
270 ierr = m_field.
loop_finite_elements(
"ELASTIC_MECHANICS",
"LAGRANGE_ELEM_ROT",lagrangian_element_rigid_body_rot.getLoopFeRVEBCLhs()); CHKERRQ(
ierr);
271
272
273
274
275
276
277 ierr = MatAssemblyBegin(Aij,MAT_FINAL_ASSEMBLY); CHKERRQ(
ierr);
278 ierr = MatAssemblyEnd(Aij,MAT_FINAL_ASSEMBLY); CHKERRQ(
ierr);
279
280 for(int ii = 0;ii<6;ii++) {
281 ierr = VecGhostUpdateBegin(
F[ii],ADD_VALUES,SCATTER_REVERSE); CHKERRQ(
ierr);
282 ierr = VecGhostUpdateEnd(
F[ii],ADD_VALUES,SCATTER_REVERSE); CHKERRQ(
ierr);
283 ierr = VecAssemblyBegin(
F[ii]); CHKERRQ(
ierr);
284 ierr = VecAssemblyEnd(
F[ii]); CHKERRQ(
ierr);
285 }
286
287
288
289
290
291
292
293
294
295
296
297
298
301 int volume_vec_ghost[] = { 0 };
302 ierr = VecCreateGhost(
303 PETSC_COMM_WORLD,(!m_field.
get_comm_rank())?1:0,1,1,volume_vec_ghost,&volume_vec
305 ierr = VecZeroEntries(volume_vec); CHKERRQ(
ierr);
306 vol_elem.getOpPtrVector().push_back(
new VolumeCalculation(
"DISPLACEMENT",volume_vec));
307
309
310 ierr = VecAssemblyBegin(volume_vec); CHKERRQ(
ierr);
311 ierr = VecAssemblyEnd(volume_vec); CHKERRQ(
ierr);
312 double rve_volume;
313 ierr = VecSum(volume_vec,&rve_volume); CHKERRQ(
ierr);
314
315 ierr = VecView(volume_vec,PETSC_VIEWER_STDOUT_WORLD); CHKERRQ(
ierr);
316 ierr = PetscPrintf(PETSC_COMM_WORLD,
"RVE Volume %3.2g\n",rve_volume); CHKERRQ(
ierr);
317 ierr = VecDestroy(&volume_vec);
318
319
320
321
323 bool doPreProcess;
324 bool doPostProcess;
327 doPreProcess(true),
328 doPostProcess(true)
329 {}
330 void setDoPreProcess() { doPreProcess = true; }
331 void unSetDoPreProcess() { doPreProcess = false; }
332 void setDoPostProcess() { doPostProcess = true; }
333 void unSetDoPostProcess() { doPostProcess = false; }
334
335
336
338 PetscFunctionBegin;
339 if(doPreProcess) {
341 }
342 PetscFunctionReturn(0);
343 }
345 PetscFunctionBegin;
346 if(doPostProcess) {
348 }
349 PetscFunctionReturn(0);
350 }
351 };
352
354
355 ierr = post_proc.generateReferenceElementMesh(); CHKERRQ(
ierr);
356 ierr = post_proc.addFieldValuesPostProc(
"DISPLACEMENT"); CHKERRQ(
ierr);
357 ierr = post_proc.addFieldValuesGradientPostProc(
"DISPLACEMENT"); CHKERRQ(
ierr);
358 ierr = post_proc.addFieldValuesPostProc(
"MESH_NODE_POSITIONS"); CHKERRQ(
ierr);
359 ierr = post_proc.addFieldValuesGradientPostProc(
"MESH_NODE_POSITIONS"); CHKERRQ(
ierr);
360
361 for(
362 map<int,NonlinearElasticElement::BlockData>::iterator sit = elastic.setOfBlocks.begin();
363 sit != elastic.setOfBlocks.end(); sit++
364 ) {
365 post_proc.getOpPtrVector().push_back(
367 post_proc.postProcMesh,
368 post_proc.mapGaussPts,
369 "DISPLACEMENT",
370 sit->second,
371 post_proc.commonData,
372 false
373 )
374 );
375 }
376 ierr = VecGhostUpdateBegin(
D,INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
377 ierr = VecGhostUpdateEnd(
D,INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
378 ierr = m_field.set_global_ghost_vector(
379 "ELASTIC_MECHANICS",
ROW,
D,INSERT_VALUES,SCATTER_REVERSE
381
382
383
384
385 KSP solver;
386 ierr = KSPCreate(PETSC_COMM_WORLD,&solver); CHKERRQ(
ierr);
387 ierr = KSPSetOperators(solver,Aij,Aij); CHKERRQ(
ierr);
388 ierr = KSPSetFromOptions(solver); CHKERRQ(
ierr);
389 ierr = KSPSetUp(solver); CHKERRQ(
ierr);
390
392 Dmat.resize(6,6);
393 Dmat.clear();
394
395
396
398 int stress_homo_ghost[] = { 0,1,2,3,4,5,6 };
399 ierr = VecCreateGhost(
400 PETSC_COMM_WORLD,(!m_field.
get_comm_rank())?6:0,6,6,stress_homo_ghost,&stress_homo
402
403 lagrangian_element.setRVEBCsHomoStressOperators("DISPLACEMENT","LAGRANGE_MUL_TRAC","MESH_NODE_POSITIONS",stress_homo);
404
405 PetscScalar *avec;
406 ierr = VecGetArray(stress_homo,&avec); CHKERRQ(
ierr);
407 for(int ii = 0;ii<6;ii++) {
409 ierr = KSPSolve(solver,
F[ii],
D); CHKERRQ(
ierr);
410 ierr = VecGhostUpdateBegin(
D,INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
411 ierr = VecGhostUpdateEnd(
D,INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
412 ierr = m_field.set_global_ghost_vector(
413 "ELASTIC_MECHANICS",
ROW,
D,INSERT_VALUES,SCATTER_REVERSE
415
416
417 post_proc.setDoPreProcess();
418 post_proc.unSetDoPostProcess();
420 "ELASTIC_MECHANICS","ELASTIC",post_proc
422 post_proc.unSetDoPreProcess();
423 post_proc.setDoPostProcess();
424 {
425 ostringstream sss;
426 sss << "mode_" << "Disp" << "_" << ii << ".h5m";
427 rval = post_proc.postProcMesh.write_file(
428 sss.str().c_str(),"MOAB","PARALLEL=WRITE_PART"
430 }
431
432 ierr = VecZeroEntries(stress_homo); CHKERRQ(
ierr);
434 "ELASTIC_MECHANICS","LAGRANGE_ELEM",lagrangian_element.getLoopFeRVEBCStress()
437 PETSC_NULL,"-my_rve_volume",&rve_volume,PETSC_NULL
439 ierr = VecAssemblyBegin(stress_homo); CHKERRQ(
ierr);
440 ierr = VecAssemblyEnd(stress_homo); CHKERRQ(
ierr);
441 ierr = VecScale(stress_homo,1.0/rve_volume); CHKERRQ(
ierr);
442 ierr = VecGhostUpdateBegin(stress_homo,INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
443 ierr = VecGhostUpdateEnd(stress_homo,INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
444 for(int jj=0; jj<6; jj++) {
445 Dmat(jj,ii) = avec[jj];
446 }
447 }
448
449 ierr = VecRestoreArray(stress_homo,&avec); CHKERRQ(
ierr);
450 PetscPrintf(
451 PETSC_COMM_WORLD,"\nHomogenised Stiffens Matrix = \n\n"
452 );
453
454 for(int ii=0; ii<6; ii++) {
455 PetscPrintf(
456 PETSC_COMM_WORLD,
457 "stress %d\t\t%8.5e\t\t%8.5e\t\t%8.5e\t\t%8.5e\t\t%8.5e\t\t%8.5e\n",
458 ii,Dmat(ii,0),Dmat(ii,1),Dmat(ii,2),Dmat(ii,3),Dmat(ii,4),Dmat(ii,5)
459 );
460 }
461
462
463
464 ofstream myfile;
466
467
468 myfile << "<<<< Homonenised stress >>>>>" << endl;
469
470 if(pcomm->rank()==0){
471 for(int ii=0; ii<6; ii++){
472 myfile << boost::format(
"%.3lf") %
roundn(Dmat(ii,0)) << endl;
473 avec++;
474 }
475 }
476
477 myfile.close();
478
479
480
481
482 for(int ii = 0;ii<6;ii++) {
483 ierr = VecDestroy(&
F[ii]); CHKERRQ(
ierr);
484 }
486 ierr = MatDestroy(&Aij); CHKERRQ(
ierr);
487 ierr = KSPDestroy(&solver); CHKERRQ(
ierr);
488 ierr = VecDestroy(&stress_homo); CHKERRQ(
ierr);
489
490 ierr = PetscTime(&v2);CHKERRQ(
ierr);
491 ierr = PetscGetCPUTime(&t2);CHKERRQ(
ierr);
492
493 PetscSynchronizedPrintf(PETSC_COMM_WORLD,"Total Rank %d Time = %f CPU Time = %f\n",pcomm->rank(),v2-v1,t2-t1);
494
495 }
497
499
500}
DEPRECATED typedef PostProcStress PostPorcStress
#define CATCH_ERRORS
Catch errors.
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base .
@ NOFIELD
scalar or vector of scalars describe (no true field)
#define MYPCOMM_INDEX
default communicator number PCOMM
#define CHKERRQ_MOAB(a)
check error code of MoAB function
constexpr int order
Order displacement.
virtual MoFEMErrorCode build_finite_elements(int verb=DEFAULT_VERBOSITY)=0
Build finite elements.
virtual MoFEMErrorCode build_fields(int verb=DEFAULT_VERBOSITY)=0
virtual MoFEMErrorCode set_field_order(const EntityHandle meshset, const EntityType type, const std::string &name, const ApproximationOrder order, int verb=DEFAULT_VERBOSITY)=0
Set order approximation of the entities in the field.
virtual MoFEMErrorCode add_ents_to_field_by_type(const Range &ents, const EntityType type, const std::string &name, int verb=DEFAULT_VERBOSITY)=0
Add entities to field meshset.
virtual MoFEMErrorCode loop_dofs(const Problem *problem_ptr, const std::string &field_name, RowColData rc, DofMethod &method, int lower_rank, int upper_rank, int verb=DEFAULT_VERBOSITY)=0
Make a loop over dofs.
virtual MoFEMErrorCode loop_finite_elements(const std::string problem_name, const std::string &fe_name, FEMethod &method, boost::shared_ptr< NumeredEntFiniteElement_multiIndex > fe_ptr=nullptr, MoFEMTypes bh=MF_EXIST, CacheTupleWeakPtr cache_ptr=CacheTupleSharedPtr(), int verb=DEFAULT_VERBOSITY)=0
Make a loop over finite elements.
virtual MoFEMErrorCode add_problem(const std::string &name, enum MoFEMTypes bh=MF_EXCL, int verb=DEFAULT_VERBOSITY)=0
Add problem.
virtual MoFEMErrorCode modify_problem_ref_level_add_bit(const std::string &name_problem, const BitRefLevel &bit)=0
add ref level to problem
virtual MoFEMErrorCode modify_problem_add_finite_element(const std::string name_problem, const std::string &fe_name)=0
add finite element to problem, this add entities assigned to finite element to a particular problem
const FTensor::Tensor2< T, Dim, Dim > Vec
static MoFEMErrorCodeGeneric< PetscErrorCode > ierr
static MoFEMErrorCodeGeneric< moab::ErrorCode > rval
std::bitset< BITREFLEVEL_SIZE > BitRefLevel
Bit structure attached to each entity identifying to what mesh entity is attached.
PetscErrorCode PetscOptionsGetInt(PetscOptions *, const char pre[], const char name[], PetscInt *ivalue, PetscBool *set)
PetscErrorCode PetscOptionsGetReal(PetscOptions *, const char pre[], const char name[], PetscReal *dval, PetscBool *set)
PetscErrorCode PetscOptionsGetString(PetscOptions *, const char pre[], const char name[], char str[], size_t size, PetscBool *set)
virtual MoFEMErrorCode build_adjacencies(const Range &ents, int verb=DEFAULT_VERBOSITY)=0
build adjacencies
virtual MoFEMErrorCode add_field(const std::string name, const FieldSpace space, const FieldApproximationBase base, const FieldCoefficientsNumber nb_of_coefficients, const TagType tag_type=MB_TAG_SPARSE, const enum MoFEMTypes bh=MF_EXCL, int verb=DEFAULT_VERBOSITY)=0
Add field.
virtual int get_comm_rank() 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.
DEPRECATED MoFEMErrorCode seed_ref_level_3D(const EntityHandle meshset, const BitRefLevel &bit, int verb=-1)
seed 2D entities in the meshset and their adjacencies (only TETs adjacencies) in a particular BitRefL...
Projection of edge entities with one mid-node on hierarchical basis.
Volume finite element base.
MoFEMErrorCode postProcess()
MoFEMErrorCode preProcess()
structure grouping operators and data used for calculation of nonlinear elastic element
MoFEMErrorCode preProcess()
MoFEMErrorCode postProcess()