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
249 character(len=name_len) :: wnamei(1:nw+nwauxio),xandwnamei(1:ndim+nw+nwauxio)
250 character(len=1024) :: outfilehead
254 inquire(slice_fh,opened=fileopen)
255 if(.not.fileopen)
then
258 open(slice_fh,file=filename,status=
'unknown',form=
'formatted')
263 write(slice_fh,
'(a)')
'<?xml version="1.0"?>'
264 write(slice_fh,
'(a)',advance=
'no')
'<VTKFile type="UnstructuredGrid"'
266 write(slice_fh,
'(a)')
' version="0.1" byte_order="LittleEndian">'
268 write(slice_fh,
'(a)')
' version="0.1" byte_order="BigEndian">'
270 write(slice_fh,
'(a)')
' <UnstructuredGrid>'
271 write(slice_fh,
'(a)')
'<FieldData>'
272 write(slice_fh,
'(2a)')
'<DataArray type="Float32" Name="TIME" ',&
273 'NumberOfTuples="1" format="ascii">'
275 write(slice_fh,
'(a)')
'</DataArray>'
276 write(slice_fh,
'(a)')
'</FieldData>'
280 call write_slice_vtk(jgrid,slice_fh,wnamei)
294 if (ipe ==
mype )
then
295 call mpi_send(ps_sub(jgrid)%x,1,type_subblock_x_io,0,itag,
icomm,
ierrmpi)
296 call mpi_send(ps_sub(jgrid)%w,1,type_subblock_io,0,itag+1,
icomm,
ierrmpi)
297 call mpi_send(ps_sub(jgrid)%xC,1,type_subblockc_x_io,0,itag+2,
icomm,
ierrmpi)
298 call mpi_send(ps_sub(jgrid)%wC,1,type_subblockc_io,0,itag+3,
icomm,
ierrmpi)
299 call mpi_send(normconv,nw+nwauxio+1,mpi_double_precision,0,itag+4,
icomm,
ierrmpi)
302 call mpi_recv(ps_sub(njgrid+1)%x,1,type_subblock_x_io,ipe,itag,
icomm,status,
ierrmpi)
303 call mpi_recv(ps_sub(njgrid+1)%w,1,type_subblock_io,ipe,itag+1,
icomm,status,
ierrmpi)
304 call mpi_recv(ps_sub(njgrid+1)%xC,1,type_subblockc_x_io,ipe,itag+2,
icomm,status,
ierrmpi)
305 call mpi_recv(ps_sub(njgrid+1)%wC,1,type_subblockc_io,ipe,itag+3,
icomm,status,
ierrmpi)
306 call mpi_recv(normconv,nw+nwauxio+1,mpi_double_precision,ipe,&
308 call write_slice_vtk(njgrid+1,slice_fh,wnamei)
316 write(slice_fh,
'(a)')
'</UnstructuredGrid>'
317 write(slice_fh,
'(a)')
'</VTKFile>'
325 subroutine write_slice_vtk(jgrid,slice_fh,wnamei)
328 integer,
intent(in) :: jgrid, slice_fh
329 character(len=name_len),
intent(in) :: wnamei(1:nw+nwauxio)
333 double precision :: x_VTK(1:3)
334 double precision,
parameter :: minvalue = 1.0d-99, maxvalue = 1.0d+99
335 integer :: ixC^L, ixCC^L, nc, np, iw
336 integer :: nx^DM, nxC^DM, icell, ix^DM
339 {^dm&ixccmin^dm = ixsubmlo(^dm);}
340 {^dm&ixccmax^dm = ixsubmhi(^dm);}
341 {^dm&ixcmin^dm = ixsubmlo(^dm)-1;}
342 {^dm&ixcmax^dm = ixsubmhi(^dm);}
344 nx^dm=ixccmax^dm-ixccmin^dm+1;
350 write(slice_fh,
'(a,i7,a,i7,a)') &
351 '<Piece NumberOfPoints="',np,
'" NumberOfCells="',nc,
'">'
359 write(slice_fh,
'(a)')
'<CellData>'
364 write(slice_fh,
'(a,a,a)')&
365 '<DataArray type="Float64" Name="',trim(wnamei(iw)),
'" format="ascii">'
366 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)}
367 write(slice_fh,
'(a)')
'</DataArray>'
369 write(slice_fh,
'(a)')
'</CellData>'
373 write(slice_fh,
'(a)')
'<PointData>'
378 write(slice_fh,
'(a,a,a)')&
379 '<DataArray type="Float64" Name="',trim(wnamei(iw)),
'" format="ascii">'
380 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)}
381 write(slice_fh,
'(a)')
'</DataArray>'
383 write(slice_fh,
'(a)')
'</PointData>'
394 write(slice_fh,
'(a)')
'<Points>'
395 write(slice_fh,
'(a)')
'<DataArray type="Float32" NumberOfComponents="3" format="ascii">'
397 {
do ix^dmb=ixcmin^dmb,ixcmax^dmb \}
399 x_vtk(1:
ndim)=ps_sub(jgrid)%xC(ix^dm,1:
ndim)*normconv(0);
400 write(slice_fh,
'(3(1pe14.6))') x_vtk
402 write(slice_fh,
'(a)')
'</DataArray>'
403 write(slice_fh,
'(a)')
'</Points>'
411 write(slice_fh,
'(a)')
'<Cells>'
414 write(slice_fh,
'(a)')
'<DataArray type="Int32" Name="connectivity" format="ascii">'
416 {^dm&
do ix^dmb=1,nx^dmb\}
418 write(slice_fh,
'(2(i7,1x))')ix1-1,ix1
420 write(slice_fh,
'(4(i7,1x))')(ix2-1)*nxc1+ix1-1, &
421 (ix2-1)*nxc1+ix1,ix2*nxc1+ix1-1,ix2*nxc1+ix1
424 write(slice_fh,
'(a)')
'</DataArray>'
427 write(slice_fh,
'(a)')
'<DataArray type="Int32" Name="offsets" format="ascii">'
429 write(slice_fh,
'(i7)') icell*(2**(^nd-1))
431 write(slice_fh,
'(a)')
'</DataArray>'
434 write(slice_fh,
'(a)')
'<DataArray type="Int32" Name="types" format="ascii">'
436 {^iftwod vtk_type=3 \}
437 {^ifthreed vtk_type=8 \}
439 write(slice_fh,
'(i2)') vtk_type
441 write(slice_fh,
'(a)')
'</DataArray>'
443 write(slice_fh,
'(a)')
'</Cells>'
447 write(slice_fh,
'(a)')
'</Piece>'
450 end subroutine write_slice_vtk
452 subroutine put_slice_csv
455 integer :: iw, ipe, itag
456 integer :: status(MPI_STATUS_SIZE)
458 character(len=1024) :: filename
459 character(len=name_len) :: wnamei(1:nw+nwauxio),xandwnamei(1:ndim+nw+nwauxio)
460 character(len=1024) :: outfilehead
461 character(len=1024) :: line
464 inquire(slice_fh,opened=fileopen)
465 if(.not.fileopen)
then
467 write(filename,
"(a,i1.1,a,i4.4,a)") trim(base_filename)//
'_d',dir,
'_x'//
slice_label(xslice)//
'_n',slicenext,
'.csv'
468 open(slice_fh,file=filename,status=
'unknown',form=
'formatted')
473 do iw=1,ndim+nw+nwauxio-1
474 line = trim(line)//trim(xandwnamei(iw))//
', '
476 line = trim(line)//trim(xandwnamei(ndim+nw+nwauxio))
477 write(slice_fh,
'(a)')trim(line)
483 call put_slice_line(jgrid,slice_fh)
490 do jgrid=1,morton_sub_stop(ipe)-morton_sub_start(ipe)+1
491 itag=morton_sub_start(ipe)+jgrid-1
492 if (ipe == mype )
then
493 call mpi_send(ps_sub(jgrid)%x,1,type_subblock_x_io,0,itag,icomm,ierrmpi)
494 call mpi_send(ps_sub(jgrid)%w,1,type_subblock_io,0,itag,icomm,ierrmpi)
495 call mpi_send(normconv,nw+nwauxio+1,mpi_double_precision,0,itag,icomm,ierrmpi)
498 call mpi_recv(ps_sub(njgrid+1)%x,1,type_subblock_x_io,ipe,itag,icomm,status,ierrmpi)
499 call mpi_recv(ps_sub(njgrid+1)%w,1,type_subblock_io,ipe,itag,icomm,status,ierrmpi)
500 call mpi_recv(normconv,nw+nwauxio+1,mpi_double_precision,ipe,&
501 itag,icomm,status,ierrmpi)
502 call put_slice_line(njgrid+1,slice_fh)
513 end subroutine put_slice_csv
515 subroutine put_slice_line(jout,file_handle)
516 integer,
intent(in) :: jout, file_handle
518 double precision,
parameter :: minvalue = 1.0d-99, maxvalue = 1.0d+99
519 integer :: ix^D,idir,iw
520 character(len=1024) ::line, data
523 do ix2=ixsubmlo(2),ixsubmhi(2)
524 do ix1=ixsubmlo(1),ixsubmhi(1)
527 do ix1=ixsubmlo(1),ixsubmhi(1)
533 write(
data,
"(es14.6)")
roundoff_minmax(ps_sub(jout)%x(ix1,ix2,idir),minvalue,maxvalue)
536 write(
data,
"(es14.6)")
roundoff_minmax(ps_sub(jout)%x(ix1,idir),minvalue,maxvalue)
539 write(
data,
"(es14.6)")
roundoff_minmax(ps_sub(jout)%x(idir),minvalue,maxvalue)
542 line = trim(line)//trim(data)//
', '
544 do iw = 1,nw+nwauxio-1
546 write(
data,
"(es14.6)")
roundoff_minmax(ps_sub(jout)%w(ix1,ix2,iw)*normconv(iw),minvalue,maxvalue)
549 write(
data,
"(es14.6)")
roundoff_minmax(ps_sub(jout)%w(ix1,iw)*normconv(iw),minvalue,maxvalue)
552 write(
data,
"(es14.6)")
roundoff_minmax(ps_sub(jout)%w(iw)*normconv(iw),minvalue,maxvalue)
554 line = trim(line)//trim(data)//
', '
557 write(
data,
"(es14.6)")
roundoff_minmax(ps_sub(jout)%w(ix1,ix2,nw+nwauxio)*normconv(nw+nwauxio),minvalue,maxvalue)
560 write(
data,
"(es14.6)")
roundoff_minmax(ps_sub(jout)%w(ix1,nw+nwauxio)*normconv(nw+nwauxio),minvalue,maxvalue)
562 line = trim(line)//trim(data)
563 write(file_handle,
'(a)')trim(line)
572 end subroutine put_slice_line
574 subroutine put_slice_dat
580 integer,
dimension(max_blocks*2) :: iorequest
581 integer,
dimension(MPI_STATUS_SIZE,max_blocks) :: iostatus
582 integer(kind=MPI_OFFSET_KIND) :: offset, offset1
584 integer :: amode, status(MPI_STATUS_SIZE), iwrite
585 character(len=1024) :: filename
586 character(len=name_len) :: dname
588 integer :: nsubparents, iw, ileaf, inode
589 integer(kind=MPI_OFFSET_KIND) :: block_offset, tree_offset
590 integer,
allocatable :: block_ig_sub(:,:)
591 integer,
allocatable :: block_lvl_sub(:)
592 integer(kind=MPI_OFFSET_KIND),
allocatable :: block_offset_sub(:)
593 logical,
allocatable :: isleaf_sub(:)
601 if (nsubleafs /=
sfc_sub(0,1)) error stop
"nsubleafs /= sfc_sub(0,1)"
603 allocate(block_ig_sub(ndim-1,nsubleafs))
604 allocate(block_lvl_sub(nsubleafs))
605 allocate(block_offset_sub(nsubleafs))
606 allocate(isleaf_sub(nsubleafs+nsubparents))
608 block_offset = int(0,kind=mpi_offset_kind)
611 do inode=1,nsubleafs+nsubparents
612 if (
sfc_sub(inode,1) == 0)
then
613 isleaf_sub(inode) = .false.
615 isleaf_sub(inode) = .true.
621 block_ig_sub(:,ileaf) = [ pnode%ig2, pnode%ig3 ]
623 block_ig_sub(:,ileaf) = [ pnode%ig1, pnode%ig3 ]
625 block_ig_sub(:,ileaf) = [ pnode%ig1, pnode%ig2 ]
631 block_ig_sub(:,ileaf) = [ pnode%ig2 ]
633 block_ig_sub(:,ileaf) = [ pnode%ig1 ]
636 block_lvl_sub(ileaf) = pnode%level
638 block_offset_sub(ileaf) = block_offset
639 block_offset = block_offset + int(2*(ndim-1)*
size_int,kind=mpi_offset_kind)
640 block_offset = block_offset + int(product(block_nx_sub)*nw*
size_double,kind=mpi_offset_kind)
646 write(filename,
"(a,i1.1,a,i4.4,a)") trim(base_filename)//
'_d',dir,
'_x'//
slice_label(xslice)//
'_n',slicenext,
'.dat'
649 open(unit=slice_fh,file=filename,status=
'replace')
656 amode=ior(mpi_mode_append,mpi_mode_wronly)
657 call mpi_file_open(mpi_comm_self,filename,amode,mpi_info_null, &
660 call mpi_file_write(slice_fh,
version_number, 1, mpi_integer, status, ierrmpi)
662 call mpi_file_write(slice_fh, 0, 1, mpi_integer, status, ierrmpi)
663 call mpi_file_write(slice_fh, 0, 1, mpi_integer, status, ierrmpi)
664 call mpi_file_write(slice_fh, nw, 1, mpi_integer, status, ierrmpi)
665 call mpi_file_write(slice_fh, ndir, 1, mpi_integer, status, ierrmpi)
666 call mpi_file_write(slice_fh, ndim-1, 1, mpi_integer, status, ierrmpi)
667 call mpi_file_write(slice_fh, levmax_sub, 1, mpi_integer, status, ierrmpi)
668 call mpi_file_write(slice_fh, nsubleafs, 1, mpi_integer, status, ierrmpi)
669 call mpi_file_write(slice_fh, nsubparents, 1, mpi_integer, status, ierrmpi)
670 call mpi_file_write(slice_fh, it, 1, mpi_integer, status, ierrmpi)
673 call mpi_file_write(slice_fh, global_time, 1, mpi_double_precision, status, ierrmpi)
675 call mpi_file_write(slice_fh, xprobminsub, ndim-1, &
676 mpi_double_precision, status, ierrmpi)
677 call mpi_file_write(slice_fh, xprobmaxsub, ndim-1, &
678 mpi_double_precision, status, ierrmpi)
679 call mpi_file_write(slice_fh, domain_nx_sub, ndim-1, &
680 mpi_integer, status, ierrmpi)
681 call mpi_file_write(slice_fh, block_nx_sub, ndim-1, &
682 mpi_integer, status, ierrmpi)
685 call mpi_file_write(slice_fh, periodbsub, ndim-1, mpi_logical, status, ierrmpi)
688 call mpi_file_write(slice_fh, geometry_name(1:
name_len), &
689 name_len, mpi_character, status, ierrmpi)
692 call mpi_file_write(slice_fh, stagger_grid, 1, mpi_logical, status, ierrmpi)
697 dname = trim(adjustl((cons_wnames(iw))))
698 call mpi_file_write(slice_fh, dname,
name_len, mpi_character, status, ierrmpi)
713 call mpi_file_write(slice_fh, snapshotnext, 1, mpi_integer, status, ierrmpi)
715 call mpi_file_write(slice_fh, snapshotnext+1, 1, mpi_integer, status, ierrmpi)
717 call mpi_file_write(slice_fh, slicenext, 1, mpi_integer, status, ierrmpi)
718 call mpi_file_write(slice_fh, collapsenext, 1, mpi_integer, status, ierrmpi)
720 call mpi_file_get_position(slice_fh, tree_offset, ierrmpi)
721 call mpi_file_write(slice_fh, isleaf_sub, nsubleafs+nsubparents, mpi_logical, status, ierrmpi)
722 call mpi_file_write(slice_fh, block_lvl_sub, nsubleafs, mpi_integer, status, ierrmpi)
723 call mpi_file_write(slice_fh, block_ig_sub,
size(block_ig_sub), mpi_integer, status, ierrmpi)
726 call mpi_file_get_position(slice_fh, block_offset, ierrmpi)
727 block_offset_sub(:) = block_offset_sub(:) + block_offset + &
728 int(nsubleafs*2*
size_int, kind=mpi_offset_kind)
730 call mpi_file_write(slice_fh, block_offset_sub, nsubleafs, mpi_offset, status, ierrmpi)
733 call mpi_file_get_position(slice_fh, block_offset, ierrmpi)
734 if (block_offset - tree_offset /= &
737 print *,
"Warning: MPI_OFFSET type /= 8 bytes"
738 print *,
"This *could* cause problems when reading .dat files"
742 call mpi_file_seek(slice_fh, int(
size_int,kind=mpi_offset_kind), mpi_seek_set, ierrmpi)
743 call mpi_file_write(slice_fh, int(tree_offset), 1, mpi_integer, status, ierrmpi)
744 call mpi_file_write(slice_fh, int(block_offset), 1, mpi_integer, status, ierrmpi)
746 call mpi_file_close(slice_fh,ierrmpi)
750 call mpi_bcast(nsubleafs, 1, mpi_integer, 0, icomm, ierrmpi)
751 call mpi_bcast(nsubparents, 1, mpi_integer, 0, icomm, ierrmpi)
755 allocate(block_offset_sub(nsubleafs))
759 call mpi_bcast(block_offset_sub, nsubleafs, mpi_offset, 0, icomm, ierrmpi)
761 amode=ior(mpi_mode_create,mpi_mode_wronly)
762 call mpi_file_open(icomm,filename,amode,mpi_info_null,slice_fh,ierrmpi)
763 iorequest=mpi_request_null
769 call mpi_file_iwrite_at(slice_fh,offset,0,2*(ndim-1),mpi_integer,iorequest(iwrite),ierrmpi)
771 offset1=offset+int(2*(ndim-1)*
size_int,kind=mpi_offset_kind)
772 call mpi_file_iwrite_at(slice_fh,offset1,ps_sub(jgrid)%w,1,type_subblock_io, &
773 iorequest(iwrite),ierrmpi)
776 if (iwrite>0)
call mpi_waitall(iwrite,iorequest,iostatus,ierrmpi)
777 call mpi_barrier(icomm, ierrmpi)
778 call mpi_file_close(slice_fh,ierrmpi)
780 deallocate(block_offset_sub)
782 deallocate(block_ig_sub)
783 deallocate(block_lvl_sub)
784 deallocate(isleaf_sub)
787 end subroutine put_slice_dat
789 subroutine put_slice_zerod
793 integer :: amode, iwrite, status(MPI_STATUS_SIZE)
794 logical,
save :: opened=.false.
795 character(len=name_len) :: wnamei(1:nw+nwauxio),xandwnamei(1:ndim+nw+nwauxio)
796 character(len=1024) :: outfilehead
797 character(len=1024) ::line, data
798 character(len=1024) :: filename
802 write(filename,
"(a,i1.1,a,i4.4,a)") trim(base_filename)//
'_d',dir,
'_x'//
slice_label(xslice)//
'.csv'
805 if (.not. opened .and. mype==0)
then
806 amode=ior(mpi_mode_create,mpi_mode_wronly)
807 amode=ior(amode,mpi_mode_append)
808 call mpi_file_open(mpi_comm_self,filename,amode, &
809 mpi_info_null,slice_fh,ierrmpi)
813 do iw=1,nw+nwauxio+ndim
814 line = trim(line)//
', '//trim(xandwnamei(iw))
817 call mpi_file_write(slice_fh,line,len_trim(line), &
818 mpi_character,status,ierrmpi)
819 call mpi_file_write(slice_fh,achar(10),1,mpi_character,status,ierrmpi)
820 call mpi_file_close(slice_fh, ierrmpi)
824 call mpi_barrier(icomm,ierrmpi)
828 amode=ior(mpi_mode_create,mpi_mode_wronly)
829 amode=ior(amode,mpi_mode_append)
830 call mpi_file_open(mpi_comm_self,filename,amode, &
831 mpi_info_null,slice_fh,ierrmpi)
834 write(
data,
"(es14.6)")global_time
836 write(
data,
"(es14.6)")ps_sub(1)%x
837 line = trim(line)//
', '//trim(data)
839 write(
data,
"(es14.6)")ps_sub(1)%w(iw)*normconv(iw)
840 line = trim(line)//
', '//trim(data)
843 call mpi_file_write(slice_fh,trim(line),len_trim(line), &
844 mpi_character,status,ierrmpi)
845 call mpi_file_write(slice_fh,achar(10),1,mpi_character,status,ierrmpi)
846 call mpi_file_close(slice_fh, ierrmpi)
849 end subroutine put_slice_zerod
1029 integer,
intent(in) :: igrid, dir
1030 integer,
intent(inout) :: jgrid
1031 logical,
intent(in) :: active
1032 double precision,
intent(in) :: xslice
1033 double precision,
dimension(0:nw+nwauxio),
intent(out) :: normconv
1035 double precision,
dimension(ixMlo^D-1:ixMhi^D,ndim) :: xC_TMP, xC
1036 double precision,
dimension(ixMlo^D:ixMhi^D,ndim) :: xCC_TMP, xCC
1037 double precision,
dimension(ixMlo^D-1:ixMhi^D,nw+nwauxio) :: wC_TMP
1038 double precision,
dimension(ixMlo^D:ixMhi^D,nw+nwauxio) :: wCC_TMP
1039 double precision,
dimension(ixG^T) :: x_save
1040 integer :: ixslice, nwexpand, ixC^L, ixCC^L
1041 logical :: mask(ixG^T)
1063 ixslice = minloc(dabs(xslice-ps(igrid)%x(:,dir)),1,mask(:))
1068 ixslice = minloc(dabs(xslice-ps(igrid)%x(:,ixmlo2,dir)),1,mask(:,ixmlo2))
1070 ixslice = minloc(dabs(xslice-ps(igrid)%x(ixmlo1,:,dir)),1,mask(ixmlo1,:))
1072 call mpistop(
"slice direction not clear in fill_subnode")
1078 ixslice = minloc(dabs(xslice-ps(igrid)%x(:,ixmlo2,ixmlo3,dir)),1,mask(:,ixmlo2,ixmlo3))
1080 ixslice = minloc(dabs(xslice-ps(igrid)%x(ixmlo1,:,ixmlo3,dir)),1,mask(ixmlo1,:,ixmlo3))
1082 ixslice = minloc(dabs(xslice-ps(igrid)%x(ixmlo1,ixmlo2,:,dir)),1,mask(ixmlo1,ixmlo2,:))
1084 call mpistop(
"slice direction not clear in fill_subnode")
1088 call calc_x(igrid,xc,xcc)
1090 xc(:^
d&,dir) = xslice
1091 xcc(:^
d&,dir) = xslice
1093 ixc^l,ixcc^l,.true.)
1099 ps_sub(jgrid)%w(1:nw+nwexpand) = wcc_tmp(ixslice,1:nw+nwexpand)
1100 ps_sub(jgrid)%x(1:
ndim) = xcc_tmp(ixslice,1:
ndim)
1101 ps_sub(jgrid)%wC(1:nw+nwexpand) = wc_tmp(ixslice,1:nw+nwexpand)
1102 ps_sub(jgrid)%xC(1:
ndim) = xc_tmp(ixslice,1:
ndim)
1107 ps_sub(jgrid)%w(ixccmin2:ixccmax2,1:nw+nwexpand) &
1108 = wcc_tmp(ixslice,ixccmin2:ixccmax2,1:nw+nwexpand)
1109 ps_sub(jgrid)%x(ixccmin2:ixccmax2,1:
ndim) &
1110 = xcc_tmp(ixslice,ixccmin2:ixccmax2,1:
ndim)
1111 ps_sub(jgrid)%wC(ixcmin2:ixcmax2,1:nw+nwexpand) &
1112 = wc_tmp(ixslice,ixcmin2:ixcmax2,1:nw+nwexpand)
1113 ps_sub(jgrid)%xC(ixcmin2:ixcmax2,1:
ndim) &
1114 = xc_tmp(ixslice,ixcmin2:ixcmax2,1:
ndim)
1116 ps_sub(jgrid)%w(ixccmin1:ixccmax1,1:nw+nwexpand) &
1117 = wcc_tmp(ixccmin1:ixccmax1,ixslice,1:nw+nwexpand)
1118 ps_sub(jgrid)%x(ixccmin1:ixccmax1,1:
ndim) &
1119 = xcc_tmp(ixccmin1:ixccmax1,ixslice,1:
ndim)
1120 ps_sub(jgrid)%wC(ixcmin1:ixcmax1,1:nw+nwexpand) &
1121 = wc_tmp(ixcmin1:ixcmax1,ixslice,1:nw+nwexpand)
1122 ps_sub(jgrid)%xC(ixcmin1:ixcmax1,1:
ndim) &
1123 = xc_tmp(ixcmin1:ixcmax1,ixslice,1:
ndim)
1125 call mpistop(
"slice direction not clear in fill_subnode")
1131 ps_sub(jgrid)%w(ixccmin2:ixccmax2,ixccmin3:ixccmax3,1:nw+nwexpand) = &
1132 wcc_tmp(ixslice,ixccmin2:ixccmax2,ixccmin3:ixccmax3,1:nw+nwexpand)
1133 ps_sub(jgrid)%x(ixccmin2:ixccmax2,ixccmin3:ixccmax3,1:
ndim) = &
1134 xcc_tmp(ixslice,ixccmin2:ixccmax2,ixccmin3:ixccmax3,1:
ndim)
1135 ps_sub(jgrid)%wC(ixcmin2:ixcmax2,ixcmin3:ixcmax3,1:nw+nwexpand) = &
1136 wc_tmp(ixslice,ixcmin2:ixcmax2,ixcmin3:ixcmax3,1:nw+nwexpand)
1137 ps_sub(jgrid)%xC(ixcmin2:ixcmax2,ixcmin3:ixcmax3,1:
ndim) = &
1138 xc_tmp(ixslice,ixcmin2:ixcmax2,ixcmin3:ixcmax3,1:
ndim)
1140 ps_sub(jgrid)%w(ixccmin1:ixccmax1,ixccmin3:ixccmax3,1:nw+nwexpand) = &
1141 wcc_tmp(ixccmin1:ixccmax1,ixslice,ixccmin3:ixccmax3,1:nw+nwexpand)
1142 ps_sub(jgrid)%x(ixccmin1:ixccmax1,ixccmin3:ixccmax3,1:
ndim) = &
1143 xcc_tmp(ixccmin1:ixccmax1,ixslice,ixccmin3:ixccmax3,1:
ndim)
1144 ps_sub(jgrid)%wC(ixcmin1:ixcmax1,ixcmin3:ixcmax3,1:nw+nwexpand) = &
1145 wc_tmp(ixcmin1:ixcmax1,ixslice,ixcmin3:ixcmax3,1:nw+nwexpand)
1146 ps_sub(jgrid)%xC(ixcmin1:ixcmax1,ixcmin3:ixcmax3,1:
ndim) = &
1147 xc_tmp(ixcmin1:ixcmax1,ixslice,ixcmin3:ixcmax3,1:
ndim)
1149 ps_sub(jgrid)%w(ixccmin1:ixccmax1,ixccmin2:ixccmax2,1:nw+nwexpand) = &
1150 wcc_tmp(ixccmin1:ixccmax1,ixccmin2:ixccmax2,ixslice,1:nw+nwexpand)
1151 ps_sub(jgrid)%x(ixccmin1:ixccmax1,ixccmin2:ixccmax2,1:
ndim) = &
1152 xcc_tmp(ixccmin1:ixccmax1,ixccmin2:ixccmax2,ixslice,1:
ndim)
1153 ps_sub(jgrid)%wC(ixcmin1:ixcmax1,ixcmin2:ixcmax2,1:nw+nwexpand) = &
1154 wc_tmp(ixcmin1:ixcmax1,ixcmin2:ixcmax2,ixslice,1:nw+nwexpand)
1155 ps_sub(jgrid)%xC(ixcmin1:ixcmax1,ixcmin2:ixcmax2,1:
ndim) = &
1156 xc_tmp(ixcmin1:ixcmax1,ixcmin2:ixcmax2,ixslice,1:
ndim)
1158 call mpistop(
"slice direction not clear in fill_subnode")