void TPZQuadraticQuad::InsertExampleElement(TPZGeoMesh &gmesh, int matid, TPZVec<REAL> &lowercorner, TPZVec<REAL> &size) { TPZManVector<REAL,3> co(3),shift(3),scale(3); TPZManVector<int64_t,4> nodeindexes(NCornerNodes); for (int i=0; i<3; i++) { scale[i] = size[i]/3.; shift[i] = size[i]/2.+lowercorner[i]; } for (int i=0; i<NCornerNodes; i++) { ParametricDomainNodeCoord(i, co); co.Resize(3,0.); for (int j=0; j<3; j++) { co[j] = shift[j]+scale[j]*co[j]+(rand()*0.2/RAND_MAX)-0.1; } nodeindexes[i] = gmesh.NodeVec().AllocateNewElement(); gmesh.NodeVec()[nodeindexes[i]].Initialize(co, gmesh); } int64_t index; CreateGeoElement(gmesh, EQuadrilateral, nodeindexes, matid, index); TPZGeoEl *gel = gmesh.Element(index); int nsides = gel->NSides(); for (int is=0; is<nsides; is++) { gel->SetSideDefined(is); } gel = TPZChangeEl::ChangeToQuadratic(&gmesh, index); for (int node = gel->NCornerNodes(); node < gel->NNodes(); node++) { TPZManVector<REAL,3> co(3); gel->NodePtr(node)->GetCoordinates(co); for (int i=0; i<3; i++) { co[i] += (0.2*rand())/RAND_MAX - 0.1; } gel->NodePtr(node)->SetCoord(co); } }
void RefinamentoSingular(TPZAutoPointer<TPZGeoMesh> gmesh,int nref) { int64_t nnodes = gmesh->NNodes(); int64_t in; for (in=0; in<nnodes; in++) { TPZGeoNode *gno = &gmesh->NodeVec()[in]; if (abs(gno->Coord(0))< 1.e-6 && abs(gno->Coord(1)) < 1.e-6) { break; } } if (in == nnodes) { DebugStop(); } TPZGeoElSide gelside; int64_t nelem = gmesh->NElements(); for (int64_t el = 0; el<nelem; el++) { TPZGeoEl *gel = gmesh->ElementVec()[el]; int ncorner = gel->NCornerNodes(); for (int ic=0; ic<ncorner; ic++) { int64_t nodeindex = gel->NodeIndex(ic); if (nodeindex == in) { gelside = TPZGeoElSide(gel, ic); break; } } if (gelside.Element()) { break; } } if (!gelside.Element()) { DebugStop(); } for (int iref = 0; iref <nref; iref++) { TPZStack<TPZGeoElSide> gelstack; gelstack.Push(gelside); TPZGeoElSide neighbour = gelside.Neighbour(); while (neighbour != gelside) { gelstack.Push(neighbour); neighbour = neighbour.Neighbour(); } int64_t nstack = gelstack.size(); for (int64_t ist=0; ist < nstack; ist++) { if (!gelstack[ist].Element()->HasSubElement()) { TPZVec<TPZGeoEl *> subel; gelstack[ist].Element()->Divide(subel); } } } }
REAL TPZAnalysisError::h_Parameter(TPZCompEl *cel) { REAL h = 0.,cicjdist; TPZGeoEl *gel = cel->Reference(); int nconn = gel->NCornerNodes(); for(int conni=0;conni<nconn;conni++) { for(int connj=conni;connj<nconn;connj++) { cicjdist = 0.; for(int coordi=0;coordi<3;coordi++) { REAL coor1 = gel->NodePtr(conni)->Coord(coordi); REAL coor2 = gel->NodePtr(connj)->Coord(coordi); cicjdist += pow( coor1 - coor2, (REAL)2.0); } cicjdist = sqrt(cicjdist); if(h < cicjdist) h = cicjdist; } } return h; }
/// Generate a boundary geometric element at the indicated node void SetPointBC(TPZGeoMesh *gr, TPZVec<REAL> &x, int bc) { // look for an element/corner node whose distance is close to start TPZGeoNode *gn1 = gr->FindNode(x); int iel; int nelem = gr->ElementVec().NElements(); TPZGeoEl *gel; for (iel = 0; iel<nelem; iel++) { gel = gr->ElementVec()[iel]; if(!gel) continue; int nc = gel->NCornerNodes(); int c; for (c=0; c<nc; c++) { TPZGeoNode *gn = gel->NodePtr(c); if (gn == gn1) { break; } } if (c<nc) { TPZGeoElBC(gel, c, bc); return; } } }
/// Merge lines which are parallel void TPZFracSet::MergeParallelLines() { int64_t nel = fgmesh.NElements(); REAL maxcos = 0.; for (int64_t el = 0; el<nel; el++) { TPZGeoEl *gel = fgmesh.Element(el); if(!gel) continue; TPZManVector<REAL,3> dir1(3); Direction(gel, dir1); int nnodes = gel->NCornerNodes(); for(int is = 0; is<nnodes; is++) { TPZGeoElSide gelside(gel,is); TPZGeoElSide neighbour = gelside.Neighbour(); while (neighbour != gelside) { TPZManVector<REAL,3> dir2(3); Direction(neighbour.Element(), dir2); if (neighbour.Side() != is) { for (int i=0; i<3; i++) { dir2[i] *= -1.; } } REAL cosangle = 0.; for (int i=0; i<3; i++) { cosangle += dir1[i]*dir2[i]; } if (cosangle> maxcos) { maxcos = cosangle; } if (cosangle > 0.99) { std::cout << "Fractures " << gel->Index() << " and " << neighbour.Element()->Index() << " are parallel " << cosangle << "\n"; std::cout << "Index " << gel->NodeIndex(0) << " "; gel->Node(0).Print(); std::cout << "Index " << gel->NodeIndex(1) << " "; gel->Node(1).Print(); std::cout << "Index " << neighbour.Element()->NodeIndex(0) << " "; neighbour.Element()->Node(0).Print(); std::cout << "Index " << neighbour.Element()->NodeIndex(1) << " "; neighbour.Element()->Node(1).Print(); REAL l1 = Length(gel); REAL l2 = Length(neighbour.Element()); if (l1 < l2) { gel->RemoveConnectivities(); delete gel; fgmesh.ElementVec()[el] = 0; gel = 0; break; } else { neighbour.Element()->RemoveConnectivities(); int64_t neighindex = neighbour.Element()->Index(); delete neighbour.Element(); fgmesh.ElementVec()[neighindex] = 0; neighbour = gelside; } } neighbour = neighbour.Neighbour(); } if(!gel) break; } } std::cout << "max cosine angle " << maxcos << std::endl; }