/*! @par Revision history: - 12.12.2005, c - 14.12.2005 - 22.03.2006 - 27.07.2006 */ int32 dw_adj_convect1( FMField *out, FMField *stateW, FMField *gradU, VolumeGeometry *vg, int32 isDiff ) { int32 ii, dim, nQP, nEP, ret = RET_OK; FMField *gf = 0, *ftgf = 0, *ftgfu = 0; FMField *gfu = 0; nQP = vg->bfGM->nLev; nEP = vg->bfGM->nCol; dim = vg->bfGM->nRow; if (isDiff) { fmf_createAlloc( &gf, 1, nQP, dim, dim * nEP ); fmf_createAlloc( &ftgf, 1, nQP, dim * nEP, dim * nEP ); } else { fmf_createAlloc( &gfu, 1, nQP, dim, 1 ); fmf_createAlloc( &ftgfu, 1, nQP, dim * nEP, 1 ); } for (ii = 0; ii < out->nCell; ii++) { FMF_SetCell( out, ii ); FMF_SetCell( gradU, ii ); FMF_SetCell( vg->det, ii ); FMF_SetCellX1( vg->bf, ii ); if (isDiff) { bf_ract( gf, vg->bf, gradU ); bf_actt( ftgf, vg->bf, gf ); fmf_sumLevelsMulF( out, ftgf, vg->det->val ); } else { FMF_SetCell( stateW, ii ); fmf_mulAB_nn( gfu, gradU, stateW ); bf_actt( ftgfu, vg->bf, gfu ); fmf_sumLevelsMulF( out, ftgfu, vg->det->val ); } ERR_CheckGo( ret ); } end_label: if (isDiff) { fmf_freeDestroy( &gf ); fmf_freeDestroy( &ftgf ); } else { fmf_freeDestroy( &gfu ); fmf_freeDestroy( &ftgfu ); } return( ret ); }
int32 dw_convect_v_grad_s( FMField *out, FMField *val_v, FMField *grad_s, Mapping *vvg, Mapping *svg, int32 isDiff ) { int32 ii, nEPV, nEPS, dim, nQP, ret = RET_OK; FMField *aux = 0, *out_qp = 0, *gst = 0; nQP = vvg->bfGM->nLev; dim = vvg->bfGM->nRow; nEPS = svg->bfGM->nCol; nEPV = vvg->bf->nCol; if (isDiff == 0) { fmf_createAlloc( &aux, 1, nQP, 1, 1 ); fmf_createAlloc( &out_qp, 1, nQP, nEPS, 1 ); } else if (isDiff == 1) { // d/ds. fmf_createAlloc( &aux, 1, nQP, 1, nEPS ); fmf_createAlloc( &out_qp, 1, nQP, nEPS, nEPS ); } else { // d/dv. fmf_createAlloc( &aux, 1, nQP, 1, dim * nEPV ); fmf_createAlloc( &out_qp, 1, nQP, nEPS, dim * nEPV ); fmf_createAlloc( &gst, 1, nQP, 1, dim ); } for (ii = 0; ii < out->nCell; ii++) { FMF_SetCell( out, ii ); FMF_SetCellX1( svg->bf, ii ); if (isDiff == 0) { FMF_SetCell( val_v, ii ); FMF_SetCell( grad_s, ii ); // v^T Psi^T G_c s. fmf_mulATB_nn( aux, val_v, grad_s ); // Phi^T v^T Psi^T G_c s. fmf_mulATB_nn( out_qp, svg->bf, aux ); } else if (isDiff == 1) { // d/ds. FMF_SetCell( val_v, ii ); FMF_SetCell( svg->bfGM, ii ); // v^T Psi^T G_c. fmf_mulATB_nn( aux, val_v, svg->bfGM ); // Phi^T v^T Psi^T G_c. fmf_mulATB_nn( out_qp, svg->bf, aux ); } else { // d/dv. FMF_SetCell( grad_s, ii ); FMF_SetCellX1( vvg->bf, ii ); // s^T G_c^T - transpose grad_s. fmf_mulATC( gst, grad_s, 1.0 ); // s^T G_c^T Psi. bf_ract( aux, vvg->bf, gst ); // Phi^T s^T G_c^T Psi. fmf_mulATB_nn( out_qp, svg->bf, aux ); } fmf_sumLevelsMulF( out, out_qp, vvg->det->val ); ERR_CheckGo( ret ); } end_label: fmf_freeDestroy( &aux ); fmf_freeDestroy( &out_qp ); fmf_freeDestroy( &gst ); return( ret ); }
int32 dw_v_dot_grad_s_sw( FMField *out, FMField *coef, FMField *val_qp, Mapping *vvg, Mapping *svg, int32 isDiff ) { int32 ii, nc, nEPV, nEPS, dim, nQP, ret = RET_OK; FMField *gtf = 0, *ctf = 0, *ct = 0; nQP = vvg->bfGM->nLev; dim = vvg->bfGM->nRow; nEPS = svg->bfGM->nCol; nEPV = vvg->bf->nCol; nc = coef->nCol; if (isDiff == 1) { fmf_createAlloc( >f, 1, nQP, nEPS, dim * nEPV ); if (nc > 1) { fmf_createAlloc( &ctf, 1, nQP, dim, dim * nEPV ); fmf_createAlloc( &ct, 1, nQP, dim, dim ); } else { // Gc^T. fmf_createAlloc( &ctf, 1, nQP, nEPS, dim ); } } else { fmf_createAlloc( >f, 1, nQP, nEPS, 1 ); if (nc > 1) { fmf_createAlloc( &ctf, 1, nQP, dim, 1 ); } } for (ii = 0; ii < out->nCell; ii++) { FMF_SetCell( out, ii ); FMF_SetCellX1( coef, ii ); FMF_SetCell( svg->bfGM, ii ); FMF_SetCell( vvg->det, ii ); if (isDiff == 1) { FMF_SetCellX1( vvg->bf, ii ); if (nc == 1) { // Transpose Gc. fmf_mulATC( ctf, svg->bfGM, 1.0 ); // Gc^T Phi. bf_ract( gtf, vvg->bf, ctf ); fmf_mul( gtf, coef->val ); } else { // Transpose C. fmf_mulATC( ct, coef, 1.0 ); // Gc^T C^T Phi. bf_ract( ctf, vvg->bf, ct ); fmf_mulATB_nn( gtf, svg->bfGM, ctf ); } } else { FMF_SetCell( val_qp, ii ); if (nc == 1) { fmf_mulATB_nn( gtf, svg->bfGM, val_qp ); fmf_mul( gtf, coef->val ); } else { // Gc^T C^T Phi v. fmf_mulATB_nn( ctf, coef, val_qp ); fmf_mulATB_nn( gtf, svg->bfGM, ctf ); } } fmf_sumLevelsMulF( out, gtf, vvg->det->val ); ERR_CheckGo( ret ); } end_label: fmf_freeDestroy( >f ); fmf_freeDestroy( &ctf ); fmf_freeDestroy( &ct ); return( ret ); }
/*! @par Revision history: - 21.11.2006, c */ int32 dw_volume_dot_vector( FMField *out, FMField *coef, FMField *val_qp, Mapping *rvg, Mapping *cvg, int32 isDiff ) { int32 ii, dim, nc, nQP, nEPR, nEPC, ret = RET_OK; FMField *ftfu = 0, *ftf1 = 0, *ftf = 0,*cf = 0, *cfu = 0; nQP = rvg->nQP; dim = rvg->dim; nEPR = rvg->bf->nCol; nEPC = cvg->bf->nCol; nc = coef->nCol; if (isDiff) { fmf_createAlloc( &ftf, 1, nQP, nEPR * dim, nEPC * dim ); if (nc == 1) { fmf_createAlloc( &ftf1, 1, nQP, nEPR, nEPC ); } else { fmf_createAlloc( &cf, 1, nQP, dim, dim * nEPC ); } } else { fmf_createAlloc( &ftfu, 1, nQP, dim * nEPR, 1 ); if (nc > 1) { fmf_createAlloc( &cfu, 1, nQP, dim, 1 ); } } for (ii = 0; ii < out->nCell; ii++) { FMF_SetCell( out, ii ); FMF_SetCellX1( coef, ii ); FMF_SetCell( rvg->det, ii ); FMF_SetCellX1( rvg->bf, ii ); if (isDiff) { FMF_SetCellX1( cvg->bf, ii ); if (nc == 1) { fmf_mulATB_nn( ftf1, rvg->bf, cvg->bf ); bf_buildFTF( ftf, ftf1 ); fmf_mul( ftf, coef->val ); } else { bf_ract( cf, cvg->bf, coef ); bf_actt( ftf, rvg->bf, cf ); } fmf_sumLevelsMulF( out, ftf, rvg->det->val ); } else { FMF_SetCell( val_qp, ii ); if (nc == 1) { bf_actt( ftfu, rvg->bf, val_qp ); fmf_mul( ftfu, coef->val ); } else { fmf_mulAB_nn( cfu, coef, val_qp ); bf_actt( ftfu, rvg->bf, cfu ); } fmf_sumLevelsMulF( out, ftfu, rvg->det->val ); } ERR_CheckGo( ret ); } end_label: if (isDiff) { fmf_freeDestroy( &ftf ); if (nc == 1) { fmf_freeDestroy( &ftf1 ); } else { fmf_freeDestroy( &cf ); } } else { fmf_freeDestroy( &ftfu ); if (nc > 1) { fmf_freeDestroy( &cfu ); } } return( ret ); }