MPI-AMRVAC  3.0
The MPI - Adaptive Mesh Refinement - Versatile Advection Code
mod_collapse.t
Go to the documentation of this file.
1 !> Collapses D-dimensional output to D-1 view by line-of-sight integration
2 ! for now: only for non-stretched cartesian cases, with LOS along coordinate
3 ! writes out as either csv or vti file (collapse_type)
6  implicit none
7 
8 contains
9 !=============================================================================
10 subroutine write_collapsed
12 ! Writes a collapsed view of the data integrated over one grid-direction.
13 ! E.g. column density maps.
14 ! Uses flat interpolation throughout.
15 ! by Oliver Porth
16 ! 6.Nov 2013
17 integer :: idir
18 logical, save :: firstcollapse=.true.
19 !-----------------------------------------------------------------------------
20 
21 if (firstcollapse) then
22  firstcollapse=.false.
23 end if
24 
25 do idir=1, ndim
26  if (collapse(idir)) call put_collapse(idir)
27 end do
28 
30 end subroutine write_collapsed
31 !=============================================================================
32 subroutine put_collapse(dir)
36 integer, intent(in) :: dir
37 ! .. local ..
38 integer :: jgrid, igrid, Morton_no
39 double precision,dimension(0:nw+nwauxio) :: normconv
40 !-----------------------------------------------------------------------------
41 if(.not.slab) call mpistop("collapse only for slab cartesian cases")
42 
43 call allocate_collapsed(dir)
44 
45 jgrid=0
46 do morton_no=morton_start(mype),morton_stop(mype)
47  igrid=sfc_to_igrid(morton_no)
48  jgrid=jgrid+1
49  call alloc_subnode(jgrid,dir,nwauxio)
50  call collapse_subnode(igrid,jgrid,dir,normconv)
51  call integrate_subnode(igrid,jgrid,dir)
52 end do
53 
54 ! Reduce to head-node:
55 if (mype==0) then
56  call mpi_reduce(mpi_in_place,collapseddata,size(collapseddata),mpi_double_precision,mpi_sum,0,icomm,ierrmpi)
57 else
58  call mpi_reduce(collapseddata,collapseddata,size(collapseddata),mpi_double_precision,mpi_sum,0,icomm,ierrmpi)
59 end if
60 call mpi_barrier(icomm, ierrmpi)
61 
62 {^nooned
63 select case(collapse_type)
64 case('vti')
65  call output_collapsed_vti(dir,normconv)
66 case('csv')
67  call output_collapsed_csv(dir,normconv)
68 case('default')
69  call mpistop("Unknown filetype for collapsed views")
70 end select
71  }{^ifoned
72 call mpistop("sorry, 1D collapsed output routine not yet implemented (should be easy)...")
73 }
74 
75 ! If we need the subnodes later, remove deallocation here:
76 do jgrid=1,morton_stop(mype)-morton_start(mype)+1
77  call dealloc_subnode(jgrid)
78 end do
79 deallocate(collapseddata)
80 
81 end subroutine put_collapse
82 !=============================================================================
83 subroutine output_collapsed_csv(dir,normconv)
86 integer, intent(in) :: dir
87 double precision,dimension(0:nw+nwauxio),intent(in):: normconv
88 character(len=1024) :: filename, outfilehead, line
89 logical :: fileopen
90 integer :: iw
91 character(len=name_len) :: wnamei(1:nw+nwauxio),xandwnamei(1:ndim+nw+nwauxio)
92 integer, dimension(ndim) :: myshape
93 {^nooned
94 integer :: ix^DM
95 double precision :: dxdim^DM, xdim^LIM^DM
96 }
97 !-----------------------------------------------------------------------------
98 
99 if (mype==0) then
100 
101 ! Get coordinates:
102 {^ifthreed
103 select case(dir)
104 case (1)
105  dxdim1 = dx(2,collapselevel)
106  dxdim2 = dx(3,collapselevel)
107  xdim^lim1=xprob^lim2;
108  xdim^lim2=xprob^lim3;
109 case (2)
110  dxdim1 = dx(1,collapselevel)
111  dxdim2 = dx(3,collapselevel)
112  xdim^lim1=xprob^lim1;
113  xdim^lim2=xprob^lim3;
114 case (3)
115  dxdim1 = dx(1,collapselevel)
116  dxdim2 = dx(2,collapselevel)
117  xdim^lim1=xprob^lim1;
118  xdim^lim2=xprob^lim2;
119 case default
120  dxdim1 = 1
121  dxdim2 = 1
122  xdim^lim1=xprob^lim2;
123  xdim^lim2=xprob^lim3;
124  call mpistop("slice direction not clear in output_collapsed_csv")
125 end select
126 }
127 {^iftwod
128 select case(dir)
129 case (1)
130  dxdim1 = dx(2,collapselevel)
131  xdim^lim1=xprob^lim2;
132 case (2)
133  dxdim1 = dx(1,collapselevel)
134  xdim^lim1=xprob^lim1;
135 case default
136  dxdim1 = 1
137  xdim^lim1=xprob^lim2;
138  call mpistop("slice direction not clear in output_collapsed_csv")
139 end select
140 }
141 
142  inquire(unitcollapse,opened=fileopen)
143  if(.not.fileopen)then
144  ! generate filename:
145  write(filename,"(a,i1.1,a,i1.1,a,i4.4,a)") trim(base_filename) // '_d', &
146  dir,'_l',collapselevel,'_n',collapsenext,'.csv'
147  open(unitcollapse,file=filename,status='unknown',form='formatted')
148  end if
149  ! get and write the header:
150  call getheadernames(wnamei,xandwnamei,outfilehead)
151  line=''
152  do iw=1,ndim+nw+nwauxio-1
153  if (iw .eq. dir) cycle
154  line = trim(line)//trim(xandwnamei(iw))//', '
155  end do
156  line = trim(line)//trim(xandwnamei(ndim+nw+nwauxio))
157  write(unitcollapse,'(a)')trim(line)
158  myshape = shape(collapseddata)
159 {^nooned
160 {^dm& do ix^dmb = 1,myshape(^dmb)\}
161  ! following assumes uniform cartesian grid
162  write(unitcollapse,'(200(1pe20.12))') &
163  {^dm& dxdim^dm*dble(ix^dm)+xdimmin^dm}, &
164  (collapseddata(ix^dm,iw)*normconv(iw),iw=1,nw+nwauxio)
165 {^dm& enddo\}
166 }
167 close(unitcollapse)
168 
169 end if
170 end subroutine output_collapsed_csv
171 !=============================================================================
172 subroutine output_collapsed_vti(dir,normconv)
175 integer, intent(in) :: dir
176 double precision,dimension(0:nw+nwauxio),intent(in):: normconv
177 character(len=1024) :: filename, outfilehead, line
178 logical :: fileopen
179 integer :: iw
180 character(len=name_len) :: wnamei(1:nw+nwauxio),xandwnamei(1:ndim+nw+nwauxio)
181 integer, dimension(ndim) :: myshape
182 {^nooned
183 integer :: ix^DM
184 double precision :: dxdim^DM, xdim^LIM^DM
185 }
186 double precision :: origin(1:3), spacing(1:3)
187 integer :: wholeExtent(1:6), size_single, length, size_length
188 integer*8 :: offset
189 character :: buf
190 !-----------------------------------------------------------------------------
191 if (mype==0) then
192 offset=0
193 size_single=4
194 size_length=4
195 ! Get coordinates:
196 {^ifthreed
197 select case(dir)
198 case (1)
199  dxdim1 = dx(2,1)*2.0d0**(1-collapselevel)
200  dxdim2 = dx(3,1)*2.0d0**(1-collapselevel)
201  xdim^lim1=xprob^lim2;
202  xdim^lim2=xprob^lim3;
203 case (2)
204  dxdim1 = dx(1,1)*2.0d0**(1-collapselevel)
205  dxdim2 = dx(3,1)*2.0d0**(1-collapselevel)
206  xdim^lim1=xprob^lim1;
207  xdim^lim2=xprob^lim3;
208 case (3)
209  dxdim1 = dx(1,1)*2.0d0**(1-collapselevel)
210  dxdim2 = dx(2,1)*2.0d0**(1-collapselevel)
211  xdim^lim1=xprob^lim1;
212  xdim^lim2=xprob^lim2;
213 case default
214  dxdim1 = 1
215  dxdim2 = 1
216  xdim^lim1=xprob^lim2;
217  xdim^lim2=xprob^lim3;
218  call mpistop("slice direction not clear in output_collapsed_vti")
219 end select
220 }
221 {^iftwod
222 select case(dir)
223 case (1)
224  dxdim1 = dx(2,1)*2.0d0**(1-collapselevel)
225  xdim^lim1=xprob^lim2;
226 case (2)
227  dxdim1 = dx(1,1)*2.0d0**(1-collapselevel)
228  xdim^lim1=xprob^lim1;
229 case default
230  dxdim1 = 1
231  xdim^lim1=xprob^lim2;
232  call mpistop("slice direction not clear in output_collapsed_vti")
233 end select
234 }
235 
236 origin=0
237 spacing=zero
238 wholeextent=0
239 myshape = shape(collapseddata)
240 {^ifoned
241 length = size_single
242 }
243 {^nooned
244 length = ^dm&myshape(^dm)*
245 length = length*size_single
246 {^dm&wholeextent(^dm*2)=myshape(^dm); }
247 {^dm&spacing(^dm) = dxdim^dm; }
248 {^dm&origin(^d) = xdimmin^dm; }
249 }
250 
251  inquire(unitcollapse,opened=fileopen)
252  if(.not.fileopen)then
253  ! generate filename:
254  write(filename,"(a,i1.1,a,i1.1,a,i4.4,a)") trim(base_filename)//'_d',dir,&
255  '_l',collapselevel,'_n',collapsenext,'.vti'
256  open(unitcollapse,file=filename,status='unknown',form='formatted')
257  end if
258 ! get the header:
259 call getheadernames(wnamei,xandwnamei,outfilehead)
260 
261 ! generate xml header
262 write(unitcollapse,'(a)')'<?xml version="1.0"?>'
263 write(unitcollapse,'(a)',advance='no') '<VTKFile type="ImageData"'
264 if(type_endian==1)then
265  write(unitcollapse,'(a)')' version="0.1" byte_order="LittleEndian">'
266 else
267  write(unitcollapse,'(a)')' version="0.1" byte_order="BigEndian">'
268 endif
269 ! following corresponds to uniform cartesian grid
270 write(unitcollapse,'(a,3(1pe14.6),a,6(i10),a,3(1pe14.6),a)')' <ImageData Origin="',&
271  origin,'" WholeExtent="',wholeextent,'" Spacing="',spacing,'">'
272 write(unitcollapse,'(a)')'<FieldData>'
273 write(unitcollapse,'(2a)')'<DataArray type="Float32" Name="TIME" ',&
274  'NumberOfTuples="1" format="ascii">'
276 write(unitcollapse,'(a)')'</DataArray>'
277 write(unitcollapse,'(a)')'</FieldData>'
278 
279 ! we write one VTK PIECE
280 write(unitcollapse,'(a,6(i10),a)') &
281  '<Piece Extent="',wholeextent,'">'
282 write(unitcollapse,'(a)')'<CellData>'
283 
284 do iw=1,nw+nwauxio
285  if(iw<=nw) then
286  if(.not.w_write(iw)) cycle
287  endif
288  write(unitcollapse,'(a,a,a,i16,a)')&
289  '<DataArray type="Float32" Name="',trim(wnamei(iw)),&
290  '" format="appended" offset="',offset,'"/>'
291  offset = offset + length + size_length
292 enddo
293 
294 write(unitcollapse,'(a)')'</CellData>'
295 write(unitcollapse,'(a)')'</Piece>'
296 write(unitcollapse,'(a)')'</ImageData>'
297 write(unitcollapse,'(a)')'<AppendedData encoding="raw">'
298 close(unitcollapse)
299 
300 open(unitcollapse,file=filename,access='stream',form='unformatted',position='append')
301 buf='_'
302 write(unitcollapse) trim(buf)
303 
304 do iw=1,nw+nwauxio
305  if(iw<=nw) then
306  if(.not.w_write(iw)) cycle
307  endif
308  write(unitcollapse) length
309  {^ifoned
310  write(unitcollapse) real(collapseddata(iw)*normconv(iw))
311  }
312  {^iftwod
313  write(unitcollapse) (real(collapseddata(ix1,iw)*normconv(iw)),ix1=1,myshape(1))
314  }
315  {^ifthreed
316  write(unitcollapse) ((real(collapseddata(ix1,ix2,iw)*normconv(iw)),ix1=1,&
317  myshape(1)),ix2=1,myshape(2))
318  }
319 enddo
320 
321 close(unitcollapse)
322 open(unitcollapse,file=filename,status='unknown',form='formatted',position='append')
323 write(unitcollapse,'(a)')'</AppendedData>'
324 write(unitcollapse,'(a)')'</VTKFile>'
325 close(unitcollapse)
326 
327 end if
328 
329 end subroutine output_collapsed_vti
330 !=============================================================================
331 subroutine allocate_collapsed(dir)
333 integer, intent(in) :: dir
334 integer :: dim^D
335 integer :: nx^D
336 !-----------------------------------------------------------------------------
337 ! allocate array for the collapsed data:
338 ! number of cells per grid.
339 nx^d=ixmhi^d-ixmlo^d+1;
340 {dim^d=ng^d(1)*2**(collapselevel-1)*nx^d\}
341 {^ifthreed
342 select case(dir)
343 case (1)
344  allocate(collapseddata(&
345  dim2,dim3,nw+nwauxio))
346 case (2)
347  allocate(collapseddata(&
348  dim1,dim3,nw+nwauxio))
349 case (3)
350  allocate(collapseddata(&
351  dim1,dim2,nw+nwauxio))
352 case default
353  call mpistop("slice direction not clear in allocate_collapsed")
354 end select
355 }
356 {^iftwod
357 select case(dir)
358 case (1)
359  allocate(collapseddata(&
360  dim2,nw+nwauxio))
361 case (2)
362  allocate(collapseddata(&
363  dim1,nw+nwauxio))
364 case default
365  call mpistop("slice direction not clear in allocate_collapsed")
366 end select
367 }
368 {^ifoned
369  allocate(collapseddata(nw+nwauxio))
370 }
371 collapseddata = zero
372 
373 end subroutine allocate_collapsed
374 !=============================================================================
375 subroutine integrate_subnode(igrid,jgrid,dir)
378 integer, intent(in) :: igrid, jgrid, dir
379 ! .. local ..
380 type(tree_node_ptr) :: tree
381 integer :: nx^D
382 integer :: ig^D, level, ig^Dtargetmin, ig^Dtargetmax
383 integer :: ix^Dtarget^LIM, idim^Dtarget^LIM
384 integer :: ixMdim^LLIM^D, ix^Dorig, ix^D
385 {^nooned
386 integer :: igdim^DM
387 }
388 !-----------------------------------------------------------------------------
389 tree%node => igrid_to_node(igrid, mype)%node
390 {^d& ig^d = tree%node%ig^d; }
391 level = tree%node%level
392 ! number of cells per grid.
393 nx^d=ixmhi^d-ixmlo^d+1;
394 
395 ! assumes uniform cartesian grid with factor 2 refinement per dimension
396 {^d&
397 if (level > collapselevel) then
398  ig^dtargetmin = int(dble(ig^d-1)/2.0d0**(level-collapselevel))+1
399  ig^dtargetmax = ig^dtargetmin
400 else if (level < collapselevel) then
401  ig^dtargetmin = int(2.0d0**(collapselevel-level))*(ig^d-1)+1
402  ig^dtargetmax = int(2.0d0**(collapselevel-level))*ig^d
403 else
404  ig^dtargetmin = ig^d
405  ig^dtargetmax = ig^d
406 end if
407 ix^dtargetmin = nx^d*(ig^dtargetmin-1)+1
408 ix^dtargetmax = nx^d*ig^dtargetmax
409 \}
410 
411 {^ifthreed
412 select case(dir)
413 case (1)
414  igdim1=(ig2-1)*nx2
415  igdim2=(ig3-1)*nx3
416  idim1target^lim=ix2target^lim;
417  idim2target^lim=ix3target^lim;
418  ixmdim^llim1=ixm^llim2;
419  ixmdim^llim2=ixm^llim3;
420 case (2)
421  igdim1=(ig1-1)*nx1
422  igdim2=(ig3-1)*nx3
423  idim1target^lim=ix1target^lim;
424  idim2target^lim=ix3target^lim;
425  ixmdim^llim1=ixm^llim1;
426  ixmdim^llim2=ixm^llim3;
427 case (3)
428  igdim1=(ig1-1)*nx1
429  igdim2=(ig2-1)*nx2
430  idim1target^lim=ix1target^lim;
431  idim2target^lim=ix2target^lim;
432  ixmdim^llim1=ixm^llim1;
433  ixmdim^llim2=ixm^llim2;
434 case default
435  call mpistop("slice direction not clear in integrate_subnode")
436 end select
437 
438 if (level >= collapselevel) then
439  do ix1orig = ixmdimlo1,ixmdimhi1
440  do ix2orig = ixmdimlo2,ixmdimhi2
441 {^dm& ix^dm = int(dble(ix^dmorig-nghostcells+igdim^dm-1)*2.0d0**(collapselevel-level))+1\}
442  collapseddata(ix1,ix2,1:nw+nwauxio) = collapseddata(ix1,ix2,1:nw+nwauxio) &
443  + ps_sub(jgrid)%w(ix1orig,ix2orig,1:nw+nwauxio) / 2.0d0**(2*(level-collapselevel))
444  end do
445  end do
446 else
447 {^dm&
448  do ix^dm = idim^dmtargetmin,idim^dmtargetmax\}
449  {^dm& ix^dmorig = int(dble(ix^dm-idim^dmtargetmin)/2.0d0**(collapselevel-level))+1+nghostcells \}
450  collapseddata(ix1,ix2,1:nw+nwauxio) = collapseddata(ix1,ix2,1:nw+nwauxio) + ps_sub(jgrid)%w(ix1orig,ix2orig,1:nw+nwauxio)
451  {^dm& enddo\}
452 end if
453 }
454 {^iftwod
455 select case(dir)
456 case (1)
457  igdim1=(ig2-1)*nx2
458  idim1target^lim=ix2target^lim;
459  ixmdim^llim1=ixm^llim2;
460 case (2)
461  igdim1=(ig1-1)*nx1
462  idim1target^lim=ix1target^lim;
463  ixmdim^llim1=ixm^llim1;
464 case default
465  call mpistop("slice direction not clear in integrate_subnode")
466 end select
467 
468 if (level >= collapselevel) then
469  do ix1orig = ixmdimlo1,ixmdimhi1
470 {^dm& ix^dm = int(dble(ix^dmorig-nghostcells+igdim^dm-1)*2.0d0**(collapselevel-level))+1\}
471  collapseddata(ix1,1:nw+nwauxio) = collapseddata(ix1,1:nw+nwauxio) &
472  + ps_sub(jgrid)%w(ix1orig,1:nw+nwauxio) / 2.0d0**(level-collapselevel)
473  end do
474 else
475 {^dm&
476  do ix^dm = idim^dmtargetmin,idim^dmtargetmax\}
477  {^dm& ix^dmorig = int(dble(ix^dm-idim^dmtargetmin)/2.0d0**(collapselevel-level))+1+nghostcells \}
478  collapseddata(ix1,1:nw+nwauxio) = collapseddata(ix1,1:nw+nwauxio) + ps_sub(jgrid)%w(ix1orig,1:nw+nwauxio)
479  {^dm& enddo\}
480 end if
481 }
482 {^ifoned
483 collapseddata(1:nw+nwauxio) = collapseddata(1:nw+nwauxio) + ps_sub(jgrid)%w(1:nw+nwauxio)
484 }
485 
486 end subroutine integrate_subnode
487 !=============================================================================
488 subroutine collapse_subnode(igrid,jgrid,dir,normconv)
491  use mod_physics, only: phys_to_primitive
492  use mod_calculate_xw
493 
494 integer, intent(in) :: igrid, jgrid, dir
495 double precision,dimension(0:nw+nwauxio),intent(out) :: normconv
496 ! .. local ..
497 integer :: ix, iw
498 double precision :: dx^D
499 double precision, dimension(ixMlo^D-1:ixMhi^D,ndim) :: xC_TMP, xC
500 double precision, dimension(ixMlo^D:ixMhi^D,ndim) :: xCC_TMP, xCC
501 double precision, dimension(ixMlo^D-1:ixMhi^D,nw+nwauxio) :: wC_TMP
502 double precision, dimension(ixMlo^D:ixMhi^D,nw+nwauxio) :: wCC_TMP
503 integer :: ixC^L, ixCC^L
504 !-----------------------------------------------------------------------------
505 ps_sub(jgrid)%w=zero
506 dx^d=rnode(rpdx^d_,igrid);
507 
508 call calc_x(igrid,xc,xcc)
509 call calc_grid(unitslice,igrid,xc,xcc,xc_tmp,xcc_tmp,wc_tmp,wcc_tmp,normconv,&
510  ixc^l,ixcc^l,.true.)
511 
512 {^ifthreed
513 select case (dir)
514 case (1)
515  if(slab_uniform) then
516  do ix=ixmlo1,ixmhi1
517  ps_sub(jgrid)%w(ixmlo2:ixmhi2,ixmlo3:ixmhi3,1:nw+nwauxio) = &
518  ps_sub(jgrid)%w(ixmlo2:ixmhi2,ixmlo3:ixmhi3,1:nw+nwauxio) &
519  + wcc_tmp(ix,ixmlo2:ixmhi2,ixmlo3:ixmhi3,1:nw+nwauxio) * dx1
520  end do
521  else
522  do iw=1,nw+nwauxio
523  do ix=ixmlo1,ixmhi1
524  ps_sub(jgrid)%w(ixmlo2:ixmhi2,ixmlo3:ixmhi3,iw) = &
525  ps_sub(jgrid)%w(ixmlo2:ixmhi2,ixmlo3:ixmhi3,iw) &
526  + wcc_tmp(ix,ixmlo2:ixmhi2,ixmlo3:ixmhi3,iw) * &
527  ps(igrid)%dx(ix,ixmlo2:ixmhi2,ixmlo3:ixmhi3,1)
528  end do
529  end do
530  end if
531  ps_sub(jgrid)%x(ixmlo2:ixmhi2,ixmlo3:ixmhi3,1:ndim) = &
532  ps(igrid)%x(ixmlo1,ixmlo2:ixmhi2,ixmlo3:ixmhi3,1:ndim)
533 case (2)
534  if(slab_uniform) then
535  do ix=ixmlo2,ixmhi2
536  ps_sub(jgrid)%w(ixmlo1:ixmhi1,ixmlo3:ixmhi3,1:nw+nwauxio) = &
537  ps_sub(jgrid)%w(ixmlo1:ixmhi1,ixmlo3:ixmhi3,1:nw+nwauxio) &
538  + wcc_tmp(ixmlo1:ixmhi1,ix,ixmlo3:ixmhi3,1:nw+nwauxio) * dx2
539  end do
540  else
541  do iw=1,nw+nwauxio
542  do ix=ixmlo2,ixmhi2
543  ps_sub(jgrid)%w(ixmlo1:ixmhi1,ixmlo3:ixmhi3,iw) = &
544  ps_sub(jgrid)%w(ixmlo1:ixmhi1,ixmlo3:ixmhi3,iw) &
545  + wcc_tmp(ixmlo1:ixmhi1,ix,ixmlo3:ixmhi3,iw) * &
546  ps(igrid)%dx(ixmlo1:ixmhi1,ix,ixmlo3:ixmhi3,2)
547  end do
548  end do
549  endif
550  ps_sub(jgrid)%x(ixmlo1:ixmhi1,ixmlo3:ixmhi3,1:ndim) = &
551  ps(igrid)%x(ixmlo1:ixmhi1,ixmlo2,ixmlo3:ixmhi3,1:ndim)
552 case (3)
553  if(slab_uniform) then
554  do ix=ixmlo3,ixmhi3
555  ps_sub(jgrid)%w(ixmlo1:ixmhi1,ixmlo2:ixmhi2,1:nw+nwauxio) = &
556  ps_sub(jgrid)%w(ixmlo1:ixmhi1,ixmlo2:ixmhi2,1:nw+nwauxio) &
557  + wcc_tmp(ixmlo1:ixmhi1,ixmlo2:ixmhi2,ix,1:nw+nwauxio) * dx3
558  end do
559  else
560  do iw=1,nw+nwauxio
561  do ix=ixmlo3,ixmhi3
562  ps_sub(jgrid)%w(ixmlo1:ixmhi1,ixmlo2:ixmhi2,iw) = &
563  ps_sub(jgrid)%w(ixmlo1:ixmhi1,ixmlo2:ixmhi2,iw) &
564  + wcc_tmp(ixmlo1:ixmhi1,ixmlo2:ixmhi2,ix,iw) * &
565  ps(igrid)%dx(ixmlo1:ixmhi1,ixmlo2:ixmhi2,ix,3)
566  end do
567  end do
568  endif
569  ps_sub(jgrid)%x(ixmlo1:ixmhi1,ixmlo2:ixmhi2,1:ndim) = &
570  ps(igrid)%x(ixmlo1:ixmhi1,ixmlo2:ixmhi2,ixmlo3,1:ndim)
571 case default
572  print*, 'subnode, dir: ', dir
573  call mpistop("slice direction not clear in collapse_subnode")
574 end select
575 }
576 {^iftwod
577 select case (dir)
578 case (1)
579  if(slab_uniform) then
580  do ix=ixmlo1,ixmhi1
581  ps_sub(jgrid)%w(ixmlo2:ixmhi2,1:nw+nwauxio) = &
582  ps_sub(jgrid)%w(ixmlo2:ixmhi2,1:nw+nwauxio) &
583  + wcc_tmp(ix,ixmlo2:ixmhi2,1:nw+nwauxio) * dx1
584  end do
585  else
586  do iw=1,nw+nwauxio
587  do ix=ixmlo1,ixmhi1
588  ps_sub(jgrid)%w(ixmlo2:ixmhi2,iw) = &
589  ps_sub(jgrid)%w(ixmlo2:ixmhi2,iw) &
590  + wcc_tmp(ix,ixmlo2:ixmhi2,iw) * &
591  ps(igrid)%dx(ix,ixmlo2:ixmhi2,1)
592  end do
593  end do
594  end if
595  ps_sub(jgrid)%x(ixmlo2:ixmhi2,1:ndim) = &
596  ps(igrid)%x(ixmlo1,ixmlo2:ixmhi2,1:ndim)
597 case (2)
598  if(slab_uniform) then
599  do ix=ixmlo2,ixmhi2
600  ps_sub(jgrid)%w(ixmlo1:ixmhi1,1:nw+nwauxio) = &
601  ps_sub(jgrid)%w(ixmlo1:ixmhi1,1:nw+nwauxio) &
602  + wcc_tmp(ixmlo1:ixmhi1,ix,1:nw+nwauxio) * dx2
603  end do
604  else
605  do iw=1,nw+nwauxio
606  do ix=ixmlo2,ixmhi2
607  ps_sub(jgrid)%w(ixmlo1:ixmhi1,iw) = &
608  ps_sub(jgrid)%w(ixmlo1:ixmhi1,iw) &
609  + wcc_tmp(ixmlo1:ixmhi1,ix,iw) * &
610  ps(igrid)%dx(ixmlo1:ixmhi1,ix,2)
611  end do
612  end do
613  end if
614  ps_sub(jgrid)%x(ixmlo1:ixmhi1,1:ndim) = &
615  ps(igrid)%x(ixmlo1:ixmhi1,ixmlo2,1:ndim)
616 case default
617  call mpistop("slice direction not clear in collapse_subnode")
618 end select
619 }
620 {^ifoned
621 if(slab_uniform) then
622  do ix=ixmlo1,ixmhi1
623  ps_sub(jgrid)%w(1:nw+nwauxio) = ps_sub(jgrid)%w(1:nw+nwauxio) + wcc_tmp(ix,1:nw+nwauxio) * dx1
624  end do
625 else
626  do iw=1,nw+nwauxio
627  do ix=ixmlo1,ixmhi1
628  ps_sub(jgrid)%w(iw) = ps_sub(jgrid)%w(iw) + wcc_tmp(ix,iw) * ps(igrid)%dx(ix,1)
629  end do
630  end do
631 end if
632 ps_sub(jgrid)%x(1:ndim) = ps(igrid)%x(ixmlo1,1:ndim)
633 }
634 
635 end subroutine collapse_subnode
636 !=============================================================================
637 end module mod_collapse
subroutine mpistop(message)
Exit MPI-AMRVAC with an error message.
Definition: comm_lib.t:194
Handles computations for coordinates and variables in output.
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 getheadernames(wnamei, xandwnamei, outfilehead)
get all variables names
subroutine calc_x(igrid, xC, xCC)
computes cell corner (xC) and cell center (xCC) coordinates
Collapses D-dimensional output to D-1 view by line-of-sight integration.
Definition: mod_collapse.t:4
subroutine collapse_subnode(igrid, jgrid, dir, normconv)
Definition: mod_collapse.t:489
subroutine output_collapsed_csv(dir, normconv)
Definition: mod_collapse.t:84
subroutine allocate_collapsed(dir)
Definition: mod_collapse.t:332
subroutine put_collapse(dir)
Definition: mod_collapse.t:33
subroutine output_collapsed_vti(dir, normconv)
Definition: mod_collapse.t:173
subroutine write_collapsed
Definition: mod_collapse.t:11
subroutine integrate_subnode(igrid, jgrid, dir)
Definition: mod_collapse.t:376
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
This module contains definitions of global parameters and variables and some generic functions/subrou...
integer, parameter unitslice
double precision global_time
The global simulation time.
double precision xprob
minimum and maximum domain boundaries for each dimension
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.
logical, dimension(ndim) collapse
If collapse(DIM) is true, generate output integrated over DIM.
integer, dimension(:), allocatable, parameter d
integer ixm
the mesh range (within a block with ghost cells)
integer ierrmpi
A global MPI error return code.
character(len=std_len) collapse_type
logical slab
Cartesian geometry or not.
integer nwauxio
Number of auxiliary variables that are only included in output.
logical, dimension(:), allocatable w_write
double precision, dimension(:,:), allocatable rnode
Corner coordinates.
integer, parameter unitcollapse
double precision, dimension(:,:), allocatable dx
integer nghostcells
Number of ghost cells surrounding a grid.
integer collapselevel
The level at which to produce line-integrated / collapsed output.
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.
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:59
Writes D-1 slice, can do so in various formats, depending on slice_type.
Definition: mod_slice.t:2
subroutine alloc_subnode(jgrid, dir, nwexpand)
Definition: mod_slice.t:993
subroutine dealloc_subnode(jgrid)
Definition: mod_slice.t:1041
Module with all the methods that users can customize in AMRVAC.
procedure(aux_output), pointer usr_aux_output
Pointer to a tree_node.
Definition: mod_forest.t:6