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