/*! @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 ); }
/*! @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 ); }
/*! @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 ); }
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 ); }
/*! @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 ); }
/*! @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 ); }
/*! 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 ); }
/*! 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 ); }
/*! @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 ); }
/*! @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 ); }
/*! 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 ); }
/*! @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 ); }
/*! @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 ); }
/*! @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 ); }