Example #1
0
/*!
  @a in is a vector (dim, 1).

  @par Revision history:
  - 06.09.2006, c
*/
int32 bf_actt_c1( FMField *out, FMField *bf, FMField *in )
{
  int32 iqp, ir, ic, nEP, nQP, dim;
  float64 *pout, *pbf, *pin;

  nEP = bf->nCol;
  nQP = bf->nLev;
  dim = in->nRow;

#ifdef DEBUG_FMF
  if ((out->nRow != dim * nEP) || (out->nCol != 1) || (out->nLev != in->nLev)
      || (out->nLev != bf->nLev) || (in->nRow != dim) || (in->nCol != 1)) {
    errput( ErrHead "ERR_BadMatch: (%d %d %d), (%d %d %d), (%d %d %d)\n",
	    out->nLev, out->nRow, out->nCol,
	    bf->nLev, bf->nRow, bf->nCol,
	    in->nLev, in->nRow, in->nCol );
  }
#endif

  for (iqp = 0; iqp < nQP; iqp++) {
    pbf = FMF_PtrLevel( bf, iqp );
    pout = FMF_PtrLevel( out, iqp );
    pin = FMF_PtrLevel( in, iqp );

    for (ic = 0; ic < dim; ic++ ) {
      for (ir = 0; ir < nEP; ir++) {
	pout[nEP*ic+ir] = pbf[ir] * pin[ic];
      }
    }
  }

  return( RET_OK );
}
Example #2
0
/*!
  @par Revision history:
  - 21.11.2006, c
*/
int32 bf_buildFTF( FMField *ftf, FMField *ftf1 )
{
  int32 iqp, ir, ic, nEPR, nEPC, nQP, dim;
  float64 *pftf, *pftf1;
  float64 val;

  fmf_fillC( ftf, 0.0 );

  nEPR = ftf1->nRow;
  nEPC = ftf1->nCol;
  nQP = ftf1->nLev;
  dim = ftf->nRow / nEPR;

  for (iqp = 0; iqp < nQP; iqp++) {
    pftf1 = FMF_PtrLevel( ftf1, iqp );
    pftf = FMF_PtrLevel( ftf, iqp );
    for (ir = 0; ir < nEPR; ir++) {
      for (ic = 0; ic < nEPC; ic++) {
	val = pftf1[nEPC*ir+ic];

	pftf[dim*nEPC*ir+ic] = val;
	if (dim == 1) continue;
	pftf[dim*nEPC*(nEPR+ir)+ic+nEPC] = val;
	if (dim == 2) continue;
	pftf[dim*nEPC*(2*nEPR+ir)+ic+2*nEPC] = val;
      }
    }
  }

  return( RET_OK );
}
Example #3
0
/*!
  @par Revision history:
  - 13.11.2001, c
  - 06.03.2003, adopted from rcfem2
*/
int32 geme_tensor2vectorS3( FMField *vec, FMField *mtx )
{
  int32 il, dim;
  float64 *pmtx, *pvec;
  
  dim = mtx->nRow;
  for (il = 0; il < mtx->nLev; il++) {
    pvec = FMF_PtrLevel( vec, il );
    pmtx = FMF_PtrLevel( mtx, il );
    switch (dim) {
    case 1:
      pvec[0] = pmtx[0];
      break;
    case 2:
      pvec[0] = pmtx[0];
      pvec[1] = pmtx[3];
      pvec[2] = pmtx[1];
      break;
    case 3:
      pvec[0] = pmtx[0];
      pvec[1] = pmtx[4];
      pvec[2] = pmtx[8];
      pvec[3] = pmtx[1];
      pvec[4] = pmtx[2];
      pvec[5] = pmtx[5];
      break;
    default:
      errput( ErrHead "ERR_Switch\n" );
    }
  }

  return( RET_OK );
}
Example #4
0
int32 geme_invert4x4( FMField *mtxI, FMField *mtx )
{
  int32 ii, il;
  float64 det, buf[16];
  float64 *pm, *pi;

  for (il = 0; il < mtx->nLev; il++) {
    pm = FMF_PtrLevel( mtx, il );
    pi = FMF_PtrLevel( mtxI, il );

    buf[0] = pm[5]*pm[10]*pm[15] - pm[5]*pm[11]*pm[14] - pm[9]*pm[6]*pm[15]
      + pm[9]*pm[7]*pm[14] + pm[13]*pm[6]*pm[11] - pm[13]*pm[7]*pm[10];
    buf[4] = -pm[4]*pm[10]*pm[15] + pm[4]*pm[11]*pm[14] + pm[8]*pm[6]*pm[15]
      - pm[8]*pm[7]*pm[14] - pm[12]*pm[6]*pm[11] + pm[12]*pm[7]*pm[10];
    buf[8] = pm[4]*pm[9]*pm[15] - pm[4]*pm[11]*pm[13] - pm[8]*pm[5]*pm[15]
      + pm[8]*pm[7]*pm[13] + pm[12]*pm[5]*pm[11] - pm[12]*pm[7]*pm[9];
    buf[12] = -pm[4]*pm[9]*pm[14] + pm[4]*pm[10]*pm[13] + pm[8]*pm[5]*pm[14]
      - pm[8]*pm[6]*pm[13] - pm[12]*pm[5]*pm[10] + pm[12]*pm[6]*pm[9];
    buf[1] = -pm[1]*pm[10]*pm[15] + pm[1]*pm[11]*pm[14] + pm[9]*pm[2]*pm[15]
      - pm[9]*pm[3]*pm[14] - pm[13]*pm[2]*pm[11] + pm[13]*pm[3]*pm[10];
    buf[5] = pm[0]*pm[10]*pm[15] - pm[0]*pm[11]*pm[14] - pm[8]*pm[2]*pm[15]
      + pm[8]*pm[3]*pm[14] + pm[12]*pm[2]*pm[11] - pm[12]*pm[3]*pm[10];
    buf[9] = -pm[0]*pm[9]*pm[15] + pm[0]*pm[11]*pm[13] + pm[8]*pm[1]*pm[15]
      - pm[8]*pm[3]*pm[13] - pm[12]*pm[1]*pm[11] + pm[12]*pm[3]*pm[9];
    buf[13] = pm[0]*pm[9]*pm[14] - pm[0]*pm[10]*pm[13] - pm[8]*pm[1]*pm[14]
      + pm[8]*pm[2]*pm[13] + pm[12]*pm[1]*pm[10] - pm[12]*pm[2]*pm[9];
    buf[2] = pm[1]*pm[6]*pm[15] - pm[1]*pm[7]*pm[14] - pm[5]*pm[2]*pm[15]
      + pm[5]*pm[3]*pm[14] + pm[13]*pm[2]*pm[7] - pm[13]*pm[3]*pm[6];
    buf[6] = -pm[0]*pm[6]*pm[15] + pm[0]*pm[7]*pm[14] + pm[4]*pm[2]*pm[15]
      - pm[4]*pm[3]*pm[14] - pm[12]*pm[2]*pm[7] + pm[12]*pm[3]*pm[6];
    buf[10] = pm[0]*pm[5]*pm[15] - pm[0]*pm[7]*pm[13] - pm[4]*pm[1]*pm[15]
      + pm[4]*pm[3]*pm[13] + pm[12]*pm[1]*pm[7] - pm[12]*pm[3]*pm[5];
    buf[14] = -pm[0]*pm[5]*pm[14] + pm[0]*pm[6]*pm[13] + pm[4]*pm[1]*pm[14]
      - pm[4]*pm[2]*pm[13] - pm[12]*pm[1]*pm[6] + pm[12]*pm[2]*pm[5];
    buf[3] = -pm[1]*pm[6]*pm[11] + pm[1]*pm[7]*pm[10] + pm[5]*pm[2]*pm[11]
      - pm[5]*pm[3]*pm[10] - pm[9]*pm[2]*pm[7] + pm[9]*pm[3]*pm[6];
    buf[7] = pm[0]*pm[6]*pm[11] - pm[0]*pm[7]*pm[10] - pm[4]*pm[2]*pm[11]
      + pm[4]*pm[3]*pm[10] + pm[8]*pm[2]*pm[7] - pm[8]*pm[3]*pm[6];
    buf[11] = -pm[0]*pm[5]*pm[11] + pm[0]*pm[7]*pm[9] + pm[4]*pm[1]*pm[11]
      - pm[4]*pm[3]*pm[9] - pm[8]*pm[1]*pm[7] + pm[8]*pm[3]*pm[5];
    buf[15] = pm[0]*pm[5]*pm[10] - pm[0]*pm[6]*pm[9] - pm[4]*pm[1]*pm[10]
      + pm[4]*pm[2]*pm[9] + pm[8]*pm[1]*pm[6] - pm[8]*pm[2]*pm[5];

    det = pm[0]*buf[0] + pm[1]*buf[4] + pm[2]*buf[8] + pm[3]*buf[12];
    if (fabs(det) == 1e-16) {
      errput("singular matrix!\n");
    }
    det = 1.0 / det;

    for (ii = 0; ii < 16; ii++) {
      pi[ii] = buf[ii] * det;
    }
  }

  return( RET_OK );
}
Example #5
0
/*!
  @par Revision history:
  - 28.11.2005, c
  - 30.05.2007
*/
int32 laplace_build_gtg( FMField *out, FMField *gc )
{
  int32 iqp, ir, ic, nEP, nQP, nCol;
  float64 *pout, *pg1, *pg2, *pg3;

  nEP = gc->nCol;
  nQP = gc->nLev;
  nCol = out->nCol;

  fmf_fillC( out, 0.0 );
  switch (gc->nRow) {
  case 3:
    for (iqp = 0; iqp < nQP; iqp++) {
      pg1 = FMF_PtrLevel( gc, iqp );
      pg2 = pg1 + nEP;
      pg3 = pg2 + nEP;

      pout = FMF_PtrLevel( out, iqp );

      for (ir = 0; ir < nEP; ir++) {
	for (ic = 0; ic < nEP; ic++) {
	  pout[ic] = pg1[ir] * pg1[ic] + pg2[ir] * pg2[ic] + pg3[ir] * pg3[ic];
	}
	pout += nCol;
      }
    }
    break;
    
  case 2:
    for (iqp = 0; iqp < nQP; iqp++) {
      pg1 = FMF_PtrLevel( gc, iqp );
      pg2 = pg1 + nEP;

      pout = FMF_PtrLevel( out, iqp );

      for (ir = 0; ir < nEP; ir++) {
	for (ic = 0; ic < nEP; ic++) {
	  pout[ic] = pg1[ir] * pg1[ic] + pg2[ir] * pg2[ic];
	}
	pout += nCol;
      }
    }
    break;
    
  default:
    errput( ErrHead "ERR_Switch\n" );
    return( RET_Fail );
  }    
  return( RET_OK );
}
Example #6
0
/*!
  @par Revision history:
  - 14.11.2001, c
  - 06.03.2003, adopted from rcfem2
*/
int32 geme_mulT2ST2S_T4S_iljk( FMField *t4, FMField *t21, FMField *t22 )
{
  int32 iqp, ir, ic, ii, ij, ik, il, s1, s2;
  int32 sym = t4->nRow, dim;
  float64 *pt4, *pt21, *pt22;
  int32 *t2i = 0, *t2j = 0, *t4s = 0;

  dim = sym2dim( sym );

  switch (dim) {
  case 1:
    t2i = t2i1D;
    t2j = t2j1D;
    t4s = t4s1D;
    break;
  case 2:
    t2i = t2i2D;
    t2j = t2j2D;
    t4s = t4s2D;
    break;
  case 3:
    t2i = t2i3D;
    t2j = t2j3D;
    t4s = t4s3D;
    break;
  default:
    errput( ErrHead "ERR_Switch\n" );
  }

  for (iqp = 0; iqp < t4->nLev; iqp++) {
    pt4 = FMF_PtrLevel( t4, iqp );
    pt21 = FMF_PtrLevel( t21, iqp );
    pt22 = FMF_PtrLevel( t22, iqp );
    for (ir = 0; ir < sym; ir++) {
      for (ic = 0; ic < sym; ic++) {
	ii = t2i[ir];
	ij = t2j[ir];
	ik = t2i[ic];
	il = t2j[ic];
	s1 = t4s[dim*ii+il];
	s2 = t4s[dim*ij+ik];
	pt4[sym*ir+ic] = pt21[s1] * pt22[s2];
      }
    }
  }

  return( RET_OK );
}
Example #7
0
/*!
  R = A B, A is upper triangle stored as vector, for dim <= 3.
  e.g. \sigma n == \sigma^T n, \sigma stored as vector (sym).

  @par Revision history:
  - 06.09.2006, c
*/
int32 geme_mulAVSB3( FMField *out, FMField *vs, FMField *in )
{
  int32 iqp, ir, ic, ii, dim, sym, nQP, nc;
  int32 _is[] = {0, 0, 0, 0, 0, 0, 0, 0, 0,
		 0, 2, 2, 1, 0, 0, 0, 0, 0,
		 0, 3, 4, 3, 1, 5, 4, 5, 2};
  int32 *is;
  float64 *pout, *pvs, *pin;

  sym = vs->nRow;
  nQP = vs->nLev;
  dim = in->nRow;
  nc = out->nCol;

#ifdef DEBUG_FMF
  if ((sym != (dim * (dim + 1) / 2)) || (out->nLev != in->nLev)
      || (vs->nCol != 1) || (out->nLev != vs->nLev) || (nc != in->nCol)
      || (dim != out->nRow)) {
    errput( ErrHead "ERR_BadMatch: (%d %d %d), (%d %d %d), (%d %d %d)\n",
	    out->nLev, out->nRow, out->nCol,
	    vs->nLev, vs->nRow, vs->nCol,
	    in->nLev, in->nRow, in->nCol );
  }
#endif

  is = _is + 9 * (dim - 1);

  for (iqp = 0; iqp < nQP; iqp++) {
    pvs = FMF_PtrLevel( vs, iqp );
    pout = FMF_PtrLevel( out, iqp );
    pin = FMF_PtrLevel( in, iqp );

    for (ir = 0; ir < dim; ir++) {
      for (ic = 0; ic < nc; ic++) {
	pout[nc*ir+ic] = 0.0;
	for (ii = 0; ii < dim; ii++) {
	  pout[nc*ir+ic] += pvs[is[dim*ir+ii]] * pin[nc*ii+ic];
	}
      }
    }
  }

  return( RET_OK );
}
Example #8
0
/*!
  Act transposed.

  @par Revision history:
  - 12.12.2005, c
  - 20.12.2005
*/
int32 bf_actt( FMField *out, FMField *bf, FMField *in )
{
  int32 iqp, ir, ic, ii, nEP, nQP, dim;
  float64 *pout, *pbf, *pin;

  nEP = bf->nCol;
  nQP = bf->nLev;
  dim = in->nRow;

#ifdef DEBUG_FMF
  if ((out->nCol != in->nCol) || (out->nRow != (dim * nEP))
      || (out->nLev != bf->nLev)) {
    errput( ErrHead "ERR_BadMatch: (%d %d %d), (%d %d %d), (%d %d %d)\n",
	    out->nLev, out->nRow, out->nCol,
	    bf->nLev, bf->nRow, bf->nCol,
	    in->nLev, in->nRow, in->nCol );
  }
#endif

  fmf_fillC( out, 0.0 );
  for (iqp = 0; iqp < nQP; iqp++) {
    pbf = FMF_PtrLevel( bf, iqp );
    pout = FMF_PtrLevel( out, iqp );
    pin = FMF_PtrLevel( in, iqp );

    for (ir = 0; ir < dim; ir++) {
      for (ic = 0; ic < out->nCol; ic++) {
	for (ii = 0; ii < nEP; ii++) {
	  pout[out->nCol*ii+ic] = pbf[ii] * (*pin);
	}
	pin++;
      }
      pout += out->nCol * nEP;
    }
  }

  return( RET_OK );
}
Example #9
0
/*!
  @fn int32 form_sdcc_actOpGT_VS3( FMField *diff, FMField *vec, FMField *gc )

  @f$(G_{SD})^T@f$ operation (i.e. divergence of columns of a tensor)
  used on a symmetric tensor (symmetric vector storage - e.g. stress vector).

  @par Revision history:
  - 30.04.2001, c
  - 03.10.2001
  - 06.06.2002
  - 17.03.2003, adopted from rcfem2
*/
int32 form_sdcc_actOpGT_VS3( FMField *diff, FMField *gc, FMField *vec )
{
  int32 iqp, iep, nEP, nQP;
  float64 *pdiff1, *pdiff2, *pdiff3, *pvec, *pg1, *pg2, *pg3;

  nEP = gc->nCol;
  nQP = gc->nLev;

  switch (gc->nRow) {
  case 3:
    for (iqp = 0; iqp < nQP; iqp++) {
      pdiff1 = FMF_PtrLevel( diff, iqp );
      pdiff2 = pdiff1 + nEP;
      pdiff3 = pdiff2 + nEP;
      pvec = FMF_PtrLevel( vec, iqp );
      pg1 = FMF_PtrLevel( gc, iqp );
      pg2 = pg1 + nEP;
      pg3 = pg2 + nEP;
      for (iep = 0; iep < nEP; iep++) {
	pdiff1[iep]
	  = pg1[iep] * pvec[0]
	  + pg2[iep] * pvec[3]
	  + pg3[iep] * pvec[4];
	pdiff2[iep]
	  = pg1[iep] * pvec[3]
	  + pg2[iep] * pvec[1]
	  + pg3[iep] * pvec[5];
	pdiff3[iep]
	  = pg1[iep] * pvec[4]
	  + pg2[iep] * pvec[5]
	  + pg3[iep] * pvec[2];
      }
    }
    break;
  case 2:
    for (iqp = 0; iqp < nQP; iqp++) {
      pdiff1 = FMF_PtrLevel( diff, iqp );
      pdiff2 = pdiff1 + nEP;
      pvec = FMF_PtrLevel( vec, iqp );
      pg1 = FMF_PtrLevel( gc, iqp );
      pg2 = pg1 + nEP;
      for (iep = 0; iep < nEP; iep++) {
	pdiff1[iep]
	  = pg1[iep] * pvec[0]
	  + pg2[iep] * pvec[2];
	pdiff2[iep]
	  = pg1[iep] * pvec[2]
	  + pg2[iep] * pvec[1];
      }
    }
    break;
  default:
    errput( ErrHead "ERR_Switch\n" );
  }

  return( RET_OK );
}
Example #10
0
/*!
  @par Revision history:
  - 28.11.2005, c
  - 30.05.2007
*/
int32 laplace_act_gt_m( FMField *out, FMField *gc, FMField *mtx )
{
  int32 iqp, iep, ii, nEP, nQP, nCol;
  float64 *pout, *pmtx, *pg1, *pg2, *pg3;

  nEP = gc->nCol;
  nQP = gc->nLev;
  nCol = mtx->nCol;

  switch (gc->nRow) {
  case 3:
    for (iqp = 0; iqp < nQP; iqp++) {
      pg1 = FMF_PtrLevel( gc, iqp );
      pg2 = pg1 + nEP;
      pg3 = pg2 + nEP;
      
      pmtx = FMF_PtrLevel( mtx, iqp );
      for (iep = 0; iep < nEP; iep++) {
	pout = FMF_PtrLevel( out, iqp ) + nCol * iep;
	for (ii = 0; ii < nCol; ii++) {
	  pout[ii]
	    = pg1[iep] * pmtx[0*nCol+ii]
	    + pg2[iep] * pmtx[1*nCol+ii]
	    + pg3[iep] * pmtx[2*nCol+ii];
	}
      }
    }
    break;

  case 2:
    for (iqp = 0; iqp < nQP; iqp++) {
      pg1 = FMF_PtrLevel( gc, iqp );
      pg2 = pg1 + nEP;
      
      pmtx = FMF_PtrLevel( mtx, iqp );
      for (iep = 0; iep < nEP; iep++) {
	pout = FMF_PtrLevel( out, iqp ) + nCol * iep;
	for (ii = 0; ii < nCol; ii++) {
	  pout[ii]
	    = pg1[iep] * pmtx[0*nCol+ii]
	    + pg2[iep] * pmtx[1*nCol+ii];
	}
      }
    }
    break;

  default:
    errput( ErrHead "ERR_Switch\n" );
    return( RET_Fail );
  }

  return( RET_OK );
}
Example #11
0
/*!
  Cauchy strain tensor stored as a vector, symmetric storage,
  doubled non-diagonal entries.
  
  @par Revision history:
  - 30.04.2001, c
  - 17.03.2003, adopted from rcfem2
  - 07.08.2006
*/
int32 form_sdcc_strainCauchy_VS( FMField *strain, FMField *dg )
{
  int32 iqp, nQP;
  float64 *pstrain, *pdg;

#ifdef DEBUG_FMF
  if ((strain->nLev != dg->nLev) || (strain->nCol != 1)
      || (dg->nCol != dg->nCol)
      || (strain->nRow != ((dg->nRow + 1) * dg->nRow / 2))) {
    errput( ErrHead "ERR_BadMatch: (%d %d %d) <- (%d %d %d)\n",
	    strain->nLev, strain->nRow, strain->nCol,
	    dg->nLev, dg->nRow, dg->nCol );
  }
#endif

  nQP = dg->nLev;

  switch (dg->nRow) {
  case 1:
    for (iqp = 0; iqp < nQP; iqp++) {
      pstrain = FMF_PtrLevel( strain, iqp );
      pdg = FMF_PtrLevel( dg, iqp );
      pstrain[0] = pdg[0];
    }
    break;
  case 2:
    for (iqp = 0; iqp < nQP; iqp++) {
      pstrain = FMF_PtrLevel( strain, iqp );
      pdg = FMF_PtrLevel( dg, iqp );
      pstrain[0] = pdg[0];
      pstrain[1] = pdg[3];
      pstrain[2] = pdg[1] + pdg[2];
    }
    break;
  case 3:
    for (iqp = 0; iqp < nQP; iqp++) {
      pstrain = FMF_PtrLevel( strain, iqp );
      pdg = FMF_PtrLevel( dg, iqp );
      pstrain[0] = pdg[0];
      pstrain[1] = pdg[4];
      pstrain[2] = pdg[8];
      pstrain[3] = pdg[1] + pdg[3];
      pstrain[4] = pdg[2] + pdg[6];
      pstrain[5] = pdg[5] + pdg[7];
    }
    break;
  default:
    errput( ErrHead "ERR_Switch\n" );
  }

  return( RET_OK );
}
Example #12
0
/*!
  @par Revision history:
  - 28.11.2005, c
  - 30.05.2007
*/
int32 laplace_act_g_m( FMField *out, FMField *gc, FMField *mtx )
{
  int32 iqp, ic, ik, nEP, nQP, nCol;
  float64 val1, val2, val3;
  float64 *pout, *pmtx, *pg1, *pg2, *pg3;

  nEP = gc->nCol;
  nQP = gc->nLev;
  nCol = mtx->nCol;

/*   output( "%d %d %d %d\n", nEP, nQP, nCol, dim ); */

  switch (gc->nRow) {
  case 3:
    for (iqp = 0; iqp < nQP; iqp++) {
      pg1 = FMF_PtrLevel( gc, iqp );
      pg2 = pg1 + nEP;
      pg3 = pg2 + nEP;
      pout = FMF_PtrLevel( out, iqp );
      
      if (mtx->nLev == nQP) {
	pmtx = FMF_PtrLevel( mtx, iqp );
      } else {
	pmtx = FMF_PtrCurrent( mtx );
      }
      for (ic = 0; ic < nCol; ic++) {
	val1 = val2 = val3 = 0.0;
	for (ik = 0; ik < nEP; ik++) {
/* 	    output( "%d %d %d %d\n", iqp, ic, ik ); */
	  val1 += pg1[ik] * pmtx[ic+nCol*ik];
	  val2 += pg2[ik] * pmtx[ic+nCol*ik];
	  val3 += pg3[ik] * pmtx[ic+nCol*ik];
	}
	pout[ic+0] = val1;
	pout[ic+1] = val2;
	pout[ic+2] = val3;
      }
    }
    break;

  case 2:
    for (iqp = 0; iqp < nQP; iqp++) {
      pg1 = FMF_PtrLevel( gc, iqp );
      pg2 = pg1 + nEP;
      pout = FMF_PtrLevel( out, iqp );
      
      if (mtx->nLev == nQP) {
	pmtx = FMF_PtrLevel( mtx, iqp );
      } else {
	pmtx = FMF_PtrCurrent( mtx );
      }
      for (ic = 0; ic < nCol; ic++) {
	val1 = val2 = 0.0;
	for (ik = 0; ik < nEP; ik++) {
/* 	    output( "%d %d %d %d\n", iqp, ic, ik ); */
	  val1 += pg1[ik] * pmtx[ic+nCol*ik];
	  val2 += pg2[ik] * pmtx[ic+nCol*ik];
	}
	pout[ic+0] = val1;
	pout[ic+1] = val2;
      }
    }
    break;

  default:
    errput( ErrHead "ERR_Switch\n" );
    return( RET_Fail );
  }

  return( RET_OK );
}
Example #13
0
/*!
  @par Revision history:
  - 21.12.2005, c
  - 05.09.2006
*/
int32 sg_describe( SurfaceGeometry *obj,
		   float64 *coorIn, int32 nNod, int32 dim,
		   int32 *fconn, int32 nFa, int32 nFP,
		   FMField *bfGR, FMField *weight )
{
  int32 ii, pos, inod, idim, iqp, nQP, ret = RET_OK;
  float64 c1, c2, c3, det;
  float64 *jmat;
  FMField *faceCoor = 0, *mtxRMS = 0;
  
  nQP = bfGR->nLev;
  if (!((nFa == obj->nFa) &&
	(dim == obj->dim) &&
	(nQP == obj->nQP) &&
	(nFP == obj->nFP))) {
    output( "nNod: %d, dim: %d, nFa: %d, nFP: %d\n",  nNod, dim, nFa, nFP );
    fmf_print( obj->normal, stdout, 1 );
    fmf_print( bfGR, stdout, 1 );
    fmf_print( weight, stdout, 1 );
    errput( "size mismatch!\n" );
    return( RET_Fail );
  }

/*    output( "%d %d %d %d\n", dim, nQP, nFP, nNod ); */
  fmf_createAlloc( &faceCoor, 1, 1, nFP, dim );
  fmf_createAlloc( &mtxRMS, 1, nQP, dim - 1, dim );

  for (ii = 0; ii < nFa; ii++) {
    FMF_SetCell( obj->normal, ii );
    FMF_SetCell( obj->det, ii );
    FMF_SetCell( obj->area, ii );

    for (inod = 0; inod < nFP; inod++) {
      pos = dim*fconn[inod];
      for (idim = 0; idim < dim; idim++ ) {
	faceCoor->val[dim*inod+idim] = coorIn[idim+pos];
      }
    }

/*      fmf_print( faceCoor, stdout, 0 ); */
    fmf_mulAB_n1( mtxRMS, bfGR, faceCoor );
    /* Surface jacobian and normal. */
    switch (dim) {
    case 2:
      /* dl = \norma{dx} = sqrt( dx^2 + dy^2 ) */
      for (iqp = 0; iqp < nQP; iqp++) {
	jmat = FMF_PtrLevel( mtxRMS, iqp );
	c1 = jmat[0];
	c2 = jmat[1];
	det = sqrt( c1*c1 + c2*c2 );
	obj->det->val[iqp] = det * weight->val[iqp];
	/* Unit outward normal. */
	obj->normal->val[2*(iqp)+0] = c2 / det;
	obj->normal->val[2*(iqp)+1] = -c1 / det;
      }
      break;
    case 3:
      /* dS = \norma{dx x dy} */
      for (iqp = 0; iqp < nQP; iqp++) {
	jmat = FMF_PtrLevel( mtxRMS, iqp );
	c1 = jmat[1] * jmat[5] - jmat[4] * jmat[2];
	c2 = jmat[0] * jmat[5] - jmat[3] * jmat[2];
	c3 = jmat[0] * jmat[4] - jmat[1] * jmat[3];
	det = sqrt( c1*c1 + c2*c2 + c3*c3 );
	/*  	  printf( "s: %f %f %f %f\n", c1, -c2, c3, det ); */
	obj->det->val[iqp] = det * weight->val[iqp];
	/* Unit outward normal. */
	obj->normal->val[3*(iqp)+0] = c1 / det;
	obj->normal->val[3*(iqp)+1] = -c2 / det;
	obj->normal->val[3*(iqp)+2] = c3 / det;
      }
      break;
    default:
      errput( ErrHead "ERR_Switch\n" );
    }

    // Element area.
    geme_elementVolume( obj->area->val, obj->det->val, nQP );
    obj->totalArea += obj->area->val[0];

  
    fconn += nFP;
    ERR_CheckGo( ret );
  }

 end_label:
  fmf_freeDestroy( &faceCoor );
  fmf_freeDestroy( &mtxRMS );

  return( ret );
}
Example #14
0
/*!
  @fn int32 form_sdcc_actOpGT_M3( FMField *diff, FMField *vec, FMField *gc )

  @f$(G_{SD})^T@f$ operation (i.e. divergence of columns of a tensor)
  used on a matrix (e.g. tangent modulus) from left.

  @par Revision history:
  - 03.10.2001, c
  - 06.06.2002
  - 17.03.2003, adopted from rcfem2
*/
int32 form_sdcc_actOpGT_M3( FMField *diff, FMField *gc, FMField *mtx )
{
  int32 iqp, iep, ii, nEP, nQP, nCol;
  float64 *pdiff1, *pdiff2, *pdiff3, *pvec, *pg1, *pg2, *pg3;

  nEP = gc->nCol;
  nQP = gc->nLev;
  nCol = mtx->nCol;

  switch (gc->nRow) {
  case 3:
    for (iqp = 0; iqp < nQP; iqp++) {
      pg1 = FMF_PtrLevel( gc, iqp );
      pg2 = pg1 + nEP;
      pg3 = pg2 + nEP;
      
      pvec = FMF_PtrLevel( mtx, iqp );
      for (iep = 0; iep < nEP; iep++) {
	pdiff1 = FMF_PtrLevel( diff, iqp ) + nCol * iep;
	pdiff2 = pdiff1 + nCol * nEP;
	pdiff3 = pdiff2 + nCol * nEP;
	for (ii = 0; ii < nCol; ii++) {
	  pdiff1[ii]
	    = pg1[iep] * pvec[0*nCol+ii]
	    + pg2[iep] * pvec[3*nCol+ii]
	    + pg3[iep] * pvec[4*nCol+ii];
	  pdiff2[ii]
	    = pg1[iep] * pvec[3*nCol+ii]
	    + pg2[iep] * pvec[1*nCol+ii]
	    + pg3[iep] * pvec[5*nCol+ii];
	  pdiff3[ii]
	    = pg1[iep] * pvec[4*nCol+ii]
	    + pg2[iep] * pvec[5*nCol+ii]
	    + pg3[iep] * pvec[2*nCol+ii];
	}
      }
    }
    break;
  case 2:
    for (iqp = 0; iqp < nQP; iqp++) {
      pg1 = FMF_PtrLevel( gc, iqp );
      pg2 = pg1 + nEP;
      
      pvec = FMF_PtrLevel( mtx, iqp );
      for (iep = 0; iep < nEP; iep++) {
	pdiff1 = FMF_PtrLevel( diff, iqp ) + nCol * iep;
	pdiff2 = pdiff1 + nCol * nEP;
	for (ii = 0; ii < nCol; ii++) {
	  pdiff1[ii]
	    = pg1[iep] * pvec[0*nCol+ii]
	    + pg2[iep] * pvec[2*nCol+ii];
	  pdiff2[ii]
	    = pg1[iep] * pvec[2*nCol+ii]
	    + pg2[iep] * pvec[1*nCol+ii];
	}
      }
    }
    break;
  default:
    errput( ErrHead "ERR_Switch\n" );
  }

  return( RET_OK );
}