void elasticitySolver::assemble(linearSystem<double> *lsys) { if(pAssembler) delete pAssembler; pAssembler = new dofManager<double>(lsys); // we first do all fixations. the behavior of the dofManager is to // give priority to fixations : when a dof is fixed, it cannot be // numbered afterwards // Dirichlet conditions for(std::size_t i = 0; i < allDirichlet.size(); i++) { FilterDofComponent filter(allDirichlet[i]._comp); FixNodalDofs(*LagSpace, allDirichlet[i].g->begin(), allDirichlet[i].g->end(), *pAssembler, *allDirichlet[i]._f, filter); } // LagrangeMultipliers for(std::size_t i = 0; i < LagrangeMultiplierFields.size(); ++i) { std::size_t j = 0; for(; j < LagrangeMultiplierSpaces.size(); j++) if(LagrangeMultiplierSpaces[j]->getId() == LagrangeMultiplierFields[i]._tag) break; NumberDofs(*(LagrangeMultiplierSpaces[j]), LagrangeMultiplierFields[i].g->begin(), LagrangeMultiplierFields[i].g->end(), *pAssembler); } // Elastic Fields for(std::size_t i = 0; i < elasticFields.size(); ++i) { if(elasticFields[i]._e != 0.) NumberDofs(*LagSpace, elasticFields[i].g->begin(), elasticFields[i].g->end(), *pAssembler); } // Voids for(std::size_t i = 0; i < elasticFields.size(); ++i) { if(elasticFields[i]._e == 0.) FixVoidNodalDofs(*LagSpace, elasticFields[i].g->begin(), elasticFields[i].g->end(), *pAssembler); } // Neumann conditions GaussQuadrature Integ_Boundary(GaussQuadrature::Val); for(std::size_t i = 0; i < allNeumann.size(); i++) { LoadTerm<SVector3> Lterm(*LagSpace, allNeumann[i]._f); Assemble(Lterm, *LagSpace, allNeumann[i].g->begin(), allNeumann[i].g->end(), Integ_Boundary, *pAssembler); } // Assemble cross term, laplace term and rhs term for LM GaussQuadrature Integ_LagrangeMult(GaussQuadrature::ValVal); GaussQuadrature Integ_Laplace(GaussQuadrature::GradGrad); for(std::size_t i = 0; i < LagrangeMultiplierFields.size(); i++) { std::size_t j = 0; for(; j < LagrangeMultiplierSpaces.size(); j++) if(LagrangeMultiplierSpaces[j]->getId() == LagrangeMultiplierFields[i]._tag) break; printf("Lagrange Mult Lag\n"); LagrangeMultiplierTerm<SVector3> LagTerm(*LagSpace, *(LagrangeMultiplierSpaces[j]), LagrangeMultiplierFields[i]._d); Assemble(LagTerm, *LagSpace, *(LagrangeMultiplierSpaces[j]), LagrangeMultiplierFields[i].g->begin(), LagrangeMultiplierFields[i].g->end(), Integ_LagrangeMult, *pAssembler); printf("Lagrange Mult Lap\n"); LaplaceTerm<double, double> LapTerm(*(LagrangeMultiplierSpaces[j]), -LagrangeMultiplierFields[i]._tau); Assemble(LapTerm, *(LagrangeMultiplierSpaces[j]), LagrangeMultiplierFields[i].g->begin(), LagrangeMultiplierFields[i].g->end(), Integ_Laplace, *pAssembler); printf("Lagrange Mult Load\n"); LoadTermOnBorder<double> Lterm(*(LagrangeMultiplierSpaces[j]), LagrangeMultiplierFields[i]._f); Assemble(Lterm, *(LagrangeMultiplierSpaces[j]), LagrangeMultiplierFields[i].g->begin(), LagrangeMultiplierFields[i].g->end(), Integ_Boundary, *pAssembler); } // Assemble elastic term for GaussQuadrature Integ_Bulk(GaussQuadrature::GradGrad); for(std::size_t i = 0; i < elasticFields.size(); i++) { printf("Elastic\n"); IsotropicElasticTerm Eterm(*LagSpace, elasticFields[i]._e, elasticFields[i]._nu); Assemble(Eterm, *LagSpace, elasticFields[i].g->begin(), elasticFields[i].g->end(), Integ_Bulk, *pAssembler); } printf("nDofs=%d\n", pAssembler->sizeOfR()); printf("nFixed=%d\n", pAssembler->sizeOfF()); }
void elasticitySolver::assemble(linearSystem<double> *lsys) { if (pAssembler) delete pAssembler; pAssembler = new dofManager<double>(lsys); // we first do all fixations. the behavior of the dofManager is to // give priority to fixations : when a dof is fixed, it cannot be // numbered afterwards // Dirichlet conditions for (unsigned int i = 0; i < allDirichlet.size(); i++) { FilterDofComponent filter(allDirichlet[i]._comp); FixNodalDofs(*LagSpace,allDirichlet[i].g->begin(),allDirichlet[i].g->end(), *pAssembler,*allDirichlet[i]._f,filter); } // LagrangeMultipliers for (unsigned int i = 0; i < LagrangeMultiplierFields.size(); ++i) { NumberDofs(*LagrangeMultiplierSpace, LagrangeMultiplierFields[i].g->begin(), LagrangeMultiplierFields[i].g->end(), *pAssembler); } // Elastic Fields for (unsigned int i = 0; i < elasticFields.size(); ++i) { if(elasticFields[i]._E != 0.) NumberDofs(*LagSpace, elasticFields[i].g->begin(), elasticFields[i].g->end(), *pAssembler); } // Voids for (unsigned int i = 0; i < elasticFields.size(); ++i) { if(elasticFields[i]._E == 0.) FixVoidNodalDofs(*LagSpace, elasticFields[i].g->begin(), elasticFields[i].g->end(), *pAssembler); } // Neumann conditions GaussQuadrature Integ_Boundary(GaussQuadrature::Val); for (unsigned int i = 0; i < allNeumann.size(); i++) { LoadTerm<SVector3> Lterm(*LagSpace,*allNeumann[i]._f); Assemble(Lterm,*LagSpace,allNeumann[i].g->begin(),allNeumann[i].g->end(), Integ_Boundary,*pAssembler); } // Assemble cross term, laplace term and rhs term for LM GaussQuadrature Integ_LagrangeMult(GaussQuadrature::ValVal); GaussQuadrature Integ_Laplace(GaussQuadrature::GradGrad); for (unsigned int i = 0; i < LagrangeMultiplierFields.size(); i++) { LagrangeMultiplierTerm LagTerm(*LagSpace, *LagrangeMultiplierSpace, LagrangeMultiplierFields[i]._d); Assemble(LagTerm, *LagSpace, *LagrangeMultiplierSpace, LagrangeMultiplierFields[i].g->begin(), LagrangeMultiplierFields[i].g->end(), Integ_LagrangeMult, *pAssembler); LaplaceTerm<double,double> LapTerm(*LagrangeMultiplierSpace, LagrangeMultiplierFields[i]._tau); Assemble(LapTerm, *LagrangeMultiplierSpace, LagrangeMultiplierFields[i].g->begin(), LagrangeMultiplierFields[i].g->end(), Integ_Laplace, *pAssembler); LoadTerm<double> Lterm(*LagrangeMultiplierSpace, LagrangeMultiplierFields[i]._f); Assemble(Lterm, *LagrangeMultiplierSpace, LagrangeMultiplierFields[i].g->begin(), LagrangeMultiplierFields[i].g->end(), Integ_Boundary, *pAssembler); } // Assemble elastic term for GaussQuadrature Integ_Bulk(GaussQuadrature::GradGrad); for (unsigned int i = 0; i < elasticFields.size(); i++) { IsotropicElasticTerm Eterm(*LagSpace,elasticFields[i]._E,elasticFields[i]._nu); Assemble(Eterm,*LagSpace,elasticFields[i].g->begin(),elasticFields[i].g->end(), Integ_Bulk,*pAssembler); } /*for (int i=0;i<pAssembler->sizeOfR();i++){ for (int j=0;j<pAssembler->sizeOfR();j++){ double d;lsys->getFromMatrix(i,j,d); printf("%12.5E ",d); } double d;lsys->getFromRightHandSide(i,d); printf(" | %12.5E\n",d); }*/ printf("nDofs=%d\n",pAssembler->sizeOfR()); printf("nFixed=%d\n",pAssembler->sizeOfF()); }
void thermicSolver::assemble(linearSystem<double> *lsys) { if(pAssembler) delete pAssembler; pAssembler = new dofManager<double>(lsys); // we first do all fixations. the behavior of the dofManager is to // give priority to fixations : when a dof is fixed, it cannot be // numbered afterwards // Dirichlet conditions for(std::size_t i = 0; i < allDirichlet.size(); i++) { FilterDofTrivial filter; FixNodalDofs(*LagSpace, allDirichlet[i].g->begin(), allDirichlet[i].g->end(), *pAssembler, *allDirichlet[i]._f, filter); } // LagrangeMultipliers for(std::size_t i = 0; i < LagrangeMultiplierFields.size(); ++i) { NumberDofs(*LagrangeMultiplierSpace, LagrangeMultiplierFields[i].g->begin(), LagrangeMultiplierFields[i].g->end(), *pAssembler); } // Thermic Fields for(std::size_t i = 0; i < thermicFields.size(); ++i) { NumberDofs(*LagSpace, thermicFields[i].g->begin(), thermicFields[i].g->end(), *pAssembler); } // Neumann conditions GaussQuadrature Integ_Boundary(GaussQuadrature::Val); for(std::size_t i = 0; i < allNeumann.size(); i++) { std::cout << "Neumann BC" << std::endl; LoadTerm<double> Lterm(*LagSpace, allNeumann[i]._f); Assemble(Lterm, *LagSpace, allNeumann[i].g->begin(), allNeumann[i].g->end(), Integ_Boundary, *pAssembler); } // Assemble cross term, laplace term and rhs term for LM GaussQuadrature Integ_LagrangeMult(GaussQuadrature::ValVal); GaussQuadrature Integ_Laplace(GaussQuadrature::GradGrad); for(std::size_t i = 0; i < LagrangeMultiplierFields.size(); i++) { printf("Lagrange Mult Lag\n"); LagrangeMultiplierTerm<double> LagTerm(*LagSpace, *LagrangeMultiplierSpace, 1.); Assemble(LagTerm, *LagSpace, *LagrangeMultiplierSpace, LagrangeMultiplierFields[i].g->begin(), LagrangeMultiplierFields[i].g->end(), Integ_LagrangeMult, *pAssembler); printf("Lagrange Mult Lap\n"); LaplaceTerm<double, double> LapTerm(*LagrangeMultiplierSpace, -LagrangeMultiplierFields[i]._tau); Assemble(LapTerm, *LagrangeMultiplierSpace, LagrangeMultiplierFields[i].g->begin(), LagrangeMultiplierFields[i].g->end(), Integ_Laplace, *pAssembler); printf("Lagrange Mult Load\n"); LoadTermOnBorder<double> Lterm(*LagrangeMultiplierSpace, LagrangeMultiplierFields[i]._f); Assemble(Lterm, *LagrangeMultiplierSpace, LagrangeMultiplierFields[i].g->begin(), LagrangeMultiplierFields[i].g->end(), Integ_Boundary, *pAssembler); } // Assemble thermic term GaussQuadrature Integ_Bulk(GaussQuadrature::ValVal); for(std::size_t i = 0; i < thermicFields.size(); i++) { printf("Thermic Term\n"); LaplaceTerm<double, double> Tterm(*LagSpace, thermicFields[i]._k); Assemble(Tterm, *LagSpace, thermicFields[i].g->begin(), thermicFields[i].g->end(), Integ_Bulk, *pAssembler); } /*for (int i = 0;i<pAssembler->sizeOfR();i++){ for (int j = 0;j<pAssembler->sizeOfR();j++){ double d; lsys->getFromMatrix(i, j, d); printf("%g ", d); } double d; lsys->getFromRightHandSide(i, d); printf(" | %g\n", d); }*/ printf("nDofs=%d\n", pAssembler->sizeOfR()); printf("nFixed=%d\n", pAssembler->sizeOfF()); }