ibgosplit.cxx

来自「有限元学习研究用源代码(老外的),供科研人员参考」· CXX 代码 · 共 123 行

CXX
123
字号
#include "ibgoctree.hxx"

/* basic splitting functions (pure splitting, correct data structures
 * before and after splitting, no refinement strategies)

ibgiCell ibgOctree3D::splitCell(ibgiCell qq, unsigned ro);
ibgIndex ibgOctree::splitBoundaryLine(ibgIndex nu, ibgIndex dir, ibgIndex nh);

 */

ibgIndex ibgOctree::splitBoundaryLine(ibgiNode nu, ibgIndex dir, ibgiNode nh)
{
  ibgIndex i,lo,lu,bnh,bnu;
  wzInteger ff,fo;
  nBoundary[nh] = 0;
  bnu = nBoundary[nu]; 
  if(bnu==0)	{return 0;}
  lo = bnUp[dir][bnu];	
  if(lo==0)	{return 0;}
  bnh = createSimpleBoundaryNode(nh);
  lu  = bnUp[dir][bnu] = bnDown[dir][bnh] = lines.create();
  bnUp[dir][bnh]= lo;
  lNodeDown[lo] = bnh;
  lNodeDown[lu] = bnu;
  lNodeUp[lu]   = bnh;
  lType[lu] = lType[lo];
  for(i=0;i<LineSides;i++) lPlane[i][lu]  = lPlane[i][lo];
// does not split planes!!
  lFaceUp[lu] = lFaceDown[lu] = 0;
  ff = lFaceDown[lo];
  if(ff && fPoint[ff][dir]<nPoint[nh][dir]){
    lFaceDown[lu] = ff; fLine[ff] = lu; fo = ff; 
    while((ff = -fUp[fo])>0){
      if(fPoint[ff][dir]>=nPoint[nh][dir]){
	fDown[ff] = fUp[fo] = 0;
	break;
      }
      fLine[ff] = lu; fo = ff;
    }
    lFaceUp[lu] = fo; 
    if(ff<0)  lFaceDown[lo] = 0;
    else      lFaceDown[lo] = ff;
    if(ff==0) lFaceUp[lo] = 0;
    //    wzAssert(fPointUp[fo].segment() == nPoint[nh].segment());
  }else{
    //    wzAssert(nPoint[nh].segment() == nPoint[nu].segment());
  }
  return lu;
}

ibgiCell ibgOctree3D::splitCell(ibgiCell qq, unsigned ro)
{
  int nu,no,nh,n0,n1,n2,n3,nr,nl,nur,nhr,nor,nurr,nt;
  int ou,oo,oh;
  int qn,o,w,eo,eu,fo,fu,go,gu;
  int rr,ru=Other(ro);
  
  if(is_undefined(qq)) return 0;
  nu = cNode[(lsCell[ru][3])][qq];  no = cNode[(int)lsCell[ro][3]][qq];
  for(o=0;o<LineSides;o++){
    ou = nu; nu = cNode[lsCell[ru][o]][qq];
    oo = no; no = cNode[lsCell[ro][o]][qq];
    if(no==nNext[ro][nu])	return 0;
    wzAssert(no==nNext[ro][nNext[ro][nu]]);
    if((nor=nNext[lsLine[ro][o]][oo])==no) continue;
    wzAssert(no==nNext[lsLine[ro][o]][nor]);
    if((nur=nNext[lsLine[ru][o]][ou])==nu) continue;
    wzAssert(nu==nNext[lsLine[ro][o]][nur]);
    if(nor==nNext[ro][nur])	return 0;
    wzAssert(is_undefined(nt=nNext[ro][nur])||nor==nNext[ro][nt]);
  }
  
  qn = cells.create();
  cBoundary[qn]=0;
  eu = lsCell[ru][3]; eo = lsCell[ro][3];
  nu = cNode[eu][qq]; nh = nNext[ro][nu]; wzAssert(is_defined(nh));
  no = cNode[eo][qq]; wzAssert(nNext[ro][nh] == no);
  fu = cReverse[eo]; fo = cReverse[eu];
  for(o=0;o<LineSides;o++){
    ou = nu; gu = fu; oh = nh; go = fo;
    eu = lsCell[ru][o];  eo = lsCell[ro][o];
    fu = cReverse[eo]; fo = cReverse[eu];
    nu = cNode[eu][qq];  nh = nNext[ro][nu]; wzAssert(is_defined(nh));
    no = cNode[eo][qq];  wzAssert(nNext[ro][nh] == no);
    cNode[eu][qn] = nu;  cNode[eo][qn] = nh; cNode[eu][qq] = nh;
    nCell[fo][nu] = qn;  nCell[fu][nh] = qn; wzAssert(nCell[fo][nh]==qq);
    rr = lsLine[ru][o];
    if((nhr=nNext[rr][oh])!=nh) {
      wzAssert(is_defined(nhr));
      wzAssert(nNext[rr][nhr]==nh);
      nCell[fu][nhr]=qn; nCell[gu][nhr]=qn;
    }
    if((nur=nNext[rr][ou])!=nu) {
      nCell[fo][nur]=qn; nCell[go][nur]=qn;
      if(o>1)continue;
      if(is_undefined(nurr=nNext[lsLine[ru][o+1]][nur])) continue;
      for(w=0;w<LineSides;w++){
	if(nCell[lsCell[ro][w]][nurr]==qq)
	  nCell[lsCell[ro][w]][nurr]= qn;
      }
    }
  }
  n0 = cNode[lsCell[ru][0]][qq];
  n1 = cNode[lsCell[ru][1]][qq];
  n2 = cNode[lsCell[ru][2]][qq];
  n3 = cNode[lsCell[ru][3]][qq];
  if(n1==(nr=nNext[lsLine[ru][1]][n0])){
    if(n2==(nr=nNext[lsLine[ru][2]][n1])) return qn;
    if(n0==(nl=nNext[lsLine[ru][0]][n3])) return qn;
    nNext[lsLine[ru][3]][nr] = nl;
    nNext[lsLine[ru][1]][nl] = nr;
  }else if(n3==(nl=nNext[lsLine[ru][3]][n2])){
    if(n2==(nr=nNext[lsLine[ru][2]][n1])) return qn;
    if(n0==(nl=nNext[lsLine[ru][0]][n3])) return qn;
    nNext[lsLine[ru][3]][nr] = nl;
    nNext[lsLine[ru][1]][nl] = nr;
  }else  {
    nNext[lsLine[ru][2]][nr] = nl;
    nNext[lsLine[ru][0]][nl] = nr;
  }
  return qn;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?