/// Generates the background mesh and computes displacements of its nodes using linear elasticity void DGhybrid::generate_backmesh_and_compute_displacements() { // make a list of interior points of the quadratic mesh int ip, ipoin, ib, ilp, idim, ninpoin_q = 0, k = 0, j; for(ipoin = 0; ipoin < mq->gnpoin(); ipoin++) ninpoin_q += bounflag_q[ipoin]; ninpoin_q = mq->gnpoin() - ninpoin_q; inpoints_q.setup(ninpoin_q, mq->gndim()); k = 0; for(ipoin = 0; ipoin < mq->gnpoin(); ipoin++) if(!bounflag_q[ipoin]) { for(idim = 0; idim < mq->gndim(); idim++) inpoints_q(k,idim) = mq->gcoords(ipoin,idim); k++; } std::cout << "DGhybrid: generate_backmesh_and_compute_displacements(): No. of interior points to move = " << inpoints_q.rows() << std::endl; // setup DGM and get backmesh dgm.setup(mq->gndim(), &inpoints_q, &backpoints, &motion_b); dgm.generateDG(); bm = dgm.getDelaunayGraph(); std::cout << "DGhybrid: Back mesh has " << bm.gnpoin() << " points, " << bm.gnelem() << " elements." << std::endl; bm.writeGmsh2("testdg.msh"); // prepare input for linear elasticity problem motion_b.setup(nbackp,m->gndim()); motion_b.zeros(); // cflags contains 1 if the corresponding backmesh point has a Dirichlet BC std::vector<int> cflags(nbackp,0); // get displacements of the boundary points of the quadratic mesh k = 0; for(ip = 0; ip < mq->gnpoin(); ip++) { if(bounflag_q[ip] == 1) { for(idim = 0; idim < mq->gndim(); idim++) { motion_b(k, idim) = b_motion_q->get(ip,idim); cflags[k] = 1; } k++; } } // setup and solve the elasticity equations to get displacement of the background mesh std::cout << "Starting linelast" << std::endl; linm.setup(&bm, lambda, mu); linm.assembleStiffnessMatrix(); linm.assembleLoadVector(); linm.dirichletBC_points(cflags, motion_b); amat::SpMatrix A = linm.stiffnessMatrix(); amat::Matrix<double> b = linm.loadVector(); amat::Matrix<double> xb(2*nbackp,1); amat::Matrix<double> x(2*nbackp,1); xb.zeros(); // TODO: add a switch to change solver x = sparseCG_d(&A, b, xb, tol, maxiter); for(int i = 0; i < nbackp; i++) for(idim = 0; idim < mq->gndim(); idim++) motion_b(i, idim) = x.get(i+idim*nbackp); }