|
9#
楼主 |
发表于 2015-11-12 23:15:04
|
只看该作者
本帖最后由 hipeilei 于 2015-11-12 23:16 编辑
感谢回答!这就是有限元的等参变换问题,你可能误解我的意思了,也怪我没说清楚,我这里选的坐标点(如下图)是整体坐标的,就是那个不规则四边形的四个点,我选择和等参单元一样的坐标是为了便于验证结果;
有限元的的等参变换是把不规则的四边形四个节点变成规则的四个节点坐标(如下图)
规则的四边形的四个节点如图,就和你说的一样。
问题来了:(这也是我程序实现要的目的):我这里想要做的事就是,给出一个不规则四边形里面任意一个点(上图左),找到在规则的四边形里面对应的点。过程用到了迭代的方法,这里不规则四边形的四个坐标已知,四边形内的坐标点(x0,y0)也已知,任取一个规则四边形内的坐标点(m,n)【相当于下图的kesi,yita】,我这里取的是(0,0),通过下面的式子
根据迭代的方法,知道满足一下条件:
就认为找到了对应的(kesi,yita),可是这一算法一直算不出来正确的结果,我已经修改了很多次了,这是最近一次修改,麻烦给看看:
program main
implicit none
real::x1=-1,y1=-1,x2=1,y2=-1,x3=1,y3=1,x4=1,y4=1
real:: x=0.3,y=0.3
real::m=0.2,n=0.3
real,dimension(2,2)::J
real::x0,y0,condition1,condition2,m0,n0
real:: N1=0,N2=0,N3=0,N4=0,a,b,c,d
!read(*,*)x1,y1,x2,y2,x3,y3,x4,y4
!read(*,*)x,y
call shapefunction(m,n,N1,N2,N3,N4)
x0=N1*x1+N2*x2+N3*x3+N4*x4
y0=N1*y1+N2*y2+N3*y3+N4*y4
!write(*,*)x0,y0
call Jacobi(x1,y1,x2,y2,x3,y3,x4,y4,m,n,a,b,c,d)
m0=m+J(1,1)*(x-x0)+J(1,2)*(y-y0)
n0=n+J(2,1)*(x-x0)+J(2,2)*(y-y0)
!write(*,*)m0,n0
condition1=m0-m
condition2=n0-n
do while((condition1)<0.001.and.abs(condition2)<0.001)
m=m0
n=n0
enddo
!write(*,*)a,b,c,d
!write(*,*)J(1,1),J(1,2),J(2,1),J(2,2)
write(*,*)m,n
pause
end
subroutine shapefunction(m,n,N1,N2,N3,N4)
implicit none
real:: m,n,N1,N2,N3,N4
N1=(1-m)*(1-n)/4
N2=(1+m)*(1-n)/4
N3=(1+m)*(1+n)/4
N4=(1-m)*(1+n)/4
write(*,*),"***********This is shapefuction!*******************"
write(*,"(4f10.2)")N1,N2,N3,N4
end subroutine shapefunction
subroutine Jacobi(x1,y1,x2,y2,x3,y3,x4,y4,m,n,a,b,c,d)
implicit none
real:: a,b,c,d,m,n
real,dimension(2,2)::J
real:: x1,y1,x2,y2,x3,y3,x4,y4
a=(x1*(-1+n)+x2*(1-n)+x3*(1+n)+x4*(-1-n))/4
b=(y1*(-1+n)+y2*(1-n)+y3*(1+n)+y4*(-1-n))/4
c=(x1*(-1+m)+x2*(-1-m)+x3*(1+m)+x4*(1-m))/4
d=(y1*(-1+m)+y2*(-1-m)+y3*(1+m)+y4*(1-m))/4
J(1,1)=d/(a*d-b*c)
J(1,2)=-b/(a*d-b*c)
J(2,1)=-c/(a*d-b*c)
J(2,2)=a/(a*d-c*b)
write(*,*),"***********This is Jacobi matrix!*******************"
write(*,"(4f10.2)")J(1,1),J(1,2),J(2,1),J(2,2)
end subroutine Jacobi
|
|