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
300 Vec volume_vec;
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
397 Vec stress_homo;
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 nme:nme847.
@ 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
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
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...
virtual MoFEMErrorCode preProcess()
function is run at the beginning of loop
virtual MoFEMErrorCode postProcess()
function is run at the end of loop
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