Exemple #1
0
Z I dr(A a,I f)
{
  XA;
  A z,*ap=(A*)a->p,w;
  if(!an||at!=Et||fsy(a))R ic(a); /* ic_or_copy(a) */
  w=*ap;
  Q(QF(w),9);
  if(!ar)R ic(w);  /* ic_or_copy(w) */
  {
    XW;
    I i=an,n=0,t;
    C *p;
    if(f){Q(ar>1,7)V0 n=*wd;}
    else{Q(ar+wr>MAXR,13)mv(ad+ar,wd,wr);}
    for(;--i;)
    {
      Q(!QA(a=ap[i])||(t=a->t)>Et,9);
      if(wt!=t&&a->n)
	if(f&&!n)wt=t;
	else{Q(wt>Ft||t>Ft,6)wt=Ft;}
      if(wr!=a->r){Q(!f||wr>1||a->r,7)*a->d=1;}
      Q(cm(wd+f,a->d+f,wr-f),11);
      if(f)n+=*a->d;
    }
    W(ga(wt,f?wr:ar+wr,f?n*tr(wr-1,wd+1):an*wn,f?wd:ad));
    if(f)*z->d=n;
    p=(C*)z->p;
    DO(an,a=ap[i];
       p=(*(a->t==wt?(C *(*)(I,F *,I *,I))tmv:i2f))(wt,(F *)p,a->p,a->n));
    R(I)z;
  }
}
//---------------------------------------------------------
void NDG3D::Normals3D()
//---------------------------------------------------------
{
  // function [nx, ny, nz, sJ] = Normals3D()
  // Purpose : Compute outward pointing normals at
  //	    elements faces as well as surface Jacobians

  GeometricFactors3D();

  // interpolate geometric factors to face nodes
  DMat frx=rx(Fmask,All),  fsx=sx(Fmask,All),  ftx=tx(Fmask,All);
  DMat fry=ry(Fmask,All),  fsy=sy(Fmask,All),  fty=ty(Fmask,All);
  DMat frz=rz(Fmask,All),  fsz=sz(Fmask,All),  ftz=tz(Fmask,All);

  // build normals
  nx.resize(4*Nfp, K); ny.resize(4*Nfp, K); nz.resize(4*Nfp, K);
  Index1D fid1(1,Nfp), fid2(Nfp+1,2*Nfp), fid3(2*Nfp+1,3*Nfp), fid4(3*Nfp+1,4*Nfp);

  // face 1
  nx(fid1, All) = -ftx(fid1,All);
  ny(fid1, All) = -fty(fid1,All);
  nz(fid1, All) = -ftz(fid1,All);

  // face 2
  nx(fid2, All) = -fsx(fid2,All);
  ny(fid2, All) = -fsy(fid2,All);
  nz(fid2, All) = -fsz(fid2,All);

  // face 3
  nx(fid3, All) = frx(fid3,All) + fsx(fid3,All) + ftx(fid3,All);
  ny(fid3, All) = fry(fid3,All) + fsy(fid3,All) + fty(fid3,All);
  nz(fid3, All) = frz(fid3,All) + fsz(fid3,All) + ftz(fid3,All);

  // face 4
  nx(fid4, All) = -frx(fid4,All);
  ny(fid4, All) = -fry(fid4,All);
  nz(fid4, All) = -frz(fid4,All);

  // normalise
  sJ = sqrt(sqr(nx) + sqr(ny) + sqr(nz));
  
  nx.div_element(sJ); ny.div_element(sJ); nz.div_element(sJ);
  sJ.mult_element(J(Fmask, All));  //sJ=sJ.*J(Fmask(:),:);
}
Exemple #3
0
Z void rake_2p(A a,A z){if(QF(a)||Et!=a->t||fsy(a)&&a->n)
{z->p[z->n++]=QA(a)?ic(a):(I)a;R;}if(!a->n)R;DO(a->n,rake_2p((A)a->p[i],z));R;}
Exemple #4
0
Z I rake_1p(A a,I cd,I *pd){I z=0;if(QF(a)||Et!=a->t||fsy(a)&&a->n)R 1;
if(!a->n)R 0;if(cd>=*pd)*pd=cd+1;DO(a->n,z+=rake_1p((A)a->p[i],cd+1,pd));R z;}