10#include "scaleFElib.h"
59 module procedure file_common_meshfield_get_dims2d_cubedsphere
61 module procedure file_common_meshfield_get_dims3d_cubedsphere
72 module procedure file_common_meshfield_get_axis2d_cubedsphere
74 module procedure file_common_meshfield_get_axis3d_cubedsphere
95 character(len=H_SHORT) :: type
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
103 logical :: positive_down(3)
120 private :: get_uniform_grid1d
121 private :: set_dimension
131 class(
meshbase1d),
target,
intent(in) :: mesh1D
132 character(len=H_SHORT),
intent(in) :: dim_name_postfix
140 i_size = mesh1d%NeG * mesh1d%refElem1D%Np
144 diminfo_x,
"X", 1, (/ diminfo_x%name /), (/ i_size /), &
149 diminfo,
"XT", 1, (/ diminfo_x%name /), (/ i_size /), &
160 class(
meshbase1d),
target,
intent(in) :: mesh1D
162 real(RP),
intent(out) :: x(dimsinfo(MeshBase1D_DIMTYPEID_X)%size)
163 logical,
intent(in),
optional :: force_uniform_grid
171 logical :: uniform_grid = .false.
172 real(RP),
allocatable :: x_local(:)
175 if (
present(force_uniform_grid) ) uniform_grid = force_uniform_grid
177 do n=1,mesh1d%LOCAL_MESH_NUM
178 lcmesh => mesh1d%lcmesh_list(n)
179 refelem => lcmesh%refElem1D
181 allocate( x_local(refelem%Np) )
184 x_local(:) = lcmesh%pos_en(:,i,1)
185 if ( uniform_grid )
call get_uniform_grid1d( x_local, refelem%Nfp )
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(:)
192 deallocate( x_local )
200 buf, force_uniform_grid )
204 class(
meshbase1d),
target,
intent(in) :: mesh1d
206 real(rp),
intent(inout) :: buf(:)
207 logical,
intent(in),
optional :: force_uniform_grid
209 integer :: n, kelem1, p
215 logical :: uniform_grid = .false.
217 real(rp),
allocatable :: x_local(:)
218 real(rp) :: x_local0, delx
220 real(rp),
allocatable :: spectral_coef(:)
221 real(rp),
allocatable :: p1d_ori_x(:,:)
224 if (
present(force_uniform_grid) ) uniform_grid = force_uniform_grid
227 do n=1, mesh1d%LOCAL_MESH_NUM
228 lcmesh => mesh1d%lcmesh_list(n)
229 refelem => lcmesh%refElem1D
232 if ( uniform_grid )
then
233 allocate( x_local(np) )
234 allocate( spectral_coef(np) )
235 allocate( p1d_ori_x(1,np) )
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 )
244 spectral_coef(:) = matmul(refelem%invV(:,:), field1d%local(n)%val(:,kelem1))
246 ox = - 1.0_rp + 2.0_rp * (x_local(i2) - x_local0) / delx
249 i = i0_s + i2 + (kelem1-1)*np
253 p1d_ori_x(1,p) * sqrt( dble(p-1) + 0.5_rp ) * spectral_coef(p)
258 i = i0_s + i2 + (kelem1-1)*np
259 buf(i) = field1d%local(n)%val(i2,kelem1)
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 )
279 class(
meshbase1d),
target,
intent(in) :: mesh1d
280 real(rp),
intent(in) :: buf(:)
292 do i0=1, mesh1d%LOCAL_MESH_NUM
294 lcmesh => mesh1d%lcmesh_list(n)
295 refelem => lcmesh%refElem1D
298 lcmesh, buf(:), i0_s, &
299 field1d%local(n)%val(:,:) )
301 i0_s = i0_s + lcmesh%Ne * refelem%Np
313 real(rp),
intent(in) :: buf(:)
314 integer,
intent(in) :: i0_s
315 real(rp),
intent(inout) :: val(lcmesh%refelem1d%np,lcmesh%nea)
323 refelem => lcmesh%refElem1D
328 i = i0_s + i2 + (i1-1)*refelem%Np
330 val(indx,kelem1) = buf(i)
345 character(len=H_SHORT),
intent(in) :: dim_name_postfix
351 integer :: i_size, j_size
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
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
373 diminfo_x,
"X", 1, (/ diminfo_x%name /), (/ i_size /), &
378 diminfo_y,
"Y", 1, (/ diminfo_y%name /), (/ j_size /), &
383 diminfo,
"XY", 2, (/ diminfo_x%name, diminfo_y%name /), &
384 (/ i_size, j_size /), dim_name_postfix )
388 diminfo,
"XYT", 2, (/ diminfo_x%name, diminfo_y%name /), &
389 (/ i_size, j_size /), dim_name_postfix )
395 subroutine file_common_meshfield_get_dims2d_cubedsphere( mesh2D, dim_name_postfix, & ! (in)
400 character(len=H_SHORT),
intent(in) :: dim_name_postfix
406 integer :: i_size, j_size
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
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
427 j_size = j_size *
size(mesh2d%rcdomIJP2LCMeshID,3)
431 diminfo_x,
"X", 1, (/ diminfo_x%name /), (/ i_size /), &
436 diminfo_y,
"Y", 1, (/ diminfo_y%name /), (/ j_size /), &
441 diminfo,
"XY", 2, (/ diminfo_x%name, diminfo_y%name /), &
442 (/ i_size, j_size /), dim_name_postfix )
446 diminfo,
"XYT", 2, (/ diminfo_x%name, diminfo_y%name /), &
447 (/ i_size, j_size /), dim_name_postfix )
450 end subroutine file_common_meshfield_get_dims2d_cubedsphere
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
470 integer :: is, js, ie, je, igs, jgs
472 logical :: uniform_grid = .false.
473 real(RP),
allocatable :: x_local(:)
474 real(RP),
allocatable :: y_local(:)
477 if (
present(force_uniform_grid) ) uniform_grid = force_uniform_grid
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
486 allocate( x_local(refelem%Nfp), y_local(refelem%Nfp) )
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 )
495 is = igs + 1 + (i-1)*refelem%Nfp
496 ie = is + refelem%Nfp - 1
497 x(is:ie) = x_local(:)
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 )
503 js = jgs + 1 + (j-1)*refelem%Nfp
504 je = js + refelem%Nfp - 1
505 y(js:je) = y_local(:)
511 deallocate( x_local, y_local )
519 subroutine file_common_meshfield_get_axis2d_cubedsphere( mesh2D, dimsinfo, x, y )
520 use scale_const,
only: &
526 real(RP),
intent(out) :: x(dimsinfo(MeshBase2D_DIMTYPEID_X)%size)
527 real(RP),
intent(out) :: y(dimsinfo(MeshBase2D_DIMTYPEID_Y)%size)
529 integer :: ni, nj, np, n
535 integer :: is, js, ie, je, igs, jgs
537 logical :: uniform_grid = .false.
538 real(RP),
allocatable :: x_local(:)
539 real(RP),
allocatable :: y_local(:)
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
551 allocate( x_local(refelem%Nfp), y_local(refelem%Nfp) )
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)
559 is = igs + 1 + (i-1)*refelem%Nfp
560 ie = is + refelem%Nfp - 1
561 x(is:ie) = x_local(:)
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
567 js = jgs + 1 + (j-1)*refelem%Nfp
568 je = js + refelem%Nfp - 1
569 y(js:je) = y_local(:)
575 deallocate( x_local, y_local )
581 end subroutine file_common_meshfield_get_axis2d_cubedsphere
585 buf, force_uniform_grid )
591 real(rp),
intent(inout) :: buf(:,:)
592 logical,
intent(in),
optional :: force_uniform_grid
595 integer :: i0, j0, i1, j1, i2, j2, i, j
598 integer :: i0_s, j0_s
600 logical :: uniform_grid = .false.
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(:,:)
613 if (
present(force_uniform_grid) ) uniform_grid = force_uniform_grid
617 do j0=1,
size(mesh2d%rcdomIJ2LCMeshID,2)
618 do i0=1,
size(mesh2d%rcdomIJ2LCMeshID,1)
619 n = mesh2d%rcdomIJ2LCMeshID(i0,j0)
621 lcmesh => mesh2d%lcmesh_list(n)
622 refelem => lcmesh%refElem2D
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) )
633 kelem1 = i1 + (j1-1)*lcmesh%NeX
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 )
643 spectral_coef(:) = matmul(refelem%invV(:,:), field2d%local(n)%val(:,kelem1))
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
652 i = i0_s + i2 + (i1-1)*nfp
653 j = j0_s + j2 + (j1-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)) &
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)
681 if ( uniform_grid )
then
682 deallocate( x_local, y_local )
683 deallocate( spectral_coef )
684 deallocate( p1d_ori_x, p1d_ori_y )
687 i0_s = i0_s + lcmesh%NeX * refelem%Nfp
689 j0_s = j0_s + lcmesh%NeY * refelem%Nfp
703 real(rp),
intent(inout) :: buf(:,:)
706 integer :: i0, j0, p0, i1, j1, i2, j2, i, j
709 integer :: i0_s, j0_s
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)
720 lcmesh => mesh2d%lcmesh_list(n)
721 refelem => lcmesh%refElem2D
726 kelem1 = i1 + (j1-1)*lcmesh%NeX
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)
739 i0_s = i0_s + lcmesh%NeX * refelem%Nfp
741 j0_s = j0_s + lcmesh%NeY * refelem%Nfp
754 real(rp),
intent(in) :: buf(:,:)
761 integer :: i0_s, j0_s
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
773 lcmesh, buf(:,:), i0_s, j0_s, &
774 field2d%local(n)%val(:,:) )
777 i0_s = i0_s + lcmesh%NeX * refelem%Nfp
779 j0_s = j0_s + lcmesh%NeY * refelem%Nfp
788 lcmesh, buf, i0_s, j0_s, &
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)
797 integer :: i1, j1, i2, j2, i, j
802 refelem => lcmesh%refElem2D
806 kelem1 = i1 + (j1-1)*lcmesh%NeX
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)
826 real(rp),
intent(in) :: buf(:,:)
830 integer :: i0, j0, p0
833 integer :: i0_s, j0_s, p0_s
836 i0_s = 0; j0_s = 0; p0_s = 0
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
846 lcmesh, buf(:,:), i0_s, j0_s, &
847 field2d%local(n)%val(:,:) )
850 i0_s = i0_s + lcmesh%NeX * refelem%Nfp
852 j0_s = j0_s + lcmesh%NeY * refelem%Nfp
868 character(len=H_SHORT),
intent(in) :: dim_name_postfix
872 integer :: i, j, k, n
873 integer :: i_size, j_size, k_size
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
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
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
904 diminfo_x,
"X", 1, (/ diminfo_x%name /), (/ i_size /), &
909 diminfo_y,
"Y", 1, (/ diminfo_y%name /), (/ j_size /), &
914 diminfo_z,
"Z", 1, (/ diminfo_z%name /), (/ k_size /), &
915 dim_name_postfix, positive_down=(/ diminfo_z%positive_down /) )
919 diminfo,
"ZT", 1, (/ diminfo_z%name /), (/ k_size /), &
924 diminfo,
"XY", 2, (/ diminfo_x%name, diminfo_y%name /), &
925 (/ i_size, j_size /), dim_name_postfix )
929 diminfo,
"XY", 2, (/ diminfo_x%name, diminfo_y%name /), &
930 (/ i_size, j_size /), dim_name_postfix )
934 diminfo,
"XYZ", 3, (/ diminfo_x%name, diminfo_y%name, diminfo_z%name /), &
935 (/ i_size, j_size, k_size /), dim_name_postfix )
939 diminfo,
"XYZT", 3, (/ diminfo_x%name, diminfo_y%name, diminfo_z%name /), &
940 (/ i_size, j_size, k_size /), dim_name_postfix )
946 subroutine file_common_meshfield_get_dims3d_cubedsphere( mesh3D, dim_name_postfix, & ! (in)
951 character(len=H_SHORT),
intent(in) :: dim_name_postfix
955 integer :: i, j, k, n
957 integer :: i_size, j_size, k_size
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
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
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
986 k_size = k_size *
size(mesh3d%rcdomIJKP2LCMeshID,4)
990 diminfo_x,
"X", 1, (/ diminfo_x%name /), (/ i_size /), &
995 diminfo_y,
"Y", 1, (/ diminfo_y%name /), (/ j_size /), &
1000 diminfo_z,
"Z", 1, (/ diminfo_z%name /), (/ k_size /), &
1001 dim_name_postfix, positive_down=(/ diminfo_z%positive_down /) )
1005 diminfo,
"ZT", 1, (/ diminfo_z%name /), (/ k_size /), &
1010 diminfo,
"XY", 2, (/ diminfo_x%name, diminfo_y%name /), &
1011 (/ i_size, j_size /), &
1016 diminfo,
"XY", 2, (/ diminfo_x%name, diminfo_y%name /), &
1017 (/ i_size, j_size /), &
1022 diminfo,
"XYZ", 3, (/ diminfo_x%name, diminfo_y%name, diminfo_z%name /), &
1023 (/ i_size, j_size, k_size /), &
1028 diminfo,
"XYZT", 3, (/ diminfo_x%name, diminfo_y%name, diminfo_z%name /), &
1029 (/ i_size, j_size, k_size /), &
1033 end subroutine file_common_meshfield_get_dims3d_cubedsphere
1037 force_uniform_grid )
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
1052 integer :: is, js, ks, ie, je, ke, igs, jgs, kgs
1053 integer :: Nnode_h1D, Nnode_v
1055 logical :: uniform_grid = .false.
1056 real(RP),
allocatable :: x_local(:)
1057 real(RP),
allocatable :: y_local(:)
1058 real(RP),
allocatable :: z_local(:)
1061 if (
present(force_uniform_grid) ) uniform_grid = force_uniform_grid
1063 igs = 0; jgs = 0; kgs = 0
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
1071 allocate( x_local(nnode_h1d), y_local(nnode_h1d) )
1072 allocate( z_local(nnode_v) )
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 )
1082 is = igs + 1 + (i-1)*nnode_h1d
1083 ie = is + nnode_h1d - 1
1084 x(is:ie) = x_local(:)
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 )
1090 js = jgs + 1 + (j-1)*nnode_h1d
1091 je = js + nnode_h1d - 1
1092 y(js:je) = y_local(:)
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 )
1098 ks = kgs + 1 + (k-1)*nnode_v
1099 ke = ks + nnode_v - 1
1100 z(ks:ke) = z_local(:)
1106 igs = ie; jgs = je; kgs = ke
1107 deallocate( x_local, y_local )
1108 deallocate( z_local )
1115 subroutine file_common_meshfield_get_axis3d_cubedsphere( mesh3D, dimsinfo, x, y, z )
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)
1124 integer :: n, ni, nj, nk, np
1130 integer :: is, js, ks, ie, je, ke, igs, jgs, kgs
1132 logical :: uniform_grid = .false.
1133 real(RP),
allocatable :: x_local(:)
1134 real(RP),
allocatable :: y_local(:)
1135 real(RP),
allocatable :: z_local(:)
1138 igs = 0; jgs = 0; kgs = 0
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
1148 allocate( x_local(refelem%Nnode_h1D), y_local(refelem%Nnode_h1D), z_local(refelem%Nnode_v) )
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)
1157 is = igs + 1 + (i-1)*refelem%Nnode_h1D
1158 ie = is + refelem%Nnode_h1D - 1
1159 x(is:ie) = x_local(:)
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)
1164 js = jgs + 1 + (j-1)*refelem%Nnode_h1D
1165 je = js + refelem%Nnode_h1D - 1
1166 y(js:je) = y_local(:)
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 )
1172 ks = kgs + 1 + (k-1)*refelem%Nnode_v
1173 ke = ks + refelem%Nnode_v - 1
1174 z(ks:ke) = z_local(:)
1180 igs = ie; jgs = je; kgs = ke
1181 deallocate( x_local, y_local, z_local )
1188 end subroutine file_common_meshfield_get_axis3d_cubedsphere
1192 buf, force_uniform_grid )
1198 real(rp),
intent(inout) :: buf(:,:,:)
1199 logical,
intent(in),
optional :: force_uniform_grid
1201 integer :: n, kelem1
1202 integer :: i0, j0, k0, i1, j1, k1, i2, j2, k2, i, j, k
1205 integer :: i0_s, j0_s, k0_s, indx
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
1223 if (
present(force_uniform_grid) ) uniform_grid = force_uniform_grid
1225 i0_s = 0; j0_s = 0; k0_s = 0
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)
1232 lcmesh => mesh3d%lcmesh_list(n)
1233 refelem => lcmesh%refElem3D
1234 nnode_h1d = refelem%Nnode_h1D
1235 nnode_v = refelem%Nnode_v
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) )
1254 kelem1 = i1 + (j1-1)*lcmesh%NeX + (k1-1)*lcmesh%NeX*lcmesh%NeY
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 )
1267 spectral_coef(:) = matmul(refelem%invV(:,:), field3d%local(n)%val(:,kelem1))
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
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
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)) &
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)
1314 if ( uniform_grid )
then
1315 deallocate( x_local, y_local )
1316 deallocate( z_local )
1317 deallocate( spectral_coef )
1320 i0_s = i0_s + lcmesh%NeX * refelem%Nnode_h1D
1322 j0_s = j0_s + lcmesh%NeY * refelem%Nnode_h1D
1325 k0_s = k0_s + lcmesh%NeZ * refelem%Nnode_v
1338 real(rp),
intent(inout) :: buf(:,:,:)
1341 integer :: n, i0, j0, k0, p0
1342 integer :: i1, j1, k1, i2, j2, k2, i, j, k
1345 integer :: i0_s, j0_s, k0_s
1346 integer :: nnode_h1d
1350 i0_s = 0; j0_s = 0; k0_s = 0
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)
1358 lcmesh => mesh3d%lcmesh_list(n)
1359 refelem => lcmesh%refElem3D
1360 nnode_h1d = refelem%Nnode_h1D
1361 nnode_v = refelem%Nnode_v
1366 kelem1 = i1 + (j1-1)*lcmesh%NeX + (k1-1)*lcmesh%NeX*lcmesh%NeY
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)
1382 i0_s = i0_s + lcmesh%NeX * refelem%Nnode_h1D
1384 j0_s = j0_s + lcmesh%NeY * refelem%Nnode_h1D
1387 k0_s = k0_s + lcmesh%NeZ * refelem%Nnode_v
1399 real(rp),
intent(in) :: buf(:,:,:)
1403 integer :: i0, j0, k0
1406 integer :: i0_s, j0_s, k0_s
1409 i0_s = 0; j0_s = 0; k0_s = 0
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
1419 lcmesh, buf(:,:,:), i0_s, j0_s, k0_s, &
1420 field3d%local(n)%val(:,:) )
1423 i0_s = i0_s + lcmesh%NeX * refelem%Nnode_h1D
1425 j0_s = j0_s + lcmesh%NeY * refelem%Nnode_h1D
1428 k0_s = k0_s + lcmesh%NeZ * refelem%Nnode_v
1440 real(rp),
intent(in) :: buf(:,:,:)
1444 integer :: i0, j0, k0, p0
1447 integer :: i0_s, j0_s, k0_s, p0_s
1450 i0_s = 0; j0_s = 0; k0_s = 0; p0_s = 0
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
1461 lcmesh, buf(:,:,:), i0_s, j0_s, k0_s, &
1462 field3d%local(n)%val(:,:) )
1465 i0_s = i0_s + lcmesh%NeX * refelem%Nnode_h1D
1467 j0_s = j0_s + lcmesh%NeY * refelem%Nnode_h1D
1470 k0_s = k0_s + lcmesh%NeZ * refelem%Nnode_v
1480 lcmesh, buf, i0_s, j0_s, k0_s, &
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)
1489 integer :: i1, j1, k1, i2, j2, k2, i, j, k
1494 refelem => lcmesh%refElem3D
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)
1521 use scale_file_h,
only: &
1522 file_real8, file_real4
1528 character(*),
intent(in) :: datatype
1533 if ( datatype ==
'REAL8' )
then
1535 elseif( datatype ==
'REAL4' )
then
1540 elseif( rp == 4 )
then
1543 log_error(
"file_restart_meshfield_get_dtype",*)
'unsupported data type. Check!', trim(datatype)
1553 subroutine get_uniform_grid1d( pos1D, Np )
1555 integer,
intent(in) :: np
1556 real(rp),
intent(inout) :: pos1d(np)
1562 del = ( pos1d(np) - pos1d(1) ) / dble(np)
1563 pos1d(1) = pos1d(1) + 0.5_rp * del
1565 pos1d(i) = pos1d(i-1) + del
1569 end subroutine get_uniform_grid1d
1572 subroutine set_dimension( dim, & ! (out)
1573 diminfo, dim_type, ndims, dims, count, &
1574 dim_postfix, positive_down )
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)
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)
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)
1602 dim%positive_down(d) = .false.
1607 end subroutine set_dimension
module FElib / Element / Base
module FElib / File / Common
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.