FE-Project
Loading...
Searching...
No Matches
scale_file_common_meshfield.F90
Go to the documentation of this file.
1!> module FElib / File / Common
2!!
3!! @par Description
4!! A common module for outputting field data
5!!
6!! @author Yuta Kawai, Team SCALE
7!!
8!<
9!-------------------------------------------------------------------------------
10#include "scaleFElib.h"
12 !-----------------------------------------------------------------------------
13 !
14 !++ Used modules
15 !
16 use scale_precision
17 use scale_io
18
21 use scale_mesh_base1d, only: meshbase1d, &
24 use scale_mesh_base2d, only: meshbase2d, &
28 use scale_mesh_base3d, only: meshbase3d, &
34
42
44
45 !-----------------------------------------------------------------------------
46 implicit none
47 private
48 !-----------------------------------------------------------------------------
49 !
50 !++ Public procedures
51 !
52
59 module procedure file_common_meshfield_get_dims2d_cubedsphere
61 module procedure file_common_meshfield_get_dims3d_cubedsphere
62 end interface
64
65
72 module procedure file_common_meshfield_get_axis2d_cubedsphere
74 module procedure file_common_meshfield_get_axis3d_cubedsphere
75 end interface
77
83
89
93
95 character(len=H_SHORT) :: type
96 integer :: ndim
97 character(len=H_SHORT) :: dims(3)
98 character(len=H_SHORT) :: name
99 character(len=H_MID) :: desc
100 character(len=H_SHORT) :: unit
101 integer :: count(3)
102 integer :: size
103 logical :: positive_down(3)
105
107
108 !-----------------------------------------------------------------------------
109 !
110 !++ Public parameters & variables
111 !
112 !-----------------------------------------------------------------------------
113
114 !--------------------
115 !
116 !++ Private procedures
117 !
118 !-------------------
119
120 private :: get_uniform_grid1d
121 private :: set_dimension
122
123contains
124
125 !- 1D ---------------
126
127!OCL SERIAL
128 subroutine file_common_meshfield_get_dims1d( mesh1D, dim_name_postfix, & ! (in)
129 dimsinfo ) ! (out)
130 implicit none
131 class(meshbase1d), target, intent(in) :: mesh1D
132 character(len=H_SHORT), intent(in) :: dim_name_postfix
133 type(file_common_meshfield_diminfo), intent(out) :: dimsinfo(MeshBase1D_DIMTYPE_NUM)
134
135 integer :: i_size
136 type(meshdiminfo), pointer :: diminfo
137 type(meshdiminfo), pointer :: diminfo_x
138 !-------------------------------------------------
139
140 i_size = mesh1d%NeG * mesh1d%refElem1D%Np
141
142 diminfo_x => mesh1d%dimInfo(meshbase1d_dimtypeid_x)
143 call set_dimension( dimsinfo(meshbase1d_dimtypeid_x), &
144 diminfo_x, "X", 1, (/ diminfo_x%name /), (/ i_size /), &
145 dim_name_postfix )
146
147 diminfo => mesh1d%dimInfo(meshbase1d_dimtypeid_xt)
148 call set_dimension( dimsinfo(meshbase1d_dimtypeid_xt), &
149 diminfo, "XT", 1, (/ diminfo_x%name /), (/ i_size /), &
150 dim_name_postfix )
151
152 return
154
155!OCL SERIAL
156 subroutine file_common_meshfield_get_axis1d( mesh1D, dimsinfo, x, &
157 force_uniform_grid )
158 implicit none
159
160 class(meshbase1d), target, intent(in) :: mesh1D
161 type(file_common_meshfield_diminfo), intent(in) :: dimsinfo(MeshBase1D_DIMTYPE_NUM)
162 real(RP), intent(out) :: x(dimsinfo(MeshBase1D_DIMTYPEID_X)%size)
163 logical, intent(in), optional :: force_uniform_grid
164
165 integer :: n
166 integer :: i
167 integer :: is, ie
168 type(elementbase1d), pointer :: refElem
169 type(localmesh1d), pointer :: lcmesh
170
171 logical :: uniform_grid = .false.
172 real(RP), allocatable :: x_local(:)
173 !-------------------------------------------------
174
175 if ( present(force_uniform_grid) ) uniform_grid = force_uniform_grid
176
177 do n=1,mesh1d%LOCAL_MESH_NUM
178 lcmesh => mesh1d%lcmesh_list(n)
179 refelem => lcmesh%refElem1D
180
181 allocate( x_local(refelem%Np) )
182
183 do i=1,mesh1d%NeG
184 x_local(:) = lcmesh%pos_en(:,i,1)
185 if ( uniform_grid ) call get_uniform_grid1d( x_local, refelem%Nfp )
186
187 is = 1 + (i-1)*refelem%Np + (n-1)*refelem%Np*lcmesh%Ne
188 ie = is + refelem%Np -1
189 x(is:ie) = x_local(:)
190 end do
191
192 deallocate( x_local )
193 end do
194
195 return
197
198!OCL SERIAL
199 subroutine file_common_meshfield_put_field1d_cartesbuf( mesh1D, field1D, &
200 buf, force_uniform_grid )
201 use scale_polynomial, only: &
203 implicit none
204 class(meshbase1d), target, intent(in) :: mesh1d
205 class(meshfield1d), intent(in) :: field1d
206 real(rp), intent(inout) :: buf(:)
207 logical, intent(in), optional :: force_uniform_grid
208
209 integer :: n, kelem1, p
210 integer :: i, i2
211 type(localmesh1d), pointer :: lcmesh
212 type(elementbase1d), pointer :: refelem
213 integer :: i0_s
214
215 logical :: uniform_grid = .false.
216 integer :: np
217 real(rp), allocatable :: x_local(:)
218 real(rp) :: x_local0, delx
219 real(rp) :: ox(1)
220 real(rp), allocatable :: spectral_coef(:)
221 real(rp), allocatable :: p1d_ori_x(:,:)
222 !------------------------------------------------
223
224 if ( present(force_uniform_grid) ) uniform_grid = force_uniform_grid
225
226 i0_s = 0
227 do n=1, mesh1d%LOCAL_MESH_NUM
228 lcmesh => mesh1d%lcmesh_list(n)
229 refelem => lcmesh%refElem1D
230 np = refelem%Np
231
232 if ( uniform_grid ) then
233 allocate( x_local(np) )
234 allocate( spectral_coef(np) )
235 allocate( p1d_ori_x(1,np) )
236 end if
237
238 do kelem1=lcmesh%NeS, lcmesh%NeE
239 if ( uniform_grid ) then
240 x_local(:) = lcmesh%pos_en(:,kelem1,1)
241 x_local0 = x_local(1); delx = x_local(np) - x_local0
242 call get_uniform_grid1d( x_local, np )
243
244 spectral_coef(:) = matmul(refelem%invV(:,:), field1d%local(n)%val(:,kelem1))
245 do i2=1, np
246 ox = - 1.0_rp + 2.0_rp * (x_local(i2) - x_local0) / delx
247 call polynomial_genlegendrepoly_sub( refelem%PolyOrder, ox, p1d_ori_x(:,:) )
248
249 i = i0_s + i2 + (kelem1-1)*np
250 buf(i) = 0.0_rp
251 do p=1, np
252 buf(i) = buf(i) + &
253 p1d_ori_x(1,p) * sqrt( dble(p-1) + 0.5_rp ) * spectral_coef(p)
254 end do
255 end do
256 else
257 do i2=1, np
258 i = i0_s + i2 + (kelem1-1)*np
259 buf(i) = field1d%local(n)%val(i2,kelem1)
260 end do
261 end if
262 end do
263
264 i0_s = i0_s + lcmesh%Ne * refelem%Np
265 if ( uniform_grid ) then
266 deallocate( x_local )
267 deallocate( spectral_coef )
268 deallocate( p1d_ori_x )
269 end if
270 end do
271
272 return
274
275!OCL SERIAL
277 field1D )
278 implicit none
279 class(meshbase1d), target, intent(in) :: mesh1d
280 real(rp), intent(in) :: buf(:)
281 class(meshfield1d), intent(inout) :: field1d
282
283 integer :: n
284 integer :: i0
285 type(localmesh1d), pointer :: lcmesh
286 type(elementbase1d), pointer :: refelem
287 integer :: i0_s
288 !----------------------------------------------------
289
290 i0_s = 0
291
292 do i0=1, mesh1d%LOCAL_MESH_NUM
293 n = i0
294 lcmesh => mesh1d%lcmesh_list(n)
295 refelem => lcmesh%refElem1D
296
298 lcmesh, buf(:), i0_s, &
299 field1d%local(n)%val(:,:) )
300
301 i0_s = i0_s + lcmesh%Ne * refelem%Np
302 end do
303
304 return
306
307!OCL SERIAL
309 lcmesh, buf, i0_s, &
310 val )
311 implicit none
312 type(localmesh1d), intent(in) :: lcmesh
313 real(rp), intent(in) :: buf(:)
314 integer, intent(in) :: i0_s
315 real(rp), intent(inout) :: val(lcmesh%refelem1d%np,lcmesh%nea)
316
317 integer :: kelem1
318 integer :: i, i1, i2
319 type(elementbase1d), pointer :: refelem
320 integer :: indx
321 !----------------------------------------------------
322
323 refelem => lcmesh%refElem1D
324
325 do i1=1, lcmesh%Ne
326 kelem1 = i1
327 do i2=1, refelem%Np
328 i = i0_s + i2 + (i1-1)*refelem%Np
329 indx = i2
330 val(indx,kelem1) = buf(i)
331 end do
332 end do
333
334 return
336
337 !- 2D ---------------
338
339!OCL SERIAL
340 subroutine file_common_meshfield_get_dims2d( mesh2D, dim_name_postfix, & ! (in)
341 dimsinfo ) ! (out)
342 implicit none
343
344 class(meshrectdom2d), target, intent(in) :: mesh2D
345 character(len=H_SHORT), intent(in) :: dim_name_postfix
346 type(file_common_meshfield_diminfo), intent(out) :: dimsinfo(MeshBase2D_DIMTYPE_NUM)
347
348 type(localmesh2d), pointer :: lcmesh
349 integer :: i, j, n
350
351 integer :: i_size, j_size
352 type(meshdiminfo), pointer :: diminfo
353 type(meshdiminfo), pointer :: diminfo_x
354 type(meshdiminfo), pointer :: diminfo_y
355 !-------------------------------------------------
356
357 i_size = 0
358 do i=1, size(mesh2d%rcdomIJ2LCMeshID,1)
359 n = mesh2d%rcdomIJ2LCMeshID(i,1)
360 lcmesh => mesh2d%lcmesh_list(n)
361 i_size =i_size + lcmesh%NeX * lcmesh%refElem2D%Nfp
362 end do
363
364 j_size = 0
365 do j=1, size(mesh2d%rcdomIJ2LCMeshID,2)
366 n = mesh2d%rcdomIJ2LCMeshID(1,j)
367 lcmesh => mesh2d%lcmesh_list(n)
368 j_size = j_size + lcmesh%NeY * lcmesh%refElem2D%Nfp
369 end do
370
371 diminfo_x => mesh2d%dimInfo(meshbase2d_dimtypeid_x)
372 call set_dimension( dimsinfo(meshbase2d_dimtypeid_x), &
373 diminfo_x, "X", 1, (/ diminfo_x%name /), (/ i_size /), &
374 dim_name_postfix )
375
376 diminfo_y => mesh2d%dimInfo(meshbase2d_dimtypeid_y)
377 call set_dimension( dimsinfo(meshbase2d_dimtypeid_y), &
378 diminfo_y, "Y", 1, (/ diminfo_y%name /), (/ j_size /), &
379 dim_name_postfix )
380
381 diminfo => mesh2d%dimInfo(meshbase2d_dimtypeid_xy)
382 call set_dimension( dimsinfo(meshbase2d_dimtypeid_xy), &
383 diminfo, "XY", 2, (/ diminfo_x%name, diminfo_y%name /), &
384 (/ i_size, j_size /), dim_name_postfix )
385
386 diminfo => mesh2d%dimInfo(meshbase2d_dimtypeid_xyt)
387 call set_dimension( dimsinfo(meshbase2d_dimtypeid_xyt), &
388 diminfo, "XYT", 2, (/ diminfo_x%name, diminfo_y%name /), &
389 (/ i_size, j_size /), dim_name_postfix )
390
391 return
393
394!OCL SERIAL
395 subroutine file_common_meshfield_get_dims2d_cubedsphere( mesh2D, dim_name_postfix, & ! (in)
396 dimsinfo ) ! (out)
397 implicit none
398
399 class(meshcubedspheredom2d), target, intent(in) :: mesh2D
400 character(len=H_SHORT), intent(in) :: dim_name_postfix
401 type(file_common_meshfield_diminfo), intent(out) :: dimsinfo(MeshBase2D_DIMTYPE_NUM)
402
403 type(localmesh2d), pointer :: lcmesh
404 integer :: i, j, n
405
406 integer :: i_size, j_size
407
408 type(meshdiminfo), pointer :: diminfo
409 type(meshdiminfo), pointer :: diminfo_x
410 type(meshdiminfo), pointer :: diminfo_y
411 !-------------------------------------------------
412
413 i_size = 0
414 do i=1, size(mesh2d%rcdomIJP2LCMeshID,1)
415 n = mesh2d%rcdomIJP2LCMeshID(i,1,1)
416 lcmesh => mesh2d%lcmesh_list(n)
417 i_size =i_size + lcmesh%NeX * lcmesh%refElem2D%Nfp
418 end do
419
420 j_size = 0
421 do j=1, size(mesh2d%rcdomIJP2LCMeshID,2)
422 n = mesh2d%rcdomIJP2LCMeshID(1,j,1)
423 lcmesh => mesh2d%lcmesh_list(n)
424 j_size = j_size + lcmesh%NeY * lcmesh%refElem2D%Nfp
425 end do
426
427 j_size = j_size * size(mesh2d%rcdomIJP2LCMeshID,3)
428
429 diminfo_x => mesh2d%dimInfo(meshbase2d_dimtypeid_x)
430 call set_dimension( dimsinfo(meshbase2d_dimtypeid_x), &
431 diminfo_x, "X", 1, (/ diminfo_x%name /), (/ i_size /), &
432 dim_name_postfix )
433
434 diminfo_y => mesh2d%dimInfo(meshbase2d_dimtypeid_y)
435 call set_dimension( dimsinfo(meshbase2d_dimtypeid_y), &
436 diminfo_y, "Y", 1, (/ diminfo_y%name /), (/ j_size /), &
437 dim_name_postfix )
438
439 diminfo => mesh2d%dimInfo(meshbase2d_dimtypeid_xy)
440 call set_dimension( dimsinfo(meshbase2d_dimtypeid_xy), &
441 diminfo, "XY", 2, (/ diminfo_x%name, diminfo_y%name /), &
442 (/ i_size, j_size /), dim_name_postfix )
443
444 diminfo => mesh2d%dimInfo(meshbase2d_dimtypeid_xyt)
445 call set_dimension( dimsinfo(meshbase2d_dimtypeid_xyt), &
446 diminfo, "XYT", 2, (/ diminfo_x%name, diminfo_y%name /), &
447 (/ i_size, j_size /), dim_name_postfix )
448
449 return
450 end subroutine file_common_meshfield_get_dims2d_cubedsphere
451
452!OCL SERIAL
453 subroutine file_common_meshfield_get_axis2d( mesh2D, dimsinfo, x, y, &
454 force_uniform_grid )
455 implicit none
456
457 class(meshrectdom2d), target, intent(in) :: mesh2D
458 type(file_common_meshfield_diminfo), intent(in) :: dimsinfo(MeshBase2D_DIMTYPE_NUM)
459 real(RP), intent(out) :: x(dimsinfo(MeshBase2D_DIMTYPEID_X)%size)
460 real(RP), intent(out) :: y(dimsinfo(MeshBase2D_DIMTYPEID_Y)%size)
461 logical, intent(in), optional :: force_uniform_grid
462
463 integer :: n
464 integer :: ni, nj
465 integer :: k
466 integer :: i, j
467 type(elementbase2d), pointer :: refElem
468 type(localmesh2d), pointer :: lcmesh
469
470 integer :: is, js, ie, je, igs, jgs
471
472 logical :: uniform_grid = .false.
473 real(RP), allocatable :: x_local(:)
474 real(RP), allocatable :: y_local(:)
475 !-------------------------------------------------
476
477 if ( present(force_uniform_grid) ) uniform_grid = force_uniform_grid
478
479 igs = 0; jgs = 0
480 do nj=1, size(mesh2d%rcdomIJ2LCMeshID,2)
481 do ni=1, size(mesh2d%rcdomIJ2LCMeshID,1)
482 n = mesh2d%rcdomIJ2LCMeshID(ni,nj)
483 lcmesh => mesh2d%lcmesh_list(n)
484 refelem => lcmesh%refElem2D
485
486 allocate( x_local(refelem%Nfp), y_local(refelem%Nfp) )
487
488 do j=1, lcmesh%NeY
489 do i=1, lcmesh%NeX
490 k = i + (j-1) * lcmesh%NeX
491 if ( j==1 .and. nj == 1 ) then
492 x_local(:) = lcmesh%pos_en(refelem%Fmask(:,1),k,1)
493 if ( uniform_grid ) call get_uniform_grid1d( x_local, refelem%Nfp )
494
495 is = igs + 1 + (i-1)*refelem%Nfp
496 ie = is + refelem%Nfp - 1
497 x(is:ie) = x_local(:)
498 end if
499 if ( i==1 .and. ni == 1 ) then
500 y_local(:) = lcmesh%pos_en(refelem%Fmask(:,4),k,2)
501 if ( uniform_grid ) call get_uniform_grid1d( y_local, refelem%Nfp )
502
503 js = jgs + 1 + (j-1)*refelem%Nfp
504 je = js + refelem%Nfp - 1
505 y(js:je) = y_local(:)
506 end if
507 end do
508 end do
509
510 igs = ie; jgs = je
511 deallocate( x_local, y_local )
512 end do
513 end do
514
515 return
517
518!OCL SERIAL
519 subroutine file_common_meshfield_get_axis2d_cubedsphere( mesh2D, dimsinfo, x, y )
520 use scale_const, only: &
521 pi => const_pi
522 implicit none
523
524 class(meshcubedspheredom2d), target, intent(in) :: mesh2D
525 type(file_common_meshfield_diminfo), intent(in) :: dimsinfo(MeshBase2D_DIMTYPE_NUM)
526 real(RP), intent(out) :: x(dimsinfo(MeshBase2D_DIMTYPEID_X)%size)
527 real(RP), intent(out) :: y(dimsinfo(MeshBase2D_DIMTYPEID_Y)%size)
528
529 integer :: ni, nj, np, n
530 integer :: k
531 integer :: i, j
532 type(elementbase2d), pointer :: refElem
533 type(localmesh2d), pointer :: lcmesh
534
535 integer :: is, js, ie, je, igs, jgs
536
537 logical :: uniform_grid = .false.
538 real(RP), allocatable :: x_local(:)
539 real(RP), allocatable :: y_local(:)
540 !-------------------------------------------------
541
542 igs = 0; jgs = 0
543
544 do np=1, size(mesh2d%rcdomIJP2LCMeshID,3)
545 do nj=1, size(mesh2d%rcdomIJP2LCMeshID,2)
546 do ni=1, size(mesh2d%rcdomIJP2LCMeshID,1)
547 n = mesh2d%rcdomIJP2LCMeshID(ni,nj,np)
548 lcmesh => mesh2d%lcmesh_list(n)
549 refelem => lcmesh%refElem2D
550
551 allocate( x_local(refelem%Nfp), y_local(refelem%Nfp) )
552
553 do j=1, lcmesh%NeY
554 do i=1, lcmesh%NeX
555 k = i + (j-1) * lcmesh%NeX
556 if ( j==1 .and. nj == 1 .and. np == 1) then
557 x_local(:) = lcmesh%pos_en(refelem%Fmask(:,1),k,1)
558
559 is = igs + 1 + (i-1)*refelem%Nfp
560 ie = is + refelem%Nfp - 1
561 x(is:ie) = x_local(:)
562 end if
563 if ( i==1 .and. ni == 1 ) then
564 y_local(:) = lcmesh%pos_en(refelem%Fmask(:,4),k,2) &
565 + ( lcmesh%panelID - 1.0_rp ) * 0.5_rp * pi
566
567 js = jgs + 1 + (j-1)*refelem%Nfp
568 je = js + refelem%Nfp - 1
569 y(js:je) = y_local(:)
570 end if
571 end do
572 end do
573
574 igs = ie; jgs = je
575 deallocate( x_local, y_local )
576 end do
577 end do
578 end do
579
580 return
581 end subroutine file_common_meshfield_get_axis2d_cubedsphere
582
583!OCL SERIAL
584 subroutine file_common_meshfield_put_field2d_cartesbuf( mesh2D, field2D, &
585 buf, force_uniform_grid )
586 use scale_polynomial, only: &
588 implicit none
589 class(meshrectdom2d), target, intent(in) :: mesh2d
590 class(meshfield2d), intent(in) :: field2d
591 real(rp), intent(inout) :: buf(:,:)
592 logical, intent(in), optional :: force_uniform_grid
593
594 integer :: n, kelem1
595 integer :: i0, j0, i1, j1, i2, j2, i, j
596 type(localmesh2d), pointer :: lcmesh
597 type(elementbase2d), pointer :: refelem
598 integer :: i0_s, j0_s
599
600 logical :: uniform_grid = .false.
601 integer :: nfp
602 real(rp), allocatable :: x_local(:)
603 real(rp) :: x_local0, delx
604 real(rp), allocatable :: y_local(:)
605 real(rp) :: y_local0, dely
606 real(rp) :: ox(1), oy(1)
607 real(rp), allocatable :: spectral_coef(:)
608 real(rp), allocatable :: p1d_ori_x(:,:)
609 real(rp), allocatable :: p1d_ori_y(:,:)
610 integer :: l, p1, p2
611 !------------------------------------------------
612
613 if ( present(force_uniform_grid) ) uniform_grid = force_uniform_grid
614
615 i0_s = 0; j0_s = 0
616
617 do j0=1, size(mesh2d%rcdomIJ2LCMeshID,2)
618 do i0=1, size(mesh2d%rcdomIJ2LCMeshID,1)
619 n = mesh2d%rcdomIJ2LCMeshID(i0,j0)
620
621 lcmesh => mesh2d%lcmesh_list(n)
622 refelem => lcmesh%refElem2D
623 nfp = refelem%Nfp
624
625 if ( uniform_grid ) then
626 allocate( x_local(nfp), y_local(nfp) )
627 allocate( spectral_coef(refelem%Np) )
628 allocate( p1d_ori_x(1,nfp), p1d_ori_y(1,nfp) )
629 end if
630
631 do j1=1, lcmesh%NeY
632 do i1=1, lcmesh%NeX
633 kelem1 = i1 + (j1-1)*lcmesh%NeX
634
635 if ( uniform_grid ) then
636 x_local(:) = lcmesh%pos_en(refelem%Fmask(1:nfp,1),kelem1,1)
637 x_local0 = x_local(1); delx = x_local(nfp) - x_local0
638 y_local(:) = lcmesh%pos_en(refelem%Fmask(1:nfp,4),kelem1,2)
639 y_local0 = y_local(1); dely = y_local(nfp) - y_local0
640 call get_uniform_grid1d( x_local, nfp )
641 call get_uniform_grid1d( y_local, nfp )
642
643 spectral_coef(:) = matmul(refelem%invV(:,:), field2d%local(n)%val(:,kelem1))
644 do j2=1, nfp
645 do i2=1, nfp
646 ox(1) = - 1.0_rp + 2.0_rp * (x_local(i2) - x_local0) / delx
647 oy(1) = - 1.0_rp + 2.0_rp * (y_local(j2) - y_local0) / dely
648
649 call polynomial_genlegendrepoly_sub( refelem%PolyOrder, ox, p1d_ori_x(:,:) )
650 call polynomial_genlegendrepoly_sub( refelem%PolyOrder, oy, p1d_ori_y(:,:) )
651
652 i = i0_s + i2 + (i1-1)*nfp
653 j = j0_s + j2 + (j1-1)*nfp
654 buf(i,j) = 0.0_rp
655 do p2=1, nfp
656 do p1=1, nfp
657 l = p1 + (p2-1)*nfp
658 buf(i,j) = buf(i,j) + &
659 ( p1d_ori_x(1,p1) * p1d_ori_y(1,p2) ) &
660 * sqrt((dble(p1-1) + 0.5_rp)*(dble(p2-1) + 0.5_rp)) &
661 * spectral_coef(l)
662 end do
663 end do
664 end do
665 end do
666
667 else
668
669 do j2=1, nfp
670 do i2=1, nfp
671 i = i0_s + i2 + (i1-1)*nfp
672 j = j0_s + j2 + (j1-1)*nfp
673 buf(i,j) = field2d%local(n)%val(i2+(j2-1)*nfp,kelem1)
674 end do
675 end do
676
677 end if
678 end do
679 end do
680
681 if ( uniform_grid ) then
682 deallocate( x_local, y_local )
683 deallocate( spectral_coef )
684 deallocate( p1d_ori_x, p1d_ori_y )
685 end if
686
687 i0_s = i0_s + lcmesh%NeX * refelem%Nfp
688 end do
689 j0_s = j0_s + lcmesh%NeY * refelem%Nfp
690 end do
691
692 return
694
695!OCL SERIAL
697 buf )
698 use scale_polynomial, only: &
700 implicit none
701 class(meshcubedspheredom2d), target, intent(in) :: mesh2d
702 class(meshfield2d), intent(in) :: field2d
703 real(rp), intent(inout) :: buf(:,:)
704
705 integer :: n, kelem1
706 integer :: i0, j0, p0, i1, j1, i2, j2, i, j
707 type(localmesh2d), pointer :: lcmesh
708 type(elementbase2d), pointer :: refelem
709 integer :: i0_s, j0_s
710 integer :: nfp
711 !------------------------------------------------
712
713 i0_s = 0; j0_s = 0
714
715 do p0=1, size(mesh2d%rcdomIJP2LCMeshID,3)
716 do j0=1, size(mesh2d%rcdomIJP2LCMeshID,2)
717 do i0=1, size(mesh2d%rcdomIJP2LCMeshID,1)
718 n = mesh2d%rcdomIJP2LCMeshID(i0,j0,p0)
719
720 lcmesh => mesh2d%lcmesh_list(n)
721 refelem => lcmesh%refElem2D
722 nfp = refelem%Nfp
723
724 do j1=1, lcmesh%NeY
725 do i1=1, lcmesh%NeX
726 kelem1 = i1 + (j1-1)*lcmesh%NeX
727
728 do j2=1, nfp
729 do i2=1, nfp
730 i = i0_s + i2 + (i1-1)*nfp
731 j = j0_s + j2 + (j1-1)*nfp
732 buf(i,j) = field2d%local(n)%val(i2+(j2-1)*nfp,kelem1)
733 end do
734 end do
735
736 end do
737 end do
738
739 i0_s = i0_s + lcmesh%NeX * refelem%Nfp
740 end do
741 j0_s = j0_s + lcmesh%NeY * refelem%Nfp
742 end do
743 i0_s = 0
744 end do
745
746 return
748
749!OCL SERIAL
751 field2D )
752 implicit none
753 class(meshrectdom2d), target, intent(in) :: mesh2d
754 real(rp), intent(in) :: buf(:,:)
755 class(meshfield2d), intent(inout) :: field2d
756
757 integer :: n
758 integer :: i0, j0
759 type(localmesh2d), pointer :: lcmesh
760 type(elementbase2d), pointer :: refelem
761 integer :: i0_s, j0_s
762 !----------------------------------------------------
763
764 i0_s = 0; j0_s = 0
765
766 do j0=1, size(mesh2d%rcdomIJ2LCMeshID,2)
767 do i0=1, size(mesh2d%rcdomIJ2LCMeshID,1)
768 n = mesh2d%rcdomIJ2LCMeshID(i0,j0)
769 lcmesh => mesh2d%lcmesh_list(n)
770 refelem => lcmesh%refElem2D
771
773 lcmesh, buf(:,:), i0_s, j0_s, &
774 field2d%local(n)%val(:,:) )
775 !$acc update device(field2d%local(n)%val)
776
777 i0_s = i0_s + lcmesh%NeX * refelem%Nfp
778 end do
779 j0_s = j0_s + lcmesh%NeY * refelem%Nfp
780 i0_s = 0
781 end do
782
783 return
785
786!OCL SERIAL
788 lcmesh, buf, i0_s, j0_s, &
789 val )
790 implicit none
791 type(localmesh2d), intent(in) :: lcmesh
792 real(rp), intent(in) :: buf(:,:)
793 integer, intent(in) :: i0_s, j0_s
794 real(rp), intent(inout) :: val(lcmesh%refelem2d%np,lcmesh%nea)
795
796 integer :: kelem1
797 integer :: i1, j1, i2, j2, i, j
798 type(elementbase2d), pointer :: refelem
799 integer :: indx
800 !----------------------------------------------------
801
802 refelem => lcmesh%refElem2D
803
804 do j1=1, lcmesh%NeY
805 do i1=1, lcmesh%NeX
806 kelem1 = i1 + (j1-1)*lcmesh%NeX
807 do j2=1, refelem%Nfp
808 do i2=1, refelem%Nfp
809 i = i0_s + i2 + (i1-1)*refelem%Nfp
810 j = j0_s + j2 + (j1-1)*refelem%Nfp
811 indx = i2 + (j2-1)*refelem%Nfp
812 val(indx,kelem1) = buf(i,j)
813 end do
814 end do
815 end do
816 end do
817
818 return
820
821!OCL SERIAL
823 field2D )
824 implicit none
825 class(meshcubedspheredom2d), target, intent(in) :: mesh2d
826 real(rp), intent(in) :: buf(:,:)
827 class(meshfield2d), intent(inout) :: field2d
828
829 integer :: n
830 integer :: i0, j0, p0
831 type(localmesh2d), pointer :: lcmesh
832 type(elementbase2d), pointer :: refelem
833 integer :: i0_s, j0_s, p0_s
834 !----------------------------------------------------
835
836 i0_s = 0; j0_s = 0; p0_s = 0
837
838 do p0=1, size(mesh2d%rcdomIJP2LCMeshID,3)
839 do j0=1, size(mesh2d%rcdomIJP2LCMeshID,2)
840 do i0=1, size(mesh2d%rcdomIJP2LCMeshID,1)
841 n = mesh2d%rcdomIJP2LCMeshID(i0,j0,p0)
842 lcmesh => mesh2d%lcmesh_list(n)
843 refelem => lcmesh%refElem2D
844
846 lcmesh, buf(:,:), i0_s, j0_s, &
847 field2d%local(n)%val(:,:) )
848 !$acc update device(field2d%local(n)%val)
849
850 i0_s = i0_s + lcmesh%NeX * refelem%Nfp
851 end do
852 j0_s = j0_s + lcmesh%NeY * refelem%Nfp
853 i0_s = 0
854 end do
855 end do
856
857 return
859
860 !- 3D ------------
861
862!OCL SERIAL
863 subroutine file_common_meshfield_get_dims3d( mesh3D, dim_name_postfix, & ! (in)
864 dimsinfo ) ! (out)
865 implicit none
866
867 class(meshcubedom3d), target, intent(in) :: mesh3D
868 character(len=H_SHORT), intent(in) :: dim_name_postfix
869 type(file_common_meshfield_diminfo), intent(out) :: dimsinfo(MESHBASE3D_DIMTYPE_NUM)
870
871 type(localmesh3d), pointer :: lcmesh
872 integer :: i, j, k, n
873 integer :: i_size, j_size, k_size
874
875 type(meshdiminfo), pointer :: dimInfo
876 type(meshdiminfo), pointer :: dimInfo_x
877 type(meshdiminfo), pointer :: dimInfo_y
878 type(meshdiminfo), pointer :: dimInfo_z
879 !-------------------------------------------------
880
881 i_size = 0
882 do i=1, size(mesh3d%rcdomIJK2LCMeshID,1)
883 n = mesh3d%rcdomIJK2LCMeshID(i,1,1)
884 lcmesh => mesh3d%lcmesh_list(n)
885 i_size = i_size + lcmesh%NeX * lcmesh%refElem3D%Nnode_h1D
886 end do
887
888 j_size = 0
889 do j=1, size(mesh3d%rcdomIJK2LCMeshID,2)
890 n = mesh3d%rcdomIJK2LCMeshID(1,j,1)
891 lcmesh => mesh3d%lcmesh_list(n)
892 j_size = j_size + lcmesh%NeY * lcmesh%refElem3D%Nnode_h1D
893 end do
894
895 k_size = 0
896 do k=1, size(mesh3d%rcdomIJK2LCMeshID,3)
897 n = mesh3d%rcdomIJK2LCMeshID(1,1,k)
898 lcmesh => mesh3d%lcmesh_list(n)
899 k_size = k_size + lcmesh%NeZ * lcmesh%refElem3D%Nnode_v
900 end do
901
902 diminfo_x => mesh3d%dimInfo(meshbase3d_dimtypeid_x)
903 call set_dimension( dimsinfo(meshbase3d_dimtypeid_x), &
904 diminfo_x, "X", 1, (/ diminfo_x%name /), (/ i_size /), &
905 dim_name_postfix )
906
907 diminfo_y => mesh3d%dimInfo(meshbase3d_dimtypeid_y)
908 call set_dimension( dimsinfo(meshbase3d_dimtypeid_y), &
909 diminfo_y, "Y", 1, (/ diminfo_y%name /), (/ j_size /), &
910 dim_name_postfix )
911
912 diminfo_z => mesh3d%dimInfo(meshbase3d_dimtypeid_z)
913 call set_dimension( dimsinfo(meshbase3d_dimtypeid_z), &
914 diminfo_z, "Z", 1, (/ diminfo_z%name /), (/ k_size /), &
915 dim_name_postfix, positive_down=(/ diminfo_z%positive_down /) )
916
917 diminfo => mesh3d%dimInfo(meshbase3d_dimtypeid_zt)
918 call set_dimension( dimsinfo(meshbase3d_dimtypeid_zt), &
919 diminfo, "ZT", 1, (/ diminfo_z%name /), (/ k_size /), &
920 dim_name_postfix )
921
922 diminfo => mesh3d%dimInfo(meshbase3d_dimtypeid_xy)
923 call set_dimension( dimsinfo(meshbase3d_dimtypeid_xy), &
924 diminfo, "XY", 2, (/ diminfo_x%name, diminfo_y%name /), &
925 (/ i_size, j_size /), dim_name_postfix )
926
927 diminfo => mesh3d%dimInfo(meshbase3d_dimtypeid_xyt)
928 call set_dimension( dimsinfo(meshbase3d_dimtypeid_xyt), &
929 diminfo, "XY", 2, (/ diminfo_x%name, diminfo_y%name /), &
930 (/ i_size, j_size /), dim_name_postfix )
931
932 diminfo => mesh3d%dimInfo(meshbase3d_dimtypeid_xyz)
933 call set_dimension( dimsinfo(meshbase3d_dimtypeid_xyz), &
934 diminfo, "XYZ", 3, (/ diminfo_x%name, diminfo_y%name, diminfo_z%name /), &
935 (/ i_size, j_size, k_size /), dim_name_postfix )
936
937 diminfo => mesh3d%dimInfo(meshbase3d_dimtypeid_xyzt)
938 call set_dimension( dimsinfo(meshbase3d_dimtypeid_xyzt), &
939 diminfo, "XYZT", 3, (/ diminfo_x%name, diminfo_y%name, diminfo_z%name /), &
940 (/ i_size, j_size, k_size /), dim_name_postfix )
941
942 return
944
945!OCL SERIAL
946 subroutine file_common_meshfield_get_dims3d_cubedsphere( mesh3D, dim_name_postfix, & ! (in)
947 dimsinfo ) ! (out)
948 implicit none
949
950 class(meshcubedspheredom3d), target, intent(in) :: mesh3D
951 character(len=H_SHORT), intent(in) :: dim_name_postfix
952 type(file_common_meshfield_diminfo), intent(out) :: dimsinfo(MESHBASE3D_DIMTYPE_NUM)
953
954 type(localmesh3d), pointer :: lcmesh
955 integer :: i, j, k, n
956
957 integer :: i_size, j_size, k_size
958
959 type(meshdiminfo), pointer :: diminfo
960 type(meshdiminfo), pointer :: diminfo_x
961 type(meshdiminfo), pointer :: diminfo_y
962 type(meshdiminfo), pointer :: diminfo_z
963 !-------------------------------------------------
964
965 i_size = 0
966 do i=1, size(mesh3d%rcdomIJKP2LCMeshID,1)
967 n = mesh3d%rcdomIJKP2LCMeshID(i,1,1,1)
968 lcmesh => mesh3d%lcmesh_list(n)
969 i_size =i_size + lcmesh%NeX * lcmesh%refElem3D%Nnode_h1D
970 end do
971
972 j_size = 0
973 do j=1, size(mesh3d%rcdomIJKP2LCMeshID,2)
974 n = mesh3d%rcdomIJKP2LCMeshID(1,j,1,1)
975 lcmesh => mesh3d%lcmesh_list(n)
976 j_size = j_size + lcmesh%NeY * lcmesh%refElem3D%Nnode_h1D
977 end do
978
979 k_size = 0
980 do k=1, size(mesh3d%rcdomIJKP2LCMeshID,3)
981 n = mesh3d%rcdomIJKP2LCMeshID(1,1,k,1)
982 lcmesh => mesh3d%lcmesh_list(n)
983 k_size = k_size + lcmesh%NeZ * lcmesh%refElem3D%Nnode_v
984 end do
985
986 k_size = k_size * size(mesh3d%rcdomIJKP2LCMeshID,4)
987
988 diminfo_x => mesh3d%dimInfo(meshbase3d_dimtypeid_x)
989 call set_dimension( dimsinfo(meshbase3d_dimtypeid_x), &
990 diminfo_x, "X", 1, (/ diminfo_x%name /), (/ i_size /), &
991 dim_name_postfix )
992
993 diminfo_y => mesh3d%dimInfo(meshbase3d_dimtypeid_y)
994 call set_dimension( dimsinfo(meshbase3d_dimtypeid_y), &
995 diminfo_y, "Y", 1, (/ diminfo_y%name /), (/ j_size /), &
996 dim_name_postfix )
997
998 diminfo_z => mesh3d%dimInfo(meshbase3d_dimtypeid_z)
999 call set_dimension( dimsinfo(meshbase3d_dimtypeid_z), &
1000 diminfo_z, "Z", 1, (/ diminfo_z%name /), (/ k_size /), &
1001 dim_name_postfix, positive_down=(/ diminfo_z%positive_down /) )
1002
1003 diminfo => mesh3d%dimInfo(meshbase3d_dimtypeid_zt)
1004 call set_dimension( dimsinfo(meshbase3d_dimtypeid_zt), &
1005 diminfo, "ZT", 1, (/ diminfo_z%name /), (/ k_size /), &
1006 dim_name_postfix )
1007
1008 diminfo => mesh3d%dimInfo(meshbase3d_dimtypeid_xy)
1009 call set_dimension( dimsinfo(meshbase3d_dimtypeid_xy), &
1010 diminfo, "XY", 2, (/ diminfo_x%name, diminfo_y%name /), &
1011 (/ i_size, j_size /), &
1012 dim_name_postfix )
1013
1014 diminfo => mesh3d%dimInfo(meshbase3d_dimtypeid_xyt)
1015 call set_dimension( dimsinfo(meshbase3d_dimtypeid_xyt), &
1016 diminfo, "XY", 2, (/ diminfo_x%name, diminfo_y%name /), &
1017 (/ i_size, j_size /), &
1018 dim_name_postfix )
1019
1020 diminfo => mesh3d%dimInfo(meshbase3d_dimtypeid_xyz)
1021 call set_dimension( dimsinfo(meshbase3d_dimtypeid_xyz), &
1022 diminfo, "XYZ", 3, (/ diminfo_x%name, diminfo_y%name, diminfo_z%name /), &
1023 (/ i_size, j_size, k_size /), &
1024 dim_name_postfix )
1025
1026 diminfo => mesh3d%dimInfo(meshbase3d_dimtypeid_xyzt)
1027 call set_dimension( dimsinfo(meshbase3d_dimtypeid_xyzt), &
1028 diminfo, "XYZT", 3, (/ diminfo_x%name, diminfo_y%name, diminfo_z%name /), &
1029 (/ i_size, j_size, k_size /), &
1030 dim_name_postfix )
1031
1032 return
1033 end subroutine file_common_meshfield_get_dims3d_cubedsphere
1034
1035!OCL SERIAL
1036 subroutine file_common_meshfield_get_axis3d( mesh3D, dimsinfo, x, y, z, &
1037 force_uniform_grid )
1038 implicit none
1039
1040 class(meshcubedom3d), target, intent(in) :: mesh3D
1041 type(file_common_meshfield_diminfo), intent(in) :: dimsinfo(MESHBASE3D_DIMTYPE_NUM)
1042 real(RP), intent(out) :: x(dimsinfo(MeshBase3D_DIMTYPEID_X)%size)
1043 real(RP), intent(out) :: y(dimsinfo(MeshBase3D_DIMTYPEID_Y)%size)
1044 real(RP), intent(out) :: z(dimsinfo(MeshBase3D_DIMTYPEID_Z)%size)
1045 logical, intent(in), optional :: force_uniform_grid
1046
1047 integer :: n, kelem
1048 integer :: i, j, k
1049 type(elementbase3d), pointer :: refElem
1050 type(localmesh3d), pointer :: lcmesh
1051
1052 integer :: is, js, ks, ie, je, ke, igs, jgs, kgs
1053 integer :: Nnode_h1D, Nnode_v
1054
1055 logical :: uniform_grid = .false.
1056 real(RP), allocatable :: x_local(:)
1057 real(RP), allocatable :: y_local(:)
1058 real(RP), allocatable :: z_local(:)
1059 !------------------------------------------------------------------------------------------
1060
1061 if ( present(force_uniform_grid) ) uniform_grid = force_uniform_grid
1062
1063 igs = 0; jgs = 0; kgs = 0
1064
1065 do n=1 ,mesh3d%LOCAL_MESH_NUM
1066 lcmesh => mesh3d%lcmesh_list(n)
1067 refelem => lcmesh%refElem3D
1068 nnode_h1d = refelem%Nnode_h1D
1069 nnode_v = refelem%Nnode_v
1070
1071 allocate( x_local(nnode_h1d), y_local(nnode_h1d) )
1072 allocate( z_local(nnode_v) )
1073
1074 do k=1, lcmesh%NeZ
1075 do j=1, lcmesh%NeY
1076 do i=1, lcmesh%NeX
1077 kelem = i + (j-1)*lcmesh%NeX + (k-1)*lcmesh%NeX*lcmesh%NeY
1078 if ( j==1 .and. k==1) then
1079 x_local(:) = lcmesh%pos_en(refelem%Fmask_h(1:nnode_h1d,1),kelem,1)
1080 if ( uniform_grid ) call get_uniform_grid1d( x_local, nnode_h1d )
1081
1082 is = igs + 1 + (i-1)*nnode_h1d
1083 ie = is + nnode_h1d - 1
1084 x(is:ie) = x_local(:)
1085 end if
1086 if ( i==1 .and. k==1) then
1087 y_local(:) = lcmesh%pos_en(refelem%Fmask_h(1:nnode_h1d,4),kelem,2)
1088 if ( uniform_grid ) call get_uniform_grid1d( y_local, nnode_h1d )
1089
1090 js = jgs + 1 + (j-1)*nnode_h1d
1091 je = js + nnode_h1d - 1
1092 y(js:je) = y_local(:)
1093 end if
1094 if ( i==1 .and. j==1) then
1095 z_local(:) = lcmesh%pos_en(refelem%Colmask(:,1),kelem,3)
1096 if ( uniform_grid ) call get_uniform_grid1d( z_local, nnode_v )
1097
1098 ks = kgs + 1 + (k-1)*nnode_v
1099 ke = ks + nnode_v - 1
1100 z(ks:ke) = z_local(:)
1101 end if
1102 end do
1103 end do
1104 end do
1105
1106 igs = ie; jgs = je; kgs = ke
1107 deallocate( x_local, y_local )
1108 deallocate( z_local )
1109 end do
1110
1111 return
1113
1114!OCL SERIAL
1115 subroutine file_common_meshfield_get_axis3d_cubedsphere( mesh3D, dimsinfo, x, y, z )
1116 implicit none
1117
1118 class(meshcubedspheredom3d), target, intent(in) :: mesh3D
1119 type(file_common_meshfield_diminfo), intent(in) :: dimsinfo(MESHBASE3D_DIMTYPE_NUM)
1120 real(RP), intent(out) :: x(dimsinfo(MeshBase3D_DIMTYPEID_X)%size)
1121 real(RP), intent(out) :: y(dimsinfo(MeshBase3D_DIMTYPEID_Y)%size)
1122 real(RP), intent(out) :: z(dimsinfo(MeshBase3D_DIMTYPEID_Z)%size)
1123
1124 integer :: n, ni, nj, nk, np
1125 integer :: kelem
1126 integer :: i, j, k
1127 type(elementbase3d), pointer :: refElem
1128 type(localmesh3d), pointer :: lcmesh
1129
1130 integer :: is, js, ks, ie, je, ke, igs, jgs, kgs
1131
1132 logical :: uniform_grid = .false.
1133 real(RP), allocatable :: x_local(:)
1134 real(RP), allocatable :: y_local(:)
1135 real(RP), allocatable :: z_local(:)
1136 !-------------------------------------------------
1137
1138 igs = 0; jgs = 0; kgs = 0
1139
1140 do np=1, size(mesh3d%rcdomIJKP2LCMeshID,4)
1141 do nk=1, size(mesh3d%rcdomIJKP2LCMeshID,3)
1142 do nj=1, size(mesh3d%rcdomIJKP2LCMeshID,2)
1143 do ni=1, size(mesh3d%rcdomIJKP2LCMeshID,1)
1144 n = mesh3d%rcdomIJKP2LCMeshID(ni,nj,nk,np)
1145 lcmesh => mesh3d%lcmesh_list(n)
1146 refelem => lcmesh%refElem3D
1147
1148 allocate( x_local(refelem%Nnode_h1D), y_local(refelem%Nnode_h1D), z_local(refelem%Nnode_v) )
1149
1150 do k=1, lcmesh%NeZ
1151 do j=1, lcmesh%NeY
1152 do i=1, lcmesh%NeX
1153 kelem = i + (j-1) * lcmesh%NeX + (k-1) * lcmesh%NeX * lcmesh%NeY
1154 if ( j==1 .and. nj == 1 .and. k==1 .and. nk == 1 .and. np == 1) then
1155 x_local(:) = lcmesh%pos_en(refelem%Fmask_h(1:refelem%Nnode_h1D,1),kelem,1)
1156
1157 is = igs + 1 + (i-1)*refelem%Nnode_h1D
1158 ie = is + refelem%Nnode_h1D - 1
1159 x(is:ie) = x_local(:)
1160 end if
1161 if ( i==1 .and. ni == 1 .and. k==1 .and. nk == 1 .and. np == 1 ) then
1162 y_local(:) = lcmesh%pos_en(refelem%Fmask_h(1:refelem%Nnode_h1D,4),kelem,2)
1163
1164 js = jgs + 1 + (j-1)*refelem%Nnode_h1D
1165 je = js + refelem%Nnode_h1D - 1
1166 y(js:je) = y_local(:)
1167 end if
1168 if ( i==1 .and. ni == 1 .and. j == 1 .and. nj == 1 ) then
1169 z_local(:) = lcmesh%pos_en(refelem%Colmask(:,1),kelem,3) &
1170 + ( lcmesh%panelID - 1.0_rp ) * ( mesh3d%zmax_gl - mesh3d%zmin_gl )
1171
1172 ks = kgs + 1 + (k-1)*refelem%Nnode_v
1173 ke = ks + refelem%Nnode_v - 1
1174 z(ks:ke) = z_local(:)
1175 end if
1176 end do
1177 end do
1178 end do
1179
1180 igs = ie; jgs = je; kgs = ke
1181 deallocate( x_local, y_local, z_local )
1182 end do
1183 end do
1184 end do
1185 end do
1186
1187 return
1188 end subroutine file_common_meshfield_get_axis3d_cubedsphere
1189
1190!OCL_SERIAL
1191 subroutine file_common_meshfield_put_field3d_cartesbuf( mesh3D, field3D, &
1192 buf, force_uniform_grid )
1193 use scale_polynomial, only: &
1195 implicit none
1196 class(meshcubedom3d), target, intent(in) :: mesh3d
1197 class(meshfield3d), intent(in) :: field3d
1198 real(rp), intent(inout) :: buf(:,:,:)
1199 logical, intent(in), optional :: force_uniform_grid
1200
1201 integer :: n, kelem1
1202 integer :: i0, j0, k0, i1, j1, k1, i2, j2, k2, i, j, k
1203 type(localmesh3d), pointer :: lcmesh
1204 type(elementbase3d), pointer :: refelem
1205 integer :: i0_s, j0_s, k0_s, indx
1206
1207 logical :: uniform_grid = .false.
1208 integer :: nnode_h1d, nnode_v
1209 real(rp), allocatable :: x_local(:)
1210 real(rp) :: x_local0, delx
1211 real(rp), allocatable :: y_local(:)
1212 real(rp) :: y_local0, dely
1213 real(rp), allocatable :: z_local(:)
1214 real(rp) :: z_local0, delz
1215 real(rp) :: ox(1), oy(1), oz(1)
1216 real(rp), allocatable :: spectral_coef(:)
1217 real(rp), allocatable :: p1d_ori_x(:,:)
1218 real(rp), allocatable :: p1d_ori_y(:,:)
1219 real(rp), allocatable :: p1d_ori_z(:,:)
1220 integer :: l, p1, p2, p3
1221 !----------------------------------------------------
1222
1223 if ( present(force_uniform_grid) ) uniform_grid = force_uniform_grid
1224
1225 i0_s = 0; j0_s = 0; k0_s = 0
1226
1227 do k0=1, size(mesh3d%rcdomIJK2LCMeshID,3)
1228 do j0=1, size(mesh3d%rcdomIJK2LCMeshID,2)
1229 do i0=1, size(mesh3d%rcdomIJK2LCMeshID,1)
1230 n = mesh3d%rcdomIJK2LCMeshID(i0,j0,k0)
1231
1232 lcmesh => mesh3d%lcmesh_list(n)
1233 refelem => lcmesh%refElem3D
1234 nnode_h1d = refelem%Nnode_h1D
1235 nnode_v = refelem%Nnode_v
1236
1237 if ( uniform_grid ) then
1238 allocate( x_local(nnode_h1d), y_local(nnode_h1d) )
1239 allocate( z_local(nnode_v) )
1240 allocate( spectral_coef(refelem%Np) )
1241 allocate( p1d_ori_x(1,nnode_h1d), p1d_ori_y(1,nnode_h1d) )
1242 allocate( p1d_ori_z(1,nnode_v) )
1243 end if
1244
1245 !$omp parallel do collapse(2) private( kelem1, &
1246 !$omp i, i1, i2, j, j2, k, k2, indx, &
1247 !$omp x_local, x_local0, y_local, y_local0, z_local, z_local0, &
1248 !$omp delx, dely, delz, ox, oy, oz, &
1249 !$omp spectral_coef, P1D_ori_x, P1D_ori_y, P1D_ori_z, &
1250 !$omp p1, p2, p3, l )
1251 do k1=1, lcmesh%NeZ
1252 do j1=1, lcmesh%NeY
1253 do i1=1, lcmesh%NeX
1254 kelem1 = i1 + (j1-1)*lcmesh%NeX + (k1-1)*lcmesh%NeX*lcmesh%NeY
1255
1256 if ( uniform_grid ) then
1257 x_local(:) = lcmesh%pos_en(refelem%Fmask_h(1:nnode_h1d,1),kelem1,1)
1258 x_local0 = x_local(1); delx = x_local(nnode_h1d) - x_local0
1259 y_local(:) = lcmesh%pos_en(refelem%Fmask_h(1:nnode_h1d,4),kelem1,2)
1260 y_local0 = y_local(1); dely = y_local(nnode_h1d) - y_local0
1261 z_local(:) = lcmesh%pos_en(refelem%Colmask(:,1),kelem1,3)
1262 z_local0 = z_local(1); delz = z_local(nnode_v ) - z_local0
1263 call get_uniform_grid1d( x_local, nnode_h1d )
1264 call get_uniform_grid1d( y_local, nnode_h1d )
1265 call get_uniform_grid1d( z_local, nnode_v )
1266
1267 spectral_coef(:) = matmul(refelem%invV(:,:), field3d%local(n)%val(:,kelem1))
1268 do k2=1, nnode_v
1269 do j2=1, nnode_h1d
1270 do i2=1, nnode_h1d
1271 ox(1) = - 1.0_rp + 2.0_rp * (x_local(i2) - x_local0) / delx
1272 oy(1) = - 1.0_rp + 2.0_rp * (y_local(j2) - y_local0) / dely
1273 oz(1) = - 1.0_rp + 2.0_rp * (z_local(k2) - z_local0) / delz
1274
1275 call polynomial_genlegendrepoly_sub( refelem%PolyOrder_h, ox, p1d_ori_x )
1276 call polynomial_genlegendrepoly_sub( refelem%PolyOrder_h, oy, p1d_ori_y )
1277 call polynomial_genlegendrepoly_sub( refelem%PolyOrder_v, oz, p1d_ori_z )
1278
1279 i = i0_s + i2 + (i1-1)*nnode_h1d
1280 j = j0_s + j2 + (j1-1)*nnode_h1d
1281 k = k0_s + k2 + (k1-1)*nnode_v
1282 buf(i,j,k) = 0.0_rp
1283 do p3=1, nnode_v
1284 do p2=1, nnode_h1d
1285 do p1=1, nnode_h1d
1286 l = p1 + (p2-1)*nnode_h1d + (p3-1)*nnode_h1d**2
1287 buf(i,j,k) = buf(i,j,k) + &
1288 ( p1d_ori_x(1,p1) * p1d_ori_y(1,p2) * p1d_ori_z(1,p3) ) &
1289 * sqrt((dble(p1-1) + 0.5_rp)*(dble(p2-1) + 0.5_rp)*(dble(p3-1) + 0.5_rp)) &
1290 * spectral_coef(l)
1291 end do
1292 end do
1293 end do
1294 end do
1295 end do
1296 end do
1297 else
1298 do k2=1, nnode_v
1299 do j2=1, nnode_h1d
1300 do i2=1, nnode_h1d
1301 i = i0_s + i2 + (i1-1)*nnode_h1d
1302 j = j0_s + j2 + (j1-1)*nnode_h1d
1303 k = k0_s + k2 + (k1-1)*nnode_v
1304 indx = i2 + (j2-1)*nnode_h1d + (k2-1)*nnode_h1d**2
1305 buf(i,j,k) = field3d%local(n)%val(indx,kelem1)
1306 end do
1307 end do
1308 end do
1309 end if
1310 end do
1311 end do
1312 end do
1313
1314 if ( uniform_grid ) then
1315 deallocate( x_local, y_local )
1316 deallocate( z_local )
1317 deallocate( spectral_coef )
1318 end if
1319
1320 i0_s = i0_s + lcmesh%NeX * refelem%Nnode_h1D
1321 end do
1322 j0_s = j0_s + lcmesh%NeY * refelem%Nnode_h1D
1323 i0_s = 0
1324 end do
1325 k0_s = k0_s + lcmesh%NeZ * refelem%Nnode_v
1326 j0_s = 0
1327 end do
1328
1329 return
1331
1332!OCL SERIAL
1334 buf )
1335 implicit none
1336 class(meshcubedspheredom3d), target, intent(in) :: mesh3d
1337 class(meshfield3d), intent(in) :: field3d
1338 real(rp), intent(inout) :: buf(:,:,:)
1339
1340 integer :: kelem1
1341 integer :: n, i0, j0, k0, p0
1342 integer :: i1, j1, k1, i2, j2, k2, i, j, k
1343 type(localmesh3d), pointer :: lcmesh
1344 type(elementbase3d), pointer :: refelem
1345 integer :: i0_s, j0_s, k0_s
1346 integer :: nnode_h1d
1347 integer :: nnode_v
1348 !------------------------------------------------
1349
1350 i0_s = 0; j0_s = 0; k0_s = 0
1351
1352 do p0=1, size(mesh3d%rcdomIJKP2LCMeshID,4)
1353 do k0=1, size(mesh3d%rcdomIJKP2LCMeshID,3)
1354 do j0=1, size(mesh3d%rcdomIJKP2LCMeshID,2)
1355 do i0=1, size(mesh3d%rcdomIJKP2LCMeshID,1)
1356 n = mesh3d%rcdomIJKP2LCMeshID(i0,j0,k0,p0)
1357
1358 lcmesh => mesh3d%lcmesh_list(n)
1359 refelem => lcmesh%refElem3D
1360 nnode_h1d = refelem%Nnode_h1D
1361 nnode_v = refelem%Nnode_v
1362
1363 do k1=1, lcmesh%NeZ
1364 do j1=1, lcmesh%NeY
1365 do i1=1, lcmesh%NeX
1366 kelem1 = i1 + (j1-1)*lcmesh%NeX + (k1-1)*lcmesh%NeX*lcmesh%NeY
1367
1368 do k2=1, nnode_v
1369 do j2=1, nnode_h1d
1370 do i2=1, nnode_h1d
1371 i = i0_s + i2 + (i1-1)*nnode_h1d
1372 j = j0_s + j2 + (j1-1)*nnode_h1d
1373 k = k0_s + k2 + (k1-1)*nnode_v
1374 buf(i,j,k) = field3d%local(n)%val(i2+(j2-1)*nnode_h1d+(k2-1)*nnode_h1d**2,kelem1)
1375 end do
1376 end do
1377 end do
1378 end do
1379 end do
1380 end do
1381
1382 i0_s = i0_s + lcmesh%NeX * refelem%Nnode_h1D
1383 end do
1384 j0_s = j0_s + lcmesh%NeY * refelem%Nnode_h1D
1385 i0_s = 0
1386 end do
1387 k0_s = k0_s + lcmesh%NeZ * refelem%Nnode_v
1388 j0_s = 0
1389 end do
1390 end do
1391
1392 return
1394
1396 field3D )
1397 implicit none
1398 class(meshcubedom3d), target, intent(in) :: mesh3d
1399 real(rp), intent(in) :: buf(:,:,:)
1400 class(meshfield3d), intent(inout) :: field3d
1401
1402 integer :: n
1403 integer :: i0, j0, k0
1404 type(localmesh3d), pointer :: lcmesh
1405 type(elementbase3d), pointer :: refelem
1406 integer :: i0_s, j0_s, k0_s
1407 !----------------------------------------------------
1408
1409 i0_s = 0; j0_s = 0; k0_s = 0
1410
1411 do k0=1, size(mesh3d%rcdomIJK2LCMeshID,3)
1412 do j0=1, size(mesh3d%rcdomIJK2LCMeshID,2)
1413 do i0=1, size(mesh3d%rcdomIJK2LCMeshID,1)
1414 n = mesh3d%rcdomIJK2LCMeshID(i0,j0,k0)
1415 lcmesh => mesh3d%lcmesh_list(n)
1416 refelem => lcmesh%refElem3D
1417
1419 lcmesh, buf(:,:,:), i0_s, j0_s, k0_s, &
1420 field3d%local(n)%val(:,:) )
1421 !$acc update device(field3d%local(n)%val)
1422
1423 i0_s = i0_s + lcmesh%NeX * refelem%Nnode_h1D
1424 end do
1425 j0_s = j0_s + lcmesh%NeY * refelem%Nnode_h1D
1426 i0_s = 0
1427 end do
1428 k0_s = k0_s + lcmesh%NeZ * refelem%Nnode_v
1429 j0_s = 0
1430 end do
1431
1432 return
1434
1435!OCL SERIAL
1437 field3D )
1438 implicit none
1439 class(meshcubedspheredom3d), target, intent(in) :: mesh3d
1440 real(rp), intent(in) :: buf(:,:,:)
1441 class(meshfield3d), intent(inout) :: field3d
1442
1443 integer :: n
1444 integer :: i0, j0, k0, p0
1445 type(localmesh3d), pointer :: lcmesh
1446 type(elementbase3d), pointer :: refelem
1447 integer :: i0_s, j0_s, k0_s, p0_s
1448 !----------------------------------------------------
1449
1450 i0_s = 0; j0_s = 0; k0_s = 0; p0_s = 0
1451
1452 do p0=1, size(mesh3d%rcdomIJKP2LCMeshID,4)
1453 do k0=1, size(mesh3d%rcdomIJKP2LCMeshID,3)
1454 do j0=1, size(mesh3d%rcdomIJKP2LCMeshID,2)
1455 do i0=1, size(mesh3d%rcdomIJKP2LCMeshID,1)
1456 n = mesh3d%rcdomIJKP2LCMeshID(i0,j0,k0,p0)
1457 lcmesh => mesh3d%lcmesh_list(n)
1458 refelem => lcmesh%refElem3D
1459
1461 lcmesh, buf(:,:,:), i0_s, j0_s, k0_s, &
1462 field3d%local(n)%val(:,:) )
1463 !$acc update device(field3d%local(n)%val)
1464
1465 i0_s = i0_s + lcmesh%NeX * refelem%Nnode_h1D
1466 end do
1467 j0_s = j0_s + lcmesh%NeY * refelem%Nnode_h1D
1468 i0_s = 0
1469 end do
1470 k0_s = k0_s + lcmesh%NeZ * refelem%Nnode_v
1471 j0_s = 0
1472 end do
1473 end do
1474
1475 return
1477
1478!OCL SERIAL
1480 lcmesh, buf, i0_s, j0_s, k0_s, &
1481 val )
1482 implicit none
1483 type(localmesh3d), intent(in) :: lcmesh
1484 real(rp), intent(in) :: buf(:,:,:)
1485 integer, intent(in) :: i0_s, j0_s, k0_s
1486 real(rp), intent(inout) :: val(lcmesh%refelem3d%np,lcmesh%nea)
1487
1488 integer :: kelem1
1489 integer :: i1, j1, k1, i2, j2, k2, i, j, k
1490 type(elementbase3d), pointer :: refelem
1491 integer :: indx
1492 !----------------------------------------------------
1493
1494 refelem => lcmesh%refElem3D
1495
1496 !$omp parallel do collapse(3) private( &
1497 !$omp kelem1, k2,j2,i2, i,j,k, indx )
1498 do k1=1, lcmesh%NeZ
1499 do j1=1, lcmesh%NeY
1500 do i1=1, lcmesh%NeX
1501 kelem1 = i1 + (j1-1)*lcmesh%NeX + (k1-1)*lcmesh%NeX*lcmesh%NeY
1502 do k2=1, refelem%Nnode_v
1503 do j2=1, refelem%Nnode_h1D
1504 do i2=1, refelem%Nnode_h1D
1505 i = i0_s + i2 + (i1-1)*refelem%Nnode_h1D
1506 j = j0_s + j2 + (j1-1)*refelem%Nnode_h1D
1507 k = k0_s + k2 + (k1-1)*refelem%Nnode_v
1508 indx = i2 + (j2-1)*refelem%Nnode_h1D + (k2-1)*refelem%Nnode_h1D**2
1509 val(indx,kelem1) = buf(i,j,k)
1510 end do
1511 end do
1512 end do
1513 end do
1514 end do
1515 end do
1516
1517 return
1519
1520 function file_common_meshfield_get_dtype( datatype ) result( dtype )
1521 use scale_file_h, only: &
1522 file_real8, file_real4
1523 use scale_prc, &
1524 only: prc_abort
1525
1526 implicit none
1527
1528 character(*), intent(in) :: datatype
1529 integer :: dtype
1530 !--------------------------
1531
1532 ! dtype is used to define the data type of axis variables in file
1533 if ( datatype == 'REAL8' ) then
1534 dtype = file_real8
1535 elseif( datatype == 'REAL4' ) then
1536 dtype = file_real4
1537 else
1538 if ( rp == 8 ) then
1539 dtype = file_real8
1540 elseif( rp == 4 ) then
1541 dtype = file_real4
1542 else
1543 log_error("file_restart_meshfield_get_dtype",*) 'unsupported data type. Check!', trim(datatype)
1544 call prc_abort
1545 endif
1546 endif
1547
1548 return
1550
1551 !- private -----------------------------------------------------------------------
1552
1553 subroutine get_uniform_grid1d( pos1D, Np )
1554 implicit none
1555 integer, intent(in) :: np
1556 real(rp), intent(inout) :: pos1d(np)
1557
1558 real(rp) :: del
1559 integer :: i
1560 !-----------------------------------------------
1561
1562 del = ( pos1d(np) - pos1d(1) ) / dble(np)
1563 pos1d(1) = pos1d(1) + 0.5_rp * del
1564 do i=2, np
1565 pos1d(i) = pos1d(i-1) + del
1566 end do
1567
1568 return
1569 end subroutine get_uniform_grid1d
1570
1571 !> Set dimension information for file output
1572 subroutine set_dimension( dim, & ! (out)
1573 diminfo, dim_type, ndims, dims, count, & ! (in)
1574 dim_postfix, positive_down ) ! (in)
1575 implicit none
1576
1577 type(file_common_meshfield_diminfo), intent(out) :: dim
1578 type(meshdiminfo), intent(in) :: diminfo
1579 character(*), intent(in) :: dim_type
1580 integer, intent(in) :: ndims
1581 character(len=*), intent(in) :: dims(ndims)
1582 integer, intent(in) :: count(ndims)
1583 character(*), intent(in) :: dim_postfix
1584 logical, intent(in), optional :: positive_down(ndims)
1585
1586 integer :: d
1587 !----------------------------------------------------
1588
1589 dim%name = trim(diminfo%name) // trim(dim_postfix)
1590 dim%unit = diminfo%unit
1591 dim%desc = diminfo%desc
1592 dim%type = trim(dim_type) // trim(dim_postfix)
1593 dim%ndim = ndims
1594 dim%size = 1
1595 do d=1, ndims
1596 dim%dims(d) = trim(dims(d)) // trim(dim_postfix)
1597 dim%count(d) = count(d)
1598 dim%size = dim%size * count(d)
1599 if ( present(positive_down) ) then
1600 dim%positive_down(d) = positive_down(d)
1601 else
1602 dim%positive_down(d) = .false.
1603 end if
1604 end do
1605
1606 return
1607 end subroutine set_dimension
1608
module FElib / Element / Base
subroutine, public file_common_meshfield_get_axis1d(mesh1d, dimsinfo, x, force_uniform_grid)
subroutine, public file_common_meshfield_set_cartesbuf_field1d(mesh1d, buf, field1d)
subroutine, public file_common_meshfield_get_axis3d(mesh3d, dimsinfo, x, y, z, force_uniform_grid)
subroutine, public file_common_meshfield_get_dims1d(mesh1d, dim_name_postfix, dimsinfo)
subroutine, public file_common_meshfield_set_cartesbuf_field2d(mesh2d, buf, field2d)
subroutine, public file_common_meshfield_put_field3d_cubedsphere_cartesbuf(mesh3d, field3d, buf)
subroutine, public file_common_meshfield_put_field2d_cubedsphere_cartesbuf(mesh2d, field2d, buf)
subroutine, public file_common_meshfield_put_field2d_cartesbuf(mesh2d, field2d, buf, force_uniform_grid)
subroutine, public file_common_meshfield_set_cartesbuf_field3d(mesh3d, buf, field3d)
subroutine, public file_common_meshfield_put_field1d_cartesbuf(mesh1d, field1d, buf, force_uniform_grid)
subroutine, public file_common_meshfield_get_dims2d(mesh2d, dim_name_postfix, dimsinfo)
subroutine, public file_common_meshfield_get_dims3d(mesh3d, dim_name_postfix, dimsinfo)
subroutine, public file_common_meshfield_set_cartesbuf_field2d_local(lcmesh, buf, i0_s, j0_s, val)
subroutine, public file_common_meshfield_set_cartesbuf_field3d_local(lcmesh, buf, i0_s, j0_s, k0_s, val)
subroutine, public file_common_meshfield_get_axis2d(mesh2d, dimsinfo, x, y, force_uniform_grid)
subroutine, public file_common_meshfield_put_field3d_cartesbuf(mesh3d, field3d, buf, force_uniform_grid)
subroutine, public file_common_meshfield_set_cartesbuf_field1d_local(lcmesh, buf, i0_s, val)
subroutine, public file_common_meshfield_set_cartesbuf_field3d_cubedsphere(mesh3d, buf, field3d)
subroutine, public file_common_meshfield_set_cartesbuf_field2d_cubedsphere(mesh2d, buf, field2d)
integer function, public file_common_meshfield_get_dtype(datatype)
module FElib / Mesh / Local 1D
module FElib / Mesh / Local 2D
module FElib / Mesh / Local 3D
module FElib / Mesh / Base 1D
integer, public meshbase1d_dimtype_num
integer, public meshbase1d_dimtypeid_x
integer, public meshbase1d_dimtypeid_xt
module FElib / Mesh / Base 2D
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 3D
integer, public meshbase3d_dimtypeid_y
integer, public meshbase3d_dimtypeid_zt
integer, public meshbase3d_dimtypeid_z
integer, public meshbase3d_dimtype_num
integer, public meshbase3d_dimtypeid_xy
integer, public meshbase3d_dimtypeid_xyt
integer, public meshbase3d_dimtypeid_xyz
integer, public meshbase3d_dimtypeid_x
integer, public meshbase3d_dimtypeid_xyzt
module FElib / Mesh / Base
module FElib / Mesh / Cubic 3D domain
module FElib / Mesh / Cubed-sphere 2D domain
module FElib / Mesh / Cubed-sphere 3D domain
module FElib / Mesh / Rectangle 2D domain
module FElib / Data / base
Module common / Polynomial.
real(rp) function, dimension(size(x), nord+1), public polynomial_genlegendrepoly(nord, x)
A function to obtain the values of Legendre polynomials which are evaluated at arbitrary points.
subroutine, public polynomial_genlegendrepoly_sub(nord, x, p)
A function to obtain the values of Legendre polynomials which are evaluated at arbitrary points.
Derived type representing a 1D reference element.
Derived type representing a 2D reference element.
Derived type representing a 3D reference element.
Derived type representing a local mesh for 1D domain.
Derived type representing a local mesh for 2D domain.
Derived type to manage a local 3D computational domain.
Derived type to manage a computational mesh (base type for 1D domain)
Derived type to manage a computational mesh (base type for 2D domain)
Derived type to manage a computational mesh (base type for 3D domain)
Derived type to manage an information of a mesh dimension.
Derived type to manage a cubic 3D computational domain.
Derived type to manage a cubed-sphere 2D computational domain.
Derived type to manage a cubed-sphere 3D computational domain.
Derived type to manage a rectangular 2D computational domain.
Derived type representing a field with 1D mesh.
Derived type representing a field with 2D mesh.
Derived type representing a field with 3D mesh.