55 integer,
intent(in) :: dir
56 double precision,
intent(in) :: xslice
58 double precision,
dimension(0:nw+nwauxio) :: normconv
59 integer :: Njgrid, jgrid
60 integer,
dimension(ndim-1) :: ixsubGlo, ixsubGhi
61 integer,
dimension(ndim-1) :: ixsubMlo, ixsubMhi
62 integer :: size_subblock_io, nx^D, slice_fh, nwexpand
63 integer :: type_subblock_io, type_subblockC_io, type_subblock_x_io, type_subblockC_x_io
64 integer,
dimension(ndim) :: sizes, subsizes, start
66 double precision,
dimension(ndim-1) :: xprobminsub, xprobmaxsub
67 integer,
dimension(ndim-1) :: block_nx_sub, domain_nx_sub
68 logical,
dimension(ndim-1) :: periodBsub
71 nx^d=ixmhi^d-ixmlo^d+1;
87 if(xslice<xprobmin^d.or.xslice>xprobmax^d) &
88 call mpistop(
"slice out of bounds")
99 sizes(1) = ixghi2; sizes(2) = ixghi3;
100 ixsubglo(1) = ixglo2; ixsubglo(2) = ixglo3;
101 ixsubghi(1) = ixghi2; ixsubghi(2) = ixghi3;
102 subsizes(1)=nx2;subsizes(2)=nx3;
103 start(1)=ixmlo2-1;start(2)=ixmlo3-1;
105 xprobminsub(1)=xprobmin2; xprobmaxsub(1)=xprobmax2;
106 xprobminsub(2)=xprobmin3; xprobmaxsub(2)=xprobmax3;
107 domain_nx_sub(1)=domain_nx2; domain_nx_sub(2)=domain_nx3;
108 block_nx_sub(1)=block_nx2; block_nx_sub(2)=block_nx3;
111 sizes(1) = ixghi1; sizes(2) = ixghi3;
112 ixsubglo(1) = ixglo1; ixsubglo(2) = ixglo3;
113 ixsubghi(1) = ixghi1; ixsubghi(2) = ixghi3;
114 subsizes(1)=nx1;subsizes(2)=nx3;
115 start(1)=ixmlo1-1;start(2)=ixmlo3-1;
117 xprobminsub(1)=xprobmin1; xprobmaxsub(1)=xprobmax1;
118 xprobminsub(2)=xprobmin3; xprobmaxsub(2)=xprobmax3;
119 domain_nx_sub(1)=domain_nx1; domain_nx_sub(2)=domain_nx3;
120 block_nx_sub(1)=block_nx1; block_nx_sub(2)=block_nx3;
123 ixsubglo(1) = ixglo1; ixsubglo(2) = ixglo2;
124 ixsubghi(1) = ixghi1; ixsubghi(2) = ixghi2;
125 sizes(1) = ixghi1; sizes(2) = ixghi2;
126 subsizes(1)=nx1;subsizes(2)=nx2;
127 start(1)=ixmlo1-1;start(2)=ixmlo2-1;
129 xprobminsub(1)=xprobmin1; xprobmaxsub(1)=xprobmax1;
130 xprobminsub(2)=xprobmin2; xprobmaxsub(2)=xprobmax2;
131 domain_nx_sub(1)=domain_nx1; domain_nx_sub(2)=domain_nx2;
132 block_nx_sub(1)=block_nx1; block_nx_sub(2)=block_nx2;
135 call mpistop(
"slice direction not clear in put_slice")
141 ixsubglo(1) = ixglo2; ixsubghi(1) = ixghi2;
146 xprobminsub(1)=xprobmin2; xprobmaxsub(1)=xprobmax2;
147 domain_nx_sub(1)=domain_nx2;
148 block_nx_sub(1)=block_nx2;
151 ixsubglo(1) = ixglo1; ixsubghi(1) = ixghi1;
156 xprobminsub(1)=xprobmin1; xprobmaxsub(1)=xprobmax1;
157 domain_nx_sub(1)=domain_nx1;
158 block_nx_sub(1)=block_nx1;
161 call mpistop(
"slice direction not clear in put_slice")
169 {^de&ixsubmlo(^de-1) = ixsubglo(^de-1)+
nghostcells;}
170 {^de&ixsubmhi(^de-1) = ixsubghi(^de-1)-
nghostcells;}
173 sizes(
ndim)=nw+nwexpand
174 subsizes(
ndim)=nw+nwexpand
178 call mpi_type_create_subarray(
ndim,sizes,subsizes,start, &
179 mpi_order_fortran,mpi_double_precision, &
181 call mpi_type_commit(type_subblock_io,
ierrmpi)
186 call mpi_type_create_subarray(
ndim,sizes,subsizes,start, &
187 mpi_order_fortran,mpi_double_precision, &
189 call mpi_type_commit(type_subblock_x_io,
ierrmpi)
193 subsizes(1:
ndim-1) = subsizes(1:
ndim-1) + 1
194 start(1:
ndim-1) = start(1:
ndim-1) - 1
195 sizes(
ndim)=nw+nwexpand
196 subsizes(
ndim)=nw+nwexpand
199 call mpi_type_create_subarray(
ndim,sizes,subsizes,start, &
200 mpi_order_fortran,mpi_double_precision, &
202 call mpi_type_commit(type_subblockc_io,
ierrmpi)
207 call mpi_type_create_subarray(
ndim,sizes,subsizes,start, &
208 mpi_order_fortran,mpi_double_precision, &
210 call mpi_type_commit(type_subblockc_x_io,
ierrmpi)
225 case (
'vtu',
'vtuCC')
234 call mpi_type_free(type_subblock_io,
ierrmpi)
235 call mpi_type_free(type_subblock_x_io,
ierrmpi)
236 call mpi_type_free(type_subblockc_io,
ierrmpi)
237 call mpi_type_free(type_subblockc_x_io,
ierrmpi)
246 integer :: status(MPI_STATUS_SIZE), ipe
248 character(len=1024) :: filename, xlabel
249 character(len=79) :: xxlabel
250 character(len=name_len) :: wnamei(1:nw+nwauxio),xandwnamei(1:ndim+nw+nwauxio)
251 character(len=1024) :: outfilehead
255 inquire(slice_fh,opened=fileopen)
256 if(.not.fileopen)
then
258 write(xlabel,
"(D9.2)")xslice
261 write(xxlabel(1:1),
"(a)")
"+"
263 write(filename,
"(a,i1.1,a,i4.4,a)") trim(
base_filename)//
'_d',dir,
'_x'//trim(xxlabel)//
'_n',
slicenext,
'.vtu'
264 open(slice_fh,file=filename,status=
'unknown',form=
'formatted')
269 write(slice_fh,
'(a)')
'<?xml version="1.0"?>'
270 write(slice_fh,
'(a)',advance=
'no')
'<VTKFile type="UnstructuredGrid"'
272 write(slice_fh,
'(a)')
' version="0.1" byte_order="LittleEndian">'
274 write(slice_fh,
'(a)')
' version="0.1" byte_order="BigEndian">'
276 write(slice_fh,
'(a)')
' <UnstructuredGrid>'
277 write(slice_fh,
'(a)')
'<FieldData>'
278 write(slice_fh,
'(2a)')
'<DataArray type="Float32" Name="TIME" ',&
279 'NumberOfTuples="1" format="ascii">'
281 write(slice_fh,
'(a)')
'</DataArray>'
282 write(slice_fh,
'(a)')
'</FieldData>'
286 call write_slice_vtk(jgrid,slice_fh,wnamei)
300 if (ipe ==
mype )
then
301 call mpi_send(ps_sub(jgrid)%x,1,type_subblock_x_io,0,itag,
icomm,
ierrmpi)
302 call mpi_send(ps_sub(jgrid)%w,1,type_subblock_io,0,itag+1,
icomm,
ierrmpi)
303 call mpi_send(ps_sub(jgrid)%xC,1,type_subblockc_x_io,0,itag+2,
icomm,
ierrmpi)
304 call mpi_send(ps_sub(jgrid)%wC,1,type_subblockc_io,0,itag+3,
icomm,
ierrmpi)
305 call mpi_send(normconv,nw+nwauxio+1,mpi_double_precision,0,itag+4,
icomm,
ierrmpi)
308 call mpi_recv(ps_sub(njgrid+1)%x,1,type_subblock_x_io,ipe,itag,
icomm,status,
ierrmpi)
309 call mpi_recv(ps_sub(njgrid+1)%w,1,type_subblock_io,ipe,itag+1,
icomm,status,
ierrmpi)
310 call mpi_recv(ps_sub(njgrid+1)%xC,1,type_subblockc_x_io,ipe,itag+2,
icomm,status,
ierrmpi)
311 call mpi_recv(ps_sub(njgrid+1)%wC,1,type_subblockc_io,ipe,itag+3,
icomm,status,
ierrmpi)
312 call mpi_recv(normconv,nw+nwauxio+1,mpi_double_precision,ipe,&
314 call write_slice_vtk(njgrid+1,slice_fh,wnamei)
322 write(slice_fh,
'(a)')
'</UnstructuredGrid>'
323 write(slice_fh,
'(a)')
'</VTKFile>'
331 subroutine write_slice_vtk(jgrid,slice_fh,wnamei)
334 integer,
intent(in) :: jgrid, slice_fh
335 character(len=name_len),
intent(in) :: wnamei(1:nw+nwauxio)
339 double precision :: x_VTK(1:3)
340 double precision,
parameter :: minvalue = 1.0d-99, maxvalue = 1.0d+99
341 integer :: ixC^L, ixCC^L, nc, np, iw
342 integer :: nx^DM, nxC^DM, icell, ix^DM
345 {^dm&ixccmin^dm = ixsubmlo(^dm);}
346 {^dm&ixccmax^dm = ixsubmhi(^dm);}
347 {^dm&ixcmin^dm = ixsubmlo(^dm)-1;}
348 {^dm&ixcmax^dm = ixsubmhi(^dm);}
350 nx^dm=ixccmax^dm-ixccmin^dm+1;
356 write(slice_fh,
'(a,i7,a,i7,a)') &
357 '<Piece NumberOfPoints="',np,
'" NumberOfCells="',nc,
'">'
365 write(slice_fh,
'(a)')
'<CellData>'
370 write(slice_fh,
'(a,a,a)')&
371 '<DataArray type="Float64" Name="',trim(wnamei(iw)),
'" format="ascii">'
372 write(slice_fh,
'(200(1pe14.6))') {^dm&(|}
roundoff_minmax(ps_sub(jgrid)%w(ix^dm,iw)*normconv(iw),minvalue,maxvalue),{ix^dm=ixccmin^dm,ixccmax^dm)}
373 write(slice_fh,
'(a)')
'</DataArray>'
375 write(slice_fh,
'(a)')
'</CellData>'
379 write(slice_fh,
'(a)')
'<PointData>'
384 write(slice_fh,
'(a,a,a)')&
385 '<DataArray type="Float64" Name="',trim(wnamei(iw)),
'" format="ascii">'
386 write(slice_fh,
'(200(1pe14.6))') {^dm&(|}
roundoff_minmax(ps_sub(jgrid)%wC(ix^dm,iw)*normconv(iw),minvalue,maxvalue),{ix^dm=ixcmin^dm,ixcmax^dm)}
387 write(slice_fh,
'(a)')
'</DataArray>'
389 write(slice_fh,
'(a)')
'</PointData>'
400 write(slice_fh,
'(a)')
'<Points>'
401 write(slice_fh,
'(a)')
'<DataArray type="Float32" NumberOfComponents="3" format="ascii">'
403 {
do ix^dmb=ixcmin^dmb,ixcmax^dmb \}
405 x_vtk(1:
ndim)=ps_sub(jgrid)%xC(ix^dm,1:
ndim)*normconv(0);
406 write(slice_fh,
'(3(1pe14.6))') x_vtk
408 write(slice_fh,
'(a)')
'</DataArray>'
409 write(slice_fh,
'(a)')
'</Points>'
417 write(slice_fh,
'(a)')
'<Cells>'
420 write(slice_fh,
'(a)')
'<DataArray type="Int32" Name="connectivity" format="ascii">'
422 {^dm&
do ix^dmb=1,nx^dmb\}
424 write(slice_fh,
'(2(i7,1x))')ix1-1,ix1
426 write(slice_fh,
'(4(i7,1x))')(ix2-1)*nxc1+ix1-1, &
427 (ix2-1)*nxc1+ix1,ix2*nxc1+ix1-1,ix2*nxc1+ix1
430 write(slice_fh,
'(a)')
'</DataArray>'
433 write(slice_fh,
'(a)')
'<DataArray type="Int32" Name="offsets" format="ascii">'
435 write(slice_fh,
'(i7)') icell*(2**(^nd-1))
437 write(slice_fh,
'(a)')
'</DataArray>'
440 write(slice_fh,
'(a)')
'<DataArray type="Int32" Name="types" format="ascii">'
442 {^iftwod vtk_type=3 \}
443 {^ifthreed vtk_type=8 \}
445 write(slice_fh,
'(i2)') vtk_type
447 write(slice_fh,
'(a)')
'</DataArray>'
449 write(slice_fh,
'(a)')
'</Cells>'
453 write(slice_fh,
'(a)')
'</Piece>'
456 end subroutine write_slice_vtk
458 subroutine put_slice_csv
461 integer :: iw, ipe, itag
462 integer :: status(MPI_STATUS_SIZE)
464 character(len=1024) :: filename, xlabel
465 character(len=79) :: xxlabel
466 character(len=name_len) :: wnamei(1:nw+nwauxio),xandwnamei(1:ndim+nw+nwauxio)
467 character(len=1024) :: outfilehead
468 character(len=1024) :: line
471 inquire(slice_fh,opened=fileopen)
472 if(.not.fileopen)
then
474 write(xlabel,
"(D9.2)")xslice
477 write(xxlabel(1:1),
"(a)")
"+"
479 write(filename,
"(a,i1.1,a,i4.4,a)") trim(base_filename)//
'_d',dir,
'_x'//trim(xxlabel)//
'_n',slicenext,
'.csv'
480 open(slice_fh,file=filename,status=
'unknown',form=
'formatted')
485 do iw=1,ndim+nw+nwauxio-1
486 line = trim(line)//trim(xandwnamei(iw))//
', '
488 line = trim(line)//trim(xandwnamei(ndim+nw+nwauxio))
489 write(slice_fh,
'(a)')trim(line)
495 call put_slice_line(jgrid,slice_fh)
502 do jgrid=1,morton_sub_stop(ipe)-morton_sub_start(ipe)+1
503 itag=morton_sub_start(ipe)+jgrid-1
504 if (ipe == mype )
then
505 call mpi_send(ps_sub(jgrid)%x,1,type_subblock_x_io,0,itag,icomm,ierrmpi)
506 call mpi_send(ps_sub(jgrid)%w,1,type_subblock_io,0,itag,icomm,ierrmpi)
507 call mpi_send(normconv,nw+nwauxio+1,mpi_double_precision,0,itag,icomm,ierrmpi)
510 call mpi_recv(ps_sub(njgrid+1)%x,1,type_subblock_x_io,ipe,itag,icomm,status,ierrmpi)
511 call mpi_recv(ps_sub(njgrid+1)%w,1,type_subblock_io,ipe,itag,icomm,status,ierrmpi)
512 call mpi_recv(normconv,nw+nwauxio+1,mpi_double_precision,ipe,&
513 itag,icomm,status,ierrmpi)
514 call put_slice_line(njgrid+1,slice_fh)
525 end subroutine put_slice_csv
527 subroutine put_slice_line(jout,file_handle)
528 integer,
intent(in) :: jout, file_handle
530 double precision,
parameter :: minvalue = 1.0d-99, maxvalue = 1.0d+99
531 integer :: ix^D,idir,iw
532 character(len=1024) ::line, data
535 do ix2=ixsubmlo(2),ixsubmhi(2)
536 do ix1=ixsubmlo(1),ixsubmhi(1)
539 do ix1=ixsubmlo(1),ixsubmhi(1)
545 write(
data,
"(es14.6)")
roundoff_minmax(ps_sub(jout)%x(ix1,ix2,idir),minvalue,maxvalue)
548 write(
data,
"(es14.6)")
roundoff_minmax(ps_sub(jout)%x(ix1,idir),minvalue,maxvalue)
551 write(
data,
"(es14.6)")
roundoff_minmax(ps_sub(jout)%x(idir),minvalue,maxvalue)
554 line = trim(line)//trim(data)//
', '
556 do iw = 1,nw+nwauxio-1
558 write(
data,
"(es14.6)")
roundoff_minmax(ps_sub(jout)%w(ix1,ix2,iw)*normconv(iw),minvalue,maxvalue)
561 write(
data,
"(es14.6)")
roundoff_minmax(ps_sub(jout)%w(ix1,iw)*normconv(iw),minvalue,maxvalue)
564 write(
data,
"(es14.6)")
roundoff_minmax(ps_sub(jout)%w(iw)*normconv(iw),minvalue,maxvalue)
566 line = trim(line)//trim(data)//
', '
569 write(
data,
"(es14.6)")
roundoff_minmax(ps_sub(jout)%w(ix1,ix2,nw+nwauxio)*normconv(nw+nwauxio),minvalue,maxvalue)
572 write(
data,
"(es14.6)")
roundoff_minmax(ps_sub(jout)%w(ix1,nw+nwauxio)*normconv(nw+nwauxio),minvalue,maxvalue)
574 line = trim(line)//trim(data)
575 write(file_handle,
'(a)')trim(line)
584 end subroutine put_slice_line
586 subroutine put_slice_dat
592 integer,
dimension(max_blocks*2) :: iorequest
593 integer,
dimension(MPI_STATUS_SIZE,max_blocks) :: iostatus
594 integer(kind=MPI_OFFSET_KIND) :: offset, offset1
596 integer :: amode, status(MPI_STATUS_SIZE), iwrite
597 character(len=1024) :: filename, xlabel
598 character(len=79) :: xxlabel
599 character(len=name_len) :: dname
601 integer :: nsubparents, iw, ileaf, inode
602 integer(kind=MPI_OFFSET_KIND) :: block_offset, tree_offset
603 integer,
allocatable :: block_ig_sub(:,:)
604 integer,
allocatable :: block_lvl_sub(:)
605 integer(kind=MPI_OFFSET_KIND),
allocatable :: block_offset_sub(:)
606 logical,
allocatable :: isleaf_sub(:)
614 if (nsubleafs /=
sfc_sub(0,1)) error stop
"nsubleafs /= sfc_sub(0,1)"
616 allocate(block_ig_sub(ndim-1,nsubleafs))
617 allocate(block_lvl_sub(nsubleafs))
618 allocate(block_offset_sub(nsubleafs))
619 allocate(isleaf_sub(nsubleafs+nsubparents))
621 block_offset = int(0,kind=mpi_offset_kind)
624 do inode=1,nsubleafs+nsubparents
625 if (
sfc_sub(inode,1) == 0)
then
626 isleaf_sub(inode) = .false.
628 isleaf_sub(inode) = .true.
634 block_ig_sub(:,ileaf) = [ pnode%ig2, pnode%ig3 ]
636 block_ig_sub(:,ileaf) = [ pnode%ig1, pnode%ig3 ]
638 block_ig_sub(:,ileaf) = [ pnode%ig1, pnode%ig2 ]
644 block_ig_sub(:,ileaf) = [ pnode%ig2 ]
646 block_ig_sub(:,ileaf) = [ pnode%ig1 ]
649 block_lvl_sub(ileaf) = pnode%level
651 block_offset_sub(ileaf) = block_offset
652 block_offset = block_offset + int(2*(ndim-1)*
size_int,kind=mpi_offset_kind)
653 block_offset = block_offset + int(product(block_nx_sub)*nw*
size_double,kind=mpi_offset_kind)
659 write(xlabel,
"(D9.2)")xslice
662 write(xxlabel(1:1),
"(a)")
"+"
664 write(filename,
"(a,i1.1,a,i4.4,a)") trim(base_filename)//
'_d',dir,
'_x'//trim(xxlabel)//
'_n',slicenext,
'.dat'
667 open(unit=slice_fh,file=filename,status=
'replace')
674 amode=ior(mpi_mode_append,mpi_mode_wronly)
675 call mpi_file_open(mpi_comm_self,filename,amode,mpi_info_null, &
678 call mpi_file_write(slice_fh,
version_number, 1, mpi_integer, status, ierrmpi)
680 call mpi_file_write(slice_fh, 0, 1, mpi_integer, status, ierrmpi)
681 call mpi_file_write(slice_fh, 0, 1, mpi_integer, status, ierrmpi)
682 call mpi_file_write(slice_fh, nw, 1, mpi_integer, status, ierrmpi)
683 call mpi_file_write(slice_fh, ndir, 1, mpi_integer, status, ierrmpi)
684 call mpi_file_write(slice_fh, ndim-1, 1, mpi_integer, status, ierrmpi)
685 call mpi_file_write(slice_fh, levmax_sub, 1, mpi_integer, status, ierrmpi)
686 call mpi_file_write(slice_fh, nsubleafs, 1, mpi_integer, status, ierrmpi)
687 call mpi_file_write(slice_fh, nsubparents, 1, mpi_integer, status, ierrmpi)
688 call mpi_file_write(slice_fh, it, 1, mpi_integer, status, ierrmpi)
691 call mpi_file_write(slice_fh, global_time, 1, mpi_double_precision, status, ierrmpi)
693 call mpi_file_write(slice_fh, xprobminsub, ndim-1, &
694 mpi_double_precision, status, ierrmpi)
695 call mpi_file_write(slice_fh, xprobmaxsub, ndim-1, &
696 mpi_double_precision, status, ierrmpi)
697 call mpi_file_write(slice_fh, domain_nx_sub, ndim-1, &
698 mpi_integer, status, ierrmpi)
699 call mpi_file_write(slice_fh, block_nx_sub, ndim-1, &
700 mpi_integer, status, ierrmpi)
703 call mpi_file_write(slice_fh, periodbsub, ndim-1, mpi_logical, status, ierrmpi)
706 call mpi_file_write(slice_fh, geometry_name(1:
name_len), &
707 name_len, mpi_character, status, ierrmpi)
710 call mpi_file_write(slice_fh, stagger_grid, 1, mpi_logical, status, ierrmpi)
715 dname = trim(adjustl((cons_wnames(iw))))
716 call mpi_file_write(slice_fh, dname,
name_len, mpi_character, status, ierrmpi)
731 call mpi_file_write(slice_fh, snapshotnext, 1, mpi_integer, status, ierrmpi)
733 call mpi_file_write(slice_fh, snapshotnext+1, 1, mpi_integer, status, ierrmpi)
735 call mpi_file_write(slice_fh, slicenext, 1, mpi_integer, status, ierrmpi)
736 call mpi_file_write(slice_fh, collapsenext, 1, mpi_integer, status, ierrmpi)
738 call mpi_file_get_position(slice_fh, tree_offset, ierrmpi)
739 call mpi_file_write(slice_fh, isleaf_sub, nsubleafs+nsubparents, mpi_logical, status, ierrmpi)
740 call mpi_file_write(slice_fh, block_lvl_sub, nsubleafs, mpi_integer, status, ierrmpi)
741 call mpi_file_write(slice_fh, block_ig_sub,
size(block_ig_sub), mpi_integer, status, ierrmpi)
744 call mpi_file_get_position(slice_fh, block_offset, ierrmpi)
745 block_offset_sub(:) = block_offset_sub(:) + block_offset + &
746 int(nsubleafs*2*
size_int, kind=mpi_offset_kind)
748 call mpi_file_write(slice_fh, block_offset_sub, nsubleafs, mpi_offset, status, ierrmpi)
751 call mpi_file_get_position(slice_fh, block_offset, ierrmpi)
752 if (block_offset - tree_offset /= &
755 print *,
"Warning: MPI_OFFSET type /= 8 bytes"
756 print *,
"This *could* cause problems when reading .dat files"
760 call mpi_file_seek(slice_fh, int(
size_int,kind=mpi_offset_kind), mpi_seek_set, ierrmpi)
761 call mpi_file_write(slice_fh, int(tree_offset), 1, mpi_integer, status, ierrmpi)
762 call mpi_file_write(slice_fh, int(block_offset), 1, mpi_integer, status, ierrmpi)
764 call mpi_file_close(slice_fh,ierrmpi)
768 call mpi_bcast(nsubleafs, 1, mpi_integer, 0, icomm, ierrmpi)
769 call mpi_bcast(nsubparents, 1, mpi_integer, 0, icomm, ierrmpi)
773 allocate(block_offset_sub(nsubleafs))
777 call mpi_bcast(block_offset_sub, nsubleafs, mpi_offset, 0, icomm, ierrmpi)
779 amode=ior(mpi_mode_create,mpi_mode_wronly)
780 call mpi_file_open(icomm,filename,amode,mpi_info_null,slice_fh,ierrmpi)
781 iorequest=mpi_request_null
787 call mpi_file_iwrite_at(slice_fh,offset,0,2*(ndim-1),mpi_integer,iorequest(iwrite),ierrmpi)
789 offset1=offset+int(2*(ndim-1)*
size_int,kind=mpi_offset_kind)
790 call mpi_file_iwrite_at(slice_fh,offset1,ps_sub(jgrid)%w,1,type_subblock_io, &
791 iorequest(iwrite),ierrmpi)
794 if (iwrite>0)
call mpi_waitall(iwrite,iorequest,iostatus,ierrmpi)
795 call mpi_barrier(icomm, ierrmpi)
796 call mpi_file_close(slice_fh,ierrmpi)
798 deallocate(block_offset_sub)
800 deallocate(block_ig_sub)
801 deallocate(block_lvl_sub)
802 deallocate(isleaf_sub)
805 end subroutine put_slice_dat
807 subroutine put_slice_zerod
811 integer :: amode, iwrite, status(MPI_STATUS_SIZE)
812 logical,
save :: opened=.false.
813 character(len=name_len) :: wnamei(1:nw+nwauxio),xandwnamei(1:ndim+nw+nwauxio)
814 character(len=1024) :: outfilehead
815 character(len=1024) ::line, data
816 character(len=1024) :: filename, xlabel
817 character(len=79) :: xxlabel
821 write(xlabel,
"(D9.2)")xslice
824 write(xxlabel(1:1),
"(a)")
"+"
826 write(filename,
"(a,i1.1,a,i4.4,a)") trim(base_filename)//
'_d',dir,
'_x'//trim(xxlabel)//
'.csv'
829 if (.not. opened .and. mype==0)
then
830 amode=ior(mpi_mode_create,mpi_mode_wronly)
831 amode=ior(amode,mpi_mode_append)
832 call mpi_file_open(mpi_comm_self,filename,amode, &
833 mpi_info_null,slice_fh,ierrmpi)
837 do iw=1,nw+nwauxio+ndim
838 line = trim(line)//
', '//trim(xandwnamei(iw))
841 call mpi_file_write(slice_fh,line,len_trim(line), &
842 mpi_character,status,ierrmpi)
843 call mpi_file_write(slice_fh,achar(10),1,mpi_character,status,ierrmpi)
844 call mpi_file_close(slice_fh, ierrmpi)
848 call mpi_barrier(icomm,ierrmpi)
852 amode=ior(mpi_mode_create,mpi_mode_wronly)
853 amode=ior(amode,mpi_mode_append)
854 call mpi_file_open(mpi_comm_self,filename,amode, &
855 mpi_info_null,slice_fh,ierrmpi)
858 write(
data,
"(es14.6)")global_time
860 write(
data,
"(es14.6)")ps_sub(1)%x
861 line = trim(line)//
', '//trim(data)
863 write(
data,
"(es14.6)")ps_sub(1)%w(iw)*normconv(iw)
864 line = trim(line)//
', '//trim(data)
867 call mpi_file_write(slice_fh,trim(line),len_trim(line), &
868 mpi_character,status,ierrmpi)
869 call mpi_file_write(slice_fh,achar(10),1,mpi_character,status,ierrmpi)
870 call mpi_file_close(slice_fh, ierrmpi)
873 end subroutine put_slice_zerod
1053 integer,
intent(in) :: igrid, dir
1054 integer,
intent(inout) :: jgrid
1055 logical,
intent(in) :: active
1056 double precision,
intent(in) :: xslice
1057 double precision,
dimension(0:nw+nwauxio),
intent(out) :: normconv
1059 double precision,
dimension(ixMlo^D-1:ixMhi^D,ndim) :: xC_TMP, xC
1060 double precision,
dimension(ixMlo^D:ixMhi^D,ndim) :: xCC_TMP, xCC
1061 double precision,
dimension(ixMlo^D-1:ixMhi^D,nw+nwauxio) :: wC_TMP
1062 double precision,
dimension(ixMlo^D:ixMhi^D,nw+nwauxio) :: wCC_TMP
1063 double precision,
dimension(ixG^T) :: x_save
1064 integer :: ixslice, nwexpand, ixC^L, ixCC^L
1065 logical :: mask(ixG^T)
1087 ixslice = minloc(dabs(xslice-ps(igrid)%x(:,dir)),1,mask(:))
1092 ixslice = minloc(dabs(xslice-ps(igrid)%x(:,ixmlo2,dir)),1,mask(:,ixmlo2))
1094 ixslice = minloc(dabs(xslice-ps(igrid)%x(ixmlo1,:,dir)),1,mask(ixmlo1,:))
1096 call mpistop(
"slice direction not clear in fill_subnode")
1102 ixslice = minloc(dabs(xslice-ps(igrid)%x(:,ixmlo2,ixmlo3,dir)),1,mask(:,ixmlo2,ixmlo3))
1104 ixslice = minloc(dabs(xslice-ps(igrid)%x(ixmlo1,:,ixmlo3,dir)),1,mask(ixmlo1,:,ixmlo3))
1106 ixslice = minloc(dabs(xslice-ps(igrid)%x(ixmlo1,ixmlo2,:,dir)),1,mask(ixmlo1,ixmlo2,:))
1108 call mpistop(
"slice direction not clear in fill_subnode")
1112 call calc_x(igrid,xc,xcc)
1114 xc(:^
d&,dir) = xslice
1115 xcc(:^
d&,dir) = xslice
1117 ixc^l,ixcc^l,.true.)
1123 ps_sub(jgrid)%w(1:nw+nwexpand) = wcc_tmp(ixslice,1:nw+nwexpand)
1124 ps_sub(jgrid)%x(1:
ndim) = xcc_tmp(ixslice,1:
ndim)
1125 ps_sub(jgrid)%wC(1:nw+nwexpand) = wc_tmp(ixslice,1:nw+nwexpand)
1126 ps_sub(jgrid)%xC(1:
ndim) = xc_tmp(ixslice,1:
ndim)
1131 ps_sub(jgrid)%w(ixccmin2:ixccmax2,1:nw+nwexpand) &
1132 = wcc_tmp(ixslice,ixccmin2:ixccmax2,1:nw+nwexpand)
1133 ps_sub(jgrid)%x(ixccmin2:ixccmax2,1:
ndim) &
1134 = xcc_tmp(ixslice,ixccmin2:ixccmax2,1:
ndim)
1135 ps_sub(jgrid)%wC(ixcmin2:ixcmax2,1:nw+nwexpand) &
1136 = wc_tmp(ixslice,ixcmin2:ixcmax2,1:nw+nwexpand)
1137 ps_sub(jgrid)%xC(ixcmin2:ixcmax2,1:
ndim) &
1138 = xc_tmp(ixslice,ixcmin2:ixcmax2,1:
ndim)
1140 ps_sub(jgrid)%w(ixccmin1:ixccmax1,1:nw+nwexpand) &
1141 = wcc_tmp(ixccmin1:ixccmax1,ixslice,1:nw+nwexpand)
1142 ps_sub(jgrid)%x(ixccmin1:ixccmax1,1:
ndim) &
1143 = xcc_tmp(ixccmin1:ixccmax1,ixslice,1:
ndim)
1144 ps_sub(jgrid)%wC(ixcmin1:ixcmax1,1:nw+nwexpand) &
1145 = wc_tmp(ixcmin1:ixcmax1,ixslice,1:nw+nwexpand)
1146 ps_sub(jgrid)%xC(ixcmin1:ixcmax1,1:
ndim) &
1147 = xc_tmp(ixcmin1:ixcmax1,ixslice,1:
ndim)
1149 call mpistop(
"slice direction not clear in fill_subnode")
1155 ps_sub(jgrid)%w(ixccmin2:ixccmax2,ixccmin3:ixccmax3,1:nw+nwexpand) = &
1156 wcc_tmp(ixslice,ixccmin2:ixccmax2,ixccmin3:ixccmax3,1:nw+nwexpand)
1157 ps_sub(jgrid)%x(ixccmin2:ixccmax2,ixccmin3:ixccmax3,1:
ndim) = &
1158 xcc_tmp(ixslice,ixccmin2:ixccmax2,ixccmin3:ixccmax3,1:
ndim)
1159 ps_sub(jgrid)%wC(ixcmin2:ixcmax2,ixcmin3:ixcmax3,1:nw+nwexpand) = &
1160 wc_tmp(ixslice,ixcmin2:ixcmax2,ixcmin3:ixcmax3,1:nw+nwexpand)
1161 ps_sub(jgrid)%xC(ixcmin2:ixcmax2,ixcmin3:ixcmax3,1:
ndim) = &
1162 xc_tmp(ixslice,ixcmin2:ixcmax2,ixcmin3:ixcmax3,1:
ndim)
1164 ps_sub(jgrid)%w(ixccmin1:ixccmax1,ixccmin3:ixccmax3,1:nw+nwexpand) = &
1165 wcc_tmp(ixccmin1:ixccmax1,ixslice,ixccmin3:ixccmax3,1:nw+nwexpand)
1166 ps_sub(jgrid)%x(ixccmin1:ixccmax1,ixccmin3:ixccmax3,1:
ndim) = &
1167 xcc_tmp(ixccmin1:ixccmax1,ixslice,ixccmin3:ixccmax3,1:
ndim)
1168 ps_sub(jgrid)%wC(ixcmin1:ixcmax1,ixcmin3:ixcmax3,1:nw+nwexpand) = &
1169 wc_tmp(ixcmin1:ixcmax1,ixslice,ixcmin3:ixcmax3,1:nw+nwexpand)
1170 ps_sub(jgrid)%xC(ixcmin1:ixcmax1,ixcmin3:ixcmax3,1:
ndim) = &
1171 xc_tmp(ixcmin1:ixcmax1,ixslice,ixcmin3:ixcmax3,1:
ndim)
1173 ps_sub(jgrid)%w(ixccmin1:ixccmax1,ixccmin2:ixccmax2,1:nw+nwexpand) = &
1174 wcc_tmp(ixccmin1:ixccmax1,ixccmin2:ixccmax2,ixslice,1:nw+nwexpand)
1175 ps_sub(jgrid)%x(ixccmin1:ixccmax1,ixccmin2:ixccmax2,1:
ndim) = &
1176 xcc_tmp(ixccmin1:ixccmax1,ixccmin2:ixccmax2,ixslice,1:
ndim)
1177 ps_sub(jgrid)%wC(ixcmin1:ixcmax1,ixcmin2:ixcmax2,1:nw+nwexpand) = &
1178 wc_tmp(ixcmin1:ixcmax1,ixcmin2:ixcmax2,ixslice,1:nw+nwexpand)
1179 ps_sub(jgrid)%xC(ixcmin1:ixcmax1,ixcmin2:ixcmax2,1:
ndim) = &
1180 xc_tmp(ixcmin1:ixcmax1,ixcmin2:ixcmax2,ixslice,1:
ndim)
1182 call mpistop(
"slice direction not clear in fill_subnode")