void elasticitySolver::solve() { //linearSystemFull<double> *lsys = new linearSystemFull<double>; #if defined(HAVE_TAUCS) linearSystemCSRTaucs<double> *lsys = new linearSystemCSRTaucs<double>; #elif defined(HAVE_PETSC) linearSystemPETSc<double> *lsys = new linearSystemPETSc<double>; #else linearSystemGmm<double> *lsys = new linearSystemGmm<double>; lsys->setNoisy(2); #endif assemble(lsys); lsys->systemSolve(); printf("-- done solving!\n"); GaussQuadrature Integ_Bulk(GaussQuadrature::GradGrad); // printLinearSystem(lsys); double energ=0; for (unsigned int i = 0; i < elasticFields.size(); i++) { SolverField<SVector3> Field(pAssembler, LagSpace); IsotropicElasticTerm Eterm(Field,elasticFields[i]._E,elasticFields[i]._nu); BilinearTermToScalarTerm Elastic_Energy_Term(Eterm); Assemble(Elastic_Energy_Term,elasticFields[i].g->begin(),elasticFields[i].g->end(), Integ_Bulk,energ); } printf("elastic energy=%f\n",energ); }
PView *elasticitySolver::buildVonMisesView(const std::string postFileName) { std::cout << "build elastic view"<< std::endl; std::map<int, std::vector<double> > data; GaussQuadrature Integ_Bulk(GaussQuadrature::GradGrad); for (unsigned int i = 0; i < elasticFields.size(); ++i) { SolverField<SVector3> Field(pAssembler, LagSpace); IsotropicElasticTerm Eterm(Field,elasticFields[i]._E,elasticFields[i]._nu); BilinearTermToScalarTerm Elastic_Energy_Term(Eterm); for (groupOfElements::elementContainer::const_iterator it = elasticFields[i].g->begin(); it != elasticFields[i].g->end(); ++it) { MElement *e=*it; double energ; IntPt *GP; int npts=Integ_Bulk.getIntPoints(e,&GP); Elastic_Energy_Term.get(e,npts,GP,energ); std::vector<double> vec; vec.push_back(energ); data[(*it)->getNum()]=vec; } } PView *pv = new PView (postFileName, "ElementData", pModel, data, 0.0); return pv; }
void elasticitySolver::solve() { std::string sysname = "A"; if(pAssembler && pAssembler->getLinearSystem(sysname)) delete pAssembler->getLinearSystem(sysname); #if defined(HAVE_PETSC) linearSystemPETSc<double> *lsys = new linearSystemPETSc<double>; #elif defined(HAVE_GMM) linearSystemCSRGmm<double> *lsys = new linearSystemCSRGmm<double>; #else linearSystemFull<double> *lsys = new linearSystemFull<double>; #endif assemble(lsys); // printLinearSystem(lsys,pAssembler->sizeOfR()); lsys->systemSolve(); printf("-- done solving!\n"); double energ = 0; GaussQuadrature Integ_Bulk(GaussQuadrature::GradGrad); for(std::size_t i = 0; i < elasticFields.size(); i++) { SolverField<SVector3> Field(pAssembler, LagSpace); IsotropicElasticTerm Eterm(Field, elasticFields[i]._e, elasticFields[i]._nu); BilinearTermToScalarTerm Elastic_Energy_Term(Eterm); Assemble(Elastic_Energy_Term, elasticFields[i].g->begin(), elasticFields[i].g->end(), Integ_Bulk, energ); } printf("elastic energy=%f\n", energ); }
void elasticitySolver::postSolve() { GaussQuadrature Integ_Bulk(GaussQuadrature::GradGrad); double energ=0; for (unsigned int i = 0; i < elasticFields.size(); i++) { SolverField<SVector3> Field(pAssembler, LagSpace); IsotropicElasticTerm Eterm(Field,elasticFields[i]._E,elasticFields[i]._nu); BilinearTermToScalarTerm Elastic_Energy_Term(Eterm); Assemble(Elastic_Energy_Term, elasticFields[i].g->begin(), elasticFields[i].g->end(), Integ_Bulk, energ); } printf("elastic energy=%f\n",energ); }
PView* elasticitySolver::buildStressesView (const std::string postFileName) { std::cout << "build stresses view"<< std::endl; std::map<int, std::vector<double> > data; GaussQuadrature Integ_Bulk(GaussQuadrature::GradGrad); for (unsigned int i = 0; i < elasticFields.size(); ++i) { double E = elasticFields[i]._E; double nu = elasticFields[i]._nu; SolverField<SVector3> Field(pAssembler, LagSpace); IsotropicElasticTerm Eterm(Field,elasticFields[i]._E,elasticFields[i]._nu); BilinearTermToScalarTerm Elastic_Energy_Term(Eterm); for (groupOfElements::elementContainer::const_iterator it = elasticFields[i].g->begin(); it != elasticFields[i].g->end(); ++it) { MElement *e=*it; int nbVertex = e->getNumVertices(); std::vector<SVector3> val(nbVertex); double valx[256]; double valy[256]; double valz[256]; for (int k = 0; k < nbVertex; k++){ MVertex *v = e->getVertex(k); MPoint p(v); Field.f(&p,0,0,0,val[k]); valx[k] =val[k](0); valy[k] =val[k](1); valz[k] =val[k](2); } double gradux[3]; double graduy[3]; double graduz[3]; double u=0.33, v=0.33, w=0.0; e->interpolateGrad(valx, u, v, w, gradux); e->interpolateGrad(valy, u, v, w, graduy); e->interpolateGrad(valz, u, v, w, graduz); double eps[6] = {gradux[0], graduy[1], graduz[2], 0.5 * (gradux[1] + graduy[0]), 0.5 * (gradux[2] + graduz[0]), 0.5 * (graduy[2] + graduz[1])}; double A = E / (1. + nu); double B = A * (nu / (1. - 2 * nu)); double trace = eps[0] + eps[1] + eps[2] ; double sxx = A * eps[0] + B * trace; double syy = A * eps[1] + B * trace; double szz = A * eps[2] + B * trace; double sxy = A * eps[3]; double sxz = A * eps[4]; double syz = A * eps[5]; std::vector<double> vec(9); vec[0]=sxx; vec[1]=sxy; vec[2]=sxz; vec[3]=sxy; vec[4]=syy; vec[5]=syz; vec[6]=sxz; vec[7]=syz; vec[8]=szz; data[e->getNum()]=vec; } } PView *pv = new PView (postFileName, "ElementData", pModel, data, 0.0); return pv; }