FE-Project
Loading...
Searching...
No Matches
scale_mesh_base3d Module Reference

module FElib / Mesh / Base 3D More...

Data Types

type  meshbase3d
 Derived type to manage a computational mesh (base type for 3D domain) More...
interface  meshbase3d_generate

Functions/Subroutines

subroutine, public meshbase3d_init (this, refelem, nlocalmeshperprc, nsidetile, nproc, myrank)
subroutine, public meshbase3d_final (this)
subroutine, public meshbase3d_setgeometricinfo (lcmesh, coord_conv, calc_normal)

Variables

integer, public meshbase3d_dimtype_num = 8
integer, public meshbase3d_dimtypeid_x = 1
integer, public meshbase3d_dimtypeid_y = 2
integer, public meshbase3d_dimtypeid_z = 3
integer, public meshbase3d_dimtypeid_zt = 4
integer, public meshbase3d_dimtypeid_xy = 5
integer, public meshbase3d_dimtypeid_xyt = 6
integer, public meshbase3d_dimtypeid_xyz = 7
integer, public meshbase3d_dimtypeid_xyzt = 8

Detailed Description

module FElib / Mesh / Base 3D

Description
Base module to manage 3D meshes for element-based methods
Author
Yuta Kawai, Team SCALE

Function/Subroutine Documentation

◆ meshbase3d_init()

subroutine, public scale_mesh_base3d::meshbase3d_init ( class(meshbase3d), intent(inout) this,
class(elementbase3d), intent(in), target refelem,
integer, intent(in) nlocalmeshperprc,
integer, intent(in) nsidetile,
integer, intent(in), optional nproc,
integer, intent(in), optional myrank )

Definition at line 101 of file scale_mesh_base3d.F90.

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

References scale_localmesh_3d::localmesh3d_init(), meshbase3d_dimtype_num, meshbase3d_dimtypeid_x, meshbase3d_dimtypeid_xy, meshbase3d_dimtypeid_xyt, meshbase3d_dimtypeid_xyz, meshbase3d_dimtypeid_xyzt, meshbase3d_dimtypeid_y, meshbase3d_dimtypeid_z, meshbase3d_dimtypeid_zt, and scale_mesh_base::meshbase_init().

Referenced by scale_mesh_base3d::meshbase3d_generate::meshbase3d_generate(), scale_mesh_cubedom3d::meshcubedom3d_init(), and scale_mesh_cubedspheredom3d::meshcubedspheredom3d_init().

◆ meshbase3d_final()

subroutine, public scale_mesh_base3d::meshbase3d_final ( class(meshbase3d), intent(inout) this)

Definition at line 140 of file scale_mesh_base3d.F90.

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

References scale_localmesh_3d::localmesh3d_final(), and scale_mesh_base::meshbase_final().

Referenced by scale_mesh_base3d::meshbase3d_generate::meshbase3d_generate(), scale_mesh_cubedom3d::meshcubedom3d_init(), and scale_mesh_cubedspheredom3d::meshcubedspheredom3d_init().

◆ meshbase3d_setgeometricinfo()

subroutine, public scale_mesh_base3d::meshbase3d_setgeometricinfo ( type(localmesh3d), intent(inout) lcmesh,
external subroutine(real(rp), dimension(elem%np), intent(out) x, real(rp), dimension(elem%np), intent(out) y, real(rp), dimension(elem%np), intent(out) z, real(rp), dimension(elem%np), intent(out) xx, real(rp), dimension(elem%np), intent(out) xy, real(rp), dimension(elem%np), intent(out) xz, real(rp), dimension(elem%np), intent(out) yx, real(rp), dimension(elem%np), intent(out) yy, real(rp), dimension(elem%np), intent(out) yz, real(rp), dimension(elem%np), intent(out) zx, real(rp), dimension(elem%np), intent(out) zy, real(rp), dimension(elem%np), intent(out) zz, real(rp), dimension(elem%nv), intent(in) vx, real(rp), dimension(elem%nv), intent(in) vy, real(rp), dimension(elem%nv), intent(in) vz, type(elementbase3d), intent(in) elem) coord_conv,
external subroutine(real(rp), dimension(elem%nfptot,3), intent(out) normal_fn, real(rp), dimension(elem%nfptot,3,3), intent(in) escale_f, integer, dimension(elem%nfp_h,elem%nfaces_h), intent(in) fid_h, integer, dimension(elem%nfp_v,elem%nfaces_v), intent(in) fid_v, type(elementbase3d), intent(in) elem) calc_normal )

Definition at line 175 of file scale_mesh_base3d.F90.

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
module FElib / Mesh / Base
subroutine, public meshbase_setgeometricinfo(mesh, ndim)

References scale_mesh_base::meshbase_setgeometricinfo().

Referenced by scale_mesh_base3d::meshbase3d_generate::meshbase3d_generate(), scale_mesh_cubedom3d::meshcubedom3d_init(), and scale_mesh_cubedspheredom3d::meshcubedspheredom3d_init().

Variable Documentation

◆ meshbase3d_dimtype_num

integer, public scale_mesh_base3d::meshbase3d_dimtype_num = 8

Definition at line 79 of file scale_mesh_base3d.F90.

79 integer, public :: MESHBASE3D_DIMTYPE_NUM = 8

Referenced by scale_file_history_meshfield::file_history_meshfield_in::file_history_meshfield_in3d(), and meshbase3d_init().

◆ meshbase3d_dimtypeid_x

◆ meshbase3d_dimtypeid_y

◆ meshbase3d_dimtypeid_z

◆ meshbase3d_dimtypeid_zt

◆ meshbase3d_dimtypeid_xy

integer, public scale_mesh_base3d::meshbase3d_dimtypeid_xy = 5

◆ meshbase3d_dimtypeid_xyt

integer, public scale_mesh_base3d::meshbase3d_dimtypeid_xyt = 6

◆ meshbase3d_dimtypeid_xyz

◆ meshbase3d_dimtypeid_xyzt