116 {
118
119 try {
120
121 moab::Core mb_instance;
122 moab::Interface& moab = mb_instance;
123 ParallelComm* pcomm = ParallelComm::get_pcomm(&moab,
MYPCOMM_INDEX);
124 if(pcomm == NULL) pcomm = new ParallelComm(&moab,PETSC_COMM_WORLD);
125
126 PetscBool flg = PETSC_TRUE;
129 if(flg != PETSC_TRUE) {
130 SETERRQ(PETSC_COMM_SELF,1,"*** ERROR -my_file (MESH FILE NEEDED)");
131 }
132
135 if(flg != PETSC_TRUE) {
137 }
138 PetscInt bubble_order;
140 if(flg != PETSC_TRUE) {
141 bubble_order =
order;
142 }
143
144
145
146 PetscBool is_partitioned = PETSC_FALSE;
148
149
150 double mygiven_strain[6];
151 int nmax=6;
154 given_strain.resize(6);
155 cblas_dcopy(6, &mygiven_strain[0], 1, &given_strain(0), 1);
156 cout<<"given_strain ="<<given_strain<<endl;
157
158
159 if(is_partitioned == PETSC_TRUE) {
160 const char *option;
161 option = "PARALLEL=BCAST_DELETE;PARALLEL_RESOLVE_SHARED_ENTS;PARTITION=PARALLEL_PARTITION;";
163 } else {
164 const char *option;
165 option = "";
167 }
168
169
170
173
174
176
177
179 bit_level0.set(0);
183 ierr = m_field.get_entities_by_ref_level(bit_level0,
BitRefLevel().set(),meshset_level0); CHKERRQ(
ierr);
184
185
186
187
188
189
190
191
193 ierr = m_field.get_cubit_msId_entities_by_dimension(101,
SIDESET,2,SurTrisNeg,
true); CHKERRQ(
ierr);
194 ierr = PetscPrintf(PETSC_COMM_WORLD,
"number of SideSet 101 = %d\n",SurTrisNeg.size()); CHKERRQ(
ierr);
196 double TriCen[3], coords_Tri[9];
197 for(Range::iterator it = SurTrisNeg.begin(); it!=SurTrisNeg.end(); it++) {
199
200
202
204
205
206 TriCen[0]= (coords_Tri[0]+coords_Tri[3]+coords_Tri[6])/3.0;
207 TriCen[1]= (coords_Tri[1]+coords_Tri[4]+coords_Tri[7])/3.0;
208 TriCen[2]= (coords_Tri[2]+coords_Tri[5]+coords_Tri[8])/3.0;
209
210
211 if(TriCen[0]>=0) TriCen[0]=
double(
int(TriCen[0]*1000.0+0.5))/1000.0;
else TriCen[0]=
double(
int(TriCen[0]*1000.0-0.5))/1000.0;
212 if(TriCen[1]>=0) TriCen[1]=
double(
int(TriCen[1]*1000.0+0.5))/1000.0;
else TriCen[1]=
double(
int(TriCen[1]*1000.0-0.5))/1000.0;
213 if(TriCen[2]>=0) TriCen[2]=
double(
int(TriCen[2]*1000.0+0.5))/1000.0;
else TriCen[2]=
double(
int(TriCen[2]*1000.0-0.5))/1000.0;
214
215
216
217 Face_CenPos_Handle_varNeg.insert(
Face_CenPos_Handle(TriCen[0], TriCen[1], TriCen[2], *it));
218
219
220 }
221
222
223
224
225
226
227
228
229
231 ierr = m_field.get_cubit_msId_entities_by_dimension(102,
SIDESET,2,SurTrisPos,
true); CHKERRQ(
ierr);
232 ierr = PetscPrintf(PETSC_COMM_WORLD,
"number of SideSet 102 = %d\n",SurTrisPos.size()); CHKERRQ(
ierr);
233 for(Range::iterator it = SurTrisPos.begin(); it!=SurTrisPos.end(); it++) {
235
236
238
240
241
242 TriCen[0]= (coords_Tri[0]+coords_Tri[3]+coords_Tri[6])/3.0;
243 TriCen[1]= (coords_Tri[1]+coords_Tri[4]+coords_Tri[7])/3.0;
244 TriCen[2]= (coords_Tri[2]+coords_Tri[5]+coords_Tri[8])/3.0;
245
246
247 if(TriCen[0]>=0) TriCen[0]=
double(
int(TriCen[0]*1000.0+0.5))/1000.0;
else TriCen[0]=
double(
int(TriCen[0]*1000.0-0.5))/1000.0;
248 if(TriCen[1]>=0) TriCen[1]=
double(
int(TriCen[1]*1000.0+0.5))/1000.0;
else TriCen[1]=
double(
int(TriCen[1]*1000.0-0.5))/1000.0;
249 if(TriCen[2]>=0) TriCen[2]=
double(
int(TriCen[2]*1000.0+0.5))/1000.0;
else TriCen[2]=
double(
int(TriCen[2]*1000.0-0.5))/1000.0;
250
251
252
253 Face_CenPos_Handle_varPos.insert(
Face_CenPos_Handle(TriCen[0], TriCen[1], TriCen[2], *it));
254 }
255
256
257 double XcoordMin, YcoordMin, ZcoordMin, XcoordMax, YcoordMax, ZcoordMax;
258 typedef Face_CenPos_Handle_multiIndex::index<xcoord_tag>::type::iterator Tri_Xcoord_iterator;
259 typedef Face_CenPos_Handle_multiIndex::index<ycoord_tag>::type::iterator Tri_Ycoord_iterator;
260 typedef Face_CenPos_Handle_multiIndex::index<zcoord_tag>::type::iterator Tri_Zcoord_iterator;
261 Tri_Xcoord_iterator XcoordMin_it, XcoordMax_it;
262 Tri_Ycoord_iterator YcoordMin_it, YcoordMax_it;
263 Tri_Zcoord_iterator ZcoordMin_it, ZcoordMax_it;
264
265
266 XcoordMin_it=Face_CenPos_Handle_varNeg.get<
xcoord_tag>().begin(); XcoordMin=XcoordMin_it->xcoord;
267 XcoordMax_it=Face_CenPos_Handle_varPos.get<
xcoord_tag>().end(); XcoordMax_it--; XcoordMax=XcoordMax_it->xcoord;
268 YcoordMin_it=Face_CenPos_Handle_varNeg.get<
ycoord_tag>().begin(); YcoordMin=YcoordMin_it->ycoord;
269 YcoordMax_it=Face_CenPos_Handle_varPos.get<
ycoord_tag>().end(); YcoordMax_it--; YcoordMax=YcoordMax_it->ycoord;
270 ZcoordMin_it=Face_CenPos_Handle_varNeg.get<
zcoord_tag>().begin(); ZcoordMin=ZcoordMin_it->zcoord;
271 ZcoordMax_it=Face_CenPos_Handle_varPos.get<
zcoord_tag>().end(); ZcoordMax_it--; ZcoordMax=ZcoordMax_it->zcoord;
272
273
274
275
276 double LxRVE, LyRVE, LzRVE;
277 LxRVE=XcoordMax-XcoordMin;
278 LyRVE=YcoordMax-YcoordMin;
279 LzRVE=ZcoordMax-ZcoordMin;
280
281
282
283 typedef Face_CenPos_Handle_multiIndex::index<Tri_Hand_tag>::type::iterator Tri_Hand_iterator;
284 Tri_Hand_iterator Tri_Neg;
285 typedef Face_CenPos_Handle_multiIndex::index<Composite_xyzcoord>::type::iterator xyzcoord_iterator;
286 xyzcoord_iterator Tri_Pos;
288 double XPos, YPos, ZPos;
289
290
291
292 for(Range::iterator it = SurTrisNeg.begin(); it!=SurTrisNeg.end(); it++) {
293
294 Tri_Neg=Face_CenPos_Handle_varNeg.get<
Tri_Hand_tag>().find(*it);
295
296
297
298 if(Tri_Neg->xcoord==XcoordMin){XPos=XcoordMax; YPos=Tri_Neg->ycoord; ZPos=Tri_Neg->zcoord;};
299 if(Tri_Neg->ycoord==YcoordMin){XPos=YPos=Tri_Neg->xcoord; YPos=YcoordMax; ZPos=Tri_Neg->zcoord;};
300 if(Tri_Neg->zcoord==ZcoordMin){XPos=YPos=Tri_Neg->xcoord; YPos=Tri_Neg->ycoord; ZPos=ZcoordMax; };
301 Tri_Pos=Face_CenPos_Handle_varPos.get<
Composite_xyzcoord>().find(boost::make_tuple(XPos, YPos, ZPos));
302
303
304
305
306
308 vector<EntityHandle> TriNodesNeg, TriNodesPos;
309 double CoordNodeNeg[9], CoordNodePos[9];
314 for(int ii=0; ii<3; ii++){
315 PrismNodes[ii]=TriNodesNeg[ii];
316 }
317
318
319
320
321
322
323
324
325 double XNodeNeg, YNodeNeg, ZNodeNeg, XNodePos, YNodePos, ZNodePos;
326 for(int ii=0; ii<3; ii++){
327 if(Tri_Neg->xcoord==XcoordMin){XNodeNeg=XcoordMax; YNodeNeg=CoordNodeNeg[3*ii+1]; ZNodeNeg=CoordNodeNeg[3*ii+2];};
328 if(Tri_Neg->ycoord==YcoordMin){XNodeNeg=CoordNodeNeg[3*ii]; YNodeNeg=YcoordMax; ZNodeNeg=CoordNodeNeg[3*ii+2];};
329 if(Tri_Neg->zcoord==ZcoordMin){XNodeNeg=CoordNodeNeg[3*ii]; YNodeNeg=CoordNodeNeg[3*ii+1]; ZNodeNeg=ZcoordMax;};
330 for(int jj=0; jj<3; jj++){
331
332
333 if(XNodeNeg>=0) XNodeNeg=
double(
int(XNodeNeg*1000.0+0.5))/1000.0;
else XNodeNeg=
double(
int(XNodeNeg*1000.0-0.5))/1000.0;
334 if(YNodeNeg>=0) YNodeNeg=
double(
int(YNodeNeg*1000.0+0.5))/1000.0;
else YNodeNeg=
double(
int(YNodeNeg*1000.0-0.5))/1000.0;
335 if(ZNodeNeg>=0) ZNodeNeg=
double(
int(ZNodeNeg*1000.0+0.5))/1000.0;
else ZNodeNeg=
double(
int(ZNodeNeg*1000.0-0.5))/1000.0;
336
337 XNodePos=CoordNodePos[3*jj]; YNodePos=CoordNodePos[3*jj+1]; ZNodePos=CoordNodePos[3*jj+2];
338 if(XNodePos>=0) XNodePos=
double(
int(XNodePos*1000.0+0.5))/1000.0;
else XNodePos=
double(
int(XNodePos*1000.0-0.5))/1000.0;
339 if(YNodePos>=0) YNodePos=
double(
int(YNodePos*1000.0+0.5))/1000.0;
else YNodePos=
double(
int(YNodePos*1000.0-0.5))/1000.0;
340 if(ZNodePos>=0) ZNodePos=
double(
int(ZNodePos*1000.0+0.5))/1000.0;
else ZNodePos=
double(
int(ZNodePos*1000.0-0.5))/1000.0;
341
342 if(XNodeNeg==XNodePos && YNodeNeg==YNodePos && ZNodeNeg==ZNodePos){
343 PrismNodes[3+ii]=TriNodesPos[jj];
344 break;
345 }
346 }
347 }
348
349 double CoordNodesPrisms[18];
351
352
353
354
355
358 PrismRange.insert(PeriodicPrism);
359
360
365 ierr = m_field.get_entities_by_ref_level(bit_level0,
BitRefLevel().set(),meshset_level0); CHKERRQ(
ierr);
366
367
368
369
370
371
372
373
374
375
376
377 }
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393 SmallStrainParaboloidalPlasticity cp;
394 {
395 cp.tAgs.resize(3);
396 cp.tAgs[0] = 0;
397 cp.tAgs[1] = 1;
398 cp.tAgs[2] = 2;
399 cp.tOl = 1e-12;
400
403 cp.sIgma_yt = 1;
404 cp.sIgma_yc = 1;
405
406 cp.Ht = 0.1;
407 cp.Hc = 0.1;
408
409 cp.nup = 0.3;
410
411
412 {
419
422
425
426
428 }
429
430 PetscPrintf(PETSC_COMM_WORLD,
"young_modulus = %4.2e \n",
young_modulus);
431 PetscPrintf(PETSC_COMM_WORLD,
"poisson_ratio = %4.2e \n",
poisson_ratio);
432
433 PetscPrintf(PETSC_COMM_WORLD,"sIgma_yt = %4.2e \n",cp.sIgma_yt);
434 PetscPrintf(PETSC_COMM_WORLD,"sIgma_yc = %4.2e \n",cp.sIgma_yt);
435
436 PetscPrintf(PETSC_COMM_WORLD,"nup = %4.2e \n",cp.nup);
437
438 cp.sTrain.resize(6,false);
439 cp.sTrain.clear();
440 cp.plasticStrain.resize(6,false);
441 cp.plasticStrain.clear();
442 cp.internalVariables.resize(2,false);
443 cp.internalVariables.clear();
444 cp.createMatAVecR();
445 cp.snesCreate();
446
447 }
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
506
507
508
511
512
513 Range surface_negative;
514 ierr = m_field.get_cubit_msId_entities_by_dimension(101,
SIDESET,2,surface_negative,
true); CHKERRQ(
ierr);
515 ierr = PetscPrintf(PETSC_COMM_WORLD,
"number of SideSet 101 = %d\n",surface_negative.size()); CHKERRQ(
ierr);
517
518
519
524
529
533
534
535
537
539 ierr = m_field.
loop_dofs(
"MESH_NODE_POSITIONS",ent_method_material,0); CHKERRQ(
ierr);
540
541
543
549
552
553 lagrangian_element_periodic.addLagrangiangElement("LAGRANGE_ELEM","DISPLACEMENT","LAGRANGE_MUL_PERIODIC","MESH_NODE_POSITIONS",PrismRange);
554 lagrangian_element_trac.addLagrangiangElement("LAGRANGE_ELEM_TRANS","DISPLACEMENT","LAGRANGE_MUL_RIGID_TRANS","MESH_NODE_POSITIONS");
555
556
558
560
561
562 DMType dm_name = "PLASTIC_PROB";
564
565 DM dm;
566 ierr = DMCreate(PETSC_COMM_WORLD,&dm);CHKERRQ(
ierr);
567 ierr = DMSetType(dm,dm_name);CHKERRQ(
ierr);
568
569
571 ierr = DMSetFromOptions(dm); CHKERRQ(
ierr);
573
578
579
581 Mat Aij;
585
587 ierr = VecGhostUpdateBegin(
D,INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
588 ierr = VecGhostUpdateEnd(
D,INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
590
592 ierr = VecGhostUpdateBegin(
F,INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
593 ierr = VecGhostUpdateEnd(
F,INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
595
596 ierr = MatZeroEntries(Aij); CHKERRQ(
ierr);
597
598 vector<Vec> Fvec(6);
599 for(int ii = 0;ii<6;ii++) {
600 ierr = VecDuplicate(
D,&Fvec[ii]); CHKERRQ(
ierr);
601 ierr = VecZeroEntries(Fvec[ii]); CHKERRQ(
ierr);
602 ierr = VecGhostUpdateBegin(Fvec[ii],INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
603 ierr = VecGhostUpdateEnd(Fvec[ii],INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
604 }
605
606
607 SmallStrainPlasticity small_strain_plasticity(m_field);
608 {
609 PetscBool bbar = PETSC_TRUE;
611 small_strain_plasticity.commonData.bBar = bbar;
612 }
613 {
614 small_strain_plasticity.feRhs.getOpPtrVector().push_back(
615 new SmallStrainPlasticity::OpGetCommonDataAtGaussPts(
616 "DISPLACEMENT",small_strain_plasticity.commonData
617 )
618 );
619 small_strain_plasticity.feRhs.getOpPtrVector().push_back(
620 new SmallStrainPlasticity::OpCalculateStress(
621 m_field,"DISPLACEMENT",small_strain_plasticity.commonData,cp,false
622 )
623 );
624 small_strain_plasticity.feRhs.getOpPtrVector().push_back(
625 new SmallStrainPlasticity::OpAssembleRhs(
626 "DISPLACEMENT",small_strain_plasticity.commonData
627 )
628 );
629 small_strain_plasticity.feLhs.getOpPtrVector().push_back(
630 new SmallStrainPlasticity::OpGetCommonDataAtGaussPts(
631 "DISPLACEMENT",small_strain_plasticity.commonData
632 )
633 );
634 small_strain_plasticity.feLhs.getOpPtrVector().push_back(
635 new SmallStrainPlasticity::OpCalculateStress(
636 m_field,"DISPLACEMENT",small_strain_plasticity.commonData,cp,false
637 )
638 );
639 small_strain_plasticity.feLhs.getOpPtrVector().push_back(
640 new SmallStrainPlasticity::OpAssembleLhs(
641 "DISPLACEMENT",small_strain_plasticity.commonData
642 )
643 );
644 small_strain_plasticity.feUpdate.getOpPtrVector().push_back(
645 new SmallStrainPlasticity::OpGetCommonDataAtGaussPts(
646 "DISPLACEMENT",small_strain_plasticity.commonData
647 )
648 );
649 small_strain_plasticity.feUpdate.getOpPtrVector().push_back(
650 new SmallStrainPlasticity::OpCalculateStress(
651 m_field,"DISPLACEMENT",small_strain_plasticity.commonData,cp,false
652 )
653 );
654 small_strain_plasticity.feUpdate.getOpPtrVector().push_back(
655 new SmallStrainPlasticity::OpUpdate(
656 "DISPLACEMENT",small_strain_plasticity.commonData
657 )
658 );
659 ierr = small_strain_plasticity.createInternalVariablesTag(); CHKERRQ(
ierr);
660 }
661
662 lagrangian_element_periodic.setRVEBCsOperatorsNonlinear(
"DISPLACEMENT",
"LAGRANGE_MUL_PERIODIC",
"MESH_NODE_POSITIONS",Aij,Fvec,
F,given_strain);
663
665 lagrangian_element_rigid_body_trans.setRVEBCsRigidBodyTranOperators("DISPLACEMENT","LAGRANGE_MUL_RIGID_TRANS",Aij, lagrangian_element_periodic.setOfRVEBC);
666
667
668 TimeForceScale time_force_scale(
"-my_macro_strian_history",
false);
669 lagrangian_element_periodic.methodsOp.push_back(
new TimeForceScale(
"-my_macro_strian_history",
false));
670
671
672
673
674
675
679
680
684
685
686
687 SNES snes;
689 ierr = SNESCreate(PETSC_COMM_WORLD,&snes); CHKERRQ(
ierr);
690
694 ierr = SNESSetFromOptions(snes); CHKERRQ(
ierr);
695
697 ierr = post_proc.generateReferenceElementMesh(); CHKERRQ(
ierr);
698 ierr = post_proc.addFieldValuesPostProc(
"DISPLACEMENT"); CHKERRQ(
ierr);
699 ierr = post_proc.addFieldValuesGradientPostProc(
"DISPLACEMENT"); CHKERRQ(
ierr);
700 ierr = post_proc.addFieldValuesPostProc(
"MESH_NODE_POSITIONS"); CHKERRQ(
ierr);
701
702
703
705 Vec volume_vec;
706 int volume_vec_ghost[] = { 0 };
707 ierr = VecCreateGhost(
708 PETSC_COMM_WORLD,(!m_field.
get_comm_rank())?1:0,1,1,volume_vec_ghost,&volume_vec
710 ierr = VecZeroEntries(volume_vec); CHKERRQ(
ierr);
711 vol_elem.getOpPtrVector().push_back(
new VolumeCalculation(
"DISPLACEMENT",volume_vec));
712
714
715 ierr = VecAssemblyBegin(volume_vec); CHKERRQ(
ierr);
716 ierr = VecAssemblyEnd(volume_vec); CHKERRQ(
ierr);
717 double rve_volume;
718 ierr = VecSum(volume_vec,&rve_volume); CHKERRQ(
ierr);
719
720
721 ierr = PetscPrintf(PETSC_COMM_WORLD,
"RVE Volume %3.2g\n",rve_volume); CHKERRQ(
ierr);
722 ierr = VecDestroy(&volume_vec);
723
724
725 double final_time = 1,delta_time = 0.1;
728 double delta_time0 = delta_time;
729
730
731
732
733
734 Vec D0;
735 ierr = VecDuplicate(
D,&D0); CHKERRQ(
ierr);
736
737 int step = 0;
739 SNESConvergedReason reason = SNES_CONVERGED_ITERATING;
740 for(;
t<final_time;step++) {
742
744 break;
745 }
746 PetscPrintf(
747 PETSC_COMM_WORLD,
"Step %d Time %6.4g final time %3.2g\n",step,
t,final_time
748 );
749
750 lagrangian_element_periodic.getLoopFeRVEBCRhs().ts_t =
t;
751
752 ierr = VecAssemblyBegin(
D);
753 ierr = VecAssemblyEnd(
D);
755
756 if(step == 0 || reason < 0) {
757 ierr = SNESSetLagJacobian(snes,-2); CHKERRQ(
ierr);
758 } else {
759 ierr = SNESSetLagJacobian(snes,-1); CHKERRQ(
ierr);
760 }
761
762
763 ierr = SNESSolve(snes,PETSC_NULL,
D); CHKERRQ(
ierr);
764 int its;
765 ierr = SNESGetIterationNumber(snes,&its); CHKERRQ(
ierr);
766
768 PETSC_COMM_WORLD,"number of Newton iterations = %D\n",its
770
771 ierr = SNESGetConvergedReason(snes,&reason); CHKERRQ(
ierr);
772
773
774 if(reason<0) {
776 delta_time *= 0.1;
778 } else {const int its_d = 20;
779 const double gamma = 0.5;
780 const double max_reudction = 1;
781 const double min_reduction = 1e-1;
782 double reduction;
783 reduction = pow((double)its_d/(double)(its+1),gamma);
784 if(delta_time >= max_reudction*delta_time0 && reduction > 1) {
785 reduction = 1;
786 } else if(delta_time <= min_reduction*delta_time0 && reduction < 1) {
787 reduction = 1;
788 }
789
791 PETSC_COMM_WORLD,
792 "reduction delta_time = %6.4e delta_time = %6.4e\n",
793 reduction,delta_time
795 delta_time *= reduction;
796 if(reduction>1 && delta_time < min_reduction*delta_time0) {
797 delta_time = min_reduction*delta_time0;
798 }
799
801 dm,
D,INSERT_VALUES,SCATTER_REVERSE
804 dm,"PLASTIC",&small_strain_plasticity.feUpdate
806
807
808
810 dm,"PLASTIC",&post_proc
813 {
814 std::ostringstream stm;
815 stm << "out_" << step << ".h5m";
817 }
821 rval = post_proc.postProcMesh.write_file(
824
825
827 StressHomo.resize(6);
828 StressHomo.clear();
829
830
831
832 Vec stress_homo;
833 int stress_homo_ghost[] = { 0,1,2,3,4,5,6 };
834 ierr = VecCreateGhost(
835 PETSC_COMM_WORLD,(!m_field.
get_comm_rank())?6:0,6,6,stress_homo_ghost,&stress_homo
837
838 lagrangian_element_periodic.setRVEBCsHomoStressOperators("DISPLACEMENT","LAGRANGE_MUL_PERIODIC","MESH_NODE_POSITIONS",stress_homo);
839
840 PetscScalar *avec;
841 ierr = VecGetArray(stress_homo,&avec); CHKERRQ(
ierr);
842 ierr = VecZeroEntries(stress_homo); CHKERRQ(
ierr);
844 "PLASTIC_PROB","LAGRANGE_ELEM",lagrangian_element_periodic.getLoopFeRVEBCStress()
847 PETSC_NULL,"-my_rve_volume",&rve_volume,PETSC_NULL
849 ierr = VecAssemblyBegin(stress_homo); CHKERRQ(
ierr);
850 ierr = VecAssemblyEnd(stress_homo); CHKERRQ(
ierr);
851 ierr = VecScale(stress_homo,1.0/rve_volume); CHKERRQ(
ierr);
852 ierr = VecGhostUpdateBegin(stress_homo,INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
853 ierr = VecGhostUpdateEnd(stress_homo,INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
854
855 for(int jj=0; jj<6; jj++) {
856 StressHomo(jj) = avec[jj];
857 }
858
861
862 PetscPrintf(PETSC_COMM_WORLD,
863 "Macro_Strain Homo_Stress Path "
864 );
865
866
867 for(int ii=0; ii<6; ii++) {
868 PetscPrintf(
869 PETSC_COMM_WORLD,
870 "%8.5e\t",
872 );
873 }
874
875
876 for(int ii=0; ii<6; ii++) {
877 PetscPrintf(
878 PETSC_COMM_WORLD,
879 "%8.5e\t",
880 StressHomo(ii)
881 );
882 }
883
884 PetscPrintf(PETSC_COMM_WORLD,
885 "\n"
886 );
887
888
889
890 }
891 }
892
893 ierr = VecDestroy(&D0); CHKERRQ(
ierr);
894 ierr = MatDestroy(&Aij); CHKERRQ(
ierr);
897
898 }
900
902}
#define CATCH_ERRORS
Catch errors.
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base nme:nme847.
#define MOAB_THROW(err)
Check error code of MoAB function and throw MoFEM exception.
@ 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
PetscErrorCode DMMoFEMSetIsPartitioned(DM dm, PetscBool is_partitioned)
PetscErrorCode DMMoFEMAddElement(DM dm, std::string fe_name)
add element to dm
PetscErrorCode DMMoFEMSNESSetFunction(DM dm, const char fe_name[], MoFEM::FEMethod *method, MoFEM::BasicMethod *pre_only, MoFEM::BasicMethod *post_only)
set SNES residual evaluation function
PetscErrorCode DMMoFEMCreateMoFEM(DM dm, MoFEM::Interface *m_field_ptr, const char problem_name[], const MoFEM::BitRefLevel bit_level, const MoFEM::BitRefLevel bit_mask=MoFEM::BitRefLevel().set())
Must be called by user to set MoFEM data structures.
PetscErrorCode DMoFEMMeshToLocalVector(DM dm, Vec l, InsertMode mode, ScatterMode scatter_mode)
set local (or ghosted) vector values on mesh for partition only
PetscErrorCode DMMoFEMSNESSetJacobian(DM dm, const char fe_name[], MoFEM::FEMethod *method, MoFEM::BasicMethod *pre_only, MoFEM::BasicMethod *post_only)
set SNES Jacobian evaluation function
PetscErrorCode DMCreateMatrix_MoFEM(DM dm, Mat *M)
PetscErrorCode DMRegister_MoFEM(const char sname[])
Register MoFEM problem.
PetscErrorCode DMoFEMLoopFiniteElements(DM dm, const char fe_name[], MoFEM::FEMethod *method, CacheTupleWeakPtr cache_ptr=CacheTupleSharedPtr())
Executes FEMethod for finite elements in DM.
PetscErrorCode DMCreateGlobalVector_MoFEM(DM dm, Vec *g)
DMShellSetCreateGlobalVector.
PetscErrorCode DMMoFEMGetSnesCtx(DM dm, MoFEM::SnesCtx **snes_ctx)
get MoFEM::SnesCtx data structure
PetscErrorCode DMoFEMMeshToGlobalVector(DM dm, Vec g, InsertMode mode, ScatterMode scatter_mode)
set ghosted vector values on all existing mesh entities
virtual MoFEMErrorCode add_finite_element(const std::string &fe_name, enum MoFEMTypes bh=MF_EXCL, int verb=DEFAULT_VERBOSITY)=0
add finite element
virtual MoFEMErrorCode build_finite_elements(int verb=DEFAULT_VERBOSITY)=0
Build finite elements.
virtual MoFEMErrorCode modify_finite_element_add_field_col(const std::string &fe_name, const std::string name_row)=0
set field col which finite element use
virtual MoFEMErrorCode add_ents_to_finite_element_by_type(const EntityHandle entities, const EntityType type, const std::string &name, const bool recursive=true)=0
add entities to finite element
virtual MoFEMErrorCode modify_finite_element_add_field_row(const std::string &fe_name, const std::string name_row)=0
set field row which finite element use
virtual MoFEMErrorCode modify_finite_element_add_field_data(const std::string &fe_name, const std::string name_field)=0
set finite element field data
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.
multi_index_container< Face_CenPos_Handle, indexed_by< ordered_non_unique< tag< xcoord_tag >, member< Face_CenPos_Handle, double,&Face_CenPos_Handle::xcoord > >, ordered_non_unique< tag< ycoord_tag >, member< Face_CenPos_Handle, double,&Face_CenPos_Handle::ycoord > >, ordered_non_unique< tag< zcoord_tag >, member< Face_CenPos_Handle, double,&Face_CenPos_Handle::zcoord > >, ordered_unique< tag< Tri_Hand_tag >, member< Face_CenPos_Handle, const EntityHandle,&Face_CenPos_Handle::Tri_Hand > >, ordered_unique< tag< Composite_xyzcoord >, composite_key< Face_CenPos_Handle, member< Face_CenPos_Handle, double,&Face_CenPos_Handle::xcoord >, member< Face_CenPos_Handle, double,&Face_CenPos_Handle::ycoord >, member< Face_CenPos_Handle, double,&Face_CenPos_Handle::zcoord > > > > > Face_CenPos_Handle_multiIndex
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 SnesMat(SNES snes, Vec x, Mat A, Mat B, void *ctx)
This is MoFEM implementation for the left hand side (tangent matrix) evaluation in SNES solver.
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 SnesRhs(SNES snes, Vec x, Vec f, void *ctx)
This is MoFEM implementation for the right hand side (residual vector) evaluation in SNES solver.
PetscErrorCode PetscOptionsGetBool(PetscOptions *, const char pre[], const char name[], PetscBool *bval, PetscBool *set)
PetscErrorCode PetscOptionsGetRealArray(PetscOptions *, const char pre[], const char name[], PetscReal dval[], PetscInt *nmax, PetscBool *set)
PetscErrorCode PetscOptionsGetString(PetscOptions *, const char pre[], const char name[], char str[], size_t size, PetscBool *set)
double young_modulus
Young modulus.
double poisson_ratio
Poisson ratio.
constexpr double t
plate stiffness
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.
Interface for nonlinear (SNES) solver.
Volume finite element base.
Force scale operator for reading two columns.