FE-Project
Loading...
Searching...
No Matches
mod_mkinit_util.F90
Go to the documentation of this file.
1!-------------------------------------------------------------------------------
2!> module Utility for mkinit
3!!
4!! @par Description
5!! subroutines useful to prepare initial data
6!!
7!! @author Yuta Kawai, Team SCALE
8!!
9!<
10!-------------------------------------------------------------------------------
11#include "scaleFElib.h"
13 !-----------------------------------------------------------------------------
14 !
15 !++ used modules
16 !
17 use scale_precision
18 use scale_io
19 use scale_prof
20 use scale_prc
21
22 use scale_const, only: &
23 pi => const_pi
24
32
33
34 !-----------------------------------------------------------------------------
35 implicit none
36 private
37 !-----------------------------------------------------------------------------
38 !
39 !++ Public procedure
40 !
45
46contains
47 !> Calculate the distribution function of a cosine bell in regional domain
48 !!
49 !! If the vertical dependence is considered, specify z_func_type and z_func_params.
50 !! For z_func_type = 'sin', the values of z_func_params is
51 !! 1: the vertical model, 2: the half of wavelength
52 !!
53!OCL SERIAL
55 q, &
56 qmax, rx, ry, rz, xc, yc, zc, &
57 x, y, z, lcmesh3D, elem, &
58 IntrpPolyOrder_h, IntrpPolyOrder_v, &
59 z_func_type, z_func_params, cosbell_exponent )
60
61 implicit none
62
63 class(localmesh3d), intent(in) :: lcmesh3d
64 class(elementbase3d), intent(in) :: elem
65 real(rp), intent(out) :: q(elem%np,lcmesh3d%nea)
66 real(rp), intent(in) :: qmax
67 real(rp), intent(in) :: rx, ry, rz
68 real(rp), intent(in) :: xc, yc, zc
69 real(rp), intent(in) :: x(elem%np,lcmesh3d%ne)
70 real(rp), intent(in) :: y(elem%np,lcmesh3d%ne)
71 real(rp), intent(in) :: z(elem%np,lcmesh3d%ne)
72 integer, intent(in) :: intrppolyorder_h
73 integer, intent(in) :: intrppolyorder_v
74 character(len=*), optional, intent(in) :: z_func_type
75 real(rp), optional, intent(in) :: z_func_params(:)
76 integer, intent(in), optional :: cosbell_exponent !< parameter to ensure 2*cosbell_exponent-1 continuous derivatives
77
78 integer :: ke
79 integer :: i, j
80
81 type(hexahedralelement) :: elem_intrp
82 real(rp), allocatable :: x_intrp(:,:), y_intrp(:,:), z_intrp(:,:)
83 real(rp), allocatable :: r_intrp(:)
84 real(rp), allocatable :: z_func(:,:)
85 real(rp) :: vx(elem%nv), vy(elem%nv), vz(elem%nv)
86
87 real(rp), allocatable :: l2projmat(:,:)
88 real(rp), allocatable :: q_intrp(:)
89 real(rp) :: s
90
91 integer :: exponent
92 !-----------------------------------------------
93
94 if ( present(cosbell_exponent) ) then
95 exponent = cosbell_exponent
96 else
97 exponent = 1
98 end if
99
100 call elem_intrp%Init( intrppolyorder_h, intrppolyorder_v, .false. )
101
102 allocate( l2projmat(elem%Np,elem_intrp%Np) )
103 call elem%Generate_L2ProjMat( elem_intrp, & ! (in)
104 l2projmat ) ! (out)
105
106 allocate( x_intrp(elem_intrp%Np,lcmesh3d%Ne), y_intrp(elem_intrp%Np,lcmesh3d%Ne), z_intrp(elem_intrp%Np,lcmesh3d%Ne) )
107 allocate( z_func(elem_intrp%Np,lcmesh3d%Ne))
108 allocate( r_intrp(elem_intrp%Np) )
109 allocate( q_intrp(elem_intrp%Np) )
110
111 !$omp parallel private( q_intrp, vx, vy, vz, r_intrp, s )
112 !$acc data create( x_intrp, y_intrp, z_intrp, z_func) copyin(L2ProjMat)
113
114 !$omp do
115 !$acc parallel loop private(vx, vy, vz) present(lcmesh3D, elem_intrp, x_intrp, y_intrp, z_intrp, z_func)
116 do ke=lcmesh3d%NeS, lcmesh3d%NeE
117
118 vx(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),1)
119 vy(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),2)
120 vz(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),3)
121 x_intrp(:,ke) = vx(1) + 0.5_rp * ( elem_intrp%x1(:) + 1.0_rp ) * ( vx(2) - vx(1) )
122 y_intrp(:,ke) = vy(1) + 0.5_rp * ( elem_intrp%x2(:) + 1.0_rp ) * ( vy(4) - vy(1) )
123 z_intrp(:,ke) = vz(1) + 0.5_rp * ( elem_intrp%x3(:) + 1.0_rp ) * ( vz(5) - vz(1) )
124
125 z_func(:,ke) = 1.0_rp
126 end do
127 !$omp end do
128
129 ! Calculate the vertical function
130 if ( present(z_func_type) ) then
131 select case(z_func_type)
132 case ('sin')
133 !$omp do
134 !$acc parallel loop present(z_func, z_intrp) copyin(z_func_params)
135 do ke=lcmesh3d%NeS, lcmesh3d%NeE
136 z_func(:,ke) = sin( z_func_params(1) * pi * z_intrp(:,ke) / z_func_params(2) )
137 end do
138 !$omp end do
139 end select
140 end if
141
142 !$omp do
143 !$acc parallel loop private( r_intrp, q_intrp ) present(x_intrp, y_intrp, z_intrp, z_func, q)
144 do ke=lcmesh3d%NeS, lcmesh3d%NeE
145 r_intrp(:) = sqrt( &
146 ( (x_intrp(:,ke) - xc) / rx )**2 &
147 + ( (y_intrp(:,ke) - yc) / ry )**2 &
148 + ( (z_intrp(:,ke) - zc) / rz )**2 )
149
150 where( r_intrp(:) <= 1.0_rp )
151 q_intrp(:) = qmax * ( 0.5_rp * (1.0_rp + cos( pi * r_intrp(:) ) ) )**exponent
152 elsewhere
153 q_intrp(:) = 0.0_rp
154 end where
155
156 ! Perform Galerkin projection
157 !$acc loop worker
158 do i=1, elem%Np
159 s = 0.0_rp
160 !$acc loop vector reduction(+:s)
161 do j=1, elem_intrp%Np
162 s = s + l2projmat(i,j) * q_intrp(j) * z_func(j,ke)
163 end do
164 q(i,ke) = s
165 end do
166 end do
167 !$omp end do
168
169 !$acc end data
170 !$omp end parallel
171
172 call elem_intrp%Final()
173 return
174 end subroutine mkinitutil_calc_cosinebell
175
176 !> Calculate the distribution function of a cosine bell in global domain
177 !!
178 !! If the vertical dependence is considered, specify z_func_type and z_func_params.
179 !! For z_func_type = 'sin', the values of z_func_params is
180 !! 1: the vertical model, 2: the half of wavelength
181 !!
182!OCL SERIAL
184 q, &
185 qmax, rh, lonc, latc, rplanet, &
186 x, y, z, lcmesh3D, elem, &
187 IntrpPolyOrder_h, IntrpPolyOrder_v, &
188 z_func_type, z_func_params, cosbell_exponent )
189
190 use scale_cubedsphere_coord_cnv, only: &
192 implicit none
193
194 class(localmesh3d), intent(in) :: lcmesh3d
195 class(elementbase3d), intent(in) :: elem
196 real(rp), intent(out) :: q(elem%np,lcmesh3d%nea)
197 real(rp), intent(in) :: qmax
198 real(rp), intent(in) :: rh
199 real(rp), intent(in) :: lonc, latc
200 real(rp), intent(in) :: rplanet
201 real(rp), intent(in) :: x(elem%np,lcmesh3d%ne)
202 real(rp), intent(in) :: y(elem%np,lcmesh3d%ne)
203 real(rp), intent(in) :: z(elem%np,lcmesh3d%ne)
204 integer, intent(in) :: intrppolyorder_h
205 integer, intent(in) :: intrppolyorder_v
206 character(len=*), optional, intent(in) :: z_func_type
207 real(rp), optional, intent(in) :: z_func_params(:)
208 integer, intent(in), optional :: cosbell_exponent !< parameter to ensure 2*cosbell_exponent-1 continuous derivatives
209
210 integer :: ke
211 integer :: i, j
212
213 type(hexahedralelement) :: elem_intrp
214 real(rp), allocatable :: x_intrp(:,:), y_intrp(:,:), z_intrp(:,:)
215 real(rp), allocatable :: gam_intrp(:,:)
216 real(rp), allocatable :: lon_intrp(:,:), lat_intrp(:,:)
217 real(rp), allocatable :: z_func(:,:)
218 real(rp), allocatable :: r_intrp(:)
219 real(rp) :: vx(elem%nv), vy(elem%nv), vz(elem%nv)
220
221 real(rp), allocatable :: l2projmat(:,:)
222 real(rp), allocatable :: q_intrp(:)
223 real(rp) :: s
224
225 integer :: exponent
226 !-----------------------------------------------
227
228 if ( present(cosbell_exponent) ) then
229 exponent = cosbell_exponent
230 else
231 exponent = 1
232 end if
233
234 call elem_intrp%Init( intrppolyorder_h, intrppolyorder_v, .false. )
235
236 allocate( l2projmat(elem%Np,elem_intrp%Np) )
237 call elem%Generate_L2ProjMat( elem_intrp, & ! (in)
238 l2projmat ) ! (out)
239
240 allocate( x_intrp(elem_intrp%Np,lcmesh3d%Ne), y_intrp(elem_intrp%Np,lcmesh3d%Ne), z_intrp(elem_intrp%Np,lcmesh3d%Ne) )
241 allocate( gam_intrp(elem_intrp%Np,lcmesh3d%Ne) )
242 allocate( lon_intrp(elem_intrp%Np,lcmesh3d%Ne), lat_intrp(elem_intrp%Np,lcmesh3d%Ne) )
243 allocate( z_func(elem_intrp%Np,lcmesh3d%Ne) )
244 allocate( r_intrp(elem_intrp%Np) )
245 allocate( q_intrp(elem_intrp%Np) )
246
247
248 !$omp parallel private( q_intrp, vx, vy, vz, r_intrp, s )
249 !$acc data create( x_intrp, y_intrp, z_intrp, lon_intrp, lat_intrp, gam_intrp, z_func) copyin(L2ProjMat)
250
251 !$omp do
252 !$acc parallel loop private(vx, vy, vz) present(lcmesh3D, elem_intrp, x_intrp, y_intrp, z_intrp, z_func, gam_intrp)
253 do ke=lcmesh3d%NeS, lcmesh3d%NeE
254 vx(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),1)
255 vy(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),2)
256 vz(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),3)
257 x_intrp(:,ke) = vx(1) + 0.5_rp * ( elem_intrp%x1(:) + 1.0_rp ) * ( vx(2) - vx(1) )
258 y_intrp(:,ke) = vy(1) + 0.5_rp * ( elem_intrp%x2(:) + 1.0_rp ) * ( vy(4) - vy(1) )
259 z_intrp(:,ke) = vz(1) + 0.5_rp * ( elem_intrp%x3(:) + 1.0_rp ) * ( vz(5) - vz(1) )
260 gam_intrp(:,ke) = 1.0_rp
261
262 z_func(:,ke) = 1.0_rp
263 end do
264 !$omp end do
265
266 call cubedspherecoordcnv_cs2lonlatpos( lcmesh3d%panelID, x_intrp, y_intrp, gam_intrp, & ! (in)
267 elem_intrp%Np * lcmesh3d%Ne, & ! (in)
268 lon_intrp, lat_intrp ) ! (out)
269
270 ! Calculate the vertical function
271 if ( present(z_func_type) ) then
272 select case(z_func_type)
273 case ('sin')
274 !$omp do
275 !$acc parallel loop present(z_func, z_intrp) copyin(z_func_params)
276 do ke=lcmesh3d%NeS, lcmesh3d%NeE
277 z_func(:,ke) = sin( z_func_params(1) * pi * z_intrp(:,ke) / z_func_params(2) )
278 end do
279 end select
280 end if
281
282 !$omp do
283 !$acc parallel loop private(r_intrp, q_intrp) present(x_intrp, y_intrp, z_intrp, z_func, lon_intrp, lat_intrp, q)
284 do ke=lcmesh3d%NeS, lcmesh3d%NeE
285
286 ! Calculate the horizontal function
287 r_intrp(:) = rplanet / rh * acos( sin(latc) * sin(lat_intrp(:,ke)) + cos(latc) * cos(lat_intrp(:,ke)) * cos(lon_intrp(:,ke) - lonc) )
288 where( r_intrp(:) <= 1.0_rp )
289 q_intrp(:) = qmax * ( 0.5_rp * (1.0_rp + cos( pi * r_intrp(:) ) ) )**exponent
290 elsewhere
291 q_intrp(:) = 0.0_rp
292 end where
293
294 ! Perform Galerkin projection
295 !$acc loop worker
296 do i=1, elem%Np
297 s = 0.0_rp
298 !$acc loop vector reduction(+:s)
299 do j=1, elem_intrp%Np
300 s = s + l2projmat(i,j) * q_intrp(j) * z_func(j,ke)
301 end do
302 q(i,ke) = s
303 end do
304 end do
305 !$omp end do
306
307 !$acc end data
308 !$omp end parallel
309
310 call elem_intrp%Final()
311 return
313
314
315!> Apply the Galerkin projection to the user-defined function
316!!
317!OCL SERIAL
319 func, IntrpPolyOrder_h, IntrpPolyOrder_v, &
320 lcmesh3D, elem )
321
322 implicit none
323 class(localmesh3d), intent(in) :: lcmesh3d
324 class(elementbase3d), intent(in) :: elem
325 real(rp), intent(out) :: q(elem%np,lcmesh3d%nea)
326 integer, intent(in) :: intrppolyorder_h
327 integer, intent(in) :: intrppolyorder_v
328
329 interface
330 subroutine func( q_intrp, &
331 x, y, z, lcmesh3D, elem_intrp )
332 import localmesh3d
333 import elementbase3d
334 import rp
335 class(localmesh3d), intent(in) :: lcmesh3d
336 class(elementbase3d), intent(in) :: elem_intrp
337 real(rp), intent(out) :: q_intrp(elem_intrp%np,lcmesh3d%ne)
338 real(rp), intent(in) :: x(elem_intrp%np,lcmesh3d%ne)
339 real(rp), intent(in) :: y(elem_intrp%np,lcmesh3d%ne)
340 real(rp), intent(in) :: z(elem_intrp%np,lcmesh3d%ne)
341 end subroutine func
342 end interface
343
344 type(hexahedralelement) :: elem_intrp
345 real(rp), allocatable :: x_intrp(:,:), y_intrp(:,:), z_intrp(:,:)
346 real(rp) :: vx(elem%nv), vy(elem%nv), vz(elem%nv)
347
348 real(rp), allocatable :: l2projmat(:,:)
349 real(rp), allocatable :: q_intrp(:,:)
350
351 integer :: ke, p
352 integer :: i, j
353 real(rp) :: s
354 !-----------------------------------------------
355
356 call elem_intrp%Init( intrppolyorder_h, intrppolyorder_v, .false. )
357
358 allocate( l2projmat(elem%Np,elem_intrp%Np) )
359 call elem%Generate_L2ProjMat( elem_intrp, & ! (in)
360 l2projmat ) ! (out)
361
362 allocate( x_intrp(elem_intrp%Np,lcmesh3d%Ne), y_intrp(elem_intrp%Np,lcmesh3d%Ne), z_intrp(elem_intrp%Np,lcmesh3d%Ne) )
363 allocate( q_intrp(elem_intrp%Np,lcmesh3d%Ne) )
364
365 !$acc data create( x_intrp, y_intrp, z_intrp, q_intrp ) copyin(L2ProjMat)
366
367 !$omp parallel do private(vx, vy, vz)
368 !$acc parallel loop gang private(vx, vy, vz) present(x_intrp, y_intrp, z_intrp, lcmesh3D,elem_intrp)
369 do ke=lcmesh3d%NeS, lcmesh3d%NeE
370 vx(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),1)
371 vy(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),2)
372 vz(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),3)
373 !$acc loop vector
374 do p=1, elem_intrp%Np
375 x_intrp(p,ke) = vx(1) + 0.5_rp * ( elem_intrp%x1(p) + 1.0_rp ) * ( vx(2) - vx(1) )
376 y_intrp(p,ke) = vy(1) + 0.5_rp * ( elem_intrp%x2(p) + 1.0_rp ) * ( vy(4) - vy(1) )
377 z_intrp(p,ke) = vz(1) + 0.5_rp * ( elem_intrp%x3(p) + 1.0_rp ) * ( vz(5) - vz(1) )
378 end do
379 end do
380
381 call func( q_intrp, & ! (out)
382 x_intrp, y_intrp, z_intrp, & ! (in)
383 lcmesh3d, elem_intrp ) ! (in)
384
385 !$omp parallel do private( s )
386 !$acc parallel loop gang private(s) present(q_intrp, q, L2ProjMat, lcmesh3D,elem_intrp,elem)
387 do ke=lcmesh3d%NeS, lcmesh3d%NeE
388 ! Perform Galerkin projection
389 !$acc loop worker
390 do i=1, elem%Np
391 s = 0.0_rp
392 !$acc loop vector reduction(+:s)
393 do j=1, elem_intrp%Np
394 s = s + l2projmat(i,j) * q_intrp(j,ke)
395 end do
396 q(i,ke) = s
397 end do
398 end do
399
400 !$acc end data
401
402 call elem_intrp%Final()
403 return
405
406!> Apply the Galerkin projection to the user-defined function (for global model)
407!!
408!OCL SERIAL
410 func, IntrpPolyOrder_h, IntrpPolyOrder_v, &
411 lcmesh3D, elem, rplanet )
412
413 use scale_cubedsphere_coord_cnv, only: &
415
416 implicit none
417 class(localmesh3d), intent(in) :: lcmesh3d
418 class(elementbase3d), intent(in) :: elem
419 real(rp), intent(out) :: q(elem%np,lcmesh3d%nea)
420 integer, intent(in) :: intrppolyorder_h
421 integer, intent(in) :: intrppolyorder_v
422 real(rp), intent(in) :: rplanet
423
424 interface
425 subroutine func( q_intrp, &
426 lon, lat, z, lcmesh3D, elem_intrp, rplanet )
427 import localmesh3d
428 import elementbase3d
429 import rp
430 class(localmesh3d), intent(in) :: lcmesh3d
431 class(elementbase3d), intent(in) :: elem_intrp
432 real(rp), intent(out) :: q_intrp(elem_intrp%np,lcmesh3d%ne)
433 real(rp), intent(in) :: lon(elem_intrp%np,lcmesh3d%ne)
434 real(rp), intent(in) :: lat(elem_intrp%np,lcmesh3d%ne)
435 real(rp), intent(in) :: z(elem_intrp%np,lcmesh3d%ne)
436 real(rp), intent(in) :: rplanet
437 end subroutine func
438 end interface
439
440 type(hexahedralelement) :: elem_intrp
441 real(rp), allocatable :: x_intrp(:,:), y_intrp(:,:), z_intrp(:,:)
442 real(rp), allocatable :: gam_intrp(:,:)
443 real(rp), allocatable :: lon_intrp(:,:), lat_intrp(:,:)
444 real(rp) :: vx(elem%nv), vy(elem%nv), vz(elem%nv)
445
446 real(rp), allocatable :: l2projmat(:,:)
447 real(rp), allocatable :: q_intrp(:,:)
448
449 integer :: ke
450 integer :: i, j
451
452 real(rp) :: s
453 !-----------------------------------------------
454
455 call elem_intrp%Init( intrppolyorder_h, intrppolyorder_v, .false. )
456
457 allocate( l2projmat(elem%Np,elem_intrp%Np) )
458 call elem%Generate_L2ProjMat( elem_intrp, & ! (in)
459 l2projmat ) ! (out)
460
461 allocate( x_intrp(elem_intrp%Np,lcmesh3d%Ne), y_intrp(elem_intrp%Np,lcmesh3d%Ne), z_intrp(elem_intrp%Np,lcmesh3d%Ne) )
462 allocate( gam_intrp(elem_intrp%Np,lcmesh3d%Ne) )
463 allocate( lon_intrp(elem_intrp%Np,lcmesh3d%Ne), lat_intrp(elem_intrp%Np,lcmesh3d%Ne) )
464 allocate( q_intrp(elem_intrp%Np,lcmesh3d%Ne) )
465
466 !$acc data create( x_intrp, y_intrp, z_intrp, gam_intrp, lon_intrp, lat_intrp, q_intrp ) copyin(L2ProjMat)
467
468 !$omp parallel do private(vx, vy, vz)
469 !$acc parallel loop private(vx, vy, vz) present(x_intrp, y_intrp, z_intrp, gam_intrp, L2ProjMat)
470 do ke=lcmesh3d%NeS, lcmesh3d%NeE
471 vx(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),1)
472 vy(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),2)
473 vz(:) = lcmesh3d%pos_ev(lcmesh3d%EToV(ke,:),3)
474 x_intrp(:,ke) = vx(1) + 0.5_rp * ( elem_intrp%x1(:) + 1.0_rp ) * ( vx(2) - vx(1) )
475 y_intrp(:,ke) = vy(1) + 0.5_rp * ( elem_intrp%x2(:) + 1.0_rp ) * ( vy(4) - vy(1) )
476 z_intrp(:,ke) = vz(1) + 0.5_rp * ( elem_intrp%x3(:) + 1.0_rp ) * ( vz(5) - vz(1) )
477
478 gam_intrp(:,ke) = 1.0_rp
479 end do
480
481 call cubedspherecoordcnv_cs2lonlatpos( lcmesh3d%panelID, x_intrp, y_intrp, gam_intrp, & ! (in)
482 elem_intrp%Np * lcmesh3d%Ne, & ! (in)
483 lon_intrp(:,:), lat_intrp(:,:) ) ! (out)
484
485 call func( q_intrp, & ! (out)
486 lon_intrp, lat_intrp, z_intrp, & ! (in)
487 lcmesh3d, elem_intrp, rplanet ) ! (in)
488
489 !$omp parallel do private( s )
490 !$acc parallel loop gang private(s) present(q_intrp, q, L2ProjMat, lcmesh3D,elem_intrp,elem)
491 do ke=lcmesh3d%NeS, lcmesh3d%NeE
492 ! Perform Galerkin projection
493 !$acc loop worker
494 do i=1, elem%Np
495 s = 0.0_rp
496 !$acc loop vector reduction(+:s)
497 do j=1, elem_intrp%Np
498 s = s + l2projmat(i,j) * q_intrp(j,ke)
499 end do
500 q(i,ke) = s
501 end do
502 end do
503
504 !$acc end data
505
506 call elem_intrp%Final()
507 return
509
510end module mod_mkinit_util
module Utility for mkinit
subroutine, public mkinitutil_galerkinprojection_global(q, func, intrppolyorder_h, intrppolyorder_v, lcmesh3d, elem, rplanet)
Apply the Galerkin projection to the user-defined function (for global model)
subroutine, public mkinitutil_calc_cosinebell(q, qmax, rx, ry, rz, xc, yc, zc, x, y, z, lcmesh3d, elem, intrppolyorder_h, intrppolyorder_v, z_func_type, z_func_params, cosbell_exponent)
Calculate the distribution function of a cosine bell in regional domain.
subroutine, public mkinitutil_calc_cosinebell_global(q, qmax, rh, lonc, latc, rplanet, x, y, z, lcmesh3d, elem, intrppolyorder_h, intrppolyorder_v, z_func_type, z_func_params, cosbell_exponent)
Calculate the distribution function of a cosine bell in global domain.
subroutine, public mkinitutil_galerkinprojection(q, func, intrppolyorder_h, intrppolyorder_v, lcmesh3d, elem)
Apply the Galerkin projection to the user-defined function.
Module common / Coordinate conversion with cubed-sphere projection.
subroutine, public cubedspherecoordcnv_cs2lonlatpos(panelid, alpha, beta, gam, np, lon, lat)
Calculate longitude and latitude coordinates from local coordinates using the central angles in an eq...
module FElib / Element / Base
module FElib / Element / hexahedron
module FElib / Element / Quadrilateral
module FElib / Mesh / Local 2D
module FElib / Mesh / Local 3D
module FElib / Mesh / Cubic 3D domain
Derived type representing a 2D reference element.
Derived type representing a 3D reference element.
Derived type representing a hexahedral element.
Derived type representing a quadrilateral element.
Derived type representing a local mesh for 2D domain.
Derived type to manage a local 3D computational domain.
Derived type representing a field with local mesh (base type)
Derived type to manage a cubic 3D computational domain.