/*************************************************************************
* four_tetrahedron.1.bas_fun.c : by R.Lie
*/
double get_volume(const double * v0,
const double * v1,
const double * v2,
const double * v3)
{
return ((v1[0] - v0[0])*(v2[1] - v0[1])*(v3[2] - v0[2])
+ (v1[1] - v0[1])*(v2[2] - v0[2])*(v3[0] - v0[0])
+ (v1[2] - v0[2])*(v2[0] - v0[0])*(v3[1] - v0[1])
- (v1[0] - v0[0])*(v2[2] - v0[2])*(v3[1] - v0[1])
- (v1[1] - v0[1])*(v2[0] - v0[0])*(v3[2] - v0[2])
- (v1[2] - v0[2])*(v2[1] - v0[1])*(v3[0] - v0[0]));
}
#define ZERO 1.0e-12
#define co_det(v, m, n) (\
((m%2==0)?-1.:1.) * (\
(v[(m+2)%4][(n+1)%3] - v[(m+1)%4][(n+1)%3]) \
* (v[(m+3)%4][(n+2)%3] - v[(m+1)%4][(n+2)%3]) \
- (v[(m+2)%4][(n+2)%3] - v[(m+1)%4][(n+2)%3]) \
* (v[(m+3)%4][(n+1)%3] - v[(m+1)%4][(n+1)%3]) \
) \
)
void lambda_1(const double * p, const double ** v, void * value)
{
double * val = (double *)value;
double volume = get_volume(v[0], v[1], v[2], v[3]);
val[0] = get_volume(p, v[1], v[2], v[3]);
val[0] /= volume;
}
void lambda_2(const double * p, const double ** v, void * value)
{
double * val = (double *)value;
double volume = get_volume(v[0], v[1], v[6], v[5]);
val[0] = get_volume(v[0], p, v[6], v[5]);
val[0] /= volume;
if (val[0] < 0.) val[0] = 0.;
}
void lambda_3(const double * p, const double ** v, void * value)
{
double * val = (double *)value;
double volume = get_volume(v[0], v[2], v[4], v[6]);
val[0] = get_volume(v[0], p, v[4], v[6]);
val[0] /= volume;
if (val[0] < 0.) val[0] = 0.;
}
void lambda_4(const double * p, const double ** v, void * value)
{
double * val = (double *)value;
double volume = get_volume(v[0], v[3], v[5], v[4]);
val[0] = get_volume(v[0], p, v[5], v[4]);
val[0] /= volume;
if (val[0] < 0.) val[0] = 0.;
}
void lambda_5(const double * p, const double ** v, void * value)
{
double * val = (double *)value;
double volume = 0.25 * get_volume(v[0], v[1], v[2], v[3]);
double d45, d56, d64;
d56 = get_volume(v[0], p, v[5], v[6]);
if (d56 <= 0.) {
val[0] = 0.;
return;
}
d45 = get_volume(v[0], p, v[4], v[5]);
if (d45 <= 0.) {
val[0] = get_volume(v[0], p, v[3], v[5]);
val[0] /= volume;
return;
}
d64 = get_volume(v[0], p, v[6], v[4]);
if (d64 <= 0.) {
val[0] = get_volume(v[0], p, v[6], v[2]);
val[0] /= volume;
return;
}
val[0] = d56/volume;
}
void lambda_6(const double * p, const double ** v, void * value)
{
double * val = (double *)value;
double volume = 0.25 * get_volume(v[0], v[1], v[2], v[3]);
double d45, d56, d64;
d64 = get_volume(v[0], p, v[6], v[4]);
if (d64 <= 0.) {
val[0] = 0.;
return;
}
d45 = get_volume(v[0], p, v[4], v[5]);
if (d45 <= 0.) {
val[0] = get_volume(v[0], p, v[4], v[3]);
val[0] /= volume;
return;
}
d56 = get_volume(v[0], p, v[5], v[6]);
if (d56 <= 0.) {
val[0] = get_volume(v[0], p, v[1], v[6]);
val[0] /= volume;
return;
}
val[0] = d64/volume;
}
void lambda_7(const double * p, const double ** v, void * value)
{
double * val = (double *)value;
double volume = 0.25 * get_volume(v[0], v[1], v[2], v[3]);
double d45, d56, d64;
d45 = get_volume(v[0], p, v[4], v[5]);
if (d45 <= 0.) {
val[0] = 0.;
return;
}
d56 = get_volume(v[0], p, v[5], v[6]);
if (d56 <= 0.) {
val[0] = get_volume(v[0], p, v[5], v[1]);
val[0] /= volume;
return;
}
d64 = get_volume(v[0], p, v[6], v[4]);
if (d64 <= 0.) {
val[0] = get_volume(v[0], p, v[2], v[4]);
val[0] /= volume;
return;
}
val[0] = d45/volume;
}
void gradient_lambda_1(const double * p, const double ** v, void * value)
{
double * val = (double *)value;
double volume = get_volume(v[0], v[1], v[2], v[3]);
val[0] = co_det(v, 0, 0)/volume;
val[1] = co_det(v, 0, 1)/volume;
val[2] = co_det(v, 0, 2)/volume;
}
void gradient_lambda_2(const double * p, const double ** v, void * value)
{
double * val = (double *)value;
const double * v1[4] = {v[0], v[1], v[6], v[5]};
double sign = get_volume(v[0], p, v[6], v[5]);
double volume = get_volume(v[0], v[1], v[6], v[5]);
if (sign > ZERO) {
val[0] = co_det(v1, 1, 0)/volume;
val[1] = co_det(v1, 1, 1)/volume;
val[2] = co_det(v1, 1, 2)/volume;
}
else if (sign < -ZERO) {
val[0] = 0.;
val[1] = 0.;
val[2] = 0.;
}
else {
val[0] = 0.5*co_det(v1, 1, 0)/volume;
val[1] = 0.5*co_det(v1, 1, 1)/volume;
val[2] = 0.5*co_det(v1, 1, 2)/volume;
}
}
void gradient_lambda_3(const double * p, const double ** v, void * value)
{
double * val = (double *)value;
const double * v1[4] = {v[0], v[2], v[4], v[6]};
double sign = get_volume(v[0], p, v[4], v[6]);
double volume = get_volume(v[0], v[2], v[4], v[6]);
if (sign > ZERO) {
val[0] = co_det(v1, 1, 0)/volume;
val[1] = co_det(v1, 1, 1)/volume;
val[2] = co_det(v1, 1, 2)/volume;
}
else if (sign < -ZERO) {
val[0] = 0.;
val[1] = 0.;
val[2] = 0.;
}
else {
val[0] = 0.5*co_det(v1, 1, 0)/volume;
val[1] = 0.5*co_det(v1, 1, 1)/volume;
val[2] = 0.5*co_det(v1, 1, 2)/volume;
}
}
void gradient_lambda_4(const double * p, const double ** v, void * value)
{
double * val = (double *)value;
const double * v1[4] = {v[0], v[3], v[5], v[4]};
double sign = get_volume(v[0], p, v[5], v[4]);
double volume = get_volume(v[0], v[3], v[5], v[4]);
if (sign > ZERO) {
val[0] = co_det(v1, 1, 0)/volume;
val[1] = co_det(v1, 1, 1)/volume;
val[2] = co_det(v1, 1, 2)/volume;
}
else if (sign < -ZERO) {
val[0] = 0.;
val[1] = 0.;
val[2] = 0.;
}
else {
val[0] = 0.5*co_det(v1, 1, 0)/volume;
val[1] = 0.5*co_det(v1, 1, 1)/volume;
val[2] = 0.5*co_det(v1, 1, 2)/volume;
}
}
void gradient_lambda_5(const double * p, const double ** v, void * value)
{
double * val = (double *)value;
const double * v1[4] = {v[0], v[1], v[6], v[5]};
const double * v2[4] = {v[0], v[2], v[4], v[6]};
const double * v3[4] = {v[0], v[3], v[5], v[4]};
const double * v4[4] = {v[0], v[4], v[5], v[6]};
double d45 = get_volume(v[0], p, v[4], v[5]);
double d56 = get_volume(v[0], p, v[5], v[6]);
double d64 = get_volume(v[0], p, v[6], v[4]);
double volume = get_volume(v4[0], v4[1], v4[2], v4[3]);
double count = 0.0;
val[0] = 0.0; val[1] = 0.0; val[2] = 0.0;
if (d45 <= ZERO) {
val[0] += co_det(v3, 3, 0)/volume;
val[1] += co_det(v3, 3, 1)/volume;
val[2] += co_det(v3, 3, 2)/volume;
count += 1.0;
}
if (d56 <= ZERO) {
count += 1.0;
}
if (d64 <= ZERO) {
val[0] += co_det(v2, 2, 0)/volume;
val[1] += co_det(v2, 2, 1)/volume;
val[2] += co_det(v2, 2, 2)/volume;
count += 1.0;
}
if (d45 >= -ZERO && d56 >= -ZERO && d64 >= -ZERO) {
val[0] += co_det(v4, 1, 0)/volume;
val[1] += co_det(v4, 1, 1)/volume;
val[2] += co_det(v4, 1, 2)/volume;
count += 1.0;
}
val[0] /= count; val[1] /= count; val[2] /= count;
}
void gradient_lambda_6(const double * p, const double ** v, void * value)
{
double * val = (double *)value;
const double * v1[4] = {v[0], v[1], v[6], v[5]};
const double * v2[4] = {v[0], v[2], v[4], v[6]};
const double * v3[4] = {v[0], v[3], v[5], v[4]};
const double * v4[4] = {v[0], v[4], v[5], v[6]};
double d45 = get_volume(v[0], p, v[4], v[5]);
double d56 = get_volume(v[0], p, v[5], v[6]);
double d64 = get_volume(v[0], p, v[6], v[4]);
double volume = get_volume(v4[0], v4[1], v4[2], v4[3]);
double count = 0.0;
val[0] = 0.0; val[1] = 0.0; val[2] = 0.0;
if (d45 <= ZERO) {
val[0] += co_det(v3, 2, 0)/volume;
val[1] += co_det(v3, 2, 1)/volume;
val[2] += co_det(v3, 2, 2)/volume;
count += 1.0;
}
if (d56 <= ZERO) {
val[0] += co_det(v1, 3, 0)/volume;
val[1] += co_det(v1, 3, 1)/volume;
val[2] += co_det(v1, 3, 2)/volume;
count += 1.0;
}
if (d64 <= ZERO) {
count += 1.0;
}
if (d45 >= -ZERO && d56 >= -ZERO && d64 >= -ZERO) {
val[0] += co_det(v4, 2, 0)/volume;
val[1] += co_det(v4, 2, 1)/volume;
val[2] += co_det(v4, 2, 2)/volume;
count += 1.0;
}
val[0] /= count; val[1] /= count; val[2] /= count;
}
void gradient_lambda_7(const double * p, const double ** v, void * value)
{
double * val = (double *)value;
const double * v1[4] = {v[0], v[1], v[6],
没有合适的资源?快使用搜索试试~ 我知道了~
AFEPack.tar.gz_AFEPack_Mesh_http-lwip_multi finite element_有限元
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 187 浏览量
2022-09-24
12:51:25
上传
评论
收藏 987KB GZ 举报
温馨提示
共484个文件
entries:58个
repository:58个
root:58个
主要特点 * Flexible finite element space construction based template element library 基于模板单元库灵活的构造有限元空间 * Convenient facilities to implement mesh adaption 很方便的进行网格加密和稀疏化 * Multi-mesh operation supported 支持多套网格操作 需要有一定的有限元基础和C++语言基础,最好在linux平台下用。 http://162.105.68.168/AFEPack/
资源推荐
资源详情
资源评论
收起资源包目录
AFEPack.tar.gz_AFEPack_Mesh_http-lwip_multi finite element_有限元 (484个子文件)
Makefile.1 571B
Makefile.am 627B
Makefile.am 109B
Makefile.am 97B
Makefile.am 16B
AUTHORS 810B
Makefile.bas_fun 1KB
triangle.DG.3.bas_fun 835B
triangle.3.bas_fun 805B
twin_triangle.2.bas_fun 762B
rectangle.2.bas_fun 720B
four_tetrahedron.1.bas_fun 611B
twin_tetrahedron.1.bas_fun 438B
triangle.DG.2.bas_fun 422B
twin_triangle.RT.1.bas_fun 414B
triangle.2.bas_fun 404B
twin_tetrahedron.1.D.bas_fun 359B
four_tetrahedron.1.D.bas_fun 359B
rectangle.RT.1.bas_fun 340B
tetrahedron.1.D.bas_fun 339B
twin_triangle.1.bas_fun 339B
tetrahedron.1.bas_fun 331B
rectangle.1.bas_fun 330B
twin_triangle.1.D.bas_fun 296B
triangle.1.D.bas_fun 284B
triangle.dual.0.bas_fun 273B
twin_triangle.DG.1.bas_fun 271B
triangle.morley.1.bas_fun 242B
triangle.DG.1.bas_fun 231B
triangle.RT.1.bas_fun 230B
interval.2.bas_fun 227B
triangle.1.bas_fun 221B
interval.1.bas_fun 139B
triangle.0.bas_fun 84B
twin_tetrahedron.0.bas_fun 83B
four_tetrahedron.0.bas_fun 83B
twin_triangle.0.bas_fun 83B
tetrahedron.0.bas_fun 78B
rectangle.0.bas_fun 71B
four_tetrahedron.1.bas_fun.c 9KB
twin_triangle.2.bas_fun.c 8KB
triangle.to3d.crd_trs.c 7KB
triangle.DG.3.bas_fun.c 6KB
triangle.3.bas_fun.c 6KB
rectangle.1.bas_fun.c 6KB
twin_tetrahedron.1.bas_fun.c 5KB
triangle.DG.2.bas_fun.c 4KB
triangle.2.bas_fun.c 4KB
rectangle.crd_trs.c 3KB
twin_tetrahedron.1.D.bas_fun.c 3KB
twin_triangle.1.bas_fun.c 3KB
four_tetrahedron.1.D.bas_fun.c 3KB
tetrahedron.1.D.bas_fun.c 3KB
tetrahedron.1.bas_fun.c 3KB
triangle.dual.0.bas_fun.c 3KB
four_tetrahedron.crd_trs.c 2KB
twin_tetrahedron.crd_trs.c 2KB
tetrahedron.crd_trs.c 2KB
triangle.crd_trs.c 2KB
triangle.morley.1.bas_fun.c 2KB
twin_triangle.DG.1.bas_fun.c 2KB
triangle.DG.1.bas_fun.c 2KB
twin_triangle.1.D.bas_fun.c 2KB
triangle.1.D.bas_fun.c 2KB
twin_triangle.crd_trs.c 2KB
triangle.1.bas_fun.c 2KB
interval.to2d.crd_trs.c 1KB
interval.2.bas_fun.c 1KB
interval.crd_trs.c 1KB
tetrahedron.out_nrm.c 949B
interval.1.bas_fun.c 805B
four_tetrahedron.0.bas_fun.c 483B
rectangle.0.bas_fun.c 482B
tetrahedron.0.bas_fun.c 478B
twin_tetrahedron.0.bas_fun.c 478B
twin_triangle.0.bas_fun.c 469B
triangle.0.bas_fun.c 460B
twin_tetrahedron.volume.c 443B
four_tetrahedron.volume.c 443B
tetrahedron.volume.c 438B
triangle.out_nrm.c 364B
rectangle.out_nrm.c 320B
twin_triangle.out_nrm.c 320B
rectangle.volume.c 227B
interval.volume.c 206B
twin_triangle.volume.c 144B
triangle.volume.c 139B
AFEPack.cfg 30KB
coefficient_possion_equation.cfg 2KB
2d.cfg 2KB
3d.cfg 1KB
possion_equation.cfg 1KB
ChangeLog 3KB
configure 176KB
COPYING 18KB
HGeometry.cpp 146KB
MovingMesh3D.cpp 44KB
MovingMesh.cpp 24KB
AMGSolver.cpp 21KB
FEMSpace.cpp 14KB
共 484 条
- 1
- 2
- 3
- 4
- 5
资源评论
寒泊
- 粉丝: 75
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功