FE-Project
Loading...
Searching...
No Matches
scale_mesh_base3d.F90
Go to the documentation of this file.
1!-------------------------------------------------------------------------------
2!> module FElib / Mesh / Base 3D
3!!
4!! @par Description
5!! Base module to manage 3D meshes for element-based methods
6!!
7!! @author Yuta Kawai, Team SCALE
8!<
9#include "scaleFElib.h"
11
12 !-----------------------------------------------------------------------------
13 !
14 !++ used modules
15 !
16 use scale_precision
17
18 use scale_localmesh_3d, only: &
20 use scale_localmesh_2d, only: &
22 use scale_mesh_base, only: &
24 use scale_mesh_base2d, only: &
27
28 !-----------------------------------------------------------------------------
29 implicit none
30 private
31
32 !-----------------------------------------------------------------------------
33 !
34 !++ Public type & procedure
35 !
36 !> Derived type to manage a computational mesh (base type for 3D domain)
37 type, abstract, public, extends(meshbase) :: meshbase3d
38 type(localmesh3d), allocatable :: lcmesh_list(:)
39 type(elementbase3d), pointer :: refelem3d
40 contains
41 procedure(meshbase3d_generate), deferred :: generate
42 procedure(meshbase3d_getmesh2d), deferred :: getmesh2d
43 procedure(meshbase3d_set_geometric_with_vcoord), deferred :: set_geometric_with_vcoord
44 procedure :: getlocalmesh => meshbase3d_get_localmesh
45 end type meshbase3d
46
47 interface
48 subroutine meshbase3d_generate(this)
49 import meshbase3d
50 class(meshbase3d), intent(inout), target :: this
51 end subroutine meshbase3d_generate
52
53 subroutine meshbase3d_getmesh2d(this, ptr_mesh2D)
54 import meshbase3d
55 import meshbase2d
56 class(meshbase3d), intent(in), target :: this
57 class(meshbase2d), pointer, intent(out) :: ptr_mesh2D
58 end subroutine meshbase3d_getmesh2d
59
60 subroutine meshbase3d_set_geometric_with_vcoord(this, lcdomID, GsqrtV_lc, zlev_lc, G13_lc, G23_lc)
61 import rp
62 import meshbase3d
63 class(meshbase3d), intent(inout), target :: this
64 integer, intent(in) :: lcdomID
65 real(RP), intent(in) :: GsqrtV_lc(this%refElem3D%Np,this%lcmesh_list(lcdomID)%NeA)
66 real(RP), intent(in) :: zlev_lc(this%refElem3D%Np,this%lcmesh_list(lcdomID)%NeA)
67 real(RP), intent(in) :: G13_lc(this%refElem3D%Np,this%lcmesh_list(lcdomID)%NeA)
68 real(RP), intent(in) :: G23_lc(this%refElem3D%Np,this%lcmesh_list(lcdomID)%NeA)
69 end subroutine meshbase3d_set_geometric_with_vcoord
70 end interface
71
74
75 !-----------------------------------------------------------------------------
76 !
77 !++ Public parameters & variables
78 !
79 integer, public :: meshbase3d_dimtype_num = 8
80 integer, public :: meshbase3d_dimtypeid_x = 1
81 integer, public :: meshbase3d_dimtypeid_y = 2
82 integer, public :: meshbase3d_dimtypeid_z = 3
83 integer, public :: meshbase3d_dimtypeid_zt = 4
84 integer, public :: meshbase3d_dimtypeid_xy = 5
85 integer, public :: meshbase3d_dimtypeid_xyt = 6
86 integer, public :: meshbase3d_dimtypeid_xyz = 7
87 integer, public :: meshbase3d_dimtypeid_xyzt = 8
88
89 !-----------------------------------------------------------------------------
90 !
91 !++ Private procedure
92 !
93
94 !-----------------------------------------------------------------------------
95 !
96 !++ Private parameters & variables
97 !
98
99contains
100!OCL SERIAL
101 subroutine meshbase3d_init(this, &
102 refElem, NLocalMeshPerPrc, NsideTile, &
103 nproc, myrank )
104
105 implicit none
106
107 class(meshbase3d), intent(inout) :: this
108 class(elementbase3d), intent(in), target :: refelem
109 integer, intent(in) :: nlocalmeshperprc
110 integer, intent(in) :: nsidetile
111 integer, intent(in), optional :: nproc
112 integer, intent(in), optional :: myrank
113
114 integer :: n
115 !-----------------------------------------------------------------------------
116
117 this%refElem3D => refelem
118 call meshbase_init( this, &
119 meshbase3d_dimtype_num, refelem, &
120 nlocalmeshperprc, nsidetile, nproc )
121
122 allocate( this%lcmesh_list(this%LOCAL_MESH_NUM) )
123 do n=1, this%LOCAL_MESH_NUM
124 call localmesh3d_init( this%lcmesh_list(n), n, refelem, myrank )
125 end do
126
127 call this%SetDimInfo( meshbase3d_dimtypeid_x, "x", "m", "X-coordinate" )
128 call this%SetDimInfo( meshbase3d_dimtypeid_y, "y", "m", "Y-coordinate" )
129 call this%SetDimInfo( meshbase3d_dimtypeid_z, "z", "m", "Z-coordinate" )
130 call this%SetDimInfo( meshbase3d_dimtypeid_zt, "z", "m", "Z-coordinate" )
131 call this%SetDimInfo( meshbase3d_dimtypeid_xy, "xy", "m", "XY-coordinate" )
132 call this%SetDimInfo( meshbase3d_dimtypeid_xyt, "xyt", "m", "XY-coordinate" )
133 call this%SetDimInfo( meshbase3d_dimtypeid_xyz, "xyz", "m", "XYZ-coordinate" )
134 call this%SetDimInfo( meshbase3d_dimtypeid_xyzt, "xyzt", "m", "XYZ-coordinate" )
135
136 return
137 end subroutine meshbase3d_init
138
139!OCL SERIAL
140 subroutine meshbase3d_final( this )
141 implicit none
142 class(meshbase3d), intent(inout) :: this
143
144 integer :: n
145 !-----------------------------------------------------------------------------
146
147 if ( allocated ( this%lcmesh_list ) ) then
148 do n=1, this%LOCAL_MESH_NUM
149 call localmesh3d_final( this%lcmesh_list(n), this%isGenerated )
150 end do
151
152 deallocate( this%lcmesh_list )
153 end if
154
155 call meshbase_final(this)
156
157 return
158 end subroutine meshbase3d_final
159
160!OCL SERIAL
161 subroutine meshbase3d_get_localmesh( this, id, ptr_lcmesh )
163 implicit none
164
165 class(meshbase3d), target, intent(in) :: this
166 integer, intent(in) :: id
167 class(localmeshbase), pointer, intent(out) :: ptr_lcmesh
168 !-------------------------------------------------------------
169
170 ptr_lcmesh => this%lcmesh_list(id)
171 return
172 end subroutine meshbase3d_get_localmesh
173
174!OCL SERIAL
175 subroutine meshbase3d_setgeometricinfo( lcmesh, coord_conv, calc_normal )
177 implicit none
178
179 type(localmesh3d), intent(inout) :: lcmesh
180 interface
181 subroutine coord_conv( x, y, z, xX, xY, xZ, yX, yY, yZ, zX, zY, zZ, &
182 vx, vy, vz, elem )
183 import elementbase3d
184 import rp
185 type(elementbase3d), intent(in) :: elem
186 real(rp), intent(out) :: x(elem%np), y(elem%np), z(elem%np)
187 real(rp), intent(out) :: xx(elem%np), xy(elem%np), xz(elem%np)
188 real(rp), intent(out) :: yx(elem%np), yy(elem%np), yz(elem%np)
189 real(rp), intent(out) :: zx(elem%np), zy(elem%np), zz(elem%np)
190 real(rp), intent(in) :: vx(elem%nv), vy(elem%nv), vz(elem%nv)
191 end subroutine coord_conv
192 subroutine calc_normal( normal_fn, &
193 Escale_f, fid_h, fid_v, elem )
194 import elementbase3d
195 import rp
196 type(elementbase3d), intent(in) :: elem
197 real(rp), intent(out) :: normal_fn(elem%nfptot,3)
198 integer, intent(in) :: fid_h(elem%nfp_h,elem%nfaces_h)
199 integer, intent(in) :: fid_v(elem%nfp_v,elem%nfaces_v)
200 real(rp), intent(in) :: escale_f(elem%nfptot,3,3)
201 end subroutine calc_normal
202 end interface
203
204 class(elementbase3d), pointer :: refelem
205 integer :: ke, ke2d
206 integer :: f
207 integer :: i, j
208 integer :: d
209 integer :: fmask(lcmesh%refelem%nfptot)
210 integer :: fid_h(lcmesh%refelem3d%nfp_h,lcmesh%refelem3d%nfaces_h)
211 integer :: fid_v(lcmesh%refelem3d%nfp_v,lcmesh%refelem3d%nfaces_v)
212 real(rp) :: escale_f(lcmesh%refelem%nfptot,3,3)
213
214 integer :: node_ids(lcmesh%refelem%nv)
215 real(rp) :: vx(lcmesh%refelem%nv), vy(lcmesh%refelem%nv), vz(lcmesh%refelem%nv)
216 real(rp) :: xx(lcmesh%refelem%np), xy(lcmesh%refelem%np), xz(lcmesh%refelem%np)
217 real(rp) :: yx(lcmesh%refelem%np), yy(lcmesh%refelem%np), yz(lcmesh%refelem%np)
218 real(rp) :: zx(lcmesh%refelem%np), zy(lcmesh%refelem%np), zz(lcmesh%refelem%np)
219 !-----------------------------------------------------------------------------
220
221 refelem => lcmesh%refElem3D
222
223 call meshbase_setgeometricinfo( lcmesh, 3 )
224
225 allocate( lcmesh%zS(refelem%Np,lcmesh%Ne) )
226 allocate( lcmesh%Sz(refelem%Np,lcmesh%Ne) )
227 allocate( lcmesh%zlev(refelem%Np,lcmesh%Ne) )
228 allocate( lcmesh%gam(refelem%Np,lcmesh%NeA) )
229 allocate( lcmesh%GsqrtH(refelem%Nfp_v,lcmesh%Ne2D) )
230 allocate( lcmesh%G_ij(refelem%Nfp_v,lcmesh%Ne2D,2,2) )
231 allocate( lcmesh%GIJ (refelem%Nfp_v,lcmesh%Ne2D,2,2) )
232 allocate( lcmesh%GI3 (refelem%Np,lcmesh%NeA,2) )
233 allocate( lcmesh%lon2D(refelem%Nfp_v,lcmesh%Ne2D) )
234 allocate( lcmesh%lat2D(refelem%Nfp_v,lcmesh%Ne2D) )
235 !$acc enter data create( lcmesh%zS, lcmesh%Sz, lcmesh%zlev, lcmesh%gam, &
236 !$acc lcmesh%GsqrtH, lcmesh%G_ij, lcmesh%GIJ, lcmesh%GI3, &
237 !$acc lcmesh%lon2D, lcmesh%lat2D )
238
239 do f=1, refelem%Nfaces_h
240 do i=1, refelem%Nfp_h
241 fid_h(i,f) = i + (f-1)*refelem%Nfp_h
242 fmask(fid_h(i,f)) = refelem%Fmask_h(i,f)
243 end do
244 end do
245 do f=1, refelem%Nfaces_v
246 do i=1, refelem%Nfp_v
247 fid_v(i,f) = i + refelem%Nfaces_h*refelem%Nfp_h + (f-1)*refelem%Nfp_v
248 fmask(fid_v(i,f)) = refelem%Fmask_v(i,f)
249 end do
250 end do
251
252 !$omp parallel private( ke, node_ids, vx, vy, vz, &
253 !$omp xX, xY, xZ, yX, yY, yZ, zX, zY, zZ, &
254 !$omp i, j, Escale_f, d )
255
256 !$omp do
257 do ke=1, lcmesh%Ne
258 node_ids(:) = lcmesh%EToV(ke,:)
259 vx(:) = lcmesh%pos_ev(node_ids(:),1)
260 vy(:) = lcmesh%pos_ev(node_ids(:),2)
261 vz(:) = lcmesh%pos_ev(node_ids(:),3)
262 call coord_conv( &
263 lcmesh%pos_en(:,ke,1), lcmesh%pos_en(:,ke,2), lcmesh%pos_en(:,ke,3), & ! (out)
264 xx, xy, xz, yx, yy, yz, zx, zy, zz, & ! (out)
265 vx, vy, vz, refelem ) ! (in)
266
267 lcmesh%J(:,ke) = xx(:)*(yy(:)*zz(:) - zy(:)*yz) &
268 - yx(:)*(xy(:)*zz(:) - zy(:)*xz) &
269 + zx(:)*(xy(:)*yz(:) - yy(:)*xz)
270
271 lcmesh%Escale(:,ke,1,1) = (yy(:)*zz(:) - zy(:)*yz(:))/lcmesh%J(:,ke)
272 lcmesh%Escale(:,ke,1,2) = - (xy(:)*zz(:) - zy(:)*xz(:))/lcmesh%J(:,ke)
273 lcmesh%Escale(:,ke,1,3) = (xy(:)*yz(:) - yy(:)*xz(:))/lcmesh%J(:,ke)
274
275 lcmesh%Escale(:,ke,2,1) = - (yx(:)*zz(:) - zx(:)*yz(:))/lcmesh%J(:,ke)
276 lcmesh%Escale(:,ke,2,2) = (xx(:)*zz(:) - zx(:)*xz(:))/lcmesh%J(:,ke)
277 lcmesh%Escale(:,ke,2,3) = - (xx(:)*yz(:) - yx(:)*xz(:))/lcmesh%J(:,ke)
278
279 lcmesh%Escale(:,ke,3,1) = (yx(:)*zy(:) - zx(:)*yy(:))/lcmesh%J(:,ke)
280 lcmesh%Escale(:,ke,3,2) = - (xx(:)*zy(:) - zx(:)*xy(:))/lcmesh%J(:,ke)
281 lcmesh%Escale(:,ke,3,3) = (xx(:)*yy(:) - yx(:)*xy(:))/lcmesh%J(:,ke)
282
283 !* Face
284
285 !
286 !mesh%fx(:,n) = mesh%x(fmask(:),n)
287 !mesh%fy(:,n) = mesh%y(fmask(:),n)
288
289 ! Calculate normal vectors
290 do j=1, 3
291 do i=1, 3
292 escale_f(:,i,j) = lcmesh%Escale(fmask(:),ke,i,j)
293 end do
294 end do
295 call calc_normal( lcmesh%normal_fn(:,ke,:), & ! (out)
296 escale_f, fid_h, fid_v, refelem ) ! (in)
297
298 lcmesh%sJ(:,ke) = sqrt( &
299 lcmesh%normal_fn(:,ke,1)**2 + lcmesh%normal_fn(:,ke,2)**2 + lcmesh%normal_fn(:,ke,3)**2 )
300 do d=1, 3
301 lcmesh%normal_fn(:,ke,d) = lcmesh%normal_fn(:,ke,d)/lcmesh%sJ(:,ke)
302 end do
303 lcmesh%sJ(:,ke) = lcmesh%sJ(:,ke)*lcmesh%J(fmask(:),ke)
304
305 lcmesh%Fscale(:,ke) = lcmesh%sJ(:,ke)/lcmesh%J(fmask(:),ke)
306 lcmesh%zlev(:,ke) = lcmesh%pos_en(:,ke,3)
307 end do
308 !$omp end do
309 !$acc update device(lcmesh%pos_en, lcmesh%normal_fn, lcmesh%sJ, lcmesh%J, lcmesh%Escale, lcmesh%Fscale, lcmesh%zlev)
310
311 !$omp workshare
312 lcmesh%Gsqrt (:,:) = 1.0_rp
313 lcmesh%GsqrtH(:,:) = 1.0_rp
314 lcmesh%GIJ (:,:,1,1) = 1.0_rp
315 lcmesh%GIJ (:,:,2,1) = 0.0_rp
316 lcmesh%GIJ (:,:,1,2) = 0.0_rp
317 lcmesh%GIJ (:,:,2,2) = 1.0_rp
318 lcmesh%G_ij (:,:,1,1) = 1.0_rp
319 lcmesh%G_ij (:,:,2,1) = 0.0_rp
320 lcmesh%G_ij (:,:,1,2) = 0.0_rp
321 lcmesh%G_ij (:,:,2,2) = 1.0_rp
322 lcmesh%GI3 (:,:,1) = 0.0_rp
323 lcmesh%GI3 (:,:,2) = 0.0_rp
324 lcmesh%gam (:,:) = 1.0_rp
325 !$omp end workshare
326 !$acc update device(lcmesh%Gsqrt, lcmesh%GsqrtH, lcmesh%GIJ, lcmesh%G_ij, lcmesh%GI3, lcmesh%gam)
327
328 !$omp end parallel
329
330 return
331 end subroutine meshbase3d_setgeometricinfo
332
333end module scale_mesh_base3d
module FElib / Element / Base
module FElib / Mesh / Local 2D
module FElib / Mesh / Local 3D
subroutine, public localmesh3d_final(this, is_generated)
Finalize an object to manage a 3D local computational domain.
subroutine, public localmesh3d_init(this, lcdomid, refelem, myrank)
Initialize an object to manage a 3D local computational domain.
module FElib / Mesh / Local, Base
module FElib / Mesh / Base 2D
module FElib / Mesh / Base 3D
subroutine, public meshbase3d_init(this, refelem, nlocalmeshperprc, nsidetile, nproc, myrank)
integer, public meshbase3d_dimtypeid_y
integer, public meshbase3d_dimtypeid_zt
integer, public meshbase3d_dimtypeid_z
integer, public meshbase3d_dimtype_num
subroutine, public meshbase3d_final(this)
integer, public meshbase3d_dimtypeid_xy
subroutine, public meshbase3d_setgeometricinfo(lcmesh, coord_conv, calc_normal)
integer, public meshbase3d_dimtypeid_xyt
integer, public meshbase3d_dimtypeid_xyz
integer, public meshbase3d_dimtypeid_x
integer, public meshbase3d_dimtypeid_xyzt
module FElib / Mesh / Base
subroutine, public meshbase_final(this)
Finalize an object to manage a computational mesh.
subroutine, public meshbase_setgeometricinfo(mesh, ndim)
subroutine, public meshbase_init(this, ndimtype, refelem, nlocalmeshperprc, nsidetile, nprocs)
Initialize an object to manage a computational mesh.
Derived type representing a 3D reference element.
Derived type representing a local mesh for 2D domain.
Derived type to manage a local 3D computational domain.
Derived type to manage a local computational domain (base type)
Derived type to manage a computational mesh (base type for 2D domain)
Derived type to manage a computational mesh (base type for 3D domain)
Base type to manage a computational mesh.