122 {
124
125 try {
126
127 moab::Core mb_instance;
128 moab::Interface& moab = mb_instance;
129 ParallelComm* pcomm = ParallelComm::get_pcomm(&moab,
MYPCOMM_INDEX);
130 if(pcomm == NULL) pcomm = new ParallelComm(&moab,PETSC_COMM_WORLD);
131
132 PetscBool flg = PETSC_TRUE;
135 if(flg != PETSC_TRUE) {
136 SETERRQ(PETSC_COMM_SELF,1,"*** ERROR -my_file (MESH FILE NEEDED)");
137 }
138
141 if(flg != PETSC_TRUE) {
143 }
144 PetscInt bubble_order;
146 if(flg != PETSC_TRUE) {
147 bubble_order =
order;
148 }
149
150
151
152 PetscBool is_partitioned = PETSC_FALSE;
154
155
156 double mygiven_strain[6];
157 int nmax=6;
160 given_strain.resize(6);
161 cblas_dcopy(6, &mygiven_strain[0], 1, &given_strain(0), 1);
162 cout<<"given_strain ="<<given_strain<<endl;
163
164
165
166 if(is_partitioned == PETSC_TRUE) {
167 const char *option;
168 option = "PARALLEL=BCAST_DELETE;PARALLEL_RESOLVE_SHARED_ENTS;PARTITION=PARALLEL_PARTITION;";
170 } else {
171 const char *option;
172 option = "";
174 }
175
176
177
179 SmallStrainParaboloidalPlasticity cp;
180 {
181 cp.tAgs.resize(3);
182 cp.tAgs[0] = 3;
183 cp.tAgs[1] = 4;
184 cp.tAgs[2] = 5;
185 cp.tOl = 1e-12;
186
188 cp.sIgma_yt = 1;
189 cp.sIgma_yc = 1;
190
191 cp.Ht = 0.1;
192 cp.Hc = 0.1;
193
194 cp.nup = 0.3;
195
196
197 {
204
207
210
211
213 }
214
215 PetscPrintf(PETSC_COMM_WORLD,
"young_modulus = %4.2e \n",
young_modulus);
216 PetscPrintf(PETSC_COMM_WORLD,
"poisson_ratio = %4.2e \n",
poisson_ratio);
217
218 PetscPrintf(PETSC_COMM_WORLD,"sIgma_yt = %4.2e \n",cp.sIgma_yt);
219 PetscPrintf(PETSC_COMM_WORLD,"sIgma_yc = %4.2e \n",cp.sIgma_yc);
220
221 PetscPrintf(PETSC_COMM_WORLD,"nup = %4.2e \n",cp.nup);
222
223 cp.sTrain.resize(6,false);
224 cp.sTrain.clear();
225 cp.plasticStrain.resize(6,false);
226 cp.plasticStrain.clear();
227 cp.internalVariables.resize(2,false);
228 cp.internalVariables.clear();
229 cp.createMatAVecR();
230 cp.snesCreate();
231
232 }
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
283
284 vector<BitRefLevel> bit_levels;
286 int def_meshset_info[2] = {0,0};
287 rval = moab.tag_get_handle(
"MESHSET_INFO",2,MB_TYPE_INTEGER,th_meshset_info,MB_TAG_CREAT|MB_TAG_SPARSE,&def_meshset_info);
288 int meshset_data[2];
291 if(meshset_data[0]==0) {
292 meshset_data[0] = 1;
294 }
295 bit_levels.push_back(
BitRefLevel().set(meshset_data[0]-1));
296
297
298
299
300
301
302
303
304
305
306
307
309
310
313
314
315 Range interface_prims_on_problem_bit_level;
316 ierr = m_field.get_entities_by_type_and_ref_level(
317 problem_bit_level,
BitRefLevel().set(),MBPRISM,interface_prims_on_problem_bit_level
319 Range tets_on_problem_bit_level;
320 ierr = m_field.get_entities_by_type_and_ref_level(
321 problem_bit_level,
BitRefLevel().set(),MBTET,tets_on_problem_bit_level
323
324 cout<<"interface_prims_on_problem_bit_level "<<interface_prims_on_problem_bit_level.size()<<endl;
325 cout<<"tets_on_problem_bit_level "<<tets_on_problem_bit_level.size()<<endl;
326
327
328
329
330 Range preriodic_prisms;
331
332
333
335 ierr = m_field.get_cubit_msId_entities_by_dimension(101,
SIDESET,2,SurTrisNeg,
true); CHKERRQ(
ierr);
336 ierr = PetscPrintf(PETSC_COMM_WORLD,
"Old+New triangles on SideSet 101 = %d\n",SurTrisNeg.size()); CHKERRQ(
ierr);
337
339 ierr = m_field.get_entities_by_type_and_ref_level(problem_bit_level,
BitRefLevel().set(),MBTRI,AllTris); CHKERRQ(
ierr);
340 ierr = PetscPrintf(PETSC_COMM_WORLD,
"All triangles in the new bit-level = %d\n",AllTris.size()); CHKERRQ(
ierr);
341
342
343 SurTrisNeg = intersect(AllTris,SurTrisNeg);
344 ierr = PetscPrintf(PETSC_COMM_WORLD,
"New triangles on SideSet 101 = %d\n",SurTrisNeg.size()); CHKERRQ(
ierr);
345
346
348 double TriCen[3], coords_Tri[9];
349
350
351
352 double roundfact=1e3;
353
354 for(Range::iterator it = SurTrisNeg.begin(); it!=SurTrisNeg.end(); it++) {
356
357
359
361
362
363 TriCen[0]= (coords_Tri[0]+coords_Tri[3]+coords_Tri[6])/3.0;
364 TriCen[1]= (coords_Tri[1]+coords_Tri[4]+coords_Tri[7])/3.0;
365 TriCen[2]= (coords_Tri[2]+coords_Tri[5]+coords_Tri[8])/3.0;
366
367
368 TriCen[0]=round(TriCen[0]*roundfact)/roundfact;
369 TriCen[1]=round(TriCen[1]*roundfact)/roundfact;
370 TriCen[2]=round(TriCen[2]*roundfact)/roundfact;
371
372
373
374 Face_CenPos_Handle_varNeg.insert(
Face_CenPos_Handle(TriCen[0], TriCen[1], TriCen[2], *it));
375
376
377 }
378
379
380
381
382
383
384
385
386
388 ierr = m_field.get_cubit_msId_entities_by_dimension(102,
SIDESET,2,SurTrisPos,
true); CHKERRQ(
ierr);
389 ierr = PetscPrintf(PETSC_COMM_WORLD,
"Old+New triangles on SideSet 102 = %d\n",SurTrisPos.size()); CHKERRQ(
ierr);
390
391
392 SurTrisPos = intersect(AllTris,SurTrisPos);
393 ierr = PetscPrintf(PETSC_COMM_WORLD,
"New triangles on SideSet 102 = %d\n",SurTrisPos.size()); CHKERRQ(
ierr);
394
395
396
397
398 for(Range::iterator it = SurTrisPos.begin(); it!=SurTrisPos.end(); it++) {
400
401
403
405
406
407 TriCen[0]= (coords_Tri[0]+coords_Tri[3]+coords_Tri[6])/3.0;
408 TriCen[1]= (coords_Tri[1]+coords_Tri[4]+coords_Tri[7])/3.0;
409 TriCen[2]= (coords_Tri[2]+coords_Tri[5]+coords_Tri[8])/3.0;
410
411
412 TriCen[0]=round(TriCen[0]*roundfact)/roundfact;
413 TriCen[1]=round(TriCen[1]*roundfact)/roundfact;
414 TriCen[2]=round(TriCen[2]*roundfact)/roundfact;
415
416
417
418
419 Face_CenPos_Handle_varPos.insert(
Face_CenPos_Handle(TriCen[0], TriCen[1], TriCen[2], *it));
420 }
421
422
423 double XcoordMin, YcoordMin, ZcoordMin, XcoordMax, YcoordMax, ZcoordMax;
424 typedef Face_CenPos_Handle_multiIndex::index<xcoord_tag>::type::iterator Tri_Xcoord_iterator;
425 typedef Face_CenPos_Handle_multiIndex::index<ycoord_tag>::type::iterator Tri_Ycoord_iterator;
426 typedef Face_CenPos_Handle_multiIndex::index<zcoord_tag>::type::iterator Tri_Zcoord_iterator;
427 Tri_Xcoord_iterator XcoordMin_it, XcoordMax_it;
428 Tri_Ycoord_iterator YcoordMin_it, YcoordMax_it;
429 Tri_Zcoord_iterator ZcoordMin_it, ZcoordMax_it;
430
431
432 XcoordMin_it=Face_CenPos_Handle_varNeg.get<
xcoord_tag>().begin(); XcoordMin=XcoordMin_it->xcoord;
433 XcoordMax_it=Face_CenPos_Handle_varPos.get<
xcoord_tag>().end(); XcoordMax_it--; XcoordMax=XcoordMax_it->xcoord;
434 YcoordMin_it=Face_CenPos_Handle_varNeg.get<
ycoord_tag>().begin(); YcoordMin=YcoordMin_it->ycoord;
435 YcoordMax_it=Face_CenPos_Handle_varPos.get<
ycoord_tag>().end(); YcoordMax_it--; YcoordMax=YcoordMax_it->ycoord;
436 ZcoordMin_it=Face_CenPos_Handle_varNeg.get<
zcoord_tag>().begin(); ZcoordMin=ZcoordMin_it->zcoord;
437 ZcoordMax_it=Face_CenPos_Handle_varPos.get<
zcoord_tag>().end(); ZcoordMax_it--; ZcoordMax=ZcoordMax_it->zcoord;
438
439 cout<<"XcoordMin "<<XcoordMin << " XcoordMax "<<XcoordMax <<endl;
440 cout<<"YcoordMin "<<YcoordMin << " YcoordMax "<<YcoordMax <<endl;
441 cout<<"ZcoordMin "<<ZcoordMin << " ZcoordMax "<<ZcoordMax <<endl;
442
443
444
445
446
447
448
449 typedef Face_CenPos_Handle_multiIndex::index<Tri_Hand_tag>::type::iterator Tri_Hand_iterator;
450 Tri_Hand_iterator Tri_Neg;
451 typedef Face_CenPos_Handle_multiIndex::index<Composite_xyzcoord>::type::iterator xyzcoord_iterator;
452 xyzcoord_iterator Tri_Pos;
453 double XPos, YPos, ZPos;
454
455
456
457 int count=1;
458 int count1=0;
459 for(Range::iterator it = SurTrisNeg.begin(); it!=SurTrisNeg.end(); it++) {
460
461
462
463
464
465
466 Tri_Neg=Face_CenPos_Handle_varNeg.get<
Tri_Hand_tag>().find(*it);
467
468
469
470 if(Tri_Neg->xcoord==XcoordMin){XPos=XcoordMax; YPos=Tri_Neg->ycoord; ZPos=Tri_Neg->zcoord;};
471 if(Tri_Neg->ycoord==YcoordMin){XPos=YPos=Tri_Neg->xcoord; YPos=YcoordMax; ZPos=Tri_Neg->zcoord;};
472 if(Tri_Neg->zcoord==ZcoordMin){XPos=YPos=Tri_Neg->xcoord; YPos=Tri_Neg->ycoord; ZPos=ZcoordMax; };
473 Tri_Pos=Face_CenPos_Handle_varPos.get<
Composite_xyzcoord>().find(boost::make_tuple(XPos, YPos, ZPos));
474
475
476
477
478
479
481 vector<EntityHandle> TriNodesNeg, TriNodesPos;
482 double CoordNodeNeg[9], CoordNodePos[9];
487 for(int ii=0; ii<3; ii++){
488 PrismNodes[ii]=TriNodesNeg[ii];
489 }
490
491
492
493
494
495
496
497
498
499 double XNodeNeg, YNodeNeg, ZNodeNeg, XNodePos, YNodePos, ZNodePos;
500 for(int ii=0; ii<3; ii++){
501 if(Tri_Neg->xcoord==XcoordMin){XNodeNeg=XcoordMax; YNodeNeg=CoordNodeNeg[3*ii+1]; ZNodeNeg=CoordNodeNeg[3*ii+2];};
502 if(Tri_Neg->ycoord==YcoordMin){XNodeNeg=CoordNodeNeg[3*ii]; YNodeNeg=YcoordMax; ZNodeNeg=CoordNodeNeg[3*ii+2];};
503 if(Tri_Neg->zcoord==ZcoordMin){XNodeNeg=CoordNodeNeg[3*ii]; YNodeNeg=CoordNodeNeg[3*ii+1]; ZNodeNeg=ZcoordMax;};
504 for(int jj=0; jj<3; jj++){
505
506 XNodeNeg=round(XNodeNeg*roundfact)/roundfact;
507 YNodeNeg=round(YNodeNeg*roundfact)/roundfact;
508 ZNodeNeg=round(ZNodeNeg*roundfact)/roundfact;
509
510 XNodePos=CoordNodePos[3*jj]; YNodePos=CoordNodePos[3*jj+1]; ZNodePos=CoordNodePos[3*jj+2];
511 XNodePos=round(XNodePos*roundfact)/roundfact;
512 YNodePos=round(YNodePos*roundfact)/roundfact;
513 ZNodePos=round(ZNodePos*roundfact)/roundfact;
514
515 if(XNodeNeg==XNodePos && YNodeNeg==YNodePos && ZNodeNeg==ZNodePos){
516 PrismNodes[3+ii]=TriNodesPos[jj];
517 break;
518 }
519 }
520 }
521
522 double CoordNodesPrisms[18];
524
525
526
527
528
529
532 preriodic_prisms.insert(PeriodicPrism);
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549 }
550
551
552
553
554
555
556
557
558
559
560
561
563 ierr = m_field.seed_finite_elements(preriodic_prisms); CHKERRQ(
ierr);
564
565
566
567
568
569
572 ierr = m_field.get_entities_by_ref_level(bit_levels.back(),
BitRefLevel().set(),out_meshset); CHKERRQ(
ierr);
573
574 Range LatestRefinedTets;
575 rval = moab.get_entities_by_type(out_meshset, MBTET,LatestRefinedTets,
true);
CHKERRQ_MOAB(
rval);
576
577 Range Interface_Periodic_Prisms;
578 rval = moab.get_entities_by_type(out_meshset, MBPRISM,Interface_Periodic_Prisms,
true);
CHKERRQ_MOAB(
rval);
579 cout<<"Interface_Periodic_Prisms " <<Interface_Periodic_Prisms.size()<<endl;
580
581
582
587
588
591
592
594
595
600
605
609
610
612
613
615 ierr = m_field.
loop_dofs(
"MESH_NODE_POSITIONS",ent_method_material,0); CHKERRQ(
ierr);
616
617
619
624
627 if(it->getName() != "MAT_PLASTIC") continue;
629 int id = it->getMeshsetId();
630
632 meshset,MBTET,newtets,true
634
635 cout<< "========================== newtets "<<newtets.size()<<endl;
636
637
638 newtets = intersect(newtets,LatestRefinedTets);
639 ierr = m_field.seed_finite_elements(newtets); CHKERRQ(
ierr);
640 }
641
643 cout<< "========================== newtets "<<newtets.size()<<endl;
644
645
646
647
648
649
651 trans_elastic.commonData.spatialPositions = "DISPLACEMENT";
652 trans_elastic.commonData.meshPositions = "MESH_NODE_POSITIONS";
653 std::map<int,boost::shared_ptr<SmallStrainTranverslyIsotropicADouble> > tranversly_isotropic_adouble_ptr_map;
654 std::map<int,boost::shared_ptr<SmallStrainTranverslyIsotropicDouble> > tranversly_isotropic_double_ptr_map;
655 bool trans_iso_blocks = false;
657
658 string name = it->getName();
659 if (name.compare(0,20,"MAT_ELASTIC_TRANSISO") == 0) {
660 cout<<"================================ it is MAT_ELASTIC_TRANSISO "<<endl;
661 trans_iso_blocks = true;
662 int id = it->getMeshsetId();
664 ierr = it->getAttributeDataStructure(mydata); CHKERRQ(
ierr);
665 tranversly_isotropic_adouble_ptr_map[id] = boost::make_shared<SmallStrainTranverslyIsotropicADouble>();
666 tranversly_isotropic_double_ptr_map[id] = boost::make_shared<SmallStrainTranverslyIsotropicDouble>();
667
668 tranversly_isotropic_adouble_ptr_map.at(
id)->E_p = mydata.
data.Youngp;
669 tranversly_isotropic_double_ptr_map.at(
id)->E_p = mydata.
data.Youngp;
670 tranversly_isotropic_adouble_ptr_map.at(
id)->E_z = mydata.
data.Youngz;
671 tranversly_isotropic_double_ptr_map.at(
id)->E_z = mydata.
data.Youngz;
672 tranversly_isotropic_adouble_ptr_map.at(
id)->nu_p = mydata.
data.Poissonp;
673 tranversly_isotropic_double_ptr_map.at(
id)->nu_p = mydata.
data.Poissonp;
674 tranversly_isotropic_adouble_ptr_map.at(
id)->nu_pz = mydata.
data.Poissonpz;
675 tranversly_isotropic_double_ptr_map.at(
id)->nu_pz = mydata.
data.Poissonpz;
676 double shear_zp;
677 if(mydata.
data.Shearzp!=0) {
678 shear_zp = mydata.
data.Shearzp;
679 } else {
680 shear_zp = mydata.
data.Youngz/(2*(1+mydata.
data.Poissonpz));
681 }
682 tranversly_isotropic_adouble_ptr_map.at(it->getMeshsetId())->G_zp = shear_zp;
683 tranversly_isotropic_double_ptr_map.at(it->getMeshsetId())->G_zp = shear_zp;
684
687 meshset,MBTET,trans_elastic.setOfBlocks[id].tEts,true
689
690
691
692 trans_elastic.setOfBlocks[id].tEts = intersect(trans_elastic.setOfBlocks[id].tEts,LatestRefinedTets);
693
694
695
696 trans_elastic.setOfBlocks[id].iD = id;
697
698 trans_elastic.setOfBlocks[id].E = 0;
699 trans_elastic.setOfBlocks[id].PoissonRatio = 0;
700 trans_elastic.setOfBlocks[id].materialDoublePtr = tranversly_isotropic_double_ptr_map.at(id);
701 trans_elastic.setOfBlocks[id].materialAdoublePtr = tranversly_isotropic_adouble_ptr_map.at(id);
702 ierr = m_field.seed_finite_elements(trans_elastic.setOfBlocks[
id].tEts); CHKERRQ(
ierr);
703 }
704 }
705
706
713
716 }
717 for(
718 map<int,NonlinearElasticElement::BlockData>::iterator sit = trans_elastic.setOfBlocks.begin();
719 sit!=trans_elastic.setOfBlocks.end();sit++
720 ) {
721
722
723 cout<<" sit->second.tEts "<<sit->second.tEts.size()<<endl;
725 }
726
727
728
733 }
734 map<int,NonlinearElasticElement::BlockData>::iterator sit = trans_elastic.setOfBlocks.begin();
735 for(;sit!=trans_elastic.setOfBlocks.end();sit++) {
738 }
739
740
745 }
746 sit = trans_elastic.setOfBlocks.begin();
747 for(;sit!=trans_elastic.setOfBlocks.end();sit++) {
750 }
751
752
753
754
755
756
757
758
759
765
766 boost::ptr_vector<CohesiveInterfaceElement::PhysicalEquation> interface_materials;
767
768
769
770
771
772 double interface_beta, interface_ft, interface_Gf, interface_h;
777
778
780 cout << endl << *it << endl;
781
782 string name = it->getName();
783 if (name.compare(0,10,"MAT_INTERF") == 0) {
785 ierr = it->getAttributeDataStructure(mydata); CHKERRQ(
ierr);
786 cout << mydata;
788
789 interface_materials.back().youngModulus = mydata.
data.alpha;
790
791
792
793
794 interface_materials.back().h = interface_h;
795 interface_materials.back().beta = interface_beta;
796 interface_materials.back().ft = interface_ft;
797 interface_materials.back().Gf = interface_Gf;
798
802
805 interface_materials.back().pRisms = ents3d.subset_by_type(MBPRISM);
806
807 }
808 }
809
810 ierr = m_field.seed_finite_elements(interface_materials.back().pRisms); CHKERRQ(
ierr);
811
813
814
815
816 {
817 boost::ptr_vector<CohesiveInterfaceElement::PhysicalEquation>::iterator pit = interface_materials.begin();
818 for(; pit != interface_materials.end();pit++) {
820 }
821 }
822
824 ierr = cohesive_elements.addOps(
"DISPLACEMENT",interface_materials); CHKERRQ(
ierr);
825
826
827
829
830
831 lagrangian_element_periodic.addLagrangiangElement("LAGRANGE_ELEM","DISPLACEMENT","LAGRANGE_MUL_PERIODIC","MESH_NODE_POSITIONS",preriodic_prisms);
832
833
834
835
837
838
841
844
847
848
849
852 if(it->getName().compare(0,12,"AllBoundSurf") == 0 || it->getMeshsetId() == 103) {
853
854
856 ierr = PetscPrintf(PETSC_COMM_WORLD,
"Old triangles on SideSet 103 = %d\n",Tri103.size()); CHKERRQ(
ierr);
857
858 Tri103 = intersect(AllTris, Tri103);
859 ierr = PetscPrintf(PETSC_COMM_WORLD,
"New triangles on SideSet 103 = %d\n",Tri103.size()); CHKERRQ(
ierr);
861 }
862 }
863
864
866
868
869
870 DMType dm_name = "PLASTIC_PROB";
872
873 DM dm;
874 ierr = DMCreate(PETSC_COMM_WORLD,&dm);CHKERRQ(
ierr);
875 ierr = DMSetType(dm,dm_name);CHKERRQ(
ierr);
876
877
879 ierr = DMSetFromOptions(dm); CHKERRQ(
ierr);
881
882
889
890
892 Mat Aij;
897 ierr = VecGhostUpdateBegin(
D,INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
898 ierr = VecGhostUpdateEnd(
D,INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
900 ierr = MatZeroEntries(Aij); CHKERRQ(
ierr);
901
902 vector<Vec> Fvec(6);
903 for(int ii = 0;ii<6;ii++) {
904 ierr = VecDuplicate(
D,&Fvec[ii]); CHKERRQ(
ierr);
905 ierr = VecZeroEntries(Fvec[ii]); CHKERRQ(
ierr);
906 ierr = VecGhostUpdateBegin(Fvec[ii],INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
907 ierr = VecGhostUpdateEnd(Fvec[ii],INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
908 }
909
910
911 SmallStrainPlasticity small_strain_plasticity(m_field);
912 {
913 PetscBool bbar = PETSC_TRUE;
915 small_strain_plasticity.commonData.bBar = bbar;
916 }
917 {
918 small_strain_plasticity.feRhs.getOpPtrVector().push_back(
919 new SmallStrainPlasticity::OpGetCommonDataAtGaussPts(
920 "DISPLACEMENT",small_strain_plasticity.commonData
921 )
922 );
923 small_strain_plasticity.feRhs.getOpPtrVector().push_back(
924 new SmallStrainPlasticity::OpCalculateStress(
925 m_field,"DISPLACEMENT",small_strain_plasticity.commonData,cp,false
926 )
927 );
928 small_strain_plasticity.feRhs.getOpPtrVector().push_back(
929 new SmallStrainPlasticity::OpAssembleRhs(
930 "DISPLACEMENT",small_strain_plasticity.commonData
931 )
932 );
933 small_strain_plasticity.feLhs.getOpPtrVector().push_back(
934 new SmallStrainPlasticity::OpGetCommonDataAtGaussPts(
935 "DISPLACEMENT",small_strain_plasticity.commonData
936 )
937 );
938 small_strain_plasticity.feLhs.getOpPtrVector().push_back(
939 new SmallStrainPlasticity::OpCalculateStress(
940 m_field,"DISPLACEMENT",small_strain_plasticity.commonData,cp,false
941 )
942 );
943 small_strain_plasticity.feLhs.getOpPtrVector().push_back(
944 new SmallStrainPlasticity::OpAssembleLhs(
945 "DISPLACEMENT",small_strain_plasticity.commonData
946 )
947 );
948 small_strain_plasticity.feUpdate.getOpPtrVector().push_back(
949 new SmallStrainPlasticity::OpGetCommonDataAtGaussPts(
950 "DISPLACEMENT",small_strain_plasticity.commonData
951 )
952 );
953 small_strain_plasticity.feUpdate.getOpPtrVector().push_back(
954 new SmallStrainPlasticity::OpCalculateStress(
955 m_field,"DISPLACEMENT",small_strain_plasticity.commonData,cp,false
956 )
957 );
958 small_strain_plasticity.feUpdate.getOpPtrVector().push_back(
959 new SmallStrainPlasticity::OpUpdate(
960 "DISPLACEMENT",small_strain_plasticity.commonData
961 )
962 );
963 ierr = small_strain_plasticity.createInternalVariablesTag(); CHKERRQ(
ierr);
964 }
965
966
967
968 lagrangian_element_periodic.setRVEBCsOperatorsNonlinear(
"DISPLACEMENT",
"LAGRANGE_MUL_PERIODIC",
"MESH_NODE_POSITIONS",Aij,Fvec,
F,given_strain);
970 lagrangian_element_rigid_body_trans.setRVEBCsRigidBodyTranOperators("DISPLACEMENT","LAGRANGE_MUL_RIGID_TRANS",Aij, lagrangian_element_periodic.setOfRVEBC);
971
972
974 lagrangian_element_periodic.methodsOp.push_back(
new TimeForceScale(
"-my_macro_strian_history",
false));
975
976
977
983
984
990
991
992 SNES snes;
994 SNES snes_one_step_only;
995
996
997 ierr = SNESCreate(PETSC_COMM_WORLD,&snes); CHKERRQ(
ierr);
998
1002 ierr = SNESSetFromOptions(snes); CHKERRQ(
ierr);
1003
1004 ierr = SNESCreate(PETSC_COMM_WORLD,&snes_one_step_only); CHKERRQ(
ierr);
1005 ierr = SNESSetFunction(snes_one_step_only,
F,
SnesRhs,snes_ctx); CHKERRQ(
ierr);
1006 ierr = SNESSetJacobian(snes_one_step_only,Aij,Aij,
SnesMat,snes_ctx); CHKERRQ(
ierr);
1007 ierr = SNESSetFromOptions(snes_one_step_only); CHKERRQ(
ierr);
1008 double atol,rtol,stol;
1009 int maxit,maxf;
1010 SNESGetTolerances(snes_one_step_only,&atol,&rtol,&stol,&maxit,&maxf);
1011 maxit = 1;
1012 atol *= 0;
1013 SNESSetTolerances(snes_one_step_only,atol,rtol,stol,maxit,maxf);
1014 SNESLineSearch linesearch;
1015 SNESGetLineSearch(snes_one_step_only,&linesearch);
1016 SNESLineSearchSetType(linesearch,SNESLINESEARCHBASIC);
1017
1018
1019
1021 ierr = post_proc.generateReferenceElementMesh(); CHKERRQ(
ierr);
1022 ierr = post_proc.addFieldValuesPostProc(
"DISPLACEMENT"); CHKERRQ(
ierr);
1023 ierr = post_proc.addFieldValuesGradientPostProc(
"DISPLACEMENT"); CHKERRQ(
ierr);
1024 ierr = post_proc.addFieldValuesPostProc(
"MESH_NODE_POSITIONS"); CHKERRQ(
ierr);
1025
1026
1027
1029 Vec volume_vec;
1030 int volume_vec_ghost[] = { 0 };
1031 ierr = VecCreateGhost(
1032 PETSC_COMM_WORLD,(!m_field.
get_comm_rank())?1:0,1,1,volume_vec_ghost,&volume_vec
1034 ierr = VecZeroEntries(volume_vec); CHKERRQ(
ierr);
1035 vol_elem.getOpPtrVector().push_back(
new VolumeCalculation(
"DISPLACEMENT",volume_vec));
1036
1039
1040 ierr = VecAssemblyBegin(volume_vec); CHKERRQ(
ierr);
1041 ierr = VecAssemblyEnd(volume_vec); CHKERRQ(
ierr);
1042 double rve_volume;
1043 ierr = VecSum(volume_vec,&rve_volume); CHKERRQ(
ierr);
1044
1045
1046 ierr = PetscPrintf(PETSC_COMM_WORLD,
"RVE Volume %3.2g\n",rve_volume); CHKERRQ(
ierr);
1047 ierr = VecDestroy(&volume_vec);
1048
1049
1050 double final_time = 1,delta_time = 0.1;
1053 double delta_time0 = delta_time;
1054
1055
1056
1057
1058
1059 Vec D0;
1060 ierr = VecDuplicate(
D,&D0); CHKERRQ(
ierr);
1061
1062 int step = 0;
1064 SNESConvergedReason reason = SNES_CONVERGED_ITERATING;
1065 for(;
t<final_time;step++) {
1067
1068
1069
1070
1071 PetscPrintf(
1072 PETSC_COMM_WORLD,
"Step %d Time %6.4g final time %3.2g\n",step,
t,final_time
1073 );
1074
1075 lagrangian_element_periodic.getLoopFeRVEBCRhs().ts_t =
t;
1076
1077 ierr = VecAssemblyBegin(
D);
1078 ierr = VecAssemblyEnd(
D);
1080 if(step == 0 || reason < 0) {
1081 ierr = SNESSetLagJacobian(snes,-2); CHKERRQ(
ierr);
1082 } else {
1083 ierr = SNESSetLagJacobian(snes,-1); CHKERRQ(
ierr);
1084 }
1085 ierr = SNESSetLagJacobian(snes_one_step_only,-2);
1086 ierr = SNESSolve(snes_one_step_only,PETSC_NULL,
D); CHKERRQ(
ierr);
1087 ierr = SNESGetConvergedReason(snes_one_step_only,&reason); CHKERRQ(
ierr);
1088 if(reason<0) {
1089 ierr = SNESSolve(snes,PETSC_NULL,
D); CHKERRQ(
ierr);
1090 }
1091 int its;
1092 ierr = SNESGetIterationNumber(snes,&its); CHKERRQ(
ierr);
1093
1095 PETSC_COMM_WORLD,"number of Newton iterations = %D\n",its
1097
1098 ierr = SNESGetConvergedReason(snes,&reason); CHKERRQ(
ierr);
1099
1100 if(reason<0) {
1102 delta_time *= 0.1;
1104 } else {const int its_d = 60;
1105 const double gamma = 0.5;
1106 const double max_reudction = 1;
1107 const double min_reduction = 1e-1;
1108 double reduction;
1109 reduction = pow((double)its_d/(double)(its+1),gamma);
1110 if(delta_time >= max_reudction*delta_time0 && reduction > 1) {
1111 reduction = 1;
1112 } else if(delta_time <= min_reduction*delta_time0 && reduction < 1) {
1113 reduction = 1;
1114 }
1115
1117 PETSC_COMM_WORLD,
1118 "reduction delta_time = %6.4e delta_time = %6.4e\n",
1119 reduction,delta_time
1121 delta_time *= reduction;
1122 if(reduction>1 && delta_time < min_reduction*delta_time0) {
1123 delta_time = min_reduction*delta_time0;
1124 }
1125
1127 dm,
D,INSERT_VALUES,SCATTER_REVERSE
1129
1131 dm,"PLASTIC",&small_strain_plasticity.feUpdate
1133
1134
1136 dm,"INTERFACE",&cohesive_elements.feHistory
1138
1139
1140 {
1142 dm,"PLASTIC",&post_proc
1144
1146 {
1147 std::ostringstream stm;
1148 stm << "out_matrix_" << step << ".h5m";
1150 }
1151
1155
1156 rval = post_proc.postProcMesh.write_file(
1159
1160
1161
1163 dm,"TRAN_ISOTROPIC_ELASTIC",&post_proc
1165 {
1166 std::ostringstream stm;
1167 stm << "out_fibres_" << step << ".h5m";
1169 }
1173
1174 rval = post_proc.postProcMesh.write_file(
1177
1178 }
1179
1180
1182 StressHomo.resize(6);
1183 StressHomo.clear();
1184
1185
1186
1187 Vec stress_homo;
1188 int stress_homo_ghost[] = { 0,1,2,3,4,5,6 };
1189 ierr = VecCreateGhost(
1190 PETSC_COMM_WORLD,(!m_field.
get_comm_rank())?6:0,6,6,stress_homo_ghost,&stress_homo
1192
1193 lagrangian_element_periodic.setRVEBCsHomoStressOperators("DISPLACEMENT","LAGRANGE_MUL_PERIODIC","MESH_NODE_POSITIONS",stress_homo);
1194
1195
1196 PetscScalar *avec;
1197 ierr = VecGetArray(stress_homo,&avec); CHKERRQ(
ierr);
1198 ierr = VecZeroEntries(stress_homo); CHKERRQ(
ierr);
1200 "PLASTIC_PROB","LAGRANGE_ELEM",lagrangian_element_periodic.getLoopFeRVEBCStress()
1203 PETSC_NULL,"-my_rve_volume",&rve_volume,PETSC_NULL
1205 ierr = VecAssemblyBegin(stress_homo); CHKERRQ(
ierr);
1206 ierr = VecAssemblyEnd(stress_homo); CHKERRQ(
ierr);
1207 ierr = VecScale(stress_homo,1.0/rve_volume); CHKERRQ(
ierr);
1208 ierr = VecGhostUpdateBegin(stress_homo,INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
1209 ierr = VecGhostUpdateEnd(stress_homo,INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
1210
1211 for(int jj=0; jj<6; jj++) {
1212 StressHomo(jj) = avec[jj];
1213 }
1214
1217
1218 PetscPrintf(PETSC_COMM_WORLD,
1219 "Macro_Strain Homo_Stress Path "
1220 );
1221
1222
1223 for(int ii=0; ii<6; ii++) {
1224 PetscPrintf(
1225 PETSC_COMM_WORLD,
1226 "%8.5e\t",
1228 );
1229 }
1230
1231
1232 for(int ii=0; ii<6; ii++) {
1233 PetscPrintf(
1234 PETSC_COMM_WORLD,
1235 "%8.5e\t",
1236 StressHomo(ii)
1237 );
1238 }
1239
1240 PetscPrintf(PETSC_COMM_WORLD,
1241 "\n"
1242 );
1243
1244 }
1245 }
1246
1247 ierr = VecDestroy(&D0); CHKERRQ(
ierr);
1248 ierr = MatDestroy(&Aij); CHKERRQ(
ierr);
1251
1252 }
1254
1255
1257}
#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 bool check_field(const std::string &name) const =0
check if field is in database
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.
#define _IT_CUBITMESHSETS_BY_BCDATA_TYPE_FOR_LOOP_(MESHSET_MANAGER, CUBITBCTYPE, IT)
Iterator that loops over a specific Cubit MeshSet in a moFEM field.
#define _IT_CUBITMESHSETS_BY_SET_TYPE_FOR_LOOP_(MESHSET_MANAGER, CUBITBCTYPE, IT)
Iterator that loops over a specific Cubit MeshSet having a particular BC meshset in a moFEM field.
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
Constitutive (physical) equation for interface.
Cohesive element implementation.
virtual moab::Interface & get_moab()=0
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(const Range &ents, const BitRefLevel &bit, const bool only_tets=true, int verb=-1)
seed entities in the range and their adjacencies in a particular BitRefLevel
Transverse Isotropic material data structure.
Linear interface data structure.
Projection of edge entities with one mid-node on hierarchical basis.
Interface for nonlinear (SNES) solver.
Volume finite element base.
Operator performs automatic differentiation.
structure grouping operators and data used for calculation of nonlinear elastic element
Force scale operator for reading two columns.