FE-Project
Loading...
Searching...
No Matches
scale_mesh_base2d.F90
Go to the documentation of this file.
1!-------------------------------------------------------------------------------
2!> module FElib / Mesh / Base 2D
3!!
4!! @par Description
5!! Base module to manage 2D 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_2d, only: &
20
21 use scale_mesh_base, only: &
23
25
26 !-----------------------------------------------------------------------------
27 implicit none
28 private
29
30 !-----------------------------------------------------------------------------
31 !
32 !++ Public type & procedure
33 !
34 !> Derived type to manage a computational mesh (base type for 2D domain)
35 type, abstract, public, extends(meshbase) :: meshbase2d
36 type(localmesh2d), allocatable :: lcmesh_list(:) !< Array of local meshes in each MPI process
37 type(elementbase2d), pointer :: refelem2d !< Pointer to an object with a reference element for 2D
38 contains
39 procedure(meshbase2d_generate), deferred :: generate
40 procedure :: getlocalmesh => meshbase2d_get_localmesh
41 end type meshbase2d
42
43 interface
44 subroutine meshbase2d_generate(this)
45 import meshbase2d
46 class(meshbase2d), intent(inout), target :: this
47 end subroutine meshbase2d_generate
48 end interface
49
52
53 !-----------------------------------------------------------------------------
54 !
55 !++ Public parameters & variables
56 !
57 integer, public :: meshbase2d_dimtype_num = 4
58 integer, public :: meshbase2d_dimtypeid_x = 1
59 integer, public :: meshbase2d_dimtypeid_y = 2
60 integer, public :: meshbase2d_dimtypeid_xy = 3
61 integer, public :: meshbase2d_dimtypeid_xyt = 4
62
63 !-----------------------------------------------------------------------------
64 !
65 !++ Private procedure
66 !
67
68 !-----------------------------------------------------------------------------
69 !
70 !++ Private parameters & variables
71 !
72
73contains
74 !> Initialize an object to manage a 2D computational mesh
75!OCL SERIAL
76 subroutine meshbase2d_init(this, &
77 refElem, NLocalMeshPerPrc, &
78 nprocs, myrank )
79
80 implicit none
81 class(meshbase2d), intent(inout) :: this
82 class(elementbase2d), intent(in), target :: refelem
83 integer, intent(in) :: nlocalmeshperprc
84 integer, intent(in), optional :: nprocs
85 integer, intent(in), optional :: myrank
86
87 integer :: n
88 !-----------------------------------------------------------------------------
89
90 this%refElem2D => refelem
91 call meshbase_init( this, &
92 meshbase2d_dimtype_num, refelem, &
93 nlocalmeshperprc, 4, &
94 nprocs )
95
96 allocate( this%lcmesh_list(this%LOCAL_MESH_NUM) )
97 do n=1, this%LOCAL_MESH_NUM
98 call localmesh2d_init( this%lcmesh_list(n), n, refelem, myrank )
99 end do
100
101 call this%SetDimInfo( meshbase2d_dimtypeid_x, "x", "m", "X-coordinate" )
102 call this%SetDimInfo( meshbase2d_dimtypeid_y, "y", "m", "Y-coordinate" )
103 call this%SetDimInfo( meshbase2d_dimtypeid_xy, "xy", "m", "XY-coordinate" )
104 call this%SetDimInfo( meshbase2d_dimtypeid_xyt, "xyt", "m", "XY-coordinate" )
105
106 return
107 end subroutine meshbase2d_init
108
109 !> Finalize an object to manage a 2D computational mesh
110!OCL SERIAL
111 subroutine meshbase2d_final( this )
112 implicit none
113 class(meshbase2d), intent(inout) :: this
114 integer :: n
115 !-----------------------------------------------------------------------------
116
117 if ( allocated ( this%lcmesh_list ) ) then
118 do n=1, this%LOCAL_MESH_NUM
119 call localmesh2d_final( this%lcmesh_list(n), this%isGenerated )
120 end do
121
122 deallocate( this%lcmesh_list )
123 end if
124
125 call meshbase_final(this)
126
127 return
128 end subroutine meshbase2d_final
129
130!OCL SERIAL
131 subroutine meshbase2d_get_localmesh( this, id, ptr_lcmesh )
133 implicit none
134 class(meshbase2d), target, intent(in) :: this
135 integer, intent(in) :: id
136 class(localmeshbase), pointer, intent(out) :: ptr_lcmesh
137 !-------------------------------------------------------------
138
139 ptr_lcmesh => this%lcmesh_list(id)
140 return
141 end subroutine meshbase2d_get_localmesh
142
143!OCL SERIAL
144 subroutine meshbase2d_setgeometricinfo( lcmesh, coord_conv, calc_normal )
146 implicit none
147 type(localmesh2d), intent(inout) :: lcmesh
148 interface
149 subroutine coord_conv( x, y, xr, xs, yr, ys, &
150 vx, vy, elem )
151 import elementbase2d
152 import rp
153 type(elementbase2d), intent(in) :: elem
154 real(rp), intent(out) :: x(elem%np), y(elem%np)
155 real(rp), intent(out) :: xr(elem%np), xs(elem%np), yr(elem%np), ys(elem%np)
156 real(rp), intent(in) :: vx(elem%nv), vy(elem%nv)
157 end subroutine coord_conv
158 subroutine calc_normal( normal_fn, &
159 Escale_f, fid, elem )
160 import elementbase2d
161 import rp
162 type(elementbase2d), intent(in) :: elem
163 real(rp), intent(out) :: normal_fn(elem%nfptot,2)
164 integer, intent(in) :: fid(elem%nfp,elem%nfaces)
165 real(rp), intent(in) :: escale_f(elem%nfptot,2,2)
166 end subroutine calc_normal
167 end interface
168
169 class(elementbase2d), pointer :: refelem
170 integer :: ke
171 integer :: f
172 integer :: i, j
173 integer :: d
174 integer :: node_ids(lcmesh%refelem%nv)
175 real(rp) :: vx(lcmesh%refelem%nv), vy(lcmesh%refelem%nv)
176 real(rp) :: xr(lcmesh%refelem%np), xs(lcmesh%refelem%np)
177 real(rp) :: yr(lcmesh%refelem%np), ys(lcmesh%refelem%np)
178 integer :: fmask(lcmesh%refelem%nfptot)
179 integer :: fid(lcmesh%refelem2d%nfp,lcmesh%refelem2d%nfaces)
180 real(rp) :: escale_f(lcmesh%refelem%nfptot,2,2)
181
182 !-----------------------------------------------------------------------------
183
184 refelem => lcmesh%refElem2D
185
186 call meshbase_setgeometricinfo(lcmesh, 2)
187
188 allocate( lcmesh%G_ij(refelem%Np,lcmesh%Ne,2,2) )
189 allocate( lcmesh%GIJ (refelem%Np,lcmesh%Ne,2,2) )
190 allocate( lcmesh%lon(refelem%Np,lcmesh%Ne) )
191 allocate( lcmesh%lat(refelem%Np,lcmesh%Ne) )
192 !$acc enter data create(lcmesh%G_ij, lcmesh%GIJ, lcmesh%lon, lcmesh%lat)
193
194 fmask(:) = reshape(refelem%Fmask, shape(fmask))
195 do f=1, refelem%Nfaces
196 do i=1, refelem%Nfp
197 fid(i,f) = i + (f-1)*refelem%Nfp
198 end do
199 end do
200
201 do ke=1, lcmesh%Ne
202 node_ids(:) = lcmesh%EToV(ke,:)
203 vx(:) = lcmesh%pos_ev(node_ids(:),1)
204 vy(:) = lcmesh%pos_ev(node_ids(:),2)
205 call coord_conv( &
206 lcmesh%pos_en(:,ke,1), lcmesh%pos_en(:,ke,2), xr, xs, yr, ys, & ! (out)
207 vx, vy, refelem ) ! (in)
208
209 lcmesh%J(:,ke) = - xs*yr + xr*ys
210
211 lcmesh%Escale(:,ke,1,1) = ys/lcmesh%J(:,ke)
212 lcmesh%Escale(:,ke,1,2) = - xs/lcmesh%J(:,ke)
213 lcmesh%Escale(:,ke,2,1) = - yr/lcmesh%J(:,ke)
214 lcmesh%Escale(:,ke,2,2) = xr/lcmesh%J(:,ke)
215
216 !* Face
217
218 !
219 !mesh%fx(:,n) = mesh%x(fmask(:),n)
220 !mesh%fy(:,n) = mesh%y(fmask(:),n)
221
222 ! Calculate normal vectors
223 do j=1, 2
224 do i=1, 2
225 escale_f(:,i,j) = lcmesh%Escale(fmask(:),ke,i,j)
226 end do
227 end do
228
229 call calc_normal( lcmesh%normal_fn(:,ke,:), & ! (out)
230 escale_f, fid, refelem ) ! (in)
231
232 lcmesh%sJ(:,ke) = sqrt( lcmesh%normal_fn(:,ke,1)**2 + lcmesh%normal_fn(:,ke,2)**2 )
233 do d=1, 2
234 lcmesh%normal_fn(:,ke,d) = lcmesh%normal_fn(:,ke,d)/lcmesh%sJ(:,ke)
235 end do
236 lcmesh%sJ(:,ke) = lcmesh%sJ(:,ke)*lcmesh%J(fmask(:),ke)
237
238 lcmesh%Fscale(:,ke) = lcmesh%sJ(:,ke)/lcmesh%J(fmask(:),ke)
239 end do
240 !$acc update device(lcmesh%pos_en, lcmesh%normal_fn, lcmesh%sJ, lcmesh%J, lcmesh%Escale, lcmesh%Fscale)
241
242 !$omp parallel
243 !$omp workshare
244 lcmesh%Gsqrt (:,:) = 1.0_rp
245 lcmesh%GIJ (:,:,1,1) = 1.0_rp
246 lcmesh%GIJ (:,:,2,1) = 0.0_rp
247 lcmesh%GIJ (:,:,1,2) = 0.0_rp
248 lcmesh%GIJ (:,:,2,2) = 1.0_rp
249 lcmesh%G_ij (:,:,1,1) = 1.0_rp
250 lcmesh%G_ij (:,:,2,1) = 0.0_rp
251 lcmesh%G_ij (:,:,1,2) = 0.0_rp
252 lcmesh%G_ij (:,:,2,2) = 1.0_rp
253 !$omp end workshare
254 !$omp end parallel
255 !$acc update device(lcmesh%Gsqrt, lcmesh%GIJ, lcmesh%G_ij)
256
257 return
258 end subroutine meshbase2d_setgeometricinfo
259
260end module scale_mesh_base2d
module FElib / Element / Base
module FElib / Mesh / Local 2D
subroutine, public localmesh2d_final(this, is_generated)
Finalize an object to manage a local mesh for 2D domain.
subroutine, public localmesh2d_init(this, lcdomid, refelem, myrank)
Initialize an object to manage a local mesh for 2D domain.
module FElib / Mesh / Local, Base
module FElib / Mesh / Base 2D
subroutine, public meshbase2d_final(this)
Finalize an object to manage a 2D computational mesh.
subroutine, public meshbase2d_init(this, refelem, nlocalmeshperprc, nprocs, myrank)
Initialize an object to manage a 2D computational mesh.
subroutine, public meshbase2d_setgeometricinfo(lcmesh, coord_conv, calc_normal)
integer, public meshbase2d_dimtypeid_xy
integer, public meshbase2d_dimtypeid_xyt
integer, public meshbase2d_dimtypeid_x
integer, public meshbase2d_dimtype_num
integer, public meshbase2d_dimtypeid_y
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 2D reference element.
Derived type representing a local mesh for 2D domain.
Derived type to manage a local computational domain (base type)
Derived type to manage a computational mesh (base type for 2D domain)
Base type to manage a computational mesh.