SPEED
GET_PNT_POS_PGM.f90
Go to the documentation of this file.
1! Copyright (C) 2012 The SPEED FOUNDATION
2! Author: Ilario Mazzieri
3!
4! This file is part of SPEED.
5!
6! SPEED is free software; you can redistribute it and/or modify it
7! under the terms of the GNU Affero General Public License as
8! published by the Free Software Foundation, either version 3 of the
9! License, or (at your option) any later version.
10!
11! SPEED is distributed in the hope that it will be useful, but
12! WITHOUT ANY WARRANTY; without even the implied warranty of
13! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14! Affero General Public License for more details.
15!
16! You should have received a copy of the GNU Affero General Public License
17! along with SPEED. If not, see <http://www.gnu.org/licenses/>.
18
57
58 subroutine get_pnt_pos_pgm(nb_el,&
59 AA11,AA12,AA13,AA21,AA22,AA23,&
60 AA31,AA32,AA33,BB11,BB12,BB13,&
61 BB21,BB22,BB23,BB31,BB32,BB33,&
62 GG1,GG2,GG3,DD1,DD2,DD3,&
63 x_true,y_true,z_true,el,xref,yref,zref,&
64 highest,elevation)
65
66 implicit none
67
68 integer*4 :: nb_el,el
69 integer*4 :: inr,ie
70
71 real*8 :: x_true,y_true,z_true,xref,yref,zref
72 real*8 :: csi,eta,zeta,delta_csi,delta_eta,delta_zeta,dist,dist_min
73 real*8 :: termx,termy,termz,det_j
74 real*8 :: dxdx,dxdy,dxdz
75 real*8 :: dydx,dydy,dydz
76 real*8 :: dzdx,dzdy,dzdz
77 real*8 :: a11,a12,a13
78 real*8 :: a21,a22,a23
79 real*8 :: a31,a32,a33
80 real*8 :: elevation
81
82 real*8, dimension(nb_el) :: aa11,aa12,aa13
83 real*8, dimension(nb_el) :: aa21,aa22,aa23
84 real*8, dimension(nb_el) :: aa31,aa32,aa33
85 real*8, dimension(nb_el) :: bb11,bb12,bb13
86 real*8, dimension(nb_el) :: bb21,bb22,bb23
87 real*8, dimension(nb_el) :: bb31,bb32,bb33
88 real*8, dimension(nb_el) :: gg1,gg2,gg3
89 real*8, dimension(nb_el) :: dd1,dd2,dd3
90 real*8, dimension(nb_el) :: highest
91
92 dist_min = 1.0e20
93 xref = 0.0; yref = 0.0; zref = 0.0
94 el = 1
95
96 do ie = 1,nb_el
97 if (highest(ie) .gt. elevation) then
98 csi = 0.0; eta = 0.0; zeta = 0.0
99
100 do inr = 1, 100
101 dxdx = aa11(ie) + bb12(ie)*zeta + bb13(ie)*eta + gg1(ie)*eta*zeta
102 dydx = aa21(ie) + bb22(ie)*zeta + bb23(ie)*eta + gg2(ie)*eta*zeta
103 dzdx = aa31(ie) + bb32(ie)*zeta + bb33(ie)*eta + gg3(ie)*eta*zeta
104
105 dxdy = aa12(ie) + bb11(ie)*zeta + bb13(ie)*csi + gg1(ie)*zeta*csi
106 dydy = aa22(ie) + bb21(ie)*zeta + bb23(ie)*csi + gg2(ie)*zeta*csi
107 dzdy = aa32(ie) + bb31(ie)*zeta + bb33(ie)*csi + gg3(ie)*zeta*csi
108
109 dxdz = aa13(ie) + bb11(ie)*eta + bb12(ie)*csi + gg1(ie)*csi*eta
110 dydz = aa23(ie) + bb21(ie)*eta + bb22(ie)*csi + gg2(ie)*csi*eta
111 dzdz = aa33(ie) + bb31(ie)*eta + bb32(ie)*csi + gg3(ie)*csi*eta
112
113 det_j = dxdz * (dydx*dzdy - dzdx*dydy) - dydz * (dxdx*dzdy - dzdx*dxdy) &
114 + dzdz * (dxdx*dydy - dydx*dxdy)
115
116
117 a11 = +dydy*dzdz -dydz*dzdy
118 a12 = -dydx*dzdz +dydz*dzdx
119 a13 = +dydx*dzdy -dydy*dzdx
120
121 a21 = -dxdy*dzdz +dxdz*dzdy
122 a22 = +dxdx*dzdz -dxdz*dzdx
123 a23 = -dxdx*dzdy +dxdy*dzdx
124
125 a31 = +dxdy*dydz -dxdz*dydy
126 a32 = -dxdx*dydz +dxdz*dydx
127 a33 = +dxdx*dydy -dxdy*dydx
128
129 termx = aa11(ie)*csi + aa12(ie)*eta &
130 + aa13(ie)*zeta + bb11(ie)*eta*zeta &
131 + bb12(ie)*csi*zeta + bb13(ie)*csi*eta &
132 + gg1(ie)*csi*eta*zeta + dd1(ie) -x_true
133
134 termy = aa21(ie)*csi + aa22(ie)*eta &
135 + aa23(ie)*zeta + bb21(ie)*eta*zeta &
136 + bb22(ie)*csi*zeta + bb23(ie)*csi*eta &
137 + gg2(ie)*csi*eta*zeta + dd2(ie) -y_true
138
139 termz = aa31(ie)*csi + aa32(ie)*eta &
140 + aa33(ie)*zeta + bb31(ie)*eta*zeta &
141 + bb32(ie)*csi*zeta + bb33(ie)*csi*eta &
142 + gg3(ie)*csi*eta*zeta + dd3(ie) -z_true
143
144 delta_csi = -(a11*termx +a21*termy +a31*termz) / det_j
145 delta_eta = -(a12*termx +a22*termy +a32*termz) / det_j
146 delta_zeta = -(a13*termx +a23*termy +a33*termz) / det_j
147
148 csi = csi + delta_csi
149 eta = eta + delta_eta
150 zeta = zeta + delta_zeta
151
152 if (csi.lt.-1.0) csi = -1.0
153 if (csi.gt. 1.0) csi = 1.0
154 if (eta.lt.-1.0) eta = -1.0
155 if (eta.gt. 1.0) eta = 1.0
156 if (zeta.lt.-1.0) zeta = -1.0
157 if (zeta.gt. 1.0) zeta = 1.0
158
159 enddo
160
161 dist = termx*termx +termy*termy +termz*termz
162
163 if (dist.lt.dist_min) then
164 el = ie
165 xref = csi
166 yref = eta
167 zref = zeta
168 dist_min = dist
169 endif
170
171 endif !if (highest(ie).gt.elevation) then
172
173 enddo !do ie = 1,nb_el
174
175 return
176
177 end subroutine get_pnt_pos_pgm
178
subroutine get_pnt_pos_pgm(nb_el, aa11, aa12, aa13, aa21, aa22, aa23, aa31, aa32, aa33, bb11, bb12, bb13, bb21, bb22, bb23, bb31, bb32, bb33, gg1, gg2, gg3, dd1, dd2, dd3, x_true, y_true, z_true, el, xref, yref, zref,
Findes node coordinates in the reference element.