MPI-AMRVAC 3.1
The MPI - Adaptive Mesh Refinement - Versatile Advection Code (development version)
Loading...
Searching...
No Matches
mod_convert_files.t
Go to the documentation of this file.
2 use mod_comm_lib, only: mpistop
3
4 implicit none
5 public
6
7contains
8
14 use mod_convert, only: convert_all
16
17 character(len=std_len) :: convert_type_elem
18 integer :: i
19
20 select case(convert_type)
21 case('tecplot','tecplotCC','tecline')
23 case('tecplotmpi','tecplotCCmpi','teclinempi')
25 case('vtu','vtuCC')
27 case('vtumpi','vtuCCmpi')
29 case('vtuB','vtuBCC','vtuBmpi','vtuBCCmpi')
31 case('vtuB64','vtuBCC64','vtuBmpi64','vtuBCCmpi64')
33 {^iftwod
34 case('vtuB23','vtuBCC23')
36 case('vtuBsym23','vtuBCCsym23')
38 }
39 case('pvtumpi','pvtuCCmpi')
41 case('pvtuBmpi','pvtuBCCmpi')
43 case('vtimpi','vtiCCmpi')
45 case('onegrid','onegridmpi')
47 case('oneblock','oneblockB')
49 case('EIvtiCCmpi','ESvtiCCmpi','SIvtiCCmpi','WIvtiCCmpi','EIvtuCCmpi','ESvtuCCmpi','SIvtuCCmpi','WIvtuCCmpi')
50 ! output synthetic euv emission
51 if (ndim==3 .and. associated(phys_te_images)) then
53 endif
54 case('dat_generic_mpi')
55 call convert_all()
56 case('user','usermpi')
57 if (.not. associated(usr_special_convert)) then
58 call mpistop("usr_special_convert not defined")
59 else
61 end if
62 case default
63 call mpistop("Error in generate_plotfile: Unknown convert_type")
64 end select
65
66 end subroutine generate_plotfile
67
68 subroutine oneblock(qunit)
69 ! this is for turning an AMR run into a single block
70 ! the data will be all on selected level level_io
71 ! this version should work for any dimension
72 ! only writes w_write selected 1:nw variables, also nwauxio
73 ! may use saveprim to switch to primitives
74 ! this version can not work on multiple CPUs
75 ! does not renormalize variables
76 ! header info differs from onegrid below
77 ! ASCII or binary output
78
82 use mod_physics
84 integer, intent(in) :: qunit
85
86 double precision :: wval1,xval1
87 double precision, dimension({^D&1:1},1:nw+nwauxio) :: wval
88 double precision, dimension({^D&1:1},1:ndim) :: xval
89 double precision:: normconv(0:nw+nwauxio)
90 integer :: Morton_no,igrid,ix^D,ig^D,level
91 integer, pointer :: ig_to_igrid(:^D&,:)
92 integer :: filenr,ncells^D,ncellx^D,jg^D,jig^D
93 integer :: iw,iiw,writenw,iwrite(1:nw+nwauxio),iigrid,idim
94 logical :: fileopen,writeblk(max_blocks)
95 logical :: patchw(ixG^T)
96 character(len=name_len) :: wnamei(1:nw+nwauxio),xandwnamei(1:ndim+nw+nwauxio)
97 character(len=1024) :: outfilehead
98 character(len=80) :: filename
99
100 if(level_io<1)then
101 call mpistop('please specify level_io>0 for usage with oneblock')
102 end if
103
104 if(autoconvert)then
105 call mpistop('Set autoconvert=F and convert oneblock data manually')
106 end if
107
108 if(npe>1)then
109 if(mype==0) print *,'ONEBLOCK as yet to be parallelized'
110 call mpistop('npe>1, oneblock')
111 end if
112
113 ! only variables selected by w_write will be written out
114 normconv(0:nw+nwauxio)=one
115 normconv(0) = length_convert_factor
116 normconv(1:nw) = w_convert_factor
117 writenw=count(w_write(1:nw))+nwauxio
118 iiw=0
119 do iw =1,nw
120 if (.not.w_write(iw))cycle
121 iiw=iiw+1
122 iwrite(iiw)=iw
123 end do
124 if(nwauxio>0)then
125 do iw =nw+1,nw+nwauxio
126 iiw=iiw+1
127 iwrite(iiw)=iw
128 end do
129 end if
130
131 allocate(ig_to_igrid(ng^d(level_io),0:npe-1))
132 ig_to_igrid=-1
133 writeblk=.false.
134 do morton_no=morton_start(mype),morton_stop(mype)
135 igrid=sfc_to_igrid(morton_no)
136 level=node(plevel_,igrid)
137 ig^d=igrid_to_node(igrid,mype)%node%ig^d;
138 ig_to_igrid(ig^d,mype)=igrid
139 if(({rnode(rpxmin^d_,igrid)>=xprobmin^d+(xprobmax^d-xprobmin^d)&
140 *writespshift(^d,1)|.and.}).and.({rnode(rpxmax^d_,igrid)&
141 <=xprobmax^d-(xprobmax^d-xprobmin^d)*writespshift(^d,2)|.and.})) then
142 writeblk(igrid)=.true.
143 end if
144 end do
145
146 call getheadernames(wnamei,xandwnamei,outfilehead)
147 ncells^d=0;
148 ncellx^d=ixmhi^d-ixmlo^d+1\
149 {do ig^d=1,ng^d(level_io)\}
150 igrid=ig_to_igrid(ig^d,mype)
151 if(writeblk(igrid)) go to 20
152 {end do\}
153 20 continue
154 jg^d=ig^d;
155 {
156 jig^dd=jg^dd;
157 do ig^d=1,ng^d(level_io)
158 jig^d=ig^d
159 igrid=ig_to_igrid(jig^dd,mype)
160 if(writeblk(igrid)) ncells^d=ncells^d+ncellx^d
161 end do
162 \}
163
164 do iigrid=1,igridstail; igrid=igrids(iigrid)
165 if(.not.writeblk(igrid)) cycle
166 block=>ps(igrid)
167 if (nwauxio > 0) then
168 if (.not. associated(usr_aux_output)) then
169 call mpistop("usr_aux_output not defined")
170 else
171 call usr_aux_output(ixg^ll,ixm^ll^ladd1, &
172 ps(igrid)%w,ps(igrid)%x,normconv)
173 end if
174 end if
175 end do
176
177 if (saveprim) then
178 do iigrid=1,igridstail; igrid=igrids(iigrid)
179 if (.not.writeblk(igrid)) cycle
180 block=>ps(igrid)
181 call phys_to_primitive(ixg^ll,ixg^ll^lsub1,ps(igrid)%w,ps(igrid)%x)
182 if(b0field) then
183 ! add background magnetic field B0 to B
184 ps(igrid)%w(ixg^t,iw_mag(:))=ps(igrid)%w(ixg^t,iw_mag(:))+ps(igrid)%B0(ixg^t,:,0)
185 end if
186 end do
187 else
188 do iigrid=1,igridstail; igrid=igrids(iigrid)
189 if (.not.writeblk(igrid)) cycle
190 block=>ps(igrid)
191 if (b0field) then
192 ! add background magnetic field B0 to B
193 if(phys_energy) &
194 ps(igrid)%w(ixg^t,iw_e)=ps(igrid)%w(ixg^t,iw_e)+0.5d0*sum(ps(igrid)%B0(ixg^t,:,0)**2,dim=ndim+1) &
195 + sum(ps(igrid)%w(ixg^t,iw_mag(:))*ps(igrid)%B0(ixg^t,:,0),dim=ndim+1)
196 ps(igrid)%w(ixg^t,iw_mag(:))=ps(igrid)%w(ixg^t,iw_mag(:))+ps(igrid)%B0(ixg^t,:,0)
197 end if
198 end do
199 end if
200
201 master_cpu_open : if (mype == 0) then
202 inquire(qunit,opened=fileopen)
203 if (.not.fileopen) then
204 ! generate filename
205 filenr=snapshotini
206 if (autoconvert) filenr=snapshotnext
207 write(filename,'(a,i4.4,a)') trim(base_filename),filenr,".blk"
208 select case(convert_type)
209 case("oneblock")
210 open(qunit,file=filename,status='unknown')
211 write(qunit,*) trim(outfilehead)
212 write(qunit,*) ncells^d
213 write(qunit,*) real(global_time*time_convert_factor)
214 case("oneblockB")
215 open(qunit,file=filename,form='unformatted',status='unknown')
216 write(qunit) outfilehead
217 write(qunit) ncells^d
218 write(qunit) real(global_time*time_convert_factor)
219 end select
220 end if
221 end if master_cpu_open
222
223 {^ifthreed
224 do ig3=1,ng3(level_io)
225 do ix3=ixmlo3,ixmhi3}
226
227 {^nooned
228 do ig2=1,ng2(level_io)
229 do ix2=ixmlo2,ixmhi2}
230
231 do ig1=1,ng1(level_io)
232 igrid=ig_to_igrid(ig^d,mype)
233 if(.not.writeblk(igrid)) cycle
234 do ix1=ixmlo1,ixmhi1
235 master_write : if(mype==0) then
236 select case(convert_type)
237 case("oneblock")
238 write(qunit,fmt="(100(e14.6))") &
239 ps(igrid)%x(ix^d,1:ndim)*normconv(0),&
240 (ps(igrid)%w(ix^d,iwrite(iw))*normconv(iwrite(iw)),iw=1,writenw)
241 case("oneblockB")
242 write(qunit) real(ps(igrid)%x(ix^d,1:ndim)*normconv(0)),&
243 (real(ps(igrid)%w(ix^d,iwrite(iw))*normconv(iwrite(iw))),iw=1,writenw)
244 end select
245 end if master_write
246 end do
247 end do
248 {^nooned
249 end do
250 end do}
251 {^ifthreed
252 end do
253 end do}
254
255 close(qunit)
256
257 end subroutine oneblock
258
259 subroutine onegrid(qunit)
260 ! this is for turning an AMR run into a single grid
261 ! this version should work for any dimension, can be in parallel
262 ! in 1D, should behave much like oneblock, except for header info
263
264 ! only writes all 1:nw variables, no nwauxio
265 ! may use saveprim to switch to primitives
266 ! this version can work on multiple CPUs
267 ! does not renormalize variables
268 ! ASCII output
269
272 use mod_physics
274 integer, intent(in) :: qunit
275
276 double precision :: w_recv(ixG^T,1:nw),x_recv(ixG^T,1:ndim)
277 integer :: itag,Morton_no,igrid,ix^D,iw
278 integer :: filenr
279 !.. MPI variables ..
280 integer :: igrid_recv,ipe
281 integer, allocatable :: intstatus(:,:)
282 logical :: fileopen
283 character(len=80) :: filename
284 character(len=name_len) :: wnamei(1:nw+nwauxio),xandwnamei(1:ndim+nw+nwauxio)
285 character(len=1024) :: outfilehead
286
287
288 if(nwauxio>0)then
289 if(mype==0) print *,'ONEGRID to be used without nwauxio'
290 call mpistop('nwauxio>0, onegrid')
291 end if
292
293 if(saveprim)then
294 if(mype==0.and.nwaux>0) print *,'warning: ONEGRID used with saveprim, check auxiliaries'
295 end if
296
297 master_cpu_open : if (mype == 0) then
298 call getheadernames(wnamei,xandwnamei,outfilehead)
299 write(outfilehead,'(a)') "#"//" "//trim(outfilehead)
300 inquire(qunit,opened=fileopen)
301 if (.not.fileopen) then
302 ! generate filename
303 filenr=snapshotini
304 if (autoconvert) filenr=snapshotnext
305 write(filename,'(a,i4.4,a)') trim(base_filename),filenr,".blk"
306 open(qunit,file=filename,status='unknown')
307 end if
308 write(qunit,"(a)")outfilehead
309 write(qunit,"(i7)") ( {^d&(ixmhi^d-ixmlo^d+1)*} )*(morton_stop(npe-1)-morton_start(0)+1)
310 end if master_cpu_open
311
312 do morton_no=morton_start(mype),morton_stop(mype)
313 igrid=sfc_to_igrid(morton_no)
314 if(saveprim) call phys_to_primitive(ixg^ll,ixm^ll,ps(igrid)%w,ps(igrid)%x)
315 if(mype/=0)then
316 itag=morton_no
317 call mpi_send(igrid,1,mpi_integer, 0,itag,icomm,ierrmpi)
318 call mpi_send(ps(igrid)%x,1,type_block_xcc_io, 0,itag,icomm,ierrmpi)
319 itag=igrid
320 call mpi_send(ps(igrid)%w,1,type_block_io, 0,itag,icomm,ierrmpi)
321 else
322 {do ix^db=ixmlo^db,ixmhi^db\}
323 do iw=1,nw
324 if( dabs(ps(igrid)%w(ix^d,iw)) < 1.0d-32 ) ps(igrid)%w(ix^d,iw) = zero
325 end do
326 write(qunit,fmt="(100(e14.6))") ps(igrid)%x(ix^d,1:ndim),ps(igrid)%w(ix^d,1:nw)
327 {end do\}
328 end if
329 end do
330
331 if(mype==0.and.npe>1) allocate(intstatus(mpi_status_size,1))
332
333 manycpu : if (npe>1) then
334 if (mype==0) then
335 loop_cpu : do ipe =1, npe-1
336 loop_morton : do morton_no=morton_start(ipe),morton_stop(ipe)
337 itag=morton_no
338 call mpi_recv(igrid_recv,1,mpi_integer, ipe,itag,icomm,intstatus(:,1),ierrmpi)
339 call mpi_recv(x_recv,1,type_block_xcc_io, ipe,itag,icomm,intstatus(:,1),ierrmpi)
340 itag=igrid_recv
341 call mpi_recv(w_recv,1,type_block_io, ipe,itag,icomm,intstatus(:,1),ierrmpi)
342 {do ix^db=ixmlo^db,ixmhi^db\}
343 do iw=1,nw
344 if( dabs(ps(igrid)%w(ix^d,iw)) < smalldouble ) ps(igrid)%w(ix^d,iw) = zero
345 end do
346 write(qunit,fmt="(100(e14.6))") x_recv(ix^d,1:ndim),w_recv(ix^d,1:nw)
347 {end do\}
348 end do loop_morton
349 end do loop_cpu
350 end if
351 end if manycpu
352
353 if (npe>1) then
354 call mpi_barrier(icomm,ierrmpi)
355 if(mype==0)deallocate(intstatus)
356 end if
357
358 if(mype==0) close(qunit)
359 end subroutine onegrid
360
361 subroutine tecplot(qunit)
362
363 ! output for tecplot (ASCII format)
364 ! not parallel, uses calc_grid to compute nwauxio variables
365 ! allows renormalizing using convert factors
366
369
370 integer, intent(in) :: qunit
371
372 double precision :: x_TEC(ndim), w_TEC(nw+nwauxio)
373 double precision, dimension(ixMlo^D-1:ixMhi^D,ndim) :: xC_TMP
374 double precision, dimension(ixMlo^D:ixMhi^D,ndim) :: xCC_TMP
375 double precision, dimension(ixMlo^D-1:ixMhi^D,ndim) :: xC
376 double precision, dimension(ixMlo^D:ixMhi^D,ndim) :: xCC
377 double precision, dimension(ixMlo^D-1:ixMhi^D,nw+nwauxio) :: wC_TMP
378 double precision, dimension(ixMlo^D:ixMhi^D,nw+nwauxio) :: wCC_TMP
379 double precision, dimension(0:nw+nwauxio) :: normconv
380 integer:: igrid,iigrid,level,igonlevel,iw,idim,ix^D
381 integer:: NumGridsOnLevel(1:nlevelshi)
382 integer :: nx^D,nxC^D,nodesonlevel,elemsonlevel,ixC^L,ixCC^L
383 integer :: nodes, elems
384 integer :: filenr
385 logical :: fileopen,first
386 character(len=80) :: filename
387 !!! possible length conflict
388 character(len=1024) :: tecplothead
389 character(len=name_len) :: wnamei(1:nw+nwauxio),xandwnamei(1:ndim+nw+nwauxio)
390 character(len=1024) :: outfilehead
391
392 if(npe>1)then
393 if(mype==0) print *,'tecplot not parallel, use tecplotmpi'
394 call mpistop('npe>1, tecplot')
395 end if
396
397 if(nw/=count(w_write(1:nw)))then
398 if(mype==0) print *,'tecplot does not use w_write=F'
399 call mpistop('w_write, tecplot')
400 end if
401
402 if(nocartesian)then
403 if(mype==0) print *,'tecplot with nocartesian'
404 end if
405
406 inquire(qunit,opened=fileopen)
407 if(.not.fileopen) then
408 ! generate filename
409 filenr=snapshotini
410 if (autoconvert) filenr=snapshotnext
411 write(filename,'(a,i4.4,a)') trim(base_filename),filenr,".plt"
412 open(qunit,file=filename,status='unknown')
413 end if
414
415 call getheadernames(wnamei,xandwnamei,outfilehead)
416
417 write(tecplothead,'(a)') "VARIABLES = "//trim(outfilehead)
418 write(qunit,'(a)') tecplothead(1:len_trim(tecplothead))
419
420 numgridsonlevel(1:nlevelshi)=0
421 do level=levmin,levmax
422 numgridsonlevel(level)=0
423 do iigrid=1,igridstail; igrid=igrids(iigrid);
424 if (node(plevel_,igrid)/=level) cycle
425 numgridsonlevel(level)=numgridsonlevel(level)+1
426 end do
427 end do
428
429 nx^d=ixmhi^d-ixmlo^d+1;
430 nxc^d=nx^d+1;
431
432 {^ifoned
433 if(convert_type=='tecline') then
434 nodes=0
435 elems=0
436 do level=levmin,levmax
437 nodes=nodes + numgridsonlevel(level)*{nxc^d*}
438 elems=elems + numgridsonlevel(level)*{nx^d*}
439 end do
440
441 write(qunit,"(a,i7,a,1pe12.5,a)") &
442 'ZONE T="all levels", I=',elems, &
443 ', SOLUTIONTIME=',global_time*time_convert_factor,', F=POINT'
444
445 igonlevel=0
446 do iigrid=1,igridstail; igrid=igrids(iigrid);
447 block=>ps(igrid)
448 call calc_x(igrid,xc,xcc)
449 call calc_grid(qunit,igrid,xc,xcc,xc_tmp,xcc_tmp,wc_tmp,wcc_tmp,normconv,ixc^l,ixcc^l,.true.)
450 {do ix^db=ixccmin^db,ixccmax^db\}
451 x_tec(1:ndim)=xcc_tmp(ix^d,1:ndim)*normconv(0)
452 w_tec(1:nw+nwauxio)=wcc_tmp(ix^d,1:nw+nwauxio)*normconv(1:nw+nwauxio)
453 write(qunit,fmt="(100(e24.16))") x_tec, w_tec
454 {end do\}
455 end do
456 close(qunit)
457 else
458 }
459 do level=levmin,levmax
460 nodesonlevel=numgridsonlevel(level)*{nxc^d*}
461 elemsonlevel=numgridsonlevel(level)*{nx^d*}
462 ! for all tecplot variants coded up here, we let the TECPLOT ZONES coincide
463 ! with the AMR grid LEVEL. Other options would be
464 ! let each grid define a zone: inefficient for TECPLOT internal workings
465 ! hence not implemented
466 ! let entire octree define 1 zone: no difference in interpolation
467 ! properties across TECPLOT zones detected as yet, hence not done
468 select case(convert_type)
469 case('tecplot')
470 ! in this option, we store the corner coordinates, as well as the corner
471 ! values of all variables (obtained by averaging). This allows POINT packaging,
472 ! and thus we can save full grid info by using one call to calc_grid
473 write(qunit,"(a,i7,a,a,i7,a,i7,a,f25.16,a,a)") &
474 'ZONE T="',level,'"',', N=',nodesonlevel,', E=',elemsonlevel, &
475 ', SOLUTIONTIME=',global_time*time_convert_factor,', DATAPACKING=POINT, ZONETYPE=', &
476 {^ifoned 'FELINESEG'}{^iftwod 'FEQUADRILATERAL'}{^ifthreed 'FEBRICK'}
477 do iigrid=1,igridstail; igrid=igrids(iigrid);
478 if (node(plevel_,igrid)/=level) cycle
479 block=>ps(igrid)
480 call calc_x(igrid,xc,xcc)
481 call calc_grid(qunit,igrid,xc,xcc,xc_tmp,xcc_tmp,wc_tmp,wcc_tmp,normconv,&
482 ixc^l,ixcc^l,.true.)
483 {do ix^db=ixcmin^db,ixcmax^db\}
484 x_tec(1:ndim)=xc_tmp(ix^d,1:ndim)*normconv(0)
485 w_tec(1:nw+nwauxio)=wc_tmp(ix^d,1:nw+nwauxio)*normconv(1:nw+nwauxio)
486 write(qunit,fmt="(100(e14.6))") x_tec, w_tec
487 {end do\}
488 end do
489 case('tecplotCC')
490 ! in this option, we store the corner coordinates, and the cell center
491 ! values of all variables. Due to this mix of corner/cell center, we must
492 ! use BLOCK packaging, and thus we have enormous overhead by using
493 ! calc_grid repeatedly to merely fill values of cell corner coordinates
494 ! and cell center values per dimension, per variable
495 if(ndim+nw+nwauxio>99) call mpistop("adjust format specification in writeout")
496 if(nw+nwauxio==1)then
497 ! to make tecplot happy: avoid [ndim+1-ndim+1] in varlocation varset
498 ! and just set [ndim+1]
499 write(qunit,"(a,i7,a,a,i7,a,i7,a,f25.16,a,i1,a,a)") &
500 'ZONE T="',level,'"',', N=',nodesonlevel,', E=',elemsonlevel, &
501 ', SOLUTIONTIME=',global_time*time_convert_factor,', DATAPACKING=BLOCK, VARLOCATION=([', &
502 ndim+1,']=CELLCENTERED), ZONETYPE=', &
503 {^ifoned 'FELINESEG'}{^iftwod 'FEQUADRILATERAL'}{^ifthreed 'FEBRICK'}
504 else
505 if(ndim+nw+nwauxio<10) then
506 ! difference only in length of integer format specification for ndim+nw+nwauxio
507 write(qunit,"(a,i7,a,a,i7,a,i7,a,f25.16,a,i1,a,i1,a,a)") &
508 'ZONE T="',level,'"',', N=',nodesonlevel,', E=',elemsonlevel, &
509 ', SOLUTIONTIME=',global_time*time_convert_factor,', DATAPACKING=BLOCK, VARLOCATION=([', &
510 ndim+1,'-',ndim+nw+nwauxio,']=CELLCENTERED), ZONETYPE=', &
511 {^ifoned 'FELINESEG'}{^iftwod 'FEQUADRILATERAL'}{^ifthreed 'FEBRICK'}
512 else
513 write(qunit,"(a,i7,a,a,i7,a,i7,a,f25.16,a,i1,a,i2,a,a)") &
514 'ZONE T="',level,'"',', N=',nodesonlevel,', E=',elemsonlevel, &
515 ', SOLUTIONTIME=',global_time*time_convert_factor,', DATAPACKING=BLOCK, VARLOCATION=([', &
516 ndim+1,'-',ndim+nw+nwauxio,']=CELLCENTERED), ZONETYPE=', &
517 {^ifoned 'FELINESEG'}{^iftwod 'FEQUADRILATERAL'}{^ifthreed 'FEBRICK'}
518 end if
519 end if
520 do idim=1,ndim
521 first=(idim==1)
522 do iigrid=1,igridstail; igrid=igrids(iigrid);
523 if (node(plevel_,igrid)/=level) cycle
524 block=>ps(igrid)
525 call calc_x(igrid,xc,xcc)
526 call calc_grid(qunit,igrid,xc,xcc,xc_tmp,xcc_tmp,wc_tmp,wcc_tmp,normconv,&
527 ixc^l,ixcc^l,first)
528 write(qunit,fmt="(100(e14.6))") xc_tmp(ixc^s,idim)*normconv(0)
529 end do
530 end do
531 do iw=1,nw+nwauxio
532 do iigrid=1,igridstail; igrid=igrids(iigrid);
533 if (node(plevel_,igrid)/=level) cycle
534 block=>ps(igrid)
535 call calc_x(igrid,xc,xcc)
536 call calc_grid(qunit,igrid,xc,xcc,xc_tmp,xcc_tmp,wc_tmp,wcc_tmp,normconv,&
537 ixc^l,ixcc^l,.true.)
538 write(qunit,fmt="(100(e14.6))") wcc_tmp(ixcc^s,iw)*normconv(iw)
539 enddo
540 enddo
541 case default
542 call mpistop('no such tecplot type')
543 end select
544 igonlevel=0
545 do iigrid=1,igridstail; igrid=igrids(iigrid);
546 if (node(plevel_,igrid)/=level) cycle
547 block=>ps(igrid)
548 igonlevel=igonlevel+1
549 call save_conntec(qunit,igrid,igonlevel)
550 end do
551 end do
552 {^ifoned endif}
553
554 close(qunit)
555
556 end subroutine tecplot
557
558 subroutine save_conntec(qunit,igrid,igonlevel)
559
560 ! this saves the basic line, quad and brick connectivity,
561 ! as used by TECPLOT file outputs for unstructured grid
563
564 integer, intent(in) :: qunit, igrid, igonlevel
565
566 integer :: nx^D, nxC^D, ix^D
567
568 nx^d=ixmhi^d-ixmlo^d+1;
569 nxc^d=nx^d+1;
570
571 ! connectivity list
572 {do ix^db=1,nx^db\}
573 {^ifthreed
574 ! basic brick connectivity
575 write(qunit,'(8(i7,1x))') &
576 nodenumbertec3d(ix1, ix2-1,ix3-1,nxc1,nxc2,nxc3,igonlevel,igrid),&
577 nodenumbertec3d(ix1+1,ix2-1,ix3-1,nxc1,nxc2,nxc3,igonlevel,igrid),&
578 nodenumbertec3d(ix1+1,ix2 ,ix3-1,nxc1,nxc2,nxc3,igonlevel,igrid),&
579 nodenumbertec3d(ix1 ,ix2 ,ix3-1,nxc1,nxc2,nxc3,igonlevel,igrid),&
580 nodenumbertec3d(ix1 ,ix2-1,ix3 ,nxc1,nxc2,nxc3,igonlevel,igrid),&
581 nodenumbertec3d(ix1+1,ix2-1,ix3 ,nxc1,nxc2,nxc3,igonlevel,igrid),&
582 nodenumbertec3d(ix1+1,ix2 ,ix3 ,nxc1,nxc2,nxc3,igonlevel,igrid),&
583 nodenumbertec3d(ix1 ,ix2 ,ix3 ,nxc1,nxc2,nxc3,igonlevel,igrid)
584 }
585 {^iftwod
586 ! basic quadrilateral connectivity
587 write(qunit,'(4(i7,1x))') &
588 nodenumbertec2d(ix1, ix2-1,nxc1,nxc2,igonlevel,igrid),&
589 nodenumbertec2d(ix1+1,ix2-1,nxc1,nxc2,igonlevel,igrid),&
590 nodenumbertec2d(ix1+1,ix2 ,nxc1,nxc2,igonlevel,igrid),&
591 nodenumbertec2d(ix1 ,ix2 ,nxc1,nxc2,igonlevel,igrid)
592 }
593 {^ifoned
594 ! basic line connectivity
595 write(qunit,'(2(i7,1x))') nodenumbertec1d(ix1,nxc1,igonlevel,igrid),&
596 nodenumbertec1d(ix1+1,nxc1,igonlevel,igrid)
597 }
598 {end do\}
599
600 end subroutine save_conntec
601
602 integer function nodenumbertec1d(i1,nx1,ig,igrid)
603 use mod_comm_lib, only: mpistop
604 integer, intent(in):: i1,nx1,ig,igrid
605
606 nodenumbertec1d=i1+(ig-1)*nx1
607 if(nodenumbertec1d>9999999)call mpistop("too large nodenumber")
608
609 end function nodenumbertec1d
610
611 integer function nodenumbertec2d(i1,i2,nx1,nx2,ig,igrid)
612
613 integer, intent(in):: i1,i2,nx1,nx2,ig,igrid
614
615 nodenumbertec2d=i1+i2*nx1+(ig-1)*nx1*nx2
616 if(nodenumbertec2d>9999999)call mpistop("too large nodenumber")
617
618 end function nodenumbertec2d
619
620 integer function nodenumbertec3d(i1,i2,i3,nx1,nx2,nx3,ig,igrid)
621
622 integer, intent(in):: i1,i2,i3,nx1,nx2,nx3,ig,igrid
623
624 nodenumbertec3d=i1+i2*nx1+i3*nx1*nx2+(ig-1)*nx1*nx2*nx3
625 if(nodenumbertec3d>9999999)call mpistop("too large nodenumber")
626
627 end function nodenumbertec3d
628
629 subroutine unstructuredvtk(qunit)
630
631 ! output for vtu format to paraview
632 ! not parallel, uses calc_grid to compute nwauxio variables
633 ! allows renormalizing using convert factors
636
637 integer, intent(in) :: qunit
638
639 double precision :: x_VTK(1:3)
640 double precision, dimension(ixMlo^D-1:ixMhi^D,ndim) :: xC_TMP
641 double precision, dimension(ixMlo^D:ixMhi^D,ndim) :: xCC_TMP
642 double precision, dimension(ixMlo^D-1:ixMhi^D,ndim) :: xC
643 double precision, dimension(ixMlo^D:ixMhi^D,ndim) :: xCC
644 double precision, dimension(ixMlo^D-1:ixMhi^D,nw+nwauxio) :: wC_TMP
645 double precision, dimension(ixMlo^D:ixMhi^D,nw+nwauxio) :: wCC_TMP
646 double precision, dimension(0:nw+nwauxio) :: normconv
647 integer:: igrid,iigrid,level,igonlevel,icel,ixC^L,ixCC^L,iw
648 integer:: NumGridsOnLevel(1:nlevelshi)
649 integer :: nx^D,nxC^D,nodesonlevel,elemsonlevel,nc,np,VTK_type,ix^D
650 integer :: filenr
651 character(len=80):: filename
652 character(len=name_len) :: wnamei(1:nw+nwauxio),xandwnamei(1:ndim+nw+nwauxio)
653 character(len=1024) :: outfilehead
654 logical :: fileopen
655
656 if(npe>1)then
657 if(mype==0) print *,'unstructuredvtk not parallel, use vtumpi'
658 call mpistop('npe>1, unstructuredvtk')
659 end if
660
661 inquire(qunit,opened=fileopen)
662 if(.not.fileopen)then
663 ! generate filename
664 filenr=snapshotini
665 if (autoconvert) filenr=snapshotnext
666 write(filename,'(a,i4.4,a)') trim(base_filename),filenr,".vtu"
667 ! Open the file for the header part
668 open(qunit,file=filename,status='unknown')
669 end if
670
671 call getheadernames(wnamei,xandwnamei,outfilehead)
672
673 ! generate xml header
674 write(qunit,'(a)')'<?xml version="1.0"?>'
675 write(qunit,'(a)',advance='no') '<VTKFile type="UnstructuredGrid"'
676 write(qunit,'(a)')' version="0.1" byte_order="LittleEndian">'
677 write(qunit,'(a)')'<UnstructuredGrid>'
678 write(qunit,'(a)')'<FieldData>'
679 write(qunit,'(2a)')'<DataArray type="Float32" Name="TIME" ',&
680 'NumberOfTuples="1" format="ascii">'
681 write(qunit,*) dble(dble(global_time)*time_convert_factor)
682 write(qunit,'(a)')'</DataArray>'
683 write(qunit,'(a)')'</FieldData>'
684
685 ! number of cells, number of corner points, per grid.
686 nx^d=ixmhi^d-ixmlo^d+1;
687 nxc^d=nx^d+1;
688 nc={nx^d*}
689 np={nxc^d*}
690
691 ! Note: using the w_write, writelevel, writespshift
692 ! we can clip parts of the grid away, select variables, levels etc.
693 do level=levmin,levmax
694 if (writelevel(level)) then
695 do iigrid=1,igridstail; igrid=igrids(iigrid);
696 if (node(plevel_,igrid)/=level) cycle
697 block=>ps(igrid)
698 ! only output a grid when fully within clipped region selected
699 ! by writespshift array
700 if(({rnode(rpxmin^d_,igrid)>=xprobmin^d+(xprobmax^d-xprobmin^d)&
701 *writespshift(^d,1)|.and.}).and.({rnode(rpxmax^d_,igrid)&
702 <=xprobmax^d-(xprobmax^d-xprobmin^d)*writespshift(^d,2)|.and.})) then
703 call calc_x(igrid,xc,xcc)
704 call calc_grid(qunit,igrid,xc,xcc,xc_tmp,xcc_tmp,wc_tmp,wcc_tmp,normconv,&
705 ixc^l,ixcc^l,.true.)
706 select case(convert_type)
707 case('vtu')
708 ! we write out every grid as one VTK PIECE
709 write(qunit,'(a,i7,a,i7,a)') &
710 '<Piece NumberOfPoints="',np,'" NumberOfCells="',nc,'">'
711 write(qunit,'(a)')'<PointData>'
712 do iw=1,nw+nwauxio
713 if(iw<=nw) then
714 if(.not.w_write(iw)) cycle
715 end if
716 write(qunit,'(a,a,a)')&
717 '<DataArray type="Float64" Name="',trim(wnamei(iw)),'" format="ascii">'
718 write(qunit,'(200(1pe14.6))') {(|}wc_tmp(ix^d,iw)*normconv(iw),{ix^d=ixcmin^d,ixcmax^d)}
719 write(qunit,'(a)')'</DataArray>'
720 end do
721 write(qunit,'(a)')'</PointData>'
722 write(qunit,'(a)')'<Points>'
723 write(qunit,'(a)')'<DataArray type="Float32" NumberOfComponents="3" format="ascii">'
724 ! write cell corner coordinates in a backward dimensional loop, always 3D output
725 {do ix^db=ixcmin^db,ixcmax^db \}
726 x_vtk(1:3)=zero;
727 x_vtk(1:ndim)=xc_tmp(ix^d,1:ndim)*normconv(0);
728 write(qunit,'(3(1pe14.6))') x_vtk
729 {end do \}
730 write(qunit,'(a)')'</DataArray>'
731 write(qunit,'(a)')'</Points>'
732 case('vtuCC')
733 ! we write out every grid as one VTK PIECE
734 write(qunit,'(a,i7,a,i7,a)') &
735 '<Piece NumberOfPoints="',np,'" NumberOfCells="',nc,'">'
736 write(qunit,'(a)')'<CellData>'
737 do iw=1,nw+nwauxio
738 if(iw<=nw) then
739 if(.not.w_write(iw)) cycle
740 end if
741 write(qunit,'(a,a,a)')&
742 '<DataArray type="Float64" Name="',trim(wnamei(iw)),'" format="ascii">'
743 write(qunit,'(200(1pe14.6))') {(|}wcc_tmp(ix^d,iw)*normconv(iw),{ix^d=ixccmin^d,ixccmax^d)}
744 write(qunit,'(a)')'</DataArray>'
745 end do
746 write(qunit,'(a)')'</CellData>'
747 write(qunit,'(a)')'<Points>'
748 write(qunit,'(a)')'<DataArray type="Float32" NumberOfComponents="3" format="ascii">'
749 ! write cell corner coordinates in a backward dimensional loop, always 3D output
750 {do ix^db=ixcmin^db,ixcmax^db \}
751 x_vtk(1:3)=zero;
752 x_vtk(1:ndim)=xc_tmp(ix^d,1:ndim)*normconv(0);
753 write(qunit,'(3(1pe14.6))') x_vtk
754 {end do \}
755 write(qunit,'(a)')'</DataArray>'
756 write(qunit,'(a)')'</Points>'
757 end select
758
759 write(qunit,'(a)')'<Cells>'
760 ! connectivity part
761 write(qunit,'(a)')'<DataArray type="Int32" Name="connectivity" format="ascii">'
762 call save_connvtk(qunit,igrid)
763 write(qunit,'(a)')'</DataArray>'
764
765 ! offsets data array
766 write(qunit,'(a)')'<DataArray type="Int32" Name="offsets" format="ascii">'
767 do icel=1,nc
768 write(qunit,'(i7)') icel*(2**^nd)
769 end do
770 write(qunit,'(a)')'</DataArray>'
771
772 ! VTK cell type data array
773 write(qunit,'(a)')'<DataArray type="Int32" Name="types" format="ascii">'
774 ! VTK_LINE=3; VTK_PIXEL=8; VTK_VOXEL=11 -> vtk-syntax
775 {^ifoned vtk_type=3 \}
776 {^iftwod vtk_type=8 \}
777 {^ifthreed vtk_type=11 \}
778 do icel=1,nc
779 write(qunit,'(i2)') vtk_type
780 end do
781 write(qunit,'(a)')'</DataArray>'
782
783 write(qunit,'(a)')'</Cells>'
784
785 write(qunit,'(a)')'</Piece>'
786 end if
787 end do
788 end if
789 end do
790
791 write(qunit,'(a)')'</UnstructuredGrid>'
792 write(qunit,'(a)')'</VTKFile>'
793 close(qunit)
794
795 end subroutine unstructuredvtk
796
797 subroutine unstructuredvtkb(qunit)
798
799 ! output for vtu format to paraview, binary version output
800 ! not parallel, uses calc_grid to compute nwauxio variables
801 ! allows renormalizing using convert factors
805
806 integer, intent(in) :: qunit
807
808 double precision :: x_VTK(1:3)
809 double precision, dimension(ixMlo^D-1:ixMhi^D,ndim) :: xC_TMP
810 double precision, dimension(ixMlo^D:ixMhi^D,ndim) :: xCC_TMP
811 double precision, dimension(ixMlo^D-1:ixMhi^D,ndim) :: xC
812 double precision, dimension(ixMlo^D:ixMhi^D,ndim) :: xCC
813 double precision, dimension(ixMlo^D-1:ixMhi^D,nw+nwauxio):: wC_TMP
814 double precision, dimension(ixMlo^D:ixMhi^D,nw+nwauxio) :: wCC_TMP
815 double precision :: normconv(0:nw+nwauxio)
816 integer, allocatable :: intstatus(:,:)
817 integer*8 :: offset
818 integer :: itag,ipe,igrid,level,icel,ixC^L,ixCC^L,Morton_no,Morton_length
819 integer :: nx^D,nxC^D,nc,np,VTK_type,ix^D,filenr
820 integer:: k,iw
821 integer:: length,lengthcc,length_coords,length_conn,length_offsets
822 character:: buf
823 character(len=80):: filename
824 character(len=name_len) :: wnamei(1:nw+nwauxio),xandwnamei(1:ndim+nw+nwauxio)
825 character(len=1024) :: outfilehead
826 logical :: fileopen,cell_corner=.false.
827 logical, allocatable :: Morton_aim(:),Morton_aim_p(:)
828
829 normconv=one
830 morton_length=morton_stop(npe-1)-morton_start(0)+1
831 allocate(morton_aim(morton_start(0):morton_stop(npe-1)))
832 allocate(morton_aim_p(morton_start(0):morton_stop(npe-1)))
833 morton_aim=.false.
834 morton_aim_p=.false.
835 do morton_no=morton_start(mype),morton_stop(mype)
836 igrid=sfc_to_igrid(morton_no)
837 level=node(plevel_,igrid)
838 ! we can clip parts of the grid away, select variables, levels etc.
839 if(writelevel(level)) then
840 ! only output a grid when fully within clipped region selected
841 ! by writespshift array
842 if(({rnode(rpxmin^d_,igrid)>=xprobmin^d+(xprobmax^d-xprobmin^d)&
843 *writespshift(^d,1)|.and.}).and.({rnode(rpxmax^d_,igrid)&
844 <=xprobmax^d-(xprobmax^d-xprobmin^d)*writespshift(^d,2)|.and.})) then
845 morton_aim_p(morton_no)=.true.
846 end if
847 end if
848 end do
849 call mpi_allreduce(morton_aim_p,morton_aim,morton_length,mpi_logical,mpi_lor,&
851 select case(convert_type)
852 case('vtuB','vtuBmpi')
853 cell_corner=.true.
854 case('vtuBCC','vtuBCCmpi')
855 cell_corner=.false.
856 end select
857 if (mype /= 0) then
858 do morton_no=morton_start(mype),morton_stop(mype)
859 if(.not. morton_aim(morton_no)) cycle
860 igrid=sfc_to_igrid(morton_no)
861 call calc_x(igrid,xc,xcc)
862 call calc_grid(qunit,igrid,xc,xcc,xc_tmp,xcc_tmp,wc_tmp,wcc_tmp,normconv,&
863 ixc^l,ixcc^l,.true.)
864 itag=morton_no
865 call mpi_send(xc_tmp,1,type_block_xc_io, 0,itag,icomm,ierrmpi)
866 if(cell_corner) then
867 call mpi_send(wc_tmp,1,type_block_wc_io, 0,itag,icomm,ierrmpi)
868 else
869 call mpi_send(wcc_tmp,1,type_block_wcc_io, 0,itag,icomm,ierrmpi)
870 end if
871 end do
872
873 else
874 ! mype==0
875 offset=0
876 inquire(qunit,opened=fileopen)
877 if(.not.fileopen)then
878 ! generate filename
879 filenr=snapshotini
880 if (autoconvert) filenr=snapshotnext
881 write(filename,'(a,i4.4,a)') trim(base_filename),filenr,".vtu"
882 ! Open the file for the header part
883 open(qunit,file=filename,status='replace')
884 end if
885 call getheadernames(wnamei,xandwnamei,outfilehead)
886 ! generate xml header
887 write(qunit,'(a)')'<?xml version="1.0"?>'
888 write(qunit,'(a)',advance='no') '<VTKFile type="UnstructuredGrid"'
889 write(qunit,'(a)')' version="0.1" byte_order="LittleEndian">'
890 write(qunit,'(a)')'<UnstructuredGrid>'
891 write(qunit,'(a)')'<FieldData>'
892 write(qunit,'(2a)')'<DataArray type="Float32" Name="TIME" ',&
893 'NumberOfTuples="1" format="ascii">'
894 write(qunit,*) real(global_time*time_convert_factor)
895 write(qunit,'(a)')'</DataArray>'
896 write(qunit,'(a)')'</FieldData>'
897
898 ! number of cells, number of corner points, per grid.
899 nx^d=ixmhi^d-ixmlo^d+1;
900 nxc^d=nx^d+1;
901 nc={nx^d*}
902 np={nxc^d*}
903 length=np*size_real
904 lengthcc=nc*size_real
905 length_coords=3*length
906 length_conn=2**^nd*size_int*nc
907 length_offsets=nc*size_int
908
909 ! Note: using the w_write, writelevel, writespshift
910 do morton_no=morton_start(0),morton_stop(0)
911 if(.not. morton_aim(morton_no)) cycle
912 if(cell_corner) then
913 ! we write out every grid as one VTK PIECE
914 write(qunit,'(a,i7,a,i7,a)') &
915 '<Piece NumberOfPoints="',np,'" NumberOfCells="',nc,'">'
916 write(qunit,'(a)')'<PointData>'
917 do iw=1,nw+nwauxio
918 if(iw<=nw) then
919 if(.not.w_write(iw)) cycle
920 endif
921 write(qunit,'(a,a,a,i16,a)')&
922 '<DataArray type="Float32" Name="',trim(wnamei(iw)), &
923 '" format="appended" offset="',offset,'">'
924 write(qunit,'(a)')'</DataArray>'
925 offset=offset+length+size_int
926 end do
927 write(qunit,'(a)')'</PointData>'
928 write(qunit,'(a)')'<Points>'
929 write(qunit,'(a,i16,a)') &
930 '<DataArray type="Float32" NumberOfComponents="3" format="appended" offset="',offset,'"/>'
931 ! write cell corner coordinates in a backward dimensional loop, always 3D output
932 offset=offset+length_coords+size_int
933 write(qunit,'(a)')'</Points>'
934 else
935 ! we write out every grid as one VTK PIECE
936 write(qunit,'(a,i7,a,i7,a)') &
937 '<Piece NumberOfPoints="',np,'" NumberOfCells="',nc,'">'
938 write(qunit,'(a)')'<CellData>'
939 do iw=1,nw+nwauxio
940 if(iw<=nw) then
941 if(.not.w_write(iw)) cycle
942 end if
943 write(qunit,'(a,a,a,i16,a)')&
944 '<DataArray type="Float32" Name="',trim(wnamei(iw)), &
945 '" format="appended" offset="',offset,'">'
946 write(qunit,'(a)')'</DataArray>'
947 offset=offset+lengthcc+size_int
948 end do
949 write(qunit,'(a)')'</CellData>'
950 write(qunit,'(a)')'<Points>'
951 write(qunit,'(a,i16,a)') &
952 '<DataArray type="Float32" NumberOfComponents="3" format="appended" offset="',offset,'"/>'
953 ! write cell corner coordinates in a backward dimensional loop, always 3D output
954 offset=offset+length_coords+size_int
955 write(qunit,'(a)')'</Points>'
956 end if
957 write(qunit,'(a)')'<Cells>'
958 ! connectivity part
959 write(qunit,'(a,i16,a)')&
960 '<DataArray type="Int32" Name="connectivity" format="appended" offset="',offset,'"/>'
961 offset=offset+length_conn+size_int
962 ! offsets data array
963 write(qunit,'(a,i16,a)') &
964 '<DataArray type="Int32" Name="offsets" format="appended" offset="',offset,'"/>'
965 offset=offset+length_offsets+size_int
966 ! VTK cell type data array
967 write(qunit,'(a,i16,a)') &
968 '<DataArray type="Int32" Name="types" format="appended" offset="',offset,'"/>'
969 offset=offset+size_int+nc*size_int
970 write(qunit,'(a)')'</Cells>'
971 write(qunit,'(a)')'</Piece>'
972 end do
973 ! write metadata communicated from other processors
974 if(npe>1)then
975 do ipe=1, npe-1
976 do morton_no=morton_start(ipe),morton_stop(ipe)
977 if(.not. morton_aim(morton_no)) cycle
978 if(cell_corner) then
979 ! we write out every grid as one VTK PIECE
980 write(qunit,'(a,i7,a,i7,a)') &
981 '<Piece NumberOfPoints="',np,'" NumberOfCells="',nc,'">'
982 write(qunit,'(a)')'<PointData>'
983 do iw=1,nw+nwauxio
984 if(iw<=nw) then
985 if(.not.w_write(iw)) cycle
986 end if
987 write(qunit,'(a,a,a,i16,a)')&
988 '<DataArray type="Float32" Name="',trim(wnamei(iw)), &
989 '" format="appended" offset="',offset,'">'
990 write(qunit,'(a)')'</DataArray>'
991 offset=offset+length+size_int
992 end do
993 write(qunit,'(a)')'</PointData>'
994 write(qunit,'(a)')'<Points>'
995 write(qunit,'(a,i16,a)') &
996 '<DataArray type="Float32" NumberOfComponents="3" format="appended" offset="',offset,'"/>'
997 ! write cell corner coordinates in a backward dimensional loop, always 3D output
998 offset=offset+length_coords+size_int
999 write(qunit,'(a)')'</Points>'
1000 else
1001 ! we write out every grid as one VTK PIECE
1002 write(qunit,'(a,i7,a,i7,a)') &
1003 '<Piece NumberOfPoints="',np,'" NumberOfCells="',nc,'">'
1004 write(qunit,'(a)')'<CellData>'
1005 do iw=1,nw+nwauxio
1006 if(iw<=nw) then
1007 if(.not.w_write(iw)) cycle
1008 end if
1009 write(qunit,'(a,a,a,i16,a)')&
1010 '<DataArray type="Float32" Name="',trim(wnamei(iw)), &
1011 '" format="appended" offset="',offset,'">'
1012 write(qunit,'(a)')'</DataArray>'
1013 offset=offset+lengthcc+size_int
1014 end do
1015 write(qunit,'(a)')'</CellData>'
1016 write(qunit,'(a)')'<Points>'
1017 write(qunit,'(a,i16,a)') &
1018 '<DataArray type="Float32" NumberOfComponents="3" format="appended" offset="',offset,'"/>'
1019 ! write cell corner coordinates in a backward dimensional loop, always 3D output
1020 offset=offset+length_coords+size_int
1021 write(qunit,'(a)')'</Points>'
1022 end if
1023 write(qunit,'(a)')'<Cells>'
1024 ! connectivity part
1025 write(qunit,'(a,i16,a)')&
1026 '<DataArray type="Int32" Name="connectivity" format="appended" offset="',offset,'"/>'
1027 offset=offset+length_conn+size_int
1028 ! offsets data array
1029 write(qunit,'(a,i16,a)') &
1030 '<DataArray type="Int32" Name="offsets" format="appended" offset="',offset,'"/>'
1031 offset=offset+length_offsets+size_int
1032 ! VTK cell type data array
1033 write(qunit,'(a,i16,a)') &
1034 '<DataArray type="Int32" Name="types" format="appended" offset="',offset,'"/>'
1035 offset=offset+size_int+nc*size_int
1036 write(qunit,'(a)')'</Cells>'
1037 write(qunit,'(a)')'</Piece>'
1038 end do
1039 end do
1040 end if
1041
1042 write(qunit,'(a)')'</UnstructuredGrid>'
1043 write(qunit,'(a)')'<AppendedData encoding="raw">'
1044 close(qunit)
1045 open(qunit,file=filename,access='stream',form='unformatted',position='append')
1046 buf='_'
1047 write(qunit) trim(buf)
1048
1049 do morton_no=morton_start(0),morton_stop(0)
1050 if(.not. morton_aim(morton_no)) cycle
1051 igrid=sfc_to_igrid(morton_no)
1052 call calc_x(igrid,xc,xcc)
1053 call calc_grid(qunit,igrid,xc,xcc,xc_tmp,xcc_tmp,wc_tmp,wcc_tmp,normconv,&
1054 ixc^l,ixcc^l,.true.)
1055 do iw=1,nw+nwauxio
1056 if(iw<=nw) then
1057 if(.not.w_write(iw)) cycle
1058 end if
1059 if(cell_corner) then
1060 write(qunit) length
1061 write(qunit) {(|}real(wc_tmp(ix^d,iw)*normconv(iw)),{ix^d=ixcmin^d,ixcmax^d)}
1062 else
1063 write(qunit) lengthcc
1064 write(qunit) {(|}real(wcc_tmp(ix^d,iw)*normconv(iw)),{ix^d=ixccmin^d,ixccmax^d)}
1065 end if
1066 end do
1067
1068 write(qunit) length_coords
1069 {do ix^db=ixcmin^db,ixcmax^db \}
1070 x_vtk(1:3)=zero;
1071 x_vtk(1:ndim)=xc_tmp(ix^d,1:ndim)*normconv(0);
1072 do k=1,3
1073 write(qunit) real(x_vtk(k))
1074 end do
1075 {end do \}
1076
1077 write(qunit) length_conn
1078 {do ix^db=1,nx^db\}
1079 {^ifoned write(qunit)ix1-1,ix1 \}
1080 {^iftwod
1081 write(qunit)(ix2-1)*nxc1+ix1-1, &
1082 (ix2-1)*nxc1+ix1,ix2*nxc1+ix1-1,ix2*nxc1+ix1
1083 \}
1084 {^ifthreed
1085 write(qunit)&
1086 (ix3-1)*nxc2*nxc1+(ix2-1)*nxc1+ix1-1, &
1087 (ix3-1)*nxc2*nxc1+(ix2-1)*nxc1+ix1,&
1088 (ix3-1)*nxc2*nxc1+ ix2*nxc1+ix1-1,&
1089 (ix3-1)*nxc2*nxc1+ ix2*nxc1+ix1,&
1090 ix3*nxc2*nxc1+(ix2-1)*nxc1+ix1-1,&
1091 ix3*nxc2*nxc1+(ix2-1)*nxc1+ix1,&
1092 ix3*nxc2*nxc1+ ix2*nxc1+ix1-1,&
1093 ix3*nxc2*nxc1+ ix2*nxc1+ix1
1094 \}
1095 {end do\}
1096
1097 write(qunit) length_offsets
1098 do icel=1,nc
1099 write(qunit) icel*(2**^nd)
1100 end do
1101
1102 {^ifoned vtk_type=3 \}
1103 {^iftwod vtk_type=8 \}
1104 {^ifthreed vtk_type=11 \}
1105 write(qunit) size_int*nc
1106 do icel=1,nc
1107 write(qunit) vtk_type
1108 end do
1109 end do
1110 allocate(intstatus(mpi_status_size,1))
1111 if(npe>1)then
1112 ixccmin^d=ixmlo^d; ixccmax^d=ixmhi^d;
1113 ixcmin^d=ixmlo^d-1; ixcmax^d=ixmhi^d;
1114 do ipe=1, npe-1
1115 do morton_no=morton_start(ipe),morton_stop(ipe)
1116 if(.not. morton_aim(morton_no)) cycle
1117 itag=morton_no
1118 call mpi_recv(xc_tmp,1,type_block_xc_io, ipe,itag,icomm,intstatus(:,1),ierrmpi)
1119 if(cell_corner) then
1120 call mpi_recv(wc_tmp,1,type_block_wc_io, ipe,itag,icomm,intstatus(:,1),ierrmpi)
1121 else
1122 call mpi_recv(wcc_tmp,1,type_block_wcc_io, ipe,itag,icomm,intstatus(:,1),ierrmpi)
1123 end if
1124 do iw=1,nw+nwauxio
1125 if(iw<=nw) then
1126 if(.not.w_write(iw)) cycle
1127 end if
1128 if(cell_corner) then
1129 write(qunit) length
1130 write(qunit) {(|}real(wc_tmp(ix^d,iw)*normconv(iw)),{ix^d=ixcmin^d,ixcmax^d)}
1131 else
1132 write(qunit) lengthcc
1133 write(qunit) {(|}real(wcc_tmp(ix^d,iw)*normconv(iw)),{ix^d=ixccmin^d,ixccmax^d)}
1134 end if
1135 end do
1136 write(qunit) length_coords
1137 {do ix^db=ixcmin^db,ixcmax^db \}
1138 x_vtk(1:3)=zero;
1139 x_vtk(1:ndim)=xc_tmp(ix^d,1:ndim)*normconv(0);
1140 do k=1,3
1141 write(qunit) real(x_vtk(k))
1142 end do
1143 {end do \}
1144 write(qunit) length_conn
1145 {do ix^db=1,nx^db\}
1146 {^ifoned write(qunit)ix1-1,ix1 \}
1147 {^iftwod
1148 write(qunit)(ix2-1)*nxc1+ix1-1, &
1149 (ix2-1)*nxc1+ix1,ix2*nxc1+ix1-1,ix2*nxc1+ix1
1150 \}
1151 {^ifthreed
1152 write(qunit)&
1153 (ix3-1)*nxc2*nxc1+(ix2-1)*nxc1+ix1-1, &
1154 (ix3-1)*nxc2*nxc1+(ix2-1)*nxc1+ix1,&
1155 (ix3-1)*nxc2*nxc1+ ix2*nxc1+ix1-1,&
1156 (ix3-1)*nxc2*nxc1+ ix2*nxc1+ix1,&
1157 ix3*nxc2*nxc1+(ix2-1)*nxc1+ix1-1,&
1158 ix3*nxc2*nxc1+(ix2-1)*nxc1+ix1,&
1159 ix3*nxc2*nxc1+ ix2*nxc1+ix1-1,&
1160 ix3*nxc2*nxc1+ ix2*nxc1+ix1
1161 \}
1162 {end do\}
1163 write(qunit) length_offsets
1164 do icel=1,nc
1165 write(qunit) icel*(2**^nd)
1166 end do
1167 {^ifoned vtk_type=3 \}
1168 {^iftwod vtk_type=8 \}
1169 {^ifthreed vtk_type=11 \}
1170 write(qunit) size_int*nc
1171 do icel=1,nc
1172 write(qunit) vtk_type
1173 end do
1174 end do
1175 end do
1176 end if
1177 close(qunit)
1178 open(qunit,file=filename,status='unknown',form='formatted',position='append')
1179 write(qunit,'(a)')'</AppendedData>'
1180 write(qunit,'(a)')'</VTKFile>'
1181 close(qunit)
1182 deallocate(intstatus)
1183 end if
1184
1185 deallocate(morton_aim,morton_aim_p)
1186 if (npe>1) then
1187 call mpi_barrier(icomm,ierrmpi)
1188 end if
1189
1190 end subroutine unstructuredvtkb
1191
1192 subroutine unstructuredvtkb64(qunit)
1193 ! output for vtu format to paraview, binary version output
1194 ! not parallel, uses calc_grid to compute nwauxio variables
1195 ! allows renormalizing using convert factors
1199
1200 integer, intent(in) :: qunit
1201
1202 double precision :: x_VTK(1:3)
1203 double precision, dimension(ixMlo^D-1:ixMhi^D,ndim) :: xC_TMP
1204 double precision, dimension(ixMlo^D:ixMhi^D,ndim) :: xCC_TMP
1205 double precision, dimension(ixMlo^D-1:ixMhi^D,ndim) :: xC
1206 double precision, dimension(ixMlo^D:ixMhi^D,ndim) :: xCC
1207 double precision, dimension(ixMlo^D-1:ixMhi^D,nw+nwauxio):: wC_TMP
1208 double precision, dimension(ixMlo^D:ixMhi^D,nw+nwauxio) :: wCC_TMP
1209 double precision :: normconv(0:nw+nwauxio)
1210 integer, allocatable :: intstatus(:,:)
1211 integer*8 :: offset
1212 integer :: itag,ipe,igrid,level,icel,ixC^L,ixCC^L,Morton_no,Morton_length
1213 integer :: nx^D,nxC^D,nc,np,VTK_type,ix^D,filenr
1214 integer:: k,iw
1215 integer:: length,lengthcc,length_coords,length_conn,length_offsets
1216 character:: buf
1217 character(len=80):: filename
1218 character(len=name_len) :: wnamei(1:nw+nwauxio),xandwnamei(1:ndim+nw+nwauxio)
1219 character(len=1024) :: outfilehead
1220 logical :: fileopen,cell_corner=.false.
1221 logical, allocatable :: Morton_aim(:),Morton_aim_p(:)
1222
1223 normconv=one
1224 morton_length=morton_stop(npe-1)-morton_start(0)+1
1225 allocate(morton_aim(morton_start(0):morton_stop(npe-1)))
1226 allocate(morton_aim_p(morton_start(0):morton_stop(npe-1)))
1227 morton_aim=.false.
1228 morton_aim_p=.false.
1229 do morton_no=morton_start(mype),morton_stop(mype)
1230 igrid=sfc_to_igrid(morton_no)
1231 level=node(plevel_,igrid)
1232 ! we can clip parts of the grid away, select variables, levels etc.
1233 if(writelevel(level)) then
1234 ! only output a grid when fully within clipped region selected
1235 ! by writespshift array
1236 if(({rnode(rpxmin^d_,igrid)>=xprobmin^d+(xprobmax^d-xprobmin^d)&
1237 *writespshift(^d,1)|.and.}).and.({rnode(rpxmax^d_,igrid)&
1238 <=xprobmax^d-(xprobmax^d-xprobmin^d)*writespshift(^d,2)|.and.})) then
1239 morton_aim_p(morton_no)=.true.
1240 end if
1241 end if
1242 end do
1243 call mpi_allreduce(morton_aim_p,morton_aim,morton_length,mpi_logical,mpi_lor,&
1244 icomm,ierrmpi)
1245 select case(convert_type)
1246 case('vtuB64','vtuBmpi64')
1247 cell_corner=.true.
1248 case('vtuBCC64','vtuBCCmpi64')
1249 cell_corner=.false.
1250 end select
1251 if (mype /= 0) then
1252 do morton_no=morton_start(mype),morton_stop(mype)
1253 if(.not. morton_aim(morton_no)) cycle
1254 igrid=sfc_to_igrid(morton_no)
1255 call calc_x(igrid,xc,xcc)
1256 call calc_grid(qunit,igrid,xc,xcc,xc_tmp,xcc_tmp,wc_tmp,wcc_tmp,normconv,&
1257 ixc^l,ixcc^l,.true.)
1258 itag=morton_no
1259 call mpi_send(xc_tmp,1,type_block_xc_io, 0,itag,icomm,ierrmpi)
1260 if(cell_corner) then
1261 call mpi_send(wc_tmp,1,type_block_wc_io, 0,itag,icomm,ierrmpi)
1262 else
1263 call mpi_send(wcc_tmp,1,type_block_wcc_io, 0,itag,icomm,ierrmpi)
1264 end if
1265 end do
1266 else
1267 ! mype==0
1268 offset=0
1269 inquire(qunit,opened=fileopen)
1270 if(.not.fileopen)then
1271 ! generate filename
1272 filenr=snapshotini
1273 if (autoconvert) filenr=snapshotnext
1274 write(filename,'(a,i4.4,a)') trim(base_filename),filenr,".vtu"
1275 ! Open the file for the header part
1276 open(qunit,file=filename,status='replace')
1277 end if
1278 call getheadernames(wnamei,xandwnamei,outfilehead)
1279 ! generate xml header
1280 write(qunit,'(a)')'<?xml version="1.0"?>'
1281 write(qunit,'(a)',advance='no') '<VTKFile type="UnstructuredGrid"'
1282 write(qunit,'(a)')' version="0.1" byte_order="LittleEndian">'
1283 write(qunit,'(a)')'<UnstructuredGrid>'
1284 write(qunit,'(a)')'<FieldData>'
1285 write(qunit,'(2a)')'<DataArray type="Float32" Name="TIME" ',&
1286 'NumberOfTuples="1" format="ascii">'
1287 write(qunit,*) real(global_time*time_convert_factor)
1288 write(qunit,'(a)')'</DataArray>'
1289 write(qunit,'(a)')'</FieldData>'
1290 ! number of cells, number of corner points, per grid.
1291 nx^d=ixmhi^d-ixmlo^d+1;
1292 nxc^d=nx^d+1;
1293 nc={nx^d*}
1294 np={nxc^d*}
1295 length=np*size_double
1296 lengthcc=nc*size_double
1297 length_coords=3*length
1298 length_conn=2**^nd*size_int*nc
1299 length_offsets=nc*size_int
1300 ! Note: using the w_write, writelevel, writespshift
1301 do morton_no=morton_start(0),morton_stop(0)
1302 if(.not. morton_aim(morton_no)) cycle
1303 if(cell_corner) then
1304 ! we write out every grid as one VTK PIECE
1305 write(qunit,'(a,i7,a,i7,a)') &
1306 '<Piece NumberOfPoints="',np,'" NumberOfCells="',nc,'">'
1307 write(qunit,'(a)')'<PointData>'
1308 do iw=1,nw+nwauxio
1309 if(iw<=nw) then
1310 if(.not.w_write(iw)) cycle
1311 end if
1312 write(qunit,'(a,a,a,i16,a)')&
1313 '<DataArray type="Float64" Name="',trim(wnamei(iw)), &
1314 '" format="appended" offset="',offset,'">'
1315 write(qunit,'(a)')'</DataArray>'
1316 offset=offset+length+size_int
1317 end do
1318 write(qunit,'(a)')'</PointData>'
1319 write(qunit,'(a)')'<Points>'
1320 write(qunit,'(a,i16,a)') &
1321 '<DataArray type="Float64" NumberOfComponents="3" format="appended" offset="',offset,'"/>'
1322 ! write cell corner coordinates in a backward dimensional loop, always 3D output
1323 offset=offset+length_coords+size_int
1324 write(qunit,'(a)')'</Points>'
1325 else
1326 ! we write out every grid as one VTK PIECE
1327 write(qunit,'(a,i7,a,i7,a)') &
1328 '<Piece NumberOfPoints="',np,'" NumberOfCells="',nc,'">'
1329 write(qunit,'(a)')'<CellData>'
1330 do iw=1,nw+nwauxio
1331 if(iw<=nw) then
1332 if(.not.w_write(iw)) cycle
1333 end if
1334 write(qunit,'(a,a,a,i16,a)')&
1335 '<DataArray type="Float64" Name="',trim(wnamei(iw)), &
1336 '" format="appended" offset="',offset,'">'
1337 write(qunit,'(a)')'</DataArray>'
1338 offset=offset+lengthcc+size_int
1339 end do
1340 write(qunit,'(a)')'</CellData>'
1341 write(qunit,'(a)')'<Points>'
1342 write(qunit,'(a,i16,a)') &
1343 '<DataArray type="Float64" NumberOfComponents="3" format="appended" offset="',offset,'"/>'
1344 ! write cell corner coordinates in a backward dimensional loop, always 3D output
1345 offset=offset+length_coords+size_int
1346 write(qunit,'(a)')'</Points>'
1347 end if
1348 write(qunit,'(a)')'<Cells>'
1349 ! connectivity part
1350 write(qunit,'(a,i16,a)')&
1351 '<DataArray type="Int32" Name="connectivity" format="appended" offset="',offset,'"/>'
1352 offset=offset+length_conn+size_int
1353 ! offsets data array
1354 write(qunit,'(a,i16,a)') &
1355 '<DataArray type="Int32" Name="offsets" format="appended" offset="',offset,'"/>'
1356 offset=offset+length_offsets+size_int
1357 ! VTK cell type data array
1358 write(qunit,'(a,i16,a)') &
1359 '<DataArray type="Int32" Name="types" format="appended" offset="',offset,'"/>'
1360 offset=offset+size_int+nc*size_int
1361 write(qunit,'(a)')'</Cells>'
1362 write(qunit,'(a)')'</Piece>'
1363 end do
1364 ! write metadata communicated from other processors
1365 if(npe>1)then
1366 do ipe=1, npe-1
1367 do morton_no=morton_start(ipe),morton_stop(ipe)
1368 if(.not. morton_aim(morton_no)) cycle
1369 if(cell_corner) then
1370 ! we write out every grid as one VTK PIECE
1371 write(qunit,'(a,i7,a,i7,a)') &
1372 '<Piece NumberOfPoints="',np,'" NumberOfCells="',nc,'">'
1373 write(qunit,'(a)')'<PointData>'
1374 do iw=1,nw+nwauxio
1375 if(iw<=nw) then
1376 if(.not.w_write(iw)) cycle
1377 end if
1378 write(qunit,'(a,a,a,i16,a)')&
1379 '<DataArray type="Float64" Name="',trim(wnamei(iw)), &
1380 '" format="appended" offset="',offset,'">'
1381 write(qunit,'(a)')'</DataArray>'
1382 offset=offset+length+size_int
1383 end do
1384 write(qunit,'(a)')'</PointData>'
1385 write(qunit,'(a)')'<Points>'
1386 write(qunit,'(a,i16,a)') &
1387 '<DataArray type="Float64" NumberOfComponents="3" format="appended" offset="',offset,'"/>'
1388 ! write cell corner coordinates in a backward dimensional loop, always 3D output
1389 offset=offset+length_coords+size_int
1390 write(qunit,'(a)')'</Points>'
1391 else
1392 ! we write out every grid as one VTK PIECE
1393 write(qunit,'(a,i7,a,i7,a)') &
1394 '<Piece NumberOfPoints="',np,'" NumberOfCells="',nc,'">'
1395 write(qunit,'(a)')'<CellData>'
1396 do iw=1,nw+nwauxio
1397 if(iw<=nw) then
1398 if(.not.w_write(iw)) cycle
1399 end if
1400 write(qunit,'(a,a,a,i16,a)')&
1401 '<DataArray type="Float64" Name="',trim(wnamei(iw)), &
1402 '" format="appended" offset="',offset,'">'
1403 write(qunit,'(a)')'</DataArray>'
1404 offset=offset+lengthcc+size_int
1405 end do
1406 write(qunit,'(a)')'</CellData>'
1407 write(qunit,'(a)')'<Points>'
1408 write(qunit,'(a,i16,a)') &
1409 '<DataArray type="Float64" NumberOfComponents="3" format="appended" offset="',offset,'"/>'
1410 ! write cell corner coordinates in a backward dimensional loop, always 3D output
1411 offset=offset+length_coords+size_int
1412 write(qunit,'(a)')'</Points>'
1413 end if
1414 write(qunit,'(a)')'<Cells>'
1415 ! connectivity part
1416 write(qunit,'(a,i16,a)')&
1417 '<DataArray type="Int32" Name="connectivity" format="appended" offset="',offset,'"/>'
1418 offset=offset+length_conn+size_int
1419 ! offsets data array
1420 write(qunit,'(a,i16,a)') &
1421 '<DataArray type="Int32" Name="offsets" format="appended" offset="',offset,'"/>'
1422 offset=offset+length_offsets+size_int
1423 ! VTK cell type data array
1424 write(qunit,'(a,i16,a)') &
1425 '<DataArray type="Int32" Name="types" format="appended" offset="',offset,'"/>'
1426 offset=offset+size_int+nc*size_int
1427 write(qunit,'(a)')'</Cells>'
1428 write(qunit,'(a)')'</Piece>'
1429 end do
1430 end do
1431 end if
1432 write(qunit,'(a)')'</UnstructuredGrid>'
1433 write(qunit,'(a)')'<AppendedData encoding="raw">'
1434 close(qunit)
1435 open(qunit,file=filename,access='stream',form='unformatted',position='append')
1436 buf='_'
1437 write(qunit) trim(buf)
1438 do morton_no=morton_start(0),morton_stop(0)
1439 if(.not. morton_aim(morton_no)) cycle
1440 igrid=sfc_to_igrid(morton_no)
1441 call calc_x(igrid,xc,xcc)
1442 call calc_grid(qunit,igrid,xc,xcc,xc_tmp,xcc_tmp,wc_tmp,wcc_tmp,normconv,&
1443 ixc^l,ixcc^l,.true.)
1444 do iw=1,nw+nwauxio
1445 if(iw<=nw) then
1446 if(.not.w_write(iw)) cycle
1447 end if
1448 if(cell_corner) then
1449 write(qunit) length
1450 write(qunit) {(|}wc_tmp(ix^d,iw)*normconv(iw),{ix^d=ixcmin^d,ixcmax^d)}
1451 else
1452 write(qunit) lengthcc
1453 write(qunit) {(|}wcc_tmp(ix^d,iw)*normconv(iw),{ix^d=ixccmin^d,ixccmax^d)}
1454 end if
1455 end do
1456 write(qunit) length_coords
1457 {do ix^db=ixcmin^db,ixcmax^db \}
1458 x_vtk(1:3)=zero;
1459 x_vtk(1:ndim)=xc_tmp(ix^d,1:ndim)*normconv(0);
1460 do k=1,3
1461 write(qunit) x_vtk(k)
1462 end do
1463 {end do \}
1464 write(qunit) length_conn
1465 {do ix^db=1,nx^db\}
1466 {^ifoned write(qunit)ix1-1,ix1 \}
1467 {^iftwod
1468 write(qunit)(ix2-1)*nxc1+ix1-1, &
1469 (ix2-1)*nxc1+ix1,ix2*nxc1+ix1-1,ix2*nxc1+ix1
1470 \}
1471 {^ifthreed
1472 write(qunit)&
1473 (ix3-1)*nxc2*nxc1+(ix2-1)*nxc1+ix1-1, &
1474 (ix3-1)*nxc2*nxc1+(ix2-1)*nxc1+ix1,&
1475 (ix3-1)*nxc2*nxc1+ ix2*nxc1+ix1-1,&
1476 (ix3-1)*nxc2*nxc1+ ix2*nxc1+ix1,&
1477 ix3*nxc2*nxc1+(ix2-1)*nxc1+ix1-1,&
1478 ix3*nxc2*nxc1+(ix2-1)*nxc1+ix1,&
1479 ix3*nxc2*nxc1+ ix2*nxc1+ix1-1,&
1480 ix3*nxc2*nxc1+ ix2*nxc1+ix1
1481 \}
1482 {end do\}
1483 write(qunit) length_offsets
1484 do icel=1,nc
1485 write(qunit) icel*(2**^nd)
1486 end do
1487 {^ifoned vtk_type=3 \}
1488 {^iftwod vtk_type=8 \}
1489 {^ifthreed vtk_type=11 \}
1490 write(qunit) size_int*nc
1491 do icel=1,nc
1492 write(qunit) vtk_type
1493 end do
1494 end do
1495 allocate(intstatus(mpi_status_size,1))
1496 if(npe>1)then
1497 ixccmin^d=ixmlo^d; ixccmax^d=ixmhi^d;
1498 ixcmin^d=ixmlo^d-1; ixcmax^d=ixmhi^d;
1499 do ipe=1, npe-1
1500 do morton_no=morton_start(ipe),morton_stop(ipe)
1501 if(.not. morton_aim(morton_no)) cycle
1502 itag=morton_no
1503 call mpi_recv(xc_tmp,1,type_block_xc_io, ipe,itag,icomm,intstatus(:,1),ierrmpi)
1504 if(cell_corner) then
1505 call mpi_recv(wc_tmp,1,type_block_wc_io, ipe,itag,icomm,intstatus(:,1),ierrmpi)
1506 else
1507 call mpi_recv(wcc_tmp,1,type_block_wcc_io, ipe,itag,icomm,intstatus(:,1),ierrmpi)
1508 end if
1509 do iw=1,nw+nwauxio
1510 if(iw<=nw) then
1511 if(.not.w_write(iw)) cycle
1512 end if
1513 if(cell_corner) then
1514 write(qunit) length
1515 write(qunit) {(|}wc_tmp(ix^d,iw)*normconv(iw),{ix^d=ixcmin^d,ixcmax^d)}
1516 else
1517 write(qunit) lengthcc
1518 write(qunit) {(|}wcc_tmp(ix^d,iw)*normconv(iw),{ix^d=ixccmin^d,ixccmax^d)}
1519 end if
1520 end do
1521 write(qunit) length_coords
1522 {do ix^db=ixcmin^db,ixcmax^db \}
1523 x_vtk(1:3)=zero;
1524 x_vtk(1:ndim)=xc_tmp(ix^d,1:ndim)*normconv(0);
1525 do k=1,3
1526 write(qunit) x_vtk(k)
1527 end do
1528 {end do \}
1529 write(qunit) length_conn
1530 {do ix^db=1,nx^db\}
1531 {^ifoned write(qunit)ix1-1,ix1 \}
1532 {^iftwod
1533 write(qunit)(ix2-1)*nxc1+ix1-1, &
1534 (ix2-1)*nxc1+ix1,ix2*nxc1+ix1-1,ix2*nxc1+ix1
1535 \}
1536 {^ifthreed
1537 write(qunit)&
1538 (ix3-1)*nxc2*nxc1+(ix2-1)*nxc1+ix1-1, &
1539 (ix3-1)*nxc2*nxc1+(ix2-1)*nxc1+ix1,&
1540 (ix3-1)*nxc2*nxc1+ ix2*nxc1+ix1-1,&
1541 (ix3-1)*nxc2*nxc1+ ix2*nxc1+ix1,&
1542 ix3*nxc2*nxc1+(ix2-1)*nxc1+ix1-1,&
1543 ix3*nxc2*nxc1+(ix2-1)*nxc1+ix1,&
1544 ix3*nxc2*nxc1+ ix2*nxc1+ix1-1,&
1545 ix3*nxc2*nxc1+ ix2*nxc1+ix1
1546 \}
1547 {end do\}
1548 write(qunit) length_offsets
1549 do icel=1,nc
1550 write(qunit) icel*(2**^nd)
1551 end do
1552 {^ifoned vtk_type=3 \}
1553 {^iftwod vtk_type=8 \}
1554 {^ifthreed vtk_type=11 \}
1555 write(qunit) size_int*nc
1556 do icel=1,nc
1557 write(qunit) vtk_type
1558 end do
1559 end do
1560 end do
1561 end if
1562 close(qunit)
1563 open(qunit,file=filename,status='unknown',form='formatted',position='append')
1564 write(qunit,'(a)')'</AppendedData>'
1565 write(qunit,'(a)')'</VTKFile>'
1566 close(qunit)
1567 deallocate(intstatus)
1568 end if
1569 deallocate(morton_aim,morton_aim_p)
1570 if (npe>1) then
1571 call mpi_barrier(icomm,ierrmpi)
1572 end if
1573
1574 end subroutine unstructuredvtkb64
1575
1576 subroutine save_connvtk(qunit,igrid)
1577 ! this saves the basic line, pixel and voxel connectivity,
1578 ! as used by VTK file outputs for unstructured grid
1580
1581 integer, intent(in) :: qunit, igrid
1582
1583 integer :: nx^D, nxC^D, ix^D
1584
1585 nx^d=ixmhi^d-ixmlo^d+1;
1586 nxc^d=nx^d+1;
1587 {do ix^db=1,nx^db\}
1588 {^ifoned write(qunit,'(2(i7,1x))')ix1-1,ix1 \}
1589 {^iftwod
1590 write(qunit,'(4(i7,1x))')(ix2-1)*nxc1+ix1-1, &
1591 (ix2-1)*nxc1+ix1,ix2*nxc1+ix1-1,ix2*nxc1+ix1
1592 \}
1593 {^ifthreed
1594 write(qunit,'(8(i7,1x))')&
1595 (ix3-1)*nxc2*nxc1+(ix2-1)*nxc1+ix1-1, &
1596 (ix3-1)*nxc2*nxc1+(ix2-1)*nxc1+ix1,&
1597 (ix3-1)*nxc2*nxc1+ ix2*nxc1+ix1-1,&
1598 (ix3-1)*nxc2*nxc1+ ix2*nxc1+ix1,&
1599 ix3*nxc2*nxc1+(ix2-1)*nxc1+ix1-1,&
1600 ix3*nxc2*nxc1+(ix2-1)*nxc1+ix1,&
1601 ix3*nxc2*nxc1+ ix2*nxc1+ix1-1,&
1602 ix3*nxc2*nxc1+ ix2*nxc1+ix1
1603 \}
1604 {end do\}
1605
1606 end subroutine save_connvtk
1607
1608 subroutine imagedatavtk_mpi(qunit)
1609 ! output for vti format to paraview, non-binary version output
1610 ! parallel, uses calc_grid to compute nwauxio variables
1611 ! allows renormalizing using convert factors
1612 ! allows skipping of w_write selected variables
1613 ! implementation such that length of ASCII output is identical when
1614 ! run on 1 versus multiple CPUs (however, the order of the vtu pieces can differ)
1618
1619 integer, intent(in) :: qunit
1620
1621 double precision, dimension(ixMlo^D-1:ixMhi^D,ndim) :: xC_TMP,xC_TMP_recv
1622 double precision, dimension(ixMlo^D:ixMhi^D,ndim) :: xCC_TMP,xCC_TMP_recv
1623 double precision, dimension(ixMlo^D-1:ixMhi^D,ndim) :: xC
1624 double precision, dimension(ixMlo^D:ixMhi^D,ndim) :: xCC
1625 double precision, dimension(ixMlo^D-1:ixMhi^D,nw+nwauxio) :: wC_TMP,wC_TMP_recv
1626 double precision, dimension(ixMlo^D:ixMhi^D,nw+nwauxio) :: wCC_TMP,wCC_TMP_recv
1627 double precision, dimension(0:nw+nwauxio) :: normconv
1628 double precision :: origin(1:3), spacing(1:3)
1629 integer :: igrid,iigrid,level,ixC^L,ixCC^L
1630 integer :: NumGridsOnLevel(1:nlevelshi)
1631 integer :: nx^D
1632 integer :: filenr
1633 integer :: itag,ipe,Morton_no,Morton_length
1634 integer :: ixrvC^L, ixrvCC^L, siz_ind, ind_send(5*^ND), ind_recv(5*^ND)
1635 integer :: wholeExtent(1:6), ig^D
1636 integer, allocatable :: intstatus(:,:)
1637 logical, allocatable :: Morton_aim(:),Morton_aim_p(:)
1638 logical :: fileopen
1639 character(len=name_len) :: wnamei(1:nw+nwauxio),xandwnamei(1:ndim+nw+nwauxio)
1640 character(len=1024) :: outfilehead
1641 character(len=80):: filename
1642 type(tree_node_ptr) :: tree
1643
1644 if(levmin/=levmax) call mpistop('ImageData can only be used when levmin=levmax')
1645 normconv(0) = length_convert_factor
1646 normconv(1:nw) = w_convert_factor
1647 siz_ind=5*^nd
1648 morton_length=morton_stop(npe-1)-morton_start(0)+1
1649 allocate(morton_aim(morton_start(0):morton_stop(npe-1)))
1650 allocate(morton_aim_p(morton_start(0):morton_stop(npe-1)))
1651 morton_aim=.false.
1652 morton_aim_p=.false.
1653 do morton_no=morton_start(mype),morton_stop(mype)
1654 igrid=sfc_to_igrid(morton_no)
1655 level=node(plevel_,igrid)
1656 ! we can clip parts of the grid away, select variables, levels etc.
1657 if(writelevel(level)) then
1658 ! only output a grid when fully within clipped region selected
1659 ! by writespshift array
1660 if(({rnode(rpxmin^d_,igrid)>=xprobmin^d+(xprobmax^d-xprobmin^d)&
1661 *writespshift(^d,1)|.and.}).and.({rnode(rpxmax^d_,igrid)&
1662 <=xprobmax^d-(xprobmax^d-xprobmin^d)*writespshift(^d,2)|.and.})) then
1663 morton_aim_p(morton_no)=.true.
1664 end if
1665 end if
1666 end do
1667 call mpi_allreduce(morton_aim_p,morton_aim,morton_length,mpi_logical,mpi_lor,&
1668 icomm,ierrmpi)
1669 if(mype /= 0) then
1670 do morton_no=morton_start(mype),morton_stop(mype)
1671 if(.not. morton_aim(morton_no)) cycle
1672 igrid=sfc_to_igrid(morton_no)
1673 call calc_x(igrid,xc,xcc)
1674 call calc_grid(qunit,igrid,xc,xcc,xc_tmp,xcc_tmp,wc_tmp,wcc_tmp,normconv,&
1675 ixc^l,ixcc^l,.true.)
1676 tree%node => igrid_to_node(igrid, mype)%node
1677 {^d& ig^d = tree%node%ig^d; }
1678 itag=morton_no
1679 ind_send=(/ ixc^l,ixcc^l, ig^d /)
1680 call mpi_send(ind_send,siz_ind,mpi_integer, 0,itag,icomm,ierrmpi)
1681 call mpi_send(wc_tmp,1,type_block_wc_io, 0,itag,icomm,ierrmpi)
1682 call mpi_send(wcc_tmp,1,type_block_wcc_io, 0,itag,icomm,ierrmpi)
1683 end do
1684 else
1685 inquire(qunit,opened=fileopen)
1686 if(.not.fileopen)then
1687 ! generate filename
1688 filenr=snapshotini
1689 if (autoconvert) filenr=snapshotnext
1690 write(filename,'(a,i4.4,a)') trim(base_filename),filenr,".vti"
1691 ! Open the file for the header part
1692 open(qunit,file=filename,status='unknown',form='formatted')
1693 end if
1694 call getheadernames(wnamei,xandwnamei,outfilehead)
1695 ! number of cells per grid.
1696 nx^d=ixmhi^d-ixmlo^d+1;
1697 origin = 0
1698 {^d& origin(^d) = xprobmin^d*normconv(0); }
1699 spacing = zero
1700 {^d&spacing(^d) = dxlevel(^d)*normconv(0); }
1701 wholeextent = 0
1702 ! if we use writespshift, the whole extent has to be calculated:
1703 {^d&wholeextent(^d*2-1) = nx^d * ceiling(((xprobmax^d-xprobmin^d)*writespshift(^d,1)) &
1704 /(nx^d*dxlevel(^d))) \}
1705 {^d&wholeextent(^d*2) = nx^d * floor(((xprobmax^d-xprobmin^d)*(1.0d0-writespshift(^d,2))) &
1706 /(nx^d*dxlevel(^d))) \}
1707
1708 ! generate xml header
1709 write(qunit,'(a)')'<?xml version="1.0"?>'
1710 write(qunit,'(a)',advance='no') '<VTKFile type="ImageData"'
1711 write(qunit,'(a)')' version="0.1" byte_order="LittleEndian">'
1712 write(qunit,'(a,3(1pe14.6),a,6(i10),a,3(1pe14.6),a)')' <ImageData Origin="',&
1713 origin,'" WholeExtent="',wholeextent,'" Spacing="',spacing,'">'
1714 write(qunit,'(a)')'<FieldData>'
1715 write(qunit,'(2a)')'<DataArray type="Float32" Name="TIME" ',&
1716 'NumberOfTuples="1" format="ascii">'
1717 write(qunit,*) real(global_time*time_convert_factor)
1718 write(qunit,'(a)')'</DataArray>'
1719 write(qunit,'(a)')'</FieldData>'
1720
1721 ! write the data from proc 0
1722 do morton_no=morton_start(0),morton_stop(0)
1723 if(.not. morton_aim(morton_no)) cycle
1724 igrid=sfc_to_igrid(morton_no)
1725 tree%node => igrid_to_node(igrid, 0)%node
1726 {^d& ig^d = tree%node%ig^d; }
1727 call calc_x(igrid,xc,xcc)
1728 call calc_grid(qunit,igrid,xc,xcc,xc_tmp,xcc_tmp,wc_tmp,wcc_tmp,normconv,&
1729 ixc^l,ixcc^l,.true.)
1730 call write_vti(qunit,ixg^ll,ixc^l,ixcc^l,ig^d,&
1731 nx^d,normconv,wnamei,wc_tmp,wcc_tmp)
1732 end do
1733
1734 if(npe>1)then
1735 allocate(intstatus(mpi_status_size,1))
1736 do ipe=1, npe-1
1737 do morton_no=morton_start(ipe),morton_stop(ipe)
1738 if(.not. morton_aim(morton_no)) cycle
1739 itag=morton_no
1740 call mpi_recv(ind_recv,siz_ind, mpi_integer, ipe,itag,icomm,intstatus(:,1),ierrmpi)
1741 ixrvcmin^d=ind_recv(^d);ixrvcmax^d=ind_recv(^nd+^d);
1742 ixrvccmin^d=ind_recv(2*^nd+^d);ixrvccmax^d=ind_recv(3*^nd+^d);
1743 ig^d=ind_recv(4*^nd+^d);
1744 call mpi_recv(wc_tmp,1,type_block_wc_io, ipe,itag,icomm,intstatus(:,1),ierrmpi)
1745 call mpi_recv(wcc_tmp,1,type_block_wcc_io, ipe,itag,icomm,intstatus(:,1),ierrmpi)
1746 call write_vti(qunit,ixg^ll,ixrvc^l,ixrvcc^l,ig^d,&
1747 nx^d,normconv,wnamei,wc_tmp,wcc_tmp)
1748 end do
1749 end do
1750 end if
1751 write(qunit,'(a)')'</ImageData>'
1752 write(qunit,'(a)')'</VTKFile>'
1753 close(qunit)
1754 if(npe>1) deallocate(intstatus)
1755 end if
1756
1757 deallocate(morton_aim,morton_aim_p)
1758 if (npe>1) then
1759 call mpi_barrier(icomm,ierrmpi)
1760 endif
1761
1762 end subroutine imagedatavtk_mpi
1763
1764 subroutine punstructuredvtk_mpi(qunit)
1765 ! Write one pvtu and vtu files for each processor
1766 ! Otherwise like unstructuredvtk_mpi
1770
1771 integer, intent(in) :: qunit
1772
1773 double precision, dimension(0:nw+nwauxio) :: normconv
1774 double precision, dimension(ixMlo^D-1:ixMhi^D,ndim) :: xC_TMP
1775 double precision, dimension(ixMlo^D:ixMhi^D,ndim) :: xCC_TMP
1776 double precision, dimension(ixMlo^D-1:ixMhi^D,ndim) :: xC
1777 double precision, dimension(ixMlo^D:ixMhi^D,ndim) :: xCC
1778 double precision, dimension(ixMlo^D-1:ixMhi^D,nw+nwauxio) :: wC_TMP
1779 double precision, dimension(ixMlo^D:ixMhi^D,nw+nwauxio) :: wCC_TMP
1780 integer :: nx^D,nxC^D,nc,np, igrid,ixC^L,ixCC^L,level,Morton_no
1781 integer :: filenr
1782 logical :: fileopen,conv_grid
1783 character(len=name_len) :: wnamei(1:nw+nwauxio),xandwnamei(1:ndim+nw+nwauxio)
1784 character(len=1024) :: outfilehead
1785 character(len=80) :: pfilename
1786
1787 ! Write pvtu-file:
1788 if (mype==0) then
1789 call write_pvtu(qunit)
1790 endif
1791 ! Now write the Source files:
1792 inquire(qunit,opened=fileopen)
1793 if(.not.fileopen)then
1794 ! generate filename
1795 filenr=snapshotini
1796 if (autoconvert) filenr=snapshotnext
1797 ! Open the file for the header part
1798 write(pfilename,'(a,i4.4,a,i4.4,a)') trim(base_filename),filenr,"p",mype,".vtu"
1799 open(qunit,file=pfilename,status='unknown',form='formatted')
1800 end if
1801 ! generate xml header
1802 write(qunit,'(a)')'<?xml version="1.0"?>'
1803 write(qunit,'(a)',advance='no') '<VTKFile type="UnstructuredGrid"'
1804 write(qunit,'(a)')' version="0.1" byte_order="LittleEndian">'
1805 write(qunit,'(a)')' <UnstructuredGrid>'
1806 write(qunit,'(a)')'<FieldData>'
1807 write(qunit,'(2a)')'<DataArray type="Float32" Name="TIME" ',&
1808 'NumberOfTuples="1" format="ascii">'
1809 write(qunit,*) real(global_time*time_convert_factor)
1810 write(qunit,'(a)')'</DataArray>'
1811 write(qunit,'(a)')'</FieldData>'
1812
1813 call getheadernames(wnamei,xandwnamei,outfilehead)
1814
1815 ! number of cells, number of corner points, per grid.
1816 nx^d=ixmhi^d-ixmlo^d+1;
1817 nxc^d=nx^d+1;
1818 nc={nx^d*}
1819 np={nxc^d*}
1820
1821 ! Note: using the w_write, writelevel, writespshift
1822 ! we can clip parts of the grid away, select variables, levels etc.
1823 do level=levmin,levmax
1824 if (.not.writelevel(level)) cycle
1825 do morton_no=morton_start(mype),morton_stop(mype)
1826 igrid=sfc_to_igrid(morton_no)
1827 if (node(plevel_,igrid)/=level) cycle
1828 ! only output a grid when fully within clipped region selected
1829 ! by writespshift array
1830 conv_grid=({rnode(rpxmin^d_,igrid)>=xprobmin^d+(xprobmax^d-xprobmin^d)&
1831 *writespshift(^d,1)|.and.}).and.({rnode(rpxmax^d_,igrid)&
1832 <=xprobmax^d-(xprobmax^d-xprobmin^d)*writespshift(^d,2)|.and.})
1833 if (.not.conv_grid) cycle
1834 call calc_x(igrid,xc,xcc)
1835 call calc_grid(qunit,igrid,xc,xcc,xc_tmp,xcc_tmp,wc_tmp,wcc_tmp,normconv,&
1836 ixc^l,ixcc^l,.true.)
1837 call write_vtk(qunit,ixg^ll,ixc^l,ixcc^l,igrid,nc,np,nx^d,nxc^d,&
1838 normconv,wnamei,xc_tmp,xcc_tmp,wc_tmp,wcc_tmp)
1839 end do ! Morton_no loop
1840 end do ! level loop
1841
1842 write(qunit,'(a)')' </UnstructuredGrid>'
1843 write(qunit,'(a)')'</VTKFile>'
1844 close(qunit)
1845
1846 if (npe>1) then
1847 call mpi_barrier(icomm,ierrmpi)
1848 end if
1849
1850 end subroutine punstructuredvtk_mpi
1851
1852 subroutine unstructuredvtk_mpi(qunit)
1853 ! output for vtu format to paraview, non-binary version output
1854 ! parallel, uses calc_grid to compute nwauxio variables
1855 ! allows renormalizing using convert factors
1856 ! allows skipping of w_write selected variables
1857 ! implementation such that length of ASCII output is identical when
1858 ! run on 1 versus multiple CPUs (however, the order of the vtu pieces can differ)
1862
1863 integer, intent(in) :: qunit
1864
1865 double precision :: x_VTK(1:3)
1866 double precision, dimension(ixMlo^D-1:ixMhi^D,ndim) :: xC_TMP,xC_TMP_recv
1867 double precision, dimension(ixMlo^D:ixMhi^D,ndim) :: xCC_TMP,xCC_TMP_recv
1868 double precision, dimension(ixMlo^D-1:ixMhi^D,ndim) :: xC
1869 double precision, dimension(ixMlo^D:ixMhi^D,ndim) :: xCC
1870 double precision, dimension(ixMlo^D-1:ixMhi^D,nw+nwauxio) :: wC_TMP,wC_TMP_recv
1871 double precision, dimension(ixMlo^D:ixMhi^D,nw+nwauxio) :: wCC_TMP,wCC_TMP_recv
1872 double precision, dimension(0:nw+nwauxio) :: normconv
1873 integer:: igrid,iigrid,level,ixC^L,ixCC^L
1874 integer:: NumGridsOnLevel(1:nlevelshi)
1875 integer :: nx^D,nxC^D,nodesonlevel,elemsonlevel,nc,np,ix^D
1876 integer :: filenr
1877 integer :: itag,ipe,Morton_no,siz_ind
1878 integer :: ind_send(4*^ND),ind_recv(4*^ND)
1879 integer :: levmin_recv,levmax_recv,level_recv,igrid_recv,ixrvC^L,ixrvCC^L
1880 integer, allocatable :: intstatus(:,:)
1881 logical :: fileopen,conv_grid,cond_grid_recv
1882 character(len=80):: filename
1883 character(len=name_len) :: wnamei(1:nw+nwauxio),xandwnamei(1:ndim+nw+nwauxio)
1884 character(len=1024) :: outfilehead
1885
1886 if(mype==0) then
1887 inquire(qunit,opened=fileopen)
1888 if(.not.fileopen)then
1889 ! generate filename
1890 filenr=snapshotini
1891 if (autoconvert) filenr=snapshotnext
1892 write(filename,'(a,i4.4,a)') trim(base_filename),filenr,".vtu"
1893 ! Open the file for the header part
1894 open(qunit,file=filename,status='unknown',form='formatted')
1895 end if
1896 ! generate xml header
1897 write(qunit,'(a)')'<?xml version="1.0"?>'
1898 write(qunit,'(a)',advance='no') '<VTKFile type="UnstructuredGrid"'
1899 write(qunit,'(a)')' version="0.1" byte_order="LittleEndian">'
1900 write(qunit,'(a)')'<UnstructuredGrid>'
1901 write(qunit,'(a)')'<FieldData>'
1902 write(qunit,'(2a)')'<DataArray type="Float32" Name="TIME" ',&
1903 'NumberOfTuples="1" format="ascii">'
1904 write(qunit,*) real(global_time*time_convert_factor)
1905 write(qunit,'(a)')'</DataArray>'
1906 write(qunit,'(a)')'</FieldData>'
1907 end if
1908
1909 call getheadernames(wnamei,xandwnamei,outfilehead)
1910 ! number of cells, number of corner points, per grid.
1911 nx^d=ixmhi^d-ixmlo^d+1;
1912 nxc^d=nx^d+1;
1913 nc={nx^d*}
1914 np={nxc^d*}
1915 ! all slave processors send their minmal/maximal levels
1916 if (mype/=0) then
1917 if (morton_stop(mype)==0) call mpistop("nultag")
1918 itag=1000*morton_stop(mype)
1919 !print *,'ype,itag for levmin=',mype,itag,levmin
1920 call mpi_send(levmin,1,mpi_integer, 0,itag,icomm,ierrmpi)
1921 itag=2000*morton_stop(mype)
1922 !print *,'mype,itag for levmax=',mype,itag,levmax
1923 call mpi_send(levmax,1,mpi_integer, 0,itag,icomm,ierrmpi)
1924 end if
1925 ! Note: using the w_write, writelevel, writespshift
1926 ! we can clip parts of the grid away, select variables, levels etc.
1927 do level=levmin,levmax
1928 if (.not.writelevel(level)) cycle
1929 do morton_no=morton_start(mype),morton_stop(mype)
1930 igrid=sfc_to_igrid(morton_no)
1931 if (mype/=0)then
1932 itag=morton_no
1933 call mpi_send(igrid,1,mpi_integer, 0,itag,icomm,ierrmpi)
1934 itag=igrid
1935 call mpi_send(node(plevel_,igrid),1,mpi_integer, 0,itag,icomm,ierrmpi)
1936 end if
1937 if (node(plevel_,igrid)/=level) cycle
1938 ! only output a grid when fully within clipped region selected
1939 ! by writespshift array
1940 conv_grid=({rnode(rpxmin^d_,igrid)>=xprobmin^d+(xprobmax^d-xprobmin^d)&
1941 *writespshift(^d,1)|.and.}).and.({rnode(rpxmax^d_,igrid)&
1942 <=xprobmax^d-(xprobmax^d-xprobmin^d)*writespshift(^d,2)|.and.})
1943 if (mype/=0)then
1944 call mpi_send(conv_grid,1,mpi_logical,0,itag,icomm,ierrmpi)
1945 end if
1946 if (.not.conv_grid) cycle
1947 call calc_x(igrid,xc,xcc)
1948 call calc_grid(qunit,igrid,xc,xcc,xc_tmp,xcc_tmp,wc_tmp,wcc_tmp,normconv,&
1949 ixc^l,ixcc^l,.true.)
1950 if(mype/=0) then
1951 itag=morton_no
1952 ind_send=(/ ixc^l,ixcc^l /)
1953 siz_ind=4*^nd
1954 call mpi_send(ind_send,siz_ind,mpi_integer, 0,itag,icomm,ierrmpi)
1955 call mpi_send(normconv,nw+nwauxio+1,mpi_double_precision, 0,itag,icomm,ierrmpi)
1956 call mpi_send(wc_tmp,1,type_block_wc_io, 0,itag,icomm,ierrmpi)
1957 call mpi_send(xc_tmp,1,type_block_xc_io, 0,itag,icomm,ierrmpi)
1958 itag=igrid
1959 call mpi_send(wcc_tmp,1,type_block_wcc_io, 0,itag,icomm,ierrmpi)
1960 call mpi_send(xcc_tmp,1,type_block_xcc_io, 0,itag,icomm,ierrmpi)
1961 else
1962 call write_vtk(qunit,ixg^ll,ixc^l,ixcc^l,igrid,nc,np,nx^d,nxc^d,&
1963 normconv,wnamei,xc_tmp,xcc_tmp,wc_tmp,wcc_tmp)
1964 end if
1965 end do ! Morton_no loop
1966 end do ! level loop
1967
1968 if(mype==0) then
1969 allocate(intstatus(mpi_status_size,1))
1970 if(npe>1)then
1971 do ipe=1,npe-1
1972 itag=1000*morton_stop(ipe)
1973 call mpi_recv(levmin_recv,1,mpi_integer, ipe,itag,icomm,intstatus(:,1),ierrmpi)
1974 !!print *,'mype RECEIVES,itag for levmin=',mype,itag,levmin_recv
1975 itag=2000*morton_stop(ipe)
1976 call mpi_recv(levmax_recv,1,mpi_integer, ipe,itag,icomm,intstatus(:,1),ierrmpi)
1977 !!print *,'mype RECEIVES itag for levmax=',mype,itag,levmax_recv
1978 do level=levmin_recv,levmax_recv
1979 if (.not.writelevel(level)) cycle
1980 do morton_no=morton_start(ipe),morton_stop(ipe)
1981 itag=morton_no
1982 call mpi_recv(igrid_recv,1,mpi_integer, ipe,itag,icomm,intstatus(:,1),ierrmpi)
1983 itag=igrid_recv
1984 call mpi_recv(level_recv,1,mpi_integer, ipe,itag,icomm,intstatus(:,1),ierrmpi)
1985 if (level_recv/=level) cycle
1986 call mpi_recv(cond_grid_recv,1,mpi_logical, ipe,itag,icomm,intstatus(:,1),ierrmpi)
1987 if(.not.cond_grid_recv)cycle
1988 itag=morton_no
1989 siz_ind=4*^nd
1990 call mpi_recv(ind_recv,siz_ind, mpi_integer, ipe,itag,icomm,intstatus(:,1),ierrmpi)
1991 ixrvcmin^d=ind_recv(^d);ixrvcmax^d=ind_recv(^nd+^d);
1992 ixrvccmin^d=ind_recv(2*^nd+^d);ixrvccmax^d=ind_recv(3*^nd+^d);
1993 call mpi_recv(normconv,nw+nwauxio+1, mpi_double_precision,ipe,itag&
1994 ,icomm,intstatus(:,1),ierrmpi)
1995 call mpi_recv(wc_tmp_recv,1,type_block_wc_io, ipe,itag,icomm,intstatus(:,1),ierrmpi)
1996 call mpi_recv(xc_tmp_recv,1,type_block_xc_io, ipe,itag,icomm,intstatus(:,1),ierrmpi)
1997 itag=igrid_recv
1998 call mpi_recv(wcc_tmp_recv,1,type_block_wcc_io, ipe,itag,icomm,intstatus(:,1),ierrmpi)
1999 call mpi_recv(xcc_tmp_recv,1,type_block_xcc_io, ipe,itag,icomm,intstatus(:,1),ierrmpi)
2000 call write_vtk(qunit,ixg^ll,ixrvc^l,ixrvcc^l,igrid_recv,&
2001 nc,np,nx^d,nxc^d,normconv,wnamei,&
2002 xc_tmp_recv,xcc_tmp_recv,wc_tmp_recv,wcc_tmp_recv)
2003 end do ! Morton_no loop
2004 end do ! level loop
2005 end do ! processor loop
2006 end if ! multiple processors
2007 write(qunit,'(a)')'</UnstructuredGrid>'
2008 write(qunit,'(a)')'</VTKFile>'
2009 close(qunit)
2010 end if
2011 if (npe>1) then
2012 call mpi_barrier(icomm,ierrmpi)
2013 if(mype==0)deallocate(intstatus)
2014 end if
2015
2016 end subroutine unstructuredvtk_mpi
2017
2018 subroutine write_vtk(qunit,ixI^L,ixC^L,ixCC^L,igrid,nc,np,nx^D,nxC^D,&
2019 normconv,wnamei,xC,xCC,wC,wCC)
2021
2022 integer, intent(in) :: qunit
2023 integer, intent(in) :: ixI^L,ixC^L,ixCC^L
2024 integer, intent(in) :: igrid,nc,np,nx^D,nxC^D
2025 double precision, intent(in) :: normconv(0:nw+nwauxio)
2026 character(len=name_len), intent(in):: wnamei(1:nw+nwauxio)
2027 double precision, dimension(ixMlo^D-1:ixMhi^D,ndim) :: xC
2028 double precision, dimension(ixMlo^D:ixMhi^D,ndim) :: xCC
2029 double precision, dimension(ixMlo^D-1:ixMhi^D,nw+nwauxio) :: wC
2030 double precision, dimension(ixMlo^D:ixMhi^D,nw+nwauxio) :: wCC
2031
2032 double precision :: x_VTK(1:3)
2033 integer :: iw,ix^D,icel,VTK_type
2034
2035 select case(convert_type)
2036 case('vtumpi','pvtumpi')
2037 ! we write out every grid as one VTK PIECE
2038 write(qunit,'(a,i7,a,i7,a)') &
2039 '<Piece NumberOfPoints="',np,'" NumberOfCells="',nc,'">'
2040 write(qunit,'(a)')'<PointData>'
2041 do iw=1,nw+nwauxio
2042 if(iw<=nw) then
2043 if(.not.w_write(iw)) cycle
2044 end if
2045 write(qunit,'(a,a,a)')&
2046 '<DataArray type="Float64" Name="',trim(wnamei(iw)),'" format="ascii">'
2047 write(qunit,'(200(1pe14.6))') {(|}wc(ix^d,iw)*normconv(iw),{ix^d=ixcmin^d,ixcmax^d)}
2048 write(qunit,'(a)')'</DataArray>'
2049 end do
2050 write(qunit,'(a)')'</PointData>'
2051 write(qunit,'(a)')'<Points>'
2052 write(qunit,'(a)')'<DataArray type="Float32" NumberOfComponents="3" format="ascii">'
2053 ! write cell corner coordinates in a backward dimensional loop, always 3D output
2054 {do ix^db=ixcmin^db,ixcmax^db \}
2055 x_vtk(1:3)=zero;
2056 x_vtk(1:ndim)=xc(ix^d,1:ndim)*normconv(0);
2057 write(qunit,'(3(1pe14.6))') x_vtk
2058 {end do \}
2059 write(qunit,'(a)')'</DataArray>'
2060 write(qunit,'(a)')'</Points>'
2061
2062 case('vtuCCmpi','pvtuCCmpi')
2063 ! we write out every grid as one VTK PIECE
2064 write(qunit,'(a,i7,a,i7,a)') &
2065 '<Piece NumberOfPoints="',np,'" NumberOfCells="',nc,'">'
2066 write(qunit,'(a)')'<CellData>'
2067 do iw=1,nw+nwauxio
2068 if(iw<=nw) then
2069 if(.not.w_write(iw)) cycle
2070 end if
2071 write(qunit,'(a,a,a)')&
2072 '<DataArray type="Float64" Name="',trim(wnamei(iw)),'" format="ascii">'
2073 write(qunit,'(200(1pe14.6))') {(|}wcc(ix^d,iw)*normconv(iw),{ix^d=ixccmin^d,ixccmax^d)}
2074 write(qunit,'(a)')'</DataArray>'
2075 end do
2076 write(qunit,'(a)')'</CellData>'
2077 write(qunit,'(a)')'<Points>'
2078 write(qunit,'(a)')'<DataArray type="Float32" NumberOfComponents="3" format="ascii">'
2079 ! write cell corner coordinates in a backward dimensional loop, always 3D output
2080 {do ix^db=ixcmin^db,ixcmax^db \}
2081 x_vtk(1:3)=zero;
2082 x_vtk(1:ndim)=xc(ix^d,1:ndim)*normconv(0);
2083 write(qunit,'(3(1pe14.6))') x_vtk
2084 {end do \}
2085 write(qunit,'(a)')'</DataArray>'
2086 write(qunit,'(a)')'</Points>'
2087 end select
2088
2089 write(qunit,'(a)')'<Cells>'
2090 ! connectivity part
2091 write(qunit,'(a)')'<DataArray type="Int32" Name="connectivity" format="ascii">'
2092 call save_connvtk(qunit,igrid)
2093 write(qunit,'(a)')'</DataArray>'
2094 ! offsets data array
2095 write(qunit,'(a)')'<DataArray type="Int32" Name="offsets" format="ascii">'
2096 do icel=1,nc
2097 write(qunit,'(i7)') icel*(2**^nd)
2098 end do
2099 write(qunit,'(a)')'</DataArray>'
2100 ! VTK cell type data array
2101 write(qunit,'(a)')'<DataArray type="Int32" Name="types" format="ascii">'
2102 ! VTK_LINE=3; VTK_PIXEL=8; VTK_VOXEL=11 -> vtk-syntax
2103 {^ifoned vtk_type=3 \}
2104 {^iftwod vtk_type=8 \}
2105 {^ifthreed vtk_type=11 \}
2106 do icel=1,nc
2107 write(qunit,'(i2)') vtk_type
2108 end do
2109 write(qunit,'(a)')'</DataArray>'
2110 write(qunit,'(a)')'</Cells>'
2111 write(qunit,'(a)')'</Piece>'
2112
2113 end subroutine write_vtk
2114
2115 subroutine write_vti(qunit,ixI^L,ixC^L,ixCC^L,ig^D,nx^D,&
2116 normconv,wnamei,wC,wCC)
2118
2119 integer, intent(in) :: qunit
2120 integer, intent(in) :: ixI^L,ixC^L,ixCC^L
2121 integer, intent(in) :: ig^D,nx^D
2122 double precision, intent(in) :: normconv(0:nw+nwauxio)
2123 character(len=name_len), intent(in):: wnamei(1:nw+nwauxio)
2124 double precision, dimension(ixMlo^D-1:ixMhi^D,nw+nwauxio) :: wC
2125 double precision, dimension(ixMlo^D:ixMhi^D,nw+nwauxio) :: wCC
2126
2127 integer :: iw,ix^D
2128 integer :: extent(1:6)
2129
2130 extent = 0
2131 {^d& extent(^d*2-1) = (ig^d-1) * nx^d; }
2132 {^d& extent(^d*2) = (ig^d) * nx^d; }
2133
2134 select case(convert_type)
2135 case('vtimpi','pvtimpi')
2136 ! we write out every grid as one VTK PIECE
2137 write(qunit,'(a,6(i10),a)') &
2138 '<Piece Extent="',extent,'">'
2139 write(qunit,'(a)')'<PointData>'
2140 do iw=1,nw+nwauxio
2141 if(iw<=nw) then
2142 if(.not.w_write(iw)) cycle
2143 end if
2144 write(qunit,'(a,a,a)')&
2145 '<DataArray type="Float64" Name="',trim(wnamei(iw)),'" format="ascii">'
2146 write(qunit,'(200(1pe20.12))') {(|}wc(ix^d,iw)*normconv(iw),{ix^d=ixcmin^d,ixcmax^d)}
2147 write(qunit,'(a)')'</DataArray>'
2148 end do
2149 write(qunit,'(a)')'</PointData>'
2150 case('vtiCCmpi','pvtiCCmpi')
2151 ! we write out every grid as one VTK PIECE
2152 write(qunit,'(a,6(i10),a)') &
2153 '<Piece Extent="',extent,'">'
2154 write(qunit,'(a)')'<CellData>'
2155 do iw=1,nw+nwauxio
2156 if(iw<=nw) then
2157 if(.not.w_write(iw)) cycle
2158 end if
2159 write(qunit,'(a,a,a)')&
2160 '<DataArray type="Float64" Name="',trim(wnamei(iw)),'" format="ascii">'
2161 write(qunit,'(200(1pe20.12))') {(|}wcc(ix^d,iw)*normconv(iw),{ix^d=ixccmin^d,ixccmax^d)}
2162 write(qunit,'(a)')'</DataArray>'
2163 end do
2164 write(qunit,'(a)')'</CellData>'
2165 end select
2166
2167 write(qunit,'(a)')'</Piece>'
2168
2169 end subroutine write_vti
2170
2171 subroutine write_pvtu(qunit)
2174
2175 integer, intent(in) :: qunit
2176
2177 integer :: filenr,iw,ipe,iscalars
2178 logical :: fileopen
2179 character(len=name_len) :: wnamei(1:nw+nwauxio),xandwnamei(1:ndim+nw+nwauxio),outtype
2180 character(len=1024) :: outfilehead
2181 character(len=80) :: filename,pfilename
2182
2183 select case(convert_type)
2184 case('pvtumpi','pvtuBmpi')
2185 outtype="PPointData"
2186 case('pvtuCCmpi','pvtuBCCmpi')
2187 outtype="PCellData"
2188 end select
2189 inquire(qunit,opened=fileopen)
2190 if(.not.fileopen)then
2191 ! generate filename
2192 filenr=snapshotini
2193 if (autoconvert) filenr=snapshotnext
2194 write(filename,'(a,i4.4,a)') trim(base_filename),filenr,".pvtu"
2195 ! Open the file
2196 open(qunit,file=filename,status='unknown',form='formatted')
2197 end if
2198
2199 call getheadernames(wnamei,xandwnamei,outfilehead)
2200 ! Get the default selection:
2201 iscalars=1
2202 do iw=nw,1, -1
2203 if (w_write(iw)) iscalars=iw
2204 end do
2205 ! generate xml header
2206 write(qunit,'(a)')'<?xml version="1.0"?>'
2207 write(qunit,'(a)',advance='no') '<VTKFile type="PUnstructuredGrid"'
2208 write(qunit,'(a)')' version="0.1" byte_order="LittleEndian">'
2209 write(qunit,'(a)')' <PUnstructuredGrid GhostLevel="0">'
2210 ! Either celldata or pointdata:
2211 write(qunit,'(a,a,a,a,a)')&
2212 ' <',trim(outtype),' Scalars="',trim(wnamei(iscalars))//'">'
2213 do iw=1,nw
2214 if(.not.w_write(iw))cycle
2215 write(qunit,'(a,a,a)')&
2216 ' <PDataArray type="Float32" Name="',trim(wnamei(iw)),'"/>'
2217 end do
2218 do iw=nw+1,nw+nwauxio
2219 write(qunit,'(a,a,a)')&
2220 ' <PDataArray type="Float32" Name="',trim(wnamei(iw)),'"/>'
2221 end do
2222 write(qunit,'(a,a,a)')' </',trim(outtype),'>'
2223 write(qunit,'(a)')' <PPoints>'
2224 write(qunit,'(a)')' <PDataArray type="Float32" NumberOfComponents="3"/>'
2225 write(qunit,'(a)')' </PPoints>'
2226
2227 do ipe=0,npe-1
2228 write(pfilename,'(a,i4.4,a,i4.4,a)') trim(base_filename(&
2229 index(base_filename, '/', back = .true.)+1:&
2230 len(base_filename))),filenr,"p",&
2231 ipe,".vtu"
2232 write(qunit,'(a,a,a)')' <Piece Source="',trim(pfilename),'"/>'
2233 end do
2234 write(qunit,'(a)')' </PUnstructuredGrid>'
2235 write(qunit,'(a)')'</VTKFile>'
2236 close(qunit)
2237
2238 end subroutine write_pvtu
2239
2240 subroutine tecplot_mpi(qunit)
2241 ! output for tecplot (ASCII format)
2242 ! parallel, uses calc_grid to compute nwauxio variables
2243 ! allows renormalizing using convert factors
2244 ! the current implementation is such that tecplotmpi and tecplotCCmpi will
2245 ! create different length output ASCII files when used on 1 versus multiple CPUs
2246 ! in fact, on 1 CPU, there will be as many zones as there are levels
2247 ! on multiple CPUs, there will be a number of zones up to the number of
2248 ! levels times the number of CPUs (can be less, when some level not on a CPU)
2252
2253 integer, intent(in) :: qunit
2254
2255 double precision :: x_TEC(ndim), w_TEC(nw+nwauxio)
2256 double precision, dimension(ixMlo^D-1:ixMhi^D,ndim) :: xC_TMP,xC_TMP_recv
2257 double precision, dimension(ixMlo^D:ixMhi^D,ndim) :: xCC_TMP,xCC_TMP_recv
2258 double precision, dimension(ixMlo^D-1:ixMhi^D,ndim) :: xC
2259 double precision, dimension(ixMlo^D:ixMhi^D,ndim) :: xCC
2260 double precision, dimension(ixMlo^D-1:ixMhi^D,nw+nwauxio) :: wC_TMP,wC_TMP_recv
2261 double precision, dimension(ixMlo^D:ixMhi^D,nw+nwauxio) :: wCC_TMP,wCC_TMP_recv
2262 double precision, dimension(0:nw+nwauxio) :: normconv
2263 integer:: igrid,iigrid,level,igonlevel,iw,idim,ix^D
2264 integer:: NumGridsOnLevel(1:nlevelshi)
2265 integer :: nx^D,nxC^D,nodesonlevel,elemsonlevel,ixC^L,ixCC^L
2266 integer :: nodesonlevelmype,elemsonlevelmype
2267 integer :: nodes, elems
2268 integer, allocatable :: intstatus(:,:)
2269 integer :: itag,Morton_no,ipe,levmin_recv,levmax_recv,igrid_recv,level_recv
2270 integer :: ixrvC^L,ixrvCC^L
2271 integer :: ind_send(2*^ND),ind_recv(2*^ND),siz_ind,igonlevel_recv
2272 integer :: NumGridsOnLevel_mype(1:nlevelshi,0:npe-1)
2273 integer :: filenr
2274 logical :: fileopen,first
2275 character(len=80) :: filename
2276 character(len=1024) :: tecplothead
2277 character(len=name_len) :: wnamei(1:nw+nwauxio),xandwnamei(1:ndim+nw+nwauxio)
2278 character(len=1024) :: outfilehead
2279
2280 if(nw/=count(w_write(1:nw)))then
2281 if(mype==0) print *,'tecplot_mpi does not use w_write=F'
2282 call mpistop('w_write, tecplot')
2283 end if
2284
2285 if(nocartesian)then
2286 if(mype==0) print *,'tecplot_mpi with nocartesian'
2287 end if
2288
2289 master_cpu_open : if (mype == 0) then
2290 inquire(qunit,opened=fileopen)
2291 if (.not.fileopen) then
2292 ! generate filename
2293 filenr=snapshotini
2294 if (autoconvert) filenr=snapshotnext
2295 write(filename,'(a,i4.4,a)') trim(base_filename),filenr,".plt"
2296 open(qunit,file=filename,status='unknown')
2297 end if
2298 call getheadernames(wnamei,xandwnamei,outfilehead)
2299 write(tecplothead,'(a)') "VARIABLES = "//trim(outfilehead)
2300 write(qunit,'(a)') tecplothead(1:len_trim(tecplothead))
2301 end if master_cpu_open
2302
2303 ! determine overall number of grids per level, and the same info per CPU
2304 numgridsonlevel(1:nlevelshi)=0
2305 do level=levmin,levmax
2306 numgridsonlevel(level)=0
2307 do morton_no=morton_start(mype),morton_stop(mype)
2308 igrid = sfc_to_igrid(morton_no)
2309 if (node(plevel_,igrid)/=level) cycle
2310 numgridsonlevel(level)=numgridsonlevel(level)+1
2311 end do
2312 numgridsonlevel_mype(level,0:npe-1)=0
2313 numgridsonlevel_mype(level,mype) = numgridsonlevel(level)
2314 call mpi_allreduce(mpi_in_place,numgridsonlevel_mype(level,0:npe-1),npe,mpi_integer,&
2315 mpi_max,icomm,ierrmpi)
2316 call mpi_allreduce(mpi_in_place,numgridsonlevel(level),1,mpi_integer,mpi_sum, &
2317 icomm,ierrmpi)
2318 end do
2319
2320 nx^d=ixmhi^d-ixmlo^d+1;
2321 nxc^d=nx^d+1;
2322
2323 if(mype==0.and.npe>1) allocate(intstatus(mpi_status_size,1))
2324
2325 {^ifoned
2326 if(convert_type=='teclinempi') then
2327 nodes=0
2328 elems=0
2329 do level=levmin,levmax
2330 nodes=nodes + numgridsonlevel(level)*{nxc^d*}
2331 elems=elems + numgridsonlevel(level)*{nx^d*}
2332 end do
2333
2334 if (mype==0) write(qunit,"(a,i7,a,1pe12.5,a)") &
2335 'ZONE T="all levels", I=',elems, &
2336 ', SOLUTIONTIME=',global_time*time_convert_factor,', F=POINT'
2337
2338 igonlevel=0
2339 do morton_no=morton_start(mype),morton_stop(mype)
2340 igrid = sfc_to_igrid(morton_no)
2341 call calc_x(igrid,xc,xcc)
2342 call calc_grid(qunit,igrid,xc,xcc,xc_tmp,xcc_tmp,wc_tmp,wcc_tmp,normconv,ixc^l,ixcc^l,.true.)
2343 if (mype==0) then
2344 {do ix^db=ixccmin^db,ixccmax^db\}
2345 x_tec(1:ndim)=xcc_tmp(ix^d,1:ndim)*normconv(0)
2346 w_tec(1:nw+nwauxio)=wcc_tmp(ix^d,1:nw+nwauxio)*normconv(1:nw+nwauxio)
2347 write(qunit,fmt="(100(e14.6))") x_tec, w_tec
2348 {end do\}
2349 else if (mype/=0) then
2350 itag=morton_no
2351 call mpi_send(igrid,1,mpi_integer, 0,itag,icomm,ierrmpi)
2352 call mpi_send(normconv,nw+nwauxio+1,mpi_double_precision,0,itag,icomm,ierrmpi)
2353 call mpi_send(wcc_tmp,1,type_block_wcc_io, 0,itag,icomm,ierrmpi)
2354 call mpi_send(xcc_tmp,1,type_block_xcc_io, 0,itag,icomm,ierrmpi)
2355 end if
2356 end do
2357 if(mype==0) then
2358 do ipe=1,npe-1
2359 do morton_no=morton_start(ipe),morton_stop(ipe)
2360 itag=morton_no
2361 call mpi_recv(igrid_recv,1,mpi_integer, ipe,itag,icomm,intstatus(:,1),ierrmpi)
2362 call mpi_recv(normconv,nw+nwauxio+1, mpi_double_precision,ipe,&
2363 itag,icomm,intstatus(:,1),ierrmpi)
2364 call mpi_recv(wcc_tmp_recv,1,type_block_wcc_io, ipe,itag,&
2365 icomm,intstatus(:,1),ierrmpi)
2366 call mpi_recv(xcc_tmp_recv,1,type_block_xcc_io, ipe,itag,&
2367 icomm,intstatus(:,1),ierrmpi)
2368 {do ix^db=ixccmin^db,ixccmax^db\}
2369 x_tec(1:ndim)=xcc_tmp_recv(ix^d,1:ndim)*normconv(0)
2370 w_tec(1:nw+nwauxio)=wcc_tmp_recv(ix^d,1:nw+nwauxio)*normconv(1:nw+nwauxio)
2371 write(qunit,fmt="(100(e14.6))") x_tec, w_tec
2372 {end do\}
2373 end do
2374 end do
2375 close(qunit)
2376 end if
2377 else
2378 }
2379 if(mype/=0) then
2380 itag=1000*morton_stop(mype)
2381 call mpi_send(levmin,1,mpi_integer, 0,itag,icomm,ierrmpi)
2382 itag=2000*morton_stop(mype)
2383 call mpi_send(levmax,1,mpi_integer, 0,itag,icomm,ierrmpi)
2384 end if
2385
2386 do level=levmin,levmax
2387 nodesonlevelmype=numgridsonlevel_mype(level,mype)*{nxc^d*}
2388 elemsonlevelmype=numgridsonlevel_mype(level,mype)*{nx^d*}
2389 nodesonlevel=numgridsonlevel(level)*{nxc^d*}
2390 elemsonlevel=numgridsonlevel(level)*{nx^d*}
2391 ! for all tecplot variants coded up here, we let the TECPLOT ZONES coincide
2392 ! with the AMR grid LEVEL. Other options would be
2393 ! let each grid define a zone: inefficient for TECPLOT internal workings
2394 ! hence not implemented
2395 ! let entire octree define 1 zone: no difference in interpolation
2396 ! properties across TECPLOT zones detected as yet, hence not done
2397 select case(convert_type)
2398 case('tecplotmpi')
2399 ! in this option, we store the corner coordinates, as well as the corner
2400 ! values of all variables (obtained by averaging). This allows POINT packaging,
2401 ! and thus we can save full grid info by using one call to calc_grid
2402 if (mype==0.and.(nodesonlevelmype>0.and.elemsonlevelmype>0))&
2403 write(qunit,"(a,i7,a,a,i7,a,i7,a,f25.16,a,a)") &
2404 'ZONE T="',level,'"',', N=',nodesonlevelmype,', E=',elemsonlevelmype, &
2405 ', SOLUTIONTIME=',global_time*time_convert_factor,', DATAPACKING=POINT, ZONETYPE=', &
2406 {^ifoned 'FELINESEG'}{^iftwod 'FEQUADRILATERAL'}{^ifthreed 'FEBRICK'}
2407 do morton_no=morton_start(mype),morton_stop(mype)
2408 igrid = sfc_to_igrid(morton_no)
2409 if (mype/=0)then
2410 itag=morton_no
2411 call mpi_send(igrid,1,mpi_integer, 0,itag,icomm,ierrmpi)
2412 itag=igrid
2413 call mpi_send(node(plevel_,igrid),1,mpi_integer, 0,itag,icomm,ierrmpi)
2414 end if
2415 if (node(plevel_,igrid)/=level) cycle
2416 call calc_x(igrid,xc,xcc)
2417 call calc_grid(qunit,igrid,xc,xcc,xc_tmp,xcc_tmp,wc_tmp,wcc_tmp,normconv,&
2418 ixc^l,ixcc^l,.true.)
2419 if (mype/=0) then
2420 itag=morton_no
2421 ind_send=(/ ixc^l /)
2422 siz_ind=2*^nd
2423 call mpi_send(ind_send,siz_ind, mpi_integer, 0,itag,icomm,ierrmpi)
2424 call mpi_send(normconv,nw+nwauxio+1,mpi_double_precision, 0,itag,icomm,ierrmpi)
2425
2426 call mpi_send(wc_tmp,1,type_block_wc_io, 0,itag,icomm,ierrmpi)
2427 call mpi_send(xc_tmp,1,type_block_xc_io, 0,itag,icomm,ierrmpi)
2428 else
2429 {do ix^db=ixcmin^db,ixcmax^db\}
2430 x_tec(1:ndim)=xc_tmp(ix^d,1:ndim)*normconv(0)
2431 w_tec(1:nw+nwauxio)=wc_tmp(ix^d,1:nw+nwauxio)*normconv(1:nw+nwauxio)
2432 write(qunit,fmt="(100(e14.6))") x_tec, w_tec
2433 {end do\}
2434 end if
2435 end do
2436 case('tecplotCCmpi')
2437 ! in this option, we store the corner coordinates, and the cell center
2438 ! values of all variables. Due to this mix of corner/cell center, we must
2439 ! use BLOCK packaging, and thus we have enormous overhead by using
2440 ! calc_grid repeatedly to merely fill values of cell corner coordinates
2441 ! and cell center values per dimension, per variable
2442 if(ndim+nw+nwauxio>99) call mpistop("adjust format specification in writeout")
2443 if(nw+nwauxio==1)then
2444 ! to make tecplot happy: avoid [ndim+1-ndim+1] in varlocation varset
2445 ! and just set [ndim+1]
2446 if (mype==0.and.(nodesonlevelmype>0.and.elemsonlevelmype>0))&
2447 write(qunit,"(a,i7,a,a,i7,a,i7,a,f25.16,a,i1,a,a)") &
2448 'ZONE T="',level,'"',', N=',nodesonlevelmype,', E=',elemsonlevelmype, &
2449 ', SOLUTIONTIME=',global_time*time_convert_factor,', DATAPACKING=BLOCK, VARLOCATION=([', &
2450 ndim+1,']=CELLCENTERED), ZONETYPE=', &
2451 {^ifoned 'FELINESEG'}{^iftwod 'FEQUADRILATERAL'}{^ifthreed 'FEBRICK'}
2452 else
2453 if(ndim+nw+nwauxio<10) then
2454 ! difference only in length of integer format specification for ndim+nw+nwauxio
2455 if (mype==0.and.(nodesonlevelmype>0.and.elemsonlevelmype>0))&
2456 write(qunit,"(a,i7,a,a,i7,a,i7,a,f25.16,a,i1,a,i1,a,a)") &
2457 'ZONE T="',level,'"',', N=',nodesonlevelmype,', E=',elemsonlevelmype, &
2458 ', SOLUTIONTIME=',global_time*time_convert_factor,', DATAPACKING=BLOCK, VARLOCATION=([', &
2459 ndim+1,'-',ndim+nw+nwauxio,']=CELLCENTERED), ZONETYPE=', &
2460 {^ifoned 'FELINESEG'}{^iftwod 'FEQUADRILATERAL'}{^ifthreed 'FEBRICK'}
2461 else
2462 if (mype==0.and.(nodesonlevelmype>0.and.elemsonlevelmype>0))&
2463 write(qunit,"(a,i7,a,a,i7,a,i7,a,f25.16,a,i1,a,i2,a,a)") &
2464 'ZONE T="',level,'"',', N=',nodesonlevelmype,', E=',elemsonlevelmype, &
2465 ', SOLUTIONTIME=',global_time*time_convert_factor,', DATAPACKING=BLOCK, VARLOCATION=([', &
2466 ndim+1,'-',ndim+nw+nwauxio,']=CELLCENTERED), ZONETYPE=', &
2467 {^ifoned 'FELINESEG'}{^iftwod 'FEQUADRILATERAL'}{^ifthreed 'FEBRICK'}
2468 end if
2469 end if
2470
2471 do idim=1,ndim
2472 first=(idim==1)
2473 do morton_no=morton_start(mype),morton_stop(mype)
2474 igrid = sfc_to_igrid(morton_no)
2475 if (mype/=0)then
2476 itag=morton_no*idim
2477 call mpi_send(igrid,1,mpi_integer, 0,itag,icomm,ierrmpi)
2478 itag=igrid*idim
2479 call mpi_send(node(plevel_,igrid),1,mpi_integer, 0,itag,icomm,ierrmpi)
2480 end if
2481 if (node(plevel_,igrid)/=level) cycle
2482 call calc_x(igrid,xc,xcc)
2483 call calc_grid(qunit,igrid,xc,xcc,xc_tmp,xcc_tmp,wc_tmp,wcc_tmp,normconv,&
2484 ixc^l,ixcc^l,first)
2485 if (mype/=0)then
2486 ind_send=(/ ixc^l /)
2487 siz_ind=2*^nd
2488 itag=igrid*idim
2489 call mpi_send(ind_send,siz_ind, mpi_integer, 0,itag,icomm,ierrmpi)
2490 call mpi_send(normconv,nw+nwauxio+1,mpi_double_precision, 0,itag,icomm,ierrmpi)
2491 call mpi_send(xc_tmp,1,type_block_xc_io, 0,itag,icomm,ierrmpi)
2492 else
2493 write(qunit,fmt="(100(e14.6))") xc_tmp(ixc^s,idim)*normconv(0)
2494 end if
2495 end do
2496 end do
2497 do iw=1,nw+nwauxio
2498 do morton_no=morton_start(mype),morton_stop(mype)
2499 igrid = sfc_to_igrid(morton_no)
2500 if(mype/=0)then
2501 itag=morton_no*(ndim+iw)
2502 call mpi_send(igrid,1,mpi_integer, 0,itag,icomm,ierrmpi)
2503 itag=igrid*(ndim+iw)
2504 call mpi_send(node(plevel_,igrid),1,mpi_integer, 0,itag,icomm,ierrmpi)
2505 end if
2506 if (node(plevel_,igrid)/=level) cycle
2507 call calc_x(igrid,xc,xcc)
2508 call calc_grid(qunit,igrid,xc,xcc,xc_tmp,xcc_tmp,wc_tmp,wcc_tmp,normconv,&
2509 ixc^l,ixcc^l,.true.)
2510 if(mype/=0)then
2511 ind_send=(/ ixcc^l /)
2512 siz_ind=2*^nd
2513 itag=igrid*(ndim+iw)
2514 call mpi_send(ind_send,siz_ind, mpi_integer, 0,itag,icomm,ierrmpi)
2515 call mpi_send(normconv,nw+nwauxio+1,mpi_double_precision, 0,itag,icomm,ierrmpi)
2516 call mpi_send(wcc_tmp,1,type_block_wcc_io, 0,itag,icomm,ierrmpi)
2517 else
2518 write(qunit,fmt="(100(e14.6))") wcc_tmp(ixcc^s,iw)*normconv(iw)
2519 end if
2520 end do
2521 end do
2522 case default
2523 call mpistop('no such tecplot type')
2524 end select
2525
2526 igonlevel=0
2527 do morton_no=morton_start(mype),morton_stop(mype)
2528 igrid = sfc_to_igrid(morton_no)
2529 if(mype/=0)then
2530 itag=morton_no
2531 call mpi_send(igrid,1,mpi_integer, 0,itag,icomm,ierrmpi)
2532 itag=igrid
2533 call mpi_send(node(plevel_,igrid),1,mpi_integer, 0,itag,icomm,ierrmpi)
2534 end if
2535 if(node(plevel_,igrid)/=level) cycle
2536 igonlevel=igonlevel+1
2537 if(mype/=0)then
2538 itag=igrid
2539 call mpi_send(igonlevel,1,mpi_integer, 0,itag,icomm,ierrmpi)
2540 end if
2541 if(mype==0)then
2542 call save_conntec(qunit,igrid,igonlevel)
2543 end if
2544 end do
2545 end do
2546
2547 if(mype==0 .and.npe>1) then
2548 do ipe=1,npe-1
2549 itag=1000*morton_stop(ipe)
2550 call mpi_recv(levmin_recv,1,mpi_integer, ipe,itag,icomm,intstatus(:,1),ierrmpi)
2551 itag=2000*morton_stop(ipe)
2552 call mpi_recv(levmax_recv,1,mpi_integer, ipe,itag,icomm,intstatus(:,1),ierrmpi)
2553 do level=levmin_recv,levmax_recv
2554 nodesonlevelmype=numgridsonlevel_mype(level,ipe)*{nxc^d*}
2555 elemsonlevelmype=numgridsonlevel_mype(level,ipe)*{nx^d*}
2556 nodesonlevel=numgridsonlevel(level)*{nxc^d*}
2557 elemsonlevel=numgridsonlevel(level)*{nx^d*}
2558 select case(convert_type)
2559 case('tecplotmpi')
2560 ! in this option, we store the corner coordinates, as well as the corner
2561 ! values of all variables (obtained by averaging). This allows POINT packaging,
2562 ! and thus we can save full grid info by using one call to calc_grid
2563 if(nodesonlevelmype>0.and.elemsonlevelmype>0) &
2564 write(qunit,"(a,i7,a,a,i7,a,i7,a,f25.16,a,a)") &
2565 'ZONE T="',level,'"',', N=',nodesonlevelmype,', E=',elemsonlevelmype, &
2566 ', SOLUTIONTIME=',global_time*time_convert_factor,', DATAPACKING=POINT, ZONETYPE=', &
2567 {^ifoned 'FELINESEG'}{^iftwod 'FEQUADRILATERAL'}{^ifthreed 'FEBRICK'}
2568 do morton_no=morton_start(ipe),morton_stop(ipe)
2569 itag=morton_no
2570 call mpi_recv(igrid_recv,1,mpi_integer, ipe,itag,icomm,intstatus(:,1),ierrmpi)
2571 itag=igrid_recv
2572 call mpi_recv(level_recv,1,mpi_integer, ipe,itag,icomm,intstatus(:,1),ierrmpi)
2573 if (level_recv/=level) cycle
2574 itag=morton_no
2575 siz_ind=2*^nd
2576 call mpi_recv(ind_recv,siz_ind, mpi_integer, ipe,itag,&
2577 icomm,intstatus(:,1),ierrmpi)
2578 ixrvcmin^d=ind_recv(^d);ixrvcmax^d=ind_recv(^nd+^d);
2579 call mpi_recv(normconv,nw+nwauxio+1, mpi_double_precision,ipe,itag&
2580 ,icomm,intstatus(:,1),ierrmpi)
2581 call mpi_recv(wc_tmp_recv,1,type_block_wc_io, ipe,itag,&
2582 icomm,intstatus(:,1),ierrmpi)
2583 call mpi_recv(xc_tmp_recv,1,type_block_xc_io, ipe,itag,&
2584 icomm,intstatus(:,1),ierrmpi)
2585 {do ix^db=ixrvcmin^db,ixrvcmax^db\}
2586 x_tec(1:ndim)=xc_tmp_recv(ix^d,1:ndim)*normconv(0)
2587 w_tec(1:nw+nwauxio)=wc_tmp_recv(ix^d,1:nw+nwauxio)*normconv(1:nw+nwauxio)
2588 write(qunit,fmt="(100(e14.6))") x_tec, w_tec
2589 {end do\}
2590 end do
2591 case('tecplotCCmpi')
2592 ! in this option, we store the corner coordinates, and the cell center
2593 ! values of all variables. Due to this mix of corner/cell center, we must
2594 ! use BLOCK packaging, and thus we have enormous overhead by using
2595 ! calc_grid repeatedly to merely fill values of cell corner coordinates
2596 ! and cell center values per dimension, per variable
2597 if(ndim+nw+nwauxio>99) call mpistop("adjust format specification in writeout")
2598 if(nw+nwauxio==1)then
2599 ! to make tecplot happy: avoid [ndim+1-ndim+1] in varlocation varset
2600 ! and just set [ndim+1]
2601 if(nodesonlevelmype>0.and.elemsonlevelmype>0) &
2602 write(qunit,"(a,i7,a,a,i7,a,i7,a,f25.16,a,i1,a,a)") &
2603 'ZONE T="',level,'"',', N=',nodesonlevelmype,', E=',elemsonlevelmype, &
2604 ', SOLUTIONTIME=',global_time*time_convert_factor,', DATAPACKING=BLOCK, VARLOCATION=([', &
2605 ndim+1,']=CELLCENTERED), ZONETYPE=', &
2606 {^ifoned 'FELINESEG'}{^iftwod 'FEQUADRILATERAL'}{^ifthreed 'FEBRICK'}
2607 else
2608 if(ndim+nw+nwauxio<10) then
2609 ! difference only in length of integer format specification for ndim+nw+nwauxio
2610 if(nodesonlevelmype>0.and.elemsonlevelmype>0) &
2611 write(qunit,"(a,i7,a,a,i7,a,i7,a,f25.16,a,i1,a,i1,a,a)") &
2612 'ZONE T="',level,'"',', N=',nodesonlevelmype,', E=',elemsonlevelmype, &
2613 ', SOLUTIONTIME=',global_time*time_convert_factor,', DATAPACKING=BLOCK, VARLOCATION=([', &
2614 ndim+1,'-',ndim+nw+nwauxio,']=CELLCENTERED), ZONETYPE=', &
2615 {^ifoned 'FELINESEG'}{^iftwod 'FEQUADRILATERAL'}{^ifthreed 'FEBRICK'}
2616 else
2617 if(nodesonlevelmype>0.and.elemsonlevelmype>0) &
2618 write(qunit,"(a,i7,a,a,i7,a,i7,a,f25.16,a,i1,a,i2,a,a)") &
2619 'ZONE T="',level,'"',', N=',nodesonlevelmype,', E=',elemsonlevelmype, &
2620 ', SOLUTIONTIME=',global_time*time_convert_factor,', DATAPACKING=BLOCK, VARLOCATION=([', &
2621 ndim+1,'-',ndim+nw+nwauxio,']=CELLCENTERED), ZONETYPE=', &
2622 {^ifoned 'FELINESEG'}{^iftwod 'FEQUADRILATERAL'}{^ifthreed 'FEBRICK'}
2623 end if
2624 end if
2625
2626 do idim=1,ndim
2627 do morton_no=morton_start(ipe),morton_stop(ipe)
2628 itag=morton_no*idim
2629 call mpi_recv(igrid_recv,1,mpi_integer, ipe,itag,icomm,intstatus(:,1),ierrmpi)
2630 itag=igrid_recv*idim
2631 call mpi_recv(level_recv,1,mpi_integer, ipe,itag,icomm,intstatus(:,1),ierrmpi)
2632 if (level_recv/=level) cycle
2633 siz_ind=2*^nd
2634 itag=igrid_recv*idim
2635 call mpi_recv(ind_recv,siz_ind, mpi_integer, ipe,itag,icomm,intstatus(:,1),ierrmpi)
2636 ixrvcmin^d=ind_recv(^d);ixrvcmax^d=ind_recv(^nd+^d);
2637 call mpi_recv(normconv,nw+nwauxio+1, mpi_double_precision,ipe,itag&
2638 ,icomm,intstatus(:,1),ierrmpi)
2639 call mpi_recv(xc_tmp_recv,1,type_block_xc_io, ipe,itag,icomm,intstatus(:,1),ierrmpi)
2640 write(qunit,fmt="(100(e14.6))") xc_tmp_recv(ixrvc^s,idim)*normconv(0)
2641 end do
2642 end do
2643 do iw=1,nw+nwauxio
2644 do morton_no=morton_start(ipe),morton_stop(ipe)
2645 itag=morton_no*(ndim+iw)
2646 call mpi_recv(igrid_recv,1,mpi_integer, ipe,itag,icomm,intstatus(:,1),ierrmpi)
2647 itag=igrid_recv*(ndim+iw)
2648 call mpi_recv(level_recv,1,mpi_integer, ipe,itag,icomm,intstatus(:,1),ierrmpi)
2649 if (level_recv/=level) cycle
2650 siz_ind=2*^nd
2651 itag=igrid_recv*(ndim+iw)
2652 call mpi_recv(ind_recv,siz_ind, mpi_integer, ipe,itag,icomm,intstatus(:,1),ierrmpi)
2653 ixrvccmin^d=ind_recv(^d);ixrvccmax^d=ind_recv(^nd+^d);
2654 call mpi_recv(normconv,nw+nwauxio+1, mpi_double_precision,ipe,itag&
2655 ,icomm,intstatus(:,1),ierrmpi)
2656 call mpi_recv(wcc_tmp_recv,1,type_block_wcc_io, ipe,itag,icomm,intstatus(:,1),ierrmpi)
2657 write(qunit,fmt="(100(e14.6))") wcc_tmp_recv(ixrvcc^s,iw)*normconv(iw)
2658 end do
2659 end do
2660 case default
2661 call mpistop('no such tecplot type')
2662 end select
2663
2664 do morton_no=morton_start(ipe),morton_stop(ipe)
2665 itag=morton_no
2666 call mpi_recv(igrid_recv,1,mpi_integer, ipe,itag,icomm,intstatus(:,1),ierrmpi)
2667 itag=igrid_recv
2668 call mpi_recv(level_recv,1,mpi_integer, ipe,itag,icomm,intstatus(:,1),ierrmpi)
2669 if (level_recv/=level) cycle
2670 itag=igrid_recv
2671 call mpi_recv(igonlevel_recv,1,mpi_integer, ipe,itag,icomm,intstatus(:,1),ierrmpi)
2672 call save_conntec(qunit,igrid_recv,igonlevel_recv)
2673 end do ! morton loop
2674 end do ! level loop
2675 end do ! ipe loop
2676 end if ! mype=0 if
2677 {^ifoned endif}
2678
2679 if (npe>1) then
2680 call mpi_barrier(icomm,ierrmpi)
2681 if(mype==0)deallocate(intstatus)
2682 end if
2683
2684 end subroutine tecplot_mpi
2685
2686 subroutine punstructuredvtkb_mpi(qunit)
2687 ! Write one pvtu and vtu files for each processor
2688 ! Otherwise like unstructuredvtk_mpi
2689 ! output for vtu format to paraview, binary version output
2690 ! uses calc_grid to compute nwauxio variables
2691 ! allows renormalizing using convert factors
2695
2696 integer, intent(in) :: qunit
2697
2698 double precision :: x_VTK(1:3)
2699 double precision, dimension(ixMlo^D-1:ixMhi^D,ndim) :: xC_TMP
2700 double precision, dimension(ixMlo^D:ixMhi^D,ndim) :: xCC_TMP
2701 double precision, dimension(ixMlo^D-1:ixMhi^D,ndim) :: xC
2702 double precision, dimension(ixMlo^D:ixMhi^D,ndim) :: xCC
2703 double precision, dimension(ixMlo^D-1:ixMhi^D,nw+nwauxio) :: wC_TMP
2704 double precision, dimension(ixMlo^D:ixMhi^D,nw+nwauxio) :: wCC_TMP
2705 double precision :: normconv(0:nw+nwauxio)
2706 integer*8 :: offset
2707 integer :: igrid,iigrid,level,igonlevel,icel,ixC^L,ixCC^L,Morton_no
2708 integer :: NumGridsOnLevel(1:nlevelshi)
2709 integer :: nx^D,nxC^D,nodesonlevel,elemsonlevel,nc,np,VTK_type,ix^D
2710 integer:: recsep,k,iw,filenr
2711 integer:: length,lengthcc,offset_points,offset_cells, &
2712 length_coords,length_conn,length_offsets
2713 logical :: fileopen
2714 character:: buf
2715 character(len=6):: bufform
2716 character(len=80) :: pfilename
2717 character(len=name_len) :: wnamei(1:nw+nwauxio),xandwnamei(1:ndim+nw+nwauxio)
2718 character(len=1024) :: outfilehead
2719
2720 ! Write pvtu-file:
2721 if (mype==0) then
2722 call write_pvtu(qunit)
2723 end if
2724 ! Now write the Source files:
2725 inquire(qunit,opened=fileopen)
2726 if(.not.fileopen)then
2727 ! generate filename
2728 filenr=snapshotnext-1
2729 if (autoconvert) filenr=snapshotnext
2730 ! Open the file for the header part
2731 write(pfilename,'(a,i4.4,a,i4.4,a)') trim(base_filename),filenr,"p",mype,".vtu"
2732 open(qunit,file=pfilename,status='unknown',form='formatted')
2733 end if
2734 ! generate xml header
2735 write(qunit,'(a)')'<?xml version="1.0"?>'
2736 write(qunit,'(a)',advance='no') '<VTKFile type="UnstructuredGrid"'
2737 write(qunit,'(a)')' version="0.1" byte_order="LittleEndian">'
2738 write(qunit,'(a)')' <UnstructuredGrid>'
2739 write(qunit,'(a)')'<FieldData>'
2740 write(qunit,'(2a)')'<DataArray type="Float32" Name="TIME" ',&
2741 'NumberOfTuples="1" format="ascii">'
2742 write(qunit,*) real(global_time*time_convert_factor)
2743 write(qunit,'(a)')'</DataArray>'
2744 write(qunit,'(a)')'</FieldData>'
2745 offset=0
2746 recsep=4
2747
2748 call getheadernames(wnamei,xandwnamei,outfilehead)
2749
2750 ! number of cells, number of corner points, per grid.
2751 nx^d=ixmhi^d-ixmlo^d+1;
2752 nxc^d=nx^d+1;
2753 nc={nx^d*}
2754 np={nxc^d*}
2755
2756 length=np*size_real
2757 lengthcc=nc*size_real
2758
2759 length_coords=3*length
2760 length_conn=2**^nd*size_int*nc
2761 length_offsets=nc*size_int
2762
2763 ! Note: using the w_write, writelevel, writespshift
2764 ! we can clip parts of the grid away, select variables, levels etc.
2765 do level=levmin,levmax
2766 if (writelevel(level)) then
2767 do morton_no=morton_start(mype),morton_stop(mype)
2768 igrid=sfc_to_igrid(morton_no)
2769 if (node(plevel_,igrid)/=level) cycle
2770 ! only output a grid when fully within clipped region selected
2771 ! by writespshift array
2772 if (({rnode(rpxmin^d_,igrid)>=xprobmin^d+(xprobmax^d-xprobmin^d)&
2773 *writespshift(^d,1)|.and.}).and.({rnode(rpxmax^d_,igrid)&
2774 <=xprobmax^d-(xprobmax^d-xprobmin^d)*writespshift(^d,2)|.and.})) then
2775 select case(convert_type)
2776 case('pvtuBmpi')
2777 ! we write out every grid as one VTK PIECE
2778 write(qunit,'(a,i7,a,i7,a)') &
2779 '<Piece NumberOfPoints="',np,'" NumberOfCells="',nc,'">'
2780 write(qunit,'(a)')'<PointData>'
2781 do iw=1,nw
2782 if(.not.w_write(iw))cycle
2783
2784 write(qunit,'(a,a,a,i16,a)')&
2785 '<DataArray type="Float32" Name="',trim(wnamei(iw)), &
2786 '" format="appended" offset="',offset,'">'
2787 write(qunit,'(a)')'</DataArray>'
2788 offset=offset+length+size_int
2789 enddo
2790 do iw=nw+1,nw+nwauxio
2791
2792 write(qunit,'(a,a,a,i16,a)')&
2793 '<DataArray type="Float32" Name="',trim(wnamei(iw)), &
2794 '" format="appended" offset="',offset,'">'
2795 write(qunit,'(a)')'</DataArray>'
2796 offset=offset+length+size_int
2797 enddo
2798 write(qunit,'(a)')'</PointData>'
2799
2800 write(qunit,'(a)')'<Points>'
2801 write(qunit,'(a,i16,a)') &
2802 '<DataArray type="Float32" NumberOfComponents="3" format="appended" offset="',offset,'"/>'
2803 ! write cell corner coordinates in a backward dimensional loop, always 3D output
2804 offset=offset+length_coords+size_int
2805 write(qunit,'(a)')'</Points>'
2806 case('pvtuBCCmpi')
2807 ! we write out every grid as one VTK PIECE
2808 write(qunit,'(a,i7,a,i7,a)') &
2809 '<Piece NumberOfPoints="',np,'" NumberOfCells="',nc,'">'
2810 write(qunit,'(a)')'<CellData>'
2811 do iw=1,nw
2812 if(.not.w_write(iw))cycle
2813
2814 write(qunit,'(a,a,a,i16,a)')&
2815 '<DataArray type="Float32" Name="',trim(wnamei(iw)), &
2816 '" format="appended" offset="',offset,'">'
2817 write(qunit,'(a)')'</DataArray>'
2818 offset=offset+lengthcc+size_int
2819 enddo
2820 do iw=nw+1,nw+nwauxio
2821
2822 write(qunit,'(a,a,a,i16,a)')&
2823 '<DataArray type="Float32" Name="',trim(wnamei(iw)), &
2824 '" format="appended" offset="',offset,'">'
2825 write(qunit,'(a)')'</DataArray>'
2826 offset=offset+lengthcc+size_int
2827 enddo
2828 write(qunit,'(a)')'</CellData>'
2829 write(qunit,'(a)')'<Points>'
2830 write(qunit,'(a,i16,a)') &
2831 '<DataArray type="Float32" NumberOfComponents="3" format="appended" offset="',offset,'"/>'
2832 ! write cell corner coordinates in a backward dimensional loop, always 3D output
2833 offset=offset+length_coords+size_int
2834 write(qunit,'(a)')'</Points>'
2835 end select
2836 write(qunit,'(a)')'<Cells>'
2837 ! connectivity part
2838 write(qunit,'(a,i16,a)')&
2839 '<DataArray type="Int32" Name="connectivity" format="appended" offset="',offset,'"/>'
2840 offset=offset+length_conn+size_int
2841 ! offsets data array
2842 write(qunit,'(a,i16,a)') &
2843 '<DataArray type="Int32" Name="offsets" format="appended" offset="',offset,'"/>'
2844 offset=offset+length_offsets+size_int
2845 ! VTK cell type data array
2846 write(qunit,'(a,i16,a)') &
2847 '<DataArray type="Int32" Name="types" format="appended" offset="',offset,'"/>'
2848 offset=offset+size_int+nc*size_int
2849 write(qunit,'(a)')'</Cells>'
2850 write(qunit,'(a)')'</Piece>'
2851 end if
2852 end do
2853 end if
2854 end do
2855
2856 write(qunit,'(a)')'</UnstructuredGrid>'
2857 write(qunit,'(a)')'<AppendedData encoding="raw">'
2858 close(qunit)
2859 ! next to make gfortran compiler happy, as it does not know
2860 ! form='binary' and produces error on compilation
2861 !bufform='binary'
2862 !open(qunit,file=pfilename,form=bufform,position='append')
2863 !This should in principle do also for gfortran (tested with gfortran 4.6.0 and Intel 11.1):
2864 open(qunit,file=pfilename,access='stream',form='unformatted',position='append')
2865 buf='_'
2866 write(qunit) trim(buf)
2867
2868 do level=levmin,levmax
2869 if (writelevel(level)) then
2870 do morton_no=morton_start(mype),morton_stop(mype)
2871 igrid=sfc_to_igrid(morton_no)
2872 if (node(plevel_,igrid)/=level) cycle
2873 ! only output a grid when fully within clipped region selected
2874 ! by writespshift array
2875 if (({rnode(rpxmin^d_,igrid)>=xprobmin^d+(xprobmax^d-xprobmin^d)&
2876 *writespshift(^d,1)|.and.}).and.({rnode(rpxmax^d_,igrid)&
2877 <=xprobmax^d-(xprobmax^d-xprobmin^d)*writespshift(^d,2)|.and.})) then
2878 call calc_x(igrid,xc,xcc)
2879 call calc_grid(qunit,igrid,xc,xcc,xc_tmp,xcc_tmp,wc_tmp,wcc_tmp,normconv,&
2880 ixc^l,ixcc^l,.true.)
2881 do iw=1,nw
2882 if(.not.w_write(iw))cycle
2883 select case(convert_type)
2884 case('pvtuBmpi')
2885 write(qunit) length
2886 write(qunit) {(|}real(wc_tmp(ix^d,iw)*normconv(iw)),{ix^d=ixcmin^d,ixcmax^d)}
2887 case('pvtuBCCmpi')
2888 write(qunit) lengthcc
2889 write(qunit) {(|}real(wcc_tmp(ix^d,iw)*normconv(iw)),{ix^d=ixccmin^d,ixccmax^d)}
2890 end select
2891 enddo
2892 do iw=nw+1,nw+nwauxio
2893 select case(convert_type)
2894 case('pvtuBmpi')
2895 write(qunit) length
2896 write(qunit) {(|}real(wc_tmp(ix^d,iw)*normconv(iw)),{ix^d=ixcmin^d,ixcmax^d)}
2897 case('pvtuBCCmpi')
2898 write(qunit) lengthcc
2899 write(qunit) {(|}real(wcc_tmp(ix^d,iw)*normconv(iw)),{ix^d=ixccmin^d,ixccmax^d)}
2900 end select
2901 enddo
2902 write(qunit) length_coords
2903 {do ix^db=ixcmin^db,ixcmax^db \}
2904 x_vtk(1:3)=zero;
2905 x_vtk(1:ndim)=xc_tmp(ix^d,1:ndim)*normconv(0);
2906 do k=1,3
2907 write(qunit) real(x_vtk(k))
2908 end do
2909 {end do \}
2910 write(qunit) length_conn
2911 {do ix^db=1,nx^db\}
2912 {^ifoned write(qunit)ix1-1,ix1 \}
2913 {^iftwod
2914 write(qunit)(ix2-1)*nxc1+ix1-1, &
2915 (ix2-1)*nxc1+ix1,ix2*nxc1+ix1-1,ix2*nxc1+ix1
2916 \}
2917 {^ifthreed
2918 write(qunit)&
2919 (ix3-1)*nxc2*nxc1+(ix2-1)*nxc1+ix1-1, &
2920 (ix3-1)*nxc2*nxc1+(ix2-1)*nxc1+ix1,&
2921 (ix3-1)*nxc2*nxc1+ ix2*nxc1+ix1-1,&
2922 (ix3-1)*nxc2*nxc1+ ix2*nxc1+ix1,&
2923 ix3*nxc2*nxc1+(ix2-1)*nxc1+ix1-1,&
2924 ix3*nxc2*nxc1+(ix2-1)*nxc1+ix1,&
2925 ix3*nxc2*nxc1+ ix2*nxc1+ix1-1,&
2926 ix3*nxc2*nxc1+ ix2*nxc1+ix1
2927 \}
2928 {end do\}
2929 write(qunit) length_offsets
2930 do icel=1,nc
2931 write(qunit) icel*(2**^nd)
2932 end do
2933 {^ifoned vtk_type=3 \}
2934 {^iftwod vtk_type=8 \}
2935 {^ifthreed vtk_type=11 \}
2936 write(qunit) size_int*nc
2937 do icel=1,nc
2938 write(qunit) vtk_type
2939 end do
2940 end if
2941 end do
2942 end if
2943 end do
2944
2945 close(qunit)
2946 open(qunit,file=pfilename,status='unknown',form='formatted',position='append')
2947 write(qunit,'(a)')'</AppendedData>'
2948 write(qunit,'(a)')'</VTKFile>'
2949 close(qunit)
2950
2951 end subroutine punstructuredvtkb_mpi
2952 {^iftwod
2953 ! subroutines to convert 2.5D data to 3D data
2954 subroutine unstructuredvtkb23(qunit)
2955 ! output for vtu format to paraview, binary version output
2956 ! not parallel, uses calc_grid to compute nwauxio variables
2958 use mod_physics
2960
2961 integer, intent(in) :: qunit
2962
2963 double precision :: x_VTK(1:3)
2964 double precision, dimension(ixMlo1-1:ixMhi1,ixMlo2-1:ixMhi2,ixMlo1& -1:ixMhi1,3) :: xC_TMP
2965 double precision, dimension(ixMlo1:ixMhi1,ixMlo2:ixMhi2,ixMlo1:ixMhi1,& 3) :: xCC_TMP
2966 double precision, dimension(ixMlo1-1:ixMhi1,ixMlo2-1:ixMhi2,ixMlo1& -1:ixMhi1,nw+nwauxio) :: wC_TMP
2967 double precision, dimension(ixMlo1:ixMhi1,ixMlo2:ixMhi2,ixMlo1:ixMhi1,nw& +nwauxio) :: wCC_TMP
2968 double precision, dimension(ixGlo1:ixGhi1,ixGlo2:ixGhi2,ixGlo1:ixGhi1,1:nw& +nwauxio) :: w
2969 double precision :: normconv(0:nw+nwauxio)
2970 double precision :: zlength
2971 double precision ::d3grid,zlengsc,zgridsc
2972 integer*8 :: offset
2973 integer:: igrid,iigrid,level,igonlevel,icel,ixCmin1,ixCmin2,&
2974 ixCmin3,ixCmax1,ixCmax2,ixCmax3,ixCCmin1,ixCCmin2,ixCCmin3,ixCCmax1,&
2975 ixCCmax2,ixCCmax3
2976 integer:: NumGridsOnLevel(1:nlevelshi)
2977 integer :: nx1,nx2,nx3,nxC1,nxC2,nxC3,nodesonlevel,elemsonlevel,nc,np,&
2978 VTK_type,ix1,ix2,ix3
2979 integer :: size_length,recsep,k,iw
2980 integer :: length,lengthcc,offset_points,offset_cells, length_coords,&
2981 length_conn,length_offsets
2982 integer :: i3grid,n3grid
2983 logical :: fileopen
2984 character:: buffer
2985 character(len=6):: bufform
2986 character(len=80):: filename
2987 character(len=name_len) :: wnamei(1:nw+nwauxio),xandwnamei(1:3+nw+nwauxio)
2988 character(len=1024) :: outfilehead
2989
2990 if(npe>1)then
2991 if(mype==0) print *,'unstructuredvtkB23 not parallel, use vtumpi'
2992 call mpistop('npe>1, unstructuredvtkB23')
2993 end if
2994
2995 offset=0
2996 recsep=4
2997 size_length=4
2998 inquire(qunit,opened=fileopen)
2999 if(.not.fileopen)then
3000 ! generate filename
3001 write(filename,'(a,a,i4.4,a)') trim(base_filename),"3D",snapshotini,".vtu"
3002 ! Open the file for the header part
3003 open(qunit,file=filename,status='replace')
3004 endif
3005 call getheadernames(wnamei,xandwnamei,outfilehead)
3006 ! generate xml header
3007 write(qunit,'(a)')'<?xml version="1.0"?>'
3008 write(qunit,'(a)',advance='no') '<VTKFile type="UnstructuredGrid"'
3009 write(qunit,'(a)')' version="0.1" byte_order="LittleEndian">'
3010 write(qunit,'(a)')'<UnstructuredGrid>'
3011 write(qunit,'(a)')'<FieldData>'
3012 write(qunit,'(2a)')'<DataArray type="Float32" Name="TIME" ',&
3013 'NumberOfTuples="1" format="ascii">'
3014 write(qunit,'(f10.2)') real(global_time*time_convert_factor)
3015 write(qunit,'(a)')'</DataArray>'
3016 write(qunit,'(a)')'</FieldData>'
3017
3018 ! number of cells, number of corner points, per grid.
3019 nx1=ixmhi1-ixmlo1+1;nx2=ixmhi2-ixmlo2+1;nx3=ixmhi1-ixmlo1+1;
3020 nxc1=nx1+1;nxc2=nx2+1;nxc3=nx3+1;
3021 nc=nx1*nx2*nx3
3022 np=nxc1*nxc2*nxc3
3023
3024 length=np*size_real
3025 lengthcc=nc*size_real
3026
3027 length_coords=3*length
3028 length_conn=2**3*size_int*nc
3029 length_offsets=nc*size_int
3030
3031 ! Note: using the w_write, writelevel, writespshift
3032 ! we can clip parts of the grid away, select variables, levels etc.
3033 zgridsc=2.d0
3034 zlengsc=2.d0*zgridsc
3035 zlength=zlengsc*(xprobmax1-xprobmin1)
3036 do level=levmin,levmax
3037 if (writelevel(level)) then
3038 do iigrid=1,igridstail; igrid=igrids(iigrid);
3039 if (node(plevel_,igrid)/=level) cycle
3040 block=>ps(igrid)
3041 ! only output a grid when fully within clipped region selected
3042 ! by writespshift array
3043 if ((rnode(rpxmin1_,igrid)>=xprobmin1+(xprobmax1-xprobmin1)&
3044 *writespshift(1,1).and.rnode(rpxmin2_,igrid)>=xprobmin2&
3045 +(xprobmax2-xprobmin2)*writespshift(2,1))&
3046 .and.(rnode(rpxmax1_,igrid)<=xprobmax1-(xprobmax1-xprobmin1)&
3047 *writespshift(1,2).and.rnode(rpxmax2_,igrid)<=xprobmax2-(xprobmax2&
3048 -xprobmin2)*writespshift(2,2))) then
3049 d3grid=zgridsc*(rnode(rpxmax1_,igrid)-rnode(rpxmin1_,igrid))
3050 n3grid=nint(zlength/d3grid)
3051 do i3grid=1,n3grid !subcycles
3052 select case(convert_type)
3053 case('vtuB23')
3054 ! we write out every grid as one VTK PIECE
3055 write(qunit,'(a,i7,a,i7,a)') '<Piece NumberOfPoints="',np,&
3056 '" NumberOfCells="',nc,'">'
3057 write(qunit,'(a)')'<PointData>'
3058 do iw=1,nw
3059 if(.not.w_write(iw))cycle
3060 write(qunit,'(a,a,a,i16,a)')'<DataArray type="Float32" Name="',&
3061 trim(wnamei(iw)), '" format="appended" offset="',offset,'">'
3062 write(qunit,'(a)')'</DataArray>'
3063 offset=offset+length+size_int
3064 enddo
3065 if(nwauxio>0)then
3066 do iw=nw+1,nw+nwauxio
3067 write(qunit,'(a,a,a,i16,a)')'<DataArray type="Float32" Name="',&
3068 trim(wnamei(iw)), '" format="appended" offset="',offset,'">'
3069 write(qunit,'(a)')'</DataArray>'
3070 offset=offset+length+size_int
3071 enddo
3072 endif
3073 write(qunit,'(a)')'</PointData>'
3074
3075 write(qunit,'(a)')'<Points>'
3076 write(qunit,'(a,i16,a)') &
3077 '<DataArray type="Float32" NumberOfComponents="3" format="appended" offset="',&
3078 offset,'"/>'
3079 ! write cell corner coordinates in a backward dimensional loop, always 3D output
3080 offset=offset+length_coords+size_int
3081 write(qunit,'(a)')'</Points>'
3082 case('vtuBCC23')
3083 ! we write out every grid as one VTK PIECE
3084 write(qunit,'(a,i7,a,i7,a)') '<Piece NumberOfPoints="',np,&
3085 '" NumberOfCells="',nc,'">'
3086 write(qunit,'(a)')'<CellData>'
3087 do iw=1,nw
3088 if(.not.w_write(iw))cycle
3089 write(qunit,'(a,a,a,i16,a)')'<DataArray type="Float32" Name="',&
3090 trim(wnamei(iw)), '" format="appended" offset="',offset,'">'
3091 write(qunit,'(a)')'</DataArray>'
3092 offset=offset+lengthcc+size_int
3093 enddo
3094 if(nwauxio>0)then
3095 do iw=nw+1,nw+nwauxio
3096 write(qunit,'(a,a,a,i16,a)')'<DataArray type="Float32" Name="',&
3097 trim(wnamei(iw)), '" format="appended" offset="',offset,'">'
3098 write(qunit,'(a)')'</DataArray>'
3099 offset=offset+lengthcc+size_int
3100 enddo
3101 endif
3102 write(qunit,'(a)')'</CellData>'
3103 write(qunit,'(a)')'<Points>'
3104 write(qunit,'(a,i16,a)') &
3105 '<DataArray type="Float32" NumberOfComponents="3" format="appended" offset="',&
3106 offset,'"/>'
3107 ! write cell corner coordinates in a backward dimensional loop, always 3D output
3108 offset=offset+length_coords+size_int
3109 write(qunit,'(a)')'</Points>'
3110 end select
3111 write(qunit,'(a)')'<Cells>'
3112 ! connectivity part
3113 write(qunit,'(a,i16,a)')&
3114 '<DataArray type="Int32" Name="connectivity" format="appended" offset="',&
3115 offset,'"/>'
3116 offset=offset+length_conn+size_int
3117 ! offsets data array
3118 write(qunit,'(a,i16,a)') &
3119 '<DataArray type="Int32" Name="offsets" format="appended" offset="',&
3120 offset,'"/>'
3121 offset=offset+length_offsets+size_int
3122 ! VTK cell type data array
3123 write(qunit,'(a,i16,a)') &
3124 '<DataArray type="Int32" Name="types" format="appended" offset="',&
3125 offset,'"/>'
3126 offset=offset+size_length+nc*size_int
3127 write(qunit,'(a)')'</Cells>'
3128 write(qunit,'(a)')'</Piece>'
3129 end do !subcycles
3130 end if
3131 end do
3132 end if
3133 end do
3134
3135 write(qunit,'(a)')'</UnstructuredGrid>'
3136 write(qunit,'(a)')'<AppendedData encoding="raw">'
3137 close(qunit)
3138 open(qunit,file=filename,form='unformatted',access='stream',status='old',position='append')
3139 buffer='_'
3140 write(qunit) trim(buffer)
3141
3142 do level=levmin,levmax
3143 if (writelevel(level)) then
3144 do iigrid=1,igridstail; igrid=igrids(iigrid);
3145 if (node(plevel_,igrid)/=level) cycle
3146 block=>ps(igrid)
3147 ! only output a grid when fully within clipped region selected
3148 ! by writespshift array
3149 if ((rnode(rpxmin1_,igrid)>=xprobmin1+(xprobmax1-xprobmin1)&
3150 *writespshift(1,1).and.rnode(rpxmin2_,igrid)>=xprobmin2&
3151 +(xprobmax2-xprobmin2)*writespshift(2,1))&
3152 .and.(rnode(rpxmax1_,igrid)<=xprobmax1-(xprobmax1-xprobmin1)&
3153 *writespshift(1,2).and.rnode(rpxmax2_,igrid)<=xprobmax2-(xprobmax2&
3154 -xprobmin2)*writespshift(2,2))) then
3155 d3grid=zgridsc*(rnode(rpxmax1_,igrid)-rnode(rpxmin1_,igrid))
3156 n3grid=nint(zlength/d3grid)
3157 ! In case primitives to be saved: use primitive subroutine
3158 ! extra layer around mesh only needed when storing corner values and averaging
3159 if(saveprim) then
3160 call phys_to_primitive(ixglo1,ixglo2,ixghi1,ixghi2,&
3161 ixglo1,ixglo2,ixghi1,ixghi2,ps(igrid)%w,ps(igrid)%x)
3162 endif
3163 ! using array w so that new output auxiliaries can be calculated by the user
3164 ! extend 2D data to 3D insuring variables are independent on the third coordinate
3165 do ix3=ixglo1,ixghi1
3166 w(ixglo1:ixghi1,ixglo2:ixghi2,ix3,1:nw)=ps(igrid)%w(ixglo1:ixghi1,&
3167 ixglo2:ixghi2,1:nw)
3168 end do
3169 do i3grid=1,n3grid !subcycles
3170 call calc_grid23(qunit,igrid,xc_tmp,xcc_tmp,wc_tmp,wcc_tmp,normconv,&
3171 ixcmin1,ixcmin2,ixcmin3,ixcmax1,ixcmax2,ixcmax3,ixccmin1,ixccmin2,&
3172 ixccmin3,ixccmax1,ixccmax2,ixccmax3,.true.,i3grid,d3grid,w,zlength,zgridsc)
3173 do iw=1,nw
3174 if(.not.w_write(iw))cycle
3175 select case(convert_type)
3176 case('vtuB23')
3177 write(qunit) length
3178 write(qunit) (((real(wc_tmp(ix1,ix2,ix3,iw)*normconv(iw)),ix1&
3179 =ixcmin1,ixcmax1),ix2=ixcmin2,ixcmax2),ix3=ixcmin3,ixcmax3)
3180 case('vtuBCC23')
3181 write(qunit) lengthcc
3182 write(qunit) (((real(wcc_tmp(ix1,ix2,ix3,iw)*normconv(iw)),ix1&
3183 =ixccmin1,ixccmax1),ix2=ixccmin2,ixccmax2),ix3&
3184 =ixccmin3,ixccmax3)
3185 end select
3186 enddo
3187 if(nwauxio>0)then
3188 do iw=nw+1,nw+nwauxio
3189 select case(convert_type)
3190 case('vtuB23')
3191 write(qunit) length
3192 write(qunit) (((real(wc_tmp(ix1,ix2,ix3,iw)*normconv(iw)),ix1&
3193 =ixcmin1,ixcmax1),ix2=ixcmin2,ixcmax2),ix3=ixcmin3,ixcmax3)
3194 case('vtuBCC23')
3195 write(qunit) lengthcc
3196 write(qunit) (((real(wcc_tmp(ix1,ix2,ix3,iw)*normconv(iw)),ix1&
3197 =ixccmin1,ixccmax1),ix2=ixccmin2,ixccmax2),ix3&
3198 =ixccmin3,ixccmax3)
3199 end select
3200 end do
3201 end if
3202 write(qunit) length_coords
3203 do ix3=ixcmin3,ixcmax3
3204 do ix2=ixcmin2,ixcmax2
3205 do ix1=ixcmin1,ixcmax1
3206 x_vtk(1:3)=zero;
3207 x_vtk(1:3)=xc_tmp(ix1,ix2,ix3,1:3)*normconv(0);
3208 do k=1,3
3209 write(qunit) real(x_vtk(k))
3210 end do
3211 end do
3212 end do
3213 end do
3214 write(qunit) length_conn
3215 do ix3=1,nx3
3216 do ix2=1,nx2
3217 do ix1=1,nx1
3218 write(qunit)&
3219 (ix3-1)*nxc2*nxc1+(ix2-1)*nxc1+ix1-1, &
3220 (ix3-1)*nxc2*nxc1+(ix2-1)*nxc1+ix1,&
3221 (ix3-1)*nxc2*nxc1+ ix2*nxc1+ix1-1,&
3222 (ix3-1)*nxc2*nxc1+ ix2*nxc1+ix1,&
3223 ix3*nxc2*nxc1+(ix2-1)*nxc1+ix1-1,&
3224 ix3*nxc2*nxc1+(ix2-1)*nxc1+ix1,&
3225 ix3*nxc2*nxc1+ ix2*nxc1+ix1-1,&
3226 ix3*nxc2*nxc1+ ix2*nxc1+ix1
3227 end do
3228 end do
3229 end do
3230 write(qunit) length_offsets
3231 do icel=1,nc
3232 write(qunit) icel*(2**3)
3233 end do
3234 vtk_type=11
3235 write(qunit) size_int*nc
3236 do icel=1,nc
3237 write(qunit) vtk_type
3238 end do
3239 end do !subcycles
3240 end if
3241 end do
3242 end if
3243 end do
3244
3245 close(qunit)
3246 open(qunit,file=filename,status='unknown',form='formatted',position='append')
3247
3248 write(qunit,'(a)')'</AppendedData>'
3249 write(qunit,'(a)')'</VTKFile>'
3250 close(qunit)
3251
3252 end subroutine unstructuredvtkb23
3253
3254 subroutine unstructuredvtkbsym23(qunit)
3255 ! output for vtu format to paraview, binary version output
3256 ! not parallel, uses calc_grid to compute nwauxio variables
3257 ! use this subroutine when the physical domain is symmetric/asymmetric about (0,y,z)
3258 ! plane, xprobmin1=0 and the computational domain is a half of the physical domain
3260 use mod_physics
3262
3263 integer, intent(in) :: qunit
3264
3265 double precision :: x_VTK(1:3)
3266 double precision, dimension(ixMlo1-1:ixMhi1,ixMlo2-1:ixMhi2,ixMlo1& -1:ixMhi1,3) :: xC_TMP
3267 double precision, dimension(ixMlo1:ixMhi1,ixMlo2:ixMhi2,ixMlo1:ixMhi1,& 3) :: xCC_TMP
3268 double precision, dimension(ixMlo1-1:ixMhi1,ixMlo2-1:ixMhi2,ixMlo1& -1:ixMhi1,nw+nwauxio) :: wC_TMP
3269 double precision, dimension(ixMlo1:ixMhi1,ixMlo2:ixMhi2,ixMlo1:ixMhi1,nw& +nwauxio) :: wCC_TMP
3270 double precision, dimension(ixGlo1:ixGhi1,ixGlo2:ixGhi2,ixGlo1:ixGhi1,1:nw& +nwauxio) :: w
3271 double precision :: normconv(0:nw+nwauxio)
3272 double precision ::d3grid,zlengsc,zgridsc
3273 double precision :: zlength
3274 integer*8 :: offset
3275 integer:: igrid,iigrid,level,igonlevel,icel,ixCmin1,ixCmin2,&
3276 ixCmin3,ixCmax1,ixCmax2,ixCmax3,ixCCmin1,ixCCmin2,ixCCmin3,ixCCmax1,&
3277 ixCCmax2,ixCCmax3
3278 integer:: NumGridsOnLevel(1:nlevelshi)
3279 integer :: nx1,nx2,nx3,nxC1,nxC2,nxC3,nodesonlevel,elemsonlevel,nc,np,&
3280 VTK_type,ix1,ix2,ix3
3281 integer :: size_length,recsep,k,iw
3282 integer :: length,lengthcc,offset_points,offset_cells, length_coords,&
3283 length_conn,length_offsets
3284 integer :: i3grid,n3grid
3285 logical :: fileopen
3286 character(len=80):: filename
3287 character(len=name_len) :: wnamei(1:nw+nwauxio),xandwnamei(1:3+nw+nwauxio)
3288 character(len=1024) :: outfilehead
3289 character:: buffer
3290 character(len=6):: bufform
3291
3292 if(npe>1)then
3293 if(mype==0) print *,'unstructuredvtkBsym23 not parallel, use vtumpi'
3294 call mpistop('npe>1, unstructuredvtkBsym23')
3295 end if
3296
3297 offset=0
3298 recsep=4
3299 size_length=4
3300
3301 inquire(qunit,opened=fileopen)
3302 if(.not.fileopen)then
3303 ! generate filename
3304 write(filename,'(a,a,i4.4,a)') trim(base_filename),"3D",snapshotini,".vtu"
3305 ! Open the file for the header part
3306 open(qunit,file=filename,status='unknown')
3307 end if
3308
3309 call getheadernames(wnamei,xandwnamei,outfilehead)
3310 ! generate xml header
3311 write(qunit,'(a)')'<?xml version="1.0"?>'
3312 write(qunit,'(a)',advance='no') '<VTKFile type="UnstructuredGrid"'
3313 write(qunit,'(a)')' version="0.1" byte_order="LittleEndian">'
3314 write(qunit,'(a)')'<UnstructuredGrid>'
3315 write(qunit,'(a)')'<FieldData>'
3316 write(qunit,'(2a)')'<DataArray type="Float32" Name="TIME" ',&
3317 'NumberOfTuples="1" format="ascii">'
3318 write(qunit,'(f10.2)') real(global_time*time_convert_factor)
3319 write(qunit,'(a)')'</DataArray>'
3320 write(qunit,'(a)')'</FieldData>'
3321
3322 ! number of cells, number of corner points, per grid.
3323 nx1=ixmhi1-ixmlo1+1;nx2=ixmhi2-ixmlo2+1;nx3=ixmhi1-ixmlo1+1;
3324 nxc1=nx1+1;nxc2=nx2+1;nxc3=nx3+1;
3325 nc=nx1*nx2*nx3
3326 np=nxc1*nxc2*nxc3
3327
3328 length=np*size_real
3329 lengthcc=nc*size_real
3330
3331 length_coords=3*length
3332 length_conn=2**3*size_int*nc
3333 length_offsets=nc*size_int
3334
3335 ! Note: using the w_write, writelevel, writespshift
3336 ! we can clip parts of the grid away, select variables, levels etc.
3337 zlengsc=4.d0
3338 zgridsc=2.d0
3339 zlength=zlengsc*(xprobmax1-xprobmin1)
3340 do level=levmin,levmax
3341 if (writelevel(level)) then
3342 do iigrid=1,igridstail; igrid=igrids(iigrid);
3343 if (node(plevel_,igrid)/=level) cycle
3344 block=>ps(igrid)
3345 ! only output a grid when fully within clipped region selected
3346 ! by writespshift array
3347 if ((rnode(rpxmin1_,igrid)>=xprobmin1+(xprobmax1-xprobmin1)&
3348 *writespshift(1,1).and.rnode(rpxmin2_,igrid)>=xprobmin2&
3349 +(xprobmax2-xprobmin2)*writespshift(2,1))&
3350 .and.(rnode(rpxmax1_,igrid)<=xprobmax1-(xprobmax1-xprobmin1)&
3351 *writespshift(1,2).and.rnode(rpxmax2_,igrid)<=xprobmax2-(xprobmax2&
3352 -xprobmin2)*writespshift(2,2))) then
3353 d3grid=zgridsc*(rnode(rpxmax1_,igrid)-rnode(rpxmin1_,igrid))
3354 n3grid=nint(zlength/d3grid)
3355 do i3grid=1,n3grid !subcycles
3356 !! original domain ----------------------------------start
3357 select case(convert_type)
3358 case('vtuBsym23')
3359 ! we write out every grid as one VTK PIECE
3360 write(qunit,'(a,i7,a,i7,a)') '<Piece NumberOfPoints="',np,&
3361 '" NumberOfCells="',nc,'">'
3362 write(qunit,'(a)')'<PointData>'
3363 do iw=1,nw
3364 if(.not.w_write(iw))cycle
3365 write(qunit,'(a,a,a,i16,a)')'<DataArray type="Float32" Name="',&
3366 trim(wnamei(iw)), '" format="appended" offset="',offset,'">'
3367 write(qunit,'(a)')'</DataArray>'
3368 offset=offset+length+size_length
3369 enddo
3370 if(nwauxio>0)then
3371 do iw=nw+1,nw+nwauxio
3372 write(qunit,'(a,a,a,i16,a)')'<DataArray type="Float32" Name="',&
3373 trim(wnamei(iw)), '" format="appended" offset="',offset,'">'
3374 write(qunit,'(a)')'</DataArray>'
3375 offset=offset+length+size_length
3376 enddo
3377 endif
3378 write(qunit,'(a)')'</PointData>'
3379 write(qunit,'(a)')'<Points>'
3380 write(qunit,'(a,i16,a)') &
3381 '<DataArray type="Float32" NumberOfComponents="3" format="appended" offset="',&
3382 offset,'"/>'
3383 ! write cell corner coordinates in a backward dimensional loop, always 3D output
3384 offset=offset+length_coords+size_length
3385 write(qunit,'(a)')'</Points>'
3386 case('vtuBCCsym23')
3387 ! we write out every grid as one VTK PIECE
3388 write(qunit,'(a,i7,a,i7,a)') '<Piece NumberOfPoints="',np,&
3389 '" NumberOfCells="',nc,'">'
3390 write(qunit,'(a)')'<CellData>'
3391 do iw=1,nw
3392 if(.not.w_write(iw))cycle
3393 write(qunit,'(a,a,a,i16,a)')'<DataArray type="Float32" Name="',&
3394 trim(wnamei(iw)), '" format="appended" offset="',offset,'">'
3395 write(qunit,'(a)')'</DataArray>'
3396 offset=offset+lengthcc+size_length
3397 enddo
3398 if(nwauxio>0)then
3399 do iw=nw+1,nw+nwauxio
3400 write(qunit,'(a,a,a,i16,a)')'<DataArray type="Float32" Name="',&
3401 trim(wnamei(iw)), '" format="appended" offset="',offset,'">'
3402 write(qunit,'(a)')'</DataArray>'
3403 offset=offset+lengthcc+size_length
3404 enddo
3405 endif
3406 write(qunit,'(a)')'</CellData>'
3407
3408 write(qunit,'(a)')'<Points>'
3409 write(qunit,'(a,i16,a)') &
3410 '<DataArray type="Float32" NumberOfComponents="3" format="appended" offset="',&
3411 offset,'"/>'
3412 ! write cell corner coordinates in a backward dimensional loop, always 3D output
3413 offset=offset+length_coords+size_length
3414 write(qunit,'(a)')'</Points>'
3415 end select
3416 write(qunit,'(a)')'<Cells>'
3417 ! connectivity part
3418 write(qunit,'(a,i16,a)')&
3419 '<DataArray type="Int32" Name="connectivity" format="appended" offset="',&
3420 offset,'"/>'
3421 offset=offset+length_conn+size_length
3422 ! offsets data array
3423 write(qunit,'(a,i16,a)') &
3424 '<DataArray type="Int32" Name="offsets" format="appended" offset="',&
3425 offset,'"/>'
3426 offset=offset+length_offsets+size_length
3427 ! VTK cell type data array
3428 write(qunit,'(a,i16,a)') &
3429 '<DataArray type="Int32" Name="types" format="appended" offset="',&
3430 offset,'"/>'
3431 offset=offset+size_length+nc*size_int
3432 write(qunit,'(a)')'</Cells>'
3433 write(qunit,'(a)')'</Piece>'
3434 !! original domain ----------------------------------end
3435 !! symetric/asymetric mirror domain -----------------start
3436 select case(convert_type)
3437 case('vtuBsym23')
3438 ! we write out every grid as one VTK PIECE
3439 write(qunit,'(a,i7,a,i7,a)') '<Piece NumberOfPoints="',np,&
3440 '" NumberOfCells="',nc,'">'
3441 write(qunit,'(a)')'<PointData>'
3442 do iw=1,nw
3443 if(.not.w_write(iw))cycle
3444 write(qunit,'(a,a,a,i16,a)')'<DataArray type="Float32" Name="',&
3445 trim(wnamei(iw)), '" format="appended" offset="',offset,'">'
3446 write(qunit,'(a)')'</DataArray>'
3447 offset=offset+length+size_length
3448 enddo
3449 if(nwauxio>0)then
3450 do iw=nw+1,nw+nwauxio
3451 write(qunit,'(a,a,a,i16,a)')'<DataArray type="Float32" Name="',&
3452 trim(wnamei(iw)), '" format="appended" offset="',offset,'">'
3453 write(qunit,'(a)')'</DataArray>'
3454 offset=offset+length+size_length
3455 enddo
3456 endif
3457 write(qunit,'(a)')'</PointData>'
3458 write(qunit,'(a)')'<Points>'
3459 write(qunit,'(a,i16,a)') &
3460 '<DataArray type="Float32" NumberOfComponents="3" format="appended" offset="',&
3461 offset,'"/>'
3462 ! write cell corner coordinates in a backward dimensional loop, always 3D output
3463 offset=offset+length_coords+size_length
3464 write(qunit,'(a)')'</Points>'
3465 case('vtuBCCsym23')
3466 ! we write out every grid as one VTK PIECE
3467 write(qunit,'(a,i7,a,i7,a)') '<Piece NumberOfPoints="',np,&
3468 '" NumberOfCells="',nc,'">'
3469 write(qunit,'(a)')'<CellData>'
3470 do iw=1,nw
3471 if(.not.w_write(iw))cycle
3472 write(qunit,'(a,a,a,i16,a)')'<DataArray type="Float32" Name="',&
3473 trim(wnamei(iw)), '" format="appended" offset="',offset,'">'
3474 write(qunit,'(a)')'</DataArray>'
3475 offset=offset+lengthcc+size_length
3476 enddo
3477 if(nwauxio>0)then
3478 do iw=nw+1,nw+nwauxio
3479 write(qunit,'(a,a,a,i16,a)')'<DataArray type="Float32" Name="',&
3480 trim(wnamei(iw)), '" format="appended" offset="',offset,'">'
3481 write(qunit,'(a)')'</DataArray>'
3482 offset=offset+lengthcc+size_length
3483 enddo
3484 endif
3485 write(qunit,'(a)')'</CellData>'
3486 write(qunit,'(a)')'<Points>'
3487 write(qunit,'(a,i16,a)') &
3488 '<DataArray type="Float32" NumberOfComponents="3" format="appended" offset="',&
3489 offset,'"/>'
3490 ! write cell corner coordinates in a backward dimensional loop, always 3D output
3491 offset=offset+length_coords+size_length
3492 write(qunit,'(a)')'</Points>'
3493 end select
3494 write(qunit,'(a)')'<Cells>'
3495 ! connectivity part
3496 write(qunit,'(a,i16,a)')&
3497 '<DataArray type="Int32" Name="connectivity" format="appended" offset="',&
3498 offset,'"/>'
3499 offset=offset+length_conn+size_length
3500 ! offsets data array
3501 write(qunit,'(a,i16,a)') &
3502 '<DataArray type="Int32" Name="offsets" format="appended" offset="',&
3503 offset,'"/>'
3504 offset=offset+length_offsets+size_length
3505 ! VTK cell type data array
3506 write(qunit,'(a,i16,a)') &
3507 '<DataArray type="Int32" Name="types" format="appended" offset="',&
3508 offset,'"/>'
3509 offset=offset+size_length+nc*size_int
3510 write(qunit,'(a)')'</Cells>'
3511 write(qunit,'(a)')'</Piece>'
3512 !! symetric/asymetric mirror domain -----------------end
3513 end do !subcycles
3514 end if
3515 end do
3516 end if
3517 end do
3518
3519 write(qunit,'(a)')'</UnstructuredGrid>'
3520 write(qunit,'(a)')'<AppendedData encoding="raw">'
3521 close(qunit)
3522 open(qunit,file=filename,form='unformatted',access='stream',status='old',position='append')
3523 buffer='_'
3524 write(qunit) trim(buffer)
3525 do level=levmin,levmax
3526 if (writelevel(level)) then
3527 do iigrid=1,igridstail; igrid=igrids(iigrid);
3528 if (node(plevel_,igrid)/=level) cycle
3529 block=>ps(igrid)
3530 ! only output a grid when fully within clipped region selected
3531 ! by writespshift array
3532 if ((rnode(rpxmin1_,igrid)>=xprobmin1+(xprobmax1-xprobmin1)&
3533 *writespshift(1,1).and.rnode(rpxmin2_,igrid)>=xprobmin2&
3534 +(xprobmax2-xprobmin2)*writespshift(2,1))&
3535 .and.(rnode(rpxmax1_,igrid)<=xprobmax1-(xprobmax1-xprobmin1)&
3536 *writespshift(1,2).and.rnode(rpxmax2_,igrid)<=xprobmax2-(xprobmax2&
3537 -xprobmin2)*writespshift(2,2))) then
3538 d3grid=zgridsc*(rnode(rpxmax1_,igrid)-rnode(rpxmin1_,igrid))
3539 n3grid=nint(zlength/d3grid)
3540 ! In case primitives to be saved: use primitive subroutine
3541 ! extra layer around mesh only needed when storing corner values and averaging
3542 if(saveprim) then
3543 call phys_to_primitive(ixglo1,ixglo2,ixghi1,ixghi2,&
3544 ixglo1,ixglo2,ixghi1,ixghi2,ps(igrid)%w,ps(igrid)%x)
3545 endif
3546 ! using array w so that new output auxiliaries can be calculated by the user
3547 ! extend 2D data to 3D insuring variables are independent on the third coordinate
3548 do ix3=ixglo1,ixghi1
3549 w(ixglo1:ixghi1,ixglo2:ixghi2,ix3,1:nw)=ps(igrid)%w(ixglo1:ixghi1,&
3550 ixglo2:ixghi2,1:nw)
3551 end do
3552 do i3grid=1,n3grid !subcycles
3553 call calc_grid23(qunit,igrid,xc_tmp,xcc_tmp,wc_tmp,wcc_tmp,normconv,&
3554 ixcmin1,ixcmin2,ixcmin3,ixcmax1,ixcmax2,ixcmax3,ixccmin1,ixccmin2,&
3555 ixccmin3,ixccmax1,ixccmax2,ixccmax3,.true.,i3grid,d3grid,w,zlength,zgridsc)
3556 !! original domain ----------------------------------start
3557 do iw=1,nw
3558 if(.not.w_write(iw))cycle
3559 select case(convert_type)
3560 case('vtuBsym23')
3561 write(qunit) length
3562 write(qunit) (((real(wc_tmp(ix1,ix2,ix3,iw)*normconv(iw)),ix1&
3563 =ixcmin1,ixcmax1),ix2=ixcmin2,ixcmax2),ix3=ixcmin3,ixcmax3)
3564 case('vtuBCCsym23')
3565 write(qunit) lengthcc
3566 write(qunit) (((real(wcc_tmp(ix1,ix2,ix3,iw)*normconv(iw)),ix1&
3567 =ixccmin1,ixccmax1),ix2=ixccmin2,ixccmax2),ix3&
3568 =ixccmin3,ixccmax3)
3569 end select
3570 enddo
3571 if(nwauxio>0)then
3572 do iw=nw+1,nw+nwauxio
3573 select case(convert_type)
3574 case('vtuBsym23')
3575 write(qunit) length
3576 write(qunit) (((real(wc_tmp(ix1,ix2,ix3,iw)*normconv(iw)),ix1&
3577 =ixcmin1,ixcmax1),ix2=ixcmin2,ixcmax2),ix3=ixcmin3,ixcmax3)
3578 case('vtuBCCsym23')
3579 write(qunit) lengthcc
3580 write(qunit) (((real(wcc_tmp(ix1,ix2,ix3,iw)*normconv(iw)),ix1&
3581 =ixccmin1,ixccmax1),ix2=ixccmin2,ixccmax2),ix3&
3582 =ixccmin3,ixccmax3)
3583 end select
3584 enddo
3585 endif
3586 write(qunit) length_coords
3587 do ix3=ixcmin3,ixcmax3
3588 do ix2=ixcmin2,ixcmax2
3589 do ix1=ixcmin1,ixcmax1
3590 x_vtk(1:3)=zero;
3591 x_vtk(1:3)=xc_tmp(ix1,ix2,ix3,1:3)*normconv(0);
3592 do k=1,3
3593 write(qunit) real(x_vtk(k))
3594 end do
3595 end do
3596 end do
3597 end do
3598 write(qunit) length_conn
3599 do ix3=1,nx3
3600 do ix2=1,nx2
3601 do ix1=1,nx1
3602 write(qunit)&
3603 (ix3-1)*nxc2*nxc1+(ix2-1)*nxc1+ix1-1, &
3604 (ix3-1)*nxc2*nxc1+(ix2-1)*nxc1+ix1,&
3605 (ix3-1)*nxc2*nxc1+ ix2*nxc1+ix1-1,&
3606 (ix3-1)*nxc2*nxc1+ ix2*nxc1+ix1,&
3607 ix3*nxc2*nxc1+(ix2-1)*nxc1+ix1-1,&
3608 ix3*nxc2*nxc1+(ix2-1)*nxc1+ix1,&
3609 ix3*nxc2*nxc1+ ix2*nxc1+ix1-1,&
3610 ix3*nxc2*nxc1+ ix2*nxc1+ix1
3611 end do
3612 end do
3613 end do
3614 write(qunit) length_offsets
3615 do icel=1,nc
3616 write(qunit) icel*(2**3)
3617 end do
3618 vtk_type=11
3619 write(qunit) size_int*nc
3620 do icel=1,nc
3621 write(qunit) vtk_type
3622 end do
3623 !! original domain ----------------------------------end
3624 !! symetric/asymetric mirror domain -----------------start
3625 do iw=1,nw
3626 if(.not.w_write(iw))cycle
3627 if(iw==2 .or. iw==4 .or. iw==7) then
3628 wc_tmp(ixcmin1:ixcmax1,ixcmin2:ixcmax2,ixcmin3:ixcmax3,iw)=&
3629 -wc_tmp(ixcmin1:ixcmax1,ixcmin2:ixcmax2,ixcmin3:ixcmax3,iw)
3630 wcc_tmp(ixccmin1:ixccmax1,ixccmin2:ixccmax2,ixccmin3:ixccmax3,iw)=&
3631 -wcc_tmp(ixccmin1:ixccmax1,ixccmin2:ixccmax2,ixccmin3:ixccmax3,iw)
3632 end if
3633 select case(convert_type)
3634 case('vtuBsym23')
3635 write(qunit) length
3636 write(qunit) (((real(wc_tmp(ix1,ix2,ix3,iw)*normconv(iw)),ix1&
3637 =ixcmax1,ixcmin1,-1),ix2=ixcmin2,ixcmax2),ix3=ixcmin3,ixcmax3)
3638 case('vtuBCCsym23')
3639 write(qunit) lengthcc
3640 write(qunit) (((real(wcc_tmp(ix1,ix2,ix3,iw)*normconv(iw)),ix1&
3641 =ixccmin1,ixccmax1),ix2=ixccmin2,ixccmax2),ix3&
3642 =ixccmin3,ixccmax3)
3643 end select
3644 enddo
3645 if(nwauxio>0)then
3646 do iw=nw+1,nw+nwauxio
3647 select case(convert_type)
3648 case('vtuBsym23')
3649 write(qunit) length
3650 write(qunit) (((real(wc_tmp(ix1,ix2,ix3,iw)*normconv(iw)),ix1&
3651 =ixcmax1,ixcmin1,-1),ix2=ixcmin2,ixcmax2),ix3=ixcmin3,ixcmax3)
3652 case('vtuBCCsym23')
3653 write(qunit) lengthcc
3654 write(qunit) (((real(wcc_tmp(ix1,ix2,ix3,iw)*normconv(iw)),ix1&
3655 =ixccmin1,ixccmax1),ix2=ixccmin2,ixccmax2),ix3&
3656 =ixccmin3,ixccmax3)
3657 end select
3658 end do
3659 end if
3660 write(qunit) length_coords
3661 do ix3=ixcmin3,ixcmax3
3662 do ix2=ixcmin2,ixcmax2
3663 do ix1=ixcmax1,ixcmin1,-1
3664 x_vtk(1:3)=zero;
3665 x_vtk(1:3)=xc_tmp(ix1,ix2,ix3,1:3)*normconv(0);
3666 x_vtk(1)=-x_vtk(1)
3667 do k=1,3
3668 write(qunit) real(x_vtk(k))
3669 end do
3670 end do
3671 end do
3672 end do
3673 write(qunit) length_conn
3674 do ix3=1,nx3
3675 do ix2=1,nx2
3676 do ix1=nx1,1,-1
3677 write(qunit)&
3678 (ix3-1)*nxc2*nxc1+(ix2-1)*nxc1+ix1-1, &
3679 (ix3-1)*nxc2*nxc1+(ix2-1)*nxc1+ix1,&
3680 (ix3-1)*nxc2*nxc1+ ix2*nxc1+ix1-1,&
3681 (ix3-1)*nxc2*nxc1+ ix2*nxc1+ix1,&
3682 ix3*nxc2*nxc1+(ix2-1)*nxc1+ix1-1,&
3683 ix3*nxc2*nxc1+(ix2-1)*nxc1+ix1,&
3684 ix3*nxc2*nxc1+ ix2*nxc1+ix1-1,&
3685 ix3*nxc2*nxc1+ ix2*nxc1+ix1
3686 end do
3687 end do
3688 end do
3689 write(qunit) length_offsets
3690 do icel=1,nc
3691 write(qunit) icel*(2**3)
3692 end do
3693 vtk_type=11
3694 write(qunit) size_int*nc
3695 do icel=1,nc
3696 write(qunit) vtk_type
3697 end do
3698 !! symetric/asymetric mirror domain -----------------end
3699 end do !subcycles
3700 end if
3701 end do
3702 end if
3703 end do
3704 close(qunit)
3705 open(qunit,file=filename,status='unknown',form='formatted',position='append')
3706 write(qunit,'(a)')'</AppendedData>'
3707 write(qunit,'(a)')'</VTKFile>'
3708 close(qunit)
3709
3710 end subroutine unstructuredvtkbsym23
3711
3712 subroutine calc_grid23(qunit,igrid,xC_TMP,xCC_TMP,wC_TMP,wCC_TMP,normconv,&
3713 ixCmin1,ixCmin2,ixCmin3,ixCmax1,ixCmax2,ixCmax3,ixCCmin1,ixCCmin2,ixCCmin3,&
3714 ixCCmax1,ixCCmax2,ixCCmax3,first,i3grid,d3grid,w,zlength,zgridsc)
3715 ! this subroutine computes both corner as well as cell-centered values
3716 ! it handles how we do the center to corner averaging, as well as
3717 ! whether we switch to cartesian or want primitive or conservative output,
3718 ! handling the addition of B0 in B0+B1 cases, ...
3719 ! the normconv is passed on to specialvar_output for extending with
3720 ! possible normalization values for the nw+1:nw+nwauxio entries
3722 integer, intent(in) :: qunit, igrid,i3grid
3723 logical, intent(in) :: first
3724
3725 double precision :: dx1,dx2,dx3,d3grid,zlength,zgridsc
3726 double precision :: ldw(ixGlo1:ixGhi1,ixGlo2:ixGhi2,ixGlo1:ixGhi1),&
3727 dwC(ixGlo1:ixGhi1,ixGlo2:ixGhi2,ixGlo1:ixGhi1)
3728 double precision, dimension(ixMlo1-1:ixMhi1,ixMlo2-1:ixMhi2,ixMlo1& -1:ixMhi1,3) :: xC
3729 double precision, dimension(ixMlo1:ixMhi1,ixMlo2:ixMhi2,ixMlo1:ixMhi1,& 3) :: xCC
3730 double precision, dimension(ixMlo1-1:ixMhi1,ixMlo2-1:ixMhi2,ixMlo1& -1:ixMhi1,nw+nwauxio) :: wC
3731 double precision, dimension(ixMlo1:ixMhi1,ixMlo2:ixMhi2,ixMlo1:ixMhi1,nw& +nwauxio) :: wCC
3732 double precision, dimension(ixMlo1-1:ixMhi1,ixMlo2-1:ixMhi2,ixMlo1& -1:ixMhi1,3) :: xC_TMP
3733 double precision, dimension(ixMlo1:ixMhi1,ixMlo2:ixMhi2,ixMlo1:ixMhi1,& 3) :: xCC_TMP
3734 double precision, dimension(ixMlo1-1:ixMhi1,ixMlo2-1:ixMhi2,ixMlo1& -1:ixMhi1,nw+nwauxio) :: wC_TMP
3735 double precision, dimension(ixMlo1:ixMhi1,ixMlo2:ixMhi2,ixMlo1:ixMhi1,nw& +nwauxio) :: wCC_TMP
3736 double precision, dimension(ixGlo1:ixGhi1,ixGlo2:ixGhi2,ixGlo1:ixGhi1,1:nw& +nwauxio) :: w
3737 double precision,dimension(0:nw+nwauxio) :: normconv
3738 integer :: nx1,nx2,nx3, nxC1,nxC2,nxC3, ix1,ix2,ix3, ix, iw, level, idir
3739 integer :: ixCmin1,ixCmin2,ixCmin3,ixCmax1,ixCmax2,ixCmax3,ixCCmin1,&
3740 ixCCmin2,ixCCmin3,ixCCmax1,ixCCmax2,ixCCmax3,nxCC1,nxCC2,nxCC3
3741 integer :: idims,jxCmin1,jxCmin2,jxCmin3,jxCmax1,jxCmax2,jxCmax3
3742 logical, save :: subfirst=.true.
3743
3744 ! following only for allowing compiler to go through with debug on
3745 nx1=ixmhi1-ixmlo1+1;nx2=ixmhi2-ixmlo2+1;nx3=ixmhi1-ixmlo1+1;
3746 level=node(plevel_,igrid)
3747 dx1=dx(1,level);dx2=dx(2,level);dx3=zgridsc*dx(1,level);
3748 ! for normalization within the code
3749 if(saveprim) then
3750 normconv(0) = length_convert_factor
3751 normconv(1:nw) = w_convert_factor
3752 else
3753 normconv(0)=length_convert_factor
3754 ! assuming density
3755 normconv(1)=w_convert_factor(1)
3756 ! assuming momentum=density*velocity
3757 if (nw>=2) normconv(2:2+3)=w_convert_factor(1)*w_convert_factor(2:2+3)
3758 ! assuming energy/pressure and magnetic field
3759 if (nw>=2+3) normconv(2+3:nw)=w_convert_factor(2+3:nw)
3760 end if
3761 ! coordinates of cell centers
3762 nxcc1=nx1;nxcc2=nx2;nxcc3=nx3;
3763 ixccmin1=ixmlo1;ixccmin2=ixmlo2;ixccmin3=ixmlo1; ixccmax1=ixmhi1
3764 ixccmax2=ixmhi2;ixccmax3=ixmhi1;
3765 do ix=ixccmin1,ixccmax1
3766 xcc(ix,ixccmin2:ixccmax2,ixccmin3:ixccmax3,1)=rnode(rpxmin1_,igrid)&
3767 +(dble(ix-ixccmin1)+half)*dx1
3768 end do
3769 do ix=ixccmin2,ixccmax2
3770 xcc(ixccmin1:ixccmax1,ix,ixccmin3:ixccmax3,2)=rnode(rpxmin2_,igrid)&
3771 +(dble(ix-ixccmin2)+half)*dx2
3772 end do
3773 do ix=ixccmin3,ixccmax3
3774 xcc(ixccmin1:ixccmax1,ixccmin2:ixccmax2,ix,3)=-zlength/two+&
3775 dble(i3grid-1)*d3grid+(dble(ix-ixccmin3)+half)*dx3
3776 end do
3777
3778 ! coordinates of cell corners
3779 nxc1=nx1+1;nxc2=nx2+1;nxc3=nx3+1;
3780 ixcmin1=ixmlo1-1;ixcmin2=ixmlo2-1;ixcmin3=ixmlo1-1; ixcmax1=ixmhi1
3781 ixcmax2=ixmhi2;ixcmax3=ixmhi1;
3782 do ix=ixcmin1,ixcmax1
3783 xc(ix,ixcmin2:ixcmax2,ixcmin3:ixcmax3,1)=rnode(rpxmin1_,igrid)&
3784 +dble(ix-ixcmin1)*dx1
3785 end do
3786 do ix=ixcmin2,ixcmax2
3787 xc(ixcmin1:ixcmax1,ix,ixcmin3:ixcmax3,2)=rnode(rpxmin2_,igrid)&
3788 +dble(ix-ixcmin2)*dx2
3789 end do
3790 do ix=ixcmin3,ixcmax3
3791 xc(ixcmin1:ixcmax1,ixcmin2:ixcmax2,ix,3)=-zlength/two+&
3792 dble(i3grid-1)*d3grid+dble(ix-ixcmin3)*dx3
3793 end do
3794
3795 if (nwextra>0) then
3796 ! here we actually fill the ghost layers for the nwextra variables using
3797 ! continuous extrapolation (as these values do not exist normally in ghost
3798 ! cells)
3799 do idims=1,3
3800 select case(idims)
3801 case(1)
3802 jxcmin1=ixghi1+1-nghostcells;jxcmin2=ixglo2;jxcmin3=ixglo1;
3803 jxcmax1=ixghi1;jxcmax2=ixghi2;jxcmax3=ixghi1;
3804 do ix1=jxcmin1,jxcmax1
3805 w(ix1,jxcmin2:jxcmax2,jxcmin3:jxcmax3,nw-nwextra+1:nw) = w(jxcmin1&
3806 -1,jxcmin2:jxcmax2,jxcmin3:jxcmax3,nw-nwextra+1:nw)
3807 end do
3808 jxcmin1=ixglo1;jxcmin2=ixglo2;jxcmin3=ixglo1;
3809 jxcmax1=ixglo1-1+nghostcells;jxcmax2=ixghi2;jxcmax3=ixghi1;
3810 do ix1=jxcmin1,jxcmax1
3811 w(ix1,jxcmin2:jxcmax2,jxcmin3:jxcmax3,nw-nwextra+1:nw) = w(jxcmax1&
3812 +1,jxcmin2:jxcmax2,jxcmin3:jxcmax3,nw-nwextra+1:nw)
3813 end do
3814 case(2)
3815 jxcmin1=ixglo1;jxcmin2=ixghi2+1-nghostcells;jxcmin3=ixglo1;
3816 jxcmax1=ixghi1;jxcmax2=ixghi2;jxcmax3=ixghi1;
3817 do ix2=jxcmin2,jxcmax2
3818 w(jxcmin1:jxcmax1,ix2,jxcmin3:jxcmax3,nw-nwextra+1:nw) &
3819 = w(jxcmin1:jxcmax1,jxcmin2-1,jxcmin3:jxcmax3,nw-nwextra+1:nw)
3820 end do
3821 jxcmin1=ixglo1;jxcmin2=ixglo2;jxcmin3=ixglo1;
3822 jxcmax1=ixghi1;jxcmax2=ixglo2-1+nghostcells;jxcmax3=ixghi1;
3823 do ix2=jxcmin2,jxcmax2
3824 w(jxcmin1:jxcmax1,ix2,jxcmin3:jxcmax3,nw-nwextra+1:nw) &
3825 = w(jxcmin1:jxcmax1,jxcmax2+1,jxcmin3:jxcmax3,nw-nwextra+1:nw)
3826 end do
3827 case(3)
3828 jxcmin1=ixglo1;jxcmin2=ixglo2;jxcmin3=ixghi1+1-nghostcells;
3829 jxcmax1=ixghi1;jxcmax2=ixghi2;jxcmax3=ixghi1;
3830 do ix3=jxcmin3,jxcmax3
3831 w(jxcmin1:jxcmax1,jxcmin2:jxcmax2,ix3,nw-nwextra+1:nw) &
3832 = w(jxcmin1:jxcmax1,jxcmin2:jxcmax2,jxcmin3-1,nw-nwextra+1:nw)
3833 end do
3834 jxcmin1=ixglo1;jxcmin2=ixglo2;jxcmin3=ixglo1;
3835 jxcmax1=ixghi1;jxcmax2=ixghi2;jxcmax3=ixglo1-1+nghostcells;
3836 do ix3=jxcmin3,jxcmax3
3837 w(jxcmin1:jxcmax1,jxcmin2:jxcmax2,ix3,nw-nwextra+1:nw) &
3838 = w(jxcmin1:jxcmax1,jxcmin2:jxcmax2,jxcmax3+1,nw-nwextra+1:nw)
3839 end do
3840 end select
3841 end do
3842 end if
3843 ! next lines needed when specialvar_output uses gradients
3844 ! and later on when dwlimiter2 is used
3845 if(nwauxio>0)then
3846 ! auxiliary io variables can be computed and added by user
3847 ! next few lines ensure correct usage of routines like divvector etc
3848 dxlevel(1)=rnode(rpdx1_,igrid);dxlevel(2)=rnode(rpdx2_,igrid)
3849 ! default (no) normalization for auxiliary variables
3850 normconv(nw+1:nw+nwauxio)=one
3851 ! maybe need for restriction to ixG^LL^LSUB1
3852 call specialvar_output23(ixglo1,ixglo2,ixglo1,ixghi1,ixghi2,ixghi1,ixglo1&
3853 +1,ixglo2+1,ixglo1+1,ixghi1-1,ixghi2-1,ixghi1-1,w,xcc,normconv)
3854 endif
3855 ! compute the cell-center values for w first
3856 !===========================================
3857 ! cell center values obtained from mere copy, while B0+B1 split handled here
3858 wcc(ixccmin1:ixccmax1,ixccmin2:ixccmax2,ixccmin3:ixccmax3,:)=w(ixccmin1:ixccmax1,ixccmin2:ixccmax2,ixccmin3:ixccmax3,:)
3859 if(b0field) then
3860 do ix3=ixccmin3,ixccmax3
3861 do ix2=ixccmin2,ixccmax2
3862 do ix1=ixccmin1,ixccmax1
3863 wcc(ix1,ix2,ix3,iw_mag(:))=wcc(ix1,ix2,ix3,iw_mag(:))+ps(igrid)%B0(ix1,ix2,&
3864 :,0)
3865 end do
3866 end do
3867 end do
3868 end if
3869 if(.not.saveprim .and. b0field .and. iw_e>0) then
3870 do ix3=ixccmin3,ixccmax3
3871 do ix2=ixccmin2,ixccmax2
3872 do ix1=ixccmin1,ixccmax1
3873 wcc(ix1,ix2,ix3,iw_e)=w(ix1,ix2,ix3,iw_e) +half*sum(ps(igrid)%B0(ix1,&
3874 ix2,:,0)**2 ) + sum(w(ix1,ix2,ix3,&
3875 iw_mag(:))*ps(igrid)%B0(ix1,ix2,:,0))
3876 end do
3877 end do
3878 end do
3879 end if
3880 ! compute the corner values for w now by averaging
3881 !=================================================
3882 if(slab_uniform)then
3883 ! for slab symmetry: no geometrical info required
3884 do iw=1,nw+nwauxio
3885 if (b0field.and.iw>iw_mag(1)-1.and.iw<=iw_mag(ndir)) then
3886 idir=iw-iw_mag(1)+1
3887 do ix3=ixcmin3,ixcmax3
3888 do ix2=ixcmin2,ixcmax2
3889 do ix1=ixcmin1,ixcmax1
3890 wc(ix1,ix2,ix3,iw)=sum(w(ix1:ix1+1,ix2:ix2+1,ix3,iw) &
3891 +ps(igrid)%B0(ix1:ix1+1,ix2:ix2+1&
3892 ,idir,0))/dble(2**3)+&
3893 sum(w(ix1:ix1+1,ix2:ix2+1,ix3+1,iw) &
3894 +ps(igrid)%B0(ix1:ix1+1,ix2:ix2+1&
3895 ,idir,0))/dble(2**3)
3896 end do
3897 end do
3898 end do
3899 else
3900 do ix3=ixcmin3,ixcmax3
3901 do ix2=ixcmin2,ixcmax2
3902 do ix1=ixcmin1,ixcmax1
3903 wc(ix1,ix2,ix3,iw)=sum(w(ix1:ix1+1,ix2:ix2+1,ix3:ix3&
3904 +1,iw))/dble(2**3)
3905 end do
3906 end do
3907 end do
3908 end if
3909 end do
3910 if(.not.saveprim .and. b0field .and. iw_e>0) then
3911 do ix3=ixcmin3,ixcmax3
3912 do ix2=ixcmin2,ixcmax2
3913 do ix1=ixcmin1,ixcmax1
3914 wc(ix1,ix2,ix3,iw_e)=sum( w(ix1:ix1+1,ix2:ix2+1,ix3,iw_e) &
3915 +half*sum(ps(igrid)%B0(ix1:ix1+1,ix2:ix2+1&
3916 ,:,0)**2,dim=ndim+1) + sum( w(ix1:ix1+1,ix2:ix2+1,ix3&
3917 ,iw_mag(:))*ps(igrid)%B0(ix1:ix1+1,ix2:ix2+1&
3918 ,:,0),dim=ndim+1) ) /dble(2**3)+&
3919 sum( w(ix1:ix1+1,ix2:ix2+1,ix3+1,iw_e) &
3920 +half*sum(ps(igrid)%B0(ix1:ix1+1,ix2:ix2+1&
3921 ,:,0)**2,dim=ndim+1) + sum( w(ix1:ix1+1,ix2:ix2+1,ix3&
3922 +1,iw_mag(:))*ps(igrid)%B0(ix1:ix1+1,ix2:ix2+1&
3923 ,:,0),dim=ndim+1) ) /dble(2**3)
3924 end do
3925 end do
3926 end do
3927 end if
3928 end if
3929 ! keep the coordinate and vector components
3930 xc_tmp(ixcmin1:ixcmax1,ixcmin2:ixcmax2,ixcmin3:ixcmax3,1:3) &
3931 = xc(ixcmin1:ixcmax1,ixcmin2:ixcmax2,ixcmin3:ixcmax3,1:3)
3932 wc_tmp(ixcmin1:ixcmax1,ixcmin2:ixcmax2,ixcmin3:ixcmax3,1:nw&
3933 +nwauxio) = wc(ixcmin1:ixcmax1,ixcmin2:ixcmax2,ixcmin3:ixcmax3,1:nw&
3934 +nwauxio)
3935 xcc_tmp(ixccmin1:ixccmax1,ixccmin2:ixccmax2,ixccmin3:ixccmax3,&
3936 1:3) = xcc(ixccmin1:ixccmax1,ixccmin2:ixccmax2,&
3937 ixccmin3:ixccmax3,1:3)
3938 wcc_tmp(ixccmin1:ixccmax1,ixccmin2:ixccmax2,ixccmin3:ixccmax3,1:nw&
3939 +nwauxio) = wcc(ixccmin1:ixccmax1,ixccmin2:ixccmax2,ixccmin3:ixccmax3,&
3940 1:nw+nwauxio)
3941 end subroutine calc_grid23
3942
3943 subroutine save_connvtk23(qunit,igrid)
3944 ! this saves the basic line, pixel and voxel connectivity,
3945 ! as used by VTK file outputs for unstructured grid
3947
3948 integer, intent(in) :: qunit, igrid
3949
3950 integer :: nx1,nx2,nx3, nxC1,nxC2,nxC3, ix1,ix2,ix3
3951
3952 nx1=ixmhi1-ixmlo1+1;nx2=ixmhi2-ixmlo2+1;nx3=ixmhi1-ixmlo1+1;
3953 nxc1=nx1+1;nxc2=nx2+1;nxc3=nx3+1;
3954 do ix3=1,nx3
3955 do ix2=1,nx2
3956 do ix1=1,nx1
3957 write(qunit,'(8(i7,1x))')&
3958 (ix3-1)*nxc2*nxc1+(ix2-1)*nxc1+ix1-1, &
3959 (ix3-1)*nxc2*nxc1+(ix2-1)*nxc1+ix1,&
3960 (ix3-1)*nxc2*nxc1+ ix2*nxc1+ix1-1,&
3961 (ix3-1)*nxc2*nxc1+ ix2*nxc1+ix1,&
3962 ix3*nxc2*nxc1+(ix2-1)*nxc1+ix1-1,&
3963 ix3*nxc2*nxc1+(ix2-1)*nxc1+ix1,&
3964 ix3*nxc2*nxc1+ ix2*nxc1+ix1-1,&
3965 ix3*nxc2*nxc1+ ix2*nxc1+ix1
3966
3967 end do
3968 end do
3969 end do
3970 end subroutine save_connvtk23
3971
3972 subroutine specialvar_output23(ixImin1,ixImin2,ixImin3,ixImax1,ixImax2,&
3973 ixImax3,ixOmin1,ixOmin2,ixOmin3,ixOmax1,ixOmax2,ixOmax3,w,x,normconv)
3974 ! this subroutine can be used in convert, to add auxiliary variables to the
3975 ! converted output file, for further analysis using tecplot, paraview, ....
3976 ! these auxiliary values need to be stored in the nw+1:nw+nwauxio slots
3977 ! the array normconv can be filled in the (nw+1:nw+nwauxio) range with
3978 ! corresponding normalization values (default value 1)
3980
3981 integer, intent(in) :: ixImin1,ixImin2,ixImin3,ixImax1,ixImax2,&
3982 ixImax3,ixOmin1,ixOmin2,ixOmin3,ixOmax1,ixOmax2,ixOmax3
3983 double precision, intent(in) :: x(ixImin1:ixImax1,ixImin2:ixImax2,&
3984 ixImin3:ixImax3,1:3)
3985 double precision :: w(ixImin1:ixImax1,ixImin2:ixImax2,&
3986 ixImin3:ixImax3,nw+nwauxio)
3987 double precision :: normconv(0:nw+nwauxio)
3988
3989 double precision :: qvec(ixGlo1:ixGhi1,ixGlo2:ixGhi2,ixGlo1:ixGhi1,1:ndir),&
3990 curlvec(ixGlo1:ixGhi1,ixGlo2:ixGhi2,ixGlo1:ixGhi1,1:ndir)
3991 integer :: idirmin
3992
3993 ! output Te
3994 !if(saveprim)then
3995 ! w(ixOmin1:ixOmax1,ixOmin2:ixOmax2,ixOmin3:ixOmax3,nw+1)=w(ixOmin1:ixOmax1,&
3996 ! ixOmin2:ixOmax2,ixOmin3:ixOmax3,iw_e)/w(ixOmin1:ixOmax1,ixOmin2:ixOmax2,&
3997 ! ixOmin3:ixOmax3,iw_rho)
3998 !endif
3999 !!! store current
4000 ! qvec(ixImin1:ixImax1,ixImin2:ixImax2,ixImin3:ixImax3,1)=w(ixImin1:ixImax1,&
4001 ! ixImin2:ixImax2,ixImin3:ixImax3,mag(1))
4002 ! qvec(ixImin1:ixImax1,ixImin2:ixImax2,ixImin3:ixImax3,2)=w(ixImin1:ixImax1,&
4003 ! ixImin2:ixImax2,ixImin3:ixImax3,mag(2))
4004 ! qvec(ixImin1:ixImax1,ixImin2:ixImax2,ixImin3:ixImax3,3)=w(ixImin1:ixImax1,&
4005 ! ixImin2:ixImax2,ixImin3:ixImax3,mag(3));
4006 !call curlvector3D(qvec,ixImin1,ixImin2,ixImin3,ixImax1,ixImax2,ixImax3,ixOmin1,&
4007 ! ixOmin2,ixOmin3,ixOmax1,ixOmax2,ixOmax3,curlvec,idirmin,1,ndir)
4008 !w(ixOmin1:ixOmax1,ixOmin2:ixOmax2,ixOmin3:ixOmax3,nw+2)=curlvec&
4009 ! (ixOmin1:ixOmax1,ixOmin2:ixOmax2,ixOmin3:ixOmax3,1)
4010 !w(ixOmin1:ixOmax1,ixOmin2:ixOmax2,ixOmin3:ixOmax3,nw+3)=curlvec&
4011 ! (ixOmin1:ixOmax1,ixOmin2:ixOmax2,ixOmin3:ixOmax3,2)
4012 !w(ixOmin1:ixOmax1,ixOmin2:ixOmax2,ixOmin3:ixOmax3,nw+4)=curlvec&
4013 ! (ixOmin1:ixOmax1,ixOmin2:ixOmax2,ixOmin3:ixOmax3,3);
4014 end subroutine specialvar_output23
4015 \}
4016
4017end module mod_convert_files
4018
Handles computations for coordinates and variables in output.
subroutine getheadernames(wnamei, xandwnamei, outfilehead)
get all variables names
subroutine calc_grid(qunit, igrid, xc, xcc, xc_tmp, xcc_tmp, wc_tmp, wcc_tmp, normconv, ixcl, ixccl, first)
Compute both corner as well as cell-centered values for output.
subroutine calc_x(igrid, xc, xcc)
computes cell corner (xC) and cell center (xCC) coordinates
subroutine, public mpistop(message)
Exit MPI-AMRVAC with an error message.
subroutine unstructuredvtkb64(qunit)
subroutine punstructuredvtk_mpi(qunit)
subroutine write_vtk(qunit, ixil, ixcl, ixccl, igrid, nc, np, nxd, nxcd, normconv, wnamei, xc, xcc, wc, wcc)
subroutine tecplot_mpi(qunit)
subroutine oneblock(qunit)
subroutine write_pvtu(qunit)
subroutine imagedatavtk_mpi(qunit)
subroutine save_connvtk(qunit, igrid)
integer function nodenumbertec2d(i1, i2, nx1, nx2, ig, igrid)
subroutine calc_grid23(qunit, igrid, xc_tmp, xcc_tmp, wc_tmp, wcc_tmp, normconv, ixcmin1, ixcmin2, ixcmin3, ixcmax1, ixcmax2, ixcmax3, ixccmin1, ixccmin2, ixccmin3, ixccmax1, ixccmax2, ixccmax3, first, i3grid, d3grid, w, zlength, zgridsc)
subroutine tecplot(qunit)
subroutine generate_plotfile
integer function nodenumbertec1d(i1, nx1, ig, igrid)
subroutine unstructuredvtk(qunit)
subroutine unstructuredvtkb23(qunit)
subroutine unstructuredvtkb(qunit)
subroutine write_vti(qunit, ixil, ixcl, ixccl, igd, nxd, normconv, wnamei, wc, wcc)
integer function nodenumbertec3d(i1, i2, i3, nx1, nx2, nx3, ig, igrid)
subroutine save_conntec(qunit, igrid, igonlevel)
subroutine save_connvtk23(qunit, igrid)
subroutine onegrid(qunit)
subroutine unstructuredvtk_mpi(qunit)
subroutine punstructuredvtkb_mpi(qunit)
subroutine unstructuredvtkbsym23(qunit)
subroutine specialvar_output23(iximin1, iximin2, iximin3, iximax1, iximax2, iximax3, ixomin1, ixomin2, ixomin3, ixomax1, ixomax2, ixomax3, w, x, normconv)
subroutine convert_all()
Definition mod_convert.t:91
Module with basic grid data structures.
Definition mod_forest.t:2
integer, dimension(:), allocatable, save sfc_to_igrid
Go from a Morton number to an igrid index (for a single processor)
Definition mod_forest.t:53
integer, dimension(:), allocatable, save morton_start
First Morton number per processor.
Definition mod_forest.t:62
integer, dimension(:), allocatable, save morton_stop
Last Morton number per processor.
Definition mod_forest.t:65
type(tree_node_ptr), dimension(:,:), allocatable, save igrid_to_node
Array to go from an [igrid, ipe] index to a node pointer.
Definition mod_forest.t:32
update ghost cells of all blocks including physical boundaries
This module contains definitions of global parameters and variables and some generic functions/subrou...
double precision, dimension(:), allocatable w_convert_factor
Conversion factors the primitive variables.
type(state), pointer block
Block pointer for using one block and its previous state.
logical nocartesian
IO switches for conversion.
double precision global_time
The global simulation time.
integer type_block_xc_io
MPI type for IO: cell corner (xc) or cell center (xcc) coordinates.
integer snapshotini
Resume from the snapshot with this index.
logical saveprim
If true, convert from conservative to primitive variables in output.
character(len=std_len) convert_type
Which format to use when converting.
integer, parameter ndim
Number of spatial dimensions for grid variables.
double precision time_convert_factor
Conversion factor for time unit.
integer icomm
The MPI communicator.
integer, dimension(:), allocatable ng
number of grid blocks in domain per dimension, in array over levels
integer mype
The rank of the current MPI task.
integer type_block_io
MPI type for IO: block excluding ghost cells.
double precision length_convert_factor
Conversion factor for length unit.
integer ndir
Number of spatial dimensions (components) for vector variables.
integer ixm
the mesh range of a physical block without ghost cells
integer ierrmpi
A global MPI error return code.
logical autoconvert
If true, already convert to output format during the run.
integer type_block_wc_io
MPI type for IO: cell corner (wc) or cell center (wcc) variables.
integer snapshotnext
IO: snapshot and collapsed views output numbers/labels.
integer npe
The number of MPI tasks.
integer nwauxio
Number of auxiliary variables that are only included in output.
logical, dimension(:), allocatable w_write
if true write the w variable in output
logical b0field
split magnetic field as background B0 field
double precision, dimension(:,:), allocatable rnode
Corner coordinates.
logical, dimension(:), allocatable writelevel
double precision, dimension(:,:), allocatable dx
integer nghostcells
Number of ghost cells surrounding a grid.
double precision, dimension(^nd) dxlevel
store unstretched cell size of current level
logical slab_uniform
uniform Cartesian geometry or not (stretched Cartesian)
character(len=std_len) base_filename
Base file name for simulation output, which will be followed by a number.
double precision, dimension(^nd, 2) writespshift
domain percentage cut off shifted from each boundary when converting data
integer, parameter unitconvert
integer, dimension(:,:), allocatable node
This module defines the procedures of a physics module. It contains function pointers for the various...
Definition mod_physics.t:4
procedure(sub_convert), pointer phys_to_primitive
Definition mod_physics.t:55
procedure(sub_check_params), pointer phys_te_images
Definition mod_physics.t:88
Module with all the methods that users can customize in AMRVAC.
procedure(aux_output), pointer usr_aux_output
procedure(special_convert), pointer usr_special_convert
Pointer to a tree_node.
Definition mod_forest.t:6