25#include <boost/program_options.hpp>
27namespace po = boost::program_options;
29#include <boost/numeric/ublas/vector_proxy.hpp>
30#include <boost/numeric/ublas/matrix.hpp>
31#include <boost/numeric/ublas/matrix_proxy.hpp>
32#include <boost/numeric/ublas/vector.hpp>
33#include <boost/numeric/ublas/symmetric.hpp>
43#ifndef WITH_MODULE_SMALL_STRAIN_PLASTICITY
44 #error "Install module small strain plasticity https://bitbucket.org/likask/mofem_um_small_strain_plasticity"
47#include <adolc/adolc.h>
56using namespace boost::numeric;
85typedef multi_index_container<
89tag<xcoord_tag>, member<Face_CenPos_Handle,double,&Face_CenPos_Handle::xcoord> >,
92tag<ycoord_tag>, member<Face_CenPos_Handle,double,&Face_CenPos_Handle::ycoord> >,
95tag<zcoord_tag>, member<Face_CenPos_Handle,double,&Face_CenPos_Handle::zcoord> >,
98tag<Tri_Hand_tag>, member<Face_CenPos_Handle,const EntityHandle,&Face_CenPos_Handle::Tri_Hand> >,
101tag<Composite_xyzcoord>,
104member<Face_CenPos_Handle,double,&Face_CenPos_Handle::xcoord>,
105member<Face_CenPos_Handle,double,&Face_CenPos_Handle::ycoord>,
106member<Face_CenPos_Handle,double,&Face_CenPos_Handle::zcoord> > >
116int main(
int argc,
char *argv[]) {
123 ParallelComm* pcomm = ParallelComm::get_pcomm(&moab,
MYPCOMM_INDEX);
124 if(pcomm == NULL) pcomm =
new ParallelComm(&moab,PETSC_COMM_WORLD);
126 PetscBool flg = PETSC_TRUE;
129 if(flg != PETSC_TRUE) {
130 SETERRQ(PETSC_COMM_SELF,1,
"*** ERROR -my_file (MESH FILE NEEDED)");
135 if(flg != PETSC_TRUE) {
138 PetscInt bubble_order;
140 if(flg != PETSC_TRUE) {
141 bubble_order =
order;
146 PetscBool is_partitioned = PETSC_FALSE;
150 double mygiven_strain[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;
159 if(is_partitioned == PETSC_TRUE) {
161 option =
"PARALLEL=BCAST_DELETE;PARALLEL_RESOLVE_SHARED_ENTS;PARTITION=PARALLEL_PARTITION;";
180 EntityHandle meshset_level0;
183 ierr = m_field.get_entities_by_ref_level(bit_level0,
BitRefLevel().set(),meshset_level0); CHKERRQ(
ierr);
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++) {
198 const EntityHandle* conn_face;
int num_nodes_Tri;
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;
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;
217 Face_CenPos_Handle_varNeg.insert(
Face_CenPos_Handle(TriCen[0], TriCen[1], TriCen[2], *it));
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++) {
234 const EntityHandle* conn_face;
int num_nodes_Tri;
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;
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;
253 Face_CenPos_Handle_varPos.insert(
Face_CenPos_Handle(TriCen[0], TriCen[1], TriCen[2], *it));
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;
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;
276 double LxRVE, LyRVE, LzRVE;
277 LxRVE=XcoordMax-XcoordMin;
278 LyRVE=YcoordMax-YcoordMin;
279 LzRVE=ZcoordMax-ZcoordMin;
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;
292 for(Range::iterator it = SurTrisNeg.begin(); it!=SurTrisNeg.end(); it++) {
294 Tri_Neg=Face_CenPos_Handle_varNeg.get<
Tri_Hand_tag>().find(*it);
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));
307 EntityHandle PrismNodes[6];
308 vector<EntityHandle> TriNodesNeg, TriNodesPos;
309 double CoordNodeNeg[9], CoordNodePos[9];
314 for(
int ii=0; ii<3; ii++){
315 PrismNodes[ii]=TriNodesNeg[ii];
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++){
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;
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;
342 if(XNodeNeg==XNodePos && YNodeNeg==YNodePos && ZNodeNeg==ZNodePos){
343 PrismNodes[3+ii]=TriNodesPos[jj];
349 double CoordNodesPrisms[18];
356 EntityHandle PeriodicPrism;
358 PrismRange.insert(PeriodicPrism);
361 EntityHandle PrismRangeMeshset;
365 ierr = m_field.get_entities_by_ref_level(bit_level0,
BitRefLevel().set(),meshset_level0); CHKERRQ(
ierr);
430 PetscPrintf(PETSC_COMM_WORLD,
"young_modulus = %4.2e \n",
young_modulus);
431 PetscPrintf(PETSC_COMM_WORLD,
"poisson_ratio = %4.2e \n",
poisson_ratio);
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);
436 PetscPrintf(PETSC_COMM_WORLD,
"nup = %4.2e \n",cp.
nup);
438 cp.
sTrain.resize(6,
false);
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);
539 ierr = m_field.
loop_dofs(
"MESH_NODE_POSITIONS",ent_method_material,0); CHKERRQ(
ierr);
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");
562 DMType dm_name =
"PLASTIC_PROB";
566 ierr = DMCreate(PETSC_COMM_WORLD,&dm);CHKERRQ(
ierr);
567 ierr = DMSetType(dm,dm_name);CHKERRQ(
ierr);
571 ierr = DMSetFromOptions(dm); CHKERRQ(
ierr);
583 ierr = VecDuplicate(
D,&F); CHKERRQ(
ierr);
587 ierr = VecGhostUpdateBegin(
D,INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
588 ierr = VecGhostUpdateEnd(
D,INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
591 ierr = VecZeroEntries(F); CHKERRQ(
ierr);
592 ierr = VecGhostUpdateBegin(F,INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
593 ierr = VecGhostUpdateEnd(F,INSERT_VALUES,SCATTER_FORWARD); CHKERRQ(
ierr);
596 ierr = MatZeroEntries(Aij); CHKERRQ(
ierr);
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);
609 PetscBool bbar = PETSC_TRUE;
616 "DISPLACEMENT",small_strain_plasticity.
commonData
621 m_field,
"DISPLACEMENT",small_strain_plasticity.
commonData,cp,
false
626 "DISPLACEMENT",small_strain_plasticity.
commonData
631 "DISPLACEMENT",small_strain_plasticity.
commonData
636 m_field,
"DISPLACEMENT",small_strain_plasticity.
commonData,cp,
false
641 "DISPLACEMENT",small_strain_plasticity.
commonData
646 "DISPLACEMENT",small_strain_plasticity.
commonData
651 m_field,
"DISPLACEMENT",small_strain_plasticity.
commonData,cp,
false
656 "DISPLACEMENT",small_strain_plasticity.
commonData
662 lagrangian_element_periodic.
setRVEBCsOperatorsNonlinear(
"DISPLACEMENT",
"LAGRANGE_MUL_PERIODIC",
"MESH_NODE_POSITIONS",Aij,Fvec,F,given_strain);
668 TimeForceScale time_force_scale(
"-my_macro_strian_history",
false);
689 ierr = SNESCreate(PETSC_COMM_WORLD,&snes); CHKERRQ(
ierr);
694 ierr = SNESSetFromOptions(snes); CHKERRQ(
ierr);
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);
715 ierr = VecAssemblyBegin(volume_vec); CHKERRQ(
ierr);
716 ierr = VecAssemblyEnd(volume_vec); CHKERRQ(
ierr);
718 ierr = VecSum(volume_vec,&rve_volume); CHKERRQ(
ierr);
721 ierr = PetscPrintf(PETSC_COMM_WORLD,
"RVE Volume %3.2g\n",rve_volume); CHKERRQ(
ierr);
722 ierr = VecDestroy(&volume_vec);
725 double final_time = 1,delta_time = 0.1;
728 double delta_time0 = delta_time;
735 ierr = VecDuplicate(
D,&D0); CHKERRQ(
ierr);
739 SNESConvergedReason reason = SNES_CONVERGED_ITERATING;
740 for(;
t<final_time;step++) {
747 PETSC_COMM_WORLD,
"Step %d Time %6.4g final time %3.2g\n",step,
t,final_time
752 ierr = VecAssemblyBegin(
D);
753 ierr = VecAssemblyEnd(
D);
756 if(step == 0 || reason < 0) {
757 ierr = SNESSetLagJacobian(snes,-2); CHKERRQ(
ierr);
759 ierr = SNESSetLagJacobian(snes,-1); CHKERRQ(
ierr);
763 ierr = SNESSolve(snes,PETSC_NULL,
D); CHKERRQ(
ierr);
765 ierr = SNESGetIterationNumber(snes,&its); CHKERRQ(
ierr);
768 PETSC_COMM_WORLD,
"number of Newton iterations = %D\n",its
771 ierr = SNESGetConvergedReason(snes,&reason); CHKERRQ(
ierr);
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;
783 reduction = pow((
double)its_d/(
double)(its+1),gamma);
784 if(delta_time >= max_reudction*delta_time0 && reduction > 1) {
786 }
else if(delta_time <= min_reduction*delta_time0 && reduction < 1) {
792 "reduction delta_time = %6.4e delta_time = %6.4e\n",
795 delta_time *= reduction;
796 if(reduction>1 && delta_time < min_reduction*delta_time0) {
797 delta_time = min_reduction*delta_time0;
801 dm,
D,INSERT_VALUES,SCATTER_REVERSE
804 dm,
"PLASTIC",&small_strain_plasticity.
feUpdate
810 dm,
"PLASTIC",&post_proc
812 string out_file_name;
814 std::ostringstream stm;
815 stm <<
"out_" << step <<
".h5m";
816 out_file_name = stm.str();
819 PETSC_COMM_WORLD,
"out file %s\n",out_file_name.c_str()
822 out_file_name.c_str(),
"MOAB",
"PARALLEL=WRITE_PART"
827 StressHomo.resize(6);
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
841 ierr = VecGetArray(stress_homo,&avec); CHKERRQ(
ierr);
842 ierr = VecZeroEntries(stress_homo); CHKERRQ(
ierr);
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);
855 for(
int jj=0; jj<6; jj++) {
856 StressHomo(jj) = avec[jj];
862 PetscPrintf(PETSC_COMM_WORLD,
863 "Macro_Strain Homo_Stress Path "
867 for(
int ii=0; ii<6; ii++) {
876 for(
int ii=0; ii<6; ii++) {
884 PetscPrintf(PETSC_COMM_WORLD,
893 ierr = VecDestroy(&D0); CHKERRQ(
ierr);
894 ierr = MatDestroy(&Aij); CHKERRQ(
ierr);
895 ierr = VecDestroy(&F); CHKERRQ(
ierr);
Post-process fields on refined mesh.
Operators and data structures for small strain plasticity.
Small Strain plasticity material models.
Operator can be used with any volume element to calculate sum of volumes of all volumes in the set.
#define CATCH_ERRORS
Catch errors.
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base .
#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 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 DMMoFEMAddElement(DM dm, const char fe_name[])
add element to dm
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 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 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 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_data(const std::string &fe_name, const std::string &name_filed)=0
set finite element field data
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 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.
MoFEMErrorCode addFieldValuesGradientPostProc(const std::string field_name, Vec v=PETSC_NULL)
Add operator to post-process L2 or H1 field gradient.
MoFEMErrorCode addFieldValuesPostProc(const std::string field_name, Vec v=PETSC_NULL)
Add operator to post-process L2, H1, Hdiv, Hcurl field value.
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
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.
implementation of Data Operators for Forces and Sources
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)
DeprecatedCoreInterface Interface
const double D
diffusivity
constexpr double t
plate stiffness
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
int main(int argc, char *argv[])
map< int, RVEBC_Data > setOfRVEBC
maps side set id with appropriate FluxData
PetscErrorCode addLagrangiangElement(const string element_name, const string field_name, const string lagrang_field_name, const string mesh_nodals_positions)
MyPrismFE & getLoopFeRVEBCRhs()
boost::ptr_vector< MethodForForceScaling > methodsOp
PetscErrorCode setRVEBCsHomoStressOperators(string field_name, string lagrang_field_name, string mesh_nodals_positions, Vec stress_homo)
MyPrismFE & getLoopFeRVEBCStress()
PetscErrorCode addLagrangiangElement(const string element_name, const string field_name, const string lagrang_field_name, const string mesh_nodals_positions, Range &periodic_prisms)
MyPrismFE feRVEBCRhsResidual
PetscErrorCode setRVEBCsOperatorsNonlinear(string field_name, string lagrang_field_name, string mesh_nodals_positions, Mat aij, vector< Vec > &fvec, Vec f, VectorDouble given_strain)
PetscErrorCode setRVEBCsRigidBodyTranOperators(string field_name, string lagrang_field_name, Mat aij, map< int, RVEBC_Data > setOfRVEBC)
const EntityHandle Tri_Hand
Face_CenPos_Handle(double _xcoord, double _ycoord, double _zcoord, const EntityHandle _Tri_Hand)
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...
boost::ptr_vector< UserDataOperator > & getOpPtrVector()
Use to push back operator for row operator.
Projection of edge entities with one mid-node on hierarchical basis.
Interface for nonlinear (SNES) solver.
Volume finite element base.
moab::Interface & postProcMesh
MoFEMErrorCode generateReferenceElementMesh()
Generate reference mesh on single element.
Small strain plasticity with paraboloidal yield criterion (Isotropic Hardening)
PetscErrorCode snesCreate()
VectorDouble plasticStrain
virtual PetscErrorCode createMatAVecR()
VectorDouble internalVariables
Small strain finite element implementation.
MyVolumeFE feRhs
calculate right hand side for tetrahedral elements
PetscErrorCode createInternalVariablesTag()
Force scale operator for reading two columns.
MoFEMErrorCode getForceScale(const double ts_t, double &scale)