double elasticitySolver::computeDisplacementError(simpleFunction<double> *f0, simpleFunction<double> *f1, simpleFunction<double> *f2) { std::cout << "compute displacement error" << std::endl; double err = 0.; std::set<MVertex *> v; std::map<MVertex *, MElement *> vCut; for(std::size_t i = 0; i < elasticFields.size(); ++i) { if(elasticFields[i]._e == 0.) continue; for(groupOfElements::elementContainer::const_iterator it = elasticFields[i].g->begin(); it != elasticFields[i].g->end(); ++it) { MElement *e = *it; if(e->getParent()) { for(std::size_t j = 0; j < e->getNumVertices(); ++j) { if(vCut.find(e->getVertex(j)) == vCut.end()) vCut[e->getVertex(j)] = e->getParent(); } } else { for(std::size_t j = 0; j < e->getNumVertices(); ++j) v.insert(e->getVertex(j)); } } } SolverField<SVector3> Field(pAssembler, LagSpace); for(std::set<MVertex *>::iterator it = v.begin(); it != v.end(); ++it) { SVector3 val; MPoint p(*it); Field.f(&p, 0, 0, 0, val); SVector3 sol((*f0)((*it)->x(), (*it)->y(), (*it)->z()), (*f1)((*it)->x(), (*it)->y(), (*it)->z()), (*f2)((*it)->x(), (*it)->y(), (*it)->z())); double diff = normSq(sol - val); err += diff; } for(std::map<MVertex *, MElement *>::iterator it = vCut.begin(); it != vCut.end(); ++it) { SVector3 val; double uvw[3]; double xyz[3] = {it->first->x(), it->first->y(), it->first->z()}; it->second->xyz2uvw(xyz, uvw); Field.f(it->second, uvw[0], uvw[1], uvw[2], val); SVector3 sol((*f0)(xyz[0], xyz[1], xyz[2]), (*f1)(xyz[0], xyz[1], xyz[2]), (*f2)(xyz[0], xyz[1], xyz[2])); double diff = normSq(sol - val); err += diff; } printf("Displacement Error = %g\n", sqrt(err)); return sqrt(err); }
PView *elasticitySolver::buildDisplacementView(const std::string postFileName) { std::cout << "build Displacement View" << std::endl; std::set<MVertex *> v; std::map<MVertex *, MElement *> vCut; for(std::size_t i = 0; i < elasticFields.size(); ++i) { if(elasticFields[i]._e == 0.) continue; for(groupOfElements::elementContainer::const_iterator it = elasticFields[i].g->begin(); it != elasticFields[i].g->end(); ++it) { MElement *e = *it; if(e->getParent()) { for(std::size_t j = 0; j < e->getNumVertices(); ++j) { if(vCut.find(e->getVertex(j)) == vCut.end()) vCut[e->getVertex(j)] = e->getParent(); } } else { for(std::size_t j = 0; j < e->getNumVertices(); ++j) v.insert(e->getVertex(j)); } } } std::map<int, std::vector<double> > data; SolverField<SVector3> Field(pAssembler, LagSpace); for(std::set<MVertex *>::iterator it = v.begin(); it != v.end(); ++it) { SVector3 val; MPoint p(*it); Field.f(&p, 0, 0, 0, val); std::vector<double> vec(3); vec[0] = val(0); vec[1] = val(1); vec[2] = val(2); data[(*it)->getNum()] = vec; } for(std::map<MVertex *, MElement *>::iterator it = vCut.begin(); it != vCut.end(); ++it) { SVector3 val; double uvw[3]; double xyz[3] = {it->first->x(), it->first->y(), it->first->z()}; it->second->xyz2uvw(xyz, uvw); Field.f(it->second, uvw[0], uvw[1], uvw[2], val); std::vector<double> vec(3); vec[0] = val(0); vec[1] = val(1); vec[2] = val(2); data[it->first->getNum()] = vec; } PView *pv = new PView(postFileName, "NodeData", pModel, data, 0.0); return pv; }
PView *thermicSolver::buildTemperatureView(const std::string postFileName) { std::cout << "build Temperature View" << std::endl; std::set<MVertex *> v; std::map<MVertex *, MElement *> vCut; for(std::size_t i = 0; i < thermicFields.size(); ++i) { for(groupOfElements::elementContainer::const_iterator it = thermicFields[i].g->begin(); it != thermicFields[i].g->end(); ++it) { MElement *e = *it; if(e->getParent()) { for(std::size_t j = 0; j < e->getNumVertices(); ++j) { if(vCut.find(e->getVertex(j)) == vCut.end()) vCut[e->getVertex(j)] = e->getParent(); } } else { for(std::size_t j = 0; j < e->getNumVertices(); ++j) v.insert(e->getVertex(j)); } } } std::map<int, std::vector<double> > data; SolverField<double> Field(pAssembler, LagSpace); for(std::set<MVertex *>::iterator it = v.begin(); it != v.end(); ++it) { double val; MPoint p(*it); Field.f(&p, 0, 0, 0, val); // printf("valv=%g\n",val); std::vector<double> vec; vec.push_back(val); data[(*it)->getNum()] = vec; } for(std::map<MVertex *, MElement *>::iterator it = vCut.begin(); it != vCut.end(); ++it) { double val; double uvw[3]; double xyz[3] = {it->first->x(), it->first->y(), it->first->z()}; it->second->xyz2uvw(xyz, uvw); Field.f(it->second, uvw[0], uvw[1], uvw[2], val); // printf("valvc=%g\n",val); std::vector<double> vec; vec.push_back(val); data[it->first->getNum()] = vec; } PView *pv = new PView(postFileName, "NodeData", pModel, data, 0.0, 1); return pv; }
double thermicSolver::computeLagNorm(int tag, simpleFunction<double> *sol) { double val = 0.0, val2 = 0.0; SolverField<double> solField(pAssembler, LagrangeMultiplierSpace); for(std::size_t i = 0; i < LagrangeMultiplierFields.size(); ++i) { if(tag != LagrangeMultiplierFields[i]._tag) continue; for(groupOfElements::elementContainer::const_iterator it = LagrangeMultiplierFields[i].g->begin(); it != LagrangeMultiplierFields[i].g->end(); ++it) { MElement *e = *it; // printf("element (%g,%g) // (%g,%g)\n",e->getVertex(0)->x(),e->getVertex(0)->y(),e->getVertex(1)->x(),e->getVertex(1)->y()); int npts; IntPt *GP; double jac[3][3]; int integrationOrder = 2 * (e->getPolynomialOrder() + 1); e->getIntegrationPoints(integrationOrder, &npts, &GP); for(int j = 0; j < npts; j++) { double u = GP[j].pt[0]; double v = GP[j].pt[1]; double w = GP[j].pt[2]; double weight = GP[j].weight; double detJ = fabs(e->getJacobian(u, v, w, jac)); SPoint3 p; e->getParent()->pnt(u, v, w, p); double FEMVALUE; solField.f(e, u, v, w, FEMVALUE); double diff = (*sol)(p.x(), p.y(), p.z()) - FEMVALUE; val += diff * diff * detJ * weight; val2 += (*sol)(p.x(), p.y(), p.z()) * (*sol)(p.x(), p.y(), p.z()) * detJ * weight; // printf("(%g %g) : u,v=(%g,%g) detJ=%g we=%g FV=%g sol=%g // diff=%g\n",p.x(),p.y(),u,v,detJ,weight,FEMVALUE,(*sol)(p.x(), p.y(), // p.z()),diff); } } } printf("LagNorm = %g\n", sqrt(val / val2)); return sqrt(val / val2); }