コード例 #1
0
ファイル: termsLinElasticity.c プロジェクト: taldcroft/sfepy
/*!
  @par Revision history:
  - 30.07.2007, from dw_hdpm_cache()
*/
int32 dq_cauchy_strain( FMField *out, FMField *state, int32 offset,
			VolumeGeometry *vg,
			int32 *conn, int32 nEl, int32 nEP )
{
  int32 ii, dim, sym, nQP, ret = RET_OK;
  FMField *st = 0, *disG = 0;

  state->val = FMF_PtrFirst( state ) + offset;

  nQP = vg->bfGM->nLev;
  dim = vg->bfGM->nRow;

  sym = (dim + 1) * dim / 2;
  fmf_createAlloc( &st, 1, 1, nEP, dim );
  fmf_createAlloc( &disG, 1, nQP, dim, dim );

  for (ii = 0; ii < nEl; ii++) {
    FMF_SetCell( out, ii );
    FMF_SetCell( vg->bfGM, ii );

    ele_extractNodalValuesNBN( st, state, conn + nEP * ii );
    fmf_mulAB_n1( disG, vg->bfGM, st );
    form_sdcc_strainCauchy_VS( out, disG );
/*       fmf_print( out, stdout, 0 ); */
/*       sys_pause(); */
    ERR_CheckGo( ret );
  }

 end_label:
  fmf_freeDestroy( &st ); 
  fmf_freeDestroy( &disG ); 

  return( ret );
}
コード例 #2
0
ファイル: geometry.c プロジェクト: olivierverdier/sfepy
/*!
  @par Revision history:
  - 04.05.2007, c
  - 30.05.2007
*/
int32 sg_evaluateBFBGM( SurfaceGeometry *obj, FMField *bfBGR,
			float64 *coorIn, int32 nNod, int32 dim,
			int32 *fis, int32 nFa, int32 nFP,
			int32 *conn, int32 nEl, int32 nEP )
{
  int32 ii, iel, ifa, inod, idim, pos, nQP, ret = RET_OK;
  FMField *volCoor0 = 0, *mtxRM = 0, *mtxRMI = 0;
  
  nQP = obj->normal->nLev;

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

  fmf_createAlloc( &volCoor0, 1, 1, nEP, dim );
  fmf_createAlloc( &mtxRM, 1, nQP, dim, dim );
  fmf_createAlloc( &mtxRMI, 1, nQP, dim, dim );

  for (ii = 0; ii < nFa; ii++) {
    iel = fis[ii*nFP+0];
    ifa = fis[ii*nFP+1];
    
    FMF_SetCell( obj->bfBGM, ii );
    FMF_SetCell( bfBGR, ifa );

    for (inod = 0; inod < nEP; inod++) {
      pos = dim*conn[nEP*iel+inod];
      for (idim = 0; idim < dim; idim++ ) {
	volCoor0->val[dim*inod+idim] = coorIn[idim+pos];
      }
    }
    fmf_mulAB_n1( mtxRM, bfBGR, volCoor0 );
    geme_invert3x3( mtxRMI, mtxRM );
    fmf_mulAB_nn( obj->bfBGM, mtxRMI, bfBGR );
/*     fmf_mulATBT_1n( mtxRM, volCoor0, bfBGR ); */
/*     geme_invert3x3( mtxRMI, mtxRM ); */
/*     fmf_mulATB_nn( obj->bfBGM, mtxRMI, bfBGR ); */

/*     output( "%d %d %d\n", ii, iel, ifa); */
/*     fmf_print( bfBGR, stdout, 0 ); */
/*     fmf_print( volCoor0, stdout, 0 ); */
/*     fmf_print( obj->bfBGM, stdout, 0 ); */
/*     sys_pause(); */
    
    ERR_CheckGo( ret );
  }

 end_label:
  fmf_freeDestroy( &volCoor0 );
  fmf_freeDestroy( &mtxRM );
  fmf_freeDestroy( &mtxRMI );

  return( RET_OK );
}
コード例 #3
0
ファイル: termsLaplace.c プロジェクト: olivierverdier/sfepy
/*!
  Diffusion velocity.
  @par Revision history:
  - c: 07.09.2006, r: 06.05.2008
*/
int32 de_diffusion_velocity( FMField *out, FMField *state, int32 offset,
			     FMField *mtxD, VolumeGeometry *vg,
			     int32 *conn, int32 nEl, int32 nEP,
			     int32 *elList, int32 elList_nRow )
{
  int32 ii, iel, dim, nQP, ret = RET_OK;
  FMField *st = 0, *gp = 0, *dgp = 0;

  nQP = vg->bfGM->nLev;
  dim = vg->bfGM->nRow;

/*   output( "%d %d %d %d %d %d\n", offset, nEl, nEP, nQP, dim, elList_nRow ); */
  state->val = FMF_PtrFirst( state ) + offset;

  fmf_createAlloc( &st, 1, 1, nEP, 1 );
  fmf_createAlloc( &gp, 1, nQP, dim, 1 );
  fmf_createAlloc( &dgp, 1, nQP, dim, 1 );

  for (ii = 0; ii < elList_nRow; ii++) {
    iel = elList[ii];

    FMF_SetCell( out, ii );
    FMF_SetCell( vg->bfGM, iel );
    FMF_SetCell( vg->det, iel );
    if (mtxD->nCell > 1) {
      FMF_SetCell( mtxD, ii );
    }

    ele_extractNodalValuesNBN( st, state, conn + nEP * iel );
    fmf_mulAB_n1( gp, vg->bfGM, st );
    fmf_mulAB_nn( dgp, mtxD, gp );
    fmf_sumLevelsMulF( out, dgp, vg->det->val );
    ERR_CheckGo( ret );
  }
  fmfc_mulC( out, -1.0 );

 end_label:
  fmf_freeDestroy( &st ); 
  fmf_freeDestroy( &gp ); 
  fmf_freeDestroy( &dgp ); 

  return( ret );
}
コード例 #4
0
ファイル: geometry.c プロジェクト: olivierverdier/sfepy
/*!
  @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 );
}
コード例 #5
0
/*!
  @par Revision history:
  - 30.10.2007, c
*/
int32 dw_st_adj2_supg_p( FMField *out, FMField *gradU, FMField *stateR,
			 FMField *coef,
			 VolumeGeometry *vg_u, VolumeGeometry *vg_r,
			 int32 *conn_r, int32 nEl_r, int32 nEP_r,
			 int32 isDiff )
{
  int32 ii, dim, nQP, nEP_u, ret = RET_OK;
  FMField *stR = 0, *gUTg = 0, *fTgUTg = 0;
  FMField *outqp = 0;
  FMField stRv[1];

  nQP = vg_u->bfGM->nLev;
  nEP_u = vg_u->bfGM->nCol;
  dim = vg_u->bfGM->nRow;

  stateR->val = FMF_PtrFirst( stateR );

  fmf_createAlloc( &gUTg, 1, nQP, dim, nEP_r );
  fmf_createAlloc( &fTgUTg, 1, nQP, nEP_u * dim, nEP_r );

  if (isDiff == 0) {
    fmf_createAlloc( &outqp, 1, nQP, nEP_u * dim, 1 );

    fmf_createAlloc( &stR, 1, 1, 1, nEP_r );
    stRv->nAlloc = -1;
    fmf_pretend( stRv, 1, 1, nEP_r, 1, stR->val );
  }

  for (ii = 0; ii < out->nCell; ii++) {
    FMF_SetCell( out, ii );
    FMF_SetCell( gradU, ii );
    FMF_SetCell( vg_r->bfGM, ii );
    FMF_SetCell( vg_u->det, ii );
    FMF_SetCell( coef, ii );
    FMF_SetCellX1( vg_u->bf, ii );

    // (grad u, grad).
    fmf_mulATB_nn( gUTg, gradU, vg_r->bfGM );

    // (v grad u, grad).
    bf_actt( fTgUTg, vg_u->bf, gUTg );

    if (isDiff == 1) {
      fmf_sumLevelsMulF( out, fTgUTg, vg_u->det->val );
    } else {
      ele_extractNodalValuesDBD( stR, stateR, conn_r + nEP_r * ii );

      // (v grad u, grad r).
      fmf_mulAB_n1( outqp, fTgUTg, stRv );
      fmf_sumLevelsMulF( out, outqp, vg_u->det->val );
    }
    fmf_mulC( out, coef->val[0] );

    ERR_CheckGo( ret );
  }

 end_label:
  fmf_freeDestroy( &gUTg );
  fmf_freeDestroy( &fTgUTg );
  if (isDiff == 0) {
    fmf_freeDestroy( &stR );
    fmf_freeDestroy( &outqp );
  }

  return( ret );
}
コード例 #6
0
/*!
  @par Revision history:
  - 30.10.2007, c
*/
int32 dw_st_adj1_supg_p( FMField *out, FMField *stateW, FMField *gradP,
			 FMField *coef, VolumeGeometry *vg_w,
			 int32 *conn_w, int32 nEl_w, int32 nEP_w,
			 int32 isDiff )
{
  int32 ii, dim, nQP, ret = RET_OK;
  FMField *stW = 0, *gPTgT = 0, *fTgPTgT = 0;
  FMField *outqp = 0;
  FMField stWv[1];

  nQP = vg_w->bfGM->nLev;
  dim = vg_w->bfGM->nRow;

  stateW->val = FMF_PtrFirst( stateW );

  fmf_createAlloc( &gPTgT, 1, nQP, dim, nEP_w * dim );
  fmf_createAlloc( &fTgPTgT, 1, nQP, nEP_w * dim, nEP_w * dim );

  if (isDiff == 0) {
    fmf_createAlloc( &outqp, 1, nQP, nEP_w * dim, 1 );

    fmf_createAlloc( &stW, 1, 1, dim, nEP_w );
    stWv->nAlloc = -1;
    fmf_pretend( stWv, 1, 1, nEP_w * dim, 1, stW->val );
  }

  for (ii = 0; ii < out->nCell; ii++) {
    FMF_SetCell( out, ii );
    FMF_SetCell( gradP, ii );
    FMF_SetCell( vg_w->bfGM, ii );
    FMF_SetCell( vg_w->det, ii );
    FMF_SetCell( coef, ii );
    FMF_SetCellX1( vg_w->bf, ii );

    // (grad p, grad).
    convect_build_vtbg( gPTgT, vg_w->bfGM, gradP );
    // (grad p, v grad).
    bf_actt( fTgPTgT, vg_w->bf, gPTgT );

    if (isDiff == 1) {
      fmf_sumLevelsMulF( out, fTgPTgT, vg_w->det->val );
    } else {
      ele_extractNodalValuesDBD( stW, stateW, conn_w + nEP_w * ii );

      // (grad p, v grad w).
      fmf_mulAB_n1( outqp, fTgPTgT, stWv );
      fmf_sumLevelsMulF( out, outqp, vg_w->det->val );
    }
    fmf_mulC( out, coef->val[0] );

    ERR_CheckGo( ret );
  }

 end_label:
  fmf_freeDestroy( &gPTgT );
  fmf_freeDestroy( &fTgPTgT );
  if (isDiff == 0) {
    fmf_freeDestroy( &stW );
    fmf_freeDestroy( &outqp );
  }

  return( ret );
}
コード例 #7
0
/*!
  @par Revision history:
  - 30.10.2007, c
*/
int32 dw_st_adj_supg_c( FMField *out, FMField *stateW,
			FMField *stateU, FMField *gradU,
			FMField *coef, VolumeGeometry *vg,
			int32 *conn, int32 nEl, int32 nEP,
			int32 isDiff )
{
  int32 ii, dim, nQP, ret = RET_OK;
  FMField *stW = 0, *gUfU = 0, *fUTg = 0;
  FMField *gUfUTg = 0, *fTgUfUTg = 0;
  FMField *gUfUTgT = 0, *fTgUfUTgT = 0;
  FMField *outdqp = 0, *outqp = 0, *out1qp = 0, *out2qp = 0;
  FMField stWv[1];

  nQP = vg->bfGM->nLev;
  dim = vg->bfGM->nRow;

  stateW->val = FMF_PtrFirst( stateW );

  fmf_createAlloc( &gUfU, 1, nQP, dim, 1 );
  fmf_createAlloc( &gUfUTgT, 1, nQP, dim, nEP * dim );
  fmf_createAlloc( &fTgUfUTgT, 1, nQP, nEP * dim, nEP * dim );

  fmf_createAlloc( &fUTg, 1, nQP, dim, nEP * dim );
  fmf_createAlloc( &gUfUTg, 1, nQP, dim, nEP * dim );
  fmf_createAlloc( &fTgUfUTg, 1, nQP, nEP * dim, nEP * dim );

  if (isDiff == 1) {
    fmf_createAlloc( &outdqp, 1, nQP, dim * nEP, dim * nEP );
  } else {
    fmf_createAlloc( &stW, 1, 1, dim, nEP );
    stWv->nAlloc = -1;
    fmf_pretend( stWv, 1, 1, nEP * dim, 1, stW->val );

    fmf_createAlloc( &out1qp, 1, nQP, dim * nEP, 1 );
    fmf_createAlloc( &out2qp, 1, nQP, dim * nEP, 1 );
    fmf_createAlloc( &outqp, 1, nQP, dim * nEP, 1 );
  }

  for (ii = 0; ii < out->nCell; ii++) {
    FMF_SetCell( out, ii );
    FMF_SetCell( stateU, ii );
    FMF_SetCell( gradU, ii );
    FMF_SetCell( vg->bfGM, ii );
    FMF_SetCell( vg->det, ii );
    FMF_SetCell( coef, ii );
    FMF_SetCellX1( vg->bf, ii );

    // u grad u.
    fmf_mulAB_nn( gUfU, gradU, stateU );
    // (u grad u, grad).
    convect_build_vtbg( gUfUTgT, vg->bfGM, gUfU );
    // (u grad u, v grad).
    bf_actt( fTgUfUTgT, vg->bf, gUfUTgT );

    // u grad.
    convect_build_vtg( fUTg, vg->bfGM, stateU );
    // (grad u, u^T grad).
    fmf_mulAB_nn( gUfUTg, gradU, fUTg );
    // (v grad u, u grad).
    bf_actt( fTgUfUTg, vg->bf, gUfUTg );

    if (isDiff == 1) {
      fmf_addAB_nn( outdqp, fTgUfUTgT, fTgUfUTg );
      fmf_sumLevelsMulF( out, outdqp, vg->det->val );
    } else {
      ele_extractNodalValuesDBD( stW, stateW, conn + nEP * ii );

      // (u grad u, v grad w).
      fmf_mulAB_n1( out1qp, fTgUfUTgT, stWv );

      // (v grad u, u grad w).
      fmf_mulAB_n1( out2qp, fTgUfUTg, stWv );

      fmf_addAB_nn( outqp, out1qp, out2qp );
      fmf_sumLevelsMulF( out, outqp, vg->det->val );

    }
    fmf_mulC( out, coef->val[0] );

    ERR_CheckGo( ret );
  }

 end_label:
  fmf_freeDestroy( &gUfU );
  fmf_freeDestroy( &gUfUTgT );
  fmf_freeDestroy( &fTgUfUTgT );
  fmf_freeDestroy( &fUTg );
  fmf_freeDestroy( &gUfUTg );
  fmf_freeDestroy( &fTgUfUTg );
  if (isDiff) {
    fmf_freeDestroy( &outdqp );
  } else {
    fmf_freeDestroy( &stW );
    fmf_freeDestroy( &out1qp );
    fmf_freeDestroy( &out2qp );
    fmf_freeDestroy( &outqp );
  }

  return( ret );
}