48 real(rp),
allocatable :: sz(:,:)
49 real(rp),
allocatable :: zs(:,:)
50 real(rp),
allocatable :: gi3(:,:,:)
51 real(rp),
allocatable :: gsqrth(:,:)
52 real(rp),
allocatable :: zlev(:,:)
53 real(rp),
allocatable :: gam(:,:)
56 real(rp),
allocatable :: lon2d(:,:)
57 real(rp),
allocatable :: lat2d(:,:)
59 integer,
allocatable :: emap3dto2d(:)
61 procedure :: setlocalmesh2d => localmesh3d_setlocalmesh2d
62 procedure :: getvmapz1d => localmesh3d_getvmapz1d
63 procedure :: getvmapz3d => localmesh3d_getvmapz3d
87 lcdomID, refElem, myrank )
91 integer,
intent(in) :: lcdomid
93 integer,
intent(in),
optional :: myrank
96 this%refElem3D => refelem
97 nullify( this%lcmesh2D )
109 logical,
intent(in) :: is_generated
113 if (is_generated)
then
115 deallocate( this%G_ij, this%GIJ )
117 deallocate( this%zS, this%Sz )
118 deallocate( this%GI3, this%GsqrtH )
119 deallocate( this%zlev )
120 deallocate( this%gam )
121 deallocate( this%lon2D, this%lat2D )
122 deallocate( this%EMap3Dto2D )
131 subroutine localmesh3d_setlocalmesh2d( this, lcmesh2D )
137 this%lcmesh2D => lcmesh2d
139 end subroutine localmesh3d_setlocalmesh2d
143 subroutine localmesh3d_getvmapz1d( this, vmapM, vmapP )
147 integer,
intent(out) :: vmapm(this%refelem3d%nfptot,this%nez)
148 integer,
intent(out) :: vmapp(this%refelem3d%nfptot,this%nez)
157 elem => this%refElem3D
160 do f=1, elem%Nfaces_h
161 vs = 1 + (f-1)*elem%Nfp_h
162 ve = vs + elem%Nfp_h - 1
163 vmapm(vs:ve,ke_z) = elem%Fmask_h(:,f) + (ke_z-1)*elem%Np
165 do f=1, elem%Nfaces_v
166 vs = elem%Nfp_h*elem%Nfaces_h + 1 + (f-1)*elem%Nfp_v
167 ve = vs + elem%Nfp_v - 1
168 vmapm(vs:ve,ke_z) = elem%Fmask_v(:,f) + (ke_z-1)*elem%Np
170 vmapp(:,ke_z) = vmapm(:,ke_z)
174 vs = elem%Nfp_h*elem%Nfaces_h + 1
175 ve = vs + elem%Nfp_v - 1
177 vmapp(vs:ve,ke_z) = elem%Fmask_v(:,2) + (ke_z-2)*elem%Np
179 vs = elem%Nfp_h*elem%Nfaces_h + elem%Nfp_v + 1
180 ve = vs + elem%Nfp_v - 1
181 if (ke_z < this%NeZ) &
182 vmapp(vs:ve,ke_z) = elem%Fmask_v(:,1) + ke_z*elem%Np
186 end subroutine localmesh3d_getvmapz1d
190 subroutine localmesh3d_getvmapz3d( this, vmapM, vmapP )
194 integer,
intent(out) :: vmapm(this%refelem3d%nfptot,this%ne)
195 integer,
intent(out) :: vmapp(this%refelem3d%nfptot,this%ne)
197 integer :: ke, ke_xy, ke_z
205 elem => this%refElem3D
209 do ke_xy=1, this%NeX * this%NeY
210 ke = ke_xy + (ke_z-1) * this%NeX * this%NeY
212 do f=1, elem%Nfaces_h
213 vs = 1 + (f-1)*elem%Nfp_h
214 ve = vs + elem%Nfp_h - 1
215 vmapm(vs:ve,ke) = elem%Fmask_h(:,f) + (ke-1)*elem%Np
217 do f=1, elem%Nfaces_v
218 vs = elem%Nfp_h*elem%Nfaces_h + 1 + (f-1)*elem%Nfp_v
219 ve = vs + elem%Nfp_v - 1
220 vmapm(vs:ve,ke) = elem%Fmask_v(:,f) + (ke-1)*elem%Np
222 vmapp(:,ke) = vmapm(:,ke)
225 vs = elem%Nfp_h*elem%Nfaces_h + 1
226 ve = vs + elem%Nfp_v - 1
228 ke_neigh = ke_xy + (ke_z-2) * this%NeX * this%NeY
229 vmapp(vs:ve,ke) = elem%Fmask_v(:,2) + (ke_neigh-1)*elem%Np
231 vs = elem%Nfp_h*elem%Nfaces_h + elem%Nfp_v + 1
232 ve = vs + elem%Nfp_v - 1
233 if (ke_z < this%NeZ)
then
234 ke_neigh = ke_xy + ke_z * this%NeX * this%NeY
235 vmapp(vs:ve,ke) = elem%Fmask_v(:,1) + (ke_neigh-1)*elem%Np
241 end subroutine localmesh3d_getvmapz3d
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
subroutine, public localmeshbase_final(this, is_generated)
Finalize an object to manage a local computational mesh.
subroutine, public localmeshbase_init(this, lcdomid, refelem, ndim, myrank)
Setup an object to manage a local computational mesh.
Derived type representing a 3D reference element.
Derived type representing an arbitrary finite 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)