From 6e9868d96abb29b18de9efd2e1f01790da0394f6 Mon Sep 17 00:00:00 2001
From: Joern Behrens <joern.behrens@uni-hamburg.de>
Date: Sun, 24 Jan 2021 15:54:50 +0100
Subject: [PATCH] Add flash2d to course repository

---
 flash2d/compile/Makefiles/Makefile.common     |  266 +
 .../compile/Makefiles/Makefile_gfortran_plane |  145 +
 .../Makefiles/Makefile_gfortran_sphere        |  145 +
 .../compile/Makefiles/Makefile_intel_plane    |  144 +
 .../compile/Makefiles/Makefile_intel_sphere   |  152 +
 flash2d/compile/irix/Makefile                 |  264 +
 flash2d/compile/irix/Makefile.sam             |  232 +
 flash2d/compile/linux_g64/Makefile            |  141 +
 flash2d/compile/linux_g64/Makefile.sphere     |  227 +
 flash2d/compile/linux_g64/README              |   68 +
 flash2d/compile/linux_ia64/Makefile           |  139 +
 flash2d/compile/macosx_gfortran/Makefile      |  145 +
 flash2d/compile/macosx_intel/Makefile         |  144 +
 flash2d/compile/solaris_sparc/Makefile        |  135 +
 flash2d/data/Domain.SWCosine.dat              |   47 +
 flash2d/data/Domain.dat                       |   48 +
 flash2d/data/DomainSph.global.dat             |   13 +
 flash2d/data/Domain_aviso.dat                 |   48 +
 flash2d/data/Domain_periodic_pi.dat           |   48 +
 flash2d/data/Initial.dat                      |   30 +
 flash2d/data/Land.dat                         |   10 +
 flash2d/data/Parambench.dat                   |   69 +
 flash2d/data/Parameters.SW.dat                |   75 +
 flash2d/data/Parameters.dat                   |   77 +
 flash2d/data/Parameters.generic               |   77 +
 flash2d/data/Parameters.new.dat               |  114 +
 flash2d/data/Parameters_aviso.dat             |   76 +
 flash2d/data/PotsdamInput/Domain.windxxx      |   24 +
 flash2d/data/PotsdamInput/Initial.windxxx     |   51 +
 flash2d/data/PotsdamInput/Input.windxxx       |   33 +
 flash2d/data/PotsdamInput/Land.dat            |  326 +
 flash2d/data/PotsdamInput/Windparam.windxxx   |   33 +
 flash2d/data/README                           |   26 +
 flash2d/data/Triang.SWCosine.dat              |  189 +
 flash2d/data/Triang.dat                       |  189 +
 flash2d/data/Triang12.dat                     |   88 +
 flash2d/data/TriangSph.ico.dat                |   78 +
 flash2d/data/Triang_algaeBaltic.dat           |  189 +
 flash2d/data/Triang_aviso.dat                 |  189 +
 flash2d/data/Triang_periodic.dat              |  189 +
 flash2d/data/Triang_periodic_pi.dat           |  324 +
 flash2d/data/Wind_algae.dat                   |   31 +
 flash2d/data/Wind_aviso.dat                   |   25 +
 flash2d/data/default.ftf                      |   71 +
 flash2d/data/elch.pbm                         | 1609 +++++
 flash2d/doc/Dataflow.eps                      |  904 +++
 flash2d/doc/Datastruct.eps                    |  855 +++
 flash2d/doc/FlashRef.bib                      |   47 +
 flash2d/doc/Flash_doxyfile.mac                | 2440 +++++++
 flash2d/doc/GridFlow.ps                       | 6258 +++++++++++++++++
 flash2d/doc/InputDok.ps                       | 1359 ++++
 flash2d/doc/README                            |   30 +
 flash2d/doc/Triang.ps                         |  922 +++
 flash2d/doc/flash.png                         |  Bin 0 -> 18915 bytes
 flash2d/doc/grids.ps                          |  337 +
 flash2d/doc/mainpage.txt                      |   38 +
 flash2d/doc/modifikationen.txt                |  126 +
 flash2d/doc/netcdf.doc                        |   57 +
 flash2d/doc/para-grid.eps                     |  858 +++
 flash2d/doc/sources/Callingtree.sc            |  Bin 0 -> 24536 bytes
 flash2d/doc/sources/Dataflow.sc               |  Bin 0 -> 16976 bytes
 flash2d/doc/sources/Datastruct.old.sc         |  Bin 0 -> 8696 bytes
 flash2d/doc/sources/Datastruct.sc             |  Bin 0 -> 9140 bytes
 flash2d/doc/sources/FlowTempl.sc              |  Bin 0 -> 13916 bytes
 flash2d/doc/sources/GridFlow.sc               |  Bin 0 -> 91912 bytes
 flash2d/doc/sources/InputDok.tex              |  406 ++
 flash2d/doc/sources/Triang.sc                 |  Bin 0 -> 9616 bytes
 flash2d/doc/sources/grids.fig                 |  245 +
 flash2d/doc/sources/para-grid.sc              |  Bin 0 -> 12152 bytes
 flash2d/doc/sources/structure.fig             |  100 +
 flash2d/doc/structure.ps                      |  211 +
 flash2d/eval/diagfile.gnu                     |  112 +
 flash2d/eval/diagmulti.m                      |  149 +
 flash2d/eval/diagprint.gnu                    |  112 +
 flash2d/eval/diags.gnu                        |   98 +
 flash2d/eval/diags.m                          |   79 +
 flash2d/eval/gmv_default.attr                 |  246 +
 flash2d/eval/gmv_wind.attr                    |  246 +
 flash2d/eval/gmvlevel.attr                    |  244 +
 flash2d/eval/gmvtracer.attr                   |  244 +
 flash2d/eval/gmvtracer1.attr                  |  244 +
 flash2d/eval/gpc2matlab.m                     |   50 +
 flash2d/eval/grid_dat.m                       |   19 +
 flash2d/eval/gridded.gnu                      |   18 +
 flash2d/eval/poly.m                           |   38 +
 flash2d/eval/poly.sci                         |   39 +
 flash2d/eval/triang.m                         |   53 +
 flash2d/lib/visnet4flash/FlashData.C          |  418 ++
 flash2d/lib/visnet4flash/FlashData.h          |  109 +
 flash2d/lib/visnet4flash/FlashMenu.C          |  325 +
 flash2d/lib/visnet4flash/FlashMenu.h          |   39 +
 flash2d/lib/visnet4flash/Makefile             |   85 +
 flash2d/lib/visnet4flash/Makefile.Settings    |  186 +
 flash2d/lib/visnet4flash/README               |    9 +
 flash2d/lib/visnet4flash/VectorList.C         |  121 +
 flash2d/lib/visnet4flash/VectorList.h         |   47 +
 flash2d/lib/visnet4flash/VisNET4Flash.C       |  193 +
 flash2d/lib/visnet4flash/main.C               |   91 +
 flash2d/src/README                            |   17 +
 flash2d/src/flash-sphere/ADV_rhs.f90          |   76 +
 flash2d/src/flash-sphere/ADV_semilagrange.F90 |  850 +++
 flash2d/src/flash-sphere/ADV_wind.f90         |  156 +
 flash2d/src/flash-sphere/FLASH_metadata.f90   |   63 +
 flash2d/src/flash-sphere/FLASH_parameters.f90 |  111 +
 flash2d/src/flash-sphere/Flash90.F90          |  106 +
 flash2d/src/flash-sphere/IO_gmvplot.F90       |  314 +
 flash2d/src/flash-sphere/IO_griddedplot.f90   |  142 +
 flash2d/src/flash-sphere/IO_matlabplot.F90    |  216 +
 flash2d/src/flash-sphere/IO_netcdfplot.f90    |  197 +
 flash2d/src/flash-sphere/IO_plotdefine.f90    |   40 +
 flash2d/src/flash-sphere/IO_utils.f90         | 1064 +++
 flash2d/src/flash-sphere/IO_vtu.F90           |  554 ++
 flash2d/src/flash-sphere/IO_vtuplot.F90       |  166 +
 flash2d/src/flash-sphere/MISC_outputdata.F90  |  155 +
 flash2d/src/flash-sphere/README               |   48 +
 flash2d/src/flash-sphere/SLM_advanced.f90     |  423 ++
 .../src/flash-sphere/SLM_errorestimate.f90    |  144 +
 flash2d/src/flash-sphere/SLM_initial.f90      |  337 +
 flash2d/src/flash-sphere/SLM_simple.f90       |  424 ++
 flash2d/src/flash/ADV_rhs.f90                 |   76 +
 flash2d/src/flash/ADV_semilagrange.F90        |  850 +++
 flash2d/src/flash/ADV_wind.f90                |  107 +
 flash2d/src/flash/FLASH_metadata.f90          |   63 +
 flash2d/src/flash/FLASH_parameters.f90        |  112 +
 flash2d/src/flash/Flash90.F90                 |  106 +
 flash2d/src/flash/IO_netcdfplot.f90           |  197 +
 flash2d/src/flash/IO_utils.f90                |  915 +++
 flash2d/src/flash/IO_vtu.F90                  |  553 ++
 flash2d/src/flash/IO_vtuplot.F90              |  166 +
 flash2d/src/flash/MISC_outputdata.F90         |  155 +
 flash2d/src/flash/README                      |   48 +
 flash2d/src/flash/SLM_advanced.f90            |  381 +
 flash2d/src/flash/SLM_errorestimate.f90       |  144 +
 flash2d/src/flash/SLM_initial.f90             |  495 ++
 flash2d/src/flash/SLM_simple.f90              |  388 +
 .../options-sphere/ADV_semilagrange.adv.F90   |  882 +++
 .../options-sphere/ADV_semilagrange.sim.F90   |  850 +++
 flash2d/src/options-sphere/ADV_wind.div       |  150 +
 flash2d/src/options-sphere/ADV_wind.mvortex   |  321 +
 .../options-sphere/SLM_advanced.cellint.f90   |  631 ++
 .../src/options-sphere/SLM_advanced.dual.f90  |  667 ++
 flash2d/src/options-sphere/SLM_advanced.dual2 |  625 ++
 .../src/options-sphere/SLM_advanced.dual2s    |  662 ++
 flash2d/src/options-sphere/SLM_initial.gaia   |  344 +
 .../src/options-sphere/SLM_initial.mvortex    |  515 ++
 flash2d/src/options-sphere/SLM_initial.sharp  |  334 +
 .../src/options-sphere/SLM_simple.clip.f90    |  459 ++
 flash2d/src/options/ADV_rhs.algae.f90         |   94 +
 flash2d/src/options/ADV_rhs.hom.f90           |   76 +
 flash2d/src/options/ADV_semilagrange.SW.F90   |  904 +++
 flash2d/src/options/ADV_semilagrange.adv.F90  |  883 +++
 .../src/options/ADV_semilagrange.algae.F90    |  882 +++
 flash2d/src/options/ADV_semilagrange.sim.F90  |  850 +++
 flash2d/src/options/ADV_wind.algae.f90        |  808 +++
 flash2d/src/options/ADV_wind.bar.f90          |  107 +
 flash2d/src/options/ADV_wind.circ.f90         |  109 +
 flash2d/src/options/ADV_wind.conv.f90         |  112 +
 flash2d/src/options/ADV_wind.diag.f90         |  103 +
 flash2d/src/options/ADV_wind.file.f90         |  749 ++
 flash2d/src/options/ADV_wind.kaeser.f90       |  128 +
 flash2d/src/options/ADV_wind.leveque.f90      |  115 +
 flash2d/src/options/ADV_wind.nowind.f90       |   91 +
 flash2d/src/options/ADV_wind.vortex.f90       |  139 +
 flash2d/src/options/ADV_wind.zonal.f90        |  104 +
 flash2d/src/options/ADV_wind_aviso.file.f90   |  469 ++
 flash2d/src/options/ADV_wind_netcdf.file.f90  |  363 +
 flash2d/src/options/FLASH_parameters.SW.f90   |  117 +
 flash2d/src/options/IO_vtuplot.SW.F90         |  177 +
 flash2d/src/options/SLM_advanced.algae.f90    |  551 ++
 flash2d/src/options/SLM_advanced.analytic.f90 |  341 +
 .../options/SLM_advanced.cellint.algae.f90    |  489 ++
 flash2d/src/options/SLM_advanced.cellint.f90  |  480 ++
 flash2d/src/options/SLM_advanced.clip.f90     |  416 ++
 flash2d/src/options/SLM_advanced.cons.f90     |  592 ++
 flash2d/src/options/SLM_advanced.dual.f90     |  544 ++
 flash2d/src/options/SLM_advanced.dual1.f90    |  518 ++
 flash2d/src/options/SLM_advanced.dual2.f90    |  580 ++
 .../src/options/SLM_advanced.dualSWCosine.f90 | 1227 ++++
 .../options/SLM_advanced.dualdiffusion.F90    |  971 +++
 flash2d/src/options/SLM_advanced.mpslm.f90    | 2235 ++++++
 flash2d/src/options/SLM_advanced.plain.f90    |  381 +
 .../src/options/SLM_advanced.quadrature.f90   |  522 ++
 .../src/options/SLM_advanced.quadrature7.f90  |  537 ++
 flash2d/src/options/SLM_advanced.tps.f90      |  381 +
 flash2d/src/options/SLM_initial.3humps.f90    |  407 ++
 flash2d/src/options/SLM_initial.SWCosine.f90  |  379 +
 flash2d/src/options/SLM_initial.UoR.f90       |  436 ++
 flash2d/src/options/SLM_initial.advdiff.f90   |  350 +
 flash2d/src/options/SLM_initial.algae.f90     |  355 +
 .../src/options/SLM_initial.algaeBaltic.f90   |  344 +
 flash2d/src/options/SLM_initial.aviso.f90     |  551 ++
 flash2d/src/options/SLM_initial.bar.f90       |  184 +
 flash2d/src/options/SLM_initial.circ.f90      |  551 ++
 flash2d/src/options/SLM_initial.conv.f90      |  299 +
 flash2d/src/options/SLM_initial.diag.f90      |  327 +
 flash2d/src/options/SLM_initial.file.f90      |  507 ++
 flash2d/src/options/SLM_initial.kaeser.f90    |  272 +
 flash2d/src/options/SLM_initial.leveque.f90   |  638 ++
 flash2d/src/options/SLM_initial.m3.f90        |  363 +
 flash2d/src/options/SLM_initial.nowind.f90    |  496 ++
 flash2d/src/options/SLM_initial.slot.f90      |  495 ++
 flash2d/src/options/SLM_initial.tum.f90       |  223 +
 flash2d/src/options/SLM_initial.vortex.f90    |  272 +
 flash2d/src/options/SLM_initial.xmas.f90      |  415 ++
 flash2d/src/options/SLM_initial.xmasElk.f90   |  457 ++
 flash2d/src/options/SLM_initial.xmasanim.f90  |  428 ++
 flash2d/src/options/SLM_simple.algae.f90      |  395 ++
 flash2d/src/options/SLM_simple.clip.f90       |  415 ++
 flash2d/src/options/SLM_simple.periodic.f90   |  425 ++
 flash2d/src/options/SLM_simple.plain.f90      |  382 +
 flash2d/src/options/SLM_simple.tps.f90        |  382 +
 flash2d/src/petsc/Makefile.t3e                |   48 +
 flash2d/src/petsc/README                      |   44 +
 flash2d/src/petsc/graphics.F90                |  591 ++
 flash2d/src/system/cray-f90/MISC_system.f90   |   97 +
 flash2d/src/system/gfortran/MISC_system.f90   |   96 +
 flash2d/src/system/gfortran/MISC_wrapper.c    |   15 +
 flash2d/src/system/mpi/PAR_datatype.f         |  470 ++
 flash2d/src/system/mpi/PAR_sysstop.f          |   74 +
 flash2d/src/system/mpi/PAR_system.f           | 1085 +++
 flash2d/src/system/nag-f90/MISC_system.f90    |   93 +
 flash2d/src/system/posix-f90/MISC_system.f90  |   97 +
 flash2d/src/system/std-f90/MISC_system.f90    |   94 +
 flash2d/src/timing/MISC_timing.f90            |  324 +
 flash2d/templates/header.f                    |   24 +
 flash2d/templates/header.h                    |   17 +
 flash2d/templates/module_header.f             |   42 +
 flash2d/templates/readtemplate                |   16 +
 flash2d/tools/runFLASH                        |  329 +
 flash2d/tools/testreihe                       |  175 +
 230 files changed, 74973 insertions(+)
 create mode 100644 flash2d/compile/Makefiles/Makefile.common
 create mode 100644 flash2d/compile/Makefiles/Makefile_gfortran_plane
 create mode 100644 flash2d/compile/Makefiles/Makefile_gfortran_sphere
 create mode 100644 flash2d/compile/Makefiles/Makefile_intel_plane
 create mode 100644 flash2d/compile/Makefiles/Makefile_intel_sphere
 create mode 100644 flash2d/compile/irix/Makefile
 create mode 100644 flash2d/compile/irix/Makefile.sam
 create mode 100644 flash2d/compile/linux_g64/Makefile
 create mode 100644 flash2d/compile/linux_g64/Makefile.sphere
 create mode 100644 flash2d/compile/linux_g64/README
 create mode 100644 flash2d/compile/linux_ia64/Makefile
 create mode 100644 flash2d/compile/macosx_gfortran/Makefile
 create mode 100644 flash2d/compile/macosx_intel/Makefile
 create mode 100644 flash2d/compile/solaris_sparc/Makefile
 create mode 100644 flash2d/data/Domain.SWCosine.dat
 create mode 100644 flash2d/data/Domain.dat
 create mode 100644 flash2d/data/DomainSph.global.dat
 create mode 100644 flash2d/data/Domain_aviso.dat
 create mode 100644 flash2d/data/Domain_periodic_pi.dat
 create mode 100644 flash2d/data/Initial.dat
 create mode 100644 flash2d/data/Land.dat
 create mode 100644 flash2d/data/Parambench.dat
 create mode 100644 flash2d/data/Parameters.SW.dat
 create mode 100644 flash2d/data/Parameters.dat
 create mode 100644 flash2d/data/Parameters.generic
 create mode 100644 flash2d/data/Parameters.new.dat
 create mode 100644 flash2d/data/Parameters_aviso.dat
 create mode 100644 flash2d/data/PotsdamInput/Domain.windxxx
 create mode 100644 flash2d/data/PotsdamInput/Initial.windxxx
 create mode 100644 flash2d/data/PotsdamInput/Input.windxxx
 create mode 100644 flash2d/data/PotsdamInput/Land.dat
 create mode 100644 flash2d/data/PotsdamInput/Windparam.windxxx
 create mode 100644 flash2d/data/README
 create mode 100644 flash2d/data/Triang.SWCosine.dat
 create mode 100644 flash2d/data/Triang.dat
 create mode 100644 flash2d/data/Triang12.dat
 create mode 100644 flash2d/data/TriangSph.ico.dat
 create mode 100644 flash2d/data/Triang_algaeBaltic.dat
 create mode 100644 flash2d/data/Triang_aviso.dat
 create mode 100644 flash2d/data/Triang_periodic.dat
 create mode 100644 flash2d/data/Triang_periodic_pi.dat
 create mode 100644 flash2d/data/Wind_algae.dat
 create mode 100644 flash2d/data/Wind_aviso.dat
 create mode 100644 flash2d/data/default.ftf
 create mode 100644 flash2d/data/elch.pbm
 create mode 100644 flash2d/doc/Dataflow.eps
 create mode 100644 flash2d/doc/Datastruct.eps
 create mode 100644 flash2d/doc/FlashRef.bib
 create mode 100644 flash2d/doc/Flash_doxyfile.mac
 create mode 100644 flash2d/doc/GridFlow.ps
 create mode 100644 flash2d/doc/InputDok.ps
 create mode 100644 flash2d/doc/README
 create mode 100644 flash2d/doc/Triang.ps
 create mode 100644 flash2d/doc/flash.png
 create mode 100644 flash2d/doc/grids.ps
 create mode 100644 flash2d/doc/mainpage.txt
 create mode 100644 flash2d/doc/modifikationen.txt
 create mode 100644 flash2d/doc/netcdf.doc
 create mode 100644 flash2d/doc/para-grid.eps
 create mode 100644 flash2d/doc/sources/Callingtree.sc
 create mode 100644 flash2d/doc/sources/Dataflow.sc
 create mode 100644 flash2d/doc/sources/Datastruct.old.sc
 create mode 100644 flash2d/doc/sources/Datastruct.sc
 create mode 100644 flash2d/doc/sources/FlowTempl.sc
 create mode 100644 flash2d/doc/sources/GridFlow.sc
 create mode 100644 flash2d/doc/sources/InputDok.tex
 create mode 100644 flash2d/doc/sources/Triang.sc
 create mode 100644 flash2d/doc/sources/grids.fig
 create mode 100644 flash2d/doc/sources/para-grid.sc
 create mode 100644 flash2d/doc/sources/structure.fig
 create mode 100644 flash2d/doc/structure.ps
 create mode 100644 flash2d/eval/diagfile.gnu
 create mode 100644 flash2d/eval/diagmulti.m
 create mode 100644 flash2d/eval/diagprint.gnu
 create mode 100644 flash2d/eval/diags.gnu
 create mode 100644 flash2d/eval/diags.m
 create mode 100644 flash2d/eval/gmv_default.attr
 create mode 100644 flash2d/eval/gmv_wind.attr
 create mode 100644 flash2d/eval/gmvlevel.attr
 create mode 100644 flash2d/eval/gmvtracer.attr
 create mode 100644 flash2d/eval/gmvtracer1.attr
 create mode 100644 flash2d/eval/gpc2matlab.m
 create mode 100644 flash2d/eval/grid_dat.m
 create mode 100644 flash2d/eval/gridded.gnu
 create mode 100644 flash2d/eval/poly.m
 create mode 100644 flash2d/eval/poly.sci
 create mode 100644 flash2d/eval/triang.m
 create mode 100644 flash2d/lib/visnet4flash/FlashData.C
 create mode 100644 flash2d/lib/visnet4flash/FlashData.h
 create mode 100644 flash2d/lib/visnet4flash/FlashMenu.C
 create mode 100644 flash2d/lib/visnet4flash/FlashMenu.h
 create mode 100644 flash2d/lib/visnet4flash/Makefile
 create mode 100644 flash2d/lib/visnet4flash/Makefile.Settings
 create mode 100644 flash2d/lib/visnet4flash/README
 create mode 100644 flash2d/lib/visnet4flash/VectorList.C
 create mode 100644 flash2d/lib/visnet4flash/VectorList.h
 create mode 100644 flash2d/lib/visnet4flash/VisNET4Flash.C
 create mode 100644 flash2d/lib/visnet4flash/main.C
 create mode 100644 flash2d/src/README
 create mode 100644 flash2d/src/flash-sphere/ADV_rhs.f90
 create mode 100644 flash2d/src/flash-sphere/ADV_semilagrange.F90
 create mode 100644 flash2d/src/flash-sphere/ADV_wind.f90
 create mode 100644 flash2d/src/flash-sphere/FLASH_metadata.f90
 create mode 100644 flash2d/src/flash-sphere/FLASH_parameters.f90
 create mode 100644 flash2d/src/flash-sphere/Flash90.F90
 create mode 100644 flash2d/src/flash-sphere/IO_gmvplot.F90
 create mode 100644 flash2d/src/flash-sphere/IO_griddedplot.f90
 create mode 100644 flash2d/src/flash-sphere/IO_matlabplot.F90
 create mode 100644 flash2d/src/flash-sphere/IO_netcdfplot.f90
 create mode 100644 flash2d/src/flash-sphere/IO_plotdefine.f90
 create mode 100644 flash2d/src/flash-sphere/IO_utils.f90
 create mode 100644 flash2d/src/flash-sphere/IO_vtu.F90
 create mode 100644 flash2d/src/flash-sphere/IO_vtuplot.F90
 create mode 100644 flash2d/src/flash-sphere/MISC_outputdata.F90
 create mode 100644 flash2d/src/flash-sphere/README
 create mode 100644 flash2d/src/flash-sphere/SLM_advanced.f90
 create mode 100644 flash2d/src/flash-sphere/SLM_errorestimate.f90
 create mode 100644 flash2d/src/flash-sphere/SLM_initial.f90
 create mode 100644 flash2d/src/flash-sphere/SLM_simple.f90
 create mode 100644 flash2d/src/flash/ADV_rhs.f90
 create mode 100644 flash2d/src/flash/ADV_semilagrange.F90
 create mode 100644 flash2d/src/flash/ADV_wind.f90
 create mode 100644 flash2d/src/flash/FLASH_metadata.f90
 create mode 100644 flash2d/src/flash/FLASH_parameters.f90
 create mode 100644 flash2d/src/flash/Flash90.F90
 create mode 100644 flash2d/src/flash/IO_netcdfplot.f90
 create mode 100644 flash2d/src/flash/IO_utils.f90
 create mode 100644 flash2d/src/flash/IO_vtu.F90
 create mode 100644 flash2d/src/flash/IO_vtuplot.F90
 create mode 100644 flash2d/src/flash/MISC_outputdata.F90
 create mode 100644 flash2d/src/flash/README
 create mode 100644 flash2d/src/flash/SLM_advanced.f90
 create mode 100644 flash2d/src/flash/SLM_errorestimate.f90
 create mode 100644 flash2d/src/flash/SLM_initial.f90
 create mode 100644 flash2d/src/flash/SLM_simple.f90
 create mode 100644 flash2d/src/options-sphere/ADV_semilagrange.adv.F90
 create mode 100644 flash2d/src/options-sphere/ADV_semilagrange.sim.F90
 create mode 100644 flash2d/src/options-sphere/ADV_wind.div
 create mode 100644 flash2d/src/options-sphere/ADV_wind.mvortex
 create mode 100644 flash2d/src/options-sphere/SLM_advanced.cellint.f90
 create mode 100644 flash2d/src/options-sphere/SLM_advanced.dual.f90
 create mode 100644 flash2d/src/options-sphere/SLM_advanced.dual2
 create mode 100644 flash2d/src/options-sphere/SLM_advanced.dual2s
 create mode 100644 flash2d/src/options-sphere/SLM_initial.gaia
 create mode 100644 flash2d/src/options-sphere/SLM_initial.mvortex
 create mode 100644 flash2d/src/options-sphere/SLM_initial.sharp
 create mode 100644 flash2d/src/options-sphere/SLM_simple.clip.f90
 create mode 100644 flash2d/src/options/ADV_rhs.algae.f90
 create mode 100644 flash2d/src/options/ADV_rhs.hom.f90
 create mode 100644 flash2d/src/options/ADV_semilagrange.SW.F90
 create mode 100644 flash2d/src/options/ADV_semilagrange.adv.F90
 create mode 100644 flash2d/src/options/ADV_semilagrange.algae.F90
 create mode 100644 flash2d/src/options/ADV_semilagrange.sim.F90
 create mode 100644 flash2d/src/options/ADV_wind.algae.f90
 create mode 100644 flash2d/src/options/ADV_wind.bar.f90
 create mode 100644 flash2d/src/options/ADV_wind.circ.f90
 create mode 100644 flash2d/src/options/ADV_wind.conv.f90
 create mode 100644 flash2d/src/options/ADV_wind.diag.f90
 create mode 100644 flash2d/src/options/ADV_wind.file.f90
 create mode 100644 flash2d/src/options/ADV_wind.kaeser.f90
 create mode 100644 flash2d/src/options/ADV_wind.leveque.f90
 create mode 100644 flash2d/src/options/ADV_wind.nowind.f90
 create mode 100644 flash2d/src/options/ADV_wind.vortex.f90
 create mode 100644 flash2d/src/options/ADV_wind.zonal.f90
 create mode 100644 flash2d/src/options/ADV_wind_aviso.file.f90
 create mode 100644 flash2d/src/options/ADV_wind_netcdf.file.f90
 create mode 100644 flash2d/src/options/FLASH_parameters.SW.f90
 create mode 100644 flash2d/src/options/IO_vtuplot.SW.F90
 create mode 100644 flash2d/src/options/SLM_advanced.algae.f90
 create mode 100644 flash2d/src/options/SLM_advanced.analytic.f90
 create mode 100644 flash2d/src/options/SLM_advanced.cellint.algae.f90
 create mode 100644 flash2d/src/options/SLM_advanced.cellint.f90
 create mode 100644 flash2d/src/options/SLM_advanced.clip.f90
 create mode 100644 flash2d/src/options/SLM_advanced.cons.f90
 create mode 100644 flash2d/src/options/SLM_advanced.dual.f90
 create mode 100644 flash2d/src/options/SLM_advanced.dual1.f90
 create mode 100644 flash2d/src/options/SLM_advanced.dual2.f90
 create mode 100644 flash2d/src/options/SLM_advanced.dualSWCosine.f90
 create mode 100644 flash2d/src/options/SLM_advanced.dualdiffusion.F90
 create mode 100644 flash2d/src/options/SLM_advanced.mpslm.f90
 create mode 100644 flash2d/src/options/SLM_advanced.plain.f90
 create mode 100644 flash2d/src/options/SLM_advanced.quadrature.f90
 create mode 100644 flash2d/src/options/SLM_advanced.quadrature7.f90
 create mode 100644 flash2d/src/options/SLM_advanced.tps.f90
 create mode 100644 flash2d/src/options/SLM_initial.3humps.f90
 create mode 100644 flash2d/src/options/SLM_initial.SWCosine.f90
 create mode 100644 flash2d/src/options/SLM_initial.UoR.f90
 create mode 100644 flash2d/src/options/SLM_initial.advdiff.f90
 create mode 100644 flash2d/src/options/SLM_initial.algae.f90
 create mode 100644 flash2d/src/options/SLM_initial.algaeBaltic.f90
 create mode 100644 flash2d/src/options/SLM_initial.aviso.f90
 create mode 100644 flash2d/src/options/SLM_initial.bar.f90
 create mode 100644 flash2d/src/options/SLM_initial.circ.f90
 create mode 100644 flash2d/src/options/SLM_initial.conv.f90
 create mode 100644 flash2d/src/options/SLM_initial.diag.f90
 create mode 100644 flash2d/src/options/SLM_initial.file.f90
 create mode 100644 flash2d/src/options/SLM_initial.kaeser.f90
 create mode 100644 flash2d/src/options/SLM_initial.leveque.f90
 create mode 100644 flash2d/src/options/SLM_initial.m3.f90
 create mode 100644 flash2d/src/options/SLM_initial.nowind.f90
 create mode 100644 flash2d/src/options/SLM_initial.slot.f90
 create mode 100644 flash2d/src/options/SLM_initial.tum.f90
 create mode 100644 flash2d/src/options/SLM_initial.vortex.f90
 create mode 100644 flash2d/src/options/SLM_initial.xmas.f90
 create mode 100644 flash2d/src/options/SLM_initial.xmasElk.f90
 create mode 100644 flash2d/src/options/SLM_initial.xmasanim.f90
 create mode 100644 flash2d/src/options/SLM_simple.algae.f90
 create mode 100644 flash2d/src/options/SLM_simple.clip.f90
 create mode 100644 flash2d/src/options/SLM_simple.periodic.f90
 create mode 100644 flash2d/src/options/SLM_simple.plain.f90
 create mode 100644 flash2d/src/options/SLM_simple.tps.f90
 create mode 100644 flash2d/src/petsc/Makefile.t3e
 create mode 100644 flash2d/src/petsc/README
 create mode 100644 flash2d/src/petsc/graphics.F90
 create mode 100644 flash2d/src/system/cray-f90/MISC_system.f90
 create mode 100644 flash2d/src/system/gfortran/MISC_system.f90
 create mode 100644 flash2d/src/system/gfortran/MISC_wrapper.c
 create mode 100644 flash2d/src/system/mpi/PAR_datatype.f
 create mode 100644 flash2d/src/system/mpi/PAR_sysstop.f
 create mode 100644 flash2d/src/system/mpi/PAR_system.f
 create mode 100644 flash2d/src/system/nag-f90/MISC_system.f90
 create mode 100644 flash2d/src/system/posix-f90/MISC_system.f90
 create mode 100644 flash2d/src/system/std-f90/MISC_system.f90
 create mode 100644 flash2d/src/timing/MISC_timing.f90
 create mode 100644 flash2d/templates/header.f
 create mode 100644 flash2d/templates/header.h
 create mode 100644 flash2d/templates/module_header.f
 create mode 100644 flash2d/templates/readtemplate
 create mode 100644 flash2d/tools/runFLASH
 create mode 100644 flash2d/tools/testreihe

diff --git a/flash2d/compile/Makefiles/Makefile.common b/flash2d/compile/Makefiles/Makefile.common
new file mode 100644
index 0000000..761efc7
--- /dev/null
+++ b/flash2d/compile/Makefiles/Makefile.common
@@ -0,0 +1,266 @@
+#------------------------------------------------------------------------#
+# +--------------------------------------------------------------------+ #
+# | common stuff (this file must be included from individual Makefile) | #
+# +--------------------------------------------------------------------+ #
+#------------------------------------------------------------------------#
+
+#----------------------------------------------------------------#
+# OBJECTS                                                        #
+#----------------------------------------------------------------#
+MAINOBJ = \
+FLASH_parameters.o \
+MISC_timing.o \
+MISC_system.o \
+IO_utils.o \
+MISC_outputdata.o \
+IO_vtu.o \
+IO_vtuplot.o
+
+ifneq ($(strip $(NO_NETCDF)), yes)
+MAINOBJ += \
+IO_netcdfplot.o
+endif
+
+MAINOBJ += \
+ADV_wind.o \
+SLM_initial.o \
+SLM_errorestimate.o \
+ADV_rhs.o \
+SLM_simple.o \
+SLM_advanced.o \
+ADV_semilagrange.o \
+Flash90.o
+
+#----------------------------------------------------------------#
+# COMPILE STEP                                                   #
+#----------------------------------------------------------------#
+
+.SUFFIXES: .F90 .f90 $(SUFFIXES)
+
+.F90.o:
+	@echo "make: Building object module from "$<
+	$(F90) $(FFLAGS) $(INCS) -c $<
+
+.f90.o:
+	@echo "make: Building object module from "$<
+	$(F90) $(FFLAGS) $(INCS) -c $<
+
+.c.o:
+	@echo "make: Building object module from "$<
+	$(CC) $(CFLAGS) $(INCS) -D$(MACHINE) -c $<
+
+clearsrc::
+	@rm -f *.f90 *.h *.F90
+
+clearex::
+	@rm -f $(MAKETHING) Flash90* fort.*
+
+cleardat::
+	@rm -f *.dat *.ftf
+
+clean::
+	@rm -f *.o *.i90 *.$(MODEND) core
+
+tidy::
+	make clean
+	make clearex
+	make cleardat
+	make clearsrc
+
+#----------------------------------------------------------------#
+# THIS COPIES REQUIRED DATA FILES                                #
+#----------------------------------------------------------------#
+
+datacopy::
+	@cp $(DATDIR)/Domain.dat .
+	@cp $(DATDIR)/Initial.dat .
+	@cp $(DATDIR)/Land.dat .
+	@cp $(DATDIR)/Triang.dat .
+	@cp $(DATDIR)/Parameters.dat .
+	@cp $(DATDIR)/default.ftf .
+
+datasphere::
+	@make datacopy
+	@cp $(DATDIR)/DomainSph.global.dat Domain.dat
+	@cp $(DATDIR)/TriangSph.ico.dat Triang.dat
+
+
+avisocopy::
+	@cp $(DATDIR)/Domain_aviso.dat .
+	@cp $(DATDIR)/Initial.dat .
+	@cp $(DATDIR)/Land.dat .
+	@cp $(DATDIR)/Triang_aviso.dat .
+	@cp $(DATDIR)/Parameters_aviso.dat .
+	@cp $(DATDIR)/Wind_aviso.dat .
+	@cp $(DATDIR)/default.ftf .
+
+ShallowWaterCopy::
+	@cp $(DATDIR)/Domain.SWCosine.dat Domain.dat
+	@cp $(DATDIR)/Triang.SWCosine.dat Triang.dat
+	@cp $(DATDIR)/Parameters.SW.dat Parameters.dat
+
+#----------------------------------------------------------------#
+# THIS CREATES PREDEFINED OPTIONS                                #
+#----------------------------------------------------------------#
+
+maincopy::
+	@cp $(SRCDIR)/*.f90 .
+	@cp $(SRCDIR)/*.F90 .
+	@cp $(SYSDIR)/*.f90 .
+	@cp $(TIMDIR)/*.f90 .
+
+Slot::
+	@make maincopy
+	@cp $(OPTDIR)/SLM_simple.clip.f90 SLM_simple.f90
+
+Potsdam::
+	@cp $(OPTDIR)/ADV_wind.file.f90 ADV_wind.f90
+	@cp $(OPTDIR)/SLM_initial.file.f90 SLM_initial.f90
+	@cp $(OPTDIR)/ADV_semilagrange.adv.F90 ADV_semilagrange.F90
+	@cp $(OPTDIR)/SLM_simple.clip.f90 SLM_simple.f90
+	@cp $(OPTDIR)/SLM_advanced.dual.f90 SLM_advanced.f90
+
+Analytic::
+	@cp $(OPTDIR)/ADV_semilagrange.adv.F90 ADV_semilagrange.F90
+	@cp $(OPTDIR)/SLM_simple.clip.f90 SLM_simple.f90
+	@cp $(OPTDIR)/SLM_advanced.analytic.f90 SLM_advanced.f90
+
+Bar::
+	@cp $(OPTDIR)/SLM_simple.clip.f90 SLM_simple.f90
+	@cp $(OPTDIR)/ADV_wind.bar.f90 ADV_wind.f90
+	@cp $(OPTDIR)/SLM_initial.bar.f90 SLM_initial.f90
+
+Conservative::
+	@cp $(OPTDIR)/ADV_semilagrange.adv.F90 ADV_semilagrange.F90
+	@cp $(OPTDIR)/SLM_simple.clip.f90 SLM_simple.f90
+	@cp $(OPTDIR)/SLM_advanced.cons.f90 SLM_advanced.f90
+
+Dual::
+	@cp $(OPTDIR)/ADV_semilagrange.adv.F90 ADV_semilagrange.F90
+	@cp $(OPTDIR)/SLM_simple.clip.f90 SLM_simple.f90
+	@cp $(OPTDIR)/SLM_advanced.dual.f90 SLM_advanced.f90
+
+Cellintegrated::
+	@cp $(OPTDIR)/ADV_semilagrange.adv.F90 ADV_semilagrange.F90
+	@cp $(OPTDIR)/SLM_simple.clip.f90 SLM_simple.f90
+	@cp $(OPTDIR)/SLM_advanced.cellint.f90 SLM_advanced.f90
+
+Quadrature::
+	@cp $(OPTDIR)/ADV_semilagrange.adv.F90 ADV_semilagrange.F90
+	@cp $(OPTDIR)/SLM_simple.clip.f90 SLM_simple.f90
+	@cp $(OPTDIR)/SLM_advanced.quadrature.f90 SLM_advanced.f90
+
+Quadrature7::
+	@cp $(OPTDIR)/ADV_semilagrange.adv.F90 ADV_semilagrange.F90
+	@cp $(OPTDIR)/SLM_simple.clip.f90 SLM_simple.f90
+	@cp $(OPTDIR)/SLM_advanced.quadrature7.f90 SLM_advanced.f90
+
+MPSLM::
+	@cp $(OPTDIR)/ADV_semilagrange.adv.F90 ADV_semilagrange.F90
+	@cp $(OPTDIR)/SLM_simple.clip.f90 SLM_simple.f90
+	@cp $(OPTDIR)/SLM_advanced.mpslm.f90 SLM_advanced.f90
+
+ConvWind::
+	@cp $(OPTDIR)/ADV_wind.conv.f90 ADV_wind.f90
+	@cp $(OPTDIR)/SLM_initial.conv.f90 SLM_initial.f90
+
+DiagWind::
+	@cp $(OPTDIR)/ADV_wind.diag.f90 ADV_wind.f90
+	@cp $(OPTDIR)/SLM_initial.diag.f90 SLM_initial.f90
+
+Kaeser::
+	@cp $(OPTDIR)/ADV_wind.kaeser.f90 ADV_wind.f90
+	@cp $(OPTDIR)/SLM_initial.kaeser.f90 SLM_initial.f90
+
+CircWind::
+	@cp $(OPTDIR)/ADV_wind.circ.f90 ADV_wind.f90
+	@cp $(OPTDIR)/SLM_initial.circ.f90 SLM_initial.f90
+
+NoWind::
+	@cp $(OPTDIR)/ADV_wind.nowind.f90 ADV_wind.f90
+	@cp $(OPTDIR)/SLM_initial.nowind.f90 SLM_initial.f90
+
+LeVeque:
+	@cp $(OPTDIR)/ADV_wind.leveque.f90 ADV_wind.f90
+	@cp $(OPTDIR)/SLM_initial.leveque.f90 SLM_initial.f90
+
+Aviso:
+	@make Slot
+	@make Dual
+	@cp $(OPTDIR)/ADV_wind_aviso.file.f90 ADV_wind.f90
+	@cp $(OPTDIR)/SLM_initial.aviso.f90 SLM_initial.f90
+
+Algae:
+	@make Slot
+	@make Dual
+	@cp $(OPTDIR)/ADV_rhs.algae.f90 ADV_rhs.f90
+	@cp $(OPTDIR)/SLM_simple.algae.f90 SLM_simple.f90
+	@cp $(OPTDIR)/SLM_advanced.algae.f90 SLM_advanced.f90
+	@cp $(OPTDIR)/ADV_wind.circ.f90 ADV_wind.f90
+	@cp $(OPTDIR)/SLM_initial.algae.f90 SLM_initial.f90
+	@cp $(OPTDIR)/ADV_semilagrange.algae.F90 ADV_semilagrange.F90
+
+AlgaeBaltic:
+	@make Algae
+	@cp $(OPTDIR)/ADV_wind.algae.f90 ADV_wind.f90
+	@cp $(OPTDIR)/SLM_initial.algaeBaltic.f90 SLM_initial.f90
+	@cp $(DATDIR)/Wind_algae.dat Windparam.dat
+	@cp $(DATDIR)/Triang_algaeBaltic.dat Triang.dat
+
+Diffusion::
+	@make Slot
+	@make Dual
+	@make LeVeque
+	@rm SLM_advanced.f90
+	@cp $(OPTDIR)/SLM_advanced.dualdiffusion.F90 SLM_advanced.F90
+    
+DiffusionNoWindTest::
+	@make Slot
+	@make Dual
+	@make NoWind
+	@cp $(OPTDIR)/SLM_initial.circ SLM_initial.f90
+	@rm SLM_advanced.f90
+	@cp $(OPTDIR)/SLM_advanced.dualdiffusion.F90 SLM_advanced.F90
+
+AdvDifErf::
+	@make Slot
+	@make Dual
+	@cp $(OPTDIR)/ADV_wind.zonal.f90 ADV_wind.f90
+	@rm SLM_initial.f90
+	@cp $(OPTDIR)/SLM_initial.advdiff.f90 SLM_initial.F90
+	@rm SLM_advanced.f90
+	@cp $(OPTDIR)/SLM_advanced.dualdiffusion.F90 SLM_advanced.F90
+
+ShallowWater:
+	@make Slot
+	@cp $(OPTDIR)/FLASH_parameters.SW.f90 FLASH_parameters.f90
+	@cp $(OPTDIR)/ADV_semilagrange.SW.F90 ADV_semilagrange.F90
+	@cp $(OPTDIR)/SLM_advanced.dualSWCosine.f90 SLM_advanced.f90
+	@cp $(OPTDIR)/SLM_initial.SWCosine.f90 SLM_initial.f90
+	@cp $(OPTDIR)/IO_vtuplot.SW.F90 IO_vtuplot.F90
+
+#----------------------------------------------------------------#
+# THIS COMPILES THE MAIN PROGRAM                                 #
+#----------------------------------------------------------------#
+
+executable: $(MAINOBJ)
+	@echo "make: Linking object modules and libraries"
+	$(LOADER) $(LDFLAGS) -o $(MAKETHING) $(MAINOBJ) $(LIBS) 
+
+
+$(MAKETHING)::
+	@make maincopy
+ifneq ($(strip $(NO_MPSLM)),yes)
+	@make MPSLM
+endif
+	@make executable
+
+all::
+	@make maincopy
+	@make executable
+	@make clearsrc
+	@make clean
+
+#----------------------------------------------------------------#
+# DEPENDENCIES ON INCLUDE FILES                                  #
+#----------------------------------------------------------------#
diff --git a/flash2d/compile/Makefiles/Makefile_gfortran_plane b/flash2d/compile/Makefiles/Makefile_gfortran_plane
new file mode 100644
index 0000000..b99e556
--- /dev/null
+++ b/flash2d/compile/Makefiles/Makefile_gfortran_plane
@@ -0,0 +1,145 @@
+##################################################################
+#   FLASH90                                                      #
+#   FLexible Adaptive Semi-Lagrangian Hack                       #
+#   written in Fortran 90                                        #
+##################################################################
+# makefile to build FLASH                                        #
+# j. behrens 2/95, 3/96, 8/98                                    #
+# l. mentrup 7/05                                                #
+# --- this is for linux ---                                      #
+##################################################################
+
+# MACHINE
+MACHINE = macosx_gfortran
+
+# SYSTEM
+SYSTEM = gfortran
+
+# SET MAKETHING CORRESPONDING TO MACHINE:
+MAKETHING= FLASH
+
+# OPTIMIZATION SETTINGS [debug|norm|opt]
+MODE := debug
+
+# LIBRARY SETTINGS [yes|no]
+# Useage: make NO_NETCDF=yes NO_VISNET=yes
+NO_NETCDF := no
+NO_VISNET := yes
+
+# Use Method MPSLM [yes|no]
+NO_MPSLM := yes
+
+# SET MAIN DIRECTORY PATH
+# !! This has to be alterd by user !!
+ROOTDIR = $(HOME)/Documents/Development/amatos
+
+# SET atlas/blas DIRECTORY PATH
+# !! This has to be alterd by user !!
+BLASDIR = 
+BLASLIB = 
+
+# SET LAPACK DIRECTORY PATH/BLAS INCLUDED IN INTEL MKL
+# !! This has to be alterd by user !!
+LAPACKDIR =  
+LAPACKLIB =  -framework Accelerate
+
+# SET C++ DIRECTORY PATH
+# !! This has to be alterd by user !!
+CCLIBDIR = -L/usr/lib/
+CCLIB = -lstdc++
+
+# SET MORE DIRECTORY PATHS
+LIBDIR  = $(ROOTDIR)/amatos2d/trunk/lib/$(MACHINE)
+INCDIR  = $(ROOTDIR)/amatos2d/trunk/include/$(MACHINE)
+MODDIR  = $(ROOTDIR)/amatos2d/trunk/include/$(MACHINE)
+MAINDIR = $(ROOTDIR)/flash2d/trunk
+
+SRCDIR  = $(MAINDIR)/src/flash
+OPTDIR  = $(MAINDIR)/src/options
+SYSDIR  = $(MAINDIR)/src/system/$(SYSTEM)
+TIMDIR  = $(MAINDIR)/src/timing
+DATDIR  = $(MAINDIR)/data
+BUILDIR = $(MAINDIR)/compile/$(MACHINE)
+
+# SET NETCDF PATHS
+LIBNETCDF = 
+INCNETCDF =
+ifneq ($(strip $(NO_NETCDF)), yes)
+LIBNETCDF = -L$(LIBDIR) -lncugrid -L/sw2/lib -lnetcdff -lnetcdf
+INCNETCDF = -I/sw2/include
+endif
+
+# SET VISNET DIRECTORY PATH
+# !! This has to be alterd by user !!
+VISNETDIR =
+VISNETLIB = 
+ifneq ($(strip $(NO_VISNET)),yes)
+VISNETDIR = -L$(ROOTDIR)/lib/SINGLE
+VISNETLIB = -lvisnet4flash -lm3tv -ldelaunay \
+	    -ldetri -llia -lsos -lbasic \
+	    $(VISNETDIR)/fortify.o \
+	    -lglut -lGLU -lGL -ltiff
+endif
+
+# SET PATH TO GRID_API.mod
+AMATOS    = $(MODDIR)/grid_api.mod
+
+# SET THE ENDING OF MODULE FILES
+MODEND  = mod
+
+#----------------------------------------------------------------#
+# FLAGS FOR LINUX / Intel Fortran Compiler                       #
+#----------------------------------------------------------------#
+F90 	= gfortran
+cc 	= gcc
+CC 	= g++
+LOADER  = gfortran
+
+# --------------------- next are for debugging ------------------#
+ifeq ($(strip $(MODE)),debug)
+  FFLAGS  = -fbounds-check -ggdb -fpic -funderscoring # -C
+  CFLAGS  = -ggdb -fpic
+  LDFLAGS = -ggdb
+endif
+# --------------------- next are for normal compilation ---------#
+ifeq ($(strip $(MODE)),norm)
+  FFLAGS  = -fPIC -funderscoring
+  CFLAGS  = -fpic
+  LDFLAGS =
+endif
+# --------------------- next are for optimization ---------------#
+ifeq ($(strip $(MODE)),opt)
+  FFLAGS  = -O3 -fPIC -funderscoring
+  CFLAGS  = -O3 -fpic
+  LDFLAGS = -O3
+endif
+
+# --------------------- include Visnet/NetCDF or not ------------#
+ifeq ($(strip $(NO_VISNET)),yes)
+FFLAGS += -DNO_VISNET
+endif
+ifeq ($(strip $(NO_NETCDF)),yes)
+FFLAGS += -DNO_NETCDF
+endif
+
+FFLAGS += -D$(MACHINE)
+CFLAGS += -D$(MACHINE)
+
+# -------- next flag for using dummy graphics library -----------#
+LIBS = -L$(LIBDIR) $(BLASDIR) $(BLASLIB) \
+	           $(LAPACKDIR) $(LAPACKLIB) \
+		   $(VISNETDIR) $(VISNETLIB) \
+		   $(LIBNETCDF) $(CCLIBDIR) $(CCLIB)\
+        	   -lamatos -lm
+		    
+INCS = $(INCNETCDF) -I$(INCDIR) -I$(MODDIR)
+
+#----------------------------------------------------------------#
+# common stuff                                                   #
+#----------------------------------------------------------------#
+
+include $(MAINDIR)/compile/Makefiles/Makefile.common
+
+#----------------------------------------------------------------#
+# END of Makefile                                                #
+#----------------------------------------------------------------#
diff --git a/flash2d/compile/Makefiles/Makefile_gfortran_sphere b/flash2d/compile/Makefiles/Makefile_gfortran_sphere
new file mode 100644
index 0000000..7b58fd4
--- /dev/null
+++ b/flash2d/compile/Makefiles/Makefile_gfortran_sphere
@@ -0,0 +1,145 @@
+##################################################################
+#   FLASH90                                                      #
+#   FLexible Adaptive Semi-Lagrangian Hack                       #
+#   written in Fortran 90                                        #
+##################################################################
+# makefile to build FLASH                                        #
+# j. behrens 2/95, 3/96, 8/98                                    #
+# l. mentrup 7/05                                                #
+# --- this is for linux ---                                      #
+##################################################################
+
+# MACHINE
+MACHINE = macosx_gfortran
+
+# SYSTEM
+SYSTEM = gfortran
+
+# SET MAKETHING CORRESPONDING TO MACHINE:
+MAKETHING= FLASH
+
+# OPTIMIZATION SETTINGS [debug|norm|opt]
+MODE := debug
+
+# LIBRARY SETTINGS [yes|no]
+# Useage: make NO_NETCDF=yes NO_VISNET=yes
+NO_NETCDF := no
+NO_VISNET := yes
+
+# Use Method MPSLM [yes|no]
+NO_MPSLM := yes
+
+# SET MAIN DIRECTORY PATH
+# !! This has to be alterd by user !!
+ROOTDIR = $(HOME)/Documents/Development/amatos
+
+# SET atlas/blas DIRECTORY PATH
+# !! This has to be alterd by user !!
+BLASDIR = 
+BLASLIB = 
+
+# SET LAPACK DIRECTORY PATH/BLAS INCLUDED IN INTEL MKL
+# !! This has to be alterd by user !!
+LAPACKDIR =  
+LAPACKLIB =  -framework Accelerate
+
+# SET C++ DIRECTORY PATH
+# !! This has to be alterd by user !!
+CCLIBDIR = -L/usr/lib/
+CCLIB = -lstdc++
+
+# SET MORE DIRECTORY PATHS
+LIBDIR  = $(ROOTDIR)/amatos2d/trunk/lib/$(MACHINE)
+INCDIR  = $(ROOTDIR)/amatos2d/trunk/include/$(MACHINE)
+MODDIR  = $(ROOTDIR)/amatos2d/trunk/include/$(MACHINE)
+MAINDIR = $(ROOTDIR)/flash2d/trunk
+
+SRCDIR  = $(MAINDIR)/src/flash-sphere
+OPTDIR  = $(MAINDIR)/src/options-sphere
+SYSDIR  = $(MAINDIR)/src/system/$(SYSTEM)
+TIMDIR  = $(MAINDIR)/src/timing
+DATDIR  = $(MAINDIR)/data
+BUILDIR = $(MAINDIR)/compile/$(MACHINE)
+
+# SET NETCDF PATHS
+LIBNETCDF = 
+INCNETCDF =
+ifneq ($(strip $(NO_NETCDF)), yes)
+LIBNETCDF = -L$(LIBDIR) -lncugrid -L/sw2/lib -lnetcdff -lnetcdf
+INCNETCDF = -I/sw2/include
+endif
+
+# SET VISNET DIRECTORY PATH
+# !! This has to be alterd by user !!
+VISNETDIR =
+VISNETLIB = 
+ifneq ($(strip $(NO_VISNET)),yes)
+VISNETDIR = -L$(ROOTDIR)/lib/SINGLE
+VISNETLIB = -lvisnet4flash -lm3tv -ldelaunay \
+	    -ldetri -llia -lsos -lbasic \
+	    $(VISNETDIR)/fortify.o \
+	    -lglut -lGLU -lGL -ltiff
+endif
+
+# SET PATH TO GRID_API.mod
+AMATOS    = $(MODDIR)/grid_api.mod
+
+# SET THE ENDING OF MODULE FILES
+MODEND  = mod
+
+#----------------------------------------------------------------#
+# FLAGS FOR LINUX / Intel Fortran Compiler                       #
+#----------------------------------------------------------------#
+F90 	= gfortran
+cc 	= gcc
+CC 	= g++
+LOADER  = gfortran
+
+# --------------------- next are for debugging ------------------#
+ifeq ($(strip $(MODE)),debug)
+  FFLAGS  = -fbounds-check -ggdb -fpic -funderscoring # -C
+  CFLAGS  = -ggdb -fpic
+  LDFLAGS = -ggdb
+endif
+# --------------------- next are for normal compilation ---------#
+ifeq ($(strip $(MODE)),norm)
+  FFLAGS  = -fPIC -funderscoring
+  CFLAGS  = -fpic
+  LDFLAGS =
+endif
+# --------------------- next are for optimization ---------------#
+ifeq ($(strip $(MODE)),opt)
+  FFLAGS  = -O3 -fPIC -funderscoring
+  CFLAGS  = -O3 -fpic
+  LDFLAGS = -O3
+endif
+
+# --------------------- include Visnet/NetCDF or not ------------#
+ifeq ($(strip $(NO_VISNET)),yes)
+FFLAGS += -DNO_VISNET
+endif
+ifeq ($(strip $(NO_NETCDF)),yes)
+FFLAGS += -DNO_NETCDF
+endif
+
+FFLAGS += -D$(MACHINE)
+CFLAGS += -D$(MACHINE)
+
+# -------- next flag for using dummy graphics library -----------#
+LIBS = -L$(LIBDIR) $(BLASDIR) $(BLASLIB) \
+	           $(LAPACKDIR) $(LAPACKLIB) \
+		   $(VISNETDIR) $(VISNETLIB) \
+		   $(LIBNETCDF) $(CCLIBDIR) $(CCLIB)\
+        	   -lsamatos -lm
+		    
+INCS = $(INCNETCDF) -I$(INCDIR) -I$(MODDIR)
+
+#----------------------------------------------------------------#
+# common stuff                                                   #
+#----------------------------------------------------------------#
+
+include $(MAINDIR)/compile/Makefiles/Makefile.common
+
+#----------------------------------------------------------------#
+# END of Makefile                                                #
+#----------------------------------------------------------------#
diff --git a/flash2d/compile/Makefiles/Makefile_intel_plane b/flash2d/compile/Makefiles/Makefile_intel_plane
new file mode 100644
index 0000000..6015e80
--- /dev/null
+++ b/flash2d/compile/Makefiles/Makefile_intel_plane
@@ -0,0 +1,144 @@
+##################################################################
+#   FLASH90                                                      #
+#   FLexible Adaptive Semi-Lagrangian Hack                       #
+#   written in Fortran 90                                        #
+##################################################################
+# makefile to build FLASH                                        #
+# j. behrens 2/95, 3/96, 8/98                                    #
+# l. mentrup 7/05                                                #
+# --- this is for linux ---                                      #
+##################################################################
+
+# MACHINE
+MACHINE = macosx_intel
+
+# SYSTEM
+SYSTEM = std-f90
+
+# SET MAKETHING CORRESPONDING TO MACHINE:
+MAKETHING= FLASH
+
+# OPTIMIZATION SETTINGS [debug|norm|opt]
+MODE := debug
+
+# LIBRARY SETTINGS [yes|no]
+# Useage: make NO_NETCDF=yes NO_VISNET=yes
+NO_NETCDF := no
+NO_VISNET := yes
+
+# Use Method MPSLM [yes|no]
+NO_MPSLM := yes
+
+# SET MAIN DIRECTORY PATH
+# !! This has to be alterd by user !!
+ROOTDIR = $(HOME)/Documents/Development/amatos
+
+# SET atlas/blas DIRECTORY PATH
+# !! This has to be alterd by user !!
+BLASDIR = $(MKLROOT)/lib
+BLASLIB = 
+
+# SET LAPACK DIRECTORY PATH/BLAS INCLUDED IN INTEL MKL
+# !! This has to be alterd by user !!
+LAPACKDIR =  $(MKLROOT)/lib #-L$($ROOTDIR)/amatos2d/trunk/3rdparty/LAPACK95
+LAPACKLIB =  -I${MKLROOT}/include/lp64 -I${MKLROOT}/include ${MKLROOT}/lib/libmkl_blas95_lp64.a \
+             ${MKLROOT}/lib/libmkl_lapack95_lp64.a ${MKLROOT}/lib/libmkl_intel_lp64.a \
+             ${MKLROOT}/lib/libmkl_core.a ${MKLROOT}/lib/libmkl_sequential.a \
+             -lpthread -lm # -llapack95
+
+# SET C++ DIRECTORY PATH
+# !! This has to be alterd by user !!
+CCLIBDIR = /usr/lib/
+CCLIB = -lstdc++
+
+# SET MORE DIRECTORY PATHS
+LIBDIR  = $(ROOTDIR)/amatos2d/trunk/lib/$(MACHINE)
+INCDIR  = $(ROOTDIR)/amatos2d/trunk/include/$(MACHINE)
+MODDIR  = $(ROOTDIR)/amatos2d/trunk/include/$(MACHINE)
+MAINDIR = $(ROOTDIR)/flash2d/trunk
+
+SRCDIR  = $(MAINDIR)/src/flash
+OPTDIR  = $(MAINDIR)/src/options
+SYSDIR  = $(MAINDIR)/src/system/$(SYSTEM)
+TIMDIR  = $(MAINDIR)/src/timing
+DATDIR  = $(MAINDIR)/data
+BUILDIR = $(MAINDIR)/compile/$(MACHINE)
+
+# SET NETCDF PATHS
+LIBNETCDF = 
+INCNETCDF =
+ifneq ($(strip $(NO_NETCDF)), yes)
+LIBNETCDF = -L$(LIBDIR) -lncugrid -L/usr/local/lib -lnetcdff -lnetcdf
+INCNETCDF = -I/usr/local/include
+endif
+
+# SET VISNET DIRECTORY PATH
+# !! This has to be alterd by user !!
+VISNETDIR =
+VISNETLIB = 
+ifneq ($(strip $(NO_VISNET)),yes)
+VISNETDIR = $(ROOTDIR)/lib/SINGLE
+VISNETLIB = -lvisnet4flash -lm3tv -ldelaunay \
+	    -ldetri -llia -lsos -lbasic \
+	    $(VISNETDIR)/fortify.o \
+	    -lglut -lGLU -lGL -ltiff
+endif
+
+# SET PATH TO GRID_API.mod
+AMATOS    = $(MODDIR)/grid_api.mod
+
+# SET THE ENDING OF MODULE FILES
+MODEND  = mod
+
+#----------------------------------------------------------------#
+# FLAGS FOR LINUX / Intel Fortran Compiler                       #
+#----------------------------------------------------------------#
+F90 	= ifort
+cc 	= gcc
+CC 	= g++
+LOADER  = ifort
+
+# -------------- next for debugging -----------------------------#
+ifeq ($(strip $(MODE)),debug)
+  FFLAGS  = -g -fpic -Wl,-no_pie -DLAPACK95 -DUSE_MKL -check all #none # all
+  CFLAGS  = -g -m64 -check
+  LDFLAGS = -g -save-temps -static-intel -fpic -Wl,-no_pie -check all #none # all
+endif
+# -------------- next for normal compilation --------------------#
+ifeq ($(strip $(MODE)),norm)
+  FFLAGS  = -DLAPACK95 -DUSE_MKL
+  CFLAGS  =
+  LDFLAGS = -ifport
+endif
+# -------------- next with aggresive optimization (Pentium M) ---#
+ifeq ($(strip $(MODE)),opt)
+  FFLAGS  = -O -DLAPACK95 -DUSE_MKL
+  CFLAGS  = -O
+  LDFLAGS = -O -ifport
+endif
+
+# --------------------- include Visnet/NetCDF or not ------------#
+ifeq ($(strip $(NO_VISNET)),yes)
+FFLAGS += -DNO_VISNET
+endif
+ifeq ($(strip $(NO_NETCDF)),yes)
+FFLAGS += -DNO_NETCDF
+endif
+
+# -------- next flag for using dummy graphics library -----------#
+LIBS = -lamatos $(LIBNETCDF) -L$(LIBDIR) -I$(MODDIR) -L$(BLASDIR) $(BLASLIB) \
+	           -L$(LAPACKDIR) $(LAPACKLIB) $(BLASLIB) $(VISNETLIB) \
+	           $(CCLIB) -lm
+		    
+INCS = $(INCNETCDF) -I$(INCDIR) -I$(MODDIR) -I$(MKLROOT)/include/intel64/lp64 #\
+#       -I$($ROOTDIR)/amatos2d/trunk/3rdparty/LAPACK95/lapack95_modules
+
+#----------------------------------------------------------------#
+# common stuff                                                   #
+#----------------------------------------------------------------#
+
+include $(MAINDIR)/compile/Makefiles/Makefile.common
+
+#----------------------------------------------------------------#
+# END of Makefile                                                #
+#----------------------------------------------------------------#
diff --git a/flash2d/compile/Makefiles/Makefile_intel_sphere b/flash2d/compile/Makefiles/Makefile_intel_sphere
new file mode 100644
index 0000000..17ce444
--- /dev/null
+++ b/flash2d/compile/Makefiles/Makefile_intel_sphere
@@ -0,0 +1,152 @@
+##################################################################
+#   FLASH90                                                      #
+#   FLexible Adaptive Semi-Lagrangian Hack                       #
+#   written in Fortran 90                                        #
+##################################################################
+# makefile to build FLASH                                        #
+# j. behrens 2/95, 3/96, 8/98                                    #
+# l. mentrup 7/05                                                #
+# --- this is for linux ---                                      #
+##################################################################
+
+# MACHINE
+MACHINE = macosx_intel
+
+# SYSTEM
+SYSTEM = std-f90
+
+# SET MAKETHING CORRESPONDING TO MACHINE:
+MAKETHING= FLASH
+
+# OPTIMIZATION SETTINGS [debug|norm|opt]
+MODE := debug
+
+# LIBRARY SETTINGS [yes|no]
+# Useage: make NO_NETCDF=yes NO_VISNET=yes
+NO_NETCDF := no
+NO_VISNET := yes
+
+# Use Method MPSLM [yes|no]
+NO_MPSLM := yes
+
+# SET MAIN DIRECTORY PATH
+# !! This has to be alterd by user !!
+ROOTDIR = $(HOME)/Documents/Development/amatos
+
+# SET atlas/blas DIRECTORY PATH
+# !! This has to be alterd by user !!
+BLASDIR = $(MKLROOT)/lib
+BLASLIB = 
+
+# SET LAPACK DIRECTORY PATH/BLAS INCLUDED IN INTEL MKL
+# !! This has to be alterd by user !!
+LAPACKDIR =  $(MKLROOT)/lib #-L$($ROOTDIR)/amatos2d/trunk/3rdparty/LAPACK95
+LAPACKLIB =  -I${MKLROOT}/include/lp64 -I${MKLROOT}/include ${MKLROOT}/lib/libmkl_blas95_lp64.a \
+             ${MKLROOT}/lib/libmkl_lapack95_lp64.a ${MKLROOT}/lib/libmkl_intel_lp64.a \
+             ${MKLROOT}/lib/libmkl_core.a ${MKLROOT}/lib/libmkl_sequential.a \
+             -lpthread -lm # -llapack95
+
+# SET C++ DIRECTORY PATH
+# !! This has to be alterd by user !!
+CCLIBDIR = -L/usr/lib/
+CCLIB = -lstdc++
+
+# SET MORE DIRECTORY PATHS
+LIBDIR  = $(ROOTDIR)/amatos2d/trunk/lib/$(MACHINE)
+INCDIR  = $(ROOTDIR)/amatos2d/trunk/include/$(MACHINE)
+MODDIR  = $(ROOTDIR)/amatos2d/trunk/include/$(MACHINE)
+MAINDIR = $(ROOTDIR)/flash2d/trunk
+
+SRCDIR  = $(MAINDIR)/src/flash-sphere
+OPTDIR  = $(MAINDIR)/src/options-sphere
+SYSDIR  = $(MAINDIR)/src/system/$(SYSTEM)
+TIMDIR  = $(MAINDIR)/src/timing
+DATDIR  = $(MAINDIR)/data
+BUILDIR = $(MAINDIR)/compile/$(MACHINE)
+
+# SET NETCDF PATHS
+LIBNETCDF = 
+INCNETCDF =
+ifneq ($(strip $(NO_NETCDF)), yes)
+LIBNETCDF = -L$(LIBDIR) -lncugrid -L/usr/local/lib -lnetcdff -lnetcdf
+INCNETCDF = -I/usr/local/include
+endif
+
+# SET VISNET DIRECTORY PATH
+# !! This has to be alterd by user !!
+VISNETDIR =
+VISNETLIB = 
+ifneq ($(strip $(NO_VISNET)),yes)
+VISNETDIR = $(ROOTDIR)/lib/SINGLE
+VISNETLIB = -lvisnet4flash -lm3tv -ldelaunay \
+	    -ldetri -llia -lsos -lbasic \
+	    $(VISNETDIR)/fortify.o \
+	    -lglut -lGLU -lGL -ltiff
+endif
+
+# SET PATH TO GRID_API.mod
+AMATOS    = $(MODDIR)/grid_api.mod
+
+# SET THE ENDING OF MODULE FILES
+MODEND  = mod
+
+#----------------------------------------------------------------#
+# FLAGS FOR LINUX / Intel Fortran Compiler                       #
+#----------------------------------------------------------------#
+F90 	= ifort
+cc 	= gcc
+CC 	= g++
+LOADER  = ifort
+
+# -------------- next for debugging -----------------------------#
+ifeq ($(strip $(MODE)),debug)
+  FFLAGS  = -g -fpic -Wl,-no_pie -DLAPACK95 -DUSE_MKL -check all #none # all
+  CFLAGS  = -g -m64 -check
+  LDFLAGS = -g -save-temps -static-intel -fpic -Wl,-no_pie -check all #none # all
+endif
+# -------------- next for normal compilation --------------------#
+ifeq ($(strip $(MODE)),norm)
+  FFLAGS  = -DLAPACK95 -DUSE_MKL
+  CFLAGS  =
+  LDFLAGS = -ifport
+endif
+# -------------- next with aggresive optimization (Pentium M) ---#
+ifeq ($(strip $(MODE)),opt)
+  FFLAGS  = -O -DLAPACK95 -DUSE_MKL
+  CFLAGS  = -O
+  LDFLAGS = -O -ifport
+endif
+
+# --------------------- include Visnet/NetCDF or not ------------#
+ifeq ($(strip $(NO_VISNET)),yes)
+FFLAGS += -DNO_VISNET
+endif
+ifeq ($(strip $(NO_NETCDF)),yes)
+FFLAGS += -DNO_NETCDF
+endif
+
+FFLAGS += -D$(MACHINE)
+CFLAGS += -D$(MACHINE)
+
+# -------- next flag for using dummy graphics library -----------#
+LIBS = -lsamatos $(LIBNETCDF) -L$(LIBDIR) -I$(MODDIR) -L$(BLASDIR) $(BLASLIB) \
+       -L$(LAPACKDIR) $(LAPACKLIB) $(BLASLIB) $(VISNETLIB) \
+       $(CCLIB) -lm
+#LIBS =  -lsamatos -lm -L$(LIBDIR) $(BLASDIR) $(BLASLIB) \
+#	           $(LAPACKDIR) $(LAPACKLIB) \
+#		   $(VISNETDIR) $(VISNETLIB) \
+#		   $(LIBNETCDF) $(CCLIBDIR) $(CCLIB)\
+        	  
+		    
+INCS = $(INCNETCDF) -I$(INCDIR) -I$(MODDIR) #-I$(MKLROOT)/include/intel64/lp64 #\
+#       -I$($ROOTDIR)/amatos2d/trunk/3rdparty/LAPACK95/lapack95_modules
+
+#----------------------------------------------------------------#
+# common stuff                                                   #
+#----------------------------------------------------------------#
+
+include $(MAINDIR)/compile/Makefiles/Makefile.common
+
+#----------------------------------------------------------------#
+# END of Makefile                                                #
+#----------------------------------------------------------------#
diff --git a/flash2d/compile/irix/Makefile b/flash2d/compile/irix/Makefile
new file mode 100644
index 0000000..c179729
--- /dev/null
+++ b/flash2d/compile/irix/Makefile
@@ -0,0 +1,264 @@
+##################################################################
+#   FLASH90                                                      #
+#   FLexible Adaptive Semi-Lagrangian Hack                       #
+#   written in Fortran 90                                        #
+##################################################################
+# makefile to build FLASH                                        #
+# j. behrens 2/95, 3/96, 8/98                                    #
+# --- this is for irix ---                                       #
+##################################################################
+
+# MACHINE
+MACHINE = irix
+
+# SET MAKETHING CORRESPONDING TO MACHINE:
+MAKETHING= FLASH
+
+# SET MAIN DIRECTORY PATH
+# !! This has to be alterd by user !!
+ROOTDIR = $(HOME)/Development
+
+# SET atlas/blas DIRECTORY PATH
+# !! This has to be alterd by user !!
+BLASDIR = 
+BLASLIB = 
+
+# SET LAPACK DIRECTORY PATH
+# !! This has to be alterd by user !!
+LAPACKDIR = 
+LAPACKLIB = -lscs
+
+# SET VISNET DIRECTORY PATH
+# !! This has to be alterd by user !!
+VISNETDIR = $(ROOTDIR)/lib/SINGLE
+VISNETLIB = -lvisnet4flash -lm3tv -ldelaunay \
+	    -ldetri -llia -lsos -lbasic \
+	    $(VISNETDIR)/fortify.o \
+	    -lglut -lGLU -lGL -ltiff \
+            -lXmu -lX11
+
+# SET C++ DIRECTORY PATH
+# !! This has to be alterd by user !!
+CCLIBDIR = 
+CCLIB = -lpthread -lC
+
+# SET MORE DIRECTORY PATHS
+LIBDIR  = $(ROOTDIR)/lib/SINGLE
+INCDIR  = $(ROOTDIR)/include
+MODDIR  = $(ROOTDIR)/include/SINGLE
+MAINDIR = $(ROOTDIR)/flash2d
+
+SRCDIR  = $(MAINDIR)/src/flash
+OPTDIR  = $(MAINDIR)/src/options
+SYSDIR  = $(MAINDIR)/src/system/std-f90
+TIMDIR  = $(MAINDIR)/src/timing
+DATDIR  = $(MAINDIR)/data
+BUILDIR = $(MAINDIR)/$(MACHINE)
+
+# SET LIBRARY PATHS
+LIBNETCDF = -L/home/bornemann/m3/lib/IRIX -lnetcdf
+
+# SET INCLUDE PATHS
+INCNETCDF = /home/bornemann/m3/include
+AMATOS    = $(MODDIR)/GRID_API.mod
+
+# SET THE ENDING OF MODULE FILES
+MODEND  = mod
+
+#----------------------------------------------------------------#
+# FLAGS FOR SGI                                                  #
+#----------------------------------------------------------------#
+
+F90    = f90
+CC     = cc
+LOADER = f90
+# --------------------- next three for debugging ----------------#
+# FFLAGS = -n32 -g -check_bounds -DEBUG:div_check=3:trap_uninitialized=ON:verbose_runtime=ON
+# CFLAGS = -g
+# LDFLAGS = -n32 -g
+# --------------------- next three for optimized debugging ------#
+FFLAGS = -n32 -O1 -OPT:Olimit=2069 -g3
+CFLAGS = -O1 -g3
+LDFLAGS = -n32 -O1 -OPT:Olimit=2069 -g3
+# --------------------- next three with optimization ------------#
+# FFLAGS = -O3 -n32
+# CFLAGS = -O
+# LDFLAGS = -O3 -n32
+# -------- next flag for using dummy graphics library -----------#
+LIBS = -L$(BLASDIR) -L$(LAPACKDIR) -L/usr/lib32/internal -L$(LIBDIR) \
+	 -L$(VISNETDIR) -L$(CCLIBDIR) -rpath$(LIBDIR) \
+       -lamatos $(LAPACKLIB) $(BLASLIB) $(LIBNETCDF) $(VISNETLIB) \
+	$(CCLIB) -lm
+INCS = -I$(INCNETCDF) -I$(INCDIR) -I$(MODDIR)
+
+##################################################################
+# AFTER THIS LINE, NO CHANGES SHOULD BE NECESSARY                #
+##################################################################
+
+#----------------------------------------------------------------#
+# OBJECTS                                                        #
+#----------------------------------------------------------------#
+MAINOBJ = \
+FLASH_parameters.o \
+MISC_timing.o \
+MISC_system.o \
+IO_utils.o \
+IO_matlabplot.o \
+IO_gmvplot.o \
+VisNET4Flash.o \
+IO_visnetplot.o \
+IO_netcdfplot.o \
+SLM_initial.o \
+SLM_errorestimate.o \
+ADV_wind.o \
+ADV_rhs.o \
+SLM_simple.o \
+SLM_advanced.o \
+ADV_semilagrange.o \
+Flash90.o
+
+#----------------------------------------------------------------#
+# COMPILE STEP                                                   #
+#----------------------------------------------------------------#
+
+.SUFFIXES: .F90 .f90 $(SUFFIXES)
+
+.F90.o:
+	@echo "make: Building object module from "$<
+	$(F90) $(FFLAGS) $(INCS) -c $<
+
+.f90.o:
+	@echo "make: Building object module from "$<
+	$(F90) $(FFLAGS) $(INCS) -c $<
+
+.c.o:
+	@echo "make: Building object module from "$<
+	$(CC) $(CFLAGS) $(INCS) -D$(MACHINE) -c $<
+
+clearsrc::
+	@rm -f *.f90 *.h *.F90
+
+clearex::
+	@rm -f $(MAKETHING) Flash90* fort.*
+
+cleardat::
+	@rm -f *.dat
+
+clean::
+	@rm -f *.o *.$(MODEND) core
+
+tidy::
+	make clean
+	make clearex
+	make cleardat
+	make clearsrc
+
+#----------------------------------------------------------------#
+# THIS COPIES REQUIRED DATA FILES                                #
+#----------------------------------------------------------------#
+
+datacopy::
+	@cp $(DATDIR)/Domain.dat .
+	@cp $(DATDIR)/Initial.dat .
+	@cp $(DATDIR)/Land.dat .
+	@cp $(DATDIR)/Triang.dat .
+	@cp $(DATDIR)/Parameters.dat .
+
+#----------------------------------------------------------------#
+# THIS CREATES PREDEFINED OPTIONS                                #
+#----------------------------------------------------------------#
+
+maincopy::
+	@cp $(SRCDIR)/*.f90 .
+	@cp $(SRCDIR)/*.F90 .
+	@cp $(SYSDIR)/*.f90 .
+	@cp $(TIMDIR)/*.f90 .
+
+Slot::
+	@make maincopy
+	@cp $(OPTDIR)/SLM_simple.clip SLM_simple.f90
+
+Potsdam::
+	@cp $(OPTDIR)/ADV_wind.file ADV_wind.f90
+	@cp $(OPTDIR)/SLM_initial.file SLM_initial.f90
+	@cp $(OPTDIR)/ADV_semilagrange.adv ADV_semilagrange.F90
+	@cp $(OPTDIR)/SLM_simple.clip SLM_simple.f90
+	@cp $(OPTDIR)/SLM_advanced.dual SLM_advanced.f90
+
+Analytic::
+	@cp $(OPTDIR)/ADV_semilagrange.adv ADV_semilagrange.F90
+	@cp $(OPTDIR)/SLM_simple.clip SLM_simple.f90
+	@cp $(OPTDIR)/SLM_advanced.analytic SLM_advanced.f90
+
+Bar::
+	@cp $(OPTDIR)/SLM_simple.clip SLM_simple.f90
+	@cp $(OPTDIR)/ADV_wind.bar ADV_wind.f90
+	@cp $(OPTDIR)/SLM_initial.bar SLM_initial.f90
+
+Conservative::
+	@cp $(OPTDIR)/ADV_semilagrange.adv ADV_semilagrange.F90
+	@cp $(OPTDIR)/SLM_simple.clip SLM_simple.f90
+	@cp $(OPTDIR)/SLM_advanced.cons SLM_advanced.f90
+
+Dual::
+	@cp $(OPTDIR)/ADV_semilagrange.adv ADV_semilagrange.F90
+	@cp $(OPTDIR)/SLM_simple.clip SLM_simple.f90
+	@cp $(OPTDIR)/SLM_advanced.dual SLM_advanced.f90
+
+Cellintegrated::
+	@cp $(OPTDIR)/ADV_semilagrange.adv ADV_semilagrange.F90
+	@cp $(OPTDIR)/SLM_simple.clip SLM_simple.f90
+	@cp $(OPTDIR)/SLM_advanced.cellint SLM_advanced.f90
+
+Quadrature::
+	@cp $(OPTDIR)/ADV_semilagrange.adv ADV_semilagrange.F90
+	@cp $(OPTDIR)/SLM_simple.clip SLM_simple.f90
+	@cp $(OPTDIR)/SLM_advanced.quadrature SLM_advanced.f90
+
+Quadrature7::
+	@cp $(OPTDIR)/ADV_semilagrange.adv ADV_semilagrange.F90
+	@cp $(OPTDIR)/SLM_simple.clip SLM_simple.f90
+	@cp $(OPTDIR)/SLM_advanced.quadrature7 SLM_advanced.f90
+
+MPSLM::
+	@cp $(OPTDIR)/ADV_semilagrange.adv ADV_semilagrange.F90
+	@cp $(OPTDIR)/SLM_simple.clip SLM_simple.f90
+	@cp $(OPTDIR)/SLM_advanced.mpslm SLM_advanced.f90
+
+ConvWind::
+	@cp $(OPTDIR)/ADV_wind.conv ADV_wind.f90
+	@cp $(OPTDIR)/SLM_initial.conv SLM_initial.f90
+
+DiagWind::
+	@cp $(OPTDIR)/ADV_wind.diag ADV_wind.f90
+	@cp $(OPTDIR)/SLM_initial.diag SLM_initial.f90
+
+Kaeser::
+	@cp $(OPTDIR)/ADV_wind.kaeser ADV_wind.f90
+	@cp $(OPTDIR)/SLM_initial.kaeser SLM_initial.f90
+
+CircWind::
+	@cp $(OPTDIR)/ADV_wind.circ ADV_wind.f90
+	@cp $(OPTDIR)/SLM_initial.circ SLM_initial.f90
+
+#----------------------------------------------------------------#
+# THIS COMPILES THE MAIN PROGRAM                                 #
+#----------------------------------------------------------------#
+
+executable: $(MAINOBJ)
+	@echo "make: Linking object modules and libraries"
+	$(LOADER) $(LDFLAGS) -o $(MAKETHING) $(MAINOBJ) $(LIBS)
+
+$(MAKETHING)::
+	@make maincopy
+	@make executable
+
+all::
+	@make maincopy
+	@make executable
+	@make clearsrc
+	@make clean
+
+#----------------------------------------------------------------#
+# DEPENDENCIES ON INCLUDE FILES                                  #
+#----------------------------------------------------------------#
diff --git a/flash2d/compile/irix/Makefile.sam b/flash2d/compile/irix/Makefile.sam
new file mode 100644
index 0000000..c73a28b
--- /dev/null
+++ b/flash2d/compile/irix/Makefile.sam
@@ -0,0 +1,232 @@
+##################################################################
+#   FLASH90                                                      #
+#   FLexible Adaptive Semi-Lagrangian Hack                       #
+#   written in Fortran 90                                        #
+##################################################################
+# makefile to build FLASH                                        #
+# j. behrens 2/95, 3/96, 8/98                                    #
+# --- this is for irix ---                                       #
+##################################################################
+
+# MACHINE
+MACHINE = irix
+
+# SET MAKETHING CORRESPONDING TO MACHINE:
+MAKETHING= FLASH
+
+# SET MAIN DIRECTORY PATH
+MAINDIR = $(PWD)/..
+
+# SET MORE DIRECTORY PATHS
+SRCDIR  = $(MAINDIR)/src/flash-sphere
+OPTDIR  = $(MAINDIR)/src/options
+LIBDIR  = /home/bornemann/behrens/Development/amatos20/lib
+# LIBDIR  = /home/bornemann/behrens/lib/IRIX_DEBUG/SAMATOS
+SYSDIR  = $(MAINDIR)/src/system/std-f90
+TIMDIR  = $(MAINDIR)/src/timing
+DATDIR  = $(MAINDIR)/data
+INCDIR  = /home/bornemann/behrens/include
+MODDIR  = /home/bornemann/behrens/Development/amatos20/
+# MODDIR  = /home/bornemann/behrens/lib/IRIX_DEBUG/SAMATOS
+BUILDIR = $(MAINDIR)/$(MACHINE)
+
+# SET LIBRARY PATHS
+LIBNETCDF = -L/home/bornemann/m3/lib/IRIX -lnetcdf
+
+# SET INCLUDE PATHS
+INCNETCDF = /home/bornemann/m3/include
+AMATOS    = $(MODDIR)/GRID_API.mod
+
+# SET THE ENDING OF MODULE FILES
+MODEND  = mod
+
+#----------------------------------------------------------------#
+# FLAGS FOR SUN                                                  #
+#----------------------------------------------------------------#
+
+F90    = f90
+CC     = cc
+LOADER = f90
+# --------------------- next three for debugging ----------------#
+FFLAGS = -n32 -g -DNO_NETCDF -check_bounds -DEBUG:div_check=3:trap_uninitialized=ON:verbose_runtime=ON
+CFLAGS = -g
+LDFLAGS = -n32 -g
+# --------------------- next three for optimized debugging ------#
+# FFLAGS = -n32 -O1 -OPT:Olimit=2069 -g3
+# CFLAGS = -O1 -g3
+# LDFLAGS = -n32 -O1 -OPT:Olimit=2069 -g3
+# ARFLAGS = vru
+# --------------------- next three for profiling ----------------#
+# FFLAGS = -n32 -p
+# CFLAGS = -p
+# LDFLAGS = -n32 -p
+# ARFLAGS = vru
+# --------------------- next three with optimization ------------#
+# FFLAGS = -O3 -n32
+# CFLAGS = -O
+# LDFLAGS = -O3 -n32
+# ARFLAGS = vru
+# -------- next flag for using dummy graphics library -----------#
+#LIBS = -L$(LIBDIR) -rpath$(LIBDIR) -L/usr/lib32/internal \
+#       -lBJUGL -lBUI -lamatos -lgpc $(LIBNETCDF)
+LIBS = -L$(LIBDIR) -rpath$(LIBDIR) -L/usr/lib32/internal \
+       -lamatos $(LIBNETCDF)
+INCS = -I$(INCNETCDF) -I$(INCDIR) -I$(MODDIR)
+
+##################################################################
+# AFTER THIS LINE, NO CHANGES SHOULD BE NECESSARY                #
+##################################################################
+
+#----------------------------------------------------------------#
+# OBJECTS                                                        #
+#----------------------------------------------------------------#
+MAINOBJ = \
+FLASH_parameters.o \
+MISC_timing.o \
+MISC_system.o \
+IO_plotdefine.o \
+IO_utils.o \
+IO_matlabplot.o \
+IO_gmvplot.o \
+IO_griddedplot.o \
+SLM_initial.o \
+SLM_errorestimate.o \
+ADV_wind.o \
+ADV_rhs.o \
+SLM_simple.o \
+SLM_advanced.o \
+ADV_semilagrange.o \
+Flash90.o
+
+#----------------------------------------------------------------#
+# COMPILE STEP                                                   #
+#----------------------------------------------------------------#
+
+.F90.o:
+	@echo "make: Building object module from "$<
+	@$(F90) $(FFLAGS) $(INCS) -c $<
+
+.f90.o:
+	@echo "make: Building object module from "$<
+	@$(F90) $(FFLAGS) $(INCS) -c $<
+
+.c.o:
+	@echo "make: Building object module from "$<
+	@$(CC) $(CFLAGS) $(INCS) -D$(MACHINE) -c $<
+
+clearsrc::
+	@rm -f *.f90 *.h *.F90
+
+clearex::
+	@rm -f $(MAKETHING) Flash90* fort.*
+
+cleardat::
+	@rm -f *.dat
+
+clean::
+	@rm -f *.o *.$(MODEND) core
+
+tidy::
+	make clean
+	make clearex
+	make cleardat
+	make clearsrc
+
+#----------------------------------------------------------------#
+# THIS COPIES REQUIRED DATA FILES                                #
+#----------------------------------------------------------------#
+
+datacopy::
+	@cp $(DATDIR)/*.dat .
+
+#----------------------------------------------------------------#
+# THIS CREATES THE MAIN PROGRAM                                  #
+#----------------------------------------------------------------#
+
+maincopy::
+	@cp $(SRCDIR)/*.f90 .
+	@cp $(SRCDIR)/*.F90 .
+	@cp $(SYSDIR)/*.f90 .
+	@cp $(TIMDIR)/*.f90 .
+#	@cp $(INCDIR)/BJUGL.f90 .
+
+Slot::
+	@make maincopy
+	@cp $(OPTDIR)/SLM_simple.clip SLM_simple.f90
+
+Potsdam::
+	@cp $(OPTDIR)/ADV_wind.file ADV_wind.f90
+	@cp $(OPTDIR)/SLM_initial.file SLM_initial.f90
+	@cp $(OPTDIR)/SLM_simple.clip SLM_simple.f90
+
+Gerrits::
+	@cp $(OPTDIR)/ADV_wind.file ADV_wind.f90
+	@cp $(OPTDIR)/ADV_rhs.gerrit ADV_rhs.f90
+	@cp $(OPTDIR)/SLM_initial.gerrit SLM_initial.f90
+	@cp $(OPTDIR)/SLM_simple.clip SLM_simple.f90
+
+Burgers::
+	@cp $(OPTDIR)/ADV_rhs.burgers ADV_rhs.f90
+	@cp $(OPTDIR)/ADV_semilagrange.burgers ADV_semilagrange.F90
+	@cp $(OPTDIR)/SLM_initial.burgers SLM_initial.f90
+	@cp $(OPTDIR)/SLM_simple.clip SLM_simple.f90
+
+Bar::
+	@cp $(OPTDIR)/SLM_simple.clip SLM_simple.f90
+	@cp $(SRCDIR)/ADV_wind.bar ADV_wind.f90
+	@cp $(SRCDIR)/SLM_initial.bar SLM_initial.f90
+	
+Conservative::
+	@cp $(OPTDIR)/ADV_semilagrange.adv ADV_semilagrange.F90
+	@cp $(OPTDIR)/SLM_simple.plain SLM_simple.f90
+	@cp $(OPTDIR)/SLM_advanced.cons SLM_advanced.f90
+	
+Dual::
+	@cp $(OPTDIR)/ADV_semilagrange.adv ADV_semilagrange.F90
+	@cp $(OPTDIR)/SLM_simple.plain SLM_simple.f90
+	@cp $(OPTDIR)/SLM_advanced.dual SLM_advanced.f90
+	
+Cellintegrated::
+	@cp $(OPTDIR)/ADV_semilagrange.adv ADV_semilagrange.F90
+	@cp $(OPTDIR)/SLM_simple.plain SLM_simple.f90
+	@cp $(OPTDIR)/SLM_advanced.cellint SLM_advanced.f90
+	
+Quadrature::
+	@cp $(OPTDIR)/ADV_semilagrange.adv ADV_semilagrange.F90
+	@cp $(OPTDIR)/SLM_simple.plain SLM_simple.f90
+	@cp $(OPTDIR)/SLM_advanced.quadrature SLM_advanced.f90
+	
+Quadrature7::
+	@cp $(OPTDIR)/ADV_semilagrange.adv ADV_semilagrange.F90
+	@cp $(OPTDIR)/SLM_simple.plain SLM_simple.f90
+	@cp $(OPTDIR)/SLM_advanced.quadrature7 SLM_advanced.f90
+
+ConvWind::
+	@cp $(OPTDIR)/ADV_wind.convergent ADV_wind.f90
+	@cp $(OPTDIR)/SLM_initial.divergent SLM_initial.f90
+
+DivWind::
+	@cp $(OPTDIR)/ADV_wind.divergent ADV_wind.f90
+	@cp $(OPTDIR)/SLM_initial.divergent SLM_initial.f90
+
+DiagonalWind::
+	@cp $(OPTDIR)/ADV_wind.diagonal ADV_wind.f90
+	@cp $(OPTDIR)/SLM_initial.divergent SLM_initial.f90
+
+executable: $(MAINOBJ)
+	@echo "make: Linking object modules and libraries"
+	@$(LOADER) $(LDFLAGS) -o $(MAKETHING) $(MAINOBJ) $(LIBS)
+
+$(MAKETHING)::
+	@make maincopy
+	@make executable
+
+all::
+	@make maincopy
+	@make executable
+	@make clearsrc
+	@make clean
+
+#----------------------------------------------------------------#
+# DEPENDENCIES ON INCLUDE FILES                                  #
+#----------------------------------------------------------------#
diff --git a/flash2d/compile/linux_g64/Makefile b/flash2d/compile/linux_g64/Makefile
new file mode 100644
index 0000000..336624d
--- /dev/null
+++ b/flash2d/compile/linux_g64/Makefile
@@ -0,0 +1,141 @@
+##################################################################
+#   FLASH90                                                      #
+#   FLexible Adaptive Semi-Lagrangian Hack                       #
+#   written in Fortran 90                                        #
+##################################################################
+# makefile to build FLASH                                        #
+# j. behrens 2/95, 3/96, 8/98                                    #
+# l. mentrup 7/05                                                #
+# --- this is for linux ---                                      #
+##################################################################
+
+# MACHINE
+MACHINE = linux_g64
+
+# SYSTEM
+SYSTEM = gfortran
+
+# SET MAKETHING CORRESPONDING TO MACHINE:
+MAKETHING= FLASH
+
+# OPTIMIZATION SETTINGS [debug|norm|opt]
+MODE := debug
+
+# LIBRARY SETTINGS [yes|no]
+# Useage: make NO_NETCDF=yes NO_VISNET=yes
+NO_NETCDF := no
+NO_VISNET := yes
+
+# Use Method MPSLM [yes|no]
+NO_MPSLM := yes
+
+# SET MAIN DIRECTORY PATH
+# !! This has to be alterd by user !!
+ROOTDIR = $(HOME)/Development
+
+# SET atlas/blas DIRECTORY PATH
+# !! This has to be alterd by user !!
+BLASDIR = 
+BLASLIB = -L/usr/lib -l:libblas.so.3gf
+
+# SET LAPACK DIRECTORY PATH/BLAS INCLUDED IN INTEL MKL
+# !! This has to be alterd by user !!
+LAPACKDIR = 
+LAPACKLIB = -L/usr/lib -l:liblapack.so.3gf -lpthread -lc 
+# SET C++ DIRECTORY PATH
+# !! This has to be alterd by user !!
+CCLIBDIR = /usr/lib/
+CCLIB = # -lstdc++
+
+# SET MORE DIRECTORY PATHS
+LIBDIR  = $(ROOTDIR)/amatos2d/lib/$(MACHINE)
+INCDIR  = $(ROOTDIR)/amatos2d/include/$(MACHINE)
+MODDIR  = $(ROOTDIR)/amatos2d/include/$(MACHINE)
+MAINDIR = $(ROOTDIR)/flash2d
+
+SRCDIR  = $(MAINDIR)/src/flash
+OPTDIR  = $(MAINDIR)/src/options
+SYSDIR  = $(MAINDIR)/src/system/$(SYSTEM)
+TIMDIR  = $(MAINDIR)/src/timing
+DATDIR  = $(MAINDIR)/data
+BUILDIR = $(MAINDIR)/compile/$(MACHINE)
+
+# SET NETCDF PATHS
+LIBNETCDF = 
+INCNETCDF =
+ifneq ($(strip $(NO_NETCDF)), yes)
+LIBNETCDF = -L$(LIBDIR) -lncugrid -L/usr/lib -lnetcdff -lnetcdf
+INCNETCDF = -I/usr/include
+endif
+
+# SET VISNET DIRECTORY PATH
+# !! This has to be alterd by user !!
+VISNETDIR =
+VISNETLIB = 
+ifneq ($(strip $(NO_VISNET)),yes)
+VISNETDIR = $(ROOTDIR)/lib/SINGLE
+VISNETLIB = -lvisnet4flash -lm3tv -ldelaunay \
+	    -ldetri -llia -lsos -lbasic \
+	    $(VISNETDIR)/fortify.o \
+	    -lglut -lGLU -lGL -ltiff
+endif
+
+# SET PATH TO GRID_API.mod
+AMATOS    = $(MODDIR)/grid_api.mod
+
+# SET THE ENDING OF MODULE FILES
+MODEND  = mod
+
+#----------------------------------------------------------------#
+# FLAGS FOR LINUX / Intel Fortran Compiler                       #
+#----------------------------------------------------------------#
+F90 	= gfortran
+cc 	= gcc
+CC 	= g++
+LOADER  = gfortran
+
+# --------------------- next are for debugging ------------------#
+ifeq ($(strip $(MODE)),debug)
+  FFLAGS  = -fbounds-check -ggdb -fpic -funderscoring # -C
+  CFLAGS  = -ggdb -fpic
+  LDFLAGS = -ggdb
+endif
+# --------------------- next are for normal compilation ---------#
+ifeq ($(strip $(MODE)),norm)
+  FFLAGS  = -fPIC -funderscoring
+  CFLAGS  = -fpic
+  LDFLAGS =
+endif
+# --------------------- next are for optimization ---------------#
+ifeq ($(strip $(MODE)),opt)
+  FFLAGS  = -O3 -fPIC -funderscoring
+  CFLAGS  = -O3 -fpic
+  LDFLAGS = -O3
+endif
+
+# --------------------- include Visnet/NetCDF or not ------------#
+ifeq ($(strip $(NO_VISNET)),yes)
+FFLAGS += -DNO_VISNET
+endif
+ifeq ($(strip $(NO_NETCDF)),yes)
+FFLAGS += -DNO_NETCDF
+endif
+
+# -------- next flag for using dummy graphics library -----------#
+LIBS = -L$(LIBDIR) -lamatos -L$(BLASDIR) $(BLASLIB) \
+	           -L$(LAPACKDIR) $(LAPACKLIB) \
+		   -L$(VISNETDIR) $(VISNETLIB) \
+		   $(LIBNETCDF) -L$(CCLIBDIR) $(CCLIB)\
+        	   -lm
+		    
+INCS = $(INCNETCDF) -I$(INCDIR) -I$(MODDIR)
+
+#----------------------------------------------------------------#
+# common stuff                                                   #
+#----------------------------------------------------------------#
+
+include $(MAINDIR)/compile/Makefiles/Makefile.common
+
+#----------------------------------------------------------------#
+# END of Makefile                                                #
+#----------------------------------------------------------------#
diff --git a/flash2d/compile/linux_g64/Makefile.sphere b/flash2d/compile/linux_g64/Makefile.sphere
new file mode 100644
index 0000000..f115f19
--- /dev/null
+++ b/flash2d/compile/linux_g64/Makefile.sphere
@@ -0,0 +1,227 @@
+##################################################################
+#   FLASH90                                                      #
+#   FLexible Adaptive Semi-Lagrangian Hack                       #
+#   written in Fortran 90                                        #
+##################################################################
+# makefile to build FLASH                                        #
+# j. behrens 2/95, 3/96, 8/98                                    #
+# --- this is for linux ---                                      #
+##################################################################
+
+# MACHINE
+MACHINE = linux
+
+# SET MAKETHING CORRESPONDING TO MACHINE:
+MAKETHING= FLASH
+
+# SET MAIN DIRECTORY PATH
+MAINDIR = $(PWD)/..
+
+# SET MORE DIRECTORY PATHS
+SRCDIR  = $(MAINDIR)/src/flash-sphere
+OPTDIR  = $(MAINDIR)/src/options
+LIBDIR  = /home/behrens/lib/SAMATOS
+SYSDIR  = $(MAINDIR)/src/system/nag-f90
+TIMDIR  = $(MAINDIR)/src/timing
+DATDIR  = $(MAINDIR)/data
+INCDIR  = /home/behrens/include
+MODDIR  = /home/behrens/lib/SAMATOS
+BUILDIR = $(MAINDIR)/$(MACHINE)
+
+# SET LIBRARY PATHS
+LIBNETCDF = 
+# LIBNETCDF = -L/usr/local/lib -lnetcdf
+
+# SET INCLUDE PATHS
+INCNETCDF =
+# INCNETCDF = -I/usr/local/include
+AMATOS    = $(MODDIR)/grid_api.mod
+
+# SET THE ENDING OF MODULE FILES
+MODEND  = mod
+
+#----------------------------------------------------------------#
+# FLAGS FOR LINUX                                                #
+#----------------------------------------------------------------#
+
+F90 = f95
+CC = cc
+LOADER = f95
+# --------------------- next three for debugging ----------------#
+FFLAGS = -g -g90 -C=all -DNO_NETCDF
+CFLAGS = -g
+LDFLAGS = -g -g90
+# --------------------- next three with optimization ------------#
+# FFLAGS = -O3 -DNO_NETCDF
+# CFLAGS = -O3
+# LDFLAGS = -O3
+# -------- next flag for using dummy graphics library -----------#
+#LIBS = -L$(LIBDIR) -L/usr/X11R6/lib $(NAGLIBS) \
+#       -lBJUGL -lBUI -lamatos -llapack $(LIBNETCDF) -lm
+LIBS = -L$(LIBDIR) -L/usr/X11R6/lib \
+       -lamatos -lPMLAPACK -lgpc $(LIBNETCDF) -lm
+# -luGL -L. -lgapi $(LIBGLUT) -lGLU -lGL $(LIBMUI) -lmui -ltiff -lglut -L$(LIBNETCDF) -lnetcdf -lXmu -lXi -lXext -lX11 -lm 
+INCS = $(INCNETCDF) -I$(INCDIR) -I$(MODDIR)
+
+##################################################################
+# AFTER THIS LINE, NO CHANGES SHOULD BE NECESSARY                #
+##################################################################
+
+#----------------------------------------------------------------#
+# OBJECTS                                                        #
+#----------------------------------------------------------------#
+MAINOBJ = \
+FLASH_parameters.o \
+MISC_timing.o \
+MISC_system.o \
+IO_plotdefine.o \
+IO_utils.o \
+IO_matlabplot.o \
+IO_gmvplot.o \
+IO_griddedplot.o \
+SLM_initial.o \
+SLM_errorestimate.o \
+ADV_wind.o \
+ADV_rhs.o \
+SLM_simple.o \
+SLM_advanced.o \
+ADV_semilagrange.o \
+Flash90.o
+
+# BJUGL.o \
+# IO_bjuglplot.o \
+
+#----------------------------------------------------------------#
+# COMPILE STEP                                                   #
+#----------------------------------------------------------------#
+
+.SUFFIXES: .F90 .f90 $(SUFFIXES)
+
+.F90.o:
+	@echo "make: Building object module from "$<
+	@$(F90) $(FFLAGS) $(INCS) -c $<
+
+.f90.o:
+	@echo "make: Building object module from "$<
+	$(F90) $(FFLAGS) $(INCS) -c $<
+
+.c.o:
+	@echo "make: Building object module from "$<
+	@$(CC) $(CFLAGS) $(INCS) -D$(MACHINE) -c $<
+
+clearsrc::
+	@rm -f *.f90 *.h *.F90
+
+clearex::
+	@rm -f $(MAKETHING) Flash90* fort.*
+
+cleardat::
+	@rm -f *.dat
+
+clean::
+	@rm -f *.o *.$(MODEND) *.g90 core
+
+tidy::
+	make clean
+	make clearex
+	make cleardat
+	make clearsrc
+
+#----------------------------------------------------------------#
+# THIS COPIES REQUIRED DATA FILES                                #
+#----------------------------------------------------------------#
+
+datacopy::
+	@cp $(DATDIR)/*.dat .
+
+#----------------------------------------------------------------#
+# THIS CREATES THE MAIN PROGRAM                                  #
+#----------------------------------------------------------------#
+
+maincopy::
+	@cp $(SRCDIR)/*.f90 .
+	@cp $(SRCDIR)/*.F90 .
+	@cp $(SYSDIR)/*.f90 .
+	@cp $(TIMDIR)/*.f90 .
+	@cp $(INCDIR)/BJUGL.f90 .
+
+Slot::
+	@make maincopy
+	@cp $(OPTDIR)/SLM_simple.clip SLM_simple.f90
+
+Potsdam::
+	@cp $(OPTDIR)/ADV_wind.file ADV_wind.f90
+	@cp $(OPTDIR)/SLM_initial.file SLM_initial.f90
+	@cp $(OPTDIR)/SLM_simple.clip SLM_simple.f90
+
+Gerrits::
+	@cp $(OPTDIR)/ADV_wind.file ADV_wind.f90
+	@cp $(OPTDIR)/ADV_rhs.gerrit ADV_rhs.f90
+	@cp $(OPTDIR)/SLM_initial.gerrit SLM_initial.f90
+	@cp $(OPTDIR)/SLM_simple.clip SLM_simple.f90
+
+Burgers::
+	@cp $(OPTDIR)/ADV_rhs.burgers ADV_rhs.f90
+	@cp $(OPTDIR)/ADV_semilagrange.burgers ADV_semilagrange.F90
+	@cp $(OPTDIR)/SLM_initial.burgers SLM_initial.f90
+	@cp $(OPTDIR)/SLM_simple.clip SLM_simple.f90
+
+Bar::
+	@cp $(OPTDIR)/SLM_simple.clip SLM_simple.f90
+	@cp $(SRCDIR)/ADV_wind.bar ADV_wind.f90
+	@cp $(SRCDIR)/SLM_initial.bar SLM_initial.f90
+	
+Conservative::
+	@cp $(OPTDIR)/ADV_semilagrange.adv ADV_semilagrange.F90
+	@cp $(OPTDIR)/SLM_simple.plain SLM_simple.f90
+	@cp $(OPTDIR)/SLM_advanced.cons SLM_advanced.f90
+	
+Dual::
+	@cp $(OPTDIR)/ADV_semilagrange.adv ADV_semilagrange.F90
+	@cp $(OPTDIR)/SLM_simple.plain SLM_simple.f90
+	@cp $(OPTDIR)/SLM_advanced.dual SLM_advanced.f90
+	
+Cellintegrated::
+	@cp $(OPTDIR)/ADV_semilagrange.adv ADV_semilagrange.F90
+	@cp $(OPTDIR)/SLM_simple.plain SLM_simple.f90
+	@cp $(OPTDIR)/SLM_advanced.cellint SLM_advanced.f90
+	
+Quadrature::
+	@cp $(OPTDIR)/ADV_semilagrange.adv ADV_semilagrange.F90
+	@cp $(OPTDIR)/SLM_simple.plain SLM_simple.f90
+	@cp $(OPTDIR)/SLM_advanced.quadrature SLM_advanced.f90
+	
+Quadrature7::
+	@cp $(OPTDIR)/ADV_semilagrange.adv ADV_semilagrange.F90
+	@cp $(OPTDIR)/SLM_simple.plain SLM_simple.f90
+	@cp $(OPTDIR)/SLM_advanced.quadrature7 SLM_advanced.f90
+
+ConvWind::
+	@cp $(OPTDIR)/ADV_wind.convergent ADV_wind.f90
+	@cp $(OPTDIR)/SLM_initial.divergent SLM_initial.f90
+
+DivWind::
+	@cp $(OPTDIR)/ADV_wind.divergent ADV_wind.f90
+	@cp $(OPTDIR)/SLM_initial.divergent SLM_initial.f90
+
+DiagonalWind::
+	@cp $(OPTDIR)/ADV_wind.diagonal ADV_wind.f90
+	@cp $(OPTDIR)/SLM_initial.divergent SLM_initial.f90
+
+executable: $(MAINOBJ)
+	@echo "make: Linking object modules and libraries"
+	@$(LOADER) $(LDFLAGS) -o $(MAKETHING) $(LIBS) $(MAINOBJ)
+
+$(MAKETHING)::
+	@make maincopy
+	@make executable
+
+all::
+	@make maincopy
+	@make executable
+	@make clearsrc
+	@make clean
+
+#----------------------------------------------------------------#
+# DEPENDENCIES ON INCLUDE FILES                                  #
+#----------------------------------------------------------------#
diff --git a/flash2d/compile/linux_g64/README b/flash2d/compile/linux_g64/README
new file mode 100644
index 0000000..3bd4da7
--- /dev/null
+++ b/flash2d/compile/linux_g64/README
@@ -0,0 +1,68 @@
+**************************************************************************
+ FLASH90
+ FLexible Adaptive Semi-Lagrangian Hack
+ written in Fortran 90
+
+**************************************************************************
+
+ CONTENTS OF THIS DIRECTORY "$(FLASHDIR)/linux"
+
+Makefile	- Makefile
+Makefile.nogr	- Makefile (for non-OpenGL machine)
+Parameters.dat	- Input data 
+README		- this file
+
+--------------------------------------------------------------------------
+
+ WHAT TO DO HERE:
+
+In order to create and run an executable there are severel steps to be taken:
+
+FIRST: If not already done, go to directory $(FLASHDIR)/lib to create a
+library libuGL.a. The steps are described there.
+
+SECOND: Build a grid generator library libgapi.a: Type
+   make serialcopy
+   make seriallib
+
+THIRD: create a taylored executable. The simplest way to do so is:
+   make maincopy
+   make executable
+See for the alternatives below.
+
+FOURTH: Copy data files to run the executable:
+   make datacopy
+
+FIFTH: To run the executable, type
+   FLASH -h
+This will print out a help screen describing the options of FLASH
+   FLASH -b -f Parameters.dat
+will run FLASH in batch mode, where the input parameters are read from
+Parameters.dat.
+   FLASH -i
+will run FLASH in interactive input mode, opening an input window where every
+input parameter has to be set manually.
+
+ALTERNATIVES:
+
+You may choose different taylored Executables. In the THIRD Step you may type
+one of the following instead of "make maincopy":
+
+1. make Slot
+   this will create an executable calculating the Slotted Cylinder Test Case
+
+2. make Dual
+   this has to be called additionally to any of the others. It creates an
+   executable with the dual grid interpolation approach.
+
+3. make Gerrit
+   this will create an executable suitable for the Aerosol Experiment with
+   Gerrit Lohmann.
+
+4. Make Potsdam
+   this will create an executable for the Tracer Experiments with Klaus Dethloff
+   and Annette Rinke.
+
+**************************************************************************
+ j. behrens, 8/98, 3/99
+**************************************************************************
diff --git a/flash2d/compile/linux_ia64/Makefile b/flash2d/compile/linux_ia64/Makefile
new file mode 100644
index 0000000..c23a3bf
--- /dev/null
+++ b/flash2d/compile/linux_ia64/Makefile
@@ -0,0 +1,139 @@
+##################################################################
+#   FLASH90                                                      #
+#   FLexible Adaptive Semi-Lagrangian Hack                       #
+#   written in Fortran 90                                        #
+##################################################################
+# makefile to build FLASH                                        #
+# j. behrens 2/95, 3/96, 8/98                                    #
+# l. mentrup 7/05                                                #
+# --- this is for linux ---                                      #
+##################################################################
+
+# MACHINE
+MACHINE = linux
+
+# SET MAKETHING CORRESPONDING TO MACHINE:
+MAKETHING= FLASH
+
+# OPTIMIZATION SETTINGS [debug|norm|opt]
+MODE := debug
+
+# LIBRARY SETTINGS [yes|no]
+# Useage: make NO_NETCDF=yes NO_VISNET=yes
+NO_NETCDF := yes
+NO_VISNET := yes
+
+# Use Method MPSLM [yes|no]
+NO_MPSLM := yes
+
+# SET MAIN DIRECTORY PATH
+# !! This has to be alterd by user !!
+ROOTDIR = $(HOME)/Development
+
+# SET atlas/blas DIRECTORY PATH
+# !! This has to be alterd by user !!
+BLASDIR = $(MKL_LIBDIR)
+BLASLIB = 
+
+# SET LAPACK DIRECTORY PATH/BLAS INCLUDED IN INTEL MKL
+# !! This has to be alterd by user !!
+LAPACKDIR = $(MKL_LIBDIR) 
+LAPACKLIB = $(MKL_SHLIB)
+
+# SET C++ DIRECTORY PATH
+# !! This has to be alterd by user !!
+CCLIBDIR = /usr/lib/
+CCLIB = -lstdc++
+
+# SET MORE DIRECTORY PATHS
+LIBDIR  = $(ROOTDIR)/amatos2d/lib/linux_ia64
+INCDIR  = $(ROOTDIR)/amatos2d/include/linux_ia64
+MODDIR  = $(ROOTDIR)/amatos2d/include/linux_ia64
+MAINDIR = $(ROOTDIR)/flash2d
+
+SRCDIR  = $(MAINDIR)/src/flash
+OPTDIR  = $(MAINDIR)/src/options
+SYSDIR  = $(MAINDIR)/src/system/posix-f90
+TIMDIR  = $(MAINDIR)/src/timing
+DATDIR  = $(MAINDIR)/data
+BUILDIR = $(MAINDIR)/$(MACHINE)
+
+# SET NETCDF PATHS
+LIBNETCDF = 
+INCNETCDF =
+ifneq ($(strip $(NO_NETCDF)), yes)
+LIBNETCDF = -L/usr/local/lib -lnetcdf
+INCNETCDF = -I/usr/local/include
+endif
+
+# SET VISNET DIRECTORY PATH
+# !! This has to be alterd by user !!
+VISNETDIR =
+VISNETLIB = 
+ifneq ($(strip $(NO_VISNET)),yes)
+VISNETDIR = $(ROOTDIR)/lib/SINGLE
+VISNETLIB = -lvisnet4flash -lm3tv -ldelaunay \
+	    -ldetri -llia -lsos -lbasic \
+	    $(VISNETDIR)/fortify.o \
+	    -lglut -lGLU -lGL -ltiff
+endif
+
+# SET PATH TO GRID_API.mod
+AMATOS    = $(MODDIR)/grid_api.mod
+
+# SET THE ENDING OF MODULE FILES
+MODEND  = mod
+
+#----------------------------------------------------------------#
+# FLAGS FOR LINUX / Intel Fortran Compiler                       #
+#----------------------------------------------------------------#
+F90 	= ifort
+cc 	= gcc
+CC 	= g++
+LOADER  = ifort -i_dynamic
+
+# -------------- next for debugging -----------------------------#
+ifeq ($(strip $(MODE)),debug)
+  FFLAGS  = -g -w90 -C -DNO_BASIC_REDEF
+  CFLAGS  = -g
+  LDFLAGS = -g -Vaxlib -posixlib
+endif
+# -------------- next for normal compilation --------------------#
+ifeq ($(strip $(MODE)),norm)
+  FFLAGS  = -w90 -DNO_BASIC_REDEF
+  CFLAGS  =
+  LDFLAGS = -Vaxlib -posixlib
+endif
+# -------------- next with aggresive optimization (Pentium M) ---#
+ifeq ($(strip $(MODE)),opt)
+  FFLAGS  = -O3 -axB -tpp7 -fpic -w90 -DNO_BASIC_REDEF
+  CFLAGS  = -O3 
+  LDFLAGS = -O3  -Vaxlib -posixlib
+endif
+
+# --------------------- include Visnet/NetCDF or not ------------#
+ifeq ($(strip $(NO_VISNET)),yes)
+FFLAGS += -DNO_VISNET
+endif
+ifeq ($(strip $(NO_NETCDF)),yes)
+FFLAGS += -DNO_NETCDF
+endif
+
+# -------- next flag for using dummy graphics library -----------#
+LIBS = -L$(LIBDIR) -L$(BLASDIR) $(BLASLIB) \
+	           -L$(LAPACKDIR) $(LAPACKLIB) \
+		   -L$(VISNETDIR) $(VISNETLIB) \
+		   $(LIBNETCDF) -L$(CCLIBDIR) $(CCLIB)\
+        	   -lamatos -lm
+		    
+INCS = $(INCNETCDF) -I$(INCDIR) -I$(MODDIR)
+
+#----------------------------------------------------------------#
+# common stuff                                                   #
+#----------------------------------------------------------------#
+
+include $(MAINDIR)/compile/Makefiles/Makefile.common
+
+#----------------------------------------------------------------#
+# END of Makefile                                                #
+#----------------------------------------------------------------#
diff --git a/flash2d/compile/macosx_gfortran/Makefile b/flash2d/compile/macosx_gfortran/Makefile
new file mode 100644
index 0000000..7b58fd4
--- /dev/null
+++ b/flash2d/compile/macosx_gfortran/Makefile
@@ -0,0 +1,145 @@
+##################################################################
+#   FLASH90                                                      #
+#   FLexible Adaptive Semi-Lagrangian Hack                       #
+#   written in Fortran 90                                        #
+##################################################################
+# makefile to build FLASH                                        #
+# j. behrens 2/95, 3/96, 8/98                                    #
+# l. mentrup 7/05                                                #
+# --- this is for linux ---                                      #
+##################################################################
+
+# MACHINE
+MACHINE = macosx_gfortran
+
+# SYSTEM
+SYSTEM = gfortran
+
+# SET MAKETHING CORRESPONDING TO MACHINE:
+MAKETHING= FLASH
+
+# OPTIMIZATION SETTINGS [debug|norm|opt]
+MODE := debug
+
+# LIBRARY SETTINGS [yes|no]
+# Useage: make NO_NETCDF=yes NO_VISNET=yes
+NO_NETCDF := no
+NO_VISNET := yes
+
+# Use Method MPSLM [yes|no]
+NO_MPSLM := yes
+
+# SET MAIN DIRECTORY PATH
+# !! This has to be alterd by user !!
+ROOTDIR = $(HOME)/Documents/Development/amatos
+
+# SET atlas/blas DIRECTORY PATH
+# !! This has to be alterd by user !!
+BLASDIR = 
+BLASLIB = 
+
+# SET LAPACK DIRECTORY PATH/BLAS INCLUDED IN INTEL MKL
+# !! This has to be alterd by user !!
+LAPACKDIR =  
+LAPACKLIB =  -framework Accelerate
+
+# SET C++ DIRECTORY PATH
+# !! This has to be alterd by user !!
+CCLIBDIR = -L/usr/lib/
+CCLIB = -lstdc++
+
+# SET MORE DIRECTORY PATHS
+LIBDIR  = $(ROOTDIR)/amatos2d/trunk/lib/$(MACHINE)
+INCDIR  = $(ROOTDIR)/amatos2d/trunk/include/$(MACHINE)
+MODDIR  = $(ROOTDIR)/amatos2d/trunk/include/$(MACHINE)
+MAINDIR = $(ROOTDIR)/flash2d/trunk
+
+SRCDIR  = $(MAINDIR)/src/flash-sphere
+OPTDIR  = $(MAINDIR)/src/options-sphere
+SYSDIR  = $(MAINDIR)/src/system/$(SYSTEM)
+TIMDIR  = $(MAINDIR)/src/timing
+DATDIR  = $(MAINDIR)/data
+BUILDIR = $(MAINDIR)/compile/$(MACHINE)
+
+# SET NETCDF PATHS
+LIBNETCDF = 
+INCNETCDF =
+ifneq ($(strip $(NO_NETCDF)), yes)
+LIBNETCDF = -L$(LIBDIR) -lncugrid -L/sw2/lib -lnetcdff -lnetcdf
+INCNETCDF = -I/sw2/include
+endif
+
+# SET VISNET DIRECTORY PATH
+# !! This has to be alterd by user !!
+VISNETDIR =
+VISNETLIB = 
+ifneq ($(strip $(NO_VISNET)),yes)
+VISNETDIR = -L$(ROOTDIR)/lib/SINGLE
+VISNETLIB = -lvisnet4flash -lm3tv -ldelaunay \
+	    -ldetri -llia -lsos -lbasic \
+	    $(VISNETDIR)/fortify.o \
+	    -lglut -lGLU -lGL -ltiff
+endif
+
+# SET PATH TO GRID_API.mod
+AMATOS    = $(MODDIR)/grid_api.mod
+
+# SET THE ENDING OF MODULE FILES
+MODEND  = mod
+
+#----------------------------------------------------------------#
+# FLAGS FOR LINUX / Intel Fortran Compiler                       #
+#----------------------------------------------------------------#
+F90 	= gfortran
+cc 	= gcc
+CC 	= g++
+LOADER  = gfortran
+
+# --------------------- next are for debugging ------------------#
+ifeq ($(strip $(MODE)),debug)
+  FFLAGS  = -fbounds-check -ggdb -fpic -funderscoring # -C
+  CFLAGS  = -ggdb -fpic
+  LDFLAGS = -ggdb
+endif
+# --------------------- next are for normal compilation ---------#
+ifeq ($(strip $(MODE)),norm)
+  FFLAGS  = -fPIC -funderscoring
+  CFLAGS  = -fpic
+  LDFLAGS =
+endif
+# --------------------- next are for optimization ---------------#
+ifeq ($(strip $(MODE)),opt)
+  FFLAGS  = -O3 -fPIC -funderscoring
+  CFLAGS  = -O3 -fpic
+  LDFLAGS = -O3
+endif
+
+# --------------------- include Visnet/NetCDF or not ------------#
+ifeq ($(strip $(NO_VISNET)),yes)
+FFLAGS += -DNO_VISNET
+endif
+ifeq ($(strip $(NO_NETCDF)),yes)
+FFLAGS += -DNO_NETCDF
+endif
+
+FFLAGS += -D$(MACHINE)
+CFLAGS += -D$(MACHINE)
+
+# -------- next flag for using dummy graphics library -----------#
+LIBS = -L$(LIBDIR) $(BLASDIR) $(BLASLIB) \
+	           $(LAPACKDIR) $(LAPACKLIB) \
+		   $(VISNETDIR) $(VISNETLIB) \
+		   $(LIBNETCDF) $(CCLIBDIR) $(CCLIB)\
+        	   -lsamatos -lm
+		    
+INCS = $(INCNETCDF) -I$(INCDIR) -I$(MODDIR)
+
+#----------------------------------------------------------------#
+# common stuff                                                   #
+#----------------------------------------------------------------#
+
+include $(MAINDIR)/compile/Makefiles/Makefile.common
+
+#----------------------------------------------------------------#
+# END of Makefile                                                #
+#----------------------------------------------------------------#
diff --git a/flash2d/compile/macosx_intel/Makefile b/flash2d/compile/macosx_intel/Makefile
new file mode 100644
index 0000000..6015e80
--- /dev/null
+++ b/flash2d/compile/macosx_intel/Makefile
@@ -0,0 +1,144 @@
+##################################################################
+#   FLASH90                                                      #
+#   FLexible Adaptive Semi-Lagrangian Hack                       #
+#   written in Fortran 90                                        #
+##################################################################
+# makefile to build FLASH                                        #
+# j. behrens 2/95, 3/96, 8/98                                    #
+# l. mentrup 7/05                                                #
+# --- this is for linux ---                                      #
+##################################################################
+
+# MACHINE
+MACHINE = macosx_intel
+
+# SYSTEM
+SYSTEM = std-f90
+
+# SET MAKETHING CORRESPONDING TO MACHINE:
+MAKETHING= FLASH
+
+# OPTIMIZATION SETTINGS [debug|norm|opt]
+MODE := debug
+
+# LIBRARY SETTINGS [yes|no]
+# Useage: make NO_NETCDF=yes NO_VISNET=yes
+NO_NETCDF := no
+NO_VISNET := yes
+
+# Use Method MPSLM [yes|no]
+NO_MPSLM := yes
+
+# SET MAIN DIRECTORY PATH
+# !! This has to be alterd by user !!
+ROOTDIR = $(HOME)/Documents/Development/amatos
+
+# SET atlas/blas DIRECTORY PATH
+# !! This has to be alterd by user !!
+BLASDIR = $(MKLROOT)/lib
+BLASLIB = 
+
+# SET LAPACK DIRECTORY PATH/BLAS INCLUDED IN INTEL MKL
+# !! This has to be alterd by user !!
+LAPACKDIR =  $(MKLROOT)/lib #-L$($ROOTDIR)/amatos2d/trunk/3rdparty/LAPACK95
+LAPACKLIB =  -I${MKLROOT}/include/lp64 -I${MKLROOT}/include ${MKLROOT}/lib/libmkl_blas95_lp64.a \
+             ${MKLROOT}/lib/libmkl_lapack95_lp64.a ${MKLROOT}/lib/libmkl_intel_lp64.a \
+             ${MKLROOT}/lib/libmkl_core.a ${MKLROOT}/lib/libmkl_sequential.a \
+             -lpthread -lm # -llapack95
+
+# SET C++ DIRECTORY PATH
+# !! This has to be alterd by user !!
+CCLIBDIR = /usr/lib/
+CCLIB = -lstdc++
+
+# SET MORE DIRECTORY PATHS
+LIBDIR  = $(ROOTDIR)/amatos2d/trunk/lib/$(MACHINE)
+INCDIR  = $(ROOTDIR)/amatos2d/trunk/include/$(MACHINE)
+MODDIR  = $(ROOTDIR)/amatos2d/trunk/include/$(MACHINE)
+MAINDIR = $(ROOTDIR)/flash2d/trunk
+
+SRCDIR  = $(MAINDIR)/src/flash
+OPTDIR  = $(MAINDIR)/src/options
+SYSDIR  = $(MAINDIR)/src/system/$(SYSTEM)
+TIMDIR  = $(MAINDIR)/src/timing
+DATDIR  = $(MAINDIR)/data
+BUILDIR = $(MAINDIR)/compile/$(MACHINE)
+
+# SET NETCDF PATHS
+LIBNETCDF = 
+INCNETCDF =
+ifneq ($(strip $(NO_NETCDF)), yes)
+LIBNETCDF = -L$(LIBDIR) -lncugrid -L/usr/local/lib -lnetcdff -lnetcdf
+INCNETCDF = -I/usr/local/include
+endif
+
+# SET VISNET DIRECTORY PATH
+# !! This has to be alterd by user !!
+VISNETDIR =
+VISNETLIB = 
+ifneq ($(strip $(NO_VISNET)),yes)
+VISNETDIR = $(ROOTDIR)/lib/SINGLE
+VISNETLIB = -lvisnet4flash -lm3tv -ldelaunay \
+	    -ldetri -llia -lsos -lbasic \
+	    $(VISNETDIR)/fortify.o \
+	    -lglut -lGLU -lGL -ltiff
+endif
+
+# SET PATH TO GRID_API.mod
+AMATOS    = $(MODDIR)/grid_api.mod
+
+# SET THE ENDING OF MODULE FILES
+MODEND  = mod
+
+#----------------------------------------------------------------#
+# FLAGS FOR LINUX / Intel Fortran Compiler                       #
+#----------------------------------------------------------------#
+F90 	= ifort
+cc 	= gcc
+CC 	= g++
+LOADER  = ifort
+
+# -------------- next for debugging -----------------------------#
+ifeq ($(strip $(MODE)),debug)
+  FFLAGS  = -g -fpic -Wl,-no_pie -DLAPACK95 -DUSE_MKL -check all #none # all
+  CFLAGS  = -g -m64 -check
+  LDFLAGS = -g -save-temps -static-intel -fpic -Wl,-no_pie -check all #none # all
+endif
+# -------------- next for normal compilation --------------------#
+ifeq ($(strip $(MODE)),norm)
+  FFLAGS  = -DLAPACK95 -DUSE_MKL
+  CFLAGS  =
+  LDFLAGS = -ifport
+endif
+# -------------- next with aggresive optimization (Pentium M) ---#
+ifeq ($(strip $(MODE)),opt)
+  FFLAGS  = -O -DLAPACK95 -DUSE_MKL
+  CFLAGS  = -O
+  LDFLAGS = -O -ifport
+endif
+
+# --------------------- include Visnet/NetCDF or not ------------#
+ifeq ($(strip $(NO_VISNET)),yes)
+FFLAGS += -DNO_VISNET
+endif
+ifeq ($(strip $(NO_NETCDF)),yes)
+FFLAGS += -DNO_NETCDF
+endif
+
+# -------- next flag for using dummy graphics library -----------#
+LIBS = -lamatos $(LIBNETCDF) -L$(LIBDIR) -I$(MODDIR) -L$(BLASDIR) $(BLASLIB) \
+	           -L$(LAPACKDIR) $(LAPACKLIB) $(BLASLIB) $(VISNETLIB) \
+	           $(CCLIB) -lm
+		    
+INCS = $(INCNETCDF) -I$(INCDIR) -I$(MODDIR) -I$(MKLROOT)/include/intel64/lp64 #\
+#       -I$($ROOTDIR)/amatos2d/trunk/3rdparty/LAPACK95/lapack95_modules
+
+#----------------------------------------------------------------#
+# common stuff                                                   #
+#----------------------------------------------------------------#
+
+include $(MAINDIR)/compile/Makefiles/Makefile.common
+
+#----------------------------------------------------------------#
+# END of Makefile                                                #
+#----------------------------------------------------------------#
diff --git a/flash2d/compile/solaris_sparc/Makefile b/flash2d/compile/solaris_sparc/Makefile
new file mode 100644
index 0000000..4d4a4c8
--- /dev/null
+++ b/flash2d/compile/solaris_sparc/Makefile
@@ -0,0 +1,135 @@
+##################################################################
+#   FLASH90                                                      #
+#   FLexible Adaptive Semi-Lagrangian Hack                       #
+#   written in Fortran 90                                        #
+##################################################################
+# makefile to build FLASH                                        #
+# j. behrens 2/95, 3/96                                          #
+# --- this is for Solaris ---                                    #
+##################################################################
+
+# MACHINE
+MACHINE = solaris_sparc
+
+# SET MAKETHING CORRESPONDING TO MACHINE:
+MAKETHING= FLASH
+
+# OPTIMIZATION SETTINGS [debug|norm|opt]
+MODE := debug
+
+# LIBRARY SETTINGS [yes|no]
+# Useage: make NO_NETCDF=yes NO_VISNET=yes
+NO_NETCDF := no
+NO_VISNET := yes
+
+# Use Method MPSLM [yes|no]
+NO_MPSLM := yes
+
+# SET MAIN DIRECTORY PATH
+ROOTDIR = $(HOME)/development
+
+# SET atlas/blas DIRECTORY PATH
+# !! This has to be alterd by user !!
+BLASDIR = 
+BLASLIB = 
+
+# SET LAPACK DIRECTORY PATH
+# !! This has to be alterd by user !!
+LAPACKDIR = -L/sw/solaris10/SunStudio-12u1/lib -R/sw/solaris10/SunStudio-12u1/lib
+LAPACKLIB = -xlic_lib=sunperf
+
+# SET VISNET DIRECTORY PATH
+# !! This has to be alterd by user !!
+ifneq ($(strip $(NO_VISNET)),yes)
+  VISNETDIR = $(ROOTDIR)/lib
+  VISNETLIB = -lvisnet4flash -lm3tv -ldelaunay \
+	      -ldetri -llia -lsos -lbasic \
+	       $(VISNETDIR)/SINGLE/fortify.o \
+	       -lglut -lGLU -lGL -ltiff 
+endif
+
+# SET C++ DIRECTORY PATH
+# !! This has to be alterd by user !!
+CCLIBDIR = /usr/lib/
+CCLIB =  -mt -lrt -lCstd
+
+# SET MORE DIRECTORY PATHS
+MAINDIR = $(ROOTDIR)/flash2d
+LIBDIR  = $(ROOTDIR)/amatos2d/lib/solaris_sparc
+INCDIR  = $(ROOTDIR)/amatos2d/include/solaris_sparc
+MODDIR  = $(ROOTDIR)/amatos2d/include/solaris_sparc
+
+SRCDIR  = $(MAINDIR)/src/flash
+OPTDIR  = $(MAINDIR)/src/options
+SYSDIR  = $(MAINDIR)/src/system/std-f90
+TIMDIR  = $(MAINDIR)/src/timing
+DATDIR  = $(MAINDIR)/data
+BUILDIR = $(MAINDIR)/compile/$(MACHINE)
+
+# SET NETCDF PATHS
+LIBNETCDF = 
+INCNETCDF =
+ifneq ($(strip $(NO_NETCDF)), yes)
+LIBNETCDF = -L$(LIBDIR) -lncugrid -L/sw/solaris10/netcdf-4.1.2-sun12/lib -R/sw/solaris10/netcdf-4.1.2-sun12/lib -lnetcdff -lnetcdf
+INCNETCDF = -I/sw/solaris10/netcdf-4.1.2-sun12/include -M/sw/solaris10/netcdf-4.1.2-sun12/include
+endif
+
+# SET PATH TO GRID_API.mod
+AMATOS    = $(MODDIR)/grid_api.mod
+
+# SET THE ENDING OF MODULE FILES
+MODEND  = mod
+
+#----------------------------------------------------------------#
+# FLAGS FOR SUN                                                  #
+#----------------------------------------------------------------#
+
+MAKE = gmake
+F77 = f77
+F90 = f90
+CC = cc
+LOADER = f90
+
+# --------------------- next are for debugging ------------------#
+ifeq ($(strip $(MODE)),debug)
+  FFLAGS  = -g -KPIC # -ext_names=plain
+  CFLAGS  = -g
+  LDFLAGS = -g -z nodefs
+endif
+# --------------------- next are for normal compilation ---------#
+ifeq ($(strip $(MODE)),norm)
+  FFLAGS  = -KPIC # -ext_names=plain
+  CFLAGS  =
+  LDFLAGS = -z nodefs
+endif
+# --------------------- next are for optimization ---------------#
+ifeq ($(strip $(MODE)),opt)
+  FFLAGS  = -O -KPIC # -ext_names=plain
+  CFLAGS  = -O
+  LDFLAGS = -O -z nodefs
+endif
+
+# --------------------- include Visnet/NetCDF or not ------------#
+ifeq ($(strip $(NO_VISNET)),yes)
+FFLAGS += -DNO_VISNET
+endif
+ifeq ($(strip $(NO_NETCDF)),yes)
+FFLAGS += -DNO_NETCDF
+endif
+
+# -------- next flag for using dummy graphics library -----------#
+LIBS = -L$(LIBDIR) -R$(LIBDIR) -L$(LAPACKDIR) -R$(LAPACKDIR) -L$(VISNETDIR) \
+	-L$(CCLIBDIR) \
+       -lamatos $(LAPACKLIB) $(BLASLIB) $(LIBNETCDF) $(VISNETLIB) \
+	$(CCLIB) -lm
+INCS = $(INCNETCDF) -I$(INCDIR) -M$(MODDIR) -I. -M.
+
+#----------------------------------------------------------------#
+# common stuff                                                   #
+#----------------------------------------------------------------#
+
+include $(MAINDIR)/compile/Makefiles/Makefile.common
+
+#----------------------------------------------------------------#
+# END of Makefile                                                #
+#----------------------------------------------------------------#
diff --git a/flash2d/data/Domain.SWCosine.dat b/flash2d/data/Domain.SWCosine.dat
new file mode 100644
index 0000000..379c868
--- /dev/null
+++ b/flash2d/data/Domain.SWCosine.dat
@@ -0,0 +1,47 @@
+Domain.dat!-------------------------------------------------------------------
+! this file defines as an example a simple computational domain
+!  let 1 pi space outside 0
+! j. behrens, 11/97
+!
+! this describes the conventions for the data format:
+! COMMENTS:
+!   each line beginning with a '!' or a '#' is a comment line
+! KEYWORDS
+!   there are several keywords which have to start in the first
+!   collumn and have to be written in CAPITAL LETTERS. the line
+!   immediately following the keyword line holds the required
+!   information and must not contain a comment!
+! DATA
+!   has to be written according to the information given by the
+!   keywords. ok, look at the example :-)
+!-------------------------------------------------------------------
+# define the number of dimensions: two lines:
+# 1. keyword line, 2. single integer
+NUMBER_OF_DIMENSIONS
+2
+# ok, we made this one.
+# now define the number of polygons for the domain: two lines:
+# 1. keyword line, 2. single integer
+NUMBER_OF_POLYGONS
+1
+# this is going to be a really complicated domain...
+# now we deliver the number of vertices of the polygonal line: two lines:
+# 1. keyword line, 2. single integer
+NUMBER_OF_VERTICES
+4
+# guess, this is going to be a square!
+# finally we give the coordinate data:
+#   NUMBER_OF_DIMENSIONS * NUMBER_OF_VERTICES + 1 lines:
+# 1. keyword line, after that data lines (only one collumn)
+VERTEX_DATA
+0000000.0
+0000000.0
+25000.0
+0000000.0
+25000.0
+25000.0
+0000000.0
+25000.0
+!-------------------------------------------------------------------
+! end of file
+!-------------------------------------------------------------------
diff --git a/flash2d/data/Domain.dat b/flash2d/data/Domain.dat
new file mode 100644
index 0000000..c89b6f1
--- /dev/null
+++ b/flash2d/data/Domain.dat
@@ -0,0 +1,48 @@
+!-------------------------------------------------------------------
+! this file defines as an example a simple computational domain
+! i.e. the unit square, moved by the vector (-0.5,-0.5)
+!
+! j. behrens, 11/97
+!
+! this describes the conventions for the data format:
+! COMMENTS:
+!   each line beginning with a '!' or a '#' is a comment line
+! KEYWORDS
+!   there are several keywords which have to start in the first
+!   collumn and have to be written in CAPITAL LETTERS. the line
+!   immediately following the keyword line holds the required
+!   information and must not contain a comment!
+! DATA
+!   has to be written according to the information given by the
+!   keywords. ok, look at the example :-)
+!-------------------------------------------------------------------
+# define the number of dimensions: two lines:
+# 1. keyword line, 2. single integer
+NUMBER_OF_DIMENSIONS
+2
+# ok, we made this one.
+# now define the number of polygons for the domain: two lines:
+# 1. keyword line, 2. single integer
+NUMBER_OF_POLYGONS
+1
+# this is going to be a really complicated domain...
+# now we deliver the number of vertices of the polygonal line: two lines:
+# 1. keyword line, 2. single integer
+NUMBER_OF_VERTICES
+4
+# guess, this is going to be a square!
+# finally we give the coordinate data:
+#   NUMBER_OF_DIMENSIONS * NUMBER_OF_VERTICES + 1 lines:
+# 1. keyword line, after that data lines (only one collumn)
+VERTEX_DATA
+-0.5
+-0.5
+0.5
+-0.5
+0.5
+0.5
+-0.5
+0.5
+!-------------------------------------------------------------------
+! end of file
+!-------------------------------------------------------------------
diff --git a/flash2d/data/DomainSph.global.dat b/flash2d/data/DomainSph.global.dat
new file mode 100644
index 0000000..02c5d62
--- /dev/null
+++ b/flash2d/data/DomainSph.global.dat
@@ -0,0 +1,13 @@
+!-------------------------------------------------------------------
+! this file defines the whole of the sphere as domain, by not defining any boundaries
+!
+! f. klaschka, 11/97
+!
+!-------------------------------------------------------------------
+NUMBER_OF_DIMENSIONS
+3
+NUMBER_OF_POLYGONS
+0
+!-------------------------------------------------------------------
+! end of file
+!-------------------------------------------------------------------
diff --git a/flash2d/data/Domain_aviso.dat b/flash2d/data/Domain_aviso.dat
new file mode 100644
index 0000000..fcfbba3
--- /dev/null
+++ b/flash2d/data/Domain_aviso.dat
@@ -0,0 +1,48 @@
+!-------------------------------------------------------------------
+! this file defines as an example a simple computational domain
+! i.e. the unit square, moved by the vector (-0.5,-0.5)
+!
+! j. behrens, 11/97
+!
+! this describes the conventions for the data format:
+! COMMENTS:
+!   each line beginning with a '!' or a '#' is a comment line
+! KEYWORDS
+!   there are several keywords which have to start in the first
+!   collumn and have to be written in CAPITAL LETTERS. the line
+!   immediately following the keyword line holds the required
+!   information and must not contain a comment!
+! DATA
+!   has to be written according to the information given by the
+!   keywords. ok, look at the example :-)
+!-------------------------------------------------------------------
+# define the number of dimensions: two lines:
+# 1. keyword line, 2. single integer
+NUMBER_OF_DIMENSIONS
+2
+# ok, we made this one.
+# now define the number of polygons for the domain: two lines:
+# 1. keyword line, 2. single integer
+NUMBER_OF_POLYGONS
+1
+# this is going to be a really complicated domain...
+# now we deliver the number of vertices of the polygonal line: two lines:
+# 1. keyword line, 2. single integer
+NUMBER_OF_VERTICES
+4
+# guess, this is going to be a square!
+# finally we give the coordinate data:
+#   NUMBER_OF_DIMENSIONS * NUMBER_OF_VERTICES + 1 lines:
+# 1. keyword line, after that data lines (only one collumn)
+VERTEX_DATA
+120.0
+-20.0
+260.0
+-20.0
+260.0
+60.0
+120.0
+60.0
+!-------------------------------------------------------------------
+! end of file
+!-------------------------------------------------------------------
diff --git a/flash2d/data/Domain_periodic_pi.dat b/flash2d/data/Domain_periodic_pi.dat
new file mode 100644
index 0000000..c740faf
--- /dev/null
+++ b/flash2d/data/Domain_periodic_pi.dat
@@ -0,0 +1,48 @@
+!-------------------------------------------------------------------
+! this file defines as an example a simple computational domain
+! i.e. the unit square, moved by the vector (-0.5,-0.5)
+!
+! j. behrens, 11/97
+!
+! this describes the conventions for the data format:
+! COMMENTS:
+!   each line beginning with a '!' or a '#' is a comment line
+! KEYWORDS
+!   there are several keywords which have to start in the first
+!   collumn and have to be written in CAPITAL LETTERS. the line
+!   immediately following the keyword line holds the required
+!   information and must not contain a comment!
+! DATA
+!   has to be written according to the information given by the
+!   keywords. ok, look at the example :-)
+!-------------------------------------------------------------------
+# define the number of dimensions: two lines:
+# 1. keyword line, 2. single integer
+NUMBER_OF_DIMENSIONS
+2
+# ok, we made this one.
+# now define the number of polygons for the domain: two lines:
+# 1. keyword line, 2. single integer
+NUMBER_OF_POLYGONS
+1
+# this is going to be a really complicated domain...
+# now we deliver the number of vertices of the polygonal line: two lines:
+# 1. keyword line, 2. single integer
+NUMBER_OF_VERTICES
+4
+# guess, this is going to be a square!
+# finally we give the coordinate data:
+#   NUMBER_OF_DIMENSIONS * NUMBER_OF_VERTICES + 1 lines:
+# 1. keyword line, after that data lines (only one collumn)
+VERTEX_DATA
+-3.141592653589793
+-1.570796326794897
+3.141592653589793
+-1.570796326794897
+3.141592653589793
+1.570796326794897
+-3.141592653589793
+1.570796326794897
+!-------------------------------------------------------------------
+! end of file
+!-------------------------------------------------------------------
diff --git a/flash2d/data/Initial.dat b/flash2d/data/Initial.dat
new file mode 100644
index 0000000..cdee4c1
--- /dev/null
+++ b/flash2d/data/Initial.dat
@@ -0,0 +1,30 @@
+!-----------------------------------------------------------------
+! this file contains input data for the initial field
+! in the tracer advection experiment
+! again, keywords control the input data
+!
+! j. behrens, 12/97
+!-----------------------------------------------------------------
+# on of two main keywords must appear at the beginning
+# CIRCLES_INPUT or FILES_INPUT
+CIRCLES_INPUT
+# the CIRCLES_INPUT keywords follow
+# give the number of circles
+NUMBER_OF_CIRCLES
+1
+# for each circle give the coordinates and the concentration
+CIRCLE_COORDINATES
+17.3
+10.5
+CIRCLE_DIAMETER
+2.1
+CIRCLE_CONCENTRATION
+1.
+!-----------------------------------------------------------------
+# for the FILES_INPUT there are (not yet implemented) some
+# keywords:
+# INPUT_FILE_NAME, X_POINT_NUMBER, Y_POINT_NUMBER, NUMBER_OF_WATERMARKS,
+# WATERMARK_LEVEL, WATERMARK_CONCENTRATION
+!-----------------------------------------------------------------
+! and this is the end of the file
+!-----------------------------------------------------------------
diff --git a/flash2d/data/Land.dat b/flash2d/data/Land.dat
new file mode 100644
index 0000000..daf510d
--- /dev/null
+++ b/flash2d/data/Land.dat
@@ -0,0 +1,10 @@
+# Number of polylines
+1
+# 1. polygon, number of points
+5
+# coordinate pairs
+0.1 0.1
+0.4 0.1
+0.4 0.4
+0.1 0.4
+0.1 0.1
diff --git a/flash2d/data/Parambench.dat b/flash2d/data/Parambench.dat
new file mode 100644
index 0000000..4c8c104
--- /dev/null
+++ b/flash2d/data/Parambench.dat
@@ -0,0 +1,69 @@
+#-----------------------------------------------------------
+# Input file for batch mode input
+# input is controlled via keywords
+#
+# j. behrens 12/96
+#-----------------------------------------------------------
+# the experiment no. (0 for a new experiment)     [integer]
+EXPERIMENT_NUMBER
+0
+# desired maximum level of refinements            [integer]
+FINE_GRID_LEVEL
+16
+# minimum level of refinements                    [integer]
+COARSE_GRID_LEVEL
+4
+# tolerance for refinement                        [real]
+TOLERANCE_OF_REFINEMENT
+0.2
+# tolerance for coarsening                        [real]
+TOLERANCE_OF_COARSENING
+0.1
+# watermark for refinement                        [real]
+WATERMARK_OF_REFINEMENT
+0.01
+# watermark for coarsening                        [real]
+WATERMARK_OF_COARSENING
+0.01
+# timestep length                                 [real]
+TIMESTEP_LENGTH
+1800.
+# first timestep                                  [integer]
+BEGINNING_TIMESTEP
+1
+# last timestep                                   [integer]
+FINISHING_TIMESTEP
+5
+# plot in matlab style to file (no plot = 0)      [integer]
+MATLAB_PLOTTING
+0
+# plot in gmv style to file (no plot = 0)         [integer]
+GMV_FILE_PLOTTING
+1
+# timesteps between plots                         [integer]
+STEPS_BTW_PLOTS
+1
+# timesteps between saves                         [integer]
+STEPS_BTW_SAVES
+500
+# save last timestep for next experiment (no = 0) [integer]
+SAVE_FINISH_CONFIGURATION
+0
+# plot a polygonal line from file (if given)      [character]
+POLYGON_FILE_NAME
+Land.dat
+# take advecting wind from file (if given)        [character]
+WIND_FILE_NAME
+Windparam.dat
+# file defining the domain                        [character]
+DOMAIN_FILE_NAME
+Domain.dat
+# file defining the initial triangulation         [character]
+TRIANG_FILE_NAME
+Triang.dat
+# number of iterations in trajectory estimation   [integer]
+SLM_ITERATION_NUMBER
+4
+#-----------------------------------------------------------
+# END OF FILE
+#-----------------------------------------------------------
diff --git a/flash2d/data/Parameters.SW.dat b/flash2d/data/Parameters.SW.dat
new file mode 100644
index 0000000..5be8007
--- /dev/null
+++ b/flash2d/data/Parameters.SW.dat
@@ -0,0 +1,75 @@
+#-----------------------------------------------------------
+# Input file for batch mode input
+# input is controlled via keywords
+#
+# j. behrens 12/96
+#-----------------------------------------------------------
+# the experiment no. (0 for a new experiment)     [integer]
+EXPERIMENT_NUMBER
+0
+# desired maximum level of refinements            [integer]
+FINE_GRID_LEVEL
+9
+# minimum level of refinements                    [integer]
+COARSE_GRID_LEVEL
+9
+# tolerance for refinement                        [real]
+TOLERANCE_OF_REFINEMENT
+0.2
+# tolerance for coarsening                        [real]
+TOLERANCE_OF_COARSENING
+0.1
+# watermark for refinement                        [real]
+WATERMARK_OF_REFINEMENT
+0.01
+# watermark for coarsening                        [real]
+WATERMARK_OF_COARSENING
+0.01
+# timestep length                                 [real]
+TIMESTEP_LENGTH
+20.
+# first timestep                                  [integer]
+BEGINNING_TIMESTEP
+1
+# last timestep                                   [integer]
+FINISHING_TIMESTEP
+10
+# plot in matlab style to file (no plot = 0)      [integer]
+MATLAB_PLOTTING
+0
+# plot in gmv style to file (no plot = 0)         [integer]
+GMV_FILE_PLOTTING
+1
+# plot in VisNET window (no plot = 0)             [integer]
+VISNET_PLOTTING
+1
+# screenshot VisNET window (no plot = 0)          [integer]
+VISNET_SCREENSHOT
+1
+# timesteps between plots                         [integer]
+STEPS_BTW_PLOTS
+1
+# timesteps between saves                         [integer]
+STEPS_BTW_SAVES
+500
+# save last timestep for next experiment (no = 0) [integer]
+SAVE_FINISH_CONFIGURATION
+0
+# plot a polygonal line from file (if given)      [character]
+POLYGON_FILE_NAME
+Land.dat
+# take advecting wind from file (if given)        [character]
+WIND_FILE_NAME
+Windparam.dat
+# file defining the domain                        [character]
+DOMAIN_FILE_NAME
+Domain.dat
+# file defining the initial triangulation         [character]
+TRIANG_FILE_NAME
+Triang.dat
+# number of iterations in trajectory estimation   [integer]
+SLM_ITERATION_NUMBER
+4
+#-----------------------------------------------------------
+# END OF FILE
+#-----------------------------------------------------------
diff --git a/flash2d/data/Parameters.dat b/flash2d/data/Parameters.dat
new file mode 100644
index 0000000..f867f03
--- /dev/null
+++ b/flash2d/data/Parameters.dat
@@ -0,0 +1,77 @@
+#-----------------------------------------------------------
+# Input file for batch mode input
+# input is controlled via keywords
+#
+# new version with generic input metadata involved
+#
+# j. behrens 05/2016
+#-----------------------------------------------------------
+# the experiment no. (0 for a new experiment)     [integer]
+EXPERIMENT_NUMBER
+0
+# switch diagnostics on (1) or off (0)            [integer]
+SWITCH_ON_DIAGNOSTICS
+0
+# desired maximum level of refinements            [integer]
+FINE_GRID_LEVEL
+11
+# minimum level of refinements                    [integer]
+COARSE_GRID_LEVEL
+11
+# tolerance for refinement                        [real]
+TOLERANCE_OF_REFINEMENT
+0.2
+# tolerance for coarsening                        [real]
+TOLERANCE_OF_COARSENING
+0.1
+# watermark for refinement                        [real]
+WATERMARK_OF_REFINEMENT
+0.01
+# watermark for coarsening                        [real]
+WATERMARK_OF_COARSENING
+0.01
+# timestep length                                 [real]
+TIMESTEP_LENGTH
+1800.
+# starting time                                   [real]
+TIMESTEPPING_START_TIME
+0.0
+# final time                                      [real]
+TIMESTEPPING_END_TIME
+18000.
+# plot in matlab style to file (no plot = 0)      [integer]
+NETCDF_FILE_PLOTTING
+0
+# plot in gmv style to file (no plot = 0)         [integer]
+VTU_FILE_PLOTTING
+1
+# timesteps between plots                         [integer]
+STEPS_BTW_PLOTS
+1
+# timesteps between saves                         [integer]
+STEPS_BTW_SAVES
+500
+# save last timestep for next experiment (no = 0) [integer]
+SAVE_FINISH_CONFIGURATION
+0
+# take advecting wind from file (if given)        [character]
+WIND_FILE_NAME
+Windparam.dat
+# file defining the domain                        [character]
+DOMAIN_FILE_NAME
+Domain.dat
+# file defining the initial triangulation         [character]
+TRIANG_FILE_NAME
+Triang.dat
+# number of iterations in trajectory estimation   [integer]
+SLM_ITERATION_NUMBER
+4
+# for advection diffusion test case: coefficient  [real]
+DIFFUSION_COEFFICIENT
+0.3
+# for scaling the wind strength                   [real]
+WIND_COEFFICIENT
+1.0
+#-----------------------------------------------------------
+# END OF FILE
+#-----------------------------------------------------------
diff --git a/flash2d/data/Parameters.generic b/flash2d/data/Parameters.generic
new file mode 100644
index 0000000..e302966
--- /dev/null
+++ b/flash2d/data/Parameters.generic
@@ -0,0 +1,77 @@
+#-----------------------------------------------------------
+# Input file for batch mode input
+# input is controlled via keywords
+#
+# new version with generic input metadata involved
+#
+# j. behrens 05/2016
+#-----------------------------------------------------------
+# the experiment no. (0 for a new experiment)     [integer]
+EXPERIMENT_NUMBER
+0
+# switch diagnostics on (1) or off (0)            [integer]
+SWITCH_ON_DIAGNOSTICS
+0
+# desired maximum level of refinements            [integer]
+FINE_GRID_LEVEL
+15
+# minimum level of refinements                    [integer]
+COARSE_GRID_LEVEL
+4
+# tolerance for refinement                        [real]
+TOLERANCE_OF_REFINEMENT
+0.2
+# tolerance for coarsening                        [real]
+TOLERANCE_OF_COARSENING
+0.1
+# watermark for refinement                        [real]
+WATERMARK_OF_REFINEMENT
+0.01
+# watermark for coarsening                        [real]
+WATERMARK_OF_COARSENING
+0.01
+# timestep length                                 [real]
+TIMESTEP_LENGTH
+1800.
+# starting time                                   [real]
+TIMESTEPPING_START_TIME
+0.0
+# final time                                      [real]
+TIMESTEPPING_END_TIME
+18000.
+# plot in matlab style to file (no plot = 0)      [integer]
+NETCDF_FILE_PLOTTING
+0
+# plot in gmv style to file (no plot = 0)         [integer]
+VTU_FILE_PLOTTING
+1
+# timesteps between plots                         [integer]
+STEPS_BTW_PLOTS
+1
+# timesteps between saves                         [integer]
+STEPS_BTW_SAVES
+500
+# save last timestep for next experiment (no = 0) [integer]
+SAVE_FINISH_CONFIGURATION
+0
+# take advecting wind from file (if given)        [character]
+WIND_FILE_NAME
+Windparam.dat
+# file defining the domain                        [character]
+DOMAIN_FILE_NAME
+Domain.dat
+# file defining the initial triangulation         [character]
+TRIANG_FILE_NAME
+Triang.dat
+# number of iterations in trajectory estimation   [integer]
+SLM_ITERATION_NUMBER
+4
+# for advection diffusion test case: coefficient  [real]
+DIFFUSION_COEFFICIENT
+0.3
+# for scaling the wind strength                   [real]
+WIND_COEFFICIENT
+1.0
+#-----------------------------------------------------------
+# END OF FILE
+#-----------------------------------------------------------
diff --git a/flash2d/data/Parameters.new.dat b/flash2d/data/Parameters.new.dat
new file mode 100644
index 0000000..9392272
--- /dev/null
+++ b/flash2d/data/Parameters.new.dat
@@ -0,0 +1,114 @@
+#-----------------------------------------------------------
+# Input file for batch mode input
+# input is controlled via keywords
+#
+# new version with generic input metadata involved
+#
+# j. behrens 05/2016
+#-----------------------------------------------------------
+# 1. Section:
+#    This section contains all standard parameters
+#-----------------------------------------------------------
+# the experiment no. (0 for a new experiment)     [integer]
+EXPERIMENT_NUMBER
+0
+# switch diagnostics on (1) or off (0)            [integer]
+SWITCH_ON_DIAGNOSTICS
+0
+# desired maximum level of refinements            [integer]
+FINE_GRID_LEVEL
+17
+# minimum level of refinements                    [integer]
+COARSE_GRID_LEVEL
+9
+# tolerance for refinement                        [real]
+TOLERANCE_OF_REFINEMENT
+0.2
+# tolerance for coarsening                        [real]
+TOLERANCE_OF_COARSENING
+0.1
+# watermark for refinement                        [real]
+WATERMARK_OF_REFINEMENT
+0.01
+# watermark for coarsening                        [real]
+WATERMARK_OF_COARSENING
+0.01
+# timestep length                                 [real]
+TIMESTEP_LENGTH
+1800.
+# starting time                                   [real]
+TIMESTEPPING_START_TIME
+0.0
+# final time                                      [real]
+TIMESTEPPING_END_TIME
+72000.
+# plot in matlab style to file (no plot = 0)      [integer]
+NETCDF_FILE_PLOTTING
+0
+# plot in gmv style to file (no plot = 0)         [integer]
+VTU_FILE_PLOTTING
+1
+# timesteps between plots                         [integer]
+STEPS_BTW_PLOTS
+1
+# timesteps between saves                         [integer]
+STEPS_BTW_SAVES
+500
+# save last timestep for next experiment (no = 0) [integer]
+SAVE_FINISH_CONFIGURATION
+0
+# file defining the domain                        [character]
+DOMAIN_FILE_NAME
+Domain.dat
+# file defining the initial triangulation         [character]
+TRIANG_FILE_NAME
+Triang.dat
+# number of iterations in trajectory estimation   [integer]
+SLM_ITERATION_NUMBER
+4
+#-----------------------------------------------------------
+# 2. Section:
+#    This section contains parameters specific to the
+#    test cases considered.
+#
+#    NOTE: the structure is always (more or less) the same:
+#    If a parameter type is used, then the number of 
+#    corresponding parameters needs to be given, immediately
+#    followed by the keywords and values. So, if two params
+#    of integer type are used, TST_INT_PARAMETERS is 2, and
+#    four lines would follow with 
+#      KEYWORD
+#      i value
+#      KEYWORD
+#      k l values
+#    entries. In fact, for integer and real types, there
+#    also vector-valued parameters are allowed. So, the 
+#    two lines preceeding the KEYWORD line above would read
+#      TST_INT_STRUCTURE
+#      1 2
+#    The KEYWORD strings should be at least 14 characters
+#    long.
+#-----------------------------------------------------------
+# do we use integer parameters? (0=no, how many?) [integer]
+TST_INT_PARAMETERS
+0
+# do we use character parameters? (0=no, how many?)[integer]
+TST_CHAR_PARAMETERS
+1
+WIND_FILE_NAME
+Windparam.dat
+# do we use real parameters? (0=no, how many?)    [integer]
+# both are scalar values
+# for advection diffusion test case: coefficient  [real]
+# for scaling the wind strength                   [real]
+TST_REAL_PARAMETERS
+2
+TST_REAL_STRUCTURE
+1 1
+DIFFUSION_COEFFICIENT
+0.3
+WIND_COEFFICIENT
+1.0
+#-----------------------------------------------------------
+# END OF FILE
+#-----------------------------------------------------------
diff --git a/flash2d/data/Parameters_aviso.dat b/flash2d/data/Parameters_aviso.dat
new file mode 100644
index 0000000..c8b3c11
--- /dev/null
+++ b/flash2d/data/Parameters_aviso.dat
@@ -0,0 +1,76 @@
+#-----------------------------------------------------------
+# Input file for batch mode input
+# input is controlled via keywords
+#
+# j. behrens 12/96
+#-----------------------------------------------------------
+# the experiment no. (0 for a new experiment)     [integer]
+EXPERIMENT_NUMBER
+0
+# desired maximum level of refinements            [integer]
+FINE_GRID_LEVEL
+17
+# minimum level of refinements                    [integer]
+COARSE_GRID_LEVEL
+11
+# tolerance for refinement                        [real]
+TOLERANCE_OF_REFINEMENT
+0.2
+# tolerance for coarsening                        [real]
+TOLERANCE_OF_COARSENING
+0.1
+# watermark for refinement                        [real]
+WATERMARK_OF_REFINEMENT
+0.01
+# watermark for coarsening                        [real]
+WATERMARK_OF_COARSENING
+0.01
+# timestep length                                 [real]
+TIMESTEP_LENGTH
+3600.
+# first timestep                                  [integer]
+BEGINNING_TIMESTEP
+1
+# last timestep                                   [integer]
+FINISHING_TIMESTEP
+48
+# plot in matlab style to file (no plot = 0)      [integer]
+MATLAB_PLOTTING
+0
+# plot in gmv style to file (no plot = 0)         [integer]
+GMV_FILE_PLOTTING
+1
+# plot in VisNET window (no plot = 0)             [integer]
+VISNET_PLOTTING
+0
+# screenshot VisNET window (no plot = 0)          [integer]
+VISNET_SCREENSHOT
+0
+# timesteps between plots                         [integer]
+STEPS_BTW_PLOTS
+1
+# timesteps between saves                         [integer]
+STEPS_BTW_SAVES
+500
+# save last timestep for next experiment (no = 0) [integer]
+SAVE_FINISH_CONFIGURATION
+0
+# plot a polygonal line from file (if given)      [character]
+POLYGON_FILE_NAME
+Land.dat
+# take advecting wind from file (if given)        [character]
+WIND_FILE_NAME
+Wind_aviso.dat
+#testdata.nc
+# file defining the domain                        [character]
+DOMAIN_FILE_NAME
+Domain_aviso.dat
+# file defining the initial triangulation         [character]
+TRIANG_FILE_NAME
+Triang_aviso.dat
+# number of iterations in trajectory estimation   [integer]
+SLM_ITERATION_NUMBER
+4
+#-----------------------------------------------------------
+# END OF FILE
+#-----------------------------------------------------------
diff --git a/flash2d/data/PotsdamInput/Domain.windxxx b/flash2d/data/PotsdamInput/Domain.windxxx
new file mode 100644
index 0000000..0cabc12
--- /dev/null
+++ b/flash2d/data/PotsdamInput/Domain.windxxx
@@ -0,0 +1,24 @@
+!-------------------------------------------------------------------
+! this file defines a square for the domain given in the Potsdam
+! examples.
+!
+! j. behrens, 12/97
+!-------------------------------------------------------------------
+NUMBER_OF_DIMENSIONS
+2
+NUMBER_OF_POLYGONS
+1
+NUMBER_OF_VERTICES
+4
+VERTEX_DATA
+1.
+1.
+110.
+1.
+110.
+100.
+1.
+100.
+!-------------------------------------------------------------------
+! end of file
+!-------------------------------------------------------------------
diff --git a/flash2d/data/PotsdamInput/Initial.windxxx b/flash2d/data/PotsdamInput/Initial.windxxx
new file mode 100644
index 0000000..5ee03c2
--- /dev/null
+++ b/flash2d/data/PotsdamInput/Initial.windxxx
@@ -0,0 +1,51 @@
+!-----------------------------------------------------------------
+! this file contains input data for the initial field
+! in the tracer advection experiment
+! again, keywords control the input data
+!
+! j. behrens, 12/97
+!-----------------------------------------------------------------
+# on of two main keywords must appear at the beginning
+# CIRCLES_INPUT or FILES_INPUT
+CIRCLES_INPUT
+# the CIRCLES_INPUT keywords follow
+# give the number of circles
+NUMBER_OF_CIRCLES
+4
+# for each circle give the coordinates and the concentration
+CIRCLE_COORDINATES
+35.
+40.
+CIRCLE_DIAMETER
+7.
+CIRCLE_CONCENTRATION
+1.
+CIRCLE_COORDINATES
+40.
+50.
+CIRCLE_DIAMETER
+8.
+CIRCLE_CONCENTRATION
+1.
+CIRCLE_COORDINATES
+45.
+55.
+CIRCLE_DIAMETER
+8.
+CIRCLE_CONCENTRATION
+2.
+CIRCLE_COORDINATES
+55.
+65.
+CIRCLE_DIAMETER
+8.
+CIRCLE_CONCENTRATION
+2.
+!-----------------------------------------------------------------
+# for the FILES_INPUT there are (not yet implemented) some
+# keywords:
+# INPUT_FILE_NAME, X_POINT_NUMBER, Y_POINT_NUMBER, NUMBER_OF_WATERMARKS,
+# WATERMARK_LEVEL, WATERMARK_CONCENTRATION
+!-----------------------------------------------------------------
+! and this is the end of the file
+!-----------------------------------------------------------------
diff --git a/flash2d/data/PotsdamInput/Input.windxxx b/flash2d/data/PotsdamInput/Input.windxxx
new file mode 100644
index 0000000..ee0ff9b
--- /dev/null
+++ b/flash2d/data/PotsdamInput/Input.windxxx
@@ -0,0 +1,33 @@
+# --- --- Sample parameter file Test.in --- ---
+# care has to be taken for the sequence of values
+# by j. behrens 11/96
+#
+# the experiment no. (0 for a new experiment)     [integer]
+0
+# desired maximum level of refinements            [integer]
+16
+# minimum level of refinements                    [integer]
+5
+# tolerance for refinement                        [real]
+0.2
+# tolerance for coarsening                        [real]
+0.1
+# watermark for refinement                        [real]
+0.01
+# watermark for coarsening                        [real]
+0.01
+# timestep length                                 [real]
+3600.
+# first timestep                                  [integer]
+1
+# last timestep                                   [integer]
+97
+# timesteps between saves                         [integer]
+50
+# timesteps between plots                         [integer]
+1
+# save last timestep for next experiment (no = 0) [integer]
+0
+# number of iterations in trajectory estimation   [integer]
+4
+# --- --- end of input file Test.in --- ---
diff --git a/flash2d/data/PotsdamInput/Land.dat b/flash2d/data/PotsdamInput/Land.dat
new file mode 100644
index 0000000..d8e7878
--- /dev/null
+++ b/flash2d/data/PotsdamInput/Land.dat
@@ -0,0 +1,326 @@
+# Number of polylines
+12
+# 1. polygon, number of points
+77
+# coordinate pairs
+1.0 54.0
+4.0 52.0
+5.0 52.0
+5.0 50.0
+9.0 48.0
+9.0 46.0
+11.0 45.0
+14.0 46.0
+15.0 46.0
+16.0 47.0
+17.0 44.0
+18.0 43.0
+14.0 38.0
+10.0 38.0
+9.0 37.0
+7.0 40.0
+6.0 40.0
+7.0 37.0
+5.0 34.0
+5.0 31.0
+6.0 32.0
+7.0 29.0
+8.0 29.0
+11.0 34.0
+12.0 33.0
+13.0 30.0
+14.0 30.0
+16.0 36.0
+18.0 36.0
+22.0 43.0
+21.0 45.0
+22.0 45.0
+23.0 44.0
+23.0 48.0
+21.0 49.0
+23.0 49.0
+23.0 50.0
+20.0 51.0
+18.0 51.0
+16.0 48.0
+12.0 48.0
+11.0 49.0
+14.0 50.0
+15.0 53.0
+20.0 54.0
+18.0 55.0
+16.0 55.0
+15.0 54.0
+13.0 54.0
+11.0 55.0
+13.0 56.0
+13.0 60.0
+14.0 62.0
+14.0 64.0
+12.0 65.0
+14.0 66.0
+14.0 68.0
+16.0 70.0
+17.0 69.0
+18.0 70.0
+21.0 72.0
+21.0 74.0
+24.0 75.0
+26.0 80.0
+25.0 81.0
+38.0 86.0
+40.0 86.0
+43.0 88.0
+43.0 91.0
+45.0 92.0
+45.0 93.0
+42.0 94.0
+39.0 95.0
+41.0 97.0
+43.0 97.0
+44.0 98.0
+43.0 100.0
+# 2. polygon, number of points
+74
+# coordinate pairs
+66.0 1.0
+68.0 4.0
+69.0 8.0
+68.0 10.0
+70.0 12.0
+74.0 17.0
+76.0 17.0
+77.0 16.0
+82.0 17.0
+86.0 17.0
+87.0 16.0
+86.0 14.0
+82.0 12.0
+88.0 9.0
+89.0 10.0
+89.0 12.0
+90.0 13.0
+89.0 14.0
+89.0 16.0
+90.0 18.0
+89.0 19.0
+91.0 20.0
+91.0 26.0
+92.0 26.0
+94.0 30.0
+92.0 32.0
+97.0 35.0
+97.0 36.0
+93.0 36.0
+88.0 40.0
+90.0 40.0
+98.0 38.0
+101.0 36.0
+101.0 38.0
+98.0 40.0
+97.0 42.0
+96.0 40.0
+92.0 42.0
+91.0 44.0
+93.0 46.0
+89.0 46.0
+89.0 50.0
+86.0 50.0
+85.0 52.0
+84.0 56.0
+80.0 57.0
+82.0 59.0
+82.0 62.0
+84.0 62.0
+88.0 61.0
+86.0 66.0
+86.0 69.0
+83.0 70.0
+83.0 72.0
+85.0 74.0
+85.0 76.0
+84.0 76.0
+82.0 78.0
+78.0 78.0
+76.0 80.0
+74.0 86.0
+71.0 86.0
+71.0 90.0
+68.0 90.0
+65.0 91.0
+65.0 93.0
+63.0 93.0
+62.0 91.0
+58.0 92.0
+52.0 96.0
+51.0 98.0
+50.0 97.0
+48.0 98.0
+50.0 100.0
+# 3. polygon, number of points
+8
+# coordinate pairs
+88.0 30.0
+86.0 30.0
+82.0 36.0
+81.0 40.0
+81.0 36.0
+85.0 29.0
+87.0 29.0
+88.0 30.0
+# 4. polygon, number of points
+7
+# coordinate pairs
+63.0 26.0
+64.0 30.0
+65.0 32.0
+64.0 33.0
+61.0 30.0
+61.0 28.0
+63.0 26.0
+# 5. polygon, number of points
+7
+# coordinate pairs
+74.0 1.0
+75.0 2.0
+75.0 6.0
+77.0 7.0
+79.0 6.0
+79.0 4.0
+78.0 1.0
+# 6. polygon, number of points
+8
+# coordinate pairs
+38.0 1.0
+42.0 1.0
+43.0 3.0
+43.0 5.0
+38.0 6.0
+36.0 7.0
+36.0 3.0
+38.0 1.0
+# 7. polygon, number of points
+46
+# coordinate pairs
+13.0 9.0
+16.0 10.0
+18.0 12.0
+20.0 12.0
+22.0 14.0
+24.0 14.0
+26.0 13.0
+28.0 13.0
+32.0 14.0
+39.0 14.0
+39.0 15.0
+38.0 16.0
+40.0 17.0
+41.0 16.0
+42.0 18.0
+42.0 20.0
+44.0 21.0
+47.0 26.0
+47.0 30.0
+51.0 34.0
+51.0 35.0
+50.0 35.0
+49.0 37.0
+50.0 38.0
+49.0 40.0
+46.0 41.0
+43.0 41.0
+43.0 42.0
+39.0 43.0
+37.0 42.0
+34.0 44.0
+31.0 42.0
+31.0 40.0
+32.0 38.0
+32.0 36.0
+28.0 32.0
+26.0 30.0
+26.0 28.0
+22.0 24.0
+18.0 24.0
+16.0 22.0
+14.0 18.0
+12.0 16.0
+11.0 12.0
+13.0 11.0
+13.0 9.0
+# 8. polygon, number of points
+11
+# coordinate pairs
+1.0 95.0
+3.0 96.0
+3.0 95.0
+5.0 96.0
+6.0 94.0
+10.0 94.0
+11.0 96.0
+16.0 96.0
+18.0 98.0
+22.0 98.0
+24.0 100.0
+# 9. polygon, number of points
+20
+# coordinate pairs
+30.0 68.0
+27.0 71.0
+25.0 71.0
+24.0 70.0
+26.0 68.0
+22.0 68.0
+20.0 66.0
+20.0 68.0
+19.0 69.0
+16.0 67.0
+16.0 64.0
+17.0 62.0
+16.0 60.0
+17.0 59.0
+19.0 60.0
+24.0 60.0
+22.0 62.0
+26.0 66.0
+28.0 66.0
+30.0 68.0
+# 10. polygon, number of points
+18
+# coordinate pairs
+42.0 44.0
+43.0 46.0
+42.0 48.0
+40.0 50.0
+38.0 50.0
+38.0 48.0
+37.0 50.0
+38.0 52.0
+36.0 53.0
+33.0 52.0
+33.0 50.0
+32.0 49.0
+30.0 50.0
+30.0 46.0
+31.0 47.0
+34.0 46.0
+38.0 46.0
+42.0 44.0
+# 11. polygon, number of points
+6
+# coordinate pairs
+26.0 46.0
+28.0 46.0
+27.0 50.0
+29.0 53.0
+26.0 52.0
+26.0 46.0
+# 12. polygon, number of points
+6
+# coordinate pairs
+24.0 52.0
+24.0 56.0
+21.0 57.0
+20.0 56.0
+22.0 52.0
+24.0 52.0
diff --git a/flash2d/data/PotsdamInput/Windparam.windxxx b/flash2d/data/PotsdamInput/Windparam.windxxx
new file mode 100644
index 0000000..3b007f4
--- /dev/null
+++ b/flash2d/data/PotsdamInput/Windparam.windxxx
@@ -0,0 +1,33 @@
+!-------------------------------------------------------------------------
+! Windparam.dat
+! this file contains data for the processing of wind data given in files
+!
+! j. behrens, 12/97
+!-------------------------------------------------------------------------
+# here we read the prefix/postfix for the x/y file
+X_PREFIX
+windx.
+Y_PREFIX
+windy.
+# now we read a time factor this is hours
+TIME_FACTOR
+21600.0
+# we give the intervallength and the first interval
+# this is somehow cryptic...
+NUMBER_OF_INTERVALS
+1
+UPSET_OF_INTERVALS
+0
+# the number of x/y coordinates in the field
+X_NUMBER_OF_POINTS
+110
+Y_NUMBER_OF_POINTS
+100
+# scaling factors for fitting the domain scales...
+X_SCALE_FACTOR
+50000.0
+Y_SCALE_FACTOR
+50000.0
+!-------------------------------------------------------------------------
+! END OF FILE
+!-------------------------------------------------------------------------
diff --git a/flash2d/data/README b/flash2d/data/README
new file mode 100644
index 0000000..edb1ce5
--- /dev/null
+++ b/flash2d/data/README
@@ -0,0 +1,26 @@
+**************************************************************************
+ FLASH90
+ FLexible Adaptive Semi-Lagrangian Hack
+ written in Fortran 90
+
+**************************************************************************
+
+ CONTENTS OF THIS DIRECTORY "$(FLASHDIR)/data"
+
+README		- this file
+PotsdamInput	- Directory containing specially taylored data files
+Domain.dat	- Domain description data file
+Initial.dat	- Data for initial tracer distribution
+Land.dat	- Data for a land mask
+Triang.dat	- Initial triangulation data file
+
+
+--------------------------------------------------------------------------
+
+ WHAT TO DO HERE:
+ 
+nothing. just leave this directory untouched for further reference :-)
+
+**************************************************************************
+ j. behrens, 3/99
+**************************************************************************
diff --git a/flash2d/data/Triang.SWCosine.dat b/flash2d/data/Triang.SWCosine.dat
new file mode 100644
index 0000000..7be36f2
--- /dev/null
+++ b/flash2d/data/Triang.SWCosine.dat
@@ -0,0 +1,189 @@
+#-------------------------------------------------------------------
+# this file contains definitions for a simple initial triangulation
+# i.e. the unit square moved by the vector (-0.5,-0.5).
+#
+# j. behrens, 12/97
+#-------------------------------------------------------------------
+# first give the global defining parameters
+!--- dimension of the grid coordinates
+GRID_DIMENSION
+2
+!--- number of vertices in each element (3: triangular, 4: quadrilateral)
+ELEMENT_VERTICES
+3
+!--- total number of nodes
+NUMBER_OF_NODES
+5
+!--- total number of edges
+NUMBER_OF_EDGES
+8
+!--- total number of elements
+NUMBER_OF_ELEMENTS
+4
+# now define the boundary condition flags
+DEF_INNERITEM
+0
+DEF_DIRICHLETBOUNDARY
+-1
+DEF_NEUMANNBOUNDARY
+-2
+# now define the grid items like nodes, edges, elements
+!--- define the nodes
+NODE_INDEXNUMBER
+1
+NODE_COORDINATES
+0.0
+0.0
+NODE_INDEXNUMBER
+2
+NODE_COORDINATES
+25000.0
+0.0
+NODE_INDEXNUMBER
+3
+NODE_COORDINATES
+25000.0
+25000.0
+NODE_INDEXNUMBER
+4
+NODE_COORDINATES
+0.0
+25000.0
+NODE_INDEXNUMBER
+5
+NODE_COORDINATES
+12500.0
+12500.0
+!--- define the edges
+EDGE_INDEXNUMBER
+1
+EDGE_NODEINDICES
+1
+2
+EDGE_ELEMENTINDICES
+1
+0
+EDGE_BOUNDARYCONDITION
+-1
+EDGE_INDEXNUMBER
+2
+EDGE_NODEINDICES
+2
+3
+EDGE_ELEMENTINDICES
+2
+0
+EDGE_BOUNDARYCONDITION
+-1
+EDGE_INDEXNUMBER
+3
+EDGE_NODEINDICES
+3
+4
+EDGE_ELEMENTINDICES
+3
+0
+EDGE_BOUNDARYCONDITION
+-1
+EDGE_INDEXNUMBER
+4
+EDGE_NODEINDICES
+4
+1
+EDGE_ELEMENTINDICES
+4
+0
+EDGE_BOUNDARYCONDITION
+-1
+EDGE_INDEXNUMBER
+5
+EDGE_NODEINDICES
+2
+5
+EDGE_ELEMENTINDICES
+1
+2
+EDGE_BOUNDARYCONDITION
+0
+EDGE_INDEXNUMBER
+6
+EDGE_NODEINDICES
+3
+5
+EDGE_ELEMENTINDICES
+2
+3
+EDGE_BOUNDARYCONDITION
+0
+EDGE_INDEXNUMBER
+7
+EDGE_NODEINDICES
+4
+5
+EDGE_ELEMENTINDICES
+3
+4
+EDGE_BOUNDARYCONDITION
+0
+EDGE_INDEXNUMBER
+8
+EDGE_NODEINDICES
+1
+5
+EDGE_ELEMENTINDICES
+4
+1
+EDGE_BOUNDARYCONDITION
+0
+!--- define the elements
+ELEMENT_INDEXNUMBER
+1
+ELEMENT_NODEINDICES
+1
+2
+5
+ELEMENT_EDGEINDICES
+5
+8
+1
+ELEMENT_MARKEDEDGE
+3
+ELEMENT_INDEXNUMBER
+2
+ELEMENT_NODEINDICES
+2
+3
+5
+ELEMENT_EDGEINDICES
+6
+5
+2
+ELEMENT_MARKEDEDGE
+3
+ELEMENT_INDEXNUMBER
+3
+ELEMENT_NODEINDICES
+3
+4
+5
+ELEMENT_EDGEINDICES
+7
+6
+3
+ELEMENT_MARKEDEDGE
+3
+ELEMENT_INDEXNUMBER
+4
+ELEMENT_NODEINDICES
+4
+1
+5
+ELEMENT_EDGEINDICES
+8
+7
+4
+ELEMENT_MARKEDEDGE
+3
+#-------------------------------------------------------------------
+# end of file
+#-------------------------------------------------------------------
diff --git a/flash2d/data/Triang.dat b/flash2d/data/Triang.dat
new file mode 100644
index 0000000..96798bc
--- /dev/null
+++ b/flash2d/data/Triang.dat
@@ -0,0 +1,189 @@
+#-------------------------------------------------------------------
+# this file contains definitions for a simple initial triangulation
+# i.e. the unit square moved by the vector (-0.5,-0.5).
+#
+# j. behrens, 12/97
+#-------------------------------------------------------------------
+# first give the global defining parameters
+!--- dimension of the grid coordinates
+GRID_DIMENSION
+2
+!--- number of vertices in each element (3: triangular, 4: quadrilateral)
+ELEMENT_VERTICES
+3
+!--- total number of nodes
+NUMBER_OF_NODES
+5
+!--- total number of edges
+NUMBER_OF_EDGES
+8
+!--- total number of elements
+NUMBER_OF_ELEMENTS
+4
+# now define the boundary condition flags
+DEF_INNERITEM
+0
+DEF_DIRICHLETBOUNDARY
+-1
+DEF_NEUMANNBOUNDARY
+-2
+# now define the grid items like nodes, edges, elements
+!--- define the nodes
+NODE_INDEXNUMBER
+1
+NODE_COORDINATES
+-0.5
+-0.5
+NODE_INDEXNUMBER
+2
+NODE_COORDINATES
+0.5
+-0.5
+NODE_INDEXNUMBER
+3
+NODE_COORDINATES
+0.5
+0.5
+NODE_INDEXNUMBER
+4
+NODE_COORDINATES
+-0.5
+0.5
+NODE_INDEXNUMBER
+5
+NODE_COORDINATES
+0.0
+0.0
+!--- define the edges
+EDGE_INDEXNUMBER
+1
+EDGE_NODEINDICES
+1
+2
+EDGE_ELEMENTINDICES
+1
+0
+EDGE_BOUNDARYCONDITION
+-1
+EDGE_INDEXNUMBER
+2
+EDGE_NODEINDICES
+2
+3
+EDGE_ELEMENTINDICES
+2
+0
+EDGE_BOUNDARYCONDITION
+-1
+EDGE_INDEXNUMBER
+3
+EDGE_NODEINDICES
+3
+4
+EDGE_ELEMENTINDICES
+3
+0
+EDGE_BOUNDARYCONDITION
+-1
+EDGE_INDEXNUMBER
+4
+EDGE_NODEINDICES
+4
+1
+EDGE_ELEMENTINDICES
+4
+0
+EDGE_BOUNDARYCONDITION
+-1
+EDGE_INDEXNUMBER
+5
+EDGE_NODEINDICES
+2
+5
+EDGE_ELEMENTINDICES
+1
+2
+EDGE_BOUNDARYCONDITION
+0
+EDGE_INDEXNUMBER
+6
+EDGE_NODEINDICES
+3
+5
+EDGE_ELEMENTINDICES
+2
+3
+EDGE_BOUNDARYCONDITION
+0
+EDGE_INDEXNUMBER
+7
+EDGE_NODEINDICES
+4
+5
+EDGE_ELEMENTINDICES
+3
+4
+EDGE_BOUNDARYCONDITION
+0
+EDGE_INDEXNUMBER
+8
+EDGE_NODEINDICES
+1
+5
+EDGE_ELEMENTINDICES
+4
+1
+EDGE_BOUNDARYCONDITION
+0
+!--- define the elements
+ELEMENT_INDEXNUMBER
+1
+ELEMENT_NODEINDICES
+1
+2
+5
+ELEMENT_EDGEINDICES
+5
+8
+1
+ELEMENT_MARKEDEDGE
+3
+ELEMENT_INDEXNUMBER
+2
+ELEMENT_NODEINDICES
+2
+3
+5
+ELEMENT_EDGEINDICES
+6
+5
+2
+ELEMENT_MARKEDEDGE
+3
+ELEMENT_INDEXNUMBER
+3
+ELEMENT_NODEINDICES
+3
+4
+5
+ELEMENT_EDGEINDICES
+7
+6
+3
+ELEMENT_MARKEDEDGE
+3
+ELEMENT_INDEXNUMBER
+4
+ELEMENT_NODEINDICES
+4
+1
+5
+ELEMENT_EDGEINDICES
+8
+7
+4
+ELEMENT_MARKEDEDGE
+3
+#-------------------------------------------------------------------
+# end of file
+#-------------------------------------------------------------------
diff --git a/flash2d/data/Triang12.dat b/flash2d/data/Triang12.dat
new file mode 100644
index 0000000..01ebb90
--- /dev/null
+++ b/flash2d/data/Triang12.dat
@@ -0,0 +1,88 @@
+#-------------------------------------------------------------------
+# this file contains definitions for a simple initial triangulation
+# i.e. the unit square moved by the vector (-0.5,-0.5).
+#
+# j. behrens, 12/97
+#-------------------------------------------------------------------
+# first give the global defining parameters
+!--- dimension of the grid coordinates
+GRID_DIMENSION
+2
+!--- number of vertices in each element (3: triangular, 4: quadrilateral)
+ELEMENT_VERTICES
+3
+!--- total number of nodes
+NUMBER_OF_NODES
+12
+!--- total number of edges
+NUMBER_OF_EDGES
+24
+!--- total number of elements
+NUMBER_OF_ELEMENTS
+12
+# now define the boundary condition flags
+DEF_INNERITEM
+0
+DEF_DIRICHLETBOUNDARY
+-1
+DEF_NEUMANNBOUNDARY
+-2
+# now define the grid items like nodes, edges, elements
+!--- define the nodes
+NODES_DESCRIPTION
+ 1   -0.5   0.5
+ 2    0.0   0.5
+ 3    0.5   0.5
+ 4    0.5   0.0
+ 5    0.5  -0.5
+ 6    0.0  -0.5
+ 7   -0.5  -0.5    
+ 8   -0.5   0.0
+ 9   -0.2  0.2   
+10    0.2  0.2
+11    0.2 -0.2
+12   -0.2 -0.2
+!--- define the edges
+EDGES_DESCRIPTION
+ 1   1  2     -1
+ 2   2  3     -1
+ 3   3  4     -1
+ 4   4  5     -1
+ 5   5  6     -1
+ 6   6  7     -1
+ 7   7  8     -1
+ 8   8  1     -1
+ 9   2 10      0
+10  10  4      0
+11   4 11      0
+12  11  6      0
+13   6 12      0
+14  12  8      0
+15   8  9      0
+16   9  2      0
+17   9 10     -1
+18  10 11     -1
+19  11 12     -1
+20  12  9     -1 
+21   1  9      0
+22   3 10      0
+23   5 11      0
+24   7 12      0
+!--- define the elements
+! edges in counter clockwise order
+ELEMENTS_DESCRIPTION
+ 1    1 21 16    1
+ 2   17  9 16    1
+ 3    2  9 22    1
+ 4    3 22 10    1
+ 5   18 11 10    1
+ 6    4 11 23    1
+ 7    5 23 12    1
+ 8   19 13 12    1  
+ 9    6 13 24    1
+10    7 24 14    1
+11   20 15 14    1
+12    8 15 21    1
+#-------------------------------------------------------------------
+# end of file
+#-------------------------------------------------------------------
diff --git a/flash2d/data/TriangSph.ico.dat b/flash2d/data/TriangSph.ico.dat
new file mode 100644
index 0000000..37ecf8b
--- /dev/null
+++ b/flash2d/data/TriangSph.ico.dat
@@ -0,0 +1,78 @@
+#-------------------------------------------------------------------
+# this file contains definitions for a initial triangulation
+# i.e. the globe derived from a icosaeder
+# with regular refinement until level 0
+#
+# Matthias Laeuter, Potsdam, 4/2002
+#
+# History:
+#   1. original Version                          m.laeuter    4.2002
+#   2. corrected initial SFC orientation         f.klaschka   7.2006
+#-------------------------------------------------------------------
+# first give the global defining parameters
+!!--- dimension of the grid coordinates
+GRID_DIMENSION
+3
+!--- number of vertices in each element (3: triangular, 4: quadrilateral)
+ELEMENT_VERTICES
+3
+!--- total number of nodes
+NUMBER_OF_NODES
+12
+!--- total number of edges
+NUMBER_OF_EDGES
+30
+!--- total number of elements
+NUMBER_OF_ELEMENTS
+20
+!# now define the boundary condition flags
+DEF_INNERITEM
+0
+DEF_DIRICHLETBOUNDARY
+-1
+DEF_NEUMANNBOUNDARY
+-2
+# now define the grid items like nodes, edges, elements
+!--- define the nodes
+NODES_DESCRIPTION
+1   0.000000   0.000000  -1.000000
+2   0.894427   0.000000  -0.447214
+3   0.276393   0.850651  -0.447214
+4  -0.723607   0.525731  -0.447214
+5  -0.723607  -0.525731  -0.447214
+6   0.276393  -0.850651  -0.447214
+7   0.723607   0.525731   0.447214
+8  -0.276393   0.850651   0.447214
+9  -0.894427   0.000000   0.447214
+10 -0.276393  -0.850651   0.447214
+11  0.723607  -0.525731   0.447214
+12  0.000000   0.000000   1.000000
+!--- define the elements
+ELEMENTS_DESCRIPTION
+1    1  5  4    1     0 0 0
+2    1  4  3    1     0 0 0
+3    1  3  2    1     0 0 0
+4    1  2  6    1     0 0 0
+5    1  6  5    1     0 0 0
+
+6    5  6 10    3     0 0 0
+7    6  2 11    3     0 0 0
+8    2  3  7    3     0 0 0
+9    3  4  8    3     0 0 0
+10   4  5  9    3     0 0 0
+
+11   4  9  8    1     0 0 0
+12   3  8  7    1     0 0 0
+13   2  7 11    1     0 0 0
+14   6 11 10    1     0 0 0
+15   5 10  9    1     0 0 0
+
+16   9 10 12    3     0 0 0
+17  10 11 12    3     0 0 0
+18  11  7 12    3     0 0 0
+19   7  8 12    3     0 0 0
+20   8  9 12    3     0 0 0
+
+#-------------------------------------------------------------------
+# end of file
+#-------------------------------------------------------------------
diff --git a/flash2d/data/Triang_algaeBaltic.dat b/flash2d/data/Triang_algaeBaltic.dat
new file mode 100644
index 0000000..9383119
--- /dev/null
+++ b/flash2d/data/Triang_algaeBaltic.dat
@@ -0,0 +1,189 @@
+#-------------------------------------------------------------------
+# this file contains definitions for a simple initial triangulation
+# i.e. the unit square moved by the vector (-0.5,-0.5).
+#
+# j. behrens, 12/97
+#-------------------------------------------------------------------
+# first give the global defining parameters
+!--- dimension of the grid coordinates
+GRID_DIMENSION
+2
+!--- number of vertices in each element (3: triangular, 4: quadrilateral)
+ELEMENT_VERTICES
+3
+!--- total number of nodes
+NUMBER_OF_NODES
+5
+!--- total number of edges
+NUMBER_OF_EDGES
+8
+!--- total number of elements
+NUMBER_OF_ELEMENTS
+4
+# now define the boundary condition flags
+DEF_INNERITEM
+0
+DEF_DIRICHLETBOUNDARY
+-1
+DEF_NEUMANNBOUNDARY
+-2
+# now define the grid items like nodes, edges, elements
+!--- define the nodes
+NODE_INDEXNUMBER
+1
+NODE_COORDINATES
+-3.95
+48.6
+NODE_INDEXNUMBER
+2
+NODE_COORDINATES
+30.325
+48.6
+NODE_INDEXNUMBER
+3
+NODE_COORDINATES
+30.325
+65.825
+NODE_INDEXNUMBER
+4
+NODE_COORDINATES
+-3.95
+65.825
+NODE_INDEXNUMBER
+5
+NODE_COORDINATES
+13.1875
+57.2125
+!--- define the edges
+EDGE_INDEXNUMBER
+1
+EDGE_NODEINDICES
+1
+2
+EDGE_ELEMENTINDICES
+1
+0
+EDGE_BOUNDARYCONDITION
+-1
+EDGE_INDEXNUMBER
+2
+EDGE_NODEINDICES
+2
+3
+EDGE_ELEMENTINDICES
+2
+0
+EDGE_BOUNDARYCONDITION
+-1
+EDGE_INDEXNUMBER
+3
+EDGE_NODEINDICES
+3
+4
+EDGE_ELEMENTINDICES
+3
+0
+EDGE_BOUNDARYCONDITION
+-1
+EDGE_INDEXNUMBER
+4
+EDGE_NODEINDICES
+4
+1
+EDGE_ELEMENTINDICES
+4
+0
+EDGE_BOUNDARYCONDITION
+-1
+EDGE_INDEXNUMBER
+5
+EDGE_NODEINDICES
+2
+5
+EDGE_ELEMENTINDICES
+1
+2
+EDGE_BOUNDARYCONDITION
+0
+EDGE_INDEXNUMBER
+6
+EDGE_NODEINDICES
+3
+5
+EDGE_ELEMENTINDICES
+2
+3
+EDGE_BOUNDARYCONDITION
+0
+EDGE_INDEXNUMBER
+7
+EDGE_NODEINDICES
+4
+5
+EDGE_ELEMENTINDICES
+3
+4
+EDGE_BOUNDARYCONDITION
+0
+EDGE_INDEXNUMBER
+8
+EDGE_NODEINDICES
+1
+5
+EDGE_ELEMENTINDICES
+4
+1
+EDGE_BOUNDARYCONDITION
+0
+!--- define the elements
+ELEMENT_INDEXNUMBER
+1
+ELEMENT_NODEINDICES
+1
+2
+5
+ELEMENT_EDGEINDICES
+5
+8
+1
+ELEMENT_MARKEDEDGE
+3
+ELEMENT_INDEXNUMBER
+2
+ELEMENT_NODEINDICES
+2
+3
+5
+ELEMENT_EDGEINDICES
+6
+5
+2
+ELEMENT_MARKEDEDGE
+3
+ELEMENT_INDEXNUMBER
+3
+ELEMENT_NODEINDICES
+3
+4
+5
+ELEMENT_EDGEINDICES
+7
+6
+3
+ELEMENT_MARKEDEDGE
+3
+ELEMENT_INDEXNUMBER
+4
+ELEMENT_NODEINDICES
+4
+1
+5
+ELEMENT_EDGEINDICES
+8
+7
+4
+ELEMENT_MARKEDEDGE
+3
+#-------------------------------------------------------------------
+# end of file
+#-------------------------------------------------------------------
diff --git a/flash2d/data/Triang_aviso.dat b/flash2d/data/Triang_aviso.dat
new file mode 100644
index 0000000..65db3d8
--- /dev/null
+++ b/flash2d/data/Triang_aviso.dat
@@ -0,0 +1,189 @@
+#-------------------------------------------------------------------
+# this file contains definitions for a simple initial triangulation
+# i.e. the unit square moved by the vector (-0.5,-0.5).
+#
+# j. behrens, 12/97
+#-------------------------------------------------------------------
+# first give the global defining parameters
+!--- dimension of the grid coordinates
+GRID_DIMENSION
+2
+!--- number of vertices in each element (3: triangular, 4: quadrilateral)
+ELEMENT_VERTICES
+3
+!--- total number of nodes
+NUMBER_OF_NODES
+5
+!--- total number of edges
+NUMBER_OF_EDGES
+8
+!--- total number of elements
+NUMBER_OF_ELEMENTS
+4
+# now define the boundary condition flags
+DEF_INNERITEM
+0
+DEF_DIRICHLETBOUNDARY
+-1
+DEF_NEUMANNBOUNDARY
+-2
+# now define the grid items like nodes, edges, elements
+!--- define the nodes
+NODE_INDEXNUMBER
+1
+NODE_COORDINATES
+120.0
+-20.0
+NODE_INDEXNUMBER
+2
+NODE_COORDINATES
+260.0
+-20.0
+NODE_INDEXNUMBER
+3
+NODE_COORDINATES
+260.0
+60.0
+NODE_INDEXNUMBER
+4
+NODE_COORDINATES
+120.0
+60.0
+NODE_INDEXNUMBER
+5
+NODE_COORDINATES
+190.0
+20.0
+!--- define the edges
+EDGE_INDEXNUMBER
+1
+EDGE_NODEINDICES
+1
+2
+EDGE_ELEMENTINDICES
+1
+0
+EDGE_BOUNDARYCONDITION
+-1
+EDGE_INDEXNUMBER
+2
+EDGE_NODEINDICES
+2
+3
+EDGE_ELEMENTINDICES
+2
+0
+EDGE_BOUNDARYCONDITION
+-1
+EDGE_INDEXNUMBER
+3
+EDGE_NODEINDICES
+3
+4
+EDGE_ELEMENTINDICES
+3
+0
+EDGE_BOUNDARYCONDITION
+-1
+EDGE_INDEXNUMBER
+4
+EDGE_NODEINDICES
+4
+1
+EDGE_ELEMENTINDICES
+4
+0
+EDGE_BOUNDARYCONDITION
+-1
+EDGE_INDEXNUMBER
+5
+EDGE_NODEINDICES
+2
+5
+EDGE_ELEMENTINDICES
+1
+2
+EDGE_BOUNDARYCONDITION
+0
+EDGE_INDEXNUMBER
+6
+EDGE_NODEINDICES
+3
+5
+EDGE_ELEMENTINDICES
+2
+3
+EDGE_BOUNDARYCONDITION
+0
+EDGE_INDEXNUMBER
+7
+EDGE_NODEINDICES
+4
+5
+EDGE_ELEMENTINDICES
+3
+4
+EDGE_BOUNDARYCONDITION
+0
+EDGE_INDEXNUMBER
+8
+EDGE_NODEINDICES
+1
+5
+EDGE_ELEMENTINDICES
+4
+1
+EDGE_BOUNDARYCONDITION
+0
+!--- define the elements
+ELEMENT_INDEXNUMBER
+1
+ELEMENT_NODEINDICES
+1
+2
+5
+ELEMENT_EDGEINDICES
+5
+8
+1
+ELEMENT_MARKEDEDGE
+3
+ELEMENT_INDEXNUMBER
+2
+ELEMENT_NODEINDICES
+2
+3
+5
+ELEMENT_EDGEINDICES
+6
+5
+2
+ELEMENT_MARKEDEDGE
+3
+ELEMENT_INDEXNUMBER
+3
+ELEMENT_NODEINDICES
+3
+4
+5
+ELEMENT_EDGEINDICES
+7
+6
+3
+ELEMENT_MARKEDEDGE
+3
+ELEMENT_INDEXNUMBER
+4
+ELEMENT_NODEINDICES
+4
+1
+5
+ELEMENT_EDGEINDICES
+8
+7
+4
+ELEMENT_MARKEDEDGE
+3
+#-------------------------------------------------------------------
+# end of file
+#-------------------------------------------------------------------
diff --git a/flash2d/data/Triang_periodic.dat b/flash2d/data/Triang_periodic.dat
new file mode 100644
index 0000000..d1863fe
--- /dev/null
+++ b/flash2d/data/Triang_periodic.dat
@@ -0,0 +1,189 @@
+#-------------------------------------------------------------------
+# this file contains definitions for a simple initial triangulation
+# i.e. the unit square moved by the vector (-0.5,-0.5).
+#
+# j. behrens, 12/97
+#-------------------------------------------------------------------
+# first give the global defining parameters
+!--- dimension of the grid coordinates
+GRID_DIMENSION
+2
+!--- number of vertices in each element (3: triangular, 4: quadrilateral)
+ELEMENT_VERTICES
+3
+!--- total number of nodes
+NUMBER_OF_NODES
+5
+!--- total number of edges
+NUMBER_OF_EDGES
+8
+!--- total number of elements
+NUMBER_OF_ELEMENTS
+4
+# now define the boundary condition flags
+DEF_INNERITEM
+0
+DEF_DIRICHLETBOUNDARY
+-1
+DEF_NEUMANNBOUNDARY
+-2
+# now define the grid items like nodes, edges, elements
+!--- define the nodes
+NODE_INDEXNUMBER
+1
+NODE_COORDINATES
+-0.5
+-0.5
+NODE_INDEXNUMBER
+2
+NODE_COORDINATES
+0.5
+-0.5
+NODE_INDEXNUMBER
+3
+NODE_COORDINATES
+0.5
+0.5
+NODE_INDEXNUMBER
+4
+NODE_COORDINATES
+-0.5
+0.5
+NODE_INDEXNUMBER
+5
+NODE_COORDINATES
+0.0
+0.0
+!--- define the edges
+EDGE_INDEXNUMBER
+1
+EDGE_NODEINDICES
+1
+2
+EDGE_ELEMENTINDICES
+1
+3
+EDGE_BOUNDARYCONDITION
+1
+EDGE_INDEXNUMBER
+2
+EDGE_NODEINDICES
+2
+3
+EDGE_ELEMENTINDICES
+2
+4
+EDGE_BOUNDARYCONDITION
+2
+EDGE_INDEXNUMBER
+3
+EDGE_NODEINDICES
+3
+4
+EDGE_ELEMENTINDICES
+3
+1
+EDGE_BOUNDARYCONDITION
+1
+EDGE_INDEXNUMBER
+4
+EDGE_NODEINDICES
+4
+1
+EDGE_ELEMENTINDICES
+4
+2
+EDGE_BOUNDARYCONDITION
+2
+EDGE_INDEXNUMBER
+5
+EDGE_NODEINDICES
+2
+5
+EDGE_ELEMENTINDICES
+1
+2
+EDGE_BOUNDARYCONDITION
+0
+EDGE_INDEXNUMBER
+6
+EDGE_NODEINDICES
+3
+5
+EDGE_ELEMENTINDICES
+2
+3
+EDGE_BOUNDARYCONDITION
+0
+EDGE_INDEXNUMBER
+7
+EDGE_NODEINDICES
+4
+5
+EDGE_ELEMENTINDICES
+3
+4
+EDGE_BOUNDARYCONDITION
+0
+EDGE_INDEXNUMBER
+8
+EDGE_NODEINDICES
+1
+5
+EDGE_ELEMENTINDICES
+4
+1
+EDGE_BOUNDARYCONDITION
+0
+!--- define the elements
+ELEMENT_INDEXNUMBER
+1
+ELEMENT_NODEINDICES
+1
+2
+5
+ELEMENT_EDGEINDICES
+5
+8
+1
+ELEMENT_MARKEDEDGE
+3
+ELEMENT_INDEXNUMBER
+2
+ELEMENT_NODEINDICES
+2
+3
+5
+ELEMENT_EDGEINDICES
+6
+5
+2
+ELEMENT_MARKEDEDGE
+3
+ELEMENT_INDEXNUMBER
+3
+ELEMENT_NODEINDICES
+3
+4
+5
+ELEMENT_EDGEINDICES
+7
+6
+3
+ELEMENT_MARKEDEDGE
+3
+ELEMENT_INDEXNUMBER
+4
+ELEMENT_NODEINDICES
+4
+1
+5
+ELEMENT_EDGEINDICES
+8
+7
+4
+ELEMENT_MARKEDEDGE
+3
+#-------------------------------------------------------------------
+# end of file
+#-------------------------------------------------------------------
diff --git a/flash2d/data/Triang_periodic_pi.dat b/flash2d/data/Triang_periodic_pi.dat
new file mode 100644
index 0000000..3b1b9d8
--- /dev/null
+++ b/flash2d/data/Triang_periodic_pi.dat
@@ -0,0 +1,324 @@
+#-------------------------------------------------------------------
+# this file contains definitions for a simple initial triangulation
+# A square domain [-pi,pi]x[-pi/2,pi/2] made out of 8 triangles.
+# pi  = 3.141592653589793
+# pi/2= 1.570796326794897
+#
+# j. behrens, 12/97
+#-------------------------------------------------------------------
+# first give the global defining parameters
+!--- dimension of the grid coordinates
+GRID_DIMENSION
+2
+!--- number of vertices in each element (3: triangular, 4: quadrilateral)
+ELEMENT_VERTICES
+3
+!--- total number of nodes
+NUMBER_OF_NODES
+8
+!--- total number of edges
+NUMBER_OF_EDGES
+15
+!--- total number of elements
+NUMBER_OF_ELEMENTS
+8
+# now define the boundary condition flags
+DEF_INNERITEM
+0
+DEF_DIRICHLETBOUNDARY
+-1
+DEF_NEUMANNBOUNDARY
+-2
+# now define the grid items like nodes, edges, elements
+!--- define the nodes
+NODE_INDEXNUMBER
+1
+NODE_COORDINATES
+0.0
+1.570796326794897
+NODE_INDEXNUMBER
+2
+NODE_COORDINATES
+-3.141592653589793
+1.570796326794897
+NODE_INDEXNUMBER
+3
+NODE_COORDINATES
+-1.570796326794897
+0.0
+NODE_INDEXNUMBER
+4
+NODE_COORDINATES
+-3.141592653589793
+-1.570796326794897
+NODE_INDEXNUMBER
+5
+NODE_COORDINATES
+0.0
+-1.570796326794897
+NODE_INDEXNUMBER
+6
+NODE_COORDINATES
+1.570796326794897
+0.0
+NODE_INDEXNUMBER
+7
+NODE_COORDINATES
+3.141592653589793
+-1.570796326794897
+NODE_INDEXNUMBER
+8
+NODE_COORDINATES
+3.141592653589793
+1.570796326794897
+!--- define the edges
+EDGE_INDEXNUMBER
+1
+EDGE_NODEINDICES
+2
+3
+EDGE_ELEMENTINDICES
+2
+1
+EDGE_BOUNDARYCONDITION
+0
+EDGE_INDEXNUMBER
+2
+EDGE_NODEINDICES
+3
+1
+EDGE_ELEMENTINDICES
+4
+1
+EDGE_BOUNDARYCONDITION
+0
+EDGE_INDEXNUMBER
+3
+EDGE_NODEINDICES
+1
+2
+EDGE_ELEMENTINDICES
+1
+3
+EDGE_BOUNDARYCONDITION
+3
+EDGE_INDEXNUMBER
+4
+EDGE_NODEINDICES
+4
+3
+EDGE_ELEMENTINDICES
+3
+2
+EDGE_BOUNDARYCONDITION
+0
+EDGE_INDEXNUMBER
+5
+EDGE_NODEINDICES
+2
+4
+EDGE_ELEMENTINDICES
+2
+7
+EDGE_BOUNDARYCONDITION
+5
+EDGE_INDEXNUMBER
+6
+EDGE_NODEINDICES
+3
+5
+EDGE_ELEMENTINDICES
+3
+4
+EDGE_BOUNDARYCONDITION
+0
+EDGE_INDEXNUMBER
+7
+EDGE_NODEINDICES
+4
+5
+EDGE_ELEMENTINDICES
+3
+1
+EDGE_BOUNDARYCONDITION
+3
+EDGE_INDEXNUMBER
+8
+EDGE_NODEINDICES
+5
+1
+EDGE_ELEMENTINDICES
+5
+4
+EDGE_BOUNDARYCONDITION
+0
+EDGE_INDEXNUMBER
+9
+EDGE_NODEINDICES
+5
+6
+EDGE_ELEMENTINDICES
+6
+5
+EDGE_BOUNDARYCONDITION
+0
+EDGE_INDEXNUMBER
+10
+EDGE_NODEINDICES
+6
+1
+EDGE_ELEMENTINDICES
+8
+5
+EDGE_BOUNDARYCONDITION
+0
+EDGE_INDEXNUMBER
+11
+EDGE_NODEINDICES
+7
+6
+EDGE_ELEMENTINDICES
+7
+6
+EDGE_BOUNDARYCONDITION
+0
+EDGE_INDEXNUMBER
+12
+EDGE_NODEINDICES
+5
+7
+EDGE_ELEMENTINDICES
+8
+6
+EDGE_BOUNDARYCONDITION
+12
+EDGE_INDEXNUMBER
+13
+EDGE_NODEINDICES
+8
+6
+EDGE_ELEMENTINDICES
+8
+7
+EDGE_BOUNDARYCONDITION
+0
+EDGE_INDEXNUMBER
+14
+EDGE_NODEINDICES
+7
+8
+EDGE_ELEMENTINDICES
+2
+7
+EDGE_BOUNDARYCONDITION
+5
+EDGE_INDEXNUMBER
+15
+EDGE_NODEINDICES
+8
+1
+EDGE_ELEMENTINDICES
+6
+8
+EDGE_BOUNDARYCONDITION
+12
+!--- define the elements
+ELEMENT_INDEXNUMBER
+1
+ELEMENT_NODEINDICES
+1
+2
+3
+ELEMENT_EDGEINDICES
+1
+2
+3
+ELEMENT_MARKEDEDGE
+3
+ELEMENT_INDEXNUMBER
+2
+ELEMENT_NODEINDICES
+2
+4
+3
+ELEMENT_EDGEINDICES
+4
+1
+5
+ELEMENT_MARKEDEDGE
+3
+ELEMENT_INDEXNUMBER
+3
+ELEMENT_NODEINDICES
+4
+5
+3
+ELEMENT_EDGEINDICES
+6
+4
+7
+ELEMENT_MARKEDEDGE
+3
+ELEMENT_INDEXNUMBER
+4
+ELEMENT_NODEINDICES
+5
+1
+3
+ELEMENT_EDGEINDICES
+2
+6
+8
+ELEMENT_MARKEDEDGE
+3
+ELEMENT_INDEXNUMBER
+5
+ELEMENT_NODEINDICES
+1
+5
+6
+ELEMENT_EDGEINDICES
+9
+10
+8
+ELEMENT_MARKEDEDGE
+3
+ELEMENT_INDEXNUMBER
+6
+ELEMENT_NODEINDICES
+5
+7
+6
+ELEMENT_EDGEINDICES
+11
+9
+12
+ELEMENT_MARKEDEDGE
+3
+ELEMENT_INDEXNUMBER
+7
+ELEMENT_NODEINDICES
+7
+8
+6
+ELEMENT_EDGEINDICES
+13
+11
+14
+ELEMENT_MARKEDEDGE
+3
+ELEMENT_INDEXNUMBER
+8
+ELEMENT_NODEINDICES
+8
+1
+6
+ELEMENT_EDGEINDICES
+10
+13
+15
+ELEMENT_MARKEDEDGE
+3
+#-------------------------------------------------------------------
+# end of file
+#-------------------------------------------------------------------
diff --git a/flash2d/data/Wind_algae.dat b/flash2d/data/Wind_algae.dat
new file mode 100644
index 0000000..bd22ef6
--- /dev/null
+++ b/flash2d/data/Wind_algae.dat
@@ -0,0 +1,31 @@
+!-------------------------------------------------------------------------
+! Wind_algae.dat
+! this file contains data for the processing of wind data given in files
+! it is part of the package for the 2015-2016 Tracer Transport course
+! and allows for simulation of algae growth in the Baltic Sea.
+!
+! j. behrens, 2/2015
+!-------------------------------------------------------------------------
+# the number of seconds contained in each stored wind data time step
+SEC_PER_STEP
+900.
+# the number of wind data time steps per file
+STEPS_PER_FILE
+96
+# this is the path to the input file directory
+ABS_PATH
+/Users/behrens/Documents/Teaching/WS1516/Transport/Software/flash2d/data/
+# this is the number of input files following in the list
+INFILE_NUMBER
+3
+# and here follows the list of current input files
+WIND_FILE_LIST
+s2015082500_no.nc
+s2015082600_no.nc
+s2015082700_no.nc
+# and the temperature file
+TEMP_FILE
+t2015082500_no.nc
+!-------------------------------------------------------------------------
+! END OF FILE
+!-------------------------------------------------------------------------
diff --git a/flash2d/data/Wind_aviso.dat b/flash2d/data/Wind_aviso.dat
new file mode 100644
index 0000000..d9ccbc0
--- /dev/null
+++ b/flash2d/data/Wind_aviso.dat
@@ -0,0 +1,25 @@
+!-------------------------------------------------------------------------
+! Wind_aviso.dat
+! this file contains data for the processing of wind data given in files
+!
+! j. behrens, 2/2015
+!-------------------------------------------------------------------------
+# the number of seconds contained in each stored wind data time step
+SEC_PER_STEP
+86400.
+# the number of wind data time steps per file
+STEPS_PER_FILE
+1
+# this is the path to the input file directory
+ABS_PATH
+./testaviso/
+# this is the number of input files following in the list
+INFILE_NUMBER
+2
+# and here follows the list of input files
+FILE_LIST
+dt_global_twosat_madt_uv_20110311_20140106.nc
+dt_global_twosat_madt_uv_20110312_20140106.nc
+!-------------------------------------------------------------------------
+! END OF FILE
+!-------------------------------------------------------------------------
diff --git a/flash2d/data/default.ftf b/flash2d/data/default.ftf
new file mode 100644
index 0000000..f9f7a46
--- /dev/null
+++ b/flash2d/data/default.ftf
@@ -0,0 +1,71 @@
+######################################################################
+#
+# FILENAME: fem_default.ftf
+#
+# FUNCTION: definitions for fem type
+#
+# DESCRIPTION: this file contains defining data for a Lagrange FEM
+#              of order 1 (linear finite element with Lagrange basis)
+#
+# REFERENCES: original data from A. Riedm�ller (TU M�nchen)
+#
+# VERSION: 1. original version, j. behrens (09/2004)
+#
+# CAUTION: Due to some redefinitions in the signature code of amatos,
+#          this definition might contain some errors!
+#
+######################################################################
+!--- name of fem/describing string (< 32 characters)
+SIGNATURE_DESCRIPTION
+linear Lagrange
+!--- Order of finite element
+POLY_DEGREE
+  1
+!--- Entry point in calc_fembasis
+ANALYTICBASIS_HANDLE
+  1
+!--- number of unknowns per vertex
+NODE_DOFS
+  1
+!--- number of unknowns per edge
+EDGE_DOFS
+  0
+!--- number of unknowns per face/interior
+ELMT_DOFS
+  0
+!--- number of quadrature points for corresponding (exact) quadrature scheme
+ELMT_QUADPOINTS
+  3
+
+!--- for each quadrature point the (3) barycentric coordinate of its position
+ELMT_QUADCOORDINATES
+1 1.0 0.0 0.0
+2 0.0 1.0 0.0
+3 0.0 0.0 1.0
+
+!--- for each face unknown the weights
+ELMT_QUADWEIGHTS
+1 0.333333333333333
+2 0.333333333333333
+3 0.333333333333334
+
+!--- basis function evaluations at elmt quad points
+ELMT_PSIQUADPOINTS
+1 1.0 0.0 0.0
+2 0.0 1.0 0.0
+3 0.0 0.0 1.0
+
+!--- coefficients for polynomial quadrature of a scalar derivative
+!--- d psi/d xi at each unknown
+DPSIDXI_MATRIX
+-1.0 1.0 0.0
+-1.0 1.0 0.0
+-1.0 1.0 0.0
+
+!--- coefficients for polynomial quadrature of a scalar derivative
+!--- d psi/d eta at each unknown
+DPSIDETA_MATRIX
+-1.0 0.0 1.0
+-1.0 0.0 1.0
+-1.0 0.0 1.0
+### END OF FILE ######################################################
diff --git a/flash2d/data/elch.pbm b/flash2d/data/elch.pbm
new file mode 100644
index 0000000..2aafd1c
--- /dev/null
+++ b/flash2d/data/elch.pbm
@@ -0,0 +1,1609 @@
+P1
+# CREATOR: GIMP PNM Filter Version 1.1
+400 281
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111110111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111100000111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111110000000
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111000001111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111110000000001111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111000000011111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111000000000111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111100000000011
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1000000000011111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111100000000000111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111110000000000011111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111110000000000011111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111000000000001111111111001111111111111111
+1111111111111111111111111111111111111111111111111111111001111111111100
+0000000000111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111100000000000111111111000001111111111111111111111111111111111
+1111111111111111111111111111111111000001111111110000000000001111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111110000000000
+0011111111000000011111111111111111111111111111111111111111111111111111
+1111111111111000000011111111000000000000111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111000000000000111111110000000111
+1111111111111111111111111111111111111111111111111111111111111110000000
+0111111100000000000011111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111100000000000011111110000000011111111111111111111111
+1111111111111111111111111111111111111111111000000001111111000000000000
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+0000000000000111110000000001111111111111111111111111111111111111111111
+1111111111111111111111100000000011111100000000000011111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111100000000000001111000
+0000000111111111111111111111111111111111111111111111111111111111111111
+1110000000000011100000000000001111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111110000000000000000000000000001111111111111
+1111111111111111111111111111111111111111111111111111100000000000000000
+0000000000111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111000000000000000000000000000111111111111111111111111111111111
+1111111111111111111111100011111110000000000000000000000000001111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111110000000000
+0000000000000000011111100000111111111111111111111111111111111111111111
+1000000111111000000000000000000000000000111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111000000000000000000000000000011
+1000000001111111111111111111111111111111111111111110000000011110000000
+0000000000000000000011111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111100000000000000000000000000000000000000001111111111
+1111111111111111111111111111110000000000000000000000000000000000000001
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+0000000000000000000000000000000000000000111111111111111111111111111111
+1111111111000000000000000000000000000000000000000111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111110000000000000000000
+0000000000000000000011111111111111111111111111111111111111110000000000
+0000000000000000000000000000011111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111000000000000000000000000000000000000000
+1111111111111111111111111111111111111111100000000000000000000000000000
+0000000001111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111100000000000000000000000000000000000000111111111111111111111
+1111111111111111111110000000000000000000000000000000000000111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111100000000
+0000000000000000000000000000011100001111111111110000011111111111100011
+1000000000000000000000000000000000000111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111000000000000000000000000000
+0000000000000000011111111000000000000011111100000000000000000000000000
+0000000000000000011111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111100000000000000000000000000000000000000000000111
+1110000000000000000011100000000000000000000000000000000000000000001111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111000000000000000000000000000000000000000000011110000000000000000000
+0110000000000000000000000000000000000000000001111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111000000000000000
+0000000000000000000000000000110000000000000000000000000000000000000000
+0000000000000000000000001111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111110000000000000000000000000000000000
+0000000010000000000000000000000000000000000000000000000000000000000000
+0001111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111110000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000001111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000011111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111100000000000000000
+0000000000000000000000000000000000000000000000000000000000000000000000
+0000000111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000011111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111100000000000000000000000000000000000000000000000
+0000000000000000000000000001111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111100000000000000000000000000000111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111000000000000000000000000000111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111110000000000000
+0000000000000011111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111000000000000000000000000000111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111110000000000000000000000000111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111100
+0000000000000000000000011111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111110000000000000000000000
+0001111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111000000000000000000000000011111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111110000000000000000000000011111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111100000000000
+0000000000001111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111110000000000000000000000011111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111110000000000000000000000000111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111100
+0000000000000000000000011111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111100000000000000000000000
+0001111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111110000000000000000000000000001111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111100000000000000000000000000000011111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111110000000000000000
+0000000000000000111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111110000000000000000000000000000000000111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111110000000000000000000000000000000000011111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111000000000
+0000000000000000000000000000111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111000000000000000000000000000000
+0000000001111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111100000000000000000000000000000000000000001111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111110
+0000000000000000000000000000000000000000011111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111110000000000000000000011
+1100000000000000000000111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111000000000000000000011111100000000000000000
+0011111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111100000000000000000011111111000000000000000000111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111110000000000000
+0000001111111100000000000000000001111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111000000000000000000011111111000000
+0000000000000111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111100000000000000000000111111000000000000000000001111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111000
+0000000000000000001111000000000000000000000111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111110000000000000000000000
+0000000000000000000000011111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111000000000000000000000000000000000000000000
+0011111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111100000000000000000000000000000000000000000000111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111000000000000
+0000000000000000000000000000000011111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111110000000000000000000000000000000
+0000000000011111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111100000000000000000000000000000000000000001111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1000000000000000000000000000000000000000111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111000000000000000000
+0000000000000000000111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111110000000000000000000000000000000000011
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111110000000000000000000000000000000111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111000
+0000000000000000000000001111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111110000000000000000000000
+0011111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111110000000000000000000011111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111100000000000000000001111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111000000000
+0000000001111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111110000000000000000011111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111000000000000000011111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1100000000000000001111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111000000000000000011
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111100000000000000001111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111110000000000000000111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111100000000
+0000000001111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111110000000000000000011111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111110000000000000000000111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111110
+0000000000000000000001111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111110000000000000000000000
+0001111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111100000000000000000000000000000111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111000000000000000000000000000000000111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111000000000000000000
+0000000000000000000111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111000000000000000000000000000000000000000
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111000000000000000000000000000000000000000001111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111000000000000
+0000000000000000000000000000000011111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111100000000000000000000000000000000
+0000000000000111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111100000000000000000000000000000000000000000000000111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111110000
+0000000000000000000000000000000000000000000011111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111000000000000000000000000
+0000000000000000000000000111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111100000000000000000000000000000000000000000000
+0000011111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111100000000000000000000000000000000000000000000000000111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111000000000000000
+0000000000000000000000000000000000011111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111100000000000000000000000000000000000
+0000000000000000111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111110000000000000000000000000000000000000000000000000001111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111000000
+0000000000000000000000000000000000000000000000111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111100000000000000000000000000
+0000000000000000000000000011111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111110000000000000000000000000000000000000000000000
+0000001111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111000000000000000000000000000000000000000000000000000011111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111110000000000000000
+0000000000000000000000000000000000000111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111000000000000000000000000000000000000
+0000000000000000011111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111100000000000000000000000000000000000000000000000000000111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111000000
+0000000000000000000000000000000000000000000000011111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111100000000000000000000000000
+0000000000000000000000000001111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111110000000000000000000000000000000000000000000000
+0000000111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111000000000000000000000000000000000000000000000000000001111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111110000000000000000
+0000000000000000000000000000000000000111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111000000000000000000000000000000000000
+0000000000000000011111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111100000000000000000000000000000000000000000000000000000111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111000000
+0000000000000000000000000000000000000000000000011111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111100000000000000000000000000
+0000000000000000000000000001111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111110000000000000000000000000000000000000000000000
+0000000111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111000000000000000000000000000000000000000000000000000001111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111110000000000000000
+0000000000000000000000000000000000000111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111000000000000000000000000000000000000
+0000000000000000011111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111100000000000000000000000000000000000000000000000000000111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111000000
+0000000000000000000000000000000000000000000000011111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111100000000000000000000000000
+0000000000000000000000000001111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111110000000000000000000000000000000000000000000000
+0000000111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111000000000000000000000000000000000000000000000000000001111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111110000000000000000
+0000000000000000000000000000000000000111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111000000000000000000000000000000000000
+0000000000000000011111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111100000000000000000000000000000000000000000000000000000111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111000000
+0000000000000000000000000000000000000000000000011111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111100000000000000000000000000
+0000000000000000000000000001111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111110000000000000000000000000000000000000000000000
+0000000111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+1111111111111111111111111111111111111111111111111111111111111111111111
+11111111111111111111111111111111111111111111111110
\ No newline at end of file
diff --git a/flash2d/doc/Dataflow.eps b/flash2d/doc/Dataflow.eps
new file mode 100644
index 0000000..1202c1d
--- /dev/null
+++ b/flash2d/doc/Dataflow.eps
@@ -0,0 +1,904 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%BoundingBox: 10 150 471 681
+%%Title: /tmpdir/jbehrens/JB-Local/Flash/doc/Dataflow-new.eps
+%%CreationDate: 1:09 PM January 21, 1998
+%%Pages: 1
+%%EndComments
+%%BeginProlog
+%%BeginResource ShowcaseResource
+1 setlinejoin
+/M  { moveto } bind def /S { show  } bind def
+/R { rmoveto } bind def /L { lineto } bind def
+/B { newpath 0 0 M 0 1 L 1 1 L 1 0 L closepath } bind def
+/CS { closepath stroke } bind def
+/S {
+    /fixwidth exch def
+    dup length /nchars exch def
+    dup stringwidth pop
+    fixwidth exch sub nchars div
+    exch 0 exch ashow
+} def
+/bwproc {
+	rgbproc
+	dup length 3 idiv string 0 3 0
+	5 -1 roll {
+	add 2 1 roll 1 sub dup 0 eq
+	{ pop 3 idiv 3 -1 roll dup 4 -1 roll dup
+	  3 1 roll 5 -1 roll put 1 add 3 0 }
+	{ 2 1 roll } ifelse
+	} forall
+	pop pop pop
+} def
+systemdict /colorimage known not {
+	/colorimage {
+		pop
+		pop
+		/rgbproc exch def
+		{ bwproc } image
+	} def
+} if
+1 1 scale
+0 setlinewidth
+/drawtri {
+/y3 exch def
+/x3 exch def
+/y2 exch def
+/x2 exch def
+/y1 exch def
+/x1 exch def
+0 setgray
+newpath
+x1 y1 moveto
+x2 y2 lineto
+x3 y3 lineto
+closepath
+stroke
+} bind def
+/filltri {
+/y3 exch def
+/x3 exch def
+/y2 exch def
+/x2 exch def
+/y1 exch def
+/x1 exch def
+newpath
+x1 y1 moveto
+x2 y2 lineto
+x3 y3 lineto
+closepath
+fill
+} bind def
+/cliptri {
+/y3 exch def
+/x3 exch def
+/y2 exch def
+/x2 exch def
+/y1 exch def
+/x1 exch def
+0 setgray
+newpath
+x1 y1 moveto
+x2 y2 lineto
+x3 y3 lineto
+closepath
+clip
+} bind def
+/imgscanrgb {
+gsave
+translate
+/scandy exch def
+/scandx exch def
+/istr scandx 3 mul string def
+scandx scandy scale
+scandx scandy 8
+[scandx 0 0 scandy neg 0 scandy]
+{currentfile istr readhexstring pop}
+false 3
+colorimage
+grestore
+} bind def
+/imgscanbw {
+gsave
+translate
+/scandy exch def
+/scandx exch def
+/istr scandx string def
+scandx scandy scale
+scandx scandy 8
+[scandx 0 0 scandy neg 0 scandy]
+{currentfile istr readhexstring pop}
+image
+grestore
+} bind def
+/showcaseisoencoding [
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign
+/dollar /percent /ampersand /quoteright
+/parenleft /parenright /asterisk /plus
+/comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon
+/less /equal /greater /question
+/at /A /B /C /D /E /F /G
+/H /I /J /K /L /M /N /O
+/P /Q /R /S /T /U /V /W
+/X /Y /Z /bracketleft
+/backslash /bracketright /asciicircum /underscore
+/quoteleft /a /b /c /d /e /f /g
+/h /i /j /k /l /m /n /o
+/p /q /r /s /t /u /v /w
+/x /y /z /braceleft
+/bar /braceright /asciitilde /guilsinglright
+/fraction /florin /quotesingle /quotedblleft
+/guilsinglleft /fi /fl /endash
+/dagger /daggerdbl /bullet /quotesinglbase
+/quotedblbase /quotedblright /ellipsis /trademark
+/dotlessi /grave /acute /circumflex
+/tilde /macron /breve /dotaccent
+/dieresis /perthousand /ring /cedilla
+/Ydieresis /hungarumlaut /ogonek /caron
+/emdash /exclamdown /cent /sterling
+/currency /yen /brokenbar /section
+/dieresis /copyright /ordfeminine /guillemotleft
+/logicalnot /hyphen /registered /macron
+/degree /plusminus /twosuperior /threesuperior
+/acute /mu /paragraph /periodcentered
+/cedilla /onesuperior /ordmasculine /guillemotright
+/onequarter /onehalf /threequarters /questiondown
+/Agrave /Aacute /Acircumflex /Atilde
+/Adieresis /Aring /AE /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis
+/Igrave /Iacute /Icircumflex /Idieresis
+/Eth /Ntilde /Ograve /Oacute
+/Ocircumflex /Otilde /Odieresis /multiply
+/Oslash /Ugrave /Uacute /Ucircumflex
+/Udieresis /Yacute /Thorn /germandbls
+/agrave /aacute /acircumflex /atilde
+/adieresis /aring /ae /ccedilla
+/egrave /eacute /ecircumflex /edieresis
+/igrave /iacute /icircumflex /idieresis
+/eth /ntilde /ograve /oacute
+/ocircumflex /otilde /odieresis /divide
+/oslash /ugrave /uacute /ucircumflex
+/udieresis /yacute /thorn /ydieresis ] def
+/showcasedingbatencoding [
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /a1 /a2 /a202 /a3 /a4 /a5 /a119 /a118 /a117
+/a11 /a12 /a13 /a14 /a15 /a16 /a105 /a17 /a18 /a19
+/a20 /a21 /a22 /a23 /a24 /a25 /a26 /a27 /a28 /a6 /a7
+/a8 /a9 /a10 /a29
+/a30 /a31 /a32 /a33 /a34 /a35 /a36 /a37 /a38 /a39
+/a40 /a41 /a42 /a43 /a44 /a45 /a46 /a47 /a48 /a49
+/a50 /a51 /a52 /a53 /a54 /a55 /a56 /a57 /a58 /a59
+/a60 /a61 /a62 /a63 /a64 /a65 /a66 /a67 /a68 /a69
+/a70 /a71 /a72 /a73 /a74 /a203 /a75 /a204 /a76 /a77 /a78
+/a79 /a81 /a82 /a83 /a84 /a97 /a98 /a99 /a100 /.notdef
+/a205 /a85 /a206 /a86 /a87 /a88 /a89 /a90 /a91 /a92 /a93
+/a94 /a95 /a96
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /a101 /a102 /a103 /a104 /a106 /a107 /a108
+/a112 /a111 /a110 /a109
+/a120 /a121 /a122 /a123 /a124 /a125 /a126 /a127 /a128 /a129
+/a130 /a131 /a132 /a133 /a134 /a135 /a136 /a137 /a138 /a139
+/a140 /a141 /a142 /a143 /a144 /a145 /a146 /a147 /a148 /a149
+/a150 /a151 /a152 /a153 /a154 /a155 /a156 /a157 /a158 /a159
+/a160 /a161 /a163 /a164 /a196 /a165 /a192 /a166 /a167 /a168
+/a169 /a170 /a171 /a172 /a173 /a162 /a174 /a175 /a176 /a177
+/a178 /a179 /a193 /a180 /a199 /a181 /a200 /a182 /.notdef
+/a201 /a183 /a184 /a197 /a185 /a194 /a198 /a186 /a195 /a187
+/a188 /a189 /a190 /a191 /.notdef
+] def
+/Courier-Bold findfont
+dup length dict begin
+  {1 index /FID ne {def} {pop pop} ifelse} forall
+  /Encoding showcaseisoencoding def
+  currentdict
+end
+/Courier-Bold-SHOWISO exch definefont pop
+/newfont 10 dict def
+newfont begin
+
+ /FontType 3 def
+ /FontMatrix [1 0 0 1 0 0] def
+ /FontBBox [0 0 1 1] def
+ /Encoding 256 array def
+ 0 1 255 {Encoding exch /.notdef put} for
+
+ /CharProcs 1 dict def
+ CharProcs begin
+ /.notdef {} def
+
+end
+
+ /BuildChar {
+  1 0
+  0 0 1 1
+  setcachedevice
+  exch begin
+  Encoding exch get
+  CharProcs exch get
+  end
+  exec
+ } def
+end
+/PatternFont newfont definefont pop
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+%%EndSetup
+%%Page: label 1
+gsave
+/saveit save def
+gsave
+gsave
+1 0 1 setrgbcolor
+7.000000 setlinewidth
+newpath
+189.5 459 M
+229.5 459 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+283.125 422.5 M
+283.125 396.25 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+283.125 480.625 M
+283.125 451.875 L
+stroke
+grestore
+gsave
+matrix currentmatrix
+[170 0 0 -28 198.431 693.556] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+1 0 1 setrgbcolor
+4.000000 setlinewidth
+newpath
+215.394 665.926 M
+244.394 665.926 L
+stroke
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 216.131 671.057] concat
+newpath
+0 0 M 0 17 L 134.6 17 L 134.6 0 L
+closepath setmatrix
+0 1 1 setrgbcolor
+grestore
+newpath
+212.631 667.557 M 212.631 691.557 L 354.231 691.557 L 354.231 667.557 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 216.131 671.057] concat
+/Courier-Bold-SHOWISO findfont 17 scalefont setfont
+0 0 0 setrgbcolor
+0 3 M (io_getcmdline) 132.6 S
+setmatrix
+grestore
+gsave
+matrix currentmatrix
+[170 0 0 -28 87.0139 635.778] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+1 0 1 setrgbcolor
+4.000000 setlinewidth
+newpath
+103.977 635.889 M
+132.977 635.889 L
+stroke
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 89.4139 613.278] concat
+newpath
+0 0 M 0 17 L 165.2 17 L 165.2 0 L
+closepath setmatrix
+0 1 1 setrgbcolor
+grestore
+newpath
+85.9139 609.778 M 85.9139 633.778 L 258.114 633.778 L 258.114 609.778 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 89.4139 613.278] concat
+/Courier-Bold-SHOWISO findfont 17 scalefont setfont
+0 0 0 setrgbcolor
+0 3 M (io_getbatchinput) 163.2 S
+setmatrix
+grestore
+gsave
+matrix currentmatrix
+[170 0 0 -28 308.058 635.778] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+1 0 1 setrgbcolor
+4.000000 setlinewidth
+newpath
+325.021 635.889 M
+354.021 635.889 L
+stroke
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 310.458 613.278] concat
+newpath
+0 0 M 0 17 L 165.2 17 L 165.2 0 L
+closepath setmatrix
+0 1 1 setrgbcolor
+grestore
+newpath
+306.958 609.778 M 306.958 633.778 L 479.158 633.778 L 479.158 609.778 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 310.458 613.278] concat
+/Courier-Bold-SHOWISO findfont 17 scalefont setfont
+0 0 0 setrgbcolor
+0 3 M (io_getinterinput) 163.2 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 211.6 487.129] concat
+newpath
+0 0 M 0 17 L 144.8 17 L 144.8 0 L
+closepath setmatrix
+0 1 1 setrgbcolor
+grestore
+newpath
+208.1 483.629 M 208.1 507.629 L 359.9 507.629 L 359.9 483.629 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 211.6 487.129] concat
+/Courier-Bold-SHOWISO findfont 17 scalefont setfont
+0 0 0 setrgbcolor
+0 3 M (slm_initialize) 142.8 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 82.1694 439.353] concat
+newpath
+0 0 M 0 17 L 42.8 17 L 42.8 0 L
+closepath setmatrix
+0 1 1 setrgbcolor
+grestore
+newpath
+78.6694 435.853 M 78.6694 459.853 L 128.469 459.853 L 128.469 435.853 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 82.1694 439.353] concat
+/Courier-Bold-SHOWISO findfont 17 scalefont setfont
+0 0 0 setrgbcolor
+0 3 M (plot) 40.8 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 201.4 428.121] concat
+newpath
+0 0 M 0 17 L 165.2 17 L 165.2 0 L
+closepath setmatrix
+0 1 1 setrgbcolor
+grestore
+newpath
+197.9 424.621 M 197.9 448.621 L 370.1 448.621 L 370.1 424.621 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 201.4 428.121] concat
+/Courier-Bold-SHOWISO findfont 17 scalefont setfont
+0 0 0 setrgbcolor
+0 3 M (slm_timestepping) 163.2 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 232 374.129] concat
+newpath
+0 0 M 0 17 L 104 17 L 104 0 L
+closepath setmatrix
+0 1 1 setrgbcolor
+grestore
+newpath
+228.5 370.629 M 228.5 394.629 L 339.5 394.629 L 339.5 370.629 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 232 374.129] concat
+/Courier-Bold-SHOWISO findfont 17 scalefont setfont
+0 0 0 setrgbcolor
+0 3 M (slm_finish) 102 S
+setmatrix
+grestore
+gsave
+0 1 1 setrgbcolor
+1.000000 setlinewidth
+newpath
+21.1111 865.556 M
+34.4444 871.111 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+283.125 543.125 M
+283.125 510 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+283.625 461.853 M
+189.5 461.853 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+283 666 M
+170 636 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+283 665 M
+396 636 L
+stroke
+grestore
+gsave
+0 0 1 setrgbcolor
+7.000000 setlinewidth
+newpath
+261.5 471.5 M
+79.5 471.5 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+170 608 M
+283 571 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+396 608 M
+283 571 L
+stroke
+grestore
+gsave
+0 0 1 setrgbcolor
+7.000000 setlinewidth
+newpath
+261.5 480 M
+261.5 451 L
+stroke
+grestore
+gsave
+0 0 1 setrgbcolor
+7.000000 setlinewidth
+newpath
+261.5 422 M
+261.5 396 L
+stroke
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 201.4 547.999] concat
+newpath
+0 0 M 0 17 L 165.2 17 L 165.2 0 L
+closepath setmatrix
+0 1 1 setrgbcolor
+grestore
+newpath
+197.9 544.499 M 197.9 568.499 L 370.1 568.499 L 370.1 544.499 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 201.4 547.999] concat
+/Courier-Bold-SHOWISO findfont 17 scalefont setfont
+0 0 0 setrgbcolor
+0 3 M (io_putparameters) 163.2 S
+setmatrix
+grestore
+gsave
+1 0 1 setrgbcolor
+7.000000 setlinewidth
+newpath
+230 665 M
+230 648.769 L
+stroke
+grestore
+gsave
+1 0 1 setrgbcolor
+7.000000 setlinewidth
+newpath
+47 648 M
+337 648 L
+stroke
+grestore
+gsave
+1 0 1 setrgbcolor
+7.000000 setlinewidth
+newpath
+119 648 M
+119 636 L
+stroke
+grestore
+gsave
+1 0 1 setrgbcolor
+7.000000 setlinewidth
+newpath
+339 651.231 M
+339 635 L
+stroke
+grestore
+gsave
+1 0 1 setrgbcolor
+7.000000 setlinewidth
+newpath
+50 647 M
+50 462 L
+stroke
+grestore
+gsave
+1 0 1 setrgbcolor
+7.000000 setlinewidth
+newpath
+112.111 309.556 M
+135.444 309.556 L
+stroke
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 152.222 301.109] concat
+newpath
+0 0 M 0 17 L 180.84 17 L 180.84 0 L
+closepath setmatrix
+0 1 1 setrgbcolor
+grestore
+newpath
+150.222 299.109 M 150.222 320.109 L 335.062 320.109 L 335.062 299.109 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 152.222 301.109] concat
+/AvantGarde-Demi-SHOWISO findfont 17 scalefont setfont
+0 0 0 setrgbcolor
+0 4 M (C) 13.26 S
+13.26 4 M (ontrol data structu) 149.26 S
+162.52 4 M (re) 16.32 S
+setmatrix
+grestore
+gsave
+0 0 1 setrgbcolor
+7.000000 setlinewidth
+newpath
+112.111 331 M
+135.444 331 L
+stroke
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 152.222 322.559] concat
+newpath
+0 0 M 0 17 L 156.02 17 L 156.02 0 L
+closepath setmatrix
+0 1 1 setrgbcolor
+grestore
+newpath
+150.222 320.559 M 150.222 341.559 L 310.242 341.559 L 310.242 320.559 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 152.222 322.559] concat
+/AvantGarde-Demi-SHOWISO findfont 17 scalefont setfont
+0 0 0 setrgbcolor
+0 4 M (Grid data structure) 154.02 S
+setmatrix
+grestore
+gsave
+1 0 1 setrgbcolor
+4.000000 setlinewidth
+newpath
+105 607.5 M
+134 607.5 L
+stroke
+grestore
+gsave
+1 0 1 setrgbcolor
+4.000000 setlinewidth
+newpath
+325 608.148 M
+354 608.148 L
+stroke
+grestore
+gsave
+matrix currentmatrix
+[170 0 0 -28 199 570.5] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+1 0 1 setrgbcolor
+4.000000 setlinewidth
+newpath
+215.963 570.611 M
+244.963 570.611 L
+stroke
+grestore
+gsave
+matrix currentmatrix
+[170 0 0 -28 199 509.63] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+1 0 1 setrgbcolor
+4.000000 setlinewidth
+newpath
+215.963 509.741 M
+244.963 509.741 L
+stroke
+grestore
+gsave
+0 0 1 setrgbcolor
+4.000000 setlinewidth
+newpath
+247.296 481.5 M
+276.296 481.5 L
+stroke
+grestore
+gsave
+matrix currentmatrix
+[170 0 0 -28 199 450.63] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+0 0 1 setrgbcolor
+4.000000 setlinewidth
+newpath
+246.796 450.741 M
+275.796 450.741 L
+stroke
+grestore
+gsave
+1 0 1 setrgbcolor
+4.000000 setlinewidth
+newpath
+215.963 450.741 M
+244.963 450.741 L
+stroke
+grestore
+gsave
+0 0 1 setrgbcolor
+4.000000 setlinewidth
+newpath
+247.296 422.5 M
+276.296 422.5 L
+stroke
+grestore
+gsave
+matrix currentmatrix
+[170 0 0 -28 199 396.63] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+0 0 1 setrgbcolor
+4.000000 setlinewidth
+newpath
+246.796 396.741 M
+275.796 396.741 L
+stroke
+grestore
+gsave
+1 0 1 setrgbcolor
+4.000000 setlinewidth
+newpath
+215.963 396.741 M
+244.963 396.741 L
+stroke
+grestore
+gsave
+1 0 1 setrgbcolor
+7.000000 setlinewidth
+newpath
+119 607 M
+119 595 L
+stroke
+grestore
+gsave
+1 0 1 setrgbcolor
+7.000000 setlinewidth
+newpath
+339 607.5 M
+339 595.5 L
+stroke
+grestore
+gsave
+1 0 1 setrgbcolor
+7.000000 setlinewidth
+newpath
+48 595 M
+343 595 L
+stroke
+grestore
+gsave
+1 0 1 setrgbcolor
+7.000000 setlinewidth
+newpath
+230 583 M
+230 571 L
+stroke
+grestore
+gsave
+1 0 1 setrgbcolor
+7.000000 setlinewidth
+newpath
+230 521.5 M
+230 509.5 L
+stroke
+grestore
+gsave
+1 0 1 setrgbcolor
+7.000000 setlinewidth
+newpath
+230 409 M
+230 397 L
+stroke
+grestore
+gsave
+matrix currentmatrix
+[170 0 0 -28 18.5694 461.853] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+0 0 1 setrgbcolor
+4.000000 setlinewidth
+newpath
+66.3657 461.964 M
+95.3658 461.964 L
+stroke
+grestore
+gsave
+1 0 1 setrgbcolor
+4.000000 setlinewidth
+newpath
+35.5324 461.964 M
+64.5324 461.964 L
+stroke
+grestore
+gsave
+1 0 1 setrgbcolor
+7.000000 setlinewidth
+newpath
+230 462 M
+230 450 L
+stroke
+grestore
+gsave
+0 0 1 setrgbcolor
+7.000000 setlinewidth
+newpath
+79.5 474 M
+79.5 462 L
+stroke
+grestore
+gsave
+1 0 1 setrgbcolor
+7.000000 setlinewidth
+newpath
+50 580.5 M
+232.5 580.5 L
+stroke
+grestore
+gsave
+1 0 1 setrgbcolor
+7.000000 setlinewidth
+newpath
+49.5 519.5 M
+232 519.5 L
+stroke
+grestore
+gsave
+1 0 1 setrgbcolor
+7.000000 setlinewidth
+newpath
+50 433.5 M
+50 404 L
+stroke
+grestore
+gsave
+1 0 1 setrgbcolor
+7.000000 setlinewidth
+newpath
+50 407 M
+232.5 407 L
+stroke
+grestore
+grestore
+showpage
+saveit restore
+grestore
+%%EOF
diff --git a/flash2d/doc/Datastruct.eps b/flash2d/doc/Datastruct.eps
new file mode 100644
index 0000000..3b31fb4
--- /dev/null
+++ b/flash2d/doc/Datastruct.eps
@@ -0,0 +1,855 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%BoundingBox: 46 50 791 560
+%%Title: /home/bornemann/behrens/Development/Flash-0.7/doc/sources/Datastruct.eps
+%%CreationDate: 8:16 AM May 16, 2001
+%%Pages: 1
+%%EndComments
+%%BeginProlog
+%%BeginResource ShowcaseResource
+1 setlinejoin
+/M  { moveto } bind def /S { show  } bind def
+/R { rmoveto } bind def /L { lineto } bind def
+/B { newpath 0 0 M 0 1 L 1 1 L 1 0 L closepath } bind def
+/CS { closepath stroke } bind def
+/S {
+    /fixwidth exch def
+    dup length /nchars exch def
+    dup stringwidth pop
+    fixwidth exch sub nchars div
+    exch 0 exch ashow
+} def
+/bwproc {
+	rgbproc
+	dup length 3 idiv string 0 3 0
+	5 -1 roll {
+	add 2 1 roll 1 sub dup 0 eq
+	{ pop 3 idiv 3 -1 roll dup 4 -1 roll dup
+	  3 1 roll 5 -1 roll put 1 add 3 0 }
+	{ 2 1 roll } ifelse
+	} forall
+	pop pop pop
+} def
+systemdict /colorimage known not {
+	/colorimage {
+		pop
+		pop
+		/rgbproc exch def
+		{ bwproc } image
+	} def
+} if
+1 1 scale
+0 setlinewidth
+/drawtri {
+/y3 exch def
+/x3 exch def
+/y2 exch def
+/x2 exch def
+/y1 exch def
+/x1 exch def
+0 setgray
+newpath
+x1 y1 moveto
+x2 y2 lineto
+x3 y3 lineto
+closepath
+stroke
+} bind def
+/filltri {
+/y3 exch def
+/x3 exch def
+/y2 exch def
+/x2 exch def
+/y1 exch def
+/x1 exch def
+newpath
+x1 y1 moveto
+x2 y2 lineto
+x3 y3 lineto
+closepath
+fill
+} bind def
+/cliptri {
+/y3 exch def
+/x3 exch def
+/y2 exch def
+/x2 exch def
+/y1 exch def
+/x1 exch def
+0 setgray
+newpath
+x1 y1 moveto
+x2 y2 lineto
+x3 y3 lineto
+closepath
+clip
+} bind def
+/imgscanrgb {
+gsave
+translate
+/scandy exch def
+/scandx exch def
+/istr scandx 3 mul string def
+scandx scandy scale
+scandx scandy 8
+[scandx 0 0 scandy neg 0 scandy]
+{currentfile istr readhexstring pop}
+false 3
+colorimage
+grestore
+} bind def
+/imgscanbw {
+gsave
+translate
+/scandy exch def
+/scandx exch def
+/istr scandx string def
+scandx scandy scale
+scandx scandy 8
+[scandx 0 0 scandy neg 0 scandy]
+{currentfile istr readhexstring pop}
+image
+grestore
+} bind def
+/showcaseisoencoding [
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign
+/dollar /percent /ampersand /quoteright
+/parenleft /parenright /asterisk /plus
+/comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon
+/less /equal /greater /question
+/at /A /B /C /D /E /F /G
+/H /I /J /K /L /M /N /O
+/P /Q /R /S /T /U /V /W
+/X /Y /Z /bracketleft
+/backslash /bracketright /asciicircum /underscore
+/quoteleft /a /b /c /d /e /f /g
+/h /i /j /k /l /m /n /o
+/p /q /r /s /t /u /v /w
+/x /y /z /braceleft
+/bar /braceright /asciitilde /guilsinglright
+/fraction /florin /quotesingle /quotedblleft
+/guilsinglleft /fi /fl /endash
+/dagger /daggerdbl /bullet /quotesinglbase
+/quotedblbase /quotedblright /ellipsis /trademark
+/dotlessi /grave /acute /circumflex
+/tilde /macron /breve /dotaccent
+/dieresis /perthousand /ring /cedilla
+/Ydieresis /hungarumlaut /ogonek /caron
+/emdash /exclamdown /cent /sterling
+/currency /yen /brokenbar /section
+/dieresis /copyright /ordfeminine /guillemotleft
+/logicalnot /hyphen /registered /macron
+/degree /plusminus /twosuperior /threesuperior
+/acute /mu /paragraph /periodcentered
+/cedilla /onesuperior /ordmasculine /guillemotright
+/onequarter /onehalf /threequarters /questiondown
+/Agrave /Aacute /Acircumflex /Atilde
+/Adieresis /Aring /AE /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis
+/Igrave /Iacute /Icircumflex /Idieresis
+/Eth /Ntilde /Ograve /Oacute
+/Ocircumflex /Otilde /Odieresis /multiply
+/Oslash /Ugrave /Uacute /Ucircumflex
+/Udieresis /Yacute /Thorn /germandbls
+/agrave /aacute /acircumflex /atilde
+/adieresis /aring /ae /ccedilla
+/egrave /eacute /ecircumflex /edieresis
+/igrave /iacute /icircumflex /idieresis
+/eth /ntilde /ograve /oacute
+/ocircumflex /otilde /odieresis /divide
+/oslash /ugrave /uacute /ucircumflex
+/udieresis /yacute /thorn /ydieresis ] def
+/showcasedingbatencoding [
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /a1 /a2 /a202 /a3 /a4 /a5 /a119 /a118 /a117
+/a11 /a12 /a13 /a14 /a15 /a16 /a105 /a17 /a18 /a19
+/a20 /a21 /a22 /a23 /a24 /a25 /a26 /a27 /a28 /a6 /a7
+/a8 /a9 /a10 /a29
+/a30 /a31 /a32 /a33 /a34 /a35 /a36 /a37 /a38 /a39
+/a40 /a41 /a42 /a43 /a44 /a45 /a46 /a47 /a48 /a49
+/a50 /a51 /a52 /a53 /a54 /a55 /a56 /a57 /a58 /a59
+/a60 /a61 /a62 /a63 /a64 /a65 /a66 /a67 /a68 /a69
+/a70 /a71 /a72 /a73 /a74 /a203 /a75 /a204 /a76 /a77 /a78
+/a79 /a81 /a82 /a83 /a84 /a97 /a98 /a99 /a100 /.notdef
+/a205 /a85 /a206 /a86 /a87 /a88 /a89 /a90 /a91 /a92 /a93
+/a94 /a95 /a96
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /a101 /a102 /a103 /a104 /a106 /a107 /a108
+/a112 /a111 /a110 /a109
+/a120 /a121 /a122 /a123 /a124 /a125 /a126 /a127 /a128 /a129
+/a130 /a131 /a132 /a133 /a134 /a135 /a136 /a137 /a138 /a139
+/a140 /a141 /a142 /a143 /a144 /a145 /a146 /a147 /a148 /a149
+/a150 /a151 /a152 /a153 /a154 /a155 /a156 /a157 /a158 /a159
+/a160 /a161 /a163 /a164 /a196 /a165 /a192 /a166 /a167 /a168
+/a169 /a170 /a171 /a172 /a173 /a162 /a174 /a175 /a176 /a177
+/a178 /a179 /a193 /a180 /a199 /a181 /a200 /a182 /.notdef
+/a201 /a183 /a184 /a197 /a185 /a194 /a198 /a186 /a195 /a187
+/a188 /a189 /a190 /a191 /.notdef
+] def
+/newfont 10 dict def
+newfont begin
+
+ /FontType 3 def
+ /FontMatrix [1 0 0 1 0 0] def
+ /FontBBox [0 0 1 1] def
+ /Encoding 256 array def
+ 0 1 255 {Encoding exch /.notdef put} for
+
+ /CharProcs 1 dict def
+ CharProcs begin
+ /.notdef {} def
+
+end
+
+ /BuildChar {
+  1 0
+  0 0 1 1
+  setcachedevice
+  exch begin
+  Encoding exch get
+  CharProcs exch get
+  end
+  exec
+ } def
+end
+/PatternFont newfont definefont pop
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+%%EndSetup
+%%Page: label 1
+gsave
+/saveit save def
+gsave
+gsave
+matrix currentmatrix
+[20.5183 0 0 20.5183 414.302 520.222] concat
+newpath
+0 0 1 0 360 arc
+setmatrix
+0.219608 0.556863 0.556863 setrgbcolor
+closepath fill
+grestore
+gsave
+matrix currentmatrix
+[9.82344 9.82344 -9.82344 9.82344 414.195 520.115] concat
+newpath
+0 0 1 0 360 arc
+setmatrix
+1 0 1 setrgbcolor
+closepath fill
+grestore
+gsave
+matrix currentmatrix
+[9.82344 9.82344 -9.82344 9.82344 415.302 309.222] concat
+newpath
+0 0 1 0 360 arc
+setmatrix
+1 0 1 setrgbcolor
+closepath fill
+grestore
+gsave
+0 0 1 setrgbcolor
+4.000000 setlinewidth
+newpath
+270.302 523.222 M
+558.302 523.222 L
+414.302 307.222 L
+closepath
+270.302 522.222 M
+stroke
+grestore
+gsave
+1 0 1 setrgbcolor
+2.000000 setlinewidth
+newpath
+414.302 523.222 M
+414.302 307.222 L
+stroke
+grestore
+gsave
+matrix currentmatrix
+[8.06226 0 0 8.06226 560.302 523.222] concat
+newpath
+0 0 1 0 360 arc
+setmatrix
+0 0 1 setrgbcolor
+closepath fill
+grestore
+gsave
+matrix currentmatrix
+[8.06226 0 0 8.06226 268.365 524.284] concat
+newpath
+0 0 1 0 360 arc
+setmatrix
+0 0 1 setrgbcolor
+closepath fill
+grestore
+gsave
+matrix currentmatrix
+[8.06226 0 0 8.06226 415.365 309.284] concat
+newpath
+0 0 1 0 360 arc
+setmatrix
+0 0 1 setrgbcolor
+closepath fill
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 350.302 498.222] concat
+newpath
+0 0 M 0 18 L 126.2 18 L 126.2 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+346.802 494.722 M 346.802 519.722 L 480.002 519.722 L 480.002 494.722 L
+closepath clip newpath
+0 0 1 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 350.302 498.222] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+0 0 1 setrgbcolor
+0 4 M (Element Index) 124.2 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[0 1 -1 0 435.302 362.222] concat
+newpath
+0 0 M 0 18 L 101 18 L 101 0 L
+closepath setmatrix
+1 0 1 setrgbcolor
+grestore
+newpath
+414.802 359.722 M 414.802 465.722 L 437.802 465.722 L 437.802 359.722 L
+closepath clip newpath
+1 0 1 setrgbcolor
+matrix currentmatrix
+[0 1 -1 0 435.302 362.222] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+1 0 1 setrgbcolor
+0 4 M (Edge Index) 99 S
+setmatrix
+grestore
+gsave
+1 0 1 setrgbcolor
+/PatternFont findfont 16.08 scalefont setfont
+newpath
+271.302 522.222 M
+415.302 307.222 L
+559.302 523.222 L
+closepath
+eoclip
+288 16.08 528 {
+240 exch M
+(BBBBBBBBBBBBBBBBBBBBB)
+show
+} for
+1 0 1 setrgbcolor
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 356.302 541.222] concat
+newpath
+0 0 M 0 18 L 104.6 18 L 104.6 0 L
+closepath setmatrix
+1 0 1 setrgbcolor
+grestore
+newpath
+353.802 538.722 M 353.802 561.722 L 463.402 561.722 L 463.402 538.722 L
+closepath clip newpath
+0.219608 0.556863 0.556863 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 356.302 541.222] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+0.219608 0.556863 0.556863 setrgbcolor
+0 4 M (Node Index) 102.6 S
+setmatrix
+grestore
+gsave
+matrix currentmatrix
+[220 0 0 -33 46.2222 274.222] concat
+B
+setmatrix
+0 0 1 setrgbcolor
+gsave fill grestore
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 56.2222 248.722] concat
+newpath
+0 0 M 0 18 L 200 18 L 200 0 L
+closepath setmatrix
+1 1 1 setrgbcolor
+grestore
+newpath
+52.7222 245.222 M 52.7222 270.222 L 259.722 270.222 L 259.722 245.222 L
+closepath clip newpath
+1 1 1 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 56.2222 248.722] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+1 1 1 setrgbcolor
+0 4 M (Element Data Struct) 169.92 S
+169.92 4 M (ure) 28.08 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 46.2222 210.651] concat
+newpath
+0 0 M 0 18 L 32.6 18 L 32.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+42.7222 207.151 M 42.7222 232.151 L 82.3222 232.151 L 82.3222 207.151 L
+closepath clip newpath
+1 1 1 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 46.2222 210.651] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+0 0 0 setrgbcolor
+0 4 M (DEF) 30.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 46.2222 150.651] concat
+newpath
+0 0 M 0 18 L 30.44 18 L 30.44 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+42.7222 147.151 M 42.7222 172.151 L 80.1622 172.151 L 80.1622 147.151 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 46.2222 150.651] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+0 0 0 setrgbcolor
+0 4 M (ATT) 28.44 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 141.822 174.651] concat
+newpath
+0 0 M 0 54 L 74 54 L 74 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+138.322 171.151 M 138.322 232.151 L 219.322 232.151 L 219.322 171.151 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 141.822 174.651] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+0 0 0 setrgbcolor
+0 40 M (Index) 49.32 S
+0 22 M (Node\(3\)) 72 S
+0 4 M (Edge\(3\)) 68.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 141.822 96.6508] concat
+newpath
+0 0 M 0 72 L 69.68 72 L 69.68 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+138.322 93.1508 M 138.322 172.151 L 215.002 172.151 L 215.002 93.1508 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 141.822 96.6508] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+0 0 0 setrgbcolor
+0 58 M (Marked) 67.68 S
+0 40 M (Level) 45.36 S
+0 22 M (State) 43.56 S
+0 4 M (...) 15.12 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 46.2222 68.6508] concat
+newpath
+0 0 M 0 18 L 34.4 18 L 34.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+42.7222 65.1508 M 42.7222 90.1508 L 84.1222 90.1508 L 84.1222 65.1508 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 46.2222 68.6508] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+0 0 0 setrgbcolor
+0 4 M (LNK) 32.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 141.822 68.6508] concat
+newpath
+0 0 M 0 18 L 112.88 18 L 112.88 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+139.822 66.6508 M 139.822 88.6508 L 256.702 88.6508 L 256.702 66.6508 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 141.822 68.6508] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+0 0 0 setrgbcolor
+0 4 M (Parent, Child) 110.88 S
+setmatrix
+grestore
+gsave
+matrix currentmatrix
+[220 0 0 -33 308.222 274.222] concat
+B
+setmatrix
+1 0 1 setrgbcolor
+gsave fill grestore
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 330.822 248.722] concat
+newpath
+0 0 M 0 18 L 174.8 18 L 174.8 0 L
+closepath setmatrix
+1 1 1 setrgbcolor
+grestore
+newpath
+327.322 245.222 M 327.322 270.222 L 509.122 270.222 L 509.122 245.222 L
+closepath clip newpath
+1 1 1 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 330.822 248.722] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+1 1 1 setrgbcolor
+0 4 M (Edge Data Structure) 172.8 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 308.222 210.651] concat
+newpath
+0 0 M 0 18 L 32.6 18 L 32.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+304.722 207.151 M 304.722 232.151 L 344.322 232.151 L 344.322 207.151 L
+closepath clip newpath
+1 1 1 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 308.222 210.651] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+0 0 0 setrgbcolor
+0 4 M (DEF) 30.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 308.222 150.651] concat
+newpath
+0 0 M 0 18 L 30.44 18 L 30.44 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+304.722 147.151 M 304.722 172.151 L 342.162 172.151 L 342.162 147.151 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 308.222 150.651] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+0 0 0 setrgbcolor
+0 4 M (ATT) 28.44 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 408.862 192.651] concat
+newpath
+0 0 M 0 36 L 74 36 L 74 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+405.362 189.151 M 405.362 232.151 L 486.362 232.151 L 486.362 189.151 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 408.862 192.651] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+0 0 0 setrgbcolor
+0 22 M (Index) 49.32 S
+0 4 M (Node\(2\)) 72 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 408.862 96.6507] concat
+newpath
+0 0 M 0 72 L 100.28 72 L 100.28 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+405.362 93.1507 M 405.362 172.151 L 512.642 172.151 L 512.642 93.1507 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 408.862 96.6507] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+0 0 0 setrgbcolor
+0 58 M (Neig. Elem.) 98.28 S
+0 40 M (Boundary) 83.52 S
+0 22 M (State) 43.56 S
+0 4 M (...) 15.12 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 308.222 68.6508] concat
+newpath
+0 0 M 0 18 L 34.4 18 L 34.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+304.722 65.1508 M 304.722 90.1508 L 346.122 90.1508 L 346.122 65.1508 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 308.222 68.6508] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+0 0 0 setrgbcolor
+0 4 M (LNK) 32.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 408.862 50.6508] concat
+newpath
+0 0 M 0 36 L 112.88 36 L 112.88 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+406.862 48.6508 M 406.862 88.6508 L 523.742 88.6508 L 523.742 48.6508 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 408.862 50.6508] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+0 0 0 setrgbcolor
+0 22 M (Parent, Child) 110.88 S
+0 4 M (Periodic) 70.92 S
+setmatrix
+grestore
+gsave
+matrix currentmatrix
+[220 0 0 -33 570.222 274.222] concat
+B
+setmatrix
+0.219608 0.556863 0.556863 setrgbcolor
+gsave fill grestore
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 591.022 248.722] concat
+newpath
+0 0 M 0 18 L 178.4 18 L 178.4 0 L
+closepath setmatrix
+1 1 1 setrgbcolor
+grestore
+newpath
+587.522 245.222 M 587.522 270.222 L 772.922 270.222 L 772.922 245.222 L
+closepath clip newpath
+1 1 1 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 591.022 248.722] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+1 1 1 setrgbcolor
+0 4 M (Node Data Structure) 176.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 570.222 210.651] concat
+newpath
+0 0 M 0 18 L 32.6 18 L 32.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+566.722 207.151 M 566.722 232.151 L 606.322 232.151 L 606.322 207.151 L
+closepath clip newpath
+1 1 1 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 570.222 210.651] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+0 0 0 setrgbcolor
+0 4 M (DEF) 30.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 0.999999 570.222 150.651] concat
+newpath
+0 0 M 0 18 L 30.44 18 L 30.44 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+566.722 147.151 M 566.722 172.151 L 604.162 172.151 L 604.162 147.151 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 0.999999 570.222 150.651] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+0 0 0 setrgbcolor
+0 4 M (ATT) 28.44 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 665.822 192.651] concat
+newpath
+0 0 M 0 36 L 124.4 36 L 124.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+662.322 189.151 M 662.322 232.151 L 793.722 232.151 L 793.722 189.151 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 665.822 192.651] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+0 0 0 setrgbcolor
+0 22 M (Index) 49.32 S
+0 4 M (Coordinate\(2\)) 122.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 665.822 96.6507] concat
+newpath
+0 0 M 0 72 L 61.04 72 L 61.04 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+662.322 93.1507 M 662.322 172.151 L 730.362 172.151 L 730.362 93.1507 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 665.822 96.6507] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+0 0 0 setrgbcolor
+0 58 M (Patch) 49.68 S
+0 40 M (State) 43.56 S
+0 22 M (Values) 59.04 S
+0 4 M (...) 15.12 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 570.222 68.6507] concat
+newpath
+0 0 M 0 18 L 34.4 18 L 34.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+566.722 65.1507 M 566.722 90.1507 L 608.122 90.1507 L 608.122 65.1507 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 570.222 68.6507] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+0 0 0 setrgbcolor
+0 4 M (LNK) 32.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 665.822 68.6508] concat
+newpath
+0 0 M 0 18 L 72.92 18 L 72.92 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+663.822 66.6508 M 663.822 88.6508 L 740.742 88.6508 L 740.742 66.6508 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 665.822 68.6508] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+0 0 0 setrgbcolor
+0 4 M (Periodic) 70.92 S
+setmatrix
+grestore
+grestore
+showpage
+saveit restore
+grestore
+%%EOF
diff --git a/flash2d/doc/FlashRef.bib b/flash2d/doc/FlashRef.bib
new file mode 100644
index 0000000..5251d21
--- /dev/null
+++ b/flash2d/doc/FlashRef.bib
@@ -0,0 +1,47 @@
+%% This BibTeX bibliography file was created using BibDesk.
+%% http://bibdesk.sourceforge.net/
+
+
+%% Created for Jörn Behrens at 2016-02-04 14:27:47 +0100 
+
+
+%% Saved with string encoding Unicode (UTF-8) 
+
+
+
+@article{Behrens1996,
+	Author = {Behrens, J.},
+	Date-Added = {2016-02-04 13:26:18 +0000},
+	Date-Modified = {2016-02-04 13:27:43 +0000},
+	Journal = {Mon. Wea. Rev.},
+	Keywords = {semi lagrange adaptive mesh refinement advection},
+	Mynumber = {Oce Num 109},
+	Number = {10},
+	Pages = {2386--2395},
+	Title = {An Adaptive Semi-{L}agrangian Advection Scheme and its Parallelization},
+	Volume = {124},
+	Year = {1996}}
+
+@book{Behrens2006,
+	Address = {Heidelberg, Berlin},
+	Author = {Behrens, J.},
+	Date-Added = {2016-02-04 13:23:48 +0000},
+	Date-Modified = {2016-02-04 13:23:48 +0000},
+	Doi = {10.1007/3-540-33383-5},
+	Local-Url = {file://localhost/Users/jbehrens/Documents/Projects/Habil/Buch/Proof/3540333827_lncse54_020606.pdf},
+	Publisher = {Springer Verlag},
+	Series = {LNCSE},
+	Title = {Adaptive Atmospheric Modeling -- Key techniques in grid generation, data structures, and numerical operations with applications},
+	Volume = {54},
+	Year = {2006},
+	Bdsk-File-1 = {YnBsaXN0MDDUAQIDBAUGJCVYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3ASAAGGoKgHCBMUFRYaIVUkbnVsbNMJCgsMDxJXTlMua2V5c1pOUy5vYmplY3RzViRjbGFzc6INDoACgAOiEBGABIAFgAdccmVsYXRpdmVQYXRoWWFsaWFzRGF0YV8QRi4uLy4uLy4uLy4uLy4uL1Byb2plY3RzL0hhYmlsL0J1Y2gvUHJvb2YvMzU0MDMzMzgyN19sbmNzZTU0XzAyMDYwNi5wZGbSFwsYGVdOUy5kYXRhTxECAgAAAAACAgACAAAMTWFjaW50b3NoIEhEAAAAAAAAAAAAAAAAAAAA0kjAAUgrAAAADfDjHTM1NDAzMzM4MjdfbG5jc2U1NF8wMjA2MDYucGRmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN8OYAAAAAAAAAAAAAAAAABQAFAAAJIAAAAAAAAAAAAAAAAAAAAAVQcm9vZgAAEAAIAADSSKPhAAAAEQAIAAAAAAAAAAAAAQAcAA3w4wAN8J4ADfCUAA2uTgAJjmMACXXfAAYqmgACAGNNYWNpbnRvc2ggSEQ6VXNlcnM6AGJlaHJlbnM6AERvY3VtZW50czoAUHJvamVjdHM6AEhhYmlsOgBCdWNoOgBQcm9vZjoAMzU0MDMzMzgyN19sbmNzZTU0XzAyMDYwNi5wZGYAAA4APAAdADMANQA0ADAAMwAzADMAOAAyADcAXwBsAG4AYwBzAGUANQA0AF8AMAAyADAANgAwADYALgBwAGQAZgAPABoADABNAGEAYwBpAG4AdABvAHMAaAAgAEgARAASAE9Vc2Vycy9iZWhyZW5zL0RvY3VtZW50cy9Qcm9qZWN0cy9IYWJpbC9CdWNoL1Byb29mLzM1NDAzMzM4MjdfbG5jc2U1NF8wMjA2MDYucGRmAAATAAEvAAAVAAIADv//AACABtIbHB0eWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMdHyBWTlNEYXRhWE5TT2JqZWN00hscIiNcTlNEaWN0aW9uYXJ5oiIgXxAPTlNLZXllZEFyY2hpdmVy0SYnVHJvb3SAAQAIABEAGgAjAC0AMgA3AEAARgBNAFUAYABnAGoAbABuAHEAcwB1AHcAhACOANcA3ADkAuoC7ALxAvwDBQMTAxcDHgMnAywDOQM8A04DUQNWAAAAAAAAAgEAAAAAAAAAKAAAAAAAAAAAAAAAAAAAA1g=},
+	Bdsk-Url-1 = {http://www.springer.com/math/cse/book/978-3-540-33382-1}}
+
+@article{Behrens2005,
+	Author = {Behrens, J. and Rakowsky, N. and Hiller, W. and Handorf, D. and L{\"a}uter, M. and P{\"a}pke, J. and Dethloff, K.},
+	Journal = {Ocean Modelling},
+	Number = {1--2},
+	Pages = {171--183},
+	Title = {{amatos}: Parallel Adaptive Mesh Generator for Atmospheric and Oceanic Simulation},
+	Volume = {10},
+	Year = {2005}}
diff --git a/flash2d/doc/Flash_doxyfile.mac b/flash2d/doc/Flash_doxyfile.mac
new file mode 100644
index 0000000..0353fa2
--- /dev/null
+++ b/flash2d/doc/Flash_doxyfile.mac
@@ -0,0 +1,2440 @@
+# Doxyfile 1.8.11
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME           = "Flash 2D - Adaptive Semi-Lagrangian Advection"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER         = 
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          = "Flash2d is a semi-Lagrangian advection code, based on amatos"
+
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
+
+PROJECT_LOGO           = /Users/behrens/Documents/Development/amatos/flash2d/trunk/doc/flash.png
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = /Users/behrens/Documents/Development/amatos/flash2d/trunk/doc/doxygen
+
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS         = NO
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES    = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF       = "The $name class" \
+                         "The $name widget" \
+                         "The $name file" \
+                         is \
+                         provides \
+                         specifies \
+                         contains \
+                         represents \
+                         a \
+                         an \
+                         the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES        = YES
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH        = 
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH    = 
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE               = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES                = 
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST              = 
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN   = YES
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING      = 
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT       = YES
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT       = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# If one adds a struct or class to a group and this option is enabled, then also
+# any nested class or struct is added to the same group. By default this option
+# is disabled and one has to add nested compounds explicitly via \ingroup.
+# The default value is: NO.
+
+GROUP_NESTED_COMPOUNDS = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING            = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS  = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL            = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO, these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES, upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES       = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC  = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS       = 
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
+# list will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES        = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER    = 
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE            = 
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES         = /Users/behrens/Documents/Development/amatos/flash2d/trunk/doc/FlashRef.bib
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS               = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong or incomplete
+# parameter documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC       = NO
+
+# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
+# a warning is encountered.
+# The default value is: NO.
+
+WARN_AS_ERROR          = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE           = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
+# Note: If this tag is empty the current directory is searched.
+
+INPUT                  = /Users/behrens/Documents/Development/amatos/flash2d/trunk/src/flash \
+                         /Users/behrens/Documents/Development/amatos/flash2d/trunk/src/options \
+                         /Users/behrens/Documents/Development/amatos/flash2d/trunk/doc/mainpage.txt
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# read by doxygen.
+#
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
+# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
+# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f, *.for, *.tcl,
+# *.vhd, *.vhdl, *.ucf, *.qsf, *.as and *.js.
+
+FILE_PATTERNS          = *.f90 \
+                         *.f \
+                         *.F90 \
+                         *.c
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE                = 
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       = 
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS        = 
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH           = 
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS       = *
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH             = 
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+INPUT_FILTER           = 
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+FILTER_PATTERNS        = 
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES    = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS = 
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER         = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS        = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS       = YES
+
+# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
+# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
+# cost of reduced performance. This can be particularly helpful with template
+# rich C++ code for which doxygen's built-in parser lacks the necessary type
+# information.
+# Note: The availability of this option depends on whether or not doxygen was
+# generated with the -Duse-libclang=ON option for CMake.
+# The default value is: NO.
+
+CLANG_ASSISTED_PARSING = NO
+
+# If clang assisted parsing is enabled you can provide the compiler with command
+# line options that you would normally use when invoking the compiler. Note that
+# the include paths will already be set by doxygen for the files and directories
+# specified with INPUT and INCLUDE_PATH.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_OPTIONS          = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX     = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX          = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER            = 
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER            = 
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET        = 
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET  = 
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES       = 
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the style sheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to YES can help to show when doxygen was last run and thus if the
+# documentation is up to date.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP         = NO
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET        = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP      = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE               = 
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION           = 
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the master .chm file (NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI           = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING     = 
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE               = 
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME   = 
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS  = 
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS  = 
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION           = 
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX          = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW      = YES
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH         = 250
+
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT    = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX            = YES
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT         = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS     = 
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE       = 
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE           = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH    = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH        = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL       = 
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE        = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID     = 
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS  = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE             = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. The package can be specified just
+# by its name or with the correct syntax as to be used with the LaTeX
+# \usepackage command. To get the times font for instance you can specify :
+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
+# To use the option intlimits with the amsmath package you can specify:
+# EXTRA_PACKAGES=[intlimits]{amsmath}
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES         = 
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
+# string, for the replacement values of the other commands the user is referred
+# to HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER           = 
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER           = 
+
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET = 
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES      = 
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES, to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE        = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES     = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE      = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE        = plain
+
+# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_TIMESTAMP        = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE    = 
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE    = 
+
+# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
+# with syntax highlighting in the RTF output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_SOURCE_CODE        = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION          = .3
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR             = 
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT             = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK       = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT         = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sf.net) file that captures the
+# structure of the code including all documentation. Note that this feature is
+# still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO, the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH           = 
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS  = 
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED             = 
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED      = 
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES               = 
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE       = 
+
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
+# The default value is: NO.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS        = YES
+
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES         = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS         = NO
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH            = 
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH               = 
+
+# If set to YES the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
+
+HAVE_DOT               = YES
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS        = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME           = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH           = 
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK               = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS   = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH          = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command. Disabling a call graph can be
+# accomplished by means of the command \hidecallgraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH             = YES
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command. Disabling a caller graph can be
+# accomplished by means of the command \hidecallergraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH           = YES
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. For an explanation of the image formats see the section
+# output formats in the documentation of the dot tool (Graphviz (see:
+# http://www.graphviz.org/)).
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
+# png:gdiplus:gdiplus.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT       = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG        = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH               = /sw2/bin
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS           = 
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS           = 
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS           = 
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+
+PLANTUML_JAR_PATH      = 
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH  = 
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP            = YES
diff --git a/flash2d/doc/GridFlow.ps b/flash2d/doc/GridFlow.ps
new file mode 100644
index 0000000..4ec4e40
--- /dev/null
+++ b/flash2d/doc/GridFlow.ps
@@ -0,0 +1,6258 @@
+%!PS-Adobe-2.0
+%%BoundingBox: 166 31 448 811
+%%Title: /tmpdir/jbehrens/JB-Local/Flash/doc/GridFlow.ps
+%%CreationDate: 5:03 PM August  7, 1997
+%%Pages: 8
+%%EndComments
+%%BeginProlog
+%%BeginResource ShowcaseResource
+1 setlinejoin
+/M  { moveto } bind def /S { show  } bind def
+/R { rmoveto } bind def /L { lineto } bind def
+/B { newpath 0 0 M 0 1 L 1 1 L 1 0 L closepath } bind def
+/CS { closepath stroke } bind def
+/S {
+    /fixwidth exch def
+    dup length /nchars exch def
+    dup stringwidth pop
+    fixwidth exch sub nchars div
+    exch 0 exch ashow
+} def
+/bwproc {
+	rgbproc
+	dup length 3 idiv string 0 3 0
+	5 -1 roll {
+	add 2 1 roll 1 sub dup 0 eq
+	{ pop 3 idiv 3 -1 roll dup 4 -1 roll dup
+	  3 1 roll 5 -1 roll put 1 add 3 0 }
+	{ 2 1 roll } ifelse
+	} forall
+	pop pop pop
+} def
+systemdict /colorimage known not {
+	/colorimage {
+		pop
+		pop
+		/rgbproc exch def
+		{ bwproc } image
+	} def
+} if
+1 1 scale
+0 setlinewidth
+/drawtri {
+/y3 exch def
+/x3 exch def
+/y2 exch def
+/x2 exch def
+/y1 exch def
+/x1 exch def
+0 setgray
+newpath
+x1 y1 moveto
+x2 y2 lineto
+x3 y3 lineto
+closepath
+stroke
+} bind def
+/filltri {
+/y3 exch def
+/x3 exch def
+/y2 exch def
+/x2 exch def
+/y1 exch def
+/x1 exch def
+newpath
+x1 y1 moveto
+x2 y2 lineto
+x3 y3 lineto
+closepath
+fill
+} bind def
+/cliptri {
+/y3 exch def
+/x3 exch def
+/y2 exch def
+/x2 exch def
+/y1 exch def
+/x1 exch def
+0 setgray
+newpath
+x1 y1 moveto
+x2 y2 lineto
+x3 y3 lineto
+closepath
+clip
+} bind def
+/imgscanrgb {
+gsave
+translate
+/scandy exch def
+/scandx exch def
+/istr scandx 3 mul string def
+scandx scandy scale
+scandx scandy 8
+[scandx 0 0 scandy neg 0 scandy]
+{currentfile istr readhexstring pop}
+false 3
+colorimage
+grestore
+} bind def
+/imgscanbw {
+gsave
+translate
+/scandy exch def
+/scandx exch def
+/istr scandx string def
+scandx scandy scale
+scandx scandy 8
+[scandx 0 0 scandy neg 0 scandy]
+{currentfile istr readhexstring pop}
+image
+grestore
+} bind def
+/showcaseisoencoding [
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign
+/dollar /percent /ampersand /quoteright
+/parenleft /parenright /asterisk /plus
+/comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon
+/less /equal /greater /question
+/at /A /B /C /D /E /F /G
+/H /I /J /K /L /M /N /O
+/P /Q /R /S /T /U /V /W
+/X /Y /Z /bracketleft
+/backslash /bracketright /asciicircum /underscore
+/quoteleft /a /b /c /d /e /f /g
+/h /i /j /k /l /m /n /o
+/p /q /r /s /t /u /v /w
+/x /y /z /braceleft
+/bar /braceright /asciitilde /guilsinglright
+/fraction /florin /quotesingle /quotedblleft
+/guilsinglleft /fi /fl /endash
+/dagger /daggerdbl /bullet /quotesinglbase
+/quotedblbase /quotedblright /ellipsis /trademark
+/dotlessi /grave /acute /circumflex
+/tilde /macron /breve /dotaccent
+/dieresis /perthousand /ring /cedilla
+/Ydieresis /hungarumlaut /ogonek /caron
+/emdash /exclamdown /cent /sterling
+/currency /yen /brokenbar /section
+/dieresis /copyright /ordfeminine /guillemotleft
+/logicalnot /hyphen /registered /macron
+/degree /plusminus /twosuperior /threesuperior
+/acute /mu /paragraph /periodcentered
+/cedilla /onesuperior /ordmasculine /guillemotright
+/onequarter /onehalf /threequarters /questiondown
+/Agrave /Aacute /Acircumflex /Atilde
+/Adieresis /Aring /AE /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis
+/Igrave /Iacute /Icircumflex /Idieresis
+/Eth /Ntilde /Ograve /Oacute
+/Ocircumflex /Otilde /Odieresis /multiply
+/Oslash /Ugrave /Uacute /Ucircumflex
+/Udieresis /Yacute /Thorn /germandbls
+/agrave /aacute /acircumflex /atilde
+/adieresis /aring /ae /ccedilla
+/egrave /eacute /ecircumflex /edieresis
+/igrave /iacute /icircumflex /idieresis
+/eth /ntilde /ograve /oacute
+/ocircumflex /otilde /odieresis /divide
+/oslash /ugrave /uacute /ucircumflex
+/udieresis /yacute /thorn /ydieresis ] def
+/showcasedingbatencoding [
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /a1 /a2 /a202 /a3 /a4 /a5 /a119 /a118 /a117
+/a11 /a12 /a13 /a14 /a15 /a16 /a105 /a17 /a18 /a19
+/a20 /a21 /a22 /a23 /a24 /a25 /a26 /a27 /a28 /a6 /a7
+/a8 /a9 /a10 /a29
+/a30 /a31 /a32 /a33 /a34 /a35 /a36 /a37 /a38 /a39
+/a40 /a41 /a42 /a43 /a44 /a45 /a46 /a47 /a48 /a49
+/a50 /a51 /a52 /a53 /a54 /a55 /a56 /a57 /a58 /a59
+/a60 /a61 /a62 /a63 /a64 /a65 /a66 /a67 /a68 /a69
+/a70 /a71 /a72 /a73 /a74 /a203 /a75 /a204 /a76 /a77 /a78
+/a79 /a81 /a82 /a83 /a84 /a97 /a98 /a99 /a100 /.notdef
+/a205 /a85 /a206 /a86 /a87 /a88 /a89 /a90 /a91 /a92 /a93
+/a94 /a95 /a96
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /a101 /a102 /a103 /a104 /a106 /a107 /a108
+/a112 /a111 /a110 /a109
+/a120 /a121 /a122 /a123 /a124 /a125 /a126 /a127 /a128 /a129
+/a130 /a131 /a132 /a133 /a134 /a135 /a136 /a137 /a138 /a139
+/a140 /a141 /a142 /a143 /a144 /a145 /a146 /a147 /a148 /a149
+/a150 /a151 /a152 /a153 /a154 /a155 /a156 /a157 /a158 /a159
+/a160 /a161 /a163 /a164 /a196 /a165 /a192 /a166 /a167 /a168
+/a169 /a170 /a171 /a172 /a173 /a162 /a174 /a175 /a176 /a177
+/a178 /a179 /a193 /a180 /a199 /a181 /a200 /a182 /.notdef
+/a201 /a183 /a184 /a197 /a185 /a194 /a198 /a186 /a195 /a187
+/a188 /a189 /a190 /a191 /.notdef
+] def
+/Courier-Bold findfont
+dup length dict begin
+  {1 index /FID ne {def} {pop pop} ifelse} forall
+  /Encoding showcaseisoencoding def
+  currentdict
+end
+/Courier-Bold-SHOWISO exch definefont pop
+/AvantGarde-Demi findfont
+dup length dict begin
+  {1 index /FID ne {def} {pop pop} ifelse} forall
+  /Encoding showcaseisoencoding def
+  currentdict
+end
+/AvantGarde-Demi-SHOWISO exch definefont pop
+/Courier findfont
+dup length dict begin
+  {1 index /FID ne {def} {pop pop} ifelse} forall
+  /Encoding showcaseisoencoding def
+  currentdict
+end
+/Courier-SHOWISO exch definefont pop
+/AvantGarde-Book findfont
+dup length dict begin
+  {1 index /FID ne {def} {pop pop} ifelse} forall
+  /Encoding showcaseisoencoding def
+  currentdict
+end
+/AvantGarde-Book-SHOWISO exch definefont pop
+/newfont 10 dict def
+newfont begin
+
+ /FontType 3 def
+ /FontMatrix [1 0 0 1 0 0] def
+ /FontBBox [0 0 1 1] def
+ /Encoding 256 array def
+ 0 1 255 {Encoding exch /.notdef put} for
+
+ /CharProcs 1 dict def
+ CharProcs begin
+ /.notdef {} def
+
+end
+
+ /BuildChar {
+  1 0
+  0 0 1 1
+  setcachedevice
+  exch begin
+  Encoding exch get
+  CharProcs exch get
+  end
+  exec
+ } def
+end
+/PatternFont newfont definefont pop
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+%%EndSetup
+%%Page: label 1
+gsave
+newpath clippath pathbbox
+/URy exch def
+/URx exch def
+/LLy exch def
+/LLx exch def
+/Width  URx LLx sub 0.005 sub def
+/Height URy LLy sub 0.005 sub def
+LLx LLy translate
+Width 595 div Height 841 div gt
+    { /Y_size Height def
+      /X_size 595 841 div Y_size mul def
+      /Scale Height 841 div def }
+    { /X_size Width def
+      /Y_size 841 595 div X_size mul def
+      /Scale Width 595 div def } ifelse
+Width  X_size sub 2 div
+Height Y_size sub 2 div translate
+Scale Scale scale
+/saveit save def
+gsave
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 71.5555 755] concat
+newpath
+0 0 M 0 18 L 210.08 18 L 210.08 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+69.5555 753 M 69.5555 775 L 283.636 775 L 283.636 753 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 71.5555 755] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+0 0 0 setrgbcolor
+0 4 M (Adaptation \(slm_ada) 183.96 S
+183.96 4 M (pt\)) 24.12 S
+setmatrix
+grestore
+gsave
+0 0 0 setrgbcolor
+2.000000 setlinewidth
+newpath
+71.5555 749 M
+281.636 749 L
+stroke
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 71.5555 720] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+89.5555 666 M
+71.5555 648 L
+71.5555 630 L
+287.556 630 L
+287.556 666 L
+closepath
+89.5555 666 M
+stroke
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 71.5555 612] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 71.5555 540] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 71.5555 486] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 71.5555 432] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+89.5555 378 M
+71.5555 360 L
+89.5555 342 L
+269.556 342 L
+287.556 360 L
+269.556 378 L
+closepath
+89.5555 378 M
+stroke
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 71.5555 324] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+89.5555 270 M
+71.5555 252 L
+89.5555 234 L
+269.556 234 L
+287.556 252 L
+269.556 270 L
+closepath
+89.5555 270 M
+stroke
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 71.5555 216] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 71.5555 160.667] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 71.5555 106.667] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+341.778 160.667 M
+323.778 142.667 L
+341.778 124.667 L
+521.778 124.667 L
+539.778 142.667 L
+521.778 160.667 L
+closepath
+341.778 160.667 M
+stroke
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 323.778 106.667] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 74.1555 690] concat
+newpath
+0 0 M 0 24 L 210.8 24 L 210.8 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+72.1555 688 M 72.1555 716 L 286.956 716 L 286.956 688 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 74.1555 690] concat
+8.2 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+8.2 14.5714 M (Initialize \(waterma) 136.8 S
+145 14.5714 M (rk, grid) 57.6 S
+1 2.57143 M 1 2.57143 M (change indicator, a) 136.8 S
+137.8 2.57143 M (ux arrays\)) 72 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 92.1555 636] concat
+newpath
+0 0 M 0 24 L 174.8 24 L 174.8 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+90.1555 634 M 90.1555 662 L 268.956 662 L 268.956 634 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 92.1555 636] concat
+4.6 14.5714 M /Courier-Bold-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+4.6 14.5714 M (For) 21.6 S
+/Courier-SHOWISO findfont 12 scalefont setfont
+26.2 14.5714 M ( all elements of th) 136.8 S
+163 14.5714 M (e ) 14.4 S
+33.4 2.57143 M 33.4 2.57143 M (finest level ) 93.6 S
+/Courier-Bold-SHOWISO findfont 12 scalefont setfont
+127 2.57143 M (do) 14.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 95.7555 582] concat
+newpath
+0 0 M 0 24 L 167.6 24 L 167.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+93.7555 580 M 93.7555 608 L 265.356 608 L 265.356 580 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 95.7555 582] concat
+8.2 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+8.2 14.5714 M (Estimate local erro) 136.8 S
+145 14.5714 M (r,) 14.4 S
+1 2.57143 M 1 2.57143 M (save value in aux a) 136.8 S
+137.8 2.57143 M (rray) 28.8 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 81.3555 510] concat
+newpath
+0 0 M 0 24 L 196.4 24 L 196.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+79.3555 508 M 79.3555 536 L 279.756 536 L 279.756 508 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 81.3555 510] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Estimate max-norm o) 136.8 S
+137.8 14.5714 M (f error,) 57.6 S
+8.2 2.57143 M 8.2 2.57143 M (calculate error cri) 136.8 S
+145 2.57143 M (terion) 43.2 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 77.7555 456] concat
+newpath
+0 0 M 0 24 L 203.6 24 L 203.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+75.7555 454 M 75.7555 482 L 283.356 482 L 283.356 454 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 77.7555 456] concat
+8.2 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+8.2 14.5714 M (Extract level infor) 136.8 S
+145 14.5714 M (mation,) 50.4 S
+1 2.57143 M 1 2.57143 M (define marks corres) 136.8 S
+137.8 2.57143 M (pondingly) 64.8 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 74.1555 402] concat
+newpath
+0 0 M 0 24 L 210.8 24 L 210.8 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+72.1555 400 M 72.1555 428 L 286.956 428 L 286.956 400 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 74.1555 402] concat
+33.4 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+33.4 14.5714 M (Check watermarks fo) 136.8 S
+170.2 14.5714 M (r ) 14.4 S
+1 2.57143 M 1 2.57143 M (refinement, coarsen) 136.8 S
+137.8 2.57143 M (ing, resp.) 72 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 106.556 354] concat
+newpath
+0 0 M 0 12 L 146 12 L 146 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+104.556 352 M 104.556 368 L 254.556 368 L 254.556 352 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 106.556 354] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Something to refine) 136.8 S
+137.8 2.57143 M (?) 7.2 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 102.956 246] concat
+newpath
+0 0 M 0 12 L 153.2 12 L 153.2 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+100.956 244 M 100.956 260 L 258.156 260 L 258.156 244 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 102.956 246] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Something to coarse) 136.8 S
+137.8 2.57143 M (n?) 14.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 92.1555 300] concat
+newpath
+0 0 M 0 12 L 174.8 12 L 174.8 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+90.1555 298 M 90.1555 314 L 268.956 314 L 268.956 298 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 92.1555 300] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Set marks for refin) 136.8 S
+137.8 2.57143 M (ement) 36 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 92.1555 192] concat
+newpath
+0 0 M 0 12 L 174.8 12 L 174.8 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+90.1555 190 M 90.1555 206 L 268.956 206 L 268.956 190 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 92.1555 192] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Set marks for coars) 136.8 S
+137.8 2.57143 M (ening) 36 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 84.9556 136.664] concat
+newpath
+0 0 M 0 12 L 189.2 12 L 189.2 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+82.9556 134.664 M 82.9556 150.664 L 276.156 150.664 L 276.156 134.664 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 84.9556 136.664] concat
+1 2.57143 M /Courier-Bold-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Call) 28.8 S
+/Courier-SHOWISO findfont 12 scalefont setfont
+29.8 2.57143 M ( routine "grid_refi) 136.8 S
+166.6 2.57143 M (ne") 21.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 84.9556 82.6641] concat
+newpath
+0 0 M 0 12 L 189.2 12 L 189.2 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+82.9556 80.6641 M 82.9556 96.6641 L 276.156 96.6641 L 276.156 80.6641 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 84.9556 82.6641] concat
+1 2.57143 M /Courier-Bold-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Call) 28.8 S
+/Courier-SHOWISO findfont 12 scalefont setfont
+29.8 2.57143 M ( routine "grid_coar) 136.8 S
+166.6 2.57143 M (se") 21.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 358.778 136.667] concat
+newpath
+0 0 M 0 12 L 146 12 L 146 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+356.778 134.667 M 356.778 150.667 L 506.778 150.667 L 506.778 134.667 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 358.778 136.667] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Did the grid change) 136.8 S
+137.8 2.57143 M (?) 7.2 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 340.778 76.6667] concat
+newpath
+0 0 M 0 24 L 182 24 L 182 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+338.778 74.6667 M 338.778 102.667 L 524.778 102.667 L 524.778 74.6667 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 340.778 76.6667] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Set grid change ind) 136.8 S
+137.8 14.5714 M (icator) 43.2 S
+58.6 2.57143 M 58.6 2.57143 M (to "true") 64.8 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 186.778 328.539] concat
+newpath
+0 0 M 0 12 L 23.6 12 L 23.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+184.778 326.539 M 184.778 342.539 L 212.378 342.539 L 212.378 326.539 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 186.778 328.539] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Yes) 21.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 287.111 366.766] concat
+newpath
+0 0 M 0 12 L 16.4 12 L 16.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+285.111 364.766 M 285.111 380.766 L 305.511 380.766 L 305.511 364.766 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 287.111 366.766] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (No) 14.4 S
+setmatrix
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+180 684.444 M
+180 665.556 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+180 630 M
+180 611.111 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+180 504.444 M
+180 485.556 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+180 450 M
+180 431.111 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+180 396.667 M
+180 377.778 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+180 342.222 M
+180 323.333 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+180 288.889 M
+180 270 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+180 234.444 M
+180 215.556 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+180 125.556 M
+180 106.667 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+431.111 178.889 M
+431.111 160 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+431.111 125.556 M
+431.111 106.667 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+180 71.1111 M
+180 52.2222 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+180 52.2222 M
+305.556 52.2222 L
+305.556 177.778 L
+431.429 177.619 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+180 180 M
+180 161.111 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+287.778 360 M
+296.667 360 L
+296.667 280 L
+180 280 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+287.778 251.111 M
+296.667 251.111 L
+296.667 171.111 L
+180 171.111 L
+stroke
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 286 258] concat
+newpath
+0 0 M 0 12 L 16.4 12 L 16.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+284 256 M 284 272 L 304.4 272 L 304.4 256 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 286 258] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (No) 14.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 185.5 219.5] concat
+newpath
+0 0 M 0 12 L 23.6 12 L 23.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+183.5 217.5 M 183.5 233.5 L 211.1 233.5 L 211.1 217.5 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 185.5 219.5] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Yes) 21.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 435 109.5] concat
+newpath
+0 0 M 0 12 L 23.6 12 L 23.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+433 107.5 M 433 123.5 L 460.6 123.5 L 460.6 107.5 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 435 109.5] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Yes) 21.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 539.5 148] concat
+newpath
+0 0 M 0 12 L 16.4 12 L 16.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+537.5 146 M 537.5 162 L 557.9 162 L 557.9 146 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 539.5 148] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (No) 14.4 S
+setmatrix
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+538.889 142.222 M
+547.778 142.222 L
+547.778 62.2222 L
+431.111 62.2222 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+431.111 71.1594 M
+431.111 52.2705 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+180 575.556 M
+180 567.778 L
+62.2222 567.778 L
+62.2222 647.778 L
+71.1111 647.778 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+287.778 647.778 M
+296.667 647.778 L
+296.667 548.889 L
+180 548.889 L
+180 540 L
+stroke
+grestore
+grestore
+showpage
+saveit restore
+grestore
+%%Page: label 2
+gsave
+newpath clippath pathbbox
+/URy exch def
+/URx exch def
+/LLy exch def
+/LLx exch def
+/Width  URx LLx sub 0.005 sub def
+/Height URy LLy sub 0.005 sub def
+LLx LLy translate
+Width 595 div Height 841 div gt
+    { /Y_size Height def
+      /X_size 595 841 div Y_size mul def
+      /Scale Height 841 div def }
+    { /X_size Width def
+      /Y_size 841 595 div X_size mul def
+      /Scale Width 595 div def } ifelse
+Width  X_size sub 2 div
+Height Y_size sub 2 div translate
+Scale Scale scale
+/saveit save def
+gsave
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 197.778 725.999] concat
+newpath
+0 0 M 0 18 L 210.8 18 L 210.8 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+195.778 723.999 M 195.778 745.999 L 410.578 745.999 L 410.578 723.999 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 197.778 725.999] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+0 0 0 setrgbcolor
+0 4 M (Refinement \(grid_re) 170.28 S
+170.28 4 M (fine\)) 38.52 S
+setmatrix
+grestore
+gsave
+0 0 0 setrgbcolor
+2.000000 setlinewidth
+newpath
+197.778 720 M
+408.578 720 L
+stroke
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 197.778 679.333] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 197.778 626] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+215.778 572.667 M
+197.778 554.667 L
+197.778 536.667 L
+413.778 536.667 L
+413.778 572.667 L
+closepath
+215.778 572.667 M
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+215.778 518.222 M
+197.778 500.222 L
+197.778 482.222 L
+413.778 482.222 L
+413.778 518.222 L
+closepath
+215.778 518.222 M
+stroke
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 197.778 463.778] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 197.778 320.444] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 197.778 267.111] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 218.378 655.333] concat
+newpath
+0 0 M 0 12 L 174.8 12 L 174.8 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+216.378 653.333 M 216.378 669.333 L 395.178 669.333 L 395.178 653.333 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 218.378 655.333] concat
+/Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+0 2.57143 M (Count elements to r) 136.8 S
+136.8 2.57143 M (efine) 36 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 203.978 596] concat
+newpath
+0 0 M 0 24 L 203.6 24 L 203.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+201.978 594 M 201.978 622 L 409.578 622 L 409.578 594 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 203.978 596] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (If there is somethi) 136.8 S
+137.8 14.5714 M (ng to do,) 64.8 S
+8.2 2.57143 M 8.2 2.57143 M (set "nonconforming") 136.8 S
+145 2.57143 M (=.TRUE.) 50.4 S
+setmatrix
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 197.778 392.667] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 225.578 542.667] concat
+newpath
+0 0 M 0 24 L 160.4 24 L 160.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+223.578 540.667 M 223.578 568.667 L 387.978 568.667 L 387.978 540.667 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 225.578 542.667] concat
+51.4 14.5714 M /Courier-Bold-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+51.4 14.5714 M (Do while) 57.6 S
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+1 2.57143 M ("nonconforming"=.TR) 136.8 S
+137.8 2.57143 M (UE.) 21.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 203.978 488.222] concat
+newpath
+0 0 M 0 24 L 203.6 24 L 203.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+201.978 486.222 M 201.978 514.222 L 409.578 514.222 L 409.578 486.222 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 203.978 488.222] concat
+4.6 14.5714 M /Courier-Bold-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+4.6 14.5714 M (For) 21.6 S
+/Courier-SHOWISO findfont 12 scalefont setfont
+26.2 14.5714 M ( all elements marke) 136.8 S
+163 14.5714 M (d for ) 43.2 S
+55 2.57143 M 55 2.57143 M (refinement ) 79.2 S
+/Courier-Bold-SHOWISO findfont 12 scalefont setfont
+134.2 2.57143 M (do) 14.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 200.378 439.777] concat
+newpath
+0 0 M 0 12 L 210.8 12 L 210.8 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+198.378 437.777 M 198.378 453.777 L 413.178 453.777 L 413.178 437.777 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 200.378 439.777] concat
+1 2.57143 M /Courier-Bold-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Call) 28.8 S
+/Courier-SHOWISO findfont 12 scalefont setfont
+29.8 2.57143 M ( routine "refine_el) 136.8 S
+166.6 2.57143 M (ement") 43.2 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 200.378 362.667] concat
+newpath
+0 0 M 0 24 L 210.8 24 L 210.8 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+198.378 360.667 M 198.378 388.667 L 413.178 388.667 L 413.178 360.667 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 200.378 362.667] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Check resulting tri) 136.8 S
+137.8 14.5714 M (angulation) 72 S
+22.6 2.57143 M 22.6 2.57143 M (result: "nonconform) 136.8 S
+159.4 2.57143 M (ing") 28.8 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 239.978 296.445] concat
+newpath
+0 0 M 0 12 L 131.6 12 L 131.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+237.978 294.445 M 237.978 310.445 L 373.578 310.445 L 373.578 294.445 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 239.978 296.445] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Set unique indices) 129.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 207.578 243.111] concat
+newpath
+0 0 M 0 12 L 196.4 12 L 196.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+205.578 241.111 M 205.578 257.111 L 405.978 257.111 L 405.978 241.111 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 207.578 243.111] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Update info on node) 136.8 S
+137.8 2.57143 M ( patches) 57.6 S
+setmatrix
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306.667 644.444 M
+306.667 626.667 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306.667 590 M
+306.667 572.222 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306.667 535.555 M
+306.667 517.778 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306.667 481.111 M
+306.667 463.333 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306.667 284.444 M
+306.667 266.667 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306.667 427.778 M
+306.667 418.889 L
+188.889 418.889 L
+188.889 500 L
+197.778 500 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+414.444 500 M
+423.333 500 L
+423.333 401.111 L
+306.667 401.111 L
+306.667 391.111 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306.667 356.667 M
+306.667 347.778 L
+180 347.778 L
+180 554.444 L
+197.778 554.444 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+414.444 554.444 M
+432.222 554.444 L
+432.222 328.889 L
+306.667 328.889 L
+306.667 320 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306.667 230 M
+306.667 212.222 L
+stroke
+grestore
+grestore
+showpage
+saveit restore
+grestore
+%%Page: label 3
+gsave
+newpath clippath pathbbox
+/URy exch def
+/URx exch def
+/LLy exch def
+/LLx exch def
+/Width  URx LLx sub 0.005 sub def
+/Height URy LLy sub 0.005 sub def
+LLx LLy translate
+Width 595 div Height 841 div gt
+    { /Y_size Height def
+      /X_size 595 841 div Y_size mul def
+      /Scale Height 841 div def }
+    { /X_size Width def
+      /Y_size 841 595 div X_size mul def
+      /Scale Width 595 div def } ifelse
+Width  X_size sub 2 div
+Height Y_size sub 2 div translate
+Scale Scale scale
+/saveit save def
+gsave
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 218.589 688.889] concat
+newpath
+0 0 M 0 18 L 176.6 18 L 176.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+216.589 686.889 M 216.589 708.889 L 397.189 708.889 L 397.189 686.889 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 218.589 688.889] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+0 0 0 setrgbcolor
+0 4 M (Check Triangulation) 174.6 S
+setmatrix
+grestore
+gsave
+0 0 0 setrgbcolor
+2.000000 setlinewidth
+newpath
+218.589 682.89 M
+395.189 682.89 L
+stroke
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 197.778 639.333] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+215.778 584.889 M
+197.778 566.889 L
+197.778 548.889 L
+413.778 548.889 L
+413.778 584.889 L
+closepath
+215.778 584.889 M
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+215.778 531.556 M
+197.778 513.556 L
+197.778 495.556 L
+413.778 495.556 L
+413.778 531.556 L
+closepath
+215.778 531.556 M
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+215.778 477.111 M
+197.778 459.111 L
+215.778 441.111 L
+395.778 441.111 L
+413.778 459.111 L
+395.778 477.111 L
+closepath
+215.778 477.111 M
+stroke
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 197.778 422.667] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 197.778 369.333] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306.667 603.333 M
+306.667 585.556 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306.667 548.889 M
+306.667 531.111 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306.667 494.444 M
+306.667 476.667 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306.667 440 M
+306.667 422.222 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306.667 385.556 M
+306.667 367.778 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306.667 333.333 M
+306.667 324.444 L
+188.889 324.444 L
+188.889 513.333 L
+197.778 513.333 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+197.778 458.889 M
+188.889 458.889 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+414.444 513.333 M
+423.333 513.333 L
+423.333 315.556 L
+180 315.556 L
+180 566.667 L
+197.778 566.667 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+414.444 566.667 M
+432.222 566.667 L
+432.222 306.667 L
+306.667 306.667 L
+306.667 296.667 L
+stroke
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 211.178 609.333] concat
+newpath
+0 0 M 0 24 L 189.2 24 L 189.2 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+209.178 607.333 M 209.178 635.333 L 402.378 635.333 L 402.378 607.333 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 211.178 609.333] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Initialize "nonconf) 136.8 S
+137.8 14.5714 M (orming") 50.4 S
+62.2 2.57143 M 62.2 2.57143 M (\(.FALSE.\)) 64.8 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 218.378 554.889] concat
+newpath
+0 0 M 0 24 L 174.8 24 L 174.8 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+216.378 552.889 M 216.378 580.889 L 395.178 580.889 L 395.178 552.889 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 218.378 554.889] concat
+4.6 14.5714 M /Courier-Bold-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+4.6 14.5714 M (For) 21.6 S
+/Courier-SHOWISO findfont 12 scalefont setfont
+26.2 14.5714 M ( all elements of th) 136.8 S
+163 14.5714 M (e ) 14.4 S
+33.4 2.57143 M 33.4 2.57143 M (finest level ) 93.6 S
+/Courier-Bold-SHOWISO findfont 12 scalefont setfont
+127 2.57143 M (do) 14.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 232.778 501.556] concat
+newpath
+0 0 M 0 24 L 146 24 L 146 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+230.778 499.556 M 230.778 527.556 L 380.778 527.556 L 380.778 499.556 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 232.778 501.556] concat
+1 14.5714 M /Courier-Bold-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (For) 21.6 S
+/Courier-SHOWISO findfont 12 scalefont setfont
+22.6 14.5714 M ( all edges of the) 122.4 S
+37 2.57143 M 37 2.57143 M (element ) 57.6 S
+/Courier-Bold-SHOWISO findfont 12 scalefont setfont
+94.6 2.57143 M (do) 14.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 229.178 453.112] concat
+newpath
+0 0 M 0 12 L 153.2 12 L 153.2 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+227.178 451.112 M 227.178 467.112 L 384.378 467.112 L 384.378 451.112 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 229.178 453.112] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Is this edge refine) 136.8 S
+137.8 2.57143 M (d?) 14.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 313.444 427.431] concat
+newpath
+0 0 M 0 12 L 23.6 12 L 23.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+311.444 425.431 M 311.444 441.431 L 339.044 441.431 L 339.044 425.431 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 313.444 427.431] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Yes) 21.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 192.333 468.54] concat
+newpath
+0 0 M 0 12 L 16.4 12 L 16.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+190.333 466.54 M 190.333 482.54 L 210.733 482.54 L 210.733 466.54 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 192.333 468.54] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (No) 14.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 211.178 392.667] concat
+newpath
+0 0 M 0 24 L 189.2 24 L 189.2 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+209.178 390.667 M 209.178 418.667 L 402.378 418.667 L 402.378 390.667 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 211.178 392.667] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Mark corresponding ) 136.8 S
+137.8 14.5714 M (element) 50.4 S
+44.2 2.57143 M 44.2 2.57143 M (for refinement) 100.8 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 211.178 345.333] concat
+newpath
+0 0 M 0 12 L 189.2 12 L 189.2 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+209.178 343.333 M 209.178 359.333 L 402.378 359.333 L 402.378 343.333 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 211.178 345.333] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Set "nonconforming") 136.8 S
+137.8 2.57143 M (=.TRUE.) 50.4 S
+setmatrix
+grestore
+grestore
+showpage
+saveit restore
+grestore
+%%Page: label 4
+gsave
+newpath clippath pathbbox
+/URy exch def
+/URx exch def
+/LLy exch def
+/LLx exch def
+/Width  URx LLx sub 0.005 sub def
+/Height URy LLy sub 0.005 sub def
+LLx LLy translate
+Width 595 div Height 841 div gt
+    { /Y_size Height def
+      /X_size 595 841 div Y_size mul def
+      /Scale Height 841 div def }
+    { /X_size Width def
+      /Y_size 841 595 div X_size mul def
+      /Scale Width 595 div def } ifelse
+Width  X_size sub 2 div
+Height Y_size sub 2 div translate
+Scale Scale scale
+/saveit save def
+gsave
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 193.718 740.001] concat
+newpath
+0 0 M 0 18 L 224.12 18 L 224.12 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+191.718 738.001 M 191.718 760.001 L 419.838 760.001 L 419.838 738.001 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 193.718 740.001] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+0 0 0 setrgbcolor
+0 4 M (Coarsening \(grid_co) 178.2 S
+178.2 4 M (arse\)) 43.92 S
+setmatrix
+grestore
+gsave
+0 0 0 setrgbcolor
+2.000000 setlinewidth
+newpath
+193.718 734.001 M
+417.838 734.001 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+209.778 617.778 M
+204.528 618.528 L
+200.778 620.778 L
+198.528 624.528 L
+197.778 629.778 L
+197.778 629.778 L
+197.778 631.232 L
+197.778 633.961 L
+197.778 637.2 L
+197.778 640.184 L
+197.778 642.148 L
+197.778 642.444 L
+197.778 642.444 L
+198.528 647.694 L
+200.778 651.444 L
+204.528 653.694 L
+209.778 654.444 L
+209.778 654.444 L
+210.421 654.444 L
+212.117 654.444 L
+214.795 654.444 L
+218.385 654.444 L
+222.815 654.444 L
+228.015 654.444 L
+233.915 654.445 L
+240.444 654.444 L
+247.532 654.444 L
+255.108 654.444 L
+263.102 654.444 L
+271.442 654.444 L
+280.058 654.444 L
+288.881 654.444 L
+297.839 654.444 L
+306.861 654.444 L
+315.878 654.444 L
+324.818 654.444 L
+333.611 654.444 L
+342.187 654.444 L
+350.474 654.444 L
+358.403 654.444 L
+365.903 654.444 L
+372.903 654.444 L
+379.332 654.444 L
+385.121 654.444 L
+390.199 654.444 L
+394.494 654.444 L
+397.937 654.444 L
+400.456 654.444 L
+401.983 654.444 L
+402.444 654.444 L
+402.444 654.444 L
+407.694 653.694 L
+411.444 651.444 L
+413.694 647.694 L
+414.444 642.444 L
+414.444 642.444 L
+414.444 640.99 L
+414.444 638.261 L
+414.444 635.022 L
+414.444 632.038 L
+414.444 630.074 L
+414.444 629.778 L
+414.444 629.778 L
+413.694 624.528 L
+411.444 620.778 L
+407.694 618.528 L
+402.444 617.778 L
+402.444 617.778 L
+401.807 617.778 L
+400.127 617.778 L
+397.475 617.778 L
+393.92 617.778 L
+389.531 617.778 L
+384.379 617.778 L
+378.531 617.778 L
+372.059 617.778 L
+365.031 617.778 L
+357.517 617.778 L
+349.586 617.778 L
+341.308 617.778 L
+332.752 617.778 L
+323.987 617.778 L
+315.084 617.778 L
+306.111 617.778 L
+297.138 617.778 L
+288.235 617.778 L
+279.471 617.778 L
+270.914 617.778 L
+262.636 617.778 L
+254.705 617.778 L
+247.191 617.778 L
+240.163 617.778 L
+233.691 617.778 L
+227.844 617.778 L
+222.691 617.778 L
+218.303 617.778 L
+214.747 617.778 L
+212.095 617.778 L
+210.416 617.778 L
+209.778 617.778 L
+closepath
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+215.778 708.222 M
+197.778 690.222 L
+197.778 672.222 L
+413.778 672.222 L
+413.778 708.222 L
+closepath
+215.778 708.222 M
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+215.778 582.667 M
+197.778 564.667 L
+215.778 546.667 L
+395.778 546.667 L
+413.778 564.667 L
+395.778 582.667 L
+closepath
+215.778 582.667 M
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+215.778 528.222 M
+197.778 510.222 L
+197.778 492.222 L
+413.778 492.222 L
+413.778 528.222 L
+closepath
+215.778 528.222 M
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+215.778 473.778 M
+197.778 455.778 L
+215.778 437.778 L
+395.778 437.778 L
+413.778 455.778 L
+395.778 473.778 L
+closepath
+215.778 473.778 M
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+215.778 420.444 M
+197.778 402.444 L
+197.778 384.444 L
+413.778 384.444 L
+413.778 420.444 L
+closepath
+215.778 420.444 M
+stroke
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 197.778 366] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 197.778 293.778] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 197.778 222.667] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 197.778 114.889] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 -232.222 -452.889] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 197.778 168.222] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306.667 672.222 M
+306.667 654.444 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306.667 545.556 M
+306.667 527.778 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306.667 492.222 M
+306.667 474.444 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306.667 438.889 M
+306.667 421.111 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306.667 385.556 M
+306.667 367.778 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306.667 185.556 M
+306.667 167.778 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306.667 132.222 M
+306.667 114.444 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+180 -127.778 M
+180 -145.556 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306.667 77.7778 M
+306.667 60 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306.667 617.778 M
+306.667 608.889 L
+188.889 608.889 L
+188.889 690 L
+196.667 690 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+414.444 690 M
+423.333 690 L
+423.333 591.111 L
+306.667 591.111 L
+306.667 582.222 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306.667 330 M
+306.667 321.111 L
+188.889 321.111 L
+188.889 402.222 L
+197.778 402.222 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+414.444 402.222 M
+423.333 402.222 L
+423.333 303.333 L
+306.667 303.333 L
+306.667 294.444 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306.667 257.778 M
+306.667 248.889 L
+180 248.889 L
+180 510 L
+197.778 510 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+414.444 510 M
+432.222 510 L
+432.222 231.111 L
+306.667 231.111 L
+306.667 222.222 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+414.444 565.556 M
+441.111 565.556 L
+441.111 68.8889 L
+306.667 68.8889 L
+stroke
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 218.378 678.222] concat
+newpath
+0 0 M 0 24 L 174.8 24 L 174.8 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+216.378 676.222 M 216.378 704.222 L 395.178 704.222 L 395.178 676.222 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 218.378 678.222] concat
+4.6 14.5714 M /Courier-Bold-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+4.6 14.5714 M (For) 21.6 S
+/Courier-SHOWISO findfont 12 scalefont setfont
+26.2 14.5714 M ( all elements of th) 136.8 S
+163 14.5714 M (e ) 14.4 S
+33.4 2.57143 M 33.4 2.57143 M (finest level ) 93.6 S
+/Courier-Bold-SHOWISO findfont 12 scalefont setfont
+127 2.57143 M (do) 14.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 207.911 624.111] concat
+newpath
+0 0 M 0 24 L 196.4 24 L 196.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+205.911 622.111 M 205.911 650.111 L 406.311 650.111 L 406.311 622.111 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 207.911 624.111] concat
+/Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+0 14.5714 M (Find resolvable pat) 136.8 S
+136.8 14.5714 M (ches and) 57.6 S
+8.2 2.57143 M 8.2 2.57143 M (mark edges for coar) 136.8 S
+145 2.57143 M (sening) 43.2 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 232.778 552.667] concat
+newpath
+0 0 M 0 24 L 146 24 L 146 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+230.778 550.667 M 230.778 578.667 L 380.778 578.667 L 380.778 550.667 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 232.778 552.667] concat
+/Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+0 14.5714 M (Are there resolvabl) 136.8 S
+136.8 14.5714 M (e) 7.2 S
+44.2 2.57143 M 44.2 2.57143 M (patches?) 57.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 415.667 570.76] concat
+newpath
+0 0 M 0 12 L 16.4 12 L 16.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+413.667 568.76 M 413.667 584.76 L 434.067 584.76 L 434.067 568.76 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 415.667 570.76] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (No) 14.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 311.222 531.87] concat
+newpath
+0 0 M 0 12 L 23.6 12 L 23.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+309.222 529.87 M 309.222 545.87 L 336.822 545.87 L 336.822 529.87 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 311.222 531.87] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Yes) 21.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 247.178 504.223] concat
+newpath
+0 0 M 0 12 L 117.2 12 L 117.2 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+245.178 502.223 M 245.178 518.223 L 366.378 518.223 L 366.378 502.223 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 247.178 504.223] concat
+1 2.57143 M /Courier-Bold-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (For) 21.6 S
+/Courier-SHOWISO findfont 12 scalefont setfont
+22.6 2.57143 M ( all edges ) 79.2 S
+/Courier-Bold-SHOWISO findfont 12 scalefont setfont
+101.8 2.57143 M (do) 14.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 239.978 443.777] concat
+newpath
+0 0 M 0 24 L 131.6 24 L 131.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+237.978 441.777 M 237.978 469.777 L 373.578 469.777 L 373.578 441.777 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 239.978 443.777] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Is edge marked for) 129.6 S
+26.2 2.57143 M 26.2 2.57143 M (coarsening?) 79.2 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 312.333 426.315] concat
+newpath
+0 0 M 0 12 L 23.6 12 L 23.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+310.333 424.315 M 310.333 440.315 L 337.933 440.315 L 337.933 424.315 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 312.333 426.315] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Yes) 21.6 S
+setmatrix
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+180 456.667 M
+197.778 456.667 L
+stroke
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 183.444 462.987] concat
+newpath
+0 0 M 0 12 L 16.4 12 L 16.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+181.444 460.987 M 181.444 476.987 L 201.844 476.987 L 201.844 460.987 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 183.444 462.987] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (No) 14.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 214.778 390.444] concat
+newpath
+0 0 M 0 24 L 182 24 L 182 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+212.778 388.444 M 212.778 416.444 L 398.778 416.444 L 398.778 388.444 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 214.778 390.444] concat
+1 14.5714 M /Courier-Bold-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (For) 21.6 S
+/Courier-SHOWISO findfont 12 scalefont setfont
+22.6 14.5714 M ( all elements corre) 136.8 S
+159.4 14.5714 M (sp.) 21.6 S
+37 2.57143 M 37 2.57143 M (to this edge ) 93.6 S
+/Courier-Bold-SHOWISO findfont 12 scalefont setfont
+130.6 2.57143 M (do) 14.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 200.378 342] concat
+newpath
+0 0 M 0 12 L 210.8 12 L 210.8 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+198.378 340 M 198.378 356 L 413.178 356 L 413.178 340 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 200.378 342] concat
+1 2.57143 M /Courier-Bold-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Call) 28.8 S
+/Courier-SHOWISO findfont 12 scalefont setfont
+29.8 2.57143 M ( routine "coarse_el) 136.8 S
+166.6 2.57143 M (ement") 43.2 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 211.178 269.778] concat
+newpath
+0 0 M 0 12 L 189.2 12 L 189.2 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+209.178 267.778 M 209.178 283.778 L 402.378 283.778 L 402.378 267.778 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 211.178 269.778] concat
+1 2.57143 M /Courier-Bold-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Call) 28.8 S
+/Courier-SHOWISO findfont 12 scalefont setfont
+29.8 2.57143 M ( routine "coarse_ed) 136.8 S
+166.6 2.57143 M (ge") 21.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 243.578 192.667] concat
+newpath
+0 0 M 0 24 L 124.4 24 L 124.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+241.578 190.667 M 241.578 218.667 L 369.978 218.667 L 369.978 190.667 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 243.578 192.667] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Remove obsolecent) 122.4 S
+19 2.57143 M 19 2.57143 M (grid objects) 86.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 239.978 144.222] concat
+newpath
+0 0 M 0 12 L 131.6 12 L 131.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+237.978 142.222 M 237.978 158.222 L 373.578 158.222 L 373.578 142.222 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 239.978 144.222] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Set unique indices) 129.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 207.578 90.8889] concat
+newpath
+0 0 M 0 12 L 196.4 12 L 196.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+205.578 88.8889 M 205.578 104.889 L 405.978 104.889 L 405.978 88.8889 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 207.578 90.8889] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Update info on node) 136.8 S
+137.8 2.57143 M ( patches) 57.6 S
+setmatrix
+grestore
+grestore
+showpage
+saveit restore
+grestore
+%%Page: label 5
+gsave
+newpath clippath pathbbox
+/URy exch def
+/URx exch def
+/LLy exch def
+/LLx exch def
+/Width  URx LLx sub 0.005 sub def
+/Height URy LLy sub 0.005 sub def
+LLx LLy translate
+Width 595 div Height 841 div gt
+    { /Y_size Height def
+      /X_size 595 841 div Y_size mul def
+      /Scale Height 841 div def }
+    { /X_size Width def
+      /Y_size 841 595 div X_size mul def
+      /Scale Width 595 div def } ifelse
+Width  X_size sub 2 div
+Height Y_size sub 2 div translate
+Scale Scale scale
+/saveit save def
+gsave
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 67.2222 763.75] concat
+newpath
+0 0 M 0 18 L 224.12 18 L 224.12 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+65.2222 761.75 M 65.2222 783.75 L 293.342 783.75 L 293.342 761.75 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 67.2222 763.75] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+0 0 0 setrgbcolor
+0 4 M (Coarsening \(grid_co) 178.2 S
+178.2 4 M (arse\)) 43.92 S
+setmatrix
+grestore
+gsave
+0 0 0 setrgbcolor
+2.000000 setlinewidth
+newpath
+67.2222 757.75 M
+291.342 757.75 L
+stroke
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 69.2562 732.284] concat
+newpath
+0 0 M 0 18 L 220.052 18 L 220.052 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+67.2562 730.284 M 67.2562 752.284 L 291.308 752.284 L 291.308 730.284 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 69.2562 732.284] concat
+1 4.23529 M /AvantGarde-Book-SHOWISO findfont 18 scalefont setfont
+0 0 0 setrgbcolor
+1 4.23529 M ("Find resolvable pa) 165.078 S
+166.078 4.23529 M (tches") 52.974 S
+setmatrix
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+74.1111 725.306 M
+56.1111 707.306 L
+74.1111 689.306 L
+254.111 689.306 L
+272.111 707.306 L
+254.111 725.306 L
+closepath
+74.1111 725.306 M
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+74.1111 681.972 M
+56.1111 663.972 L
+74.1111 645.972 L
+254.111 645.972 L
+272.111 663.972 L
+254.111 681.972 L
+closepath
+74.1111 681.972 M
+stroke
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 56.1111 635.306] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+74.1111 590.861 M
+56.1111 572.861 L
+74.1111 554.861 L
+254.111 554.861 L
+272.111 572.861 L
+254.111 590.861 L
+closepath
+74.1111 590.861 M
+stroke
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 56.1111 545.306] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+74.1111 500.861 M
+56.1111 482.861 L
+74.1111 464.861 L
+254.111 464.861 L
+272.111 482.861 L
+254.111 500.861 L
+closepath
+74.1111 500.861 M
+stroke
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 20.5556 455.306] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 56.1111 410.861] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+363 410.861 M
+345 392.861 L
+363 374.861 L
+543 374.861 L
+561 392.861 L
+543 410.861 L
+closepath
+363 410.861 M
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+74.1111 365.306 M
+56.1111 347.306 L
+74.1111 329.306 L
+254.111 329.306 L
+272.111 347.306 L
+254.111 365.306 L
+closepath
+74.1111 365.306 M
+stroke
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 38.3333 320.861] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 56.1111 275.306] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+74.1111 230.861 M
+56.1111 212.861 L
+74.1111 194.861 L
+254.111 194.861 L
+272.111 212.861 L
+254.111 230.861 L
+closepath
+74.1111 230.861 M
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+74.1111 185.306 M
+56.1111 167.306 L
+74.1111 149.306 L
+254.111 149.306 L
+272.111 167.306 L
+254.111 185.306 L
+closepath
+74.1111 185.306 M
+stroke
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 56.1111 140.861] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 345 365.306] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+363 320.861 M
+345 302.861 L
+363 284.861 L
+543 284.861 L
+561 302.861 L
+543 320.861 L
+closepath
+363 320.861 M
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+363 275.306 M
+345 257.306 L
+363 239.306 L
+543 239.306 L
+561 257.306 L
+543 275.306 L
+closepath
+363 275.306 M
+stroke
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 345 230.861] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 200.556 86.4167] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+165 689.306 M
+165 681.451 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+165 645.551 M
+165 635.972 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+165 599.727 M
+165 590.838 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+165 554.593 M
+165 545.704 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+165.345 509.459 M
+165.345 500.57 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+165 374.401 M
+165 365.512 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+165 239.344 M
+165 230.455 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+165 194.555 M
+165 185.666 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+165 149.765 M
+165 140.876 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+453.333 239.305 M
+453.333 230.417 L
+stroke
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 83.9111 695.306] concat
+newpath
+0 0 M 0 24 L 160.4 24 L 160.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+81.9111 693.306 M 81.9111 721.306 L 246.311 721.306 L 246.311 693.306 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 83.9111 695.306] concat
+4.6 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+4.6 14.5714 M (Is the element mark) 136.8 S
+141.4 14.5714 M (ed ) 21.6 S
+26.2 2.57143 M 26.2 2.57143 M (for coarsening?) 108 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 170.667 678.953] concat
+newpath
+0 0 M 0 12 L 23.6 12 L 23.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+168.667 676.953 M 168.667 692.953 L 196.267 692.953 L 196.267 676.953 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 170.667 678.953] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Yes) 21.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 272.889 715.625] concat
+newpath
+0 0 M 0 12 L 16.4 12 L 16.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+270.889 713.625 M 270.889 729.625 L 291.289 729.625 L 291.289 713.625 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 272.889 715.625] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (No) 14.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 83.9111 651.971] concat
+newpath
+0 0 M 0 24 L 160.4 24 L 160.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+81.9111 649.971 M 81.9111 677.971 L 246.311 677.971 L 246.311 649.971 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 83.9111 651.971] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Is the element not ) 136.8 S
+137.8 14.5714 M (too) 21.6 S
+26.2 2.57143 M 26.2 2.57143 M (coarse already?) 108 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 171.778 635.625] concat
+newpath
+0 0 M 0 12 L 23.6 12 L 23.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+169.778 633.625 M 169.778 649.625 L 197.378 649.625 L 197.378 633.625 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 171.778 635.625] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Yes) 21.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 272.889 672.289] concat
+newpath
+0 0 M 0 12 L 16.4 12 L 16.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+270.889 670.289 M 270.889 686.289 L 291.289 686.289 L 291.289 670.289 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 272.889 672.289] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (No) 14.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 83.9111 611.307] concat
+newpath
+0 0 M 0 12 L 160.4 12 L 160.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+81.9111 609.307 M 81.9111 625.307 L 246.311 625.307 L 246.311 609.307 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 83.9111 611.307] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Find mother and sis) 136.8 S
+137.8 2.57143 M (ter) 21.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 91.1111 560.861] concat
+newpath
+0 0 M 0 24 L 146 24 L 146 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+89.1111 558.861 M 89.1111 586.861 L 239.111 586.861 L 239.111 558.861 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 91.1111 560.861] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Is the sister marke) 136.8 S
+137.8 14.5714 M (d) 7.2 S
+19 2.57143 M 19 2.57143 M (for coarsening?) 108 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 171.778 545.625] concat
+newpath
+0 0 M 0 12 L 23.6 12 L 23.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+169.778 543.625 M 169.778 559.625 L 197.378 559.625 L 197.378 543.625 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 171.778 545.625] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Yes) 21.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 272.889 577.844] concat
+newpath
+0 0 M 0 12 L 16.4 12 L 16.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+270.889 575.844 M 270.889 591.844 L 291.289 591.844 L 291.289 575.844 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 272.889 577.844] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (No) 14.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 105.511 521.306] concat
+newpath
+0 0 M 0 12 L 117.2 12 L 117.2 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+103.511 519.306 M 103.511 535.306 L 224.711 535.306 L 224.711 519.306 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 105.511 521.306] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Find marked edge) 115.2 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 76.7111 476.862] concat
+newpath
+0 0 M 0 12 L 174.8 12 L 174.8 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+74.7111 474.862 M 74.7111 490.862 L 253.511 490.862 L 253.511 474.862 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 76.7111 476.862] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (What type of edge i) 136.8 S
+137.8 2.57143 M (s it?) 36 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 51.7778 454.513] concat
+newpath
+0 0 M 0 12 L 59.6 12 L 59.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+49.7778 452.513 M 49.7778 468.513 L 113.378 468.513 L 113.378 452.513 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 51.7778 454.513] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Boundary) 57.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 249.556 454.514] concat
+newpath
+0 0 M 0 12 L 124.4 12 L 124.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+247.556 452.514 M 247.556 468.514 L 375.956 468.514 L 375.956 452.514 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 249.556 454.514] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Periodic boundary) 122.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 457.333 454.514] concat
+newpath
+0 0 M 0 12 L 38 12 L 38 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+455.333 452.514 M 455.333 468.514 L 497.333 468.514 L 497.333 452.514 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 457.333 454.514] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Inner) 36 S
+setmatrix
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+56.1111 481.528 M
+38.3333 481.528 L
+38.3333 454.861 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+245 464.861 M
+245 410.417 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+272.778 482.639 M
+452.778 482.639 L
+452.778 410.417 L
+stroke
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 26.7556 425.305] concat
+newpath
+0 0 M 0 24 L 203.6 24 L 203.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+24.7556 423.305 M 24.7556 451.305 L 232.356 451.305 L 232.356 423.305 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 26.7556 425.305] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Resolvable patch fo) 136.8 S
+137.8 14.5714 M (und, mark) 64.8 S
+1 2.57143 M 1 2.57143 M (and countedge for c) 136.8 S
+137.8 2.57143 M (oarsening) 64.8 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 44.5334 290.861] concat
+newpath
+0 0 M 0 24 L 203.6 24 L 203.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+42.5334 288.861 M 42.5334 316.861 L 250.133 316.861 L 250.133 288.861 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 44.5334 290.861] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Resolvable patch fo) 136.8 S
+137.8 14.5714 M (und, mark) 64.8 S
+1 2.57143 M 1 2.57143 M (and countedge for c) 136.8 S
+137.8 2.57143 M (oarsening) 64.8 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 69.5111 386.861] concat
+newpath
+0 0 M 0 12 L 189.2 12 L 189.2 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+67.5111 384.861 M 67.5111 400.861 L 260.711 400.861 L 260.711 384.861 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 69.5111 386.861] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Find periodic partn) 136.8 S
+137.8 2.57143 M (er edge) 50.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 69.5111 335.306] concat
+newpath
+0 0 M 0 24 L 189.2 24 L 189.2 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+67.5111 333.306 M 67.5111 361.306 L 260.711 361.306 L 260.711 333.306 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 69.5111 335.306] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Is periodic partner) 136.8 S
+137.8 14.5714 M ( marked) 50.4 S
+40.6 2.57143 M 40.6 2.57143 M (for coarsening?) 108 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 44 355.625] concat
+newpath
+0 0 M 0 12 L 23.6 12 L 23.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+42 353.625 M 42 369.625 L 69.6 369.625 L 69.6 353.625 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 44 355.625] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Yes) 21.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 267.333 355.625] concat
+newpath
+0 0 M 0 12 L 16.4 12 L 16.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+265.333 353.625 M 265.333 369.625 L 285.733 369.625 L 285.733 353.625 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 267.333 355.625] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (No) 14.4 S
+setmatrix
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+56.1111 347.083 M
+47.2222 347.083 L
+47.2222 320.417 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+272.778 347.083 M
+272.778 274.861 L
+stroke
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 87.5111 245.305] concat
+newpath
+0 0 M 0 24 L 153.2 24 L 153.2 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+85.5111 243.305 M 85.5111 271.305 L 242.711 271.305 L 242.711 243.305 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 87.5111 245.305] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Find neighbor and h) 136.8 S
+137.8 14.5714 M (is) 14.4 S
+4.6 2.57143 M 4.6 2.57143 M (children \("cousins") 136.8 S
+141.4 2.57143 M (\)) 7.2 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 91.1111 200.861] concat
+newpath
+0 0 M 0 24 L 146 24 L 146 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+89.1111 198.861 M 89.1111 226.861 L 239.111 226.861 L 239.111 198.861 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 91.1111 200.861] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Are both cousins NO) 136.8 S
+137.8 14.5714 M (T) 7.2 S
+44.2 2.57143 M 44.2 2.57143 M (refined?) 57.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 80.3111 155.306] concat
+newpath
+0 0 M 0 24 L 167.6 24 L 167.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+78.3111 153.306 M 78.3111 181.306 L 249.911 181.306 L 249.911 153.306 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 80.3111 155.306] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Is at least one of ) 136.8 S
+137.8 14.5714 M (them) 28.8 S
+4.60001 2.57143 M 4.60001 2.57143 M (marked for coarseni) 136.8 S
+141.4 2.57143 M (ng?) 21.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 62.3111 110.861] concat
+newpath
+0 0 M 0 24 L 203.6 24 L 203.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+60.3111 108.861 M 60.3111 136.861 L 267.911 136.861 L 267.911 108.861 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 62.3111 110.861] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Resolvable patch fo) 136.8 S
+137.8 14.5714 M (und, mark) 64.8 S
+1 2.57143 M 1 2.57143 M (and countedge for c) 136.8 S
+137.8 2.57143 M (oarsening) 64.8 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 376.4 335.305] concat
+newpath
+0 0 M 0 24 L 153.2 24 L 153.2 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+374.4 333.305 M 374.4 361.305 L 531.6 361.305 L 531.6 333.305 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 376.4 335.305] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Find neighbor and h) 136.8 S
+137.8 14.5714 M (is) 14.4 S
+4.6 2.57143 M 4.6 2.57143 M (children \("cousins") 136.8 S
+141.4 2.57143 M (\)) 7.2 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 380 290.861] concat
+newpath
+0 0 M 0 24 L 146 24 L 146 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+378 288.861 M 378 316.861 L 528 316.861 L 528 288.861 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 380 290.861] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Are both cousins NO) 136.8 S
+137.8 14.5714 M (T) 7.2 S
+44.2 2.57143 M 44.2 2.57143 M (refined?) 57.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 369.2 245.306] concat
+newpath
+0 0 M 0 24 L 167.6 24 L 167.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+367.2 243.306 M 367.2 271.306 L 538.8 271.306 L 538.8 243.306 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 369.2 245.306] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Is at least one of ) 136.8 S
+137.8 14.5714 M (them) 28.8 S
+4.60001 2.57143 M 4.60001 2.57143 M (marked for coarseni) 136.8 S
+141.4 2.57143 M (ng?) 21.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 351.2 200.861] concat
+newpath
+0 0 M 0 24 L 203.6 24 L 203.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+349.2 198.861 M 349.2 226.861 L 556.8 226.861 L 556.8 198.861 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 351.2 200.861] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Resolvable patch fo) 136.8 S
+137.8 14.5714 M (und, mark) 64.8 S
+1 2.57143 M 1 2.57143 M (and countedge for c) 136.8 S
+137.8 2.57143 M (oarsening) 64.8 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 376.4 386.862] concat
+newpath
+0 0 M 0 12 L 153.2 12 L 153.2 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+374.4 384.862 M 374.4 400.862 L 531.6 400.862 L 531.6 384.862 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 376.4 386.862] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Edge not refined ye) 136.8 S
+137.8 2.57143 M (t?) 14.4 S
+setmatrix
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+452.778 373.75 M
+452.778 364.861 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+452.778 328.961 M
+452.778 320.072 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+452.778 284.171 M
+452.778 275.283 L
+stroke
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 242.756 56.4167] concat
+newpath
+0 0 M 0 24 L 131.6 24 L 131.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+240.756 54.4167 M 240.756 82.4167 L 376.356 82.4167 L 376.356 54.4167 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 242.756 56.4167] concat
+26.2 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+26.2 14.5714 M (Reset mark,) 79.2 S
+1 2.57143 M 1 2.57143 M (nothing to be done) 129.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 169.797 184.321] concat
+newpath
+0 0 M 0 12 L 23.6 12 L 23.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+167.797 182.321 M 167.797 198.321 L 195.397 198.321 L 195.397 182.321 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 169.797 184.321] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Yes) 21.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 169.797 139.306] concat
+newpath
+0 0 M 0 12 L 23.6 12 L 23.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+167.797 137.306 M 167.797 153.306 L 195.397 153.306 L 195.397 137.306 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 169.797 139.306] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Yes) 21.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 458.333 273.75] concat
+newpath
+0 0 M 0 12 L 23.6 12 L 23.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+456.333 271.75 M 456.333 287.75 L 483.933 287.75 L 483.933 271.75 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 458.333 273.75] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Yes) 21.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 458.333 229.306] concat
+newpath
+0 0 M 0 12 L 23.6 12 L 23.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+456.333 227.306 M 456.333 243.306 L 483.933 243.306 L 483.933 227.306 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 458.333 229.306] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Yes) 21.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 272.889 220.07] concat
+newpath
+0 0 M 0 12 L 16.4 12 L 16.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+270.889 218.07 M 270.889 234.07 L 291.289 234.07 L 291.289 218.07 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 272.889 220.07] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (No) 14.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 270.556 174.861] concat
+newpath
+0 0 M 0 12 L 16.4 12 L 16.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+268.556 172.861 M 268.556 188.861 L 288.956 188.861 L 288.956 172.861 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 270.556 174.861] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (No) 14.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 556.111 309.306] concat
+newpath
+0 0 M 0 12 L 16.4 12 L 16.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+554.111 307.306 M 554.111 323.306 L 574.511 323.306 L 574.511 307.306 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 556.111 309.306] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (No) 14.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 556.111 264.861] concat
+newpath
+0 0 M 0 12 L 16.4 12 L 16.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+554.111 262.861 M 554.111 278.861 L 574.511 278.861 L 574.511 262.861 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 556.111 264.861] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (No) 14.4 S
+setmatrix
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+569.444 707.083 M
+569.444 104.861 L
+308.333 104.861 L
+308.333 85.9722 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+272.778 707.083 M
+569.444 707.083 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+272.778 662.639 M
+569.444 662.639 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+272.778 572.639 M
+569.444 572.639 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+273.889 212.639 M
+290.556 212.639 L
+290.556 167.083 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+273.889 167.083 M
+570.556 167.083 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+560.556 257.083 M
+569.444 257.083 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+560.556 302.639 M
+569.444 302.639 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+307.222 41.5278 M
+29.4444 41.5278 L
+29.4444 419.306 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+47.2222 284.861 M
+47.2222 41.5278 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+165 104.861 M
+165 41.5278 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+308.333 49.3056 M
+308.333 33.75 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+452.778 194.861 M
+452.778 170.417 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+452.778 163.75 M
+452.778 109.306 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+452.778 100.417 M
+452.778 41.5278 L
+308.333 41.5278 L
+stroke
+grestore
+grestore
+showpage
+saveit restore
+grestore
+%%Page: label 6
+gsave
+newpath clippath pathbbox
+/URy exch def
+/URx exch def
+/LLy exch def
+/LLx exch def
+/Width  URx LLx sub 0.005 sub def
+/Height URy LLy sub 0.005 sub def
+LLx LLy translate
+Width 595 div Height 841 div gt
+    { /Y_size Height def
+      /X_size 595 841 div Y_size mul def
+      /Scale Height 841 div def }
+    { /X_size Width def
+      /Y_size 841 595 div X_size mul def
+      /Scale Width 595 div def } ifelse
+Width  X_size sub 2 div
+Height Y_size sub 2 div translate
+Scale Scale scale
+/saveit save def
+gsave
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+216.889 736 M
+198.889 718 L
+216.889 700 L
+396.889 700 L
+414.889 718 L
+396.889 736 L
+closepath
+216.889 736 M
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+90.2222 690.444 M
+72.2222 672.444 L
+90.2222 654.444 L
+270.222 654.444 L
+288.222 672.444 L
+270.222 690.444 L
+closepath
+90.2222 690.444 M
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+341.333 690.444 M
+323.333 672.444 L
+341.333 654.444 L
+521.333 654.444 L
+539.333 672.444 L
+521.333 690.444 L
+closepath
+341.333 690.444 M
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+71.3333 646 M
+53.3333 628 L
+71.3333 610 L
+251.333 610 L
+269.333 628 L
+251.333 646 L
+closepath
+71.3333 646 M
+stroke
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 35.5556 600.444] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 53.3333 556] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 53.3333 511.556] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 53.3333 467.111] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 53.3333 422.667] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 53.3334 377.111] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 71.1111 330.444] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 71.1111 284.889] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 71.1111 239.333] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 71.1111 193.778] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 305.556 646] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 305.556 600.444] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 226.689 706] concat
+newpath
+0 0 M 0 24 L 160.4 24 L 160.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+224.689 704 M 224.689 732 L 389.089 732 L 389.089 704 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 226.689 706] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Is the refinement e) 136.8 S
+137.8 14.5714 M (dge) 21.6 S
+22.6 2.57143 M 22.6 2.57143 M (a boundary edge?) 115.2 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 114.422 660.444] concat
+newpath
+0 0 M 0 24 L 131.6 24 L 131.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+112.422 658.444 M 112.422 686.444 L 248.022 686.444 L 248.022 658.444 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 114.422 660.444] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Is this a periodic) 129.6 S
+33.4 2.57143 M 33.4 2.57143 M (boundary?) 64.8 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 81.1334 616] concat
+newpath
+0 0 M 0 24 L 160.4 24 L 160.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+79.1334 614 M 79.1334 642 L 243.533 642 L 243.533 614 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 81.1334 616] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Is my periodic part) 136.8 S
+137.8 14.5714 M (ner) 21.6 S
+51.4 2.57143 M 51.4 2.57143 M (refined?) 57.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 48.9556 576.443] concat
+newpath
+0 0 M 0 12 L 189.2 12 L 189.2 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+46.9556 574.443 M 46.9556 590.443 L 240.156 590.443 L 240.156 574.443 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 48.9556 576.443] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Find periodic partn) 136.8 S
+137.8 2.57143 M (er node) 50.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 66.7334 532] concat
+newpath
+0 0 M 0 12 L 189.2 12 L 189.2 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+64.7334 530 M 64.7334 546 L 257.933 546 L 257.933 530 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 66.7334 532] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Create new \(periodi) 136.8 S
+137.8 2.57143 M (c\) node) 50.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 84.7334 481.556] concat
+newpath
+0 0 M 0 24 L 153.2 24 L 153.2 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+82.7334 479.556 M 82.7334 507.556 L 239.933 507.556 L 239.933 479.556 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 84.7334 481.556] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Find periodic partn) 136.8 S
+137.8 14.5714 M (er) 14.4 S
+51.4 2.57143 M 51.4 2.57143 M (edge\(s\)) 50.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 63.1333 443.111] concat
+newpath
+0 0 M 0 12 L 196.4 12 L 196.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+61.1333 441.111 M 61.1333 457.111 L 261.533 457.111 L 261.533 441.111 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 63.1333 443.111] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Create new \(periodi) 136.8 S
+137.8 2.57143 M (c\) edges) 57.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 70.3333 398.667] concat
+newpath
+0 0 M 0 12 L 182 12 L 182 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+68.3333 396.667 M 68.3333 412.667 L 254.333 412.667 L 254.333 396.667 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 70.3333 398.667] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Update mother infor) 136.8 S
+137.8 2.57143 M (mation) 43.2 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 63.1334 353.111] concat
+newpath
+0 0 M 0 12 L 196.4 12 L 196.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+61.1334 351.111 M 61.1334 367.111 L 261.533 367.111 L 261.533 351.111 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 63.1334 353.111] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Update links in lin) 136.8 S
+137.8 2.57143 M (ked List) 57.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 120.511 260.889] concat
+newpath
+0 0 M 0 12 L 117.2 12 L 117.2 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+118.511 258.889 M 118.511 274.889 L 239.711 274.889 L 239.711 258.889 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 120.511 260.889] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Create new edges) 115.2 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 88.1111 215.333] concat
+newpath
+0 0 M 0 12 L 182 12 L 182 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+86.1111 213.333 M 86.1111 229.333 L 272.111 229.333 L 272.111 213.333 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 88.1111 215.333] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Update mother infor) 136.8 S
+137.8 2.57143 M (mation) 43.2 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 80.9111 169.778] concat
+newpath
+0 0 M 0 12 L 196.4 12 L 196.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+78.9111 167.778 M 78.9111 183.778 L 279.311 183.778 L 279.311 167.778 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 80.9111 169.778] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Update links in lin) 136.8 S
+137.8 2.57143 M (ked List) 57.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 124.111 306.445] concat
+newpath
+0 0 M 0 12 L 110 12 L 110 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+122.111 304.445 M 122.111 320.445 L 236.111 320.445 L 236.111 304.445 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 124.111 306.445] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Create new node) 108 S
+setmatrix
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 323.333 556] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 323.333 510.444] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 323.333 464.889] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 323.333 419.333] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 372.733 486.444] concat
+newpath
+0 0 M 0 12 L 117.2 12 L 117.2 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+370.733 484.444 M 370.733 500.444 L 491.933 500.444 L 491.933 484.444 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 372.733 486.444] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Create new edges) 115.2 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 340.333 440.889] concat
+newpath
+0 0 M 0 12 L 182 12 L 182 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+338.333 438.889 M 338.333 454.889 L 524.333 454.889 L 524.333 438.889 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 340.333 440.889] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Update mother infor) 136.8 S
+137.8 2.57143 M (mation) 43.2 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 333.133 395.333] concat
+newpath
+0 0 M 0 12 L 196.4 12 L 196.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+331.133 393.333 M 331.133 409.333 L 531.533 409.333 L 531.533 393.333 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 333.133 395.333] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Update links in lin) 136.8 S
+137.8 2.57143 M (ked List) 57.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 376.333 532] concat
+newpath
+0 0 M 0 12 L 110 12 L 110 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+374.333 530 M 374.333 546 L 488.333 546 L 488.333 530 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 376.333 532] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Create new node) 108 S
+setmatrix
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 341.111 339.333] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 341.111 294.889] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 341.111 250.444] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 341.111 206] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 341.111 161.556] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 341.111 117.111] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 354.733 666.445] concat
+newpath
+0 0 M 0 12 L 153.2 12 L 153.2 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+352.733 664.445 M 352.733 680.445 L 509.933 680.445 L 509.933 664.445 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 354.733 666.445] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Is this edge refine) 136.8 S
+137.8 2.57143 M (d?) 14.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 333.356 622] concat
+newpath
+0 0 M 0 12 L 160.4 12 L 160.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+331.356 620 M 331.356 636 L 495.756 636 L 495.756 620 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 333.356 622] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Find neighbor eleme) 136.8 S
+137.8 2.57143 M (nts) 21.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 347.756 576.445] concat
+newpath
+0 0 M 0 12 L 131.6 12 L 131.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+345.756 574.445 M 345.756 590.445 L 481.356 590.445 L 481.356 574.445 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 347.756 576.445] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Find existing node) 129.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 365.311 309.333] concat
+newpath
+0 0 M 0 24 L 167.6 24 L 167.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+363.311 307.333 M 363.311 335.333 L 534.911 335.333 L 534.911 307.333 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 365.311 309.333] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Create new edge bet) 136.8 S
+137.8 14.5714 M (ween) 28.8 S
+55 2.57143 M 55 2.57143 M (children) 57.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 386.911 270.889] concat
+newpath
+0 0 M 0 12 L 124.4 12 L 124.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+384.911 268.889 M 384.911 284.889 L 513.311 284.889 L 513.311 268.889 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 386.911 270.889] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Update edge links) 122.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 347.311 226.444] concat
+newpath
+0 0 M 0 12 L 203.6 12 L 203.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+345.311 224.444 M 345.311 240.444 L 552.911 240.444 L 552.911 224.444 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 347.311 226.444] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Create new children) 136.8 S
+137.8 2.57143 M ( elements) 64.8 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 358.111 182] concat
+newpath
+0 0 M 0 12 L 182 12 L 182 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+356.111 180 M 356.111 196 L 542.111 196 L 542.111 180 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 358.111 182] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Update mother infor) 136.8 S
+137.8 2.57143 M (mation) 43.2 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 350.911 137.556] concat
+newpath
+0 0 M 0 12 L 196.4 12 L 196.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+348.911 135.556 M 348.911 151.556 L 549.311 151.556 L 549.311 135.556 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 350.911 137.556] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Update links in lin) 136.8 S
+137.8 2.57143 M (ked List) 57.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 365.311 93.111] concat
+newpath
+0 0 M 0 12 L 167.6 12 L 167.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+363.311 91.111 M 363.311 107.111 L 534.911 107.111 L 534.911 91.111 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 365.311 93.111] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Update edge informa) 136.8 S
+137.8 2.57143 M (tion) 28.8 S
+setmatrix
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+197.778 717.778 M
+197.778 691.111 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+413.333 717.778 M
+413.333 691.111 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+287.778 672.222 M
+287.778 331.111 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+71.1111 672.222 M
+71.1111 645.556 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+161.111 520 M
+161.111 511.111 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+161.111 474.444 M
+161.111 465.556 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+161.111 430.389 M
+161.111 421.5 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+161.111 386.333 M
+161.111 377.444 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+180 294.444 M
+180 285.556 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+180 249 M
+180 240.111 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+180 203.056 M
+180 194.167 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+413.333 610 M
+413.333 601.111 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+432.222 520 M
+432.222 511.111 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+431.111 474.444 M
+431.111 465.556 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+430 428.889 M
+430 420 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+450 303.333 M
+450 294.444 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+450 260 M
+450 251.111 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+450 215.167 M
+450 206.278 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+450 170.333 M
+450 161.444 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+450 126 M
+450 117.111 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+450 80.1666 M
+450 71.2777 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+270 627.778 M
+270 555.556 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+143.333 564.444 M
+143.333 555.556 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+53.3333 340 M
+53.3333 141.111 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+180 157.778 M
+180 141.111 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+53.3333 141.111 M
+305.556 141.111 L
+305.556 348.889 L
+450 348.889 L
+450 340 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+305.556 564.444 M
+305.556 348.889 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+431.111 383.333 M
+431.111 348.889 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+540 672.222 M
+540 555.556 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+323.333 672.222 M
+323.333 645.556 L
+stroke
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 170 705.43] concat
+newpath
+0 0 M 0 12 L 23.6 12 L 23.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+168 703.43 M 168 719.43 L 195.6 719.43 L 195.6 703.43 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 170 705.43] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Yes) 21.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 428.5 706.43] concat
+newpath
+0 0 M 0 12 L 16.4 12 L 16.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+426.5 704.43 M 426.5 720.43 L 446.9 720.43 L 446.9 704.43 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 428.5 706.43] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (No) 14.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 311.5 679.93] concat
+newpath
+0 0 M 0 12 L 23.6 12 L 23.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+309.5 677.93 M 309.5 693.93 L 337.1 693.93 L 337.1 677.93 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 311.5 679.93] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Yes) 21.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 535 679.5] concat
+newpath
+0 0 M 0 12 L 16.4 12 L 16.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+533 677.5 M 533 693.5 L 553.4 693.5 L 553.4 677.5 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 535 679.5] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (No) 14.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 280.5 680] concat
+newpath
+0 0 M 0 12 L 16.4 12 L 16.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+278.5 678 M 278.5 694 L 298.9 694 L 298.9 678 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 280.5 680] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (No) 14.4 S
+setmatrix
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+54 627.167 M
+54 600.5 L
+stroke
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 54 679] concat
+newpath
+0 0 M 0 12 L 23.6 12 L 23.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+52 677 M 52 693 L 79.6 693 L 79.6 677 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 54 679] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Yes) 21.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 35.5 634.5] concat
+newpath
+0 0 M 0 12 L 23.6 12 L 23.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+33.5 632.5 M 33.5 648.5 L 61.1 648.5 L 61.1 632.5 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 35.5 634.5] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Yes) 21.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 263 634.5] concat
+newpath
+0 0 M 0 12 L 16.4 12 L 16.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+261 632.5 M 261 648.5 L 281.4 648.5 L 281.4 632.5 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 263 634.5] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (No) 14.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 210 752.219] concat
+newpath
+0 0 M 0 18 L 191 18 L 191 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+208 750.219 M 208 772.219 L 403 772.219 L 403 750.219 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 210 752.219] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+0 0 0 setrgbcolor
+0 4 M (Refinement \(element) 182.16 S
+182.16 4 M (\)) 6.84 S
+setmatrix
+grestore
+gsave
+0 0 0 setrgbcolor
+2.000000 setlinewidth
+newpath
+210 746.222 M
+401 746.222 L
+stroke
+grestore
+grestore
+showpage
+saveit restore
+grestore
+%%Page: label 7
+gsave
+newpath clippath pathbbox
+/URy exch def
+/URx exch def
+/LLy exch def
+/LLx exch def
+/Width  URx LLx sub 0.005 sub def
+/Height URy LLy sub 0.005 sub def
+LLx LLy translate
+Width 595 div Height 841 div gt
+    { /Y_size Height def
+      /X_size 595 841 div Y_size mul def
+      /Scale Height 841 div def }
+    { /X_size Width def
+      /Y_size 841 595 div X_size mul def
+      /Scale Width 595 div def } ifelse
+Width  X_size sub 2 div
+Height Y_size sub 2 div translate
+Scale Scale scale
+/saveit save def
+gsave
+gsave
+matrix currentmatrix
+[216 0 0 -36 200 701.556] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 200 657.111] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 200 612.667] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 200 568.222] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 200 523.778] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 202.6 671.556] concat
+newpath
+0 0 M 0 24 L 210.8 24 L 210.8 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+200.6 669.556 M 200.6 697.556 L 415.4 697.556 L 415.4 669.556 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 202.6 671.556] concat
+44.2 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+44.2 14.5714 M (Save pointers for) 122.4 S
+1 2.57143 M 1 2.57143 M (reconstruction of l) 136.8 S
+137.8 2.57143 M (inked list) 72 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 209.8 633.112] concat
+newpath
+0 0 M 0 12 L 196.4 12 L 196.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+207.8 631.112 M 207.8 647.112 L 408.2 647.112 L 408.2 631.112 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 209.8 633.112] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Update left and rig) 136.8 S
+137.8 2.57143 M (ht edges) 57.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 231.4 588.667] concat
+newpath
+0 0 M 0 12 L 153.2 12 L 153.2 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+229.4 586.667 M 229.4 602.667 L 386.6 602.667 L 386.6 586.667 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 231.4 588.667] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Remove child elemen) 136.8 S
+137.8 2.57143 M (ts) 14.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 231.4 538.221] concat
+newpath
+0 0 M 0 24 L 153.2 24 L 153.2 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+229.4 536.221 M 229.4 564.221 L 386.6 564.221 L 386.6 536.221 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 231.4 538.221] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Remove remeining ed) 136.8 S
+137.8 14.5714 M (ge) 14.4 S
+19 2.57143 M 19 2.57143 M (between children) 115.2 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 220.6 499.777] concat
+newpath
+0 0 M 0 12 L 174.8 12 L 174.8 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+218.6 497.777 M 218.6 513.777 L 397.4 513.777 L 397.4 497.777 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 220.6 499.777] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Reconstruct linked ) 136.8 S
+137.8 2.57143 M (lists) 36 S
+setmatrix
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+308.889 666.667 M
+308.889 657.778 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+308.889 621.833 M
+308.889 612.944 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+308.889 577 M
+308.889 568.111 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+308.889 532.667 M
+308.889 523.778 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+308.889 486.833 M
+308.889 477.944 L
+stroke
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 211.111 728.889] concat
+newpath
+0 0 M 0 18 L 193.16 18 L 193.16 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+209.111 726.889 M 209.111 748.889 L 406.271 748.889 L 406.271 726.889 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 211.111 728.889] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+0 0 0 setrgbcolor
+0 4 M (Coarsening \(element) 184.32 S
+184.32 4 M (\)) 6.84 S
+setmatrix
+grestore
+gsave
+0 0 0 setrgbcolor
+2.000000 setlinewidth
+newpath
+211.111 722.889 M
+404.271 722.889 L
+stroke
+grestore
+grestore
+showpage
+saveit restore
+grestore
+%%Page: label 8
+gsave
+newpath clippath pathbbox
+/URy exch def
+/URx exch def
+/LLy exch def
+/LLx exch def
+/Width  URx LLx sub 0.005 sub def
+/Height URy LLy sub 0.005 sub def
+LLx LLy translate
+Width 595 div Height 841 div gt
+    { /Y_size Height def
+      /X_size 595 841 div Y_size mul def
+      /Scale Height 841 div def }
+    { /X_size Width def
+      /Y_size 841 595 div X_size mul def
+      /Scale Width 595 div def } ifelse
+Width  X_size sub 2 div
+Height Y_size sub 2 div translate
+Scale Scale scale
+/saveit save def
+gsave
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 166 793] concat
+newpath
+0 0 M 0 18 L 281 18 L 281 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+164 791 M 164 813 L 449 813 L 449 791 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 166 793] concat
+/AvantGarde-Demi-SHOWISO findfont 18 scalefont setfont
+0 0 0 setrgbcolor
+0 4 M (Main routine \(slm_t) 163.8 S
+163.8 4 M (imestepping\)) 115.2 S
+setmatrix
+grestore
+gsave
+0 0 0 setrgbcolor
+2.000000 setlinewidth
+newpath
+166 787 M
+447 787 L
+stroke
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 197 769] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 221.2 739] concat
+newpath
+0 0 M 0 24 L 167.6 24 L 167.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+219.2 737 M 219.2 765 L 390.8 765 L 390.8 737 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 221.2 739] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Initialization: tim) 136.8 S
+137.8 14.5714 M (ing,) 28.8 S
+22.6 2.57143 M 22.6 2.57143 M (diagnostics, etc.) 122.4 S
+setmatrix
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 197 724] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 196 694] concat
+newpath
+0 0 M 0 24 L 218 24 L 218 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+194 692 M 194 720 L 416 720 L 416 692 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 196 694] concat
+11.8 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+11.8 14.5714 M (Plot initial config) 136.8 S
+148.6 14.5714 M (uration,) 57.6 S
+1 2.57143 M 1 2.57143 M (print charact. numb) 136.8 S
+137.8 2.57143 M (ers of grid) 79.2 S
+setmatrix
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+215 679 M
+197 661 L
+197 643 L
+413 643 L
+413 679 L
+closepath
+215 679 M
+stroke
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 197 634] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+216 589 M
+198 571 L
+198 553 L
+414 553 L
+414 589 L
+closepath
+216 589 M
+stroke
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 198 544] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 198 499] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 198 454] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 198 409] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 198 364] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 198 319] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 198 274] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 198 229] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 197 175] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 197 130] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[216 0 0 -36 197 85] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 221.2 655] concat
+newpath
+0 0 M 0 12 L 167.6 12 L 167.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+219.2 653 M 219.2 669 L 390.8 669 L 390.8 653 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 221.2 655] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Loop over all times) 136.8 S
+137.8 2.57143 M (teps) 28.8 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 211.4 514] concat
+newpath
+0 0 M 0 24 L 189.2 24 L 189.2 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+209.4 512 M 209.4 540 L 402.6 540 L 402.6 512 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 211.4 514] concat
+22.6 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+22.6 14.5714 M (Allocate work array) 136.8 S
+159.4 14.5714 M (s) 7.2 S
+1 2.57143 M 1 2.57143 M (\(for numerical oper) 136.8 S
+137.8 2.57143 M (ations\)) 50.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 211.4 565] concat
+newpath
+0 0 M 0 12 L 189.2 12 L 189.2 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+209.4 563 M 209.4 579 L 402.6 579 L 402.6 563 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 211.4 565] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (While new grid has ) 136.8 S
+137.8 2.57143 M (changed) 50.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 203.2 604] concat
+newpath
+0 0 M 0 24 L 203.6 24 L 203.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+201.2 602 M 201.2 630 L 408.8 630 L 408.8 602 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 203.2 604] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Duplicate grid \(use) 136.8 S
+137.8 14.5714 M ( old grid) 64.8 S
+4.60001 2.57143 M 4.60001 2.57143 M (as init. guess for ) 136.8 S
+141.4 2.57143 M (new one\)) 57.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 200.6 469] concat
+newpath
+0 0 M 0 24 L 210.8 24 L 210.8 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+198.6 467 M 198.6 495 L 413.4 495 L 413.4 467 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 200.6 469] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Extract coordinates) 136.8 S
+137.8 14.5714 M ( from grid) 72 S
+15.4 2.57143 M 15.4 2.57143 M (data structure into) 136.8 S
+152.2 2.57143 M ( array) 43.2 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 222.2 424] concat
+newpath
+0 0 M 0 24 L 167.6 24 L 167.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+220.2 422 M 220.2 450 L 391.8 450 L 391.8 422 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 222.2 424] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Calculate displacem) 136.8 S
+137.8 14.5714 M (ents) 28.8 S
+65.8 2.57143 M 65.8 2.57143 M (\(SLM\)) 36 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 215 379] concat
+newpath
+0 0 M 0 24 L 182 24 L 182 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+213 377 M 213 405 L 399 405 L 399 377 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 215 379] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Calculate upstream ) 136.8 S
+137.8 14.5714 M (values) 43.2 S
+73 2.57143 M 73 2.57143 M (\(SLM\)) 36 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 215 334] concat
+newpath
+0 0 M 0 24 L 182 24 L 182 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+213 332 M 213 360 L 399 360 L 399 332 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 215 334] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Calculate new grid ) 136.8 S
+137.8 14.5714 M (values) 43.2 S
+73 2.57143 M 73 2.57143 M (\(SLM\)) 36 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 204.2 289] concat
+newpath
+0 0 M 0 24 L 203.6 24 L 203.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+202.2 287 M 202.2 315 L 409.8 315 L 409.8 287 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 204.2 289] concat
+11.8 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+11.8 14.5714 M (Distribute values i) 136.8 S
+148.6 14.5714 M (n work) 43.2 S
+1 2.57143 M 1 2.57143 M (array to grid data ) 136.8 S
+137.8 2.57143 M (structure) 64.8 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 225.8 250] concat
+newpath
+0 0 M 0 12 L 160.4 12 L 160.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+223.8 248 M 223.8 264 L 388.2 264 L 388.2 248 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 225.8 250] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Deallocate work arr) 136.8 S
+137.8 2.57143 M (ays) 21.6 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 207.8 199] concat
+newpath
+0 0 M 0 24 L 196.4 24 L 196.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+205.8 197 M 205.8 225 L 406.2 225 L 406.2 197 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 207.8 199] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Adapt the grid acco) 136.8 S
+137.8 14.5714 M (rding to) 57.6 S
+29.8 2.57143 M 29.8 2.57143 M (an error estimation) 136.8 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 203.2 145] concat
+newpath
+0 0 M 0 24 L 203.6 24 L 203.6 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+201.2 143 M 201.2 171 L 408.8 171 L 408.8 143 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 203.2 145] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Calculate diagnosti) 136.8 S
+137.8 14.5714 M (cs, plot,) 64.8 S
+11.8 2.57143 M 11.8 2.57143 M (write saveset, prin) 136.8 S
+148.6 2.57143 M (t info) 43.2 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 210.4 100] concat
+newpath
+0 0 M 0 24 L 189.2 24 L 189.2 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+208.4 98 M 208.4 126 L 401.6 126 L 401.6 98 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 210.4 100] concat
+1 14.5714 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 14.5714 M (Remove obsolete gri) 136.8 S
+137.8 14.5714 M (d items) 50.4 S
+51.4 2.57143 M 51.4 2.57143 M (\(clear grid\)) 86.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 224.8 61] concat
+newpath
+0 0 M 0 12 L 160.4 12 L 160.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+222.8 59 M 222.8 75 L 387.2 75 L 387.2 59 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 224.8 61] concat
+1 2.57143 M /Courier-SHOWISO findfont 12 scalefont setfont
+0 0 0 setrgbcolor
+1 2.57143 M (Toggle timestep han) 136.8 S
+137.8 2.57143 M (dle) 21.6 S
+setmatrix
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306 733.333 M
+306 724.667 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306 688 M
+306 679.333 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306 642.667 M
+306 634 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306 597.333 M
+306 588.667 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306 552 M
+306 543.333 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306 506.666 M
+306 498 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306 461.333 M
+306 452.666 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306 417.333 M
+306 408.666 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306 373.333 M
+306 364.667 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+305.333 328 M
+305.333 319.334 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306 282.667 M
+306 274 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306 238 M
+306 229.333 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306 139.333 M
+306 130.667 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306 94 M
+306 85.3333 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306 192.667 M
+306 187.333 L
+188.667 187.333 L
+188.667 571.333 L
+198 571.333 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+414 571.333 M
+422.667 571.333 L
+422.667 182 L
+306 182 L
+306 175.333 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+306 49.3333 M
+306 42.6667 L
+180 42.6667 L
+180 661.333 L
+198 661.333 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+414 661.333 M
+432 661.333 L
+432 37.3333 L
+306 37.3333 L
+306 31.3333 L
+stroke
+grestore
+grestore
+showpage
+saveit restore
+grestore
+%%EOF
diff --git a/flash2d/doc/InputDok.ps b/flash2d/doc/InputDok.ps
new file mode 100644
index 0000000..902f772
--- /dev/null
+++ b/flash2d/doc/InputDok.ps
@@ -0,0 +1,1359 @@
+%!PS-Adobe-2.0
+%%Creator: dvipsk 5.58f Copyright 1986, 1994 Radical Eye Software
+%%Title: InputDok.dvi
+%%Pages: 6
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 596 842
+%%DocumentPaperSizes: A4
+%%EndComments
+%DVIPSCommandLine: dvips InputDok
+%DVIPSParameters: dpi=600, compressed, comments removed
+%DVIPSSource:  TeX output 1998.03.20:1528
+%%BeginProcSet: texc.pro
+/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N
+/X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72
+mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1}
+ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale
+isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div
+hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul
+TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if}
+forall round exch round exch]setmatrix}N /@landscape{/isls true N}B
+/@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B
+/FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{
+/nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N
+string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N
+end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{
+/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]
+N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup
+length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{
+128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub
+get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data
+dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N
+/rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup
+/base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx
+0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff
+setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff
+.1 sub]/id ch-image N /rw ch-width 7 add 8 idiv string N /rc 0 N /gp 0 N
+/cp 0 N{rc 0 ne{rc 1 sub /rc X rw}{G}ifelse}imagemask restore}B /G{{id
+gp get /gp gp 1 add N dup 18 mod S 18 idiv pl S get exec}loop}B /adv{cp
+add /cp X}B /chg{rw cp id gp 4 index getinterval putinterval dup gp add
+/gp X adv}B /nd{/cp 0 N rw exit}B /lsh{rw cp 2 copy get dup 0 eq{pop 1}{
+dup 255 eq{pop 254}{dup dup add 255 and S 1 and or}ifelse}ifelse put 1
+adv}B /rsh{rw cp 2 copy get dup 0 eq{pop 128}{dup 255 eq{pop 127}{dup 2
+idiv S 128 and or}ifelse}ifelse put 1 adv}B /clr{rw cp 2 index string
+putinterval adv}B /set{rw cp fillstr 0 4 index getinterval putinterval
+adv}B /fillstr 18 string 0 1 17{2 copy 255 put pop}for N /pl[{adv 1 chg}
+{adv 1 chg nd}{1 add chg}{1 add chg nd}{adv lsh}{adv lsh nd}{adv rsh}{
+adv rsh nd}{1 add adv}{/rc X nd}{1 add set}{1 add clr}{adv 2 chg}{adv 2
+chg nd}{pop nd}]dup{bind pop}forall N /D{/cc X dup type /stringtype ne{]
+}if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup
+length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{
+cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin
+0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul
+add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore userdict
+/eop-hook known{eop-hook}if showpage}N /@start{userdict /start-hook
+known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X
+/IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for
+65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0
+0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V
+{}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7
+getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false}
+ifelse}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false
+RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1
+false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform
+round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg
+rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail
+{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M}
+B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{
+4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{
+p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p
+a}B /bos{/SS save N}B /eos{SS restore}B end
+%%EndProcSet
+TeXDict begin 39158280 55380996 1000 600 600 (InputDok.dvi)
+@start /Fa 1 3 df<0060150600F8150F6C151F007E153F6C157E6C6C14FC6C6CEB01F8
+6C6CEB03F06C6CEB07E06C6CEB0FC06C6CEB1F80017EEB3F006D137E6D6C5A90380FC1F8
+903807E3F0903803F7E06DB45A6D5B6EC7FCA24A7E497F903803F7E0903807E3F090380F
+C1F890381F80FC90383F007E017E7F49EB1F804848EB0FC04848EB07E04848EB03F04848
+EB01F84848EB00FC48C8127E007E153F48151F48150F00601506282874A841>2
+D E /Fb 13 119 df<1418A214381430A21438EC1BFCEC1FFFEC3C0391B5FC903801E3FC
+903803C00049C7FC130E5B133C5B5B485AA2485A485AA248C8FCA2121EA25AA3127C1278
+A312F8A25AA37EA47E7E127EEA7F807FEA3FF86CB4FC6C13E06C13F8000113FE6C6C7E01
+0F138013019038003FC0141F140F1407A21580A29038200F001330EB3C1EEB0FF8EB03E0
+20447DB322>16 D<3903E001FC390FF807FF3A1C7C1E0FC0001890387807E039383EE003
+38303FC0D97F8013F0127000601300137E00E01407D8C0FE14E0EA40FC1200150F120149
+14C0A2151F1203491480A2153F1207491400A25D120F49137EA215FE121F495B0007C7FC
+C71201A25DA21403A25DA21407A25DA2140FA25DEC038024327EA026>I<EC1F80EC7FC0
+903801F0F0EB03E0903807C078EB0F8090381F003C133EA249133E5BA2485A1203A2485A
+A249137E120FA2485AA215FE003F14FC90C7FC90B5FCA25A15F8387E0001140300FE14F0
+5AA2EC07E0A215C048130FA2EC1F80A21500143EA25C00785BA2495A6C485A495A6C485A
+49C7FCEA07FCEA03F01F367DB424>I<17E001C0EC01F00001ED03F8485A90C8FC481501
+00061500000E1678120C001C163812180038010314300030497EA217700070010F146000
+6091C7FC17E0A2021EEB01C012E0EE0380021C13076C013C1400027E5B6C01FE133E2678
+01FF137ED87E07EB81FC3A7FFFEFFFF802CF5B6C018F5B261FFE075B6C486C90C7FC3903
+F000FC2D2280A030>33 D<123C127EB4FCA21380A2127F123D1201A412031300A25A1206
+120E120C121C5A5A126009177A8715>59 D<171C177EEE01FEEE07FCEE1FF0EE7FC09238
+01FF00ED07FCED1FF0ED7FC04A48C7FCEC07FCEC1FF0EC7FC04948C8FCEB07FCEB1FF0EB
+7FC04848C9FCEA07FCEA1FF0EA7FC048CAFCA2EA7FC0EA1FF0EA07FCEA01FF38007FC0EB
+1FF0EB07FCEB01FF9038007FC0EC1FF0EC07FCEC01FF9138007FC0ED1FF0ED07FCED01FF
+9238007FC0EE1FF0EE07FCEE01FEEE007E171C2F2E7AA93C>I<010FB5D8C03FB5FCA390
+26003FE0C713804B1500A24B5CA2027F14016092C7FCA24A1403605CA201011507605CA2
+0103150F605C91B7FC5B6002F0C7121FA2010F153F605CA2011F157F95C7FC5CA2013F5D
+5F5CA2017F14015F91C7FCA24914035F5B00011507B5D8FC03B512F0A340337DB240>72
+D<147F903803FFC090380FC0F090383F0038137C4913F83801F0013803E0031207EA0FC0
+90388001F0001F90C7FC123F90C8FCA25A127EA45AA3127C150C151C15386C147015E06C
+EB03C0390F800F003807C07E3801FFF038007F801E227EA021>99
+D<151C157E15FEA315FC15781500AA143FECFFC0903801C3E0EB038390380701F0130EEB
+0C03131C1338133014071370012013E01300140FA215C0A2141FA21580A2143FA21500A2
+5CA2147EA214FEA25CA21301A25CA21303001C5B127F495AA238FE0FC0495AD8783FC7FC
+EA707CEA3FF0EA0FC01F4281B11F>106 D<EB07E0EA03FFA25CEA001FA35CA3133F91C8
+FCA35B137EA313FE49131FED7FC0EC01E0000190380383E09038F8070F140E141C000301
+3813C0EBF0709138E00700D9F1C0C7FC3807F78001EEC8FC13FC7F380FFFE0EBC7F8EBC1
+FEEBC07E001F7F1380ED8080ED81C0003FEC01801300A21503481500007EEB3E071506EC
+1F0E00FE5C48EB07F80038EB03E023357DB328>I<D801E013FE3A07F803FF803A0E3E0F
+07E0001C90383C03F039181F7001003813E026303FC07F12700060138014001503D8E07F
+5CEA407E1200150701FE5C5B150F5E120149131FEE8080EE81C00003023F138049140116
+03037F13000007147E495CED3E0E5E000FEC1E3849EB0FF0D80380EB03C02A227EA02E>
+110 D<13F8D803FEEB01C0D8070FEB03E0000EEB8007121C001813C00038140FEA301F00
+70018013C01260013F131F00E0130000401580C65A017E133F13FE491400A25D12014913
+7E1602EDFE0716064913FCA2160E0201130C9039F803F81C1618000090380F7C38D97C1C
+137090393FF81FE0903907E0078028227EA02C>117 D<01F0130ED803FC131FD8071EEB
+3F80EA0E1F121C0038EB801F0030140F013F130700701300006014035BD8E07E14001240
+EA00FE495B000114065BA2150E0003140C5B151C15181538491330157015606D13E04A5A
+0001495A6D48C7FC3800FC1EEB3FF8EB07E021227EA025>I E /Fc
+2 50 df<0060153000F815F86C1401007EEC03F06CEC07E06C6CEB0FC06C6CEB1F806C6C
+EB3F006C6C137E6C6C5B6C6C485A90387E03F06D485A90381F8FC090380FDF806DB4C7FC
+6D5A6D5AA2497E497E90380FDF8090381F8FC090383F07E090387E03F0496C7E48486C7E
+4848137E48487F4848EB1F804848EB0FC048C7EA07E0007EEC03F048EC01F84814000060
+1530252475A43C>2 D<D91FE0ED3F80D97FFC913801FFE048B5020713F8486E90381F80
+3C2707C03FE090383E000F48C66C6C01F87F001E902707F801F0EB0380486D6C4848EB01
+C00038D901FE491300486D6C484814E0DB7F8FC812600060EC3FDE00E01970DB1FFC1530
+486E5A15076F7EA26F7E824B6D14706C913807BFC00060196092260F1FE014E000709138
+1E0FF000304A6C6CEB01C0003891267C03FC13036C4A6C6CEB07806C903C01F000FF800F
+00000FD907C090387FC03E2703C01F8090381FFFFC2601FFFEC76C5B26007FF8020313E0
+D91FC09138007F8044227CA04D>49 D E /Fd 12 121 df<140C141C143C1438A2147814
+7014F014E0130114C0A21303148013071400A25B130E131E131CA2133C13381378137013
+F05BA212015B12035BA2120790C7FC5A120EA2121E121C123C123812781270A212F05AA2
+16317CA420>61 D<131FEBFF8C3801E0DE3803807E3807007C48133C121E123E003C5B12
+7CA3485BA215401560903801E0C012781303393807E180391C1CF300380FF87F3807E03C
+1B177E9522>97 D<EB0FE0EB7FF83801F03C3803C01C3807803C380F007C121E003E1338
+14005AA35AA400781304140C00381338003C1370381F03E0380FFF803801FC0016177E95
+1C>99 D<EB1F80EBFFE03803E07038078030EA1F00123E123C007C1360387807C0B51280
+EBF80000F8C7FC5AA41408141800781370003813E0381E07C0380FFF00EA03F815177D95
+1D>101 D<140FEC3FC0EC71E014E3A2010113C0ECE180ECE000495AA5495AA2EBFFFEA2
+EB0780A249C7FCA5131EA65BA55BA31370A2EA38F0EA78E012F8EAF9C0EA7180007FC8FC
+121E1B2F7CA31E>I<1418143C147CA214381400A7EB0780EB1FE01338EB60F013C0A2EA
+0180A2380001E0A4EB03C0A4EB0780A4EB0F00A4131EA21238EA783CEAF8381378EA70F0
+EA7FC0001FC7FC162D81A119>106 D<EA01F0EA1FE0A21201A2EA03C0A4EA0780A4EA0F
+00A4121EA45AA45AA213401360EAF0C0A3EAF1801271EA3F00121E0C247DA214>108
+D<000F017E13FC3A1F81FF83FF3B31C383C707803A61EE03CC039026EC01F813C0D8C1F8
+13F013F001E013E00003903903C0078013C0A2EE0F003907800780A2EE1E041706270F00
+0F00130C163C1718A2001E011EEB1C70EE1FE0000C010CEB07802F177D9536>I<380F01
+F0381FC7F83831CE1CEA61F8EBF03C00C1137C13E014383803C000A4485AA448C7FCA412
+1EA2120C16177D951D>114 D<EB3F80EBFFE03801E0F038038030EB00704813F0A2EB80
+40EBC00013FE3803FF806C13C038003FE0EB03F0EA3000127800F813E0A24813C0EA6001
+38780F80383FFE00EA07F814177D951D>I<133013785BA4485AA4485AB51280A23803C0
+00485AA448C7FCA4121EA25B1480383C03001306A25BEA1C38EA0FF0EA07C011217D9F18
+>I<3801F01E3907FC7F80390E1CE1C038180F8100301383007013071260EC0380D8001E
+C7FCA45BA21580003014C0397878018012F8EC030038F0FC0638E19C1C387F0FF8381E03
+E01A177D9523>120 D E /Fe 5 51 df<130C1338137013E0EA01C0EA038013005A120E
+A25AA25AA312781270A312F0AB1270A312781238A37EA27EA27E7E1380EA01C0EA00E013
+701338130C0E317AA418>40 D<12C012707E7E7E7E7E1380EA01C0A2EA00E0A21370A313
+781338A3133CAB1338A313781370A313E0A2EA01C0A2EA038013005A120E5A5A5A12C00E
+317CA418>I<1438B2B712FEA3C70038C7FCB227277C9F2F>43 D<13E01201120712FF12
+F91201B3A7487EB512C0A212217AA01E>49 D<EA01FC3807FF80381C0FC0383003E03860
+01F0EB00F812F86C13FCA2147C1278003013FCC7FC14F8A2EB01F0EB03E014C0EB0780EB
+0F00131E13385B5B3801C00CEA0380380600185A5A383FFFF85AB512F0A216217CA01E>
+I E /Ff 1 1 df<B712C0A322037A8D30>0 D E /Fg 26 121 df<120FEA3FC0EA7FE0EA
+FFF0A213F8A4127F123FEA0F3812001378A21370A213F013E01201EA03C0A2EA0780EA0F
+00121E5A12180D1B7AB319>39 D<B512FCA816087F931D>45 D<120FEA3FC0EA7FE0EAFF
+F0A6EA7FE0EA3FC0EA0F000C0C7A8B19>I<EB03FE90383FFFE090B512F848EB07FC3903
+FC01FE48486C7E4848EB7F8049133F001F15C0A2003F15E049131F007F15F0A500FF15F8
+B1007F15F0A4003F15E06D133FA2001F15C0A26C6CEB7F806C6CEBFF006C6C485A3901FF
+07FC6CEBFFF8013F13E0D903FEC7FC25327DB02C>48 D<147814F81303131FEA03FFB5FC
+A3EAFC1F1200B3B2007FB512FEA41F317AB02C>I<EB1FFC90B57E000314E0000F14F839
+1FE03FFC393F800FFF48487E6D6C1380D8FFC014C06D7E16E080A36C5A6C5A6CC7FCC8FC
+16C05C16805C16004A5A4A5A5D4A5AEC3FC04A5A02FEC7FC495A495A903907E001E0EB0F
+C0EB1F8090383E00034914C05B4848130748B6FC5A5A5A5A5AB71280A423317CB02C>I<
+EB7FF80003B51280000F14E0391FC03FF0393E000FF8007FEB07FCD8FF8013FE13C0A539
+7F800FFCEA3F00C7EA1FF8EC3FF0EC7FC0ECFF80903801FE005C495A5C495A5CA2495AA2
+91C7FCA790C8FCA6EB1F80497E497E497EA66D5A6D5A6D5A1F347BB32A>63
+D<B712FCEEFFC017F817FEC69039E0003FFF040313C004007F717EEF1FF8717E84170784
+8319808319C0A419E0AB19C0A419805FA219004D5A170F604D5A4D5AEFFFE004035B041F
+5BB848C7FC17F817C004FCC8FC3B337DB244>68 D<EAFFFEA5EAF800B3B3B3ABEAFFFEA5
+0F4B78B719>91 D<EAFFFEA5EA003EB3B3B3ABEAFFFEA50F4B7FB719>93
+D<EB7FFE0003B512E04814F8390FF00FFC391FF803FF806E138016C0157F6C5A6C5AEA01
+80C8FCEC7FFF010FB5FC90B6FC0003EBF07F000F1300EA1FF8485A485A485A5BA315FF7F
+007F5B6D4813E03A3FF80FBFFF000FB5121F0003EBFC0F39007FE00728217EA02B>97
+D<ED01FC15FFA4150F1507ADEB07FE90383FFFC790B512F70003EB01FF3907FC003F4848
+131F4848130F48481307A2127F5BA212FFA9127FA27F123F150F6C6C131F6C6C133F6C6C
+497E2603FE03B512E0C6B512E7013F1387903807FC072B347DB331>100
+D<903803FF80013F13F090B512FC48EB03FE3907FC007F4848EB3F804848EB1FC05B003F
+EC0FE0127F5B16F012FF150790B6FCA301C0C8FCA4127F7F123F16F06C7E000F14016C6C
+EB03E0D803FEEB0FC03A01FF807F806C6CB51200011F13FC010313E024217EA029>I<EC
+3FE0903803FFF8010F13FC90383FF1FE90387FC3FFEBFF83481303A2EA03FEEC01FEA2EC
+00781500A7B512FEA4D803FEC7FCB3A7387FFFF8A420347EB31B>I<EA03F0487E487E48
+7EA66C5A6C5A6C5AC8FCA8EA01FC12FFA4120F1207B3A5B512C0A412357DB418>105
+D<EA01FC12FFA4120F1207B3B3A6B512E0A413347DB318>108 D<2703F803FEEB03FE00
+FF903B1FFFC01FFFC0027FD9E07F7F913BF81FF0F81FF0903CF9E00FF9E00FF8260FFBC0
+EBFBC06CB4486CB4486C7E02001400495CA3495CB2B500E0B500E0B512E0A443217CA04A
+>I<3901F803FF00FF010F13C0023F13F09138FC0FF89039F9E007FC380FFBC06CB4486C
+7E1400A25BA25BB2B539E07FFFF0A42C217DA031>I<903803FF80011F13F090B512FE48
+EB01FF3A07FC007FC0D80FF0EB1FE0001F15F049130F003F15F8491307007F15FCA300FF
+15FEA8007F15FCA26D130F003F15F8001F15F06D131F6C6CEB3FE06C6CEB7FC03A01FF01
+FF006CEBFFFE013F13F80103138027217EA02C>I<3901FC07FC00FF90387FFF8001FDB5
+12E09039FFF01FF89138C007FC000790380003FE4980496D1380A26F13C0A3EE7FE0A9EE
+FFC0A34B1380A26D4913006D495A9138C00FFC9138F03FF801FDB512E0D9FC7F1380DA0F
+F8C7FC91C9FCABB512E0A42B307EA031>I<D903FC133C90393FFF807C90B5EAE0FC0003
+EB81F83907FE007D4848133F4848131F4848130FA248481307A3485AA96C7EA36C7E150F
+6C6C131F000F143F6C6C13FF3903FF03F7C6EBFFE7013F1387903807FC0790C7FCAB92B5
+12E0A42B307DA02F>I<3901F81F8000FFEB7FF0ECFFF89038F9E3FC9038FBC7FE380FFF
+876C1307A213FEEC03FCEC01F8EC0060491300B1B512F0A41F217EA024>I<9038FFE1C0
+000713FF5A383F803F387E000F14075A14037EA26C6CC7FC13FCEBFFE06C13FC806CEBFF
+80000F14C06C14E0C6FC010F13F0EB007F140F00F0130714037EA26C14E06C13076CEB0F
+C09038C01F8090B5120000F913FC38E03FE01C217DA023>I<133CA5137CA313FCA21201
+A212031207001FB51280B6FCA3D807FCC7FCB0EC03C0A79038FE078012033901FF0F006C
+13FEEB3FFCEB0FF01A2F7EAE22>I<D801FC14FE00FF147FA4000F140700071403B21507
+A2150F151F6C6C497E6C6C01FB13F06CEBFFF3013F13C3903807FE032C217DA031>I<B5
+39C03FFF80A400039039000FC0006C01805B6C4AC7FC90387FC03E6D6C5A6E5A90381FF9
+F0EB0FFF6D5B6D5B6D5B7F816E7E4A7E497FEB03EF903807C7FC90380FC3FE90381F83FF
+D93F017FD97E007F496D7E496D7E4848131FD8FFFE90387FFFC0A42A217EA02F>120
+D E /Fh 74 123 df<011FB512F0A39026001FF0C7FC6E5AA7EC7FF80107B57E90393FCF
+EFF09039FE0FE1FCD803F8EBE07FD807E0EC1F80D80FC0EC0FC0001F16E0D83F80EC07F0
+007F16F8010014034816FCA76C16F801801407003F16F0D81FC0EC0FE0000F16C0D807E0
+EC1F80D803F8EC7F00D800FEEBE1FC90393FCFEFF00107B512809026007FF8C7FCEC0FE0
+A74A7E011FB512F0A32E337CB237>8 D<91393FE00FE0903A01FFF83FF8903A07E01EF8
+3C903A1F800FF07E903A3F001FE0FE017E133F4914C0485A1738484890381F8000ACB812
+C0A33B03F0001F8000B3A7486C497EB50083B5FCA32F357FB42D>11
+D<EC1FE0ECFFFC903803F01E90390FC00780EB1F8090393F000FC0017E131F5BA2485AED
+0F8092C7FCA9ED0FC0B7FCA33901F8001F150FB3A6486CEB1FE0267FFFC1B5FCA328357F
+B42B>I<123C127EB4FCA21380A2127F123D1201A412031300A25A1206120E120C121C5A
+5A126009177AB315>39 D<14C01301EB0380EB0F00130E5B133C5B5BA2485A485AA21207
+5B120F90C7FC5AA2121E123EA3123C127CA55AB0127CA5123C123EA3121E121FA27E7F12
+077F1203A26C7E6C7EA213787F131C7F130FEB0380EB01C01300124A79B71E>I<12C07E
+1270123C121C7E120F6C7E6C7EA26C7E6C7EA27F1378137C133C133EA2131E131FA37F14
+80A5EB07C0B0EB0F80A514005BA3131E133EA2133C137C137813F85BA2485A485AA2485A
+48C7FC120E5A123C12705A5A124A7CB71E>I<156015F0B3A4007FB812C0B912E0A26C17
+C0C800F0C8FCB3A4156033327CAB3C>43 D<123C127EB4FCA21380A2127F123D1201A412
+031300A25A1206120E120C121C5A5A126009177A8715>I<B512F0A514057F921A>I<123C
+127E12FFA4127E123C08087A8715>I<1530157815F8A215F01401A215E01403A215C014
+07A21580140FA215005CA2143EA2143C147CA2147814F8A25C1301A25C1303A25C1307A2
+495AA291C7FC5BA2131E133EA2133C137CA2137813F8A25B1201A25B1203A2485AA25B12
+0FA290C8FC5AA2121E123EA2123C127CA2127812F8A25A12601D4B7CB726>I<EB0FE0EB
+7FFCEBF83E3903E00F803907C007C0EB8003000F14E0391F0001F0A24814F8A2003E1300
+007E14FCA500FE14FEB2007E14FCA56CEB01F8A36C14F0A2390F8003E03907C007C0A239
+03E00F803900F83E00EB7FFCEB0FE01F347DB126>I<13075B5B137FEA07FFB5FC13BFEA
+F83F1200B3B3A2497E007FB51280A319327AB126>I<EB3FC0EBFFF0000313FC380F80FF
+391E007F80001CEB3FC048EB1FE048130F15F00060130712FC6C14F87E1403A3007E1307
+123CC7FC15F0A2140F15E0EC1FC0A2EC3F801500147E5C495A5C495A495A495A49C7FC13
+3E133C4913185B485A48481330485A48C7FC001C1470001FB512F05A5AB612E0A31D327C
+B126>I<EB1FE0EBFFFC4813FF3907E03F80390F001FC0001EEB0FE0001CEB07F0123F01
+8013F8140313C01380A2381F0007C7FC15F0A2EC0FE015C0141FEC3F80EC7E00EB01F8EB
+7FE014FCEB003FEC1FC0EC0FE0EC07F015F8140315FC140115FEA3127EB4FCA415FC4813
+0312780070EB07F86C14F0003C130F001FEB1FE0390FE03F800003B51200C613FCEB1FE0
+1F347DB126>I<EC01C0A214031407A2140F141FA2143F147F146F14CF1301EB038F140F
+1307130E130C131C13381330137013E013C0EA0180120313001206120E120C5A12381230
+5A12E0B71280A3C7380FC000A94A7E0107B51280A321337EB226>I<000C14C0380FC00F
+90B5128015005C5C14F014C0D80C18C7FC90C8FCA9EB0FC0EB7FF8EBF07C380FC03F9038
+001F80EC0FC0120E000CEB07E0A2C713F01403A215F8A41218127E12FEA315F0140712F8
+006014E01270EC0FC06C131F003C14806CEB7F00380F80FE3807FFF8000113E038003F80
+1D347CB126>I<14FE903807FF80011F13E090383F00F0017C13703901F801F8EBF003EA
+03E01207EA0FC0EC01F04848C7FCA248C8FCA35A127EEB07F0EB1FFC38FE381F9038700F
+809038E007C039FFC003E0018013F0EC01F8130015FC1400A24814FEA5127EA4127F6C14
+FCA26C1301018013F8000F14F0EBC0030007EB07E03903E00FC03901F81F806CB51200EB
+3FFCEB0FE01F347DB126>I<1230123C003FB6FCA34814FEA215FC0070C7123800601430
+157015E04814C01401EC0380C7EA07001406140E5C141814385CA25CA2495A1303A3495A
+A2130FA3131F91C7FCA25BA55BA9131C20347CB126>I<EB0FE0EB7FFC90B5FC3903F01F
+803907C007C0390F0003E0000EEB01F0001E1300001C14F8003C1478A3123EA2003F14F8
+6D13F0EBC001D81FF013E09038F803C0390FFE07803907FF0F006C13DE6C13F87EEB3FFE
+8001F713C0D803E313E0D8078013F0390F007FF8001E131F003EEB07FC003C1303481301
+EC007E12F848143EA2151EA37E153C1278007C14787E6C14F0390F8003E03907F01FC000
+01B5120038007FFCEB1FE01F347DB126>I<EB0FE0EB7FF8EBFFFE3803F83F3907E00F80
+390FC007C0D81F8013E0EC03F0EA3F0048EB01F8127EA200FE14FC1400A415FEA5007E13
+01A2127F7E1403EA1F80000F13073807C00E3803E01C3801F03838007FF090381FC0FC90
+C7FC1401A215F8A215F01403001F14E0383F800715C0140FEC1F809038003F00001C137E
+381F01FC380FFFF0000313C0C690C7FC1F347DB126>I<123C127E12FFA4127E123C1200
+B0123C127E12FFA4127E123C08207A9F15>I<007FB812C0B912E0A26C17C0CCFCAC007F
+B812C0B912E0A26C17C033147C9C3C>61 D<15E0A34A7EA24A7EA34A7EA3EC0DFE140CA2
+EC187FA34A6C7EA202707FEC601FA202E07FECC00FA2D901807F1507A249486C7EA30106
+6D7EA2010E80010FB5FCA249800118C77EA24981163FA2496E7EA3496E7EA20001821607
+487ED81FF04A7ED8FFFE49B512E0A333367DB53A>65 D<B7FC16E016F83A03FC0003FE00
+01EC00FFEE7F80EE3FC0161F17E0160F17F0A617E0161F17C0EE3F80EE7F0016FEED03FC
+90B612F05E9039FC0007FCED00FEEE3F80EE1FC0EE0FE017F0160717F8160317FCA617F8
+1607A2EE0FF0EE1FE0163FEE7FC00003913803FF00B75A16F816C02E337DB236>I<DA03
+FE130C91393FFF801C91B512E0903A03FE01F83C903A0FF0003C7CD91FC0EB0EFCD97F80
+130701FEC7120348481401000315005B4848157C485A173C485A171C123F5B007F160CA3
+90C9FC481600AB7E6D150CA3123F7F001F161C17186C7E17386C6C15306C6C15706D15E0
+12016C6CEC01C0D97F80EB0380D91FC0EB0F00D90FF0131ED903FE13FC0100B512F0023F
+13C0DA03FEC7FC2E377CB437>I<B77E16F016FE3A01FE0001FF00009138003FC0EE0FE0
+707E707E707E707E177E177FEF3F80A2EF1FC0A3EF0FE0A418F0AA18E0A3171F18C0A218
+80173F18005F17FE5F4C5AEE07F04C5AEE3FC000014AB45AB748C7FC16F8168034337EB2
+3B>I<B812C0A3D803FCC7127F0001150FEE03E01601A21600A21760A403061330A41700
+150EA2151E157E90B512FEA39038FC007E151E150EA21506170CA3171892C7FCA41738A2
+1770A217F01601160316070003157FB812E0A32E337DB234>I<B81280A3D803FCC7FC00
+01151FEE07C01603A21601A21600A41760150CA31700A2151CA2153C15FC90B5FCA3EBFC
+00153C151CA2150CA592C8FCAB487EB512FEA32B337DB232>I<DA03FE130C91393FFF80
+1C91B512E0903A03FE01F83C903A0FF0003C7CD91FC0EB0EFCD97F80130701FEC7120348
+481401000315005B4848157C485A173C485A171C123F5B007F160CA390C9FC4893C7FCAA
+0303B512E07E7F92390003FE00705A123F7F121FA26C7E7F12076C7E7F6C6C14036C7E6D
+6C1307D91FC0EB0E7CD90FF0EB1C3CD903FEEBF81C0100B5EAF00C023F01C0C7FCDA03FE
+C8FC33377CB43C>I<B5D8FE03B512F8A3000190C73807FC006C486E5AB390B7FCA349C7
+1203B3A3486C4A7EB5D8FE03B512F8A335337EB23A>I<B512FEA3000113006C5AB3B3A7
+487EB512FEA317337EB21C>I<B500FE903807FFF8A3000190C7000113006C48EC00FC17
+F04C5A4C5A4CC7FC160E5E5E5E5E4B5A4B5A4BC8FC150E5D5D15F84A7E14034A7EEC0EFF
+5C4A6C7E4A6C7EECE01FD9FFC07F4A6C7E4A6C7E5B6F7E6F7EA26F7E707EA2707E707E16
+0F83707E707EA283486C913807FF80B500FE013F13FCA336337EB23C>75
+D<B512FEA3D803FEC9FC6C5AB3A9EE0180A416031700A45EA25E5E5E5E16FE00031407B7
+FCA329337DB230>I<D8FFFC923801FFF86D5DA20003EFFE00D801BFED06FCA3D99F8014
+0CA2D98FC01418A3D987E01430A2D983F01460A3D981F814C0A3D980FCEB0180A2027EEB
+0300A36E1306A26E6C5AA36E6C5AA36E6C5AA26E6C5AA36E6C5AA3913800FD80A2037FC7
+FCA3486C133ED80FF04B7EB5011C90387FFFF8A33D337CB246>I<D8FFFE91381FFFF87F
+80C6030013006E143CD9DFE01418EBCFF0A2EBC7F8EBC3FCA2EBC1FEEBC0FF6E7EA26E7E
+6E7EA26E7E6E7E6E7EA26E7E6E7EA2ED7F80ED3FC0ED1FE0A2ED0FF0ED07F8A2ED03FCED
+01FEED00FFA2EE7F98EE3FD8A2EE1FF8160F1607A216031601A2486C1400D807F81578B5
+00C01438A2171835337EB23A>I<EC07FC91387FFFC0903901FC07F0903907E000FCD90F
+80133E013FC76C7E017E6E7E496E7E48486E7E48486E7EA248486E7E000F8249157E001F
+167FA24848ED3F80A2007F17C0A290C9121FA24817E0AB6C17C06D153FA3003F17806D15
+7FA2001F17006D5D000F5E6C6C4A5AA26C6C4A5A00015E6C6C4A5A017E4A5A6D4A5AD91F
+C0017FC7FCD907E013FC903901FC07F09039007FFFC0DA07FCC8FC33377CB43C>I<B612
+FEEDFFC016F03A03FC0007FC0001EC00FE167FEE3F80EE1FC017E0160FA217F0A617E0A2
+EE1FC0A2EE3F80EE7F0016FEED07F890B65A168001FCC9FCB3A2487EB512F8A32C337DB2
+34>I<B612FCEDFF8016F03A01FE0007FC0000EC01FEED007F707E707E83160F83A65FA2
+4C5AA24C5A047EC7FC4B5AED0FF090B612C093C8FC9039FE001FC0ED07F06F7E6F7E1500
+82167E167FA583A5180C17C0A2043F131C486C1618B500FEEB1FE0040F1338933807F070
+C93801FFE09338003F8036357EB239>82 D<90381FE00390387FFC0748B5FC3907F01FCF
+390F8003FF48C7FC003E80814880A200788000F880A46C80A27E92C7FC127F13C0EA3FF0
+13FF6C13F06C13FF6C14C06C14F0C680013F7F01037F9038003FFF140302001380157F15
+3FED1FC0150F12C0A21507A37EA26CEC0F80A26C15006C5C6C143E6C147E01C05B39F1FC
+03F800E0B512E0011F138026C003FEC7FC22377CB42B>I<007FB712FEA390398007F001
+D87C00EC003E0078161E0070160EA20060160600E01607A3481603A6C71500B3AB4A7E01
+1FB512FCA330337DB237>I<B500FE90381FFFF8A3000190C813006C48153C1718B3AF17
+38017F1530A217706D6C1460011F15E06E495A010F14036D6C495A6D6C49C7FCD901FC13
+1E6DB413FC91383FFFF0020F13C0020190C8FC35357EB23A>I<B500F0903803FFF8A3D8
+07FEC8EA7FC06C48ED1F000001161E6D151C00001618A26D15386D1530A26D6C5CA26E14
+E0011F5DA26D6C495AA28001074AC7FCA26D6C1306A28001015CA26E131C01001418806E
+5BA2ED8070023F1360A26E6C5AA215E1020F5BA2DA07F3C8FCA215FBEC03FEA36E5AA26E
+5AA31570A235357EB23A>I<B5D8F007B539800FFFF0A3000390C7273FF000011300D801
+FC6E48EB007C1A386D140F00001930836D020715706D1860A26E496C14E0013F60A26ED9
+19FC1301011F60A26ED930FE1303010F95C7FCA26ED9607F5B01071706A26E9039C03F80
+0E0103170CA2913BFC01801FC01C01011718A2913BFE03000FE03801001730A2DAFF06EB
+07F0027F5EA2038CEB03F8023F5EA203D8EB01FC021FEDFD80A203F0EB00FF020F93C8FC
+A24B800207157EA24B143E0203153CA24B141C020115184C357FB24F>I<267FFFFC90B5
+12C0A3000101E090381FF80026007F80EB0FC0013F6E5A6E91C7FC6D6C130E010F140C6E
+5B6D6C133801035C6E13606D6C13E06D6C485A5EDA7F83C8FCEC3FC715C6EC1FECEC0FFC
+5D14076E7EA26E7E815C6F7E9138063FC0140E4A6C7E9138180FF0EC380702707F913860
+03FCECC0010101804A6C7E49C77E4981010E6E7E010C6E7E131C496E7E01786E7E13FCD8
+07FEEC1FFEB56C90B512F8A335337EB23A>I<B500F8ECFFFEA300030180EC3FE06C90C8
+EA1F806CEE0E006D6C5C6D6C141817386D6C14305F6D6C14E06D6C5C16016D6C5C6D6C49
+C7FC5E6D6C13065E91387F801C91383FC018163891381FE0306E6C5A16E06E6C5AEDF980
+EC03FF6E90C8FC5D1400B14A7E91B512FCA337337FB23A>I<EAFFF0A4EAF000B3B3B3AD
+EAFFF0A40C4B79B715>91 D<EAFFF0A41200B3B3B3AD12FFA40C4B7FB715>93
+D<EB7F803803FFF0380F80FC381C003E003F133F6D6C7E6E7EA26E7EEA1F00C7FCA4EB01
+FF131FEBFF873803FC07EA0FF0EA1FC0EA3F80127F13004815C05AA3140FA26C131F6C13
+3B3A3F8071F180391FC1E1FF2607FFC013003900FE003C22237DA126>97
+D<EA03F012FFA312071203AEEC3F80ECFFE09038F3C0F89038F7007E01FE7F49EB1F8049
+EB0FC05BED07E016F0A2150316F8AA16F0150716E0A2ED0FC07F6DEB1F8001ECEB3F0001
+CF137C90388381F8903801FFE0C76CC7FC25357EB32B>I<EB07F8EB3FFF9038FC07C039
+01F000E03903E003F03807C007120FEA1F80123F90380003E04890C7FCA2127E12FEAA12
+7FA26C14187F001F14386D1330000F14706C6C13E03903F001C03900FC0F8090383FFE00
+EB07F01D237EA122>I<153FEC0FFFA3EC007F81AEEB07F0EB3FFCEBFC0F3901F003BF39
+07E001FF48487E48487F8148C7FCA25A127E12FEAA127E127FA27E6C6C5BA26C6C5B6C6C
+4813803A03F007BFFC3900F81E3FEB3FFCD90FE0130026357DB32B>I<EB0FE0EB7FFCEB
+F83F3903F00F80D807E013C0390FC007E0381F800315F0EA3F0014014814F8127EA212FE
+A2B6FCA248C8FCA5127E127FA26C1418A26C6C1338000F14306D13706C6C13E03901F003
+C03900FC0F00EB3FFEEB07F01D237EA122>I<EB01FCEB07FF90381F078090383E0FC0EB
+7C1F13FCEA01F8A20003EB070049C7FCACB512F0A3D803F0C7FCB3A7487E387FFFE0A31A
+357FB417>I<151F90391FC07F809039FFF8E3C03901F07FC73907E03F033A0FC01F8380
+9039800F8000001F80EB00074880A66C5CEB800F000F5CEBC01F6C6C48C7FCEBF07C380E
+FFF8380C1FC0001CC9FCA3121EA2121F380FFFFEECFFC06C14F06C14FC4880381F000100
+3EEB007F4880ED1F8048140FA56C141F007C15006C143E6C5C390FC001F83903F007E0C6
+B51280D91FFCC7FC22337EA126>I<EA03F012FFA312071203AEEC1FC0EC7FF09038F1E0
+FC9038F3807C9038F7007E13FE497FA25BA25BB3486CEB7F80B538C7FFFCA326347EB32B
+>I<EA0780EA0FC0EA1FE0A4EA0FC0EA0780C7FCAAEA07E012FFA3120F1207B3A6EA0FF0
+B5FCA310337EB215>I<EB03C0EB07E0EB0FF0A4EB07E0EB03C090C7FCAAEB03F013FFA3
+13071303B3B01238127C00FE13E0130714C0130F007C138038381F00EA1FFCEA07F01443
+84B217>I<EA03F012FFA312071203AF913803FFE0A36E1300EC00F8EC01E05D4A5A020F
+C7FC141C5C5C14F0EBF3F8EBF7FC13FEEBFC7EEBF87F496C7E141F6E7E8114076E7E8114
+016E7E81486CEBFF80B500C313F0A324347EB329>I<EA07E012FFA3120F1207B3B3A7EA
+0FF0B5FCA310347EB315>I<2703F01FE013FF00FF90267FF80313C0903BF1E07C0F03E0
+903BF3803E1C01F02807F7003F387FD803FE1470496D486C7EA2495CA2495CB3486C496C
+487EB53BC7FFFE3FFFF0A33C217EA041>I<3903F01FC000FFEB7FF09038F1E0FC9038F3
+807C3907F7007EEA03FE497FA25BA25BB3486CEB7F80B538C7FFFCA326217EA02B>I<EB
+07F0EB3FFE9038FC1F803901F007C03903C001E000078048486C7E48C7127CA248147E00
+3E143E007E143FA300FE1580A8007E1500A36C147EA26C147C6D13FC6C6C485A00075C39
+03F007E03900FC1F80D93FFEC7FCEB07F021237EA126>I<3903F03F8000FFEBFFE09038
+F3C0F89038F7007ED807FE7F6C48EB1F804914C049130F16E0ED07F0A3ED03F8A9150716
+F0A216E0150F16C06D131F6DEB3F80160001FF13FC9038F381F89038F1FFE0D9F07FC7FC
+91C8FCAA487EB512C0A325307EA02B>I<903807F00390383FFC07EBFC0F3901F8038F38
+07E001000F14DF48486CB4FC497F123F90C77E5AA25A5AA9127FA36C6C5B121F6D5B000F
+5B3907E003BF3903F0073F3800F81EEB3FF8EB0FE090C7FCAAED7F8091380FFFFCA32630
+7DA029>I<3803E07C38FFE1FF9038E38F809038E71FC0EA07EEEA03ECA29038FC0F8049
+C7FCA35BB2487EB512E0A31A217FA01E>I<EBFF06000713CE381F00FE003C133E48131E
+140E5A1406A27EA200FE90C7FC6C7EEA7FFC383FFFC014F0000F7F6C7FC67FEB0FFF1300
+EC3F8000C0131F140F6C1307A37E15006C5B6C130E6C5B38F7807838E1FFE038C07F8019
+237EA11E>I<1330A51370A313F0A21201A212031207381FFFFEB5FCA23803F000AF1403
+A814073801F806A23800FC0EEB7E1CEB1FF8EB07E0182F7FAD1E>I<D803F0133F00FFEB
+0FFFA30007EB007F000380B35DA35D12016D4813800000903803BFFC90387E073FEB1FFE
+D907F8130026227EA02B>I<B5EBFFF0A3D80FF0EB3F800007EC1F000003140E150C6D13
+1C00011418A26C6C5BA26D1370017E1360137F6D5BA290381F8180A214C3010F90C7FCA2
+EB07E6A214FE6D5AA26D5AA36D5AA2146024217E9F29>I<B53A1FFF81FFF0A33C07F801
+FC003F8001F049EB1E0000030100141C816C6C017C1318A26D017E1338000002FE1330A2
+90267E01FF5B159F168090263F030F5BA216C0903A1F8607C180A202C613E390260FCC03
+90C7FCA2D907FC13F6ECF80116FE6D486C5AA36D481378A36D48133034217F9F37>I<B5
+3801FFF8A32603FE0013806C48EB7C0000001478017E1370017F5B90383F81C090381F83
+80D90FC3C7FCEB07E614FE6D5A6D5A6D7E80805B9038039F809038071FC09038060FE0EB
+0C0790381C03F0496C7E01707FEBF000000180000FECFF8026FFFC0313FCA326207F9F29
+>I<3A7FFF807FF8A33A07F8001FC00003EC0F800001EC070015066C6C5BA26D131C017E
+1318A26D5BA2EC8070011F1360ECC0E0010F5BA2903807E180A214F3010390C7FC14FBEB
+01FEA26D5AA31478A21430A25CA214E05CA2495A1278D8FC03C8FCA21306130EEA701CEA
+7838EA1FF0EA0FC025307F9F29>I<003FB512F0A2EB000F003C14E00038EB1FC00030EB
+3F800070137F1500006013FE495A13035CC6485A495AA2495A495A49C7FC153013FE485A
+12035B48481370485A001F14604913E0485A387F000348130F90B5FCA21C207E9F22>I
+E /Fi 27 117 df<B61280A819087F9620>45 D<EA0F80EA3FE0EA7FF0A2EAFFF8A5EA7F
+F0A2EA3FE0EA0F80C7FCABEA0F80EA3FE0EA7FF0A2EAFFF8A5EA7FF0A2EA3FE0EA0F800D
+2579A41B>58 D<DB3FFCEB01C00203B5EAC003021FECF00791B6EAFC0F01039039FC00FF
+3F4901C0EB1FFFD91FFEC77E49481403D97FF080494880485B48177F4849153F4890C9FC
+181F485A180F123F5B1807127FA24993C7FC12FFAD127F7FF003C0123FA27F001F1707A2
+6C6C1780180F6C6D16006C6D5D6C173E6C6D157ED97FF85D6D6C4A5A6DB44A5A010701C0
+EB0FE06D01FCEBFF80010090B548C7FC021F14F8020314E09126003FFEC8FC3A3B7BB945
+>67 D<B87E17F817FF18C028007FF8000713F09338007FF8EF1FFE717E050313807113C0
+A27113E0F07FF0A2F03FF8A219FC181FA219FEA419FFAC19FEA419FC183FA219F8187F19
+F0F0FFE0A24D13C04D13804D1300EF1FFEEF7FFC933807FFF0B912C095C7FC17FC178040
+397DB849>I<B912F0A426007FF8C7FCEF1FF8170717031701A21700A21878A3043C137C
+183CA41800167CA216FC150391B5FCA4ECF8031500167CA2163C180FA3181EA293C7FCA2
+183EA2183C187CA218FCA2EF01F81703170F173FEE01FFB9FC18F0A338397DB83F>I<B9
+12C0A43A007FF800039338007FE0171F170F1707A21703A21701A318F0EE7800A41800A2
+16F8A21501150791B5FCA4ECF80715011500A21678A693C8FCADB7FCA434397DB83C>I<
+B612FCA439007FF800B3B3ADB612FCA41E397DB824>73 D<B600FC0103B512C0A426007F
+F8C8381FE00019804EC7FC18FEEF01F84D5A4D5A4D5AEF3F80057EC8FC5F4C5A4C5AEE0F
+E0EE1F804CC9FC167E5EED03F84B7E4B7E4B7E4B7F5D02F9B57EDAFBF77FDAFFE37F15C1
+03807F4A487F4A6D7E4A133F707E707F8482707F707F8482717E717E8483717F717F8583
+85B600FC017FEBFFE0A443397DB84B>75 D<B500FC0203B512F0A28080C66C6D90390003
+F0006F6E5A81017B7F13798101787F6E7E6E7E6E7F6E7FA26E7F6E7F6E7F6E7F6F7E153F
+826F13806F13C06F13E06F13F06F13F88117FCEE7FFEEE3FFF7013817013C17013E18218
+F17013F97013FDEF7FFF8383A28383838383187FA2183F181F01FC160FB500FC15071803
+1801A244397DB84B>78 D<EDFFF8020FEBFF80027F14F0903A01FFC01FFC010790380007
+FFD91FFC010113C0D93FF06D6C7E49486E7E49486E7E48496E7E48834890C86C7EA24848
+6F1380A248486F13C0A2003F18E0A348486F13F0A400FF18F8AC007F18F06D5DA3003F18
+E0A26D5D001F18C0A26C6C4B13806C18006E5C6C6D4A5A6C5F6C6D4A5A6D6C4A5AD93FFC
+49485A6DB401075B0107D9C01F90C7FC010190B512FC6D6C14F0020F1480020001F8C8FC
+3D3B7BB948>I<B8FC17F017FEEFFF8028007FF8000F13C0040113E07013F0EF7FF8EF3F
+FCA2EF1FFEA218FFA818FEA2EF3FFCA2EF7FF8EFFFF04C13E0040F13C091B7120017FC17
+E002F8C9FCB3A4B612FCA438397DB841>I<B712FCEEFFE017FC17FF28007FF8000F13C0
+04017F707F717E717EA2717EA284A760A24D5A604D5A4D5A04035B041F90C8FC91B612FC
+17E0839139F8003FFCEE0FFF707F707F8284A2707FA584A51A601AF084177F1901DD3FFE
+13E0B600FC011F130394390FFF87C071EBFF8005011400CBEA1FFC443A7DB848>82
+D<D907FF130E013FEBE01E90B5EAF83E0003ECFE7E3A07FC01FFFE390FF0001F4848130F
+48481303491301007F140090C8FC167E5A163EA27F161E7F7F6D91C7FC13FC387FFFE014
+FEECFFF06C14FE6F7E6C816C15F06C816C81C681133F010F801301D9000F1480EC007F03
+0F13C01503818100F0157FA3163FA27E17807E167F6C16007E6D14FE01E0495A01F81303
+9039FF801FF800FC90B512E0D8F83F5CD8F00749C7FC39E0007FF02A3B7BB935>I<003F
+B91280A4D9F800EBF003D87FC09238007FC049161F007EC7150FA2007C1707A200781703
+A400F818E0481701A4C892C7FCB3AE010FB7FCA43B387DB742>I<B6D8E01FB500FC9038
+3FFFFCA4000101F0C7D83FFCC8EA7E006C71153C171F6E197C017F701578836E7014F801
+3F6F5E6E1801011F4B6D5CA26E18036D4B6D5CA26D6D496D495A173C6F170F6D037C6D91
+C7FCEF787F6F5F6D4B6C6C131E816D02016E5BEFE01F03F8177C027F01036E13784D7E03
+FCEE80F8023F49486C5C15FE021F010FEDC1E04D7E03FF16C36E49EDE3C0041E7F049E15
+F76E01BC6D5C04FC15FF6E95C8FC4C80A26E5F4C143F6E5F4C141FA2037F5E4C140FA26F
+486E5AA2031F5E93C812036F5E5E3A7EB863>87 D<B600F049B512E0A4C601FCC8380FF0
+00017F705A6E4B5A6D6C4B5A6D7F4EC7FC6D6D147E6D7F606D6D495A6D7F4D5A6D6D495A
+6E7E4D5A6E6C495A6E13804DC8FC6EEBC07E6E13E05F6EEBF1F86E13F9EEFBF06EEBFFE0
+815F6F5B816F90C9FCB3A2021FB6FCA443397EB848>89 D<903801FFC0010F13FC017F13
+FFD9FF8013802603FE0013C048485AEA0FF8121F13F0123F6E13804848EB7F00151C92C7
+FC12FFA9127FA27F123FED01E06C7E15036C6CEB07C06C6C14806C6C131FC69038C07E00
+6DB45A010F13F00101138023257DA42A>99 D<903803FF80011F13F0017F13FC3901FF83
+FE3A03FE007F804848133F484814C0001FEC1FE05B003FEC0FF0A2485A16F8150712FFA2
+90B6FCA301E0C8FCA4127FA36C7E1678121F6C6C14F86D14F000071403D801FFEB0FE06C
+9038C07FC06DB51200010F13FC010113E025257DA42C>101 D<13FFB5FCA412077EAFED
+7FC0913803FFF8020F13FE91381F03FFDA3C01138014784A7E4A14C05CA25CA291C7FCB3
+A3B5D8FC3F13FFA4303A7DB935>104 D<EA01F0EA07FC487EA2487EA56C5AA26C5AEA01
+F0C8FCA913FF127FA412077EB3A9B512F8A4153B7DBA1B>I<13FFB5FCA412077EB3B3AC
+B512FCA4163A7DB91B>108 D<01FED97FE0EB0FFC00FF902601FFFC90383FFF80020701
+FF90B512E0DA1F81903983F03FF0DA3C00903887801F000749DACF007F00034914DE6D48
+D97FFC6D7E4A5CA24A5CA291C75BB3A3B5D8FC1FB50083B512F0A44C257DA451>I<01FE
+EB7FC000FF903803FFF8020F13FE91381F03FFDA3C011380000713780003497E6D4814C0
+5CA25CA291C7FCB3A3B5D8FC3F13FFA430257DA435>I<903801FFC0010F13F8017F13FF
+D9FF807F3A03FE003FE048486D7E48486D7E48486D7EA2003F81491303007F81A300FF16
+80A9007F1600A3003F5D6D1307001F5DA26C6C495A6C6C495A6C6C495A6C6C6CB45A6C6C
+B5C7FC011F13FC010113C029257DA430>I<9038FE03F000FFEB0FFEEC3FFF91387C7F80
+9138F8FFC000075B6C6C5A5CA29138807F80ED3F00150C92C7FC91C8FCB3A2B512FEA422
+257EA427>114 D<90383FF0383903FFFEF8000F13FF381FC00F383F0003007E1301007C
+130012FC15787E7E6D130013FCEBFFE06C13FCECFF806C14C06C14F06C14F81203C614FC
+131F9038007FFE140700F0130114007E157E7E157C6C14FC6C14F8EB80019038F007F090
+B512C000F8140038E01FF81F257DA426>I<130FA55BA45BA25B5BA25A1207001FEBFFE0
+B6FCA3000390C7FCB21578A815F86CEB80F014816CEBC3E090383FFFC06D1380903803FE
+001D357EB425>I E /Fj 23 117 df<EA07C0EA1FF0EA3FF8EA7FFCEAFFFEA7EA7FFCEA
+3FF8EA1FF0EA07C00F0F788E1F>46 D<EA07C0EA1FF0EA3FF8EA7FFCEAFFFEA7EA7FFCEA
+3FF8EA1FF0EA07C0C7FCAEEA07C0EA1FF0EA3FF8EA7FFCEAFFFEA7EA7FFCEA3FF8EA1FF0
+EA07C00F2C78AB1F>58 D<B9FC18F018FE727E19E026003FFEC7001F13F805017F943800
+3FFF060F7F727F727F727F84737E737EA2737EA2737EA21B80A2851BC0A51BE0AD1BC0A5
+1B8061A21B006162193F624F5A19FF624E5B06075B4E5B063F90C7FC4DB45A050F13F8BA
+5A19C04EC8FC18F095C9FC4B447CC356>68 D<BA12F8A485D8001F90C71201EF003F180F
+180318011800A2197E193EA3191EA21778A285A405F890C7FCA316011603161F92B5FCA5
+ED001F160316011600A2F101E01778A2F103C0A494C7FC1907A21A80A2190FA2191FA219
+3FF17F0061601807181F4DB5FCBBFC61A443447DC34A>I<BA1280A419C026003FFEC712
+1F1701EF007F183F181F180F180719E01803A31801A3EE01E0F000F0A419001603A31607
+160F167F91B6FCA59138FE007F160F16071603A31601A693C9FCAFB712F0A53C447CC346
+>I<B712E0A5D8001F90C7FCB3B3B3A4B712E0A523447DC32A>73
+D<B712F0A526003FFECAFCB3B1F00780A4180F1900A460A360A2187EA218FE1701170317
+07171F177FEE03FFB95AA539447CC343>76 D<B9FC18F018FE727E19E0D8001F90C7000F
+7F05017F716C7E727E727E721380A21AC084A21AE0A91AC0A24E1380A21A00604E5A4E5A
+4D485A050F5B92B712C096C7FC18FC18C092CBFCB3A7B712E0A543447DC34D>80
+D<003FBA12E0A59026FE000FEB8003D87FE09338003FF049171F90C71607A2007E180300
+7C1801A300781800A400F819F8481978A5C81700B3B3A20107B8FCA545437CC24E>84
+D<B600FE017FB691B512FEA526007FFCC8D83FFEC9EA7C006E82013F701778807415F86D
+705F6F7014016D705FA26F7014036D64814E6D14076D646F70140F6D041E94C7FCA26F02
+3E6D5C6DDC3C7F151E81027F037C6D5CF0783F6F70147C023F4B6C1578A26F01016F13F8
+6E4B6C5D16806E02036F485A4E7E04C0EEE0036E4A486C5DA2DCE00FEDF0076E4B6C5D16
+F06E4A6F48C8FC051E7F04F8705A6E4A027F131EA2DCFC7CEDFE3E037F0178023F133C04
+FE16FF033F01F85E4D8004FF17F86F496E5BA36F496E5BA26F604D80A26F90C86C5BA36F
+486F90C9FCA26F48167EA30478163C6F457EC374>87 D<903801FFE0011F13FE017F6D7E
+48B612E03A03FE007FF84848EB1FFC6D6D7E486C6D7EA26F7FA36F7F6C5A6C5AEA00F090
+C7FCA40203B5FC91B6FC1307013F13F19038FFFC01000313E0000F1380381FFE00485A5B
+127F5B12FF5BA35DA26D5B6C6C5B4B13F0D83FFE013EEBFFC03A1FFF80FC7F0007EBFFF8
+6CECE01FC66CEB8007D90FFCC9FC322F7DAD36>97 D<EE03FEED07FFA5ED001F160FB1EC
+3FE0903803FFFC010FEBFF8F013F14CF9039FFF807FF48EBC00148903880007F4890C712
+3F4848141F49140F121F485AA3127F5BA212FFAC127FA37F123FA26C6C141FA26C6C143F
+0007157F6C6C91B5FC6CD9C00314FC6C9038F01FEF6DB5128F011FEBFE0F010713F89026
+007FC0EBF80036467CC43E>100 D<EC3FF80103B57E010F14E0013F8090397FF83FF890
+39FFC007FC48496C7E48496C7E48486D1380485A001FED7FC05B003FED3FE0A2127F5B17
+F0161F12FFA290B7FCA401F0C9FCA5127FA27FA2123F17F06C7E16016C6C15E06C6C1403
+6C6DEB07C06C6DEB0F806C01F0EB3F0090397FFE01FE011FB55A010714F0010114C09026
+001FFEC7FC2C2F7DAD33>I<DAFFE0137E010F9039FE03FF80013FEBFF8F90B812C048D9
+C07F133F489038001FF84848EB0FFC4848903907FE1F80001F9238FF0F00496D90C7FCA2
+003F82A8001F93C7FCA26D5B000F5D6C6C495A6C6C495A6C9038C07FF04890B55A1680D8
+078F49C8FC018013E0000F90CAFCA47F7F7F90B612C016FC6CEDFF8017E06C826C16FC7E
+000382000F82D81FF0C77ED83FC014074848020113808248C9FC177FA46D15FF007F1700
+6D5C6C6C4A5A6C6C4A5AD80FFEEC3FF83B07FFC001FFF0000190B612C06C6C92C7FC010F
+14F8D9007F90C8FC32427DAC38>103 D<137C48B4FC4813804813C0A24813E0A56C13C0
+A26C13806C1300EA007C90C7FCAAEB7FC0EA7FFFA512037EB3AFB6FCA518467CC520>
+105 D<EB7FC0B5FCA512037EB3B3B3A3B61280A519457CC420>108
+D<90277F8007FEEC0FFCB590263FFFC090387FFF8092B5D8F001B512E002816E4880913D
+87F01FFC0FE03FF8913D8FC00FFE1F801FFC0003D99F009026FF3E007F6C019E6D013C13
+0F02BC5D02F86D496D7EA24A5D4A5DA34A5DB3A7B60081B60003B512FEA5572D7CAC5E>
+I<90397F8007FEB590383FFF8092B512E0028114F8913987F03FFC91388F801F00039039
+9F000FFE6C139E14BC02F86D7E5CA25CA35CB3A7B60083B512FEA5372D7CAC3E>I<EC1F
+FC49B512C0010714F0011F14FC90397FF80FFF9026FFC0017F48496C7F4848C7EA3FE000
+078248486E7E49140F001F82A2003F82491407007F82A400FF1780AA007F1700A46C6C4A
+5AA2001F5E6D141F000F5E6C6C4A5AA26C6C6CEBFFE06C6D485B27007FF80F90C7FC6DB5
+5A010F14F8010114C09026001FFCC8FC312F7DAD38>I<90397FC00FF8B590B57E02C314
+E002CF14F89139DFC03FFC9139FF001FFE000301FCEB07FF6C496D13804A15C04A6D13E0
+5C7013F0A2EF7FF8A4EF3FFCACEF7FF8A318F017FFA24C13E06E15C06E5B6E4913806E49
+13006E495A9139DFC07FFC02CFB512F002C314C002C091C7FCED1FF092C9FCADB67EA536
+407DAC3E>I<90387F807FB53881FFE0028313F0028F13F8ED8FFC91389F1FFE000313BE
+6C13BC14F8A214F0ED0FFC9138E007F8ED01E092C7FCA35CB3A5B612E0A5272D7DAC2E>
+114 D<90391FFC038090B51287000314FF120F381FF003383FC00049133F48C7121F127E
+00FE140FA215077EA27F01E090C7FC13FE387FFFF014FF6C14C015F06C14FC6C80000380
+6C15806C7E010F14C0EB003F020313E0140000F0143FA26C141F150FA27EA26C15C06C14
+1FA26DEB3F8001E0EB7F009038F803FE90B55A00FC5CD8F03F13E026E007FEC7FC232F7C
+AD2C>I<EB01E0A51303A41307A2130FA2131FA2133F137F13FF1203000F90B51280B7FC
+A4C601E0C7FCB3A3ED01E0A9150302F013C0137F150790393FF80F8090391FFC1F006DB5
+FC6D13FC01015B9038003FE023407EBE2C>I E /Fk 69 123 df<DA0FF813FC91397FFF
+07FF903B01F807DF83C0903A07E001FF0F903B1F8007FE1FE090393F000FFC137E16F85B
+9338F007804848010790C7FC1503ACB812F8A32801F80003F0C7FCB3AB486C497E267FFF
+E0B512F0A3333B7FBA30>11 D<EC0FF8EC7FFE903901F80780903907E001C090391F8000
+E090383F0007017E497EA25BA2485A6F5AED018092C8FCA9ED03F0B7FCA33901F8000F15
+03B3AA486C497E267FFFE0B512C0A32A3B7FBA2E>I<EC0FFC91387FFF70903901F803F0
+903807E00790381F800FEB3F00137EA25B150748481303ADB7FCA33901F80003B3AB486C
+497E267FFFE0B512C0A32A3B7FBA2E>I<121C127FEAFF80A8EA7F00AB123EAB121CABC7
+FCA8121C127FEAFF80A5EA7F00121C093C79BB17>33 D<001C131C007F137F39FF80FF80
+A26D13C0A3007F137F001C131C00001300A40001130101801380A2000313030100130048
+5B00061306000E130E485B485B485B006013601A197DB92A>I<030C1303031E497EA203
+3E130FA2033C91C7FCA2037C5BA20378131EA303F8133EA24B133CA20201147CA24B1378
+A2020314F8A24B5BA302071301007FB91280BA12C0A26C1880C7271F0007C0C7FC021E5C
+A3023E130FA2023C91C8FCA2027C5BA20278131EA302F8133E007FB91280BA12C0A26C18
+80280003E000F8C8FC4A5BA301071301A202805BA2010F1303A202005BA2491307A2011E
+5CA3013E130FA2013C91C9FCA2017C5BA20178131EA20130130C3A4A7BB945>I<121C12
+7FEAFF80A213C0A3127F121C1200A412011380A2120313005A1206120E5A5A5A12600A19
+79B917>39 D<146014E0EB01C0EB0380EB0700130E131E5B5BA25B485AA2485AA212075B
+120F90C7FCA25A121EA2123EA35AA65AB2127CA67EA3121EA2121F7EA27F12077F1203A2
+6C7EA26C7E1378A27F7F130E7FEB0380EB01C0EB00E01460135278BD20>I<12C07E1270
+7E7E7E120F6C7E6C7EA26C7E6C7EA21378A2137C133C133E131EA2131F7FA21480A3EB07
+C0A6EB03E0B2EB07C0A6EB0F80A31400A25B131EA2133E133C137C1378A25BA2485A485A
+A2485A48C7FC120E5A5A5A5A5A13527CBD20>I<121C127FEAFF80A213C0A3127F121C12
+00A412011380A2120313005A1206120E5A5A5A12600A19798817>44
+D<B512FCA516057F941C>I<121C127FEAFF80A5EA7F00121C0909798817>I<150C151E15
+3EA2153C157CA2157815F8A215F01401A215E01403A215C01407A21580140FA215005CA2
+141E143EA2143C147CA2147814F8A25C1301A25C1303A2495AA25C130FA291C7FC5BA213
+1E133EA2133C137CA2137813F8A25B1201A25B1203A25B1207A25B120FA290C8FC5AA212
+1E123EA2123C127CA2127812F8A25A12601F537BBD2A>I<EB03F8EB1FFF90387E0FC090
+38F803E03901E000F0484813780007147C48487FA248C77EA2481580A3007EEC0FC0A600
+FE15E0B3007E15C0A4007F141F6C1580A36C15006D5B000F143EA26C6C5B6C6C5B6C6C48
+5A6C6C485A90387E0FC0D91FFFC7FCEB03F8233A7DB72A>I<EB01C013031307131F13FF
+B5FCA2131F1200B3B3A8497E007FB512F0A31C3879B72A>I<EB0FF0EB7FFE48B57E3903
+E03FE0390F000FF0000E6D7E486D7E486D7E123000706D7E126012FCB4EC7F807FA56CC7
+FC121CC8FCEDFF00A34A5A5D14035D4A5A5D140F4A5A4A5A92C7FC147C5C495A495A495A
+495A91C8FC011EEB01805B5B49130348481400485A485A000EC75A000FB6FC5A5A485CB6
+FCA321387CB72A>I<EB07F8EB3FFF4913C03901F80FF03903C007F848486C7E380E0001
+000F80381FE0006D7FA56C5A6C5AC85A1401A25D4A5AA24A5A5DEC0F80027EC7FCEB1FFC
+ECFF809038000FE06E7EEC01FC816E7EED7F80A216C0A2153F16E0A2121EEA7F80487EA4
+16C049137F007F1580007EC7FC0070ECFF006C495A121E390F8003F83907F00FF00001B5
+12C06C6C90C7FCEB0FF8233A7DB72A>I<1538A2157815F8A2140114031407A2140F141F
+141B14331473146314C313011483EB030313071306130C131C131813301370136013C012
+01EA038013005A120E120C5A123812305A12E0B712F8A3C73803F800AB4A7E0103B512F8
+A325397EB82A>I<0006140CD80780133C9038F003F890B5FC5D5D158092C7FC14FC3806
+7FE090C9FCABEB07F8EB3FFE9038780F803907E007E090388003F0496C7E12066E7EC87E
+A28181A21680A4123E127F487EA490C71300485C12E000605C12700030495A00385C6C13
+03001E495A6C6C485A3907E03F800001B5C7FC38007FFCEB1FE0213A7CB72A>I<EC3FC0
+903801FFF0010713FC90380FE03E90383F800790387E001F49EB3F804848137F485AA248
+5A000FEC3F0049131E001F91C7FCA2485AA3127F90C9FCEB01FC903807FF8039FF1E07E0
+90383801F0496C7E01607F01E0137E497FA249148016C0151FA290C713E0A57EA56C7E16
+C0A2121FED3F807F000F15006C6C5B15FE6C6C5B6C6C485A3900FE07F090383FFFC06D90
+C7FCEB03FC233A7DB72A>I<EB03F8EB1FFF017F13C09038FC07F03901E001F848486C7E
+4848137C90C77E48141E000E141F001E80A3121FA27F5D01E0131E6C6C133E01FC133C6D
+5B6C6C6C5AECC1E06CEBF3C06C01FFC7FC6C5BEB3FFF6D13C081017F13F801F07F3903E0
+7FFE3907801FFF48486C1380481303003E6D13C0003CEB007F007C143F0078EC0FE000F8
+14075A1503A21501A36C15C012781503007C15806CEC07006C5C6C6C131ED807E0137C39
+03F803F0C6B55A013F1380D907FCC7FC233A7DB72A>56 D<EB03F8EB1FFF017F13C09038
+FC07E03903F803F048486C7E48486C7E49137E121F48487FA2007F158090C7FCA248EC1F
+C0A616E0A56C143FA27F123F001F147FA26C6C13FF6C6C13DF000313013901F0039F3900
+FC0F1FD93FFC13C0EB07F090C7FC153F1680A316005D000F147E487E486C5BA24A5A4A5A
+49485A6C48485A001C495A260F807FC7FC3807FFFC000113F038003FC0233A7DB72A>I<
+121C127FEAFF80A5EA7F00121CC7FCB2121C127FEAFF80A5EA7F00121C092479A317>I<
+1538A3157CA315FEA34A7EA34A6C7EA202077FEC063FA2020E7FEC0C1FA2021C7FEC180F
+A202387FEC3007A202707FEC6003A202C07F1501A2D901807F81A249C77F167FA2010681
+0107B6FCA24981010CC7121FA2496E7EA3496E7EA3496E7EA213E0707E1201486C81D80F
+FC02071380B56C90B512FEA3373C7DBB3E>65 D<B712E016FC16FF0001903980007FC06C
+90C7EA1FE0707E707E707EA2707EA283A75F16035F4C5A4C5A4C5A4C5AEEFF8091B500FC
+C7FCA291C7EA7F80EE1FE0EE07F0707E707E83707EA21880177F18C0A7188017FFA24C13
+005F16034C5AEE1FF8486DEB7FF0B812C094C7FC16F832397DB83B>I<913A01FF800180
+020FEBE003027F13F8903A01FF807E07903A03FC000F0FD90FF0EB039F4948EB01DFD93F
+80EB00FF49C8127F01FE153F12014848151F4848150FA248481507A2485A1703123F5B00
+7F1601A35B00FF93C7FCAD127F6DED0180A3123F7F001F160318006C7E5F6C7E17066C6C
+150E6C6C5D00001618017F15386D6C5CD91FE05C6D6CEB03C0D903FCEB0F80902701FF80
+3FC7FC9039007FFFFC020F13F002011380313D7BBA3C>I<B712C016F816FE0001903980
+01FF806C90C7EA3FE0EE0FF0EE03F8707E707E177FA2EF3F8018C0171F18E0170F18F0A3
+EF07F8A418FCAC18F8A4EF0FF0A218E0A2171F18C0EF3F80A2EF7F0017FE4C5A4C5AEE0F
+F0EE3FE0486DEBFF80B8C7FC16F816C036397DB83F>I<B812FCA30001903880000F6C90
+C71201EE007E173E171E170EA31706A317078316C0A394C7FCA31501A21503150F91B5FC
+A3EC000F15031501A21500A21860A318E093C712C0A41701A3EF0380A21707A2170F173F
+177F486D903807FF00B9FCA333397DB839>I<B812F8A30001903880001F6C90C71201EE
+00FC177C173C171CA2170CA4170E1706A2ED0180A21700A41503A21507151F91B5FCA3EC
+001F15071503A21501A692C8FCAD4813C0B612C0A32F397DB836>I<B648B512FEA30001
+902680000313006C90C76C5AB3A491B6FCA391C71201B3A6486D497EB648B512FEA33739
+7DB83E>72 D<B612C0A3C6EBC0006D5AB3B3AD497EB612C0A31A397EB81E>I<013FB512
+E0A39039001FFC00EC07F8B3B3A3123FEA7F80EAFFC0A44A5A1380D87F005B0070131F6C
+5C6C495A6C49C7FC380781FC3801FFF038007F80233B7DB82B>I<B649B5FCA300010180
+9038007FF06C90C8EA3F80053EC7FC173C17385F5F4C5A4C5A4CC8FC160E5E5E5E5E4B5A
+ED0780030EC9FC5D153E157E15FF5C4A7F4A6C7E140E4A6C7E4A6C7E14704A6C7E4A6C7E
+14804A6C7E6F7EA26F7F707EA2707E707EA2707EA2707E707EA2707E707F8484486D497F
+B6011FEBFF80A339397DB841>I<B612E0A3000101C0C8FC6C90C9FCB3AD1718A5173817
+30A31770A317F0A216011603160FEE1FE0486D13FFB8FCA32D397DB834>I<B5933807FF
+F86E5DA20001F0FC002600DFC0ED1BF8A2D9CFE01533A3D9C7F01563A3D9C3F815C3A2D9
+C1FCEC0183A3D9C0FEEC0303A2027F1406A36E6C130CA36E6C1318A26E6C1330A36E6C13
+60A26E6C13C0A3913901FC0180A3913900FE0300A2ED7F06A3ED3F8CA2ED1FD8A3ED0FF0
+A3486C6D5A487ED80FFC6D48497EB500C00203B512F8A2ED018045397DB84C>I<B59138
+07FFFE8080C69238007FE06EEC1F80D9DFF0EC0F001706EBCFF8EBC7FCA2EBC3FEEBC1FF
+A201C07F6E7EA26E7E6E7E81140F6E7E8114036E7E168080ED7FC016E0153FED1FF0ED0F
+F8A2ED07FCED03FEA2ED01FF6F1386A2EE7FC6EE3FE6A2EE1FF6EE0FFEA216071603A216
+011600A2177E486C153E487ED80FFC151EB500C0140EA2170637397DB83E>I<EC03FF02
+1F13E09138FE01FC903901F8007ED907E0EB1F8049486D7ED93F80EB07F049C76C7E01FE
+6E7E48486E7E49157E0003167F4848ED3F80A24848ED1FC0A2001F17E049150F003F17F0
+A3007F17F8491507A300FF17FCAC007F17F86D150FA3003F17F0A26C6CED1FE0A36C6CED
+3FC0000717806D157F000317006C6C15FEA26C6C4A5A017F4A5A6D6C495A6D6C495AD907
+E0EB1F80D903F8017FC7FC903900FE01FC91381FFFE0020390C8FC363D7BBA41>I<B712
+C016F816FE000190398001FF806C90C7EA3FC0EE0FE0EE07F0EE03F817FC17FE1601A217
+FFA717FEA2EE03FCA2EE07F817F0EE0FE0EE3FC0923801FF0091B512FC16F091C9FCB3A5
+487FB6FCA330397DB839>I<B612FEEDFFE016F8000190388007FE6C90C76C7EEE3FC070
+7E707E707EA2707EA283A65FA24C5AA24C5A4C5AEE3F8004FFC8FCED07FC91B512E05E91
+38000FF0ED03F8ED00FE82707E707EA2161F83A583A6F00180A217F8160F1803486D0107
+1400B66D6C5A04011306933800FE0ECAEA3FFCEF07F0393B7DB83D>82
+D<D90FF813C090383FFE0190B512813903F807E33907E000F74848137F4848133F48C712
+1F003E140F007E1407A2007C140312FC1501A36C1400A37E6D14006C7E7F13F86CB47E6C
+13F8ECFF806C14E06C14F86C14FEC680013F1480010714C0EB007F020713E0EC007FED3F
+F0151F150FED07F8A200C01403A21501A37EA216F07E15036C15E06C14076C15C06C140F
+6DEB1F80D8FBF0EB3F00D8F0FE13FE39E03FFFF8010F13E0D8C00190C7FC253D7CBA2E>
+I<003FB812E0A3D9C003EB001F273E0001FE130348EE01F00078160000701770A3006017
+30A400E01738481718A4C71600B3B0913807FF80011FB612E0A335397DB83C>I<B69038
+07FFFEA3000101809038007FE06C90C8EA1F80EF0F001706B3B2170E6D150C80171C133F
+17186D6C14385F6D6C14F06D6C5C6D6C495A6D6CEB07806D6C49C7FC91387F807E91381F
+FFF8020713E09138007F80373B7DB83E>I<B500FC91387FFF80A30003018091380FFC00
+6C90C8EA07E0715A6C705A6E1403017F93C7FCA280013F1506A26E140E011F150C80010F
+5DA28001075DA26E147001031560A26D6C5CA2806D4A5AA2ED8003027F91C8FCA291383F
+C006A215E0021F5BA2EDF01C020F1318A26E6C5AA215FC02035BA2EDFEE002015BA26E6C
+5AA36FC9FCA3153EA2151CA3393B7EB83E>I<B5D8FC07B5D8F001B5FCA3000790278000
+1FFEC7EA1FF86C48C7D80FF8EC07E000010307ED03C01B807F6C6F6C1500A26E5F017F6E
+6C1406A280013F4A6C5CA280011F4A6D5BEE067FA26D6C010E6D5BEE0C3FA26D6C011C6D
+5BEE181FA26D6C6F5BEE300FA26D6C6F485AEE6007A26D6C4CC7FC9338C003FCA203805D
+913B7F818001FE06A203C1150EDA3FC3C7EAFF0CA203E3151CDA1FE6EC7F98A215F6DA0F
+FCEC3FF0A302075E4B141FA202035E4B140FA202015E4B1407A2020093C8FC4B80503B7E
+B855>I<B500FE91383FFFE0A3000301E0913807FE00C649EC03F0017F6F5A606D6C5D6D
+6C140395C7FC6D6C1406A26D6C5C6D6C141C17186D6C143817306D6D5B6E6C13E05F9138
+3FE0015F91381FF003DA0FF890C8FC1606913807FC0E160C913803FE1C913801FF185E6E
+13B016E0157F6F5AB3A24B7E023FB512C0A33B397FB83E>89 D<EB1FE0EBFFFC3803E03F
+3907000F80390F8007E0486C6C7E13E06E7EA26E7E6C5A6C5AC8FCA4147FEB07FFEB3FE0
+EBFE00EA03F8EA0FF0EA1FC0123F485A90C7FC160C12FEA31401A26C13036CEB077C9039
+80063E18383FC01E3A0FE0781FF03A03FFF00FE03A007F8007C026277DA52A>97
+D<EA03F012FFA3120F1203B0EC1FE0EC7FF89038F1E03E9039F3801F809039F7000FC001
+FEEB07E049EB03F049EB01F85BED00FCA216FEA2167E167FAA167E16FEA216FC15016D14
+F8ED03F07F01EEEB07E001C6EB0FC09039C7801F00903881E07E903800FFF8C7EA1FC028
+3B7EB92E>I<EB03FC90381FFF8090387E03E03901F80070484813F83907E001FC380FC0
+03A2EA1F80123F90380001F848EB00F01500A2127E12FEAA127E127FA26C14067F001F14
+0E6D130C000F141C6C6C13386C6C13706C6C13E039007C07C090381FFF00EB07F81F277D
+A525>I<ED0FC0EC03FFA3EC003F150FB0EB03F8EB1FFF90387E078F9038F801EF3903F0
+007F4848133F4848131FA24848130F123F90C7FC5AA2127E12FEAA127E127FA27EA26C6C
+131FA26C6C133F6C6C137F6C6CEBEFF03A01F801CFFF39007C078F90381FFE0FD907F813
+C0283B7DB92E>I<EB07F8EB1FFF90387C0FC03901F803E03903F001F0D807E013F8380F
+C0004848137CA248C7127E153E5A153F127E12FEA3B7FCA248C8FCA5127EA2127FA26C14
+037F001F14076C6C13060007140E6D131CD801F013386C6C137090387E03E090381FFF80
+903803FC0020277EA525>I<147E903803FF8090380FC1E0EB1F8790383F0FF0137EA213
+FCA23901F803C091C7FCADB512FCA3D801F8C7FCB3AB487E387FFFF8A31C3B7FBA19>I<
+ED03F090390FF00FF890393FFC3C3C9039F81F707C3901F00FE03903E007C03A07C003E0
+10000FECF000A248486C7EA86C6C485AA200075C6C6C485A6D485A6D48C7FC38073FFC38
+060FF0000EC9FCA4120FA213C06CB512C015F86C14FE6CECFF804815C03A0F80007FE048
+C7EA0FF0003E140348140116F8481400A56C1401007C15F06CEC03E0003F1407D80F80EB
+0F80D807E0EB3F003901FC01FC39007FFFF0010790C7FC26387EA52A>I<EA03F012FFA3
+120F1203B0EC0FF0EC3FFCECF03F9039F1C01F809039F3800FC0EBF70013FE496D7EA25B
+A35BB3A3486C497EB500C1B51280A3293A7EB92E>I<EA0380EA0FE0487EA56C5AEA0380
+C8FCAAEA03F012FFA312071203B3AA487EB512C0A312387EB717>I<EA03F012FFA3120F
+1203B1913801FFFCA39138007FC01600157C15705D4A5A4A5A4AC7FC141E1438147814FC
+13F1EBF3FEEBF73F01FE7FEBF81F496C7E8114076E7E6E7E811400157E157F811680ED1F
+C0486CEB3FF0B500C0B5FCA3283A7EB92C>107 D<EA03F012FFA3120F1203B3B3AD487E
+B512C0A3123A7EB917>I<2703F00FF0EB1FE000FFD93FFCEB7FF8913AF03F01E07E903B
+F1C01F83803F3D0FF3800FC7001F802603F70013CE01FE14DC49D907F8EB0FC0A2495CA3
+495CB3A3486C496CEB1FE0B500C1B50083B5FCA340257EA445>I<3903F00FF000FFEB3F
+FCECF03F9039F1C01F803A0FF3800FC03803F70013FE496D7EA25BA35BB3A3486C497EB5
+00C1B51280A329257EA42E>I<EB03FE90380FFF8090383E03E09038F800F84848137C48
+487F48487F4848EB0F80001F15C090C712074815E0A2007EEC03F0A400FE15F8A9007E15
+F0A2007F14076C15E0A26C6CEB0FC0000F15806D131F6C6CEB3F006C6C137EC66C13F890
+387E03F090381FFFC0D903FEC7FC25277EA52A>I<3903F01FE000FFEB7FF89038F1E07E
+9039F3801F803A07F7000FC0D803FEEB07E049EB03F04914F849130116FC150016FEA316
+7FAA16FEA3ED01FCA26DEB03F816F06D13076DEB0FE001F614C09039F7803F009038F1E0
+7E9038F0FFF8EC1FC091C8FCAB487EB512C0A328357EA42E>I<3807E01F00FFEB7FC090
+38E1E3E09038E387F0380FE707EA03E613EE9038EC03E09038FC0080491300A45BB3A248
+7EB512F0A31C257EA421>114 D<EBFF03000313E7380F80FF381E003F487F487F00707F
+12F0A2807EA27EB490C7FCEA7FE013FF6C13E06C13F86C7F00037FC67F01071380EB007F
+141F00C0EB0FC01407A26C1303A37E15806C13077EEC0F00B4131E38F3C07C38E1FFF038
+C03F801A277DA521>I<1318A51338A31378A313F8120112031207001FB5FCB6FCA2D801
+F8C7FCB215C0A93800FC011580EB7C03017E13006D5AEB0FFEEB01F81A347FB220>I<D8
+03F0EB07E000FFEB01FFA3000FEB001F00031407B3A4150FA3151F12016D133F0000EC77
+F86D9038E7FF8090383F03C790381FFF87903A03FC07E00029267EA42E>I<B538803FFE
+A33A0FF8000FF06C48EB07E00003EC03C06D148000011500A26C6C1306A26D130E017E13
+0CA26D5BA2EC8038011F1330A26D6C5AA214E001075BA2903803F180A3D901FBC7FCA214
+FF6D5AA2147CA31438A227257EA32C>I<B53A1FFFE03FFEA3260FF8009038000FF86C48
+017EEB03E018C00003023EEB0180A26C6C013FEB0300A36C6CEC8006156FA2017E9038EF
+C00C15C7A2D93F016D5A15830281EBF038D91F831430150102C3EBF87090260FC6001360
+A2D907E66D5A02EC137CA2D903FCEB7F804A133FA2010192C7FC4A7FA20100141E4A130E
+0260130C37257EA33C>I<B538807FFFA33A03FE003FF00001EC1F80000092C7FC017E13
+1C6D13186D6C5AECC070010F5B6D6C5AECF180EB03FB6DB4C8FC6D5AA2147F804A7E8114
+CF903801C7E090380383F090380703F8EB0601496C7E011C137E49137F01787F496D7E48
+6C80000FEC3FF0D8FFFE90B51280A329247FA32C>I<B538803FFEA33A0FF8000FF06C48
+EB07C00003EC03806C7E16007F00001406A2017E5BA2137F6D5BA26D6C5AA2ECC070010F
+1360A26D6C5AA214F101035BA2D901FBC7FCA214FF6D5AA2147CA31438A21430A2147014
+60A25CA2EA7C0100FE5B130391C8FC1306EAFC0EEA701C6C5AEA1FF0EA0FC027357EA32C
+>I<003FB512FCA2EB8003D83E0013F8003CEB07F00038EB0FE012300070EB1FC0EC3F80
+0060137F150014FE495AA2C6485A495AA2495A495A495AA290387F000613FEA2485A485A
+0007140E5B4848130C4848131CA24848133C48C7127C48EB03FC90B5FCA21F247EA325>
+I E /Fl 19 118 df<177017F84C7EA34C7EA34C7EA34C7FA24C7FA34C7F163CA2047C7F
+EE787FA204F07F173F030180EEE01FA2030380EEC00FA20307804C7EA2DB0F0080834B81
+031E7FA2033E81033C7FA2037C810378147FA24B81183F0201824B141FA20203824B140F
+A20207824B80A24AB87EA24A83A2021EC81201023E83023C81A2027C830278167FA24A83
+193F0101844A161FA20103844A160FA20107844A82130F6E84011F83496C4C7FD9FFF084
+000701FC043F13F8B600C0020FB612F8A455567AD561>65 D<BB12F0A4C66C90C8120FD9
+1FFE9238007FF8010F171F1907190319011900A21A78A21A3CA31A1CA61A0EA2EF01C0A2
+1A00A51703A31707170F171F17FF91B7FCA44AC7FC171F170F17071703A31701A794C9FC
+B3497E017F13C0B712FCA4475279D155>70 D<B700E090B712E0A4C66C01C0C86CEBC000
+011F90C9001F90C7FC6D48705AB3AD91B9FCA44AC9120FB3B1496C4C7E017F01C0037F13
+C0B700E090B712E0A4535279D161>72 D<B712E0A4C66CEBC000011F90C7FC6D5AB3B3B3
+B0497E017F13C0B712E0A4235279D130>I<B712FCA4C66C01C0CAFC011F90CBFC6D5AB3
+B3A91A70A51AE0A51901A419031AC01907A2190F191FA2193F19FF601807011F161FD97F
+FF0203B51280BBFCA4445279D152>76 D<DA1FFC147091B512C0010702F013F049ECFC01
+90393FF003FF903A7F80003F83D801FEC7EA0FC74848EC03F74848EC01FF49804848157F
+4848153F171F4848150F1707127F90C91203A2481601A31700A27FA218707FA27F6C6C16
+007F7F6C7E6D7E6C13F0ECFF806C14F86CECFF8016F86C15FF6C16C06C6C15F06D816D81
+010715FF01001680141F020115C0DA001F14E0030014F0160F040313F81600177FEF3FFC
+171F170F18FE170712E01703A31701A27EA318FC7EA26C160318F87E6CEE07F0A26DED0F
+E06D151F01F016C06DED3F80D8FEFEED7F00D93F80EB01FE26FC1FF0495A26F807FFEB1F
+F8010190B512E0486C6C148048010F49C7FC020013F0375877D449>83
+D<4B7E4B7E4B7EA34B7EA34B7EA24B7EA3ED77FE1573EDF3FF15E1A202018015C0A24A48
+6C7EA2020780ED003FA24A80020E131FA24A6D7EA2023C8002381307A24A801603A24A6D
+7EA201018291B7FCA249820280C7127F01078291C8123FA24982010E151FA2496F7EA201
+3C8217075B017C8213FC000183486C1780D81FFF031F13C0B500E049B6FCA3403F7CBE49
+>97 D<B912FCA3000101E0C7123F6C491407017FED01FEEF007EA2183E181EA2180EA418
+0F84A2160EA295C7FCA3161EA3163EED01FE91B5FCA3ECC001ED003E161EA3160EA2F001
+C0A393C7FCF00380A51807A2190060A26060606001FF1503486DEC3FFEB9FCA33A3D7CBC
+43>101 D<B912E0A300039038C000016C49EB001F6CEE07F017031701A21700A21870A4
+18781838A3161C1800A4163CA3167CED03FC91B5FCA3EC8003ED007C163CA3161CA593C8
+FCAE487F4813F0B612F0A3353D7BBC40>I<B612E0A30001EBF0006C5B6D5AB3B3AF497E
+487FB612E0A31B3D7CBC24>105 D<B612F0A3000301F0C9FC6C13C06C5BB3AFEF01C0A5
+17031880A31707A3170FA2171F173F177FEFFF00481503486D133FB9FCA3323D7BBC3D>
+108 D<B500C093380FFFFC6E5E6E5E0001F1FE006C61D977F8EE77F8A2D973FC16E7A3D9
+71FEED01C7A2D970FFED0387A36E6CEC0707A26E6C140EA36E6C141CA26E6C1438A36E6C
+1470A26E6C14E0A36E6CEB01C0A26E6CEB0380A392397F800700A292383FC00EA36F6C5A
+A26F6C5AA36F6C5AA26F6C5AA36FB45AA26F5B13F8A2486C6EC7FC486C4D7E260FFF8001
+3E4A7EB500F8030FB512FCA2161C4E3D7BBC59>I<B500C0021FB5FC80A2C66D020113F0
+6D6C9138007FC06EED3F80F01F00EB77FED973FF150E01717FA201707F6E7E143F816E7E
+6E7EA26E7E6E7E6E7FA26E7F6F7E6F7EA26F7E6F7E6F7EA26F7E6F13806F13C0A2EE7FE0
+EE3FF0EE1FF8A2EE0FFCEE07FEEE03FFA270138E7013CE177F18EEEF3FFE171FA2170F17
+071703A201F815011700486C167E487E260FFF80153EB500F8151E180EA2403D7CBC49>
+I<ED3FF80203B57E021F14F091397FE00FFC9139FF0001FED903FE6D6C7ED907F8EC3FC0
+D91FF0EC1FF049486E7E49486E7E49486E7E91C8120148486F7E000318804848EE7FC0A2
+4848EE3FE0A2001F18F049161F003F18F8A3007F18FC49160FA300FF18FEAC6C6CEE1FFC
+A4003F18F86D163F001F18F0A36C6CEE7FE0000718C06D16FF000318806C6C4B13006E5C
+6C5F6D6C4A5A6D6C4A5A6D6C4A5AD907F8EC3FC0D903FEECFF80902701FF800390C7FC90
+3A007FF01FFC021FB512F0020314809126003FF8C8FC3F417ABE4C>I<B712FEEEFFE017
+F800019039E0000FFE6C49903801FF80017F9138007FC0EF3FE0EF1FF0EF0FF818FCA2EF
+07FEA218FFA718FEA2EF0FFCA218F8EF1FF0EF3FE0EF7FC0933801FF8093380FFE0091B6
+12F817E04CC7FC02C0C9FCB3A5497E487FB612E0A3383D7CBC43>I<B712F016FF17E000
+019039E0003FF86C49EB07FC017FEC01FF707F717E717E84A2717EA284A660A24D5AA260
+4D5A4D5A4C90C8FCEE07FCEE3FF891B612E094C9FCA2DAC00013C0EE1FE0EE0FF8707E16
+03707E838284A484A384A49538F001C0A3177FF0F803496C023F1480486D91381FFC07B6
+00E01600943807FE1F943803FFFECB5BF01FF0423F7CBC48>114
+D<D903FE130690391FFFE00E017FEBF81E3A01FE01FC3E3A03F0003F7E4848EB0FFED80F
+801307001F140190C7FC003E1400007E157E127C163E12FC161EA36C150EA27EA26D91C7
+FC6C7E13F013FC6CB47E14FC6CEBFFC06C14FC6C14FF6C15C06C816C6C80011F80010380
+D9003F7F14039138003FFF03071380150181EE7FC0163FA200E0151FA2160FA37EA21780
+7E161F6C16006C5D163E6C6C5C6D14FC6D495AD8FDFC495A3AF87FC01FC0D8F01FB55AD8
+E00349C7FC39C0003FF02A417ABE37>I<003FB912F0A3903BF0003FF8003F01806D4813
+0748C7ED01F8007C1700A200781878A219381270A400F0183C48181CA4C81600B3B14B7E
+EDFFFE49B7FCA33E3C7CBB47>I<B600E0011FB5FCA3000101F0C7000113F06C49913800
+7FC06D48ED3F80F01F00A2180EB3B3013F161E6E151CA2183C011F16386E1578010F1670
+6D6C15F04D5A6D6C5D6D6C14076D6C4A5A6E6C013FC7FCDA1FE013FC91390FFC07F80203
+B512E002001480DB0FFCC8FC403F7CBC49>I E end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 600dpi
+TeXDict begin
+%%PaperSize: A4
+%%BeginPaperSize: A4
+/setpagedevice where {
+pop 1 dict dup /PageSize [ 595 842 ] put setpagedevice
+} {
+statusdict /a4tray known {
+statusdict begin a4tray end
+/a4 where { pop a4 } if
+} {
+/a4 where {
+pop a4
+} {
+statusdict /setpage known {
+statusdict begin
+595 842 0 setpage
+end
+} if
+} ifelse
+} ifelse
+} ifelse
+%%EndPaperSize
+
+%%EndSetup
+%%Page: 1 1
+1 0 bop 954 390 a Fl(Input)46 b(File)g(F)m(orma)-8 b(ts)44
+b(f)m(or)i(FLASH)1571 490 y Fk(V)-7 b(ersion)27 b(0.4.3,)f(3/98)150
+726 y(All)g(the)g(input)g(\014les)f(are)g(constructed)g(in)h(the)f
+(same)g(w)n(a)n(y:)35 b(KEYW)n(ORDS)25 b(precede)g(the)h(v)-5
+b(alues)25 b(for)g(sp)r(eci\014ed)150 826 y(input)34
+b(parameters,)e(COMMENTS)h(are)f(mark)n(ed)f(b)n(y)i(a)f(')9
+b(!')53 b(or)32 b('#')i(in)f(the)g(\014rst)g(line.)53
+b(There)32 b(are)g(\014v)n(e)g(six)150 925 y(whic)n(h)e(migh)n(t)f(b)r
+(e)i(imp)r(ortan)n(t:)40 b(P)n(arameters.dat,)28 b(Windparam.dat,)i
+(Land.dat,)g(T)-7 b(riang.dat,)29 b(Domain.dat,)150 1025
+y(and)e(Initial.dat.)150 1296 y Fj(FILE:)38 b(P)m(arameters.dat)150
+1450 y Fi(DESCRIPTION:)150 1603 y Fk(This)26 b(\014le)h(de\014nes)g
+(the)f(b)r(eha)n(viour)g(of)g(FLASH.)h(It)g(also)f(con)n(tains)f(the)i
+(main)f(ph)n(ysical)g(parameters,)f(the)i(user)150 1702
+y(can)g(in\015uence.)150 1856 y Fi(KEYW)m(ORDS:)p 150
+1921 3653 4 v 148 2104 4 183 v 200 1985 a Fh(Keyw)n(ord)p
+1475 2104 V 1028 w(Description)p 2874 2104 V 1016 w(Range)168
+b(of)h(V)-6 b(alues)2926 2076 y Fg([Default])p 3801 2104
+V 150 2107 3653 4 v 150 2124 V 148 2489 4 366 v 200 2187
+a Fh(EXPERIMENT)p 739 2187 24 4 v 28 w(NUMBER)p 1475
+2489 4 366 v 416 w(This)41 b(is)g(the)f(exp)r(erimen)n(t)f(n)n(um)n(b)r
+(er,)j(nor-)1527 2279 y(mally)27 b(set)i(to)f(0)g(\(for)h(a)f(new)g
+(exp)r(erimen)n(t\),)1527 2370 y(if)22 b(an)f(exp)r(erimen)n(t)f(is)i
+(con)n(tin)n(ued,)g(then)f(it)g(is)1527 2461 y(set)26
+b(to)g(the)f(con)n(tin)n(ued)g(coun)n(ter.)p 2874 2489
+V 2926 2187 a(0)h(to)f(999)i Fg([required])p 3801 2489
+V 150 2492 3653 4 v 148 2857 4 366 v 200 2556 a Fh(FINE)p
+393 2556 24 4 v 27 w(GRID)p 624 2556 V 27 w(LEVEL)p 1475
+2857 4 366 v 623 w(Sets)19 b(the)h(\014nest)f(grid)h(lev)n(el.)33
+b(The)19 b(mesh)g(size)1527 2647 y(is)34 b(giv)n(en)g(b)n(y)f(2)1974
+2616 y Ff(\000)p Fe(\()p Fd(j)s Fe(+1\))p Fd(=)p Fe(2)2265
+2647 y Fc(\002)22 b Fb(H)6 b Fh(,)36 b(where)f Fb(j)j
+Fh(is)1527 2739 y(the)19 b(re\014nemen)n(t)e(lev)n(el)i(and)g
+Fb(H)25 b Fh(is)20 b(the)f(coarse)1527 2830 y(mesh)24
+b(size.)p 2874 2857 V 2926 2556 a(1)i(to)f Fc(1)h Fg([required])p
+3801 2857 V 150 2861 3653 4 v 148 3226 4 366 v 200 2925
+a Fh(CO)n(ARSE)p 528 2925 24 4 v 27 w(GRID)p 759 2925
+V 26 w(LEVEL)p 1475 3226 4 366 v 489 w(The)j(coarse)h(grid)g(lev)n(el)f
+(\(or)g(minim)n(um)d(re-)1527 3016 y(\014nemen)n(t)d(lev)n(el\))p
+2874 3226 V 2926 2925 a(1)e(to)h Fc(1)f Fh(should)h(b)r(e)f(smaller)
+2926 3016 y(than)2926 3107 y(FINE)p 3119 3107 24 4 v
+27 w(GRID)p 3350 3107 V 27 w(LEVEL)2926 3199 y Fg([required])p
+3801 3226 4 366 v 150 3229 3653 4 v 148 3595 4 366 v
+200 3293 a Fh(TOLERANCE)p 700 3293 24 4 v 27 w(OF)p 837
+3293 V 28 w(REFINEMENT)p 1475 3595 4 366 v 135 w(A)g(global)i
+(re\014nemen)n(t)c(tolerance)k(\()p Fb(\022)2592 3302
+y Fd(r)r(ef)2692 3293 y Fh(\):)32 b(If)1527 3385 y(the)18
+b(lo)r(cal)j(error)e(estimate)g Fb(\021)2347 3394 y Fd(l)2391
+3385 y Fh(is)g(larger)h(than)1527 3476 y Fb(\022)1563
+3485 y Fd(r)r(ef)1689 3476 y Fc(\002)26 b Fb(\021)1813
+3484 y Fd(max)1980 3476 y Fh(then)39 b(an)h(elemen)n(t)f(will)i(b)r(e)
+1527 3567 y(re\014ned.)p 2874 3595 V 2926 3293 a(0.0)26
+b(to)g(1.0)h Fg([required])p 3801 3595 V 150 3598 3653
+4 v 148 3963 4 366 v 200 3662 a Fh(TOLERANCE)p 700 3662
+24 4 v 27 w(OF)p 837 3662 V 28 w(CO)n(ARSENING)p 1475
+3963 4 366 v 140 w(A)h(global)j(coarsening)f(tolerance\()p
+Fb(\022)2590 3670 y Fd(cr)r(s)2683 3662 y Fh(\):)41 b(If)1527
+3753 y(the)e(lo)r(cal)j(error)e(estimate)g Fb(\021)2431
+3762 y Fd(l)2495 3753 y Fh(is)g(smaller)1527 3845 y(than)29
+b Fb(\022)1746 3853 y Fd(cr)r(s)1857 3845 y Fc(\002)19
+b Fb(\021)1974 3853 y Fd(max)2130 3845 y Fh(then)29 b(an)g(elemen)n(t)g
+(will)1527 3936 y(b)r(e)c(coarsened.)p 2874 3963 V 2926
+3662 a(0.0)84 b(to)f(1.0)i Fb(<)117 b(\022)3653 3671
+y Fd(r)r(ef)2926 3753 y Fg([required])p 3801 3963 V 150
+3967 3653 4 v 148 4332 4 366 v 200 4031 a Fh(W)-9 b(A)j(TERMARK)p
+736 4031 24 4 v 26 w(OF)p 872 4031 V 28 w(REFINEMENT)p
+1475 4332 4 366 v 100 w(A)17 b(p)r(ercen)n(tage)h(of)g(c)n(hanges)f(\()
+p Fb(!)2410 4040 y Fd(r)r(ef)2510 4031 y Fh(\):)30 b(If)17
+b(more)1527 4122 y(than)26 b Fb(!)1755 4131 y Fd(r)r(ef)1881
+4122 y Fh(p)r(ercen)n(t)h(of)h(the)e(grid)h(elemen)n(ts)1527
+4213 y(are)f(mark)n(ed)f(for)h(re\014nemen)n(t,)f(then)g(re\014ne,)1527
+4304 y(otherwise)i(lea)n(v)n(e)f(the)f(grid)h(unc)n(hanged)p
+2874 4332 V 2926 4031 a(0.0)g(to)g(1.0)h Fg([required])p
+3801 4332 V 150 4335 3653 4 v 148 4792 4 457 v 200 4399
+a Fh(W)-9 b(A)j(TERMARK)p 736 4399 24 4 v 26 w(OF)p 872
+4399 V 28 w(CO)n(ARSENING)p 1475 4792 4 457 v 105 w(A)51
+b(p)r(ercen)n(tage)h(of)g(c)n(hanges)g(\()p Fb(!)2547
+4407 y Fd(cr)r(s)2638 4399 y Fh(\):)86 b(If)1527 4490
+y(more)48 b(than)g Fb(!)1992 4498 y Fd(cr)r(s)2132 4490
+y Fh(p)r(ercen)n(t)g(of)h(the)g(grid)1527 4582 y(elemen)n(ts)f(are)i
+(mark)n(ed)e(for)i(coarsening,)1527 4673 y(then)31 b(coarsen,)k
+(otherwise)e(lea)n(v)n(e)f(the)g(grid)1527 4764 y(unc)n(hanged)p
+2874 4792 V 2926 4399 a(0.0)26 b(to)g(1.0)h Fg([required])p
+3801 4792 V 150 4795 3653 4 v 148 4886 4 92 v 200 4859
+a Fh(TIMESTEP)p 612 4859 24 4 v 29 w(LENGTH)p 1475 4886
+4 92 v 560 w(This)f(is)g(the)g(time)f(step)g(lengh)n(t)h(in)f(seconds)p
+2874 4886 V 103 w(0.0)h(to)g Fc(1)g Fg([required])p 3801
+4886 V 150 4890 3653 4 v 148 5072 4 183 v 200 4954 a
+Fh(BEGINNING)p 661 4954 24 4 v 27 w(TIMESTEP)p 1475 5072
+4 183 v 437 w(This)h(is)h(the)e(\014rst)h(timestep)f(coun)n(t)h(for)g
+(the)1527 5045 y(exp)r(erimen)n(t.)p 2874 5072 V 2926
+4954 a(1)f(to)g(99999)i Fg([1)i(if)g(exp)r(eri-)2926
+5045 y(men)n(t)e(is)i(0])p 3801 5072 V 150 5076 3653
+4 v 148 5532 4 457 v 200 5140 a Fh(FINISHING)p 616 5140
+24 4 v 25 w(TIMESTEP)p 1475 5532 4 457 v 484 w(The)40
+b(last)g(timestep)f(of)h(the)f(exp)r(erimen)n(t,)1527
+5231 y(th)n(us)829 b(mo)r(delling)1527 5322 y(in)n(terv)l(al)26
+b(time)g(is)h(TIMESTEP)p 2471 5322 24 4 v 29 w(LENGTH)1527
+5414 y Fc(\002)j Fh(FINISHING)p 2033 5414 V 25 w(TIMESTEP)i(-)e(BEGIN-)
+1527 5505 y(NING)p 1736 5505 V 27 w(TIMESTEP)-6 b(.)p
+2874 5532 4 457 v 2926 5140 a(1)26 b(to)f(99999)j Fg([required])p
+3801 5532 V 150 5536 3653 4 v 1892 5919 a Fk(1)p eop
+%%Page: 2 2
+2 1 bop 150 390 a Fk(T)-7 b(able)27 b(con)n(tin)n(ued)p
+150 455 3622 4 v 148 638 4 183 v 200 519 a Fh(Keyw)n(ord)p
+1445 638 V 997 w(Description)p 2844 638 V 1016 w(Range)169
+b(of)g(V)-6 b(alues)2895 611 y Fg([Default])p 3770 638
+V 150 641 3622 4 v 150 658 V 148 1571 4 914 v 200 722
+a Fh(TYPE)p 422 722 24 4 v 28 w(OF)p 560 722 V 28 w(PLOTTING)p
+1445 1571 4 914 v 497 w(There)53 b(are)h(di\013eren)n(t)e(options)h
+(for)h(real)1496 813 y(time)j(\(online\))h(vizualization:)100
+b(the)57 b(x-)1496 905 y(comp)r(onen)n(t)63 b(of)h(wind)f
+Fb(u)g Fh([1],)75 b(the)62 b(y-)1496 996 y(comp)r(onen)n(t)21
+b(of)i(wind)f Fb(v)j Fh([2],)f(the)e(geop)r(oten-)1496
+1087 y(tial)i(heigh)n(t)f(\010)g([3],)i Fb(u)e Fh(with)g(grid)g([4],)i
+Fb(v)g Fh(with)1496 1179 y(grid)i([5],)h(\010)f(with)f(grid)h([6],)h
+(the)e(grid)h(alone)1496 1270 y([7],)j(the)d(wind)h(v)n(ector)g
+(\014eld)f(\()p Fb(u;)14 b(v)s Fh(\))27 b([8],)j(the)1496
+1361 y(v)n(orticit)n(y)24 b Fb(\020)k Fh([9],)e(the)d(tracer)h(concen)n
+(tration)1496 1453 y Fb(c)1529 1461 y Fd(t)1583 1453
+y Fh([10],)j Fb(c)1782 1461 y Fd(t)1835 1453 y Fh(with)e(grid)h([11],)h
+(no)e(visual)h(out-)1496 1544 y(put)f([0].)p 2844 1571
+V 2895 722 a(0)h(to)g(11)g Fg([0])p 3770 1571 V 150 1575
+3622 4 v 148 1849 4 274 v 200 1639 a Fh(PLOT)p 420 1639
+24 4 v 28 w(TIFF)p 631 1639 V 28 w(FILE)p 1445 1849 4
+274 v 664 w(Eac)n(h)f(visual)g(output)f(can)h(b)r(e)g(prin)n(ted)e(in)n
+(to)1496 1730 y(a)k(ti\013)f(\(tagged)h(image)g(\014le)f(format\))h
+(\014le.)36 b(If)1496 1821 y(v)l(alue)17 b(is)h(0)g(than)e(no)i(prin)n
+(ting)f(is)h(p)r(erformed.)p 2844 1849 V 2895 1639 a(0)26
+b(to)g Fc(1)f Fg([?])p 3770 1849 V 150 1852 3622 4 v
+148 2217 4 366 v 200 1916 a Fh(MA)-6 b(TLAB)p 542 1916
+24 4 v 27 w(PLOTTING)p 1445 2217 4 366 v 516 w(Matlab)20
+b(output)e(can)h(b)r(e)g(generated)g(in)g(case)1496 2007
+y(no)39 b(Op)r(enGL)f(library)g(for)i(the)e(visualiza-)1496
+2098 y(tion)30 b(is)f(supp)r(orted)f(If)i(v)l(alue)e(is)i(0)f(than)g
+(no)1496 2190 y(prin)n(ting)d(is)g(p)r(erformed.)p 2844
+2217 V 2895 1916 a(0)g(to)g Fc(1)f Fg([?])p 3770 2217
+V 150 2220 3622 4 v 148 2494 4 274 v 200 2284 a Fh(STEPS)p
+450 2284 24 4 v 28 w(BTW)p 666 2284 V 28 w(PLOTS)p 1445
+2494 4 274 v 549 w(Timesteps)34 b(b)r(et)n(w)n(een)g(plots.)60
+b(If)34 b(a)h(plot)f(is)1496 2376 y(required)26 b(only)f(ev)n(ery)h
+Fb(n)p Fh(-th)f(step)h(set)g(v)l(alue)1496 2467 y(to)g
+Fb(n)p Fh(.)p 2844 2494 V 2895 2284 a(1)g(to)g Fc(1)f
+Fg([?])p 3770 2494 V 150 2498 3622 4 v 148 2954 4 457
+v 200 2562 a Fh(STEPS)p 450 2562 24 4 v 28 w(BTW)p 666
+2562 V 28 w(SA)-9 b(VES)p 1445 2954 4 457 v 562 w(If)19
+b(an)f(o\013set)h(\014le)g(has)g(to)f(b)r(e)h(written,)h(in)f(case)1496
+2653 y(the)26 b(computer)g(fails)i(or)e(in)h(case)g(the)f(sim)n(u-)1496
+2744 y(lation)21 b(shall)h(b)r(e)e(initialized)h(from)f(a)h(certain)
+1496 2836 y(time.)34 b(The)24 b(o\013set)g(\014le)g(is)g(written)h(ev)n
+(ery)e Fb(n)p Fh(-)1496 2927 y(th)i(step.)p 2844 2954
+V 2895 2562 a(1)h(to)g Fc(1)f Fg([?])p 3770 2954 V 150
+2958 3622 4 v 148 3323 4 366 v 200 3022 a Fh(SA)-9 b(VE)p
+407 3022 24 4 v 27 w(FINISH)p 699 3022 V 26 w(CONFIGURA)j(TION)p
+1445 3323 4 366 v 97 w(The)63 b(\014nishing)g(con\014guration)h(can)f
+(b)r(e)1496 3113 y(sa)n(v)n(ed)31 b(to)h(disk)f(in)g(order)h(to)f(con)n
+(tin)n(ue)g(the)1496 3204 y(exp)r(erimen)n(t)d(at)h(a)h(later)g(time.)
+44 b(If)29 b(v)l(alue)g(is)1496 3296 y(0)d(than)g(sa)n(v)n(e)f(\014le)h
+(will)h(b)r(e)f(written.)p 2844 3323 V 2895 3022 a(0)g(to)g
+Fc(1)f Fg([?])p 3770 3323 V 150 3326 3622 4 v 148 3509
+4 183 v 200 3390 a Fh(POL)-6 b(YGON)p 595 3390 24 4 v
+26 w(FILE)p 799 3390 V 28 w(NAME)p 1445 3509 4 183 v
+436 w(T)g(ak)n(e)21 b(the)f(p)r(olygons)h(de\014ned)f(in)h(this)f
+(\014le)h(as)1496 3482 y(a)26 b(land)g(mask)f(\(for)h(example\).)p
+2844 3509 V 2895 3390 a(c)n(haracter)19 b(string)f(of)h(length)2895
+3482 y(32)27 b Fg(['land.dat')i(?])p 3770 3509 V 150
+3512 3622 4 v 148 3695 4 183 v 200 3576 a Fh(WIND)p 429
+3576 24 4 v 26 w(FILE)p 633 3576 V 28 w(NAME)p 1445 3695
+4 183 v 602 w(If)37 b(wind)f(data)g(shall)h(b)r(e)f(read)h(from)f
+(\014les,)1496 3668 y(this)26 b(de\014nes)f(the)h(mo)r(de)f(ho)n(w)h
+(to)f(do)h(it.)p 2844 3695 V 2895 3576 a(c)n(haracter)19
+b(string)f(of)h(length)2895 3668 y(32)27 b Fg([?])p 3770
+3695 V 150 3698 3622 4 v 148 3881 4 183 v 200 3762 a
+Fh(DOMAIN)p 538 3762 24 4 v 26 w(FILE)p 742 3762 V 28
+w(NAME)p 1445 3881 4 183 v 493 w(The)c(domain)e(outline)i(is)g(giv)n
+(en)f(in)g(this)g(\014le.)p 2844 3881 V 100 w(c)n(haracter)d(string)f
+(of)h(length)2895 3854 y(32)27 b Fg([?])p 3770 3881 V
+150 3884 3622 4 v 148 4067 4 183 v 200 3948 a Fh(TRIANG)p
+521 3948 24 4 v 27 w(FILE)p 726 3948 V 27 w(NAME)p 1445
+4067 4 183 v 510 w(The)21 b(initial)g(triangulation)h(is)e(giv)n(en)g
+(in)g(this)1496 4040 y(\014le.)p 2844 4067 V 2895 3948
+a(c)n(haracter)f(string)f(of)h(length)2895 4040 y(32)27
+b Fg([?])p 3770 4067 V 150 4070 3622 4 v 148 4436 4 366
+v 200 4134 a Fh(SLM)p 366 4134 24 4 v 27 w(ITERA)-6 b(TION)p
+838 4134 V 27 w(NUMBER)p 1445 4436 4 366 v 287 w(The)29
+b(n)n(um)n(b)r(er)d(of)i(iterations)i(in)e(the)f(calcu-)1496
+4225 y(lation)20 b(of)f(the)g(semi-Lagrangian)g(upstream)1496
+4317 y(displacemen)n(ts)29 b(is)h(de\014ned)e(b)n(y)g(this)h(v)l(alue.)
+1496 4408 y(A)d(go)r(o)r(d)g(v)l(alue)g(is)g(4.)p 2844
+4436 V 2895 4134 a(1)g(to)g Fc(1)f Fg([required])p 3770
+4436 V 150 4439 3622 4 v 1892 5919 a Fk(2)p eop
+%%Page: 3 3
+3 2 bop 150 390 a Fj(FILE:)38 b(Domain.dat)150 543 y
+Fi(DESCRIPTION:)150 697 y Fk(This)29 b(\014le)g(de\014nes)g(domain)f
+(of)h(the)g(calculation.)40 b(It)30 b(is)e(used)h(b)n(y)g(the)g(grid)f
+(generator)f(and)i(the)g(visualization)150 796 y(utilit)n(y)-7
+b(.)150 950 y Fi(KEYW)m(ORDS:)p 150 1015 3436 4 v 148
+1197 4 183 v 200 1079 a Fh(Keyw)n(ord)p 1259 1197 V 811
+w(Description)p 2658 1197 V 1016 w(Range)169 b(of)g(V)-6
+b(alues)2709 1170 y Fg([Default])p 3584 1197 V 150 1201
+3436 4 v 150 1217 V 148 1309 4 92 v 200 1281 a Fh(NUMBER)p
+554 1281 24 4 v 27 w(OF)p 691 1281 V 28 w(DIMENSIONS)p
+1259 1309 4 92 v 97 w(The)26 b(n)n(um)n(b)r(er)e(of)i(space)h
+(dimensions)p 2658 1309 V 300 w(1)f(to)g(3)g Fg([2])p
+3584 1309 V 150 1312 3436 4 v 148 1495 4 183 v 200 1376
+a Fh(NUMBER)p 554 1376 24 4 v 27 w(OF)p 691 1376 V 28
+w(POL)-6 b(YGONS)p 1259 1495 4 183 v 163 w(The)38 b(n)n(um)n(b)r(er)d
+(of)i(p)r(olygons)h(de\014ning)f(the)1310 1467 y(domain)25
+b(\(think)g(of)h(islands\).)p 2658 1495 V 2709 1376 a(1)g(to)g
+Fc(1)f Fg([1])p 3584 1495 V 150 1498 3436 4 v 148 1863
+4 366 v 200 1562 a Fh(NUMBER)p 554 1562 24 4 v 27 w(OF)p
+691 1562 V 28 w(VER)-6 b(TICES)p 1259 1863 4 366 v 202
+w(This)28 b(Keyw)n(ord)f(o)r(ccurs)h(as)g(often)f(as)h(p)r(oly-)1310
+1653 y(gons)h(are)f(giv)n(en)f(\(previous)h(v)l(alue\).)40
+b(It)27 b(de-)1310 1745 y(\014nes)44 b(the)g(n)n(um)n(b)r(er)e(of)k(v)n
+(ertices)e(of)h(eac)n(h)1310 1836 y(p)r(olygon)p 2658
+1863 V 2709 1562 a(1)26 b(to)g Fc(1)f Fg([required])p
+3584 1863 V 150 1867 3436 4 v 148 2323 4 457 v 200 1931
+a Fh(VER)-6 b(TEX)p 531 1931 24 4 v 27 w(D)n(A)g(T)g(A)p
+1259 2323 4 457 v 541 w(This)36 b(blo)r(c)n(k)f(of)g(data)g(o)r(ccurs)h
+(as)f(often)h(as)1310 2022 y(p)r(olygons)j(are)f(giv)n(en.)72
+b(Eac)n(h)38 b(blo)r(c)n(k)g(con-)1310 2113 y(tains)c(NUMBER)p
+1860 2113 24 4 v 27 w(OF)p 1997 2113 V 28 w(DIMENSIONS)d
+Fc(\002)1310 2205 y Fh(NUMBER)p 1664 2205 V 28 w(OF)p
+1802 2205 V 27 w(VER)-6 b(TICES)46 b(lines)h(with)1310
+2296 y(co)r(ordinates)27 b(of)g(eac)n(h)f(v)n(ertex.)p
+2658 2323 4 457 v 2709 1931 a(-)48 b(real)h(range)g(to)g(+)f(real)2709
+2022 y(range)26 b Fg([required])p 3584 2323 V 150 2327
+3436 4 v 150 2576 a Fj(FILE:)38 b(Land.dat)150 2729 y
+Fi(DESCRIPTION:)150 2882 y Fk(This)31 b(\014le)f(is)h(for)f(con)n(v)n
+(enience)f(only)h(and)h(has)f(no)g(meaning)g(to)g(the)h(mo)r(del)g
+(itself.)46 b(It)31 b(is)g(safely)f(omitted.)46 b(It)150
+2982 y(de\014nes)28 b(p)r(olygonal)e(lines)h(plotted)h(b)n(y)g(the)g
+(online)f(visualization)g(utilit)n(y)-7 b(.)150 3135
+y(CA)n(UTION:)25 b(Lnad.dat)g(has)g(a)f(di\013eren)n(t)i(syn)n(tax,)e
+(as)h(there)g(are)f(no)h(k)n(eyw)n(ords)e(supp)r(orted,)i(but)h(the)f
+(order)f(of)150 3235 y(argumen)n(ts)29 b(is)i(imp)r(ortan)n(t.)46
+b(Moreo)n(v)n(er,)29 b(only)h(the)i('#')f(c)n(haracter)e(is)h(allo)n(w)
+n(ed)g(for)g(a)g(commen)n(t)h(line)g(\(this)g(is)150
+3334 y(for)26 b(historical)g(reasons)f(only)h(and)g(migh)n(t)h(b)r(e)g
+(c)n(hanged)f(in)h(later)f(releases\).)35 b(Only)27 b(t)n(w)n
+(o-dimenional)e(data)h(are)150 3434 y(allo)n(w)n(ed.)150
+3587 y Fi(First)32 b(non-commen)m(t)d(line:)35 b Fk(Num)n(b)r(er)28
+b(of)f(P)n(olygons)150 3740 y Fi(Then:)50 b Fk(eac)n(h)34
+b(blo)r(c)n(k)g(with)g(p)r(olygon)g(data)g(b)r(egins)g(with)h(an)f(in)n
+(teger)f(v)-5 b(alue)34 b(in)h(a)f(single)g(line)g(de\014ning)h(the)150
+3840 y(n)n(um)n(b)r(er)27 b(of)h(v)n(ertices,)e(then)j(2)e
+Fa(\002)g Fk(no.-of-v)n(ertices)e(co)r(ordinates)i(v)-5
+b(alues)27 b(follo)n(w.)1892 5919 y(3)p eop
+%%Page: 4 4
+4 3 bop 150 390 a Fj(FILE:)38 b(T)-9 b(riang.dat)150
+543 y Fi(DESCRIPTION:)150 697 y Fk(This)29 b(\014le)g(de\014nes)g(the)g
+(initial)g(triangulation.)40 b(The)29 b(coarsest)e(triangulation)h(has)
+g(to)h(b)r(e)h(giv)n(en)e(b)n(y)g(the)i(user,)150 796
+y(it)e(is)g(not)f(generated)g(automattically)f(from)i(the)g(domain)f
+(data.)150 950 y Fi(KEYW)m(ORDS:)p 150 1015 3587 4 v
+148 1197 4 183 v 200 1079 a Fh(Keyw)n(ord)p 1410 1197
+V 962 w(Description)p 2809 1197 V 1016 w(Range)169 b(of)g(V)-6
+b(alues)2860 1170 y Fg([Default])p 3735 1197 V 150 1201
+3587 4 v 150 1217 V 148 1400 4 183 v 200 1281 a Fh(GRID)p
+409 1281 24 4 v 27 w(DIMENSION)p 1410 1400 4 183 v 574
+w(Global)47 b(parameter)d(de\014ning)h(the)f(grid's)1461
+1373 y(space)27 b(dimensions.)p 2809 1400 V 2860 1281
+a(1)f(to)g(3)g Fg([2])p 3735 1400 V 150 1403 3587 4 v
+148 1677 4 274 v 200 1467 a Fh(ELEMENT)p 592 1467 24
+4 v 29 w(VER)-6 b(TICES)p 1410 1677 4 274 v 451 w(Global)24
+b(parameter)e(de\014ning)g(the)g(shap)r(e)h(of)1461 1559
+y(elemen)n(ts.)50 b(In)30 b(2D)h(for)h(example,)g(3)f(is)h(tri-)1461
+1650 y(angular)27 b(mesh,)e(4)h(quadrilateral,)h(etc.)p
+2809 1677 V 2860 1467 a(3)f(to)g(4...)35 b Fg([?])p 3735
+1677 V 150 1681 3587 4 v 148 1863 4 183 v 200 1745 a
+Fh(NUMBER)p 554 1745 24 4 v 27 w(OF)p 691 1745 V 28 w(NODES)p
+1410 1863 4 183 v 475 w(This)26 b(de\014nes)f(the)g(total)i(n)n(um)n(b)
+r(er)c(of)j(no)r(des)1461 1836 y(in)g(the)f(inital)i(mesh.)p
+2809 1863 V 2860 1745 a(1)103 b(to)g(in)n(teger)g(range)2860
+1836 y Fg([required])p 3735 1863 V 150 1867 3587 4 v
+148 2049 4 183 v 200 1931 a Fh(NUMBER)p 554 1931 24 4
+v 27 w(OF)p 691 1931 V 28 w(EDGES)p 1410 2049 4 183 v
+481 w(This)28 b(de\014nes)f(the)g(total)h(n)n(um)n(b)r(er)d(of)j(edges)
+1461 2022 y(in)e(the)f(inital)i(mesh.)p 2809 2049 V 2860
+1931 a(1)103 b(to)g(in)n(teger)g(range)2860 2022 y Fg([required])p
+3735 2049 V 150 2053 3587 4 v 148 2235 4 183 v 200 2117
+a Fh(NUMBER)p 554 2117 24 4 v 27 w(OF)p 691 2117 V 28
+w(ELEMENTS)p 1410 2235 4 183 v 317 w(This)39 b(de\014nes)e(the)h(total)
+h(n)n(um)n(b)r(er)d(of)i(ele-)1461 2208 y(men)n(ts)25
+b(in)g(the)h(inital)g(mesh.)p 2809 2235 V 2860 2117 a(1)103
+b(to)g(in)n(teger)g(range)2860 2208 y Fg([required])p
+3735 2235 V 150 2239 3587 4 v 148 2513 4 274 v 200 2302
+a Fh(DEF)p 366 2302 24 4 v 27 w(INNERITEM)p 1410 2513
+4 274 v 615 w(This)30 b(global)g(v)l(alue)f(de\014nes)f(the)h
+(attribute)1461 2394 y(v)l(alue)21 b(for)h(a)f(grid)h(item)e(within)h
+(the)g(domain)1461 2485 y(\(no)26 b(b)r(oundary\).)p
+2809 2513 V 2860 2302 a(-)70 b(in)n(teger)h(range)h(to)e(0)2860
+2394 y Fg([required])p 3735 2513 V 150 2516 3587 4 v
+148 2790 4 274 v 200 2580 a Fh(DEF)p 366 2580 24 4 v
+27 w(DIRICHLETBOUND)n(AR)-6 b(Y)p 1410 2790 4 274 v 179
+w(This)30 b(global)g(v)l(alue)f(de\014nes)f(the)h(attribute)1461
+2671 y(v)l(alue)43 b(for)i(a)e(grid)h(item)f(on)g(a)h(Diric)n(hlet)1461
+2762 y(b)r(oundary)25 b(section)h(of)h(the)e(domain.)p
+2809 2790 V 2860 2580 a(-)70 b(in)n(teger)h(range)h(to)e(0)2860
+2671 y Fg([required])p 3735 2790 V 150 2793 3587 4 v
+148 3432 4 640 v 200 2857 a Fh(DEF)p 366 2857 24 4 v
+27 w(NEUMANNBOUND)n(AR)-6 b(Y)p 1410 3432 4 640 v 207
+w(This)30 b(global)g(v)l(alue)f(de\014nes)f(the)h(attribute)1461
+2948 y(v)l(alue)39 b(for)h(a)f(grid)h(item)e(on)h(a)g(Neumann)1461
+3040 y(b)r(oundary)18 b(section)i(of)g(the)f(domain.)32
+b([Note:)1461 3131 y(p)r(erio)r(dic)42 b(b)r(oundary)e(conditions)i
+(are)f(de-)1461 3222 y(\014ned)e(b)n(y)f(the)h(\(p)r(ositiv)n(e\))g
+(index)f(n)n(um)n(b)r(er)1461 3314 y(of)g(the)e(corresp)r(onding)h(p)r
+(erio)r(dic)h(partner)1461 3405 y(item)25 b(in)h(the)f(grid.])p
+2809 3432 V 2860 2857 a(-)70 b(in)n(teger)h(range)h(to)e(0)2860
+2948 y Fg([required])p 3735 3432 V 150 3436 3587 4 v
+148 3801 4 366 v 200 3500 a Fh(NODE)p 434 3500 24 4 v
+27 w(INDEXNUMBER)p 1410 3801 4 366 v 401 w(De\014nes)34
+b(the)f(\(unique\))g(index)g(of)i(a)f(no)r(de.)1461 3591
+y(This)72 b(k)n(eyw)n(ord)e(o)r(ccurs)i(as)f(often)h(as)1461
+3682 y(the)58 b(v)l(alue)f(of)i(NUMBER)p 2330 3682 24
+4 v 27 w(OF)p 2467 3682 V 28 w(NODES)1461 3774 y(indicates.)p
+2809 3801 4 366 v 2860 3500 a(1)103 b(to)g(in)n(teger)g(range)2860
+3591 y Fg([required])p 3735 3801 V 150 3804 3587 4 v
+148 3987 4 183 v 200 3868 a Fh(NODE)p 434 3868 24 4 v
+27 w(COORDINA)-6 b(TES)p 1410 3987 4 183 v 426 w(De\014nes)23
+b(a)h(blo)r(c)n(k)g(of)g(GRID)p 2284 3868 24 4 v 27 w(DIMENSION)1461
+3960 y(co)r(ordinates)j(of)g(the)e(no)r(de.)p 2809 3987
+4 183 v 2860 3868 a(-)48 b(real)h(range)g(to)g(+)f(real)2860
+3960 y(range)26 b Fg([required])p 3735 3987 V 150 3990
+3587 4 v 148 4356 4 366 v 200 4054 a Fh(EDGE)p 428 4054
+24 4 v 28 w(INDEXNUMBER)p 1410 4356 4 366 v 406 w(De\014nes)68
+b(the)g(\(unique\))f(index)h(of)h(an)1461 4146 y(edge.)85
+b(This)43 b(k)n(eyw)n(ord)e(o)r(ccurs)i(as)g(often)1461
+4237 y(as)28 b(the)f(v)l(alue)g(of)i(NUMBER)p 2335 4237
+24 4 v 27 w(OF)p 2472 4237 V 27 w(EDGES)1461 4328 y(indicates.)p
+2809 4356 4 366 v 2860 4054 a(1)103 b(to)g(in)n(teger)g(range)2860
+4146 y Fg([required])p 3735 4356 V 150 4359 3587 4 v
+148 4542 4 183 v 200 4423 a Fh(EDGE)p 428 4423 24 4 v
+28 w(NODEINDICES)p 1410 4542 4 183 v 458 w(Tw)n(o)40
+b(indices)g(of)g(no)r(des)f(\(de\014ned)f(in)h(the)1461
+4514 y(previous)26 b(section\))g(whic)n(h)g(span)g(the)f(edge.)p
+2809 4542 V 2860 4423 a(1)103 b(to)g(in)n(teger)g(range)2860
+4514 y Fg([required])p 3735 4542 V 150 4545 3587 4 v
+148 4819 4 274 v 200 4609 a Fh(EDGE)p 428 4609 24 4 v
+28 w(ELEMENTINDICES)p 1410 4819 4 274 v 300 w(Tw)n(o)21
+b(indices)g(of)f(elemen)n(ts)f(adjacen)n(t)i(to)f(the)1461
+4700 y(edge.)43 b(0)28 b(for)h(one)g(side)f(if)h(the)f(edge)h(is)g(at)f
+(a)1461 4791 y(\(non-p)r(erio)r(dic\))e(b)r(oundary)-6
+b(.)p 2809 4819 V 2860 4609 a(1)103 b(to)g(in)n(teger)g(range)2860
+4700 y Fg([required])p 3735 4819 V 150 4822 3587 4 v
+148 5187 4 366 v 200 4886 a Fh(EDGE)p 428 4886 24 4 v
+28 w(BOUND)n(AR)-6 b(YCONDITION)p 1410 5187 4 366 v 95
+w(De\014nes)55 b(the)g(b)r(oundary)f(condition)h(ac-)1461
+4977 y(cording)44 b(to)g(the)f(previosly)h(de\014ned)e(v)l(al-)1461
+5069 y(ues)21 b(for)h(Diric)n(hlet,)h(Neumann,)d(or)i(p)r(erio)r(dic)
+1461 5160 y(b)r(oundary)j(conditions.)p 2809 5187 V 2860
+4886 a(-)d(in)n(teger)g(range)h(to)f(+)f(in)n(te-)2860
+4977 y(ger)26 b(range)h Fg([required])p 3735 5187 V 150
+5191 3587 4 v 1892 5919 a Fk(4)p eop
+%%Page: 5 5
+5 4 bop 150 390 a Fk(T)-7 b(able)27 b(con)n(tin)n(ued)p
+150 455 3444 4 v 148 638 4 183 v 200 519 a Fh(Keyw)n(ord)p
+1266 638 V 819 w(Description)p 2665 638 V 1016 w(Range)168
+b(of)h(V)-6 b(alues)2717 611 y Fg([Default])p 3592 638
+V 150 641 3444 4 v 150 658 V 148 1023 4 366 v 200 722
+a Fh(ELEMENT)p 592 722 24 4 v 29 w(INDEXNUMBER)p 1266
+1023 4 366 v 98 w(De\014nes)37 b(the)h(\(unique\))e(index)h(of)i(an)f
+(ele-)1318 813 y(men)n(t.)500 b(This)182 b(k)n(eyw)n(ord)1318
+905 y(o)r(ccurs)33 b(as)h(often)f(as)g(the)g(v)l(alue)f(of)i(NUM-)1318
+996 y(BER)p 1486 996 24 4 v 28 w(OF)p 1624 996 V 27 w(ELEMENTS)27
+b(indicates.)p 2665 1023 4 366 v 2717 722 a(1)103 b(to)g(in)n(teger)g
+(range)2717 813 y Fg([required])p 3592 1023 V 150 1027
+3444 4 v 148 1209 4 183 v 200 1091 a Fh(ELEMENT)p 592
+1091 24 4 v 29 w(NODEINDICES)p 1266 1209 4 183 v 150
+w(Three)28 b(indices)h(of)g(no)r(des)g(whic)n(h)f(span)g(the)1318
+1182 y(elemen)n(t.)p 2665 1209 V 2717 1091 a(1)103 b(to)g(in)n(teger)g
+(range)2717 1182 y Fg([required])p 3592 1209 V 150 1213
+3444 4 v 148 1395 4 183 v 200 1277 a Fh(ELEMENT)p 592
+1277 24 4 v 29 w(EDGEINDICES)p 1266 1395 4 183 v 156
+w(Three)30 b(indices)h(of)g(edges)f(whic)n(h)g(span)g(the)1318
+1368 y(elemen)n(t.)p 2665 1395 V 2717 1277 a(1)103 b(to)g(in)n(teger)g
+(range)2717 1368 y Fg([required])p 3592 1395 V 150 1399
+3444 4 v 148 1581 4 183 v 200 1463 a Fh(ELEMENT)p 592
+1463 24 4 v 29 w(MARKEDEDGE)p 1266 1581 4 183 v 123 w(The)28
+b(lo)r(cal)i(edge)e(n)n(um)n(b)r(er)e(that)i(is)g(mark)n(ed)1318
+1554 y(for)e(re\014nemen)n(t)e(\(b)n(y)h(bisection\).)p
+2665 1581 V 2717 1463 a(1)h(to)g(3)f Fg([required])p
+3592 1581 V 150 1585 3444 4 v 150 1834 a Fj(FILE:)38
+b(Windparam.dat)150 1987 y Fi(DESCRIPTION:)150 2140 y
+Fk(This)28 b(\014le)f(de\014nes)h(the)g(b)r(eha)n(viour)e(of)i(FLASH)g
+(when)g(it)g(comes)f(to)g(reading)g(winddata.)150 2293
+y Fi(KEYW)m(ORDS:)p 150 2359 3378 4 v 148 2541 4 183
+v 200 2423 a Fh(Keyw)n(ord)p 1200 2541 V 753 w(Description)p
+2599 2541 V 1015 w(Range)169 b(of)g(V)-6 b(alues)2650
+2514 y Fg([Default])p 3525 2541 V 150 2545 3378 4 v 150
+2561 V 148 2927 4 366 v 200 2625 a Fh(X)p 263 2625 24
+4 v 27 w(PREFIX)p 1200 2927 4 366 v 670 w(This)20 b(is)g(a)g(pre\014x)f
+(for)h(the)g(x-data)f(\014le)g(name.)1252 2717 y(A)35
+b(\014le)h(name)f(is)h(constructed)f(from)h([pre-)1252
+2808 y(\014x][coun)n(ter][p)r(ost\014x],)f(where)f(pre\014x)e(and)1252
+2899 y(p)r(ost\014x)25 b(can)h(b)r(e)f(empt)n(y)-6 b(.)p
+2599 2927 V 2650 2625 a(c)n(haracter)19 b(string)f(of)h(length)2650
+2717 y(32)27 b Fg([no)i(default])p 3525 2927 V 150 2930
+3378 4 v 148 3113 4 183 v 200 2994 a Fh(Y)p 263 2994
+24 4 v 27 w(PREFIX)p 1200 3113 4 183 v 670 w(This)20
+b(is)g(a)g(pre\014x)f(for)h(the)g(y-data)f(\014le)g(name.)p
+2599 3113 V 99 w(c)n(haracter)g(string)f(of)h(length)2650
+3085 y(32)27 b Fg([no)i(default])p 3525 3113 V 150 3116
+3378 4 v 148 3299 4 183 v 200 3180 a Fh(X)p 263 3180
+24 4 v 27 w(POSTFIX)p 1200 3299 4 183 v 621 w(This)46
+b(is)h(a)f(p)r(ost\014x)f(for)i(the)e(x-data)h(\014le)1252
+3271 y(name.)p 2599 3299 V 2650 3180 a(c)n(haracter)19
+b(string)f(of)h(length)2650 3271 y(32)27 b Fg([no)i(default])p
+3525 3299 V 150 3302 3378 4 v 148 3485 4 183 v 200 3366
+a Fh(Y)p 263 3366 24 4 v 27 w(POSTFIX)p 1200 3485 4 183
+v 621 w(This)46 b(is)h(a)f(p)r(ost\014x)f(for)i(the)e(y-data)h(\014le)
+1252 3457 y(name.)p 2599 3485 V 2650 3366 a(c)n(haracter)19
+b(string)f(of)h(length)2650 3457 y(32)27 b Fg([no)i(default])p
+3525 3485 V 150 3488 3378 4 v 148 3670 4 183 v 200 3552
+a Fh(TIME)p 410 3552 24 4 v 28 w(F)-9 b(A)n(CTOR)p 1200
+3670 4 183 v 495 w(This)39 b(de\014nes)f(the)h(mo)r(del)f(time)g(b)r
+(et)n(w)n(een)1252 3643 y(the)25 b(incremen)n(ts/)g(wind)h(data)g(up)r
+(dates)p 2599 3670 V 2650 3552 a(0.0)h(to)f(real)h(range)f
+Fg([?])p 3525 3670 V 150 3674 3378 4 v 148 3856 4 183
+v 200 3738 a Fh(NUMBER)p 554 3738 24 4 v 27 w(OF)p 691
+3738 V 28 w(INTER)-9 b(V)g(ALS)p 1200 3856 4 183 v 99
+w(This)58 b(de\014nes)f(the)g(incremen)n(t)f(for)i(the)1252
+3829 y(coun)n(ter)25 b(in)h(the)f(\014le)h(name)e(construction.)p
+2599 3856 V 2650 3738 a(0)48 b(to)g(in)n(teger)g(range)g
+Fg([no)2650 3829 y(default])p 3525 3856 V 150 3860 3378
+4 v 148 4590 4 731 v 200 3924 a Fh(UPSET)p 465 3924 24
+4 v 28 w(OF)p 603 3924 V 27 w(INTER)-9 b(V)g(ALS)p 1200
+4590 4 731 v 188 w(This)55 b(is)h(the)e(o\013set)i(for)f(the)g(\014rst)
+g(\014le)1252 4015 y(coun)n(ter.)40 b(Th)n(us)28 b(a)g(x-data)f(\014le)
+h(with)g(name)1252 4106 y([X)p 1336 4106 24 4 v 27 w(PREFIX][)p
+Fb(n)p Fh(][X)p 1848 4106 V 29 w(POSTFIX],)c(where)h
+Fb(n)1252 4198 y Fh(=)157 b(UPSET)p 1734 4198 V 28 w(OF)p
+1872 4198 V 28 w(INTER)-9 b(V)g(ALS)157 b(+)1252 4289
+y Fb(k)25 b Fc(\002)e Fh(NUMBER)p 1754 4289 V 27 w(OF)p
+1891 4289 V 28 w(INTER)-9 b(V)g(ALS)22 b(holds)1252 4380
+y(data)249 b(for)i(the)e(mo)r(del)1252 4472 y(time)31
+b Fb(k)j Fc(\002)e Fh(NUMBER)p 1953 4472 V 27 w(OF)p
+2090 4472 V 28 w(INTER)-9 b(V)g(ALS)1252 4563 y Fc(\002)25
+b Fh(TIME)p 1547 4563 V 28 w(F)-9 b(A)n(CTOR.)p 2599
+4590 4 731 v 2650 3924 a(0)48 b(to)g(in)n(teger)g(range)g
+Fg([no)2650 4015 y(default])p 3525 4590 V 150 4594 3378
+4 v 148 4868 4 274 v 200 4658 a Fh(X)p 263 4658 24 4
+v 27 w(NUMBER)p 639 4658 V 27 w(OF)p 776 4658 V 28 w(POINTS)p
+1200 4868 4 274 v 157 w(Num)n(b)r(er)22 b(of)i(p)r(oin)n(ts)h(in)f
+(x-direction.)33 b(Wind)1252 4749 y(data)21 b(are)h(assumed)f(to)g(b)r
+(e)g(giv)n(en)g(on)g(a)h(rect-)1252 4840 y(angular)k(uniform)f(grid.)p
+2599 4868 V 2650 4658 a(0)48 b(to)g(in)n(teger)g(range)g
+Fg([no)2650 4749 y(default])p 3525 4868 V 150 4871 3378
+4 v 148 5145 4 274 v 200 4935 a Fh(Y)p 263 4935 24 4
+v 27 w(NUMBER)p 639 4935 V 27 w(OF)p 776 4935 V 28 w(POINTS)p
+1200 5145 4 274 v 157 w(Num)n(b)r(er)22 b(of)i(p)r(oin)n(ts)h(in)f
+(x-direction.)33 b(Wind)1252 5026 y(data)21 b(are)h(assumed)f(to)g(b)r
+(e)g(giv)n(en)g(on)g(a)h(rect-)1252 5118 y(angular)k(uniform)f(grid.)p
+2599 5145 V 2650 4935 a(0)48 b(to)g(in)n(teger)g(range)g
+Fg([no)2650 5026 y(default])p 3525 5145 V 150 5148 3378
+4 v 1892 5919 a Fk(5)p eop
+%%Page: 6 6
+6 5 bop 150 390 a Fk(T)-7 b(able)27 b(con)n(tin)n(ued)p
+150 455 3118 4 v 148 638 4 183 v 200 519 a Fh(Keyw)n(ord)p
+941 638 V 493 w(Description)p 2340 638 V 1016 w(Range)169
+b(of)g(V)-6 b(alues)2391 611 y Fg([Default])p 3266 638
+V 150 641 3118 4 v 150 658 V 148 1115 4 457 v 200 722
+a Fh(X)p 263 722 24 4 v 27 w(SCALE)p 546 722 V 28 w(F)d(A)n(CTOR)p
+941 1115 4 457 v 99 w(A)23 b(scaling)h(factor)h(de\014ning)d(the)g
+(mesh)g(size.)992 813 y(When)27 b(wind)h(is)g(giv)n(en)g(in)f(meters)g
+(p)r(er)h(sec-)992 905 y(ond,)g(then)f(the)g(scaling)i(factor)g(is)f
+(just)g(the)992 996 y(grid)d(spacing)g(for)g(the)e(rectangular)i(grid)g
+(in)992 1087 y(meters.)p 2340 1115 V 2391 722 a(0.0)60
+b(to)f(real)h(range)f Fg([no)2391 813 y(default])p 3266
+1115 V 150 1118 3118 4 v 148 1301 4 183 v 200 1182 a
+Fh(Y)p 263 1182 24 4 v 27 w(SCALE)p 546 1182 V 28 w(F)-9
+b(A)n(CTOR)p 941 1301 4 183 v 99 w(The)26 b(analog)i(of)e(X)p
+1544 1182 24 4 v 27 w(SCALE)p 1827 1182 V 28 w(F)-9 b(A)n(CTOR)26
+b(for)992 1273 y(the)g(y-direction.)p 2340 1301 4 183
+v 2391 1182 a(0.0)60 b(to)f(real)h(range)f Fg([no)2391
+1273 y(default])p 3266 1301 V 150 1304 3118 4 v 150 1553
+a Fj(FILE:)38 b(Initial.dat)150 1706 y Fi(DESCRIPTION:)150
+1860 y Fk(This)28 b(\014le)f(de\014nes)h(in)g(a)f(crude)g(w)n(a)n(y)-7
+b(,)27 b(where)g(to)g(initialize)h(a)f(tracer.)150 2013
+y Fi(KEYW)m(ORDS:)p 150 2078 3448 4 v 148 2261 4 183
+v 200 2142 a Fh(Keyw)n(ord)p 1271 2261 V 823 w(Description)p
+2669 2261 V 1016 w(Range)168 b(of)i(V)-6 b(alues)2721
+2233 y Fg([Default])p 3596 2261 V 150 2264 3448 4 v 150
+2281 V 148 2463 4 183 v 200 2345 a Fh(CIR)n(CLES)p 541
+2345 24 4 v 27 w(INPUT)p 1271 2463 4 183 v 508 w(Has)20
+b(no)f(v)l(alue)g(and)f(is)i(required.)32 b(Don't)19
+b(ask)1322 2436 y(for)27 b(more)e(explanations.)p 2669
+2463 V 3596 2463 V 150 2467 3448 4 v 148 2649 4 183 v
+200 2531 a(NUMBER)p 554 2531 24 4 v 27 w(OF)p 691 2531
+V 28 w(CIR)n(CLES)p 1271 2649 4 183 v 272 w(This)39 b(is)f(the)g(n)n
+(um)n(b)r(er)e(of)i(initial)h(circular)1322 2622 y(concen)n(trations.)p
+2669 2649 V 2721 2531 a(0)48 b(to)g(in)n(teger)g(range)g
+Fg([no)2721 2622 y(default])p 3596 2649 V 150 2653 3448
+4 v 148 3018 4 366 v 200 2717 a Fh(CIR)n(CLE)p 498 2717
+24 4 v 28 w(COORDINA)-6 b(TES)p 1271 3018 4 366 v 222
+w(This)23 b(blo)r(c)n(k)f(of)h(t)n(w)n(o)g(co)r(ordinate)h(v)l(alues)e
+(de-)1322 2808 y(\014nes)46 b(the)g(cen)n(ter)f(of)i(the)f(circle.)97
+b(This)1322 2899 y(k)n(eyw)n(ord)58 b(o)r(ccurs)i(as)f(often)g(as)g
+(NUM-)1322 2991 y(BER)p 1490 2991 24 4 v 28 w(OF)p 1628
+2991 V 27 w(CIR)n(CLES)26 b(indicates.)p 2669 3018 4
+366 v 2721 2717 a(-)48 b(real)h(range)g(to)g(+)f(real)2721
+2808 y(range)26 b Fg([no)k(default])p 3596 3018 V 150
+3021 3448 4 v 148 3204 4 183 v 200 3085 a Fh(CIR)n(CLE)p
+498 3085 24 4 v 28 w(DIAMETER)p 1271 3204 4 183 v 370
+w(De\014nes)25 b(the)h(diameter)f(of)h(the)g(circle.)p
+2669 3204 V 263 w(0.0)36 b(to)f(+)g(real)h(range)g Fg([no)2721
+3177 y(default])p 3596 3204 V 150 3207 3448 4 v 148 3390
+4 183 v 200 3271 a Fh(CIR)n(CLE)p 498 3271 24 4 v 28
+w(CONCENTRA)-6 b(TION)p 1271 3390 4 183 v 98 w(This)22
+b(de\014nes)e(the)g(initial)i(concen)n(tration)f(of)1322
+3362 y(the)k(tracer.)p 2669 3390 V 2721 3271 a(0.0)36
+b(to)f(+)g(real)h(range)g Fg([no)2721 3362 y(default])p
+3596 3390 V 150 3393 3448 4 v 2544 3632 a Fk(J"orn)26
+b(Behrens,)h(Marc)n(h)f(20,)h(1998)1892 5919 y(6)p eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/flash2d/doc/README b/flash2d/doc/README
new file mode 100644
index 0000000..c13a87e
--- /dev/null
+++ b/flash2d/doc/README
@@ -0,0 +1,30 @@
+**************************************************************************
+ FLASH90
+ FLexible Adaptive Semi-Lagrangian Hack
+ written in Fortran 90
+
+**************************************************************************
+
+ CONTENTS OF THIS DIRECTORY "$(FLASHDIR)/doc"
+
+README		- this file
+sources		- Directory containing the editable sources to some ps files
+Dataflow.eps	- Diagram showing the main dataflow structure
+Datastruct.eps	- Grid data structure (nodes, edges, elements)
+GridFlow.ps	- Flow Diagrams of the main routines
+InputDok.ps	- Input file formats for FLASH
+Triang.ps	- Initial triangulation example
+grids.ps	- grids, distorted grids nd their duals
+netcdf.doc	- some remarks on netcdf
+para-grid.eps	- Idea of the parallel grid generator
+structure.ps	- Main structure of cfiles.c (graphics)
+
+--------------------------------------------------------------------------
+
+ WHAT TO DO HERE:
+ 
+enjoy the documentation as it is... :-)
+
+**************************************************************************
+ j. behrens, 3/99
+**************************************************************************
diff --git a/flash2d/doc/Triang.ps b/flash2d/doc/Triang.ps
new file mode 100644
index 0000000..d8cddb6
--- /dev/null
+++ b/flash2d/doc/Triang.ps
@@ -0,0 +1,922 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%BoundingBox: 193 366 455 704
+%%Title: /tmpdir/jbehrens/JB-Local/Flash/doc/Triang.ps
+%%CreationDate: 1:29 PM December 15, 1997
+%%Pages: 1
+%%EndComments
+%%BeginProlog
+%%BeginResource ShowcaseResource
+1 setlinejoin
+/M  { moveto } bind def /S { show  } bind def
+/R { rmoveto } bind def /L { lineto } bind def
+/B { newpath 0 0 M 0 1 L 1 1 L 1 0 L closepath } bind def
+/CS { closepath stroke } bind def
+/S {
+    /fixwidth exch def
+    dup length /nchars exch def
+    dup stringwidth pop
+    fixwidth exch sub nchars div
+    exch 0 exch ashow
+} def
+/bwproc {
+	rgbproc
+	dup length 3 idiv string 0 3 0
+	5 -1 roll {
+	add 2 1 roll 1 sub dup 0 eq
+	{ pop 3 idiv 3 -1 roll dup 4 -1 roll dup
+	  3 1 roll 5 -1 roll put 1 add 3 0 }
+	{ 2 1 roll } ifelse
+	} forall
+	pop pop pop
+} def
+systemdict /colorimage known not {
+	/colorimage {
+		pop
+		pop
+		/rgbproc exch def
+		{ bwproc } image
+	} def
+} if
+1 1 scale
+0 setlinewidth
+/drawtri {
+/y3 exch def
+/x3 exch def
+/y2 exch def
+/x2 exch def
+/y1 exch def
+/x1 exch def
+0 setgray
+newpath
+x1 y1 moveto
+x2 y2 lineto
+x3 y3 lineto
+closepath
+stroke
+} bind def
+/filltri {
+/y3 exch def
+/x3 exch def
+/y2 exch def
+/x2 exch def
+/y1 exch def
+/x1 exch def
+newpath
+x1 y1 moveto
+x2 y2 lineto
+x3 y3 lineto
+closepath
+fill
+} bind def
+/cliptri {
+/y3 exch def
+/x3 exch def
+/y2 exch def
+/x2 exch def
+/y1 exch def
+/x1 exch def
+0 setgray
+newpath
+x1 y1 moveto
+x2 y2 lineto
+x3 y3 lineto
+closepath
+clip
+} bind def
+/imgscanrgb {
+gsave
+translate
+/scandy exch def
+/scandx exch def
+/istr scandx 3 mul string def
+scandx scandy scale
+scandx scandy 8
+[scandx 0 0 scandy neg 0 scandy]
+{currentfile istr readhexstring pop}
+false 3
+colorimage
+grestore
+} bind def
+/imgscanbw {
+gsave
+translate
+/scandy exch def
+/scandx exch def
+/istr scandx string def
+scandx scandy scale
+scandx scandy 8
+[scandx 0 0 scandy neg 0 scandy]
+{currentfile istr readhexstring pop}
+image
+grestore
+} bind def
+/showcaseisoencoding [
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign
+/dollar /percent /ampersand /quoteright
+/parenleft /parenright /asterisk /plus
+/comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon
+/less /equal /greater /question
+/at /A /B /C /D /E /F /G
+/H /I /J /K /L /M /N /O
+/P /Q /R /S /T /U /V /W
+/X /Y /Z /bracketleft
+/backslash /bracketright /asciicircum /underscore
+/quoteleft /a /b /c /d /e /f /g
+/h /i /j /k /l /m /n /o
+/p /q /r /s /t /u /v /w
+/x /y /z /braceleft
+/bar /braceright /asciitilde /guilsinglright
+/fraction /florin /quotesingle /quotedblleft
+/guilsinglleft /fi /fl /endash
+/dagger /daggerdbl /bullet /quotesinglbase
+/quotedblbase /quotedblright /ellipsis /trademark
+/dotlessi /grave /acute /circumflex
+/tilde /macron /breve /dotaccent
+/dieresis /perthousand /ring /cedilla
+/Ydieresis /hungarumlaut /ogonek /caron
+/emdash /exclamdown /cent /sterling
+/currency /yen /brokenbar /section
+/dieresis /copyright /ordfeminine /guillemotleft
+/logicalnot /hyphen /registered /macron
+/degree /plusminus /twosuperior /threesuperior
+/acute /mu /paragraph /periodcentered
+/cedilla /onesuperior /ordmasculine /guillemotright
+/onequarter /onehalf /threequarters /questiondown
+/Agrave /Aacute /Acircumflex /Atilde
+/Adieresis /Aring /AE /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis
+/Igrave /Iacute /Icircumflex /Idieresis
+/Eth /Ntilde /Ograve /Oacute
+/Ocircumflex /Otilde /Odieresis /multiply
+/Oslash /Ugrave /Uacute /Ucircumflex
+/Udieresis /Yacute /Thorn /germandbls
+/agrave /aacute /acircumflex /atilde
+/adieresis /aring /ae /ccedilla
+/egrave /eacute /ecircumflex /edieresis
+/igrave /iacute /icircumflex /idieresis
+/eth /ntilde /ograve /oacute
+/ocircumflex /otilde /odieresis /divide
+/oslash /ugrave /uacute /ucircumflex
+/udieresis /yacute /thorn /ydieresis ] def
+/showcasedingbatencoding [
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /a1 /a2 /a202 /a3 /a4 /a5 /a119 /a118 /a117
+/a11 /a12 /a13 /a14 /a15 /a16 /a105 /a17 /a18 /a19
+/a20 /a21 /a22 /a23 /a24 /a25 /a26 /a27 /a28 /a6 /a7
+/a8 /a9 /a10 /a29
+/a30 /a31 /a32 /a33 /a34 /a35 /a36 /a37 /a38 /a39
+/a40 /a41 /a42 /a43 /a44 /a45 /a46 /a47 /a48 /a49
+/a50 /a51 /a52 /a53 /a54 /a55 /a56 /a57 /a58 /a59
+/a60 /a61 /a62 /a63 /a64 /a65 /a66 /a67 /a68 /a69
+/a70 /a71 /a72 /a73 /a74 /a203 /a75 /a204 /a76 /a77 /a78
+/a79 /a81 /a82 /a83 /a84 /a97 /a98 /a99 /a100 /.notdef
+/a205 /a85 /a206 /a86 /a87 /a88 /a89 /a90 /a91 /a92 /a93
+/a94 /a95 /a96
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /a101 /a102 /a103 /a104 /a106 /a107 /a108
+/a112 /a111 /a110 /a109
+/a120 /a121 /a122 /a123 /a124 /a125 /a126 /a127 /a128 /a129
+/a130 /a131 /a132 /a133 /a134 /a135 /a136 /a137 /a138 /a139
+/a140 /a141 /a142 /a143 /a144 /a145 /a146 /a147 /a148 /a149
+/a150 /a151 /a152 /a153 /a154 /a155 /a156 /a157 /a158 /a159
+/a160 /a161 /a163 /a164 /a196 /a165 /a192 /a166 /a167 /a168
+/a169 /a170 /a171 /a172 /a173 /a162 /a174 /a175 /a176 /a177
+/a178 /a179 /a193 /a180 /a199 /a181 /a200 /a182 /.notdef
+/a201 /a183 /a184 /a197 /a185 /a194 /a198 /a186 /a195 /a187
+/a188 /a189 /a190 /a191 /.notdef
+] def
+/newfont 10 dict def
+newfont begin
+
+ /FontType 3 def
+ /FontMatrix [1 0 0 1 0 0] def
+ /FontBBox [0 0 1 1] def
+ /Encoding 256 array def
+ 0 1 255 {Encoding exch /.notdef put} for
+
+ /CharProcs 1 dict def
+ CharProcs begin
+ /.notdef {} def
+
+end
+
+ /BuildChar {
+  1 0
+  0 0 1 1
+  setcachedevice
+  exch begin
+  Encoding exch get
+  CharProcs exch get
+  end
+  exec
+ } def
+end
+/PatternFont newfont definefont pop
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+%%EndSetup
+%%Page: label 1
+gsave
+/saveit save def
+gsave
+gsave
+matrix currentmatrix
+[255.333 0 0 -255.333 193.667 685.333] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+193.667 685.333 M
+449 430 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+449 685.333 M
+194.333 430 L
+stroke
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 224.5 406] concat
+newpath
+0 0 M 0 14 L 44 14 L 44 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+222.5 404 M 222.5 422 L 270.5 422 L 270.5 404 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 224.5 406] concat
+/Courier-Bold-SHOWISO findfont 14 scalefont setfont
+0 0 0 setrgbcolor
+0 3.5 M (Nodes) 42 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 194 411.164] concat
+newpath
+0 0 M 0 14 L 10.4 14 L 10.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+192 409.164 M 192 427.164 L 206.4 427.164 L 206.4 409.164 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 194 411.164] concat
+/Courier-Bold-SHOWISO findfont 14 scalefont setfont
+0 0 0 setrgbcolor
+0 3.5 M (1) 8.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 444 410.497] concat
+newpath
+0 0 M 0 14 L 10.4 14 L 10.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+442 408.497 M 442 426.497 L 456.4 426.497 L 456.4 408.497 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 444 410.497] concat
+/Courier-Bold-SHOWISO findfont 14 scalefont setfont
+0 0 0 setrgbcolor
+0 3.5 M (2) 8.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 0.999996 444 689.167] concat
+newpath
+0 0 M 0 14 L 10.4 14 L 10.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+442 687.167 M 442 705.167 L 456.4 705.167 L 456.4 687.167 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 0.999996 444 689.167] concat
+/Courier-Bold-SHOWISO findfont 14 scalefont setfont
+0 0 0 setrgbcolor
+0 3.5 M (3) 8.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 194 689.167] concat
+newpath
+0 0 M 0 14 L 10.4 14 L 10.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+192 687.167 M 192 705.167 L 206.4 705.167 L 206.4 687.167 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 194 689.167] concat
+/Courier-Bold-SHOWISO findfont 14 scalefont setfont
+0 0 0 setrgbcolor
+0 3.5 M (4) 8.4 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 224.5 388.365] concat
+newpath
+0 0 M 0 14 L 44.014 14 L 44.014 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+222.5 386.365 M 222.5 404.835 L 270.514 404.835 L 270.514 386.365 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 224.5 388.365] concat
+/Helvetica-Bold-SHOWISO findfont 14 scalefont setfont
+0 0 0 setrgbcolor
+0 2.47059 M (Edges) 42.014 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 321.833 436.031] concat
+newpath
+0 0 M 0 14 L 9.784 14 L 9.784 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+319.833 434.031 M 319.833 452.502 L 333.617 452.502 L 333.617 434.031 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 321.833 436.031] concat
+/Helvetica-Bold-SHOWISO findfont 14 scalefont setfont
+0 0 0 setrgbcolor
+0 2.47059 M (1) 7.784 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 434.5 555.531] concat
+newpath
+0 0 M 0 14 L 9.784 14 L 9.784 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+432.5 553.531 M 432.5 572.002 L 446.284 572.002 L 446.284 553.531 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 434.5 555.531] concat
+/Helvetica-Bold-SHOWISO findfont 14 scalefont setfont
+0 0 0 setrgbcolor
+0 2.47059 M (2) 7.784 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 317.667 664.195] concat
+newpath
+0 0 M 0 14 L 9.784 14 L 9.784 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+315.667 662.195 M 315.667 680.666 L 329.451 680.666 L 329.451 662.195 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 317.667 664.195] concat
+/Helvetica-Bold-SHOWISO findfont 14 scalefont setfont
+0 0 0 setrgbcolor
+0 2.47059 M (3) 7.784 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 202.667 549.531] concat
+newpath
+0 0 M 0 14 L 9.784 14 L 9.784 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+200.667 547.531 M 200.667 566.002 L 214.451 566.002 L 214.451 547.531 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 202.667 549.531] concat
+/Helvetica-Bold-SHOWISO findfont 14 scalefont setfont
+0 0 0 setrgbcolor
+0 2.47059 M (4) 7.784 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 385.167 495.031] concat
+newpath
+0 0 M 0 14 L 9.784 14 L 9.784 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+383.167 493.031 M 383.167 511.502 L 396.951 511.502 L 396.951 493.031 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 385.167 495.031] concat
+/Helvetica-Bold-SHOWISO findfont 14 scalefont setfont
+0 0 0 setrgbcolor
+0 2.47059 M (5) 7.784 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 369.167 616.031] concat
+newpath
+0 0 M 0 14 L 9.784 14 L 9.784 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+367.167 614.031 M 367.167 632.502 L 380.951 632.502 L 380.951 614.031 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 369.167 616.031] concat
+/Helvetica-Bold-SHOWISO findfont 14 scalefont setfont
+0 0 0 setrgbcolor
+0 2.47059 M (6) 7.784 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 250.333 602.859] concat
+newpath
+0 0 M 0 14 L 9.784 14 L 9.784 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+248.333 600.859 M 248.333 619.33 L 262.117 619.33 L 262.117 600.859 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 250.333 602.859] concat
+/Helvetica-Bold-SHOWISO findfont 14 scalefont setfont
+0 0 0 setrgbcolor
+0 2.47059 M (7) 7.784 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 256.333 477.195] concat
+newpath
+0 0 M 0 14 L 9.784 14 L 9.784 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+254.333 475.195 M 254.333 493.666 L 268.117 493.666 L 268.117 475.195 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 256.333 477.195] concat
+/Helvetica-Bold-SHOWISO findfont 14 scalefont setfont
+0 0 0 setrgbcolor
+0 2.47059 M (8) 7.784 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 225.167 368.362] concat
+newpath
+0 0 M 0 14 L 60.352 14 L 60.352 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+223.167 366.362 M 223.167 384.833 L 287.519 384.833 L 287.519 366.362 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 225.167 368.362] concat
+/Helvetica-Oblique-SHOWISO findfont 14 scalefont setfont
+0 0 0 setrgbcolor
+0 2.47059 M (Elements) 58.352 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 320 471.529] concat
+newpath
+0 0 M 0 14 L 9.784 14 L 9.784 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+318 469.529 M 318 487.999 L 331.784 487.999 L 331.784 469.529 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 320 471.529] concat
+/Helvetica-Oblique-SHOWISO findfont 14 scalefont setfont
+0 0 0 setrgbcolor
+0 2.47059 M (1) 7.784 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 388 552.195] concat
+newpath
+0 0 M 0 14 L 9.784 14 L 9.784 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+386 550.195 M 386 568.666 L 399.784 568.666 L 399.784 550.195 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 388 552.195] concat
+/Helvetica-Oblique-SHOWISO findfont 14 scalefont setfont
+0 0 0 setrgbcolor
+0 2.47059 M (2) 7.784 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 317.333 628.859] concat
+newpath
+0 0 M 0 14 L 9.784 14 L 9.784 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+315.333 626.859 M 315.333 645.33 L 329.117 645.33 L 329.117 626.859 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 317.333 628.859] concat
+/Helvetica-Oblique-SHOWISO findfont 14 scalefont setfont
+0 0 0 setrgbcolor
+0 2.47059 M (3) 7.784 S
+setmatrix
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 242 552.195] concat
+newpath
+0 0 M 0 14 L 9.784 14 L 9.784 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+240 550.195 M 240 568.666 L 253.784 568.666 L 253.784 550.195 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 242 552.195] concat
+/Helvetica-Oblique-SHOWISO findfont 14 scalefont setfont
+0 0 0 setrgbcolor
+0 2.47059 M (4) 7.784 S
+setmatrix
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+229.5 366.833 M
+224.625 367.958 L
+222 371.333 L
+221.5 374.833 L
+221.5 374.833 L
+221.5 374.833 L
+221.5 374.833 L
+222.625 379.708 L
+226 382.333 L
+229.5 382.833 L
+229.5 382.833 L
+230.237 382.833 L
+231.977 382.833 L
+234.571 382.833 L
+237.875 382.833 L
+241.741 382.833 L
+246.023 382.833 L
+250.575 382.833 L
+255.25 382.833 L
+259.901 382.833 L
+264.383 382.833 L
+268.548 382.833 L
+272.25 382.833 L
+275.343 382.833 L
+277.68 382.833 L
+279.114 382.833 L
+279.5 382.833 L
+279.5 382.833 L
+284.375 381.708 L
+287 378.333 L
+287.5 374.833 L
+287.5 374.833 L
+287.5 374.833 L
+287.5 374.833 L
+286.375 369.958 L
+283 367.333 L
+279.5 366.833 L
+279.5 366.833 L
+278.785 366.833 L
+277.105 366.833 L
+274.6 366.833 L
+271.406 366.833 L
+267.662 366.833 L
+263.504 366.833 L
+259.071 366.833 L
+254.5 366.833 L
+249.929 366.833 L
+245.496 366.833 L
+241.338 366.833 L
+237.594 366.833 L
+234.4 366.833 L
+231.895 366.833 L
+230.215 366.833 L
+229.5 366.833 L
+closepath
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+323.667 470.667 M
+318.894 471.838 L
+316.576 475.353 L
+316.333 477.667 L
+316.333 477.667 L
+316.333 479 L
+316.333 479 L
+317.561 483.556 L
+321.242 485.769 L
+323.667 486 L
+323.667 486 L
+323.667 486 L
+323.667 486 L
+328.439 484.828 L
+330.758 481.314 L
+331 479 L
+331 479 L
+331 477.667 L
+331 477.667 L
+329.773 473.111 L
+326.091 470.898 L
+323.667 470.667 L
+323.667 470.667 L
+323.791 470.667 L
+closepath
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+391.667 550.667 M
+386.894 551.838 L
+384.576 555.353 L
+384.333 557.667 L
+384.333 557.667 L
+384.333 559 L
+384.333 559 L
+385.561 563.556 L
+389.242 565.769 L
+391.667 566 L
+391.667 566 L
+391.667 566 L
+391.667 566 L
+396.439 564.829 L
+398.758 561.314 L
+399 559 L
+399 559 L
+399 557.667 L
+399 557.667 L
+397.773 553.111 L
+394.091 550.898 L
+391.667 550.667 L
+391.667 550.667 L
+391.791 550.667 L
+closepath
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+321 628 M
+316.227 629.172 L
+313.909 632.686 L
+313.667 635 L
+313.667 635 L
+313.667 636.333 L
+313.667 636.333 L
+314.894 640.889 L
+318.576 643.102 L
+321 643.333 L
+321 643.333 L
+321 643.333 L
+321 643.333 L
+325.773 642.162 L
+328.091 638.647 L
+328.333 636.333 L
+328.333 636.333 L
+328.333 635 L
+328.333 635 L
+327.106 630.444 L
+323.424 628.231 L
+321 628 L
+321 628 L
+321.124 628 L
+closepath
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+newpath
+246.333 550.667 M
+241.561 551.838 L
+239.242 555.353 L
+239 557.667 L
+239 557.667 L
+239 559 L
+239 559 L
+240.227 563.556 L
+243.909 565.769 L
+246.333 566 L
+246.333 566 L
+246.333 566 L
+246.333 566 L
+251.106 564.829 L
+253.424 561.314 L
+253.667 559 L
+253.667 559 L
+253.667 557.667 L
+253.667 557.667 L
+252.439 553.111 L
+248.758 550.898 L
+246.333 550.667 L
+246.333 550.667 L
+246.457 550.667 L
+closepath
+stroke
+grestore
+gsave
+gsave
+matrix currentmatrix
+[0.951923 0 0 1 317 536] concat
+newpath
+0 0 M 0 14 L 10.4 14 L 10.4 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+315.096 534 M 315.096 552 L 328.804 552 L 328.804 534 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[0.951923 0 0 1 317 536] concat
+/Courier-Bold-SHOWISO findfont 14 scalefont setfont
+0 0 0 setrgbcolor
+0 3.5 M (5) 8.4 S
+setmatrix
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+[2] 0 setdash
+newpath
+201 433.5 M
+442.5 433.5 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+[2] 0 setdash
+newpath
+201.5 681.5 M
+443 681.5 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+[2] 0 setdash
+newpath
+197.5 678 M
+197.5 436.5 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+[2] 0 setdash
+newpath
+446 679 M
+446 437.5 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+[2] 0 setdash
+newpath
+312 413 M
+346 413 L
+stroke
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 352 406.5] concat
+newpath
+0 0 M 0 14 L 83.704 14 L 83.704 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+350 404.5 M 350 422.971 L 437.704 422.971 L 437.704 404.5 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 352 406.5] concat
+/Helvetica-SHOWISO findfont 14 scalefont setfont
+0 0 0 setrgbcolor
+0 2.47059 M (marked edge) 81.704 S
+setmatrix
+grestore
+grestore
+showpage
+saveit restore
+grestore
+%%EOF
diff --git a/flash2d/doc/flash.png b/flash2d/doc/flash.png
new file mode 100644
index 0000000000000000000000000000000000000000..c2ec60c772065d0a44de01b1d13d38f3e67ef50a
GIT binary patch
literal 18915
zcmeAS@N?(olHy`uVBq!ia0y~yU`SzLV2I>kV_;x7!PcnGz`($g?&#~tz_78O`%fY(
z0|SFXvPY0F14ES>14Ba#1H&%{28M<g3=E|P3=FRl7#OT(FffQ0%-I!a!@$76S>O>_
z%)r2(2*Qjj?3ZUUFfd-t42dX-@b$4u&d=3LOvz75)vL%YU;qJ|3ag6Tg51=SM1_jn
zoV;SI3R@+x3ah+gE0D0hk^)#sNw%$0gl~X?bAC~(f~lT~o`I4bmx6+VO;JjkRgjAt
zRC`fMnypesNlAf~zJ7Umxn8-kUVc%!zM-Y1rM`iYzLAk`QA(O_ab;dfVufyAu`<LE
zm^m(~#mPmP1tppJc?uwN6O-~wOKg>tKo%*$0K}aonP~`{@`|C}O3u&K2g&Fg>KW+6
z%?23{618&9&n+lQEiTT?&$BbM0joq2L)c>jR_|YwnVMIU2yzcxJ+c_O`hbl5lKkA%
zlA_FH&%Bb<qJpASsBR;uZMaoH&9c!4c^oMqAfXHv4RUd_<Fe5Q#|J2G?6{b2G_W!-
zI52p+IEGX(uH75ipK@~Qg7TX3{(|o}l#PqdpE`Bxgw`exzTMF|g;h)B5)?Q-E7`tq
z)&Ir(i<RlilKBd@{8G#rax6Rw4ibz^Rcx=scJCC~9(7{XsZ+K}#>w$D_rKJZ{dIFq
zP2G4?Dsox-{T<ymH*TJvd^}I&->>?g^V6mK_jMetvOVTF`|P3z-&?<ZHIAF(I<dOj
zxUb^C<HC&+%X_P?v@Oo)Ic}&YlGNTU{BB>+4A<8D{#^b3hdU*|i@!MjK5nbf)Q>8w
zz8EjPf2l<3aFOM&sa__(Yuo#iHVQbuyPwAM`(9Fy(*3@VMgQ;2TUYsy_51u!wKIQ<
z|2&uY=)<1M{okkkD6zQp&}H^x-gzHyO*wx$x!{%j)lY_}mIl3%lRNfB|DVyR+4bM$
zAAQ>Y%lzU3ZTov)j+-<}>bdf)V~ALkawLPb!JXmX>6}UKcP>9Vyz<KS<Dqu-89g<V
z=9+K*7hZRYc}t+}qaW?3H-31d@oIkB3E855E$5BoCu;ra3w%~AnAoSj&_-SHh1Nj@
zLGd3RBI}>(x=%S@^798zu=kO|o@al4gtk1tB!9JN#-5$b3Z)ZDDxUXhY`^Wj@zlx3
z-^Cw(s=MOV5LR@;GQ#+s%)yCf8=q#{9X|cuZTViIr~f?5Rs}2xR!RQv=(EqhBl*H*
zEuTwU75T3{Tr=5IGwNt&NVkvcMz7v;Tpu28IleQJCp@k{G1*Y<Dys_bl=}baFKbp-
z8hcI8JNDs{&M*5FN8h|K(E464=)HF7j0;Cg%vcjQTg;o5w9}+BsIl_QaSelQ$KzHP
z?m1O^Xp4eR@P%{V7a3SO=J|ep@}TGUahvT-XKMGoo-@1Pqs83fo;CM#<o=(SZ|7}2
zZ_45w8w92Qf8YD!>Z(AwMRINT+gD$Ee}peMYrakY)q`bcygr;uIZ&>AZrxu6wW(Pm
z0n)4uv!<OovtD9tI{%`gZyI+W`*2-${1Paq{vmcYXPD%doUk52;f#;Jm9(C5u$-9K
zt>7~uttWDZQqtz2FW2vP{BzPi)tndN$G^Dl%Zx$?=aoXO=gM?!?Rq_vRr^l$T13S3
zWk=_`rGEduVq@zJ(bXFRWE6Wh-)R4k`$0#T<+C*7VZrCCdUi6%#0uCxiQ&FD&5>`X
zTF;?5DxJsumOU-W6MbZr{(il~dbaO8j*sN#tM<)ZT)yPz=g;z4tLi1wjoLXsBx!z~
z=vldwJJe5aukglQqTPG_WJ1@wzZ9H2Ut>+j<!9N3>#ij|{GuS}=p^#s*sGJ5HA(}#
z49XLE$}d;>Jn1<X&gC9>vee<%w9jdtp;LA|uQ(#IbG>G<)pSRf|DR?T?x<7^+a~Yw
z_~(1$7a<Q`i7sisz4(HC$Ge-3Ap*Cgy-q*-YH|46(QoS)a|p^h+|(<6|8j+htLo8@
z3%)ZY>)x9G>gqm)10pj*^0RCBj^7Yvi+r>%IALB<ZEyQQ%b-JlgBh+S6!H4<20qQ}
zv~YeEG=0wB!@bL0!-Lkl3v=4|_6T2|rl2Y_Rh;c`#Q&ei4J#k3csXA=aP|A62j}`9
zS6t{1WA4?Q&|f!MG5*En$#!QGMc?^J%r)!`;$f&-YSFXFW8QYAR~mo2e$D!n)5^KN
z;1LJk91F_{Vxj_<Z}xwSvt{e{zF7a)f3c068?V|5Ir|eGVLBguG?yh*FJ<$Wvv*lK
z_sGp>uM10FpI`L#k>HG)RSR6__CJ2Z)2&b}7XGSt#kpOXf0X{Fur*6h5b)jdVeQ5B
zlRmv%AtQZYOVqchdpn%BzH0U|6Bqlj^+b)o#D<eU*(N>v8|STYQvU0l<9{3+6*6bO
z%5m_JG|Il&STMy~Sl|=Wso2^{a#3}kR%htNINe{o+FyI4omE%Re~q+)S2Eva3bLI{
z&Y#j;v5@nBm}upC&MC@E<(nq+*-W0W=v}O4-(){=PVF0Oi|X}f`F~G}iti~*wmr5r
zZO+=*-dCTNX4w7sZLxscJ+Sr0{0{wZe2f3SNH>hyCA{3jC-rNQN!%Yjuf={o?2{b?
z9)I{$9T*YYyEIV$R)0NT^{1M~lN?X>aL(P|wMMXZ^}c;w5%2$gs_UO}!^-8tZksf|
z1&mX54(grxe<=9TQhr8%RRx!+4P`Hjk5=CQ7Jcog&#ooAm;@S(ZMr{QY>s$ZBL4AO
zcjT(652`9O9S^ZuU6}c`-14qk(_5{(k2&+JSEl->xd=M+u5YW8{}|ht+*OcSc%d_E
zdvp9osl#US9km=XsRcLujuh~)xs|Fd<!gHV`}?9R)?JT|^;+!vclQO)h0GQAqqa&-
z-&lS0?(&aGnY`EQl)I|WFA9)8cvrzGhoMg1^^)V?j1TLlR!)1zKO<b2?em?}y7Sw=
zXF7*9c)y(6Q1Es_MS%1Tn{WU0KEL>oX`GSk$CLjt>YmNH4V`@adsk}CpQP4P(J;R&
zH8G4$@m1K~#XTB78-$oY*D(g(WQd=As8!gKfk`JYByu@J6+_^(PQz1|>w0Eu7nVIe
zt1(Au=I#BxQrAiX-}@U>>M7gozpc;LW)%GP?eRn3>PoVwE8cU`c~m?1VTX>*Zt>Hx
zD(fTq+O^FefBF>GV|`qq<EP>BlQ;9`@KtZ@nRj%R%GK2y+xAXUR@kJyUWsc1cenh^
zQqeXMc`JUSD7NG_{=Hl6ievP8H}9+An{l-DzIe3TgcjBMl*KR9o(boRJWw-OetO1h
zuZb@oe0{PtrDIcYqsRT5;lEaviG1Alr^?DNeUrRyPx{R6s)W^E%#SXxH#|BxIbz{&
zuioD*9n-!~tY?>tlKg7P`ZIm9V%+`B5#e{sU$m!heaL1X-e=c&_}^BGm|Go2a<hWA
zHRozR^3B`(gXM1T@}>W6^1a$RrmmjK)EV?7`SkH~`)!}gggfqd^;#+LPwb<01-_wk
zKV-?<ed(Ge_(W8^MxlO3TZ&Hd6yc>0Q))l49TD*O`c5W1{-rAK3I6wIzkd2zbJ?e8
z!UT7Xo&(Cck8e18yfonpw2n4j*0kzU<PR?GpD$#}IZW>8nH#?>67@7X7I3SUZ*pTw
z&j+sFV6pS_Tqd4(yy9Rt@x(Rji%kOetXbG%qn}@Xy!#XbpK>Cf!z%{g`jsYLTCUQI
z*(!H>isUxCRM@Rkamtbpc^+qde6no)-;X7)q&XiYJkk|xZFk)#^zrA4X$?1<{yt&3
z>iSM6M&_`gZT*=ia|H6NYej^%doV;hwm7RE7kE&VC}FL={qgs&ODnn$<h#j~9QbTJ
zPn^-Nv`|kdnZ@Wm^W^K(y8c=`u5MW$qjt9_M&mfAd5qXZ0k`d2d!p<Vwr;jQ5SLN!
z@Xk<cH^bq#2gT9_UUR(&Kk>p!&_$`1vB~sQ^o<#u`_qjdv~iy;-dVNVyvb7G-0rLQ
z!aEA}LdDgM-X9LGpP<kwanJR##!1U^?Z01i|F2PO+ZN9Fypl8M@ahQybv%68KEl?s
zFX_%$E}?V3BQbmKfz4vEF>jy7>DO6U^&NfuJMd6>?6C{4bN1M@9SP8XU3PCB&*jp)
zxf25zcOJTTfHi-@f2B1o5feC<S!snNuMX^8y>#=7!rV=p1VxSbWRK<9{I;3quI?dq
z{(#Olz2ZEl6ZxU0TOwr^>P~2URx|b7@59Aj{aNqQBsrgyhwe34`K?9s;g>(1>*Xwt
z=c{yx7iVRaurn;%=sl?^Mq?V^vWwNF%u=(IcK4hxOOwbqGH7F*`Yfts`Z|HB=D`ob
z4l2L;xKf}xXO3-$T~P4xypjheghK+mLSJYfoKiJa!Y5{iL!V6c=jCy;cf~tre^5We
z+sEH<)#QXxOQt}*K;99ljc5LCkl%e{!L3VPCgyp9BLCI8+^V)1Kbt!*ktcNhtJ53%
zHqPHE<z;@Ze#IpJEnACiG!s|ZC1yE^+)Yt0ER++UUw$QA=*gm#Int^Vw8Bq`3VD4$
zcd%T2D$5*>A6&-^f(7^59(JDXwE2{iY1iuQj~(~Q^6pvrtwiGN;pZ>D%(Zy=eS%6%
z`U1xPhAfWHX1Y96oNVuK-!sJWg4&`f5rX>9=Q>E}Yc_6j-zBe7buOj9QkOYg(tBmt
z&))8o$?i*dtCwH2OtD*kzxU*)s54Sadfe_>Jg%D0`84XlkA+_ORcXo%CZ&^v=Ou0k
z_t2JK?``pRUh-^d9i@$r0+}jfckJ^F+UGXGW$zajN6`}-p5B?zVffzX$%&omb8J#J
zoqirOap?ta=eFk`3qNPcY&TEZwnIWS=;icteT%p6<~I7)Iq&PW2TCQ;!ApJT&-yMT
ztSuq@areCLmhZ|;DlM0^7NrQxURQqaiObRmc9)l5x@2C-gh{v`nHh0~YmUPYt$R1m
znys9FF7D0tu%v}sMdv>Mejr9NzxQ*Wqk7-ONmKs3+Ee{Sd19)_T(M5Y$*&mp-f3~a
zaaALjV=0TJdFQ91-%^e;_ig$-&L#J}iD8>9JLmtoMve#dMjv!{Eaa2-@%X~4H+icn
zZxPo)ue-rP()^2VRL**r%Y1@+-p`V29{>Iet@|qXJ+s&?=JMaS$t_P!^1PqV-N4rx
zw1LlXPRzY0VUj7#S7vzloV3=fJN8%V$@bNMT|C|%Or2NT)Ohdd%yNtMvkSvk9Y6NK
zz{=hI<HZ@DZFZkK@!KG!NT%YP#mdguNEWr!^-PUbU;b7^sI$#HCYsY`Feh7l;uPgM
z`KBE{i8~f-@d)XhWW2NZ<F_7#&+JbbT;q~Dc+~TE{|K-;*l#lLeBlC#Q@!fOo2r*+
zXt^9!mktl~)K7YPGe4=P=;{Ne`a|y|-lsRLnmysd>IJ)2F)Y9MebdJih9Lr#-98S>
zPF(RbTUP#%vv~hb<sd-;uX5AV3xphs?xiid{MglMsz<F|-Rl`IHhG5}e1C9bRf?%x
zw8WgFL334EC#{_NQ6Wp>yXH3kGy!4WU#mXm%q&c8XS{KJ8P5-n#TGx7sV!8Q;WBZi
zkL1cwo9X8K9}_b^PhO_EWFE&g;}21bc6{Hn=;w^<d)N1^nC0iF?Y?%qc<(#UDT?RT
zbl1Q42~t_}j{WA1sZSp%%$hSfp!Un=hEs-87kxQW1ePtC_A<Qr7L%ZN!ItNjp6m?I
zywrAQ9gooUXB!GQXK;O#x;I_3w|0r+vrCsR?aPQ+|B&l-Uv<8;^8I#=*?-?=tjjyH
z<7=Le++Ukjiw$4#st9e~ve1FIf5}3LWa*>9X4}d$t_N%tpHaa!=eaKPi<qiOzaCZk
zHkAcEQj7UKSFnS9$)*F`6-sR#&x#k`o?dsdO}Nu+smHs>h2Qg5@*a>d|MKaIsu|Cc
z$rj0;+n87DF1|Izp|QYbXD$DOO&^U+m)eyz$@9Nbu=~8_iQ7z9**~1C9&y*y{x;yN
zY?BHyvwQYO{czNyYqIBTAIR;DHeJf~`oeL(te53?md92xHrh#rL`tqnJhJos&C4lg
z<TtQ=k-wFH?BCS)ZV%t_CvPZe&atp%d}4R$?GB}D({6HfxZf8#rRH4ef6ryI{PT?9
z)SY&Vmz=P<8T?@_d*9;cn|Q8gWaKJU^}T-M^6#^#x^Q5C^NR&bif6A`%fqqD>NtDg
zDse&QzCcm8-BOufH}OnhexoG#fAXp;yMyjm#fDyKtMI!$<M3x8_2{F@bI(^=8b`l<
zTsdL36hmfsh`&(4)XlbTyvn)3=N9groT8O0^i#|6UBiPH8xCY~UAkLu<?uGHOLs})
zF)Q!;h11O!JA0*XsMgnFY0q_?{Y>Ul<r-CK$3>Gq<{YZN_pD-fhuz!tKkVIdcdgO+
z^0b!0C^Y3ma%1DmHW%J~{|wKD+RvRND0$L2>~Glj?S=7%7anW9V#()Bn7yNZmGn~2
zJfV$B5gVQwwVxBzoV1lOci!h&nss}nuD0w751hW+^;_D^5bL=%55J3?EBwPP_Hgck
z)iwTxC%!9o9Gk&lD_9}8Xs*$H(PI_z`~Q5eh&iU6A1+>ab+_TYzcyw9IpW*cj<l$+
z)&BVBQ*T7J-f`6qqcqQ?uHM4Es+!rqO7n~wSPHLRYI(!-_cX)$ta)dj*>=bFon141
z{^g5m>};mCYCcgSRZsYo#s3{#*6o$b;koPH)!P@9Pe&=<%9F88+2Um*9i+*0VfB(d
zrQz*Tfogi+?c7T_*0_Zwam0u-)!MB(5*^C>i6=C~_uUenpRC8tCnR0HDZWC!^NF!F
z^QTao|4c{jGk=u&%ddD&dEM(tlM2#p#3%2VP;i*hVCJFnnGgRvOuffiY5p=i{gJ5=
z%dvm#i#_+`wZ!QjnSA$cgfp|qy8UA8y=ODz<z2T&IREvX#5L`Q*H)h7%iXtKx7=Uw
z|IX{rHB$GOqxkxm9Q924D)!YdpA3k3vPA5T#{4vs^H$F;U7sa0ao1rpkz-3twZ2;H
z`nWg3!F281H%AYB6kn)iyR7^As>4TIxi%i#qI=*^enPN;v}a1}Z!=Bx^qnWZ?v>L1
zEZ}*yO!Vu5>&w@Dy-_XKQ<&bE*k0@|5b<vR@sE63AB*esjW%+*{hCs!b3VdJ%H@x0
zpSDEWD(0jf7k)|SMI9&33*N3juXX3|KZ|>keUI7Rohx6Je5csPJmhM*)bRt+DktV1
zRqb;0>HRwMgw!^N*)yt_c<nW~moRtc!^`d~CkAA(-Il3-c{}-Z&zh{p&5PeiZOK03
zcV>Z4`wQ>4?_%}0pRql=>*=gDHy4OAt+~o>-_2ym-Xo>{qK{Qi@4!0eE|D{dbDOq^
z313*i-J#|Adtu>S<>`tSgwl9)?k%pp;Jj(+NyD4xC(Nr(Rxa+_`E5H-*|DRt7Pt4D
z5w!}-75%y0Q(jcHaa!u4lHkC(M_VJ->M18W+r`ds*~*lpc&E1G({+I#^PM(G`g~p+
zrMj-ae<e@k(zLG7llLNRl6UTK)IH?2P+XQ{zT@=Dj$K>Mt!}B>W~m;!_SLVX3oriU
zvaL1Ku3wXs@Ki$Y=^X9IcApTg-FAv>n^qP$-($ED=CS&pjL(UhMZx}h_j`-J>u@z+
zPLQ<b`?%?p^z}*0FWT4meB`pcB9%3PQ?BvIo#svTSEs-7`nve}!XLBBPxbD*q?ltR
zyK3=$ryc(%pU<~^U$yVaE*|B*tVvUHu0A$=9;dMOx?|6orEd+q4BD+*6pX$5rtqwr
z%Q(4g!8uuOpZ9!q&*vxk_bGh%Z>DoJUEtaAo=sbJimsoSfBViq4LPOc>5}zpr>L5$
zcAjhWYYo-SY7*I9;CFcKmlw6VM!`#us?C3K_0%l3X_L<TAFI2wSkI4JN5@6}aH-~`
zIrcM79AGJlJ$i4)&ZAOnp0?NaT5C^V+!mtqrhd|$V~@2${jcBix*3$^x+0~<T*}|x
z$;WSzU*D3B^ZLhki0L}|JUktE-_3Wf(K_MVUK1_moUffN^WNa%{+Hp8@)cTS_W19=
z-mrZYuZGzS7VXkCCVT-YuL~a8w{O^P@Wuax<=^N#_tF)<TTNauUH`Gbn#r5&yN^$P
zuE21}LGPl{nrBDm8SQ^>boF(@vc|Yy*B2+%n8bGdxALqJJ8*B|l4Y}=E#ys+JD{Wd
zy5UKX!o;F!VP0!k1FDv^vlu5$Z=F_g?AXgIMok4Xc1)cwCi7(Cl9@5BO4}v99!~h$
z6?|>o+KWO<uR7|BeY5M5d*|IRk-7AiD&N5!va;@Ti{@Qiy8Us<>$ed%e@`)*=e+2X
zPVRpe7h4rGg9`1-8wIx~OYX3J`e*GY1;dVw%|Rc9->|VdbnM#|aeanqzmu-#B~7cn
zr`Z>55En|8x$pdczw7*5tI(}~trOyB$uypr8nG&7(W)h)dp~ZzA#d*~ck8vnGFGwu
z41xdUj@)$-z5nRWeg^0NWkKD4m%D$wpQn5D#WViLQ)X?P?LL3gmKdMH{(CoLn}Xj)
z$uFC<b8fqZu7kzh>|`y@_jg?OeGAA83`+U&C-~R<`X7J)7e0M1zu{QtG<PPijxB-P
z4ISD!qMEb6te7RWb^TGvBN0_)_B&4~UwU42s4%lLqHXED+4+kPT}y5dw256DwWL^R
zsyhE-f34J}e`_CCUX(T6|El(JkI$016ApO&&`Um*JME;$Lh;L9e~R`9+&$zJ!#=@q
z)rnJ%$x@Mv4hPn|$#vd$6F5A<_xHlYtA~pMeZ_wY)yn!>pIPa=tzl{0x$6ywpPF5s
zu!{Tbo!l88jPBdB_Eq;3Pq(=pFSJ}{Q`b-P_SjQl2mM*2In=b1-O_81GU#8GvEa8`
zmbs<2@2=4thWbhF{XvUfI%FzO)}1Oeb?FQ{tIoysKjY7ZiapPXn_Q(7Idv)5&G|`d
zxHICHHVe%aVr49|J+L?S-cIr5bMM~R{dxID&sV$r1fwHLJGiuE9!45}yeQ;x<Ux1@
zgV1rUPQENJ6<wuYeW`sXyBwPL^M*{xoRaQx*zM+Tffg=ZHTRNU_wU<REYuayd~|km
z*PpOL-q4FIb*0}6|5yub<z~Ly;$YrbI@58Q#2@Pl&*PhuRh|j(<q6)2?OOWD>Zi$s
zM(^MCin9Mj3;qZ%DPzrlRe$vCKMsq$$<Kav|1$aaJx}xB^0|J0__IZKNLO>`gzvaM
z!!uNy?eEH4g{gtRS5$49nL5qUW<A&CWi$4~Jd7-4$O^I!kNkW;xP4c8(A77&6BnE`
znse0bs#Hkxl$AFmHXI5+((!%U{FZ}nRaLSXGb1WK-CiRtSpRda#m;}ST>KAIT=s1J
zuXtx=H+$nrP0qA=LV<hiWlV$&O`7<5)OKE9@XB(|4kpRz5%>0bI^LC4`^>;l`>k*m
z*E6Z4(5`L;Cux?=4<^JNHz@yEbEqe4j&@M&PA<;yo!|LBTOHV7FZJHwoK?(Tj!7)F
z@||;z^(Q_wO{n2;{>QT9zwU=W5=Z{eFu9;!QThK_%NnzrC)hksBwzUw8WSV<TTxS5
zcA9xd?4%YoCCU3|y&E26btZcA^k<pO-^SK6bNy85uO+9a+pDzg^7U`oWLopi$tG&I
zXR2l1(}&LsH?eKnD4We<pxd;6$N%j+I2J?%T|T#NpZ~&W+gs=59~@igyxV$((x0*~
z|D;Z@IwoEf_(<V*+w7Se4z65v#I!)U?63ayCDSz@eTx&WzFwHyy`yNqtN7|Hom|`5
zn@+U+p5^dN(pIZ;GvmZtORi0S7Wm`w#l#wed&$yF`^1AdPc~$WWZ#&=_BrOjjroBO
zBNm>YUGS;CvBh3i<gvKIJN*}5&ui_SBJ)?f;}iFrTUs0Tg*7HRt_n79UJ#<eYc%Kh
zy89~*Z8^SbbGPsN)9U*tS?#PieDraThLU70pL^W>zdG~Q-|KpQ_V&g1{2qbVgHJx|
zSk&0v_VUZC?@33tK6ST0%G)N9aOqK_>Z|2Z0?re*2-ck``!-Rp`JmLRqZ*OzPPdho
zi&}(j&wprGS;t@cH9D*8e_l}U{e_Q1W0xKBooyf#v^L7bHqO=6)ZviQ<7=A2PiHf|
zJ$foC<kyau2VzuD#ih+zIZ3tIXT{Z7Ul*}oK9knGCGV4eV6dL(AJNF;t}1Ih1&^{B
z95UN+c<B$p$7-{u3e43t>_~Zdztv-vWN2~JgrsL)TYFN4`FA~0OEF#Z`%m7oKiOK{
z#gUIW<^ANu_;muRcZbCH_0N6sZ*s(*Z&iCX2yJLzYmmcgIrr@LgFLUYf2WItC`aDl
zd)$$`qjsT(0PA*+HGA@3xy0{n{B_~5Rb%iMzmjJA!(}hn@|85xO6Jb^U-t5~a>t8f
zGwqWXU0J%s^M!!N46lWaE;^1s)OOA0nC;^vdqg>!W!?>qjvY;BXY`#fV9<zb?znq0
z@(r&h@2q!6P2ZfUcWT+^ci(HZ(*MO?=6cR&96uYq{O`1<_*(CGKDCe1ZaRkVjqlWl
zEBXHCcrEZT{LooF{)U&aK@O{QWCf%B1p18^B|O;qEKcfk*L@#>c|LRWjTDlmJNAoB
zdo0_uXNJrX#Z}2m53Q2(oFSQ&$#(A)w}|OxzD*v!S6c*RH@BZVV^<}1t0h&}`YeN=
z|EVR5&u$j-ssCH8YHphHb$$MIwvSCGCC|S8|G!+~hMl>#WqrH%A7ind^OQxk1s2BM
zO3~bLbcyC$nfJkG`*bz*)lE0EKiYm=g=OX^O`#3_UEDS+v?I3KAGeD=SRB>V@jlGK
zz(*-b=JyKwp2=5d8|E(Fpjj*%q_w%gNov9y=jpGemaY1uUhwqK*PYthx7M~K{y35%
zlsz-STDizgL^76hqJ!Iu>>8h&^~#P$NgoU*zirt3_}bQp1tKY5kFH--{?fNe<4f{;
z3$^R}jy{um6l0^%qSCkij+5g-!}E52-A`Q?1Z{uyNK#;1ps$qK&RcJcEIfSIJ1>fO
zxcuDI3a`FwDYoeCkxHgb`&%wvm#v@m?)d%X{Z@D0eff1+c}~aO6!BdObFWI+wA-pR
zzHPD$+sa>aKjDJCa$W@MN2QAHkfUsWfB7f9IK<U$dfYQr=t9}AyA^+qwtr-tca!<5
zVAgu3$Gm3+4BSKeivvF8JMv7-4t~X3z-=M6)6rl25=UO`i7t7Sj>_%fLM}-u9h-RE
z=k|YGCYAiiZ<StKHe>CsBF(-Ji<rvGcsVsc2C$xAeRQ2V_p+s36I&ev#f}=qHkj>Q
z5GR_DxzK%i?FEtO9TRR(7jhBUvE<Q<YG%`fTW2_b+~GX-QqgRwtNpcrjRsr?mu)=j
zely1T`~L}c_cSLdHgKM)+so$jTH*H2waq82?t5j4dIriaNRjjpeP!i&r1+Vgf`aY4
zZ;1^~f3{rj+n>&T%=p-Uf5nPgla6_d{NvUB>GDU3<aHk0vsJRHH-tHDrEs7AGQUri
z&sPeUy1EI>J3qUfiKpgC@r7>zWvqq9?-zee*%oM5D{?wSRBv^=|F*+P#jD*KR9^~B
zzm~2Vs4&acv)x3vUFea>0dJ3azAV`xXH9PVsQ<V)t>T|`X|Dga!=6(WCfP}cEi`8n
zW||%Gr$gP#r%txwpX$bA(kpDk-cB@9%4o7$Si!J;`NoNQGY@3V6x@4)!E|1*P{-d%
zD%>-B6t46~e)=Q1@wk~tRYc~o&@Bh*o4x<o-E7d^P|m5gDL(X-?wxp5*Q=|is5kq{
zd;M7D@=%Ut!u|a|b0vyz9+{-8%yHt(tP>}8goX3XS$4&!Q1PjDO74S}JyZSXFOR!Z
zVx+8BxuZnXpY1)z<9MsuGoF^pyRC0unf!IOQi$4;i^lhMFitxAe8+<1_ew7~56-B%
zeo`w?$m98eEzRd&|4Z^KSa|Z&p|k&GI*o7r=hJ%;+EM5vAJ%EZYIwe2;@qp^GW7?I
zSG6Ah`KFk`a=Tve1@?u0Nypk(D0WU-5x)M|e4S~J?bGj{+`VG2SVtt=%I%7$G#^Jx
z?dE$JZ_u8)V<&^n_rhM^u36KAH@R*(Y?r{d=(ks1{<*}H7gU8`8DDy$aCSqahm8A*
zTWp0J!g;Q(bMNmpHsvu(-0a6)ZN5%`UuNmwhF0(Gi#u;wsl~mB*(IF4wl|{U594bU
z1?G3&#w8t<#-)#{T2(Fk-tVZ2TXgQ3Uu>gaS(~(t_C}XozOifm=N~-s+UK9%@uD5O
z?&oIgXO^^2OnehRdGEfXpOu_9#6RD8edqBxQy*J}hfe-!xOV}+f|6z1jx%@u8%I?3
zz8Cx)r4(FSTiLj#LN_m|(VYE!L6O+x$A+y8%ch6;I!!+=r7`JDSds77r<KPqE#v49
znk^?Vq4M+3HLqHlnSLr*Ivrk;l_|BC(XdC<J$n7-2QGf~?+baZX)?y%>Jq#j*~=FE
z!<nU>`_0pc-TxKmorx~=iCnfaN0w>w1kPxO6<SwVx5$;VZrsgs&Hvz&8TWN11k4)s
z6n+W0|9-q`VO!Ag0}oEgOq}|TRprI+oLu9}S^MpDFaEisnD<k>V)y;jXH})=PXFsU
z_Vkwa7v&@uh6}1}8^qqkHrf83q`2<FajQw$`)B;qkhAN3cT4(Wmj3Zq2aTVZtE@PC
zD*Nr_=O*ftqS|&gCYJMXyX72OAXV%<;rh|fji1xv4(aG@dvx-V6Hna%=8n6b+h;dP
zT)&>aLZkDcMD~^4+rG~~D!KC8<geLJwus%SVpV)~F?*BooO^6rS-o6WZ*-g$d(L)p
z>dzhB<#+Zly$<;3*uE}%&7_W!OJSyFD?WZ@W&E9~ykd{@ehC9+XU6{-0p6>;BCFQS
zKfgoTCyPJtTUA`f+VC=7f1l<Y&KKK1EZWDLxW4hv_f^U<&kD8lcQwume7;&Lzi@w<
zN9oRE75T;gQ&k@8-T$|*e^yEMcU~=fjmu4)AH)jt>}ISLye^;<r1XjD>#FbRD=)qG
zn0sUTPTkP#Y4>LtD?aCyYQ35E%0<)aLFHX()26j|(pdkC@Y&z0vA?#mI9H~QOG&Wc
zipMmD2Wn;NrW<*s-d)yye|&|T+T=T-lX*>3vx={>-_3r1#BSwFEuoF4CbL}mSo3(U
zgx=)8sts9p{wuUqsID$}m(nV`JtzEf;e~x6Ve4GJ-c0}T=S`mawuzT@mWlmbw(@CE
z=&fm28yR%h-uDe{pBYs#Ir;adyDGWs%adyxI;Iwv%9y#TowzV{TWp(y&_$odV-fAC
zyh(f7W=+csNnf|pq+%UsPyWQsvwQs?ZP_7|zkT+b<M)rhoS`QDLgvj^-J%Gu)+mRa
zJ7!n~GON7r{#;r7bqmYq8CD0mR6@h-RGV`DvGn~o{rE*rOyXgcdnZ4iPYM!`F3^da
zcKevu4fbcEbF-AEmDzQ_dZ_oRyX4PRd4XmIkM>FOSFTU+HRe{|Z5XrLS>a|^-tyCJ
z=kj=NI^A8inv?H<U8)neNR<AD;>;}_S7LX1i!G3ydN_GeX!kWKg+n@ezoZwO<;}eE
z)G5{DWuc+(O3!`&Wlrw8toCzDqv*b=EUI@tXH{e_s}hX#(souc&Dgm*Ib!Ea+g;0q
zuI9ggzgXALWAk<Y^2NKVbZc%NV(NVB98<S<k4EU^&x^Cy<xY5!d0w&BqAV!$OU`_=
z`d>5d8+9Ic@y^Wmo>`MyW$HTHVV(26=P8M;Cl{SQ!L~`y*?GOtmtGIqIqU8#gkI|Z
zbWhJ?uh4Ss>x+GERkc~IniMoss9B_f|76K?$C7n>J?}U!eRR{4r>xF>)zjP@Myr`s
zYvr^fkIwa<AfeK@X<_n=M;Sk(LQZP<m(4#idGFgBIg|c1RL|d>v$`<+XvE2d5AzJ(
zKJVD|DF04E;+(+$+b4+Zbyht+^_af~>!gnRPxoZGx~zO8xA2!-;KwAxqaAi<SYn)n
zN@ML8t^fX@r1RsPk0}h=VRg1~J+m|VUbEl+nDV(y<lYa#Aj{sllP^cy{VTg_Ufqd}
zfi+xPD!MGhs(gf$b)Oq`_sBdl$$swgF#N^rrG9xu(;o$?->U2VE2J*H{^*Z){SVrl
zEq*-S^7qGwbNxYauY^wIZnUz9&O6pKX};(+8?kMHg$}hxW}UcqY-vQ=^w(??gLyN~
ziFtkq6frn9{Y~_%^W3SkJTBk5D0g~g0f&s0LaJdzbn5P#noCW8U))*OzC?AZ;+~@m
zowAyit~U|1Jg*Y_?3+<$n)0Kc^6w`;n(*56j`R(V+1Fk7y_udm;jGf(GcmVWerDfU
zernQ<?HkO08Ekv+tP-1NyPP#-$@1P6`@&yN2w3a3`1_ozPC5!-qxY&sZk?JI^D4mP
z+_g5%;+YD*UiW>kEHHEKJbOp9dOFL_mKP$aLOHKe=Jso?z4L5|s)l<=l1Y2OZ_eNQ
zZks>K`I=QC_D|(j|35n^9j{Wugsv|)#a0THS?g}#*t&z?aEaQg6H)hC4;EdSz`(iW
z+<N|t&)3Lp6T2zwv?}q#n@E%0{VQi4b?TBVxNcD?^4i^lJ@DV5bopa%wr;ODdQ4Pp
z$MH=Y9)Gf_ihXeP@~(a*&ybl;C-0o~;k8su7Jcu{?HJ%H(s3vEoVG68bg7)qogK9X
zXY;T9<a*_1I%9e67G<x6^QQgU-(`|<`<O?{`zdEvgcOIH=_hk<59p1Vpgck0K2zeH
zEpGLl0x_p1ImP_<I^8jOxt|J0groGw!&R45CpD<2aGZa!VbgbwTh{yg9rtp6x_$A_
zo8}EimKW~mZG68WeuAg7O5=<v*-tiISl@5o_f@~{q?<&5dwp<&$T2&~`*q2tT5l?3
z<MvAS8@@RHHhRzICqX??*&<2nKOJh|U%c&iqEa67S2Jhx?|S<uhpe31wr>He>HG=a
z(>XV~eJWa@T{OvC>E-$tY}&GNx2NcIYD`o~Et_+c#jCX@@%}vV!d-XkykpM47O7Zs
zYD@CzX=yhsw4>dgoTzz!dWP*p;hI<COP{Vt@Q?X>W#-wvIuCdLczE&3oaUZ~S<mL!
zKTVb5e<3^LhINqh^vc%<8zwPLsB>y`N=`I)>ovP4>gm!`BdPgf`}Gedc8_BfR6;ra
zE%W7Y7VTp43|G0g>&l@`R%Z(tt%DD0-=5&%@i4F1l#?TAivGhLs;N`NCvH0R?KsN<
z_lx<l{)`8;CY3sIxjXA7eM!i9U8TY25-imlYBKBBf3x@g*LS)ee*djmH)LX`U5dp^
z-pvfhV)7@)+BJ8dasAnIzwhZjq2HyU=O?Q4<xVY~tM~0{%VGtY0QQ;_|GrC}zP0+i
zyqnGMDds^NqU;UzC$xE;U;emf9j9Gr&a}5}f|ur=OT8x(ur4Zj;&Xvh@{K>tUaj8#
zE3HJ+WZeS0SrS`{o)?~3al>NQw>+aSQy-@rDmz&3_`CRp&bCDt6KA%bTlHkOnPyBG
zXE{$o?>pg}rYpBwv88M;oEr7u`HP4vyxC%hZ)v@LFI`ym-2a1_!-BsW`*s{WZS&&S
zK1&_mod>6C9et<L&vx79qF7eavC5BWPG9VfSs#@yR@y0-G(9iUj`d<1S54&^kBQ6P
zHvUK#c**rV_O|`J`O_!s3K~sKuH!LRd#fq=VA=b+f3qWUw<LXj_IeM0o36x-L@$Pj
zU&kI_^62XM(rCc2?8=S#OcVCcJhZX(=6Op;o0aE+dwjirFPr`NpT@NLwKMK5TKqk`
zePw>xDl<R6g30+ugWgBZNL)ErHgIFd>RtOMhfMn`+IBaj-DI;6f32=GPoZ>m_Vs|t
zFWwo)J>U3wb;=I!sbM1i--9EwWS4CFw(@C`jcQP3_}v$OUmm_O$;;Dy=Ia&VOWhYw
zIq`JYk$>~<&b_N&=(B%DXkJ4?uG_scTp8JSW-ofIptW_TpXJ^~oUgpij&HsE<?NxW
zYCXZ*Zp{}+ocw)_h~GvQ@09S3^Yea+9X7t!7qeK<OwzsIVEqmMtU|t)4Rx&weDm%m
z?A78|*8II<wy58%j4z?p$JAW!DTFAA+ONt}o4)<P1J@!uQ=Z~xhI}rYeXJ+$EnhL4
zY2wbchu!|_tvYvh-rCL2uas|mRq_11W|rK987li*AEpSJxveq#7WUpvc&f(g=#<3F
zXS&y}^YWI)>#m!8I_FeNm;cwr{S#MjwXX1AB^lbc?Z^zZyXT9)?zH_-{xK~rdTZJ$
z<@48mZE7*e?^qtRagF*^^^ZLUS2U;WXj*KlwEgRoEv|y!vexJd1ST-YzLwv%PRK`Y
z1K+V}Y}<a$4JuzCtTe~$ZI{LQ*~cXvH&u2X{ZhAL3HOPjrKdQU7S+03Kihjvp7n@C
zaP`yKRkyC}5ZnDGE@^Yh{1dys{@GWh|8?>a#a?d5h--5fp4(Lsz4mT<;PK1}cc;z!
zrz9m&5j4fnvU1Y5CDH8`N9ttacb!{3>sHRvw67C3{r44~z5IKy+5*mLreCB=gKt{?
z@H_J>(bmBD#Ljc(@k@L!re&z-?mT#PMOJc;^`||-zu3NoFu5*l-q_0dcZp)fwK|ul
zTC75kRyBF;`}t-2#=Sq?Y<7HIyrWTS{wJoncct@PCtq6eX}SCn&DqtrRqTSj<QiHd
znPOVz#!DVurgN!AFtYrwUNqN=cZW}FEmn?J<&u*4BJnJ$?1R<mmC^YdN~&eHihmbo
z+?Bn3vfz3-+g{C?7fpQZg3d8{^k}!J-ZOhr5u7BXy1eR3!<IG~_UT5)l+NA%^r8IC
z-<Kbawzg&nZr2G|av}0|m*%^I?Dw8m_~eDe6*X^&cE_6RtWiBTO=6v)2an~2XB%I6
z-qrmyRma|I(xnB@r(E|}UH7!EGw4XK?W&v&TW9WxoPQ};<!MA`yTG-oxpCF@yDIv5
zO`Js?%&OEk)_+hcn|3Yv+MSNjO_J?XxX#{SsIL59e7VxW>-oPk`-EzK@*h0QF-fmT
zc(c@Gl{Z_beO%&^Zu6sZ6MN~M`-dcw{d+IH`LumeXIJDCU0bEH9VK(cL-dZES{%RR
z-llagtmG$18u7p3Or5hN{+G6Sg(FW=PwtFF_p}|iCvE6_pUaaFTPUu-Zr^u-T0fqH
z>17;uU#{Q&bFGDv^M*T>ewBgpOA>Q-#`~Y>)G}NaIwxY@GLOl=4^n1^pDsEhk)0e;
z%{JTXU-*0RG=Z~r(=TUle|(Q=(qF^qor=GO{Mu%I&^)OhA9k79Ty@Jak^Ew&91h0S
zUzRxT+M6-)b@n7Xtph&J+gh*3|1mpVxB6G$d3|%yd^dqmZI#)E0gpQ#8Cn!~DcaS&
zZ9f@2!=UiPp=EVy_g}gcKW|<#Q77jGgUej={i2L<FHg+5@iRc-;-WW_`*u18&y~6U
z@>l4)(@PdJh+C~&Algyj`y_JVKi1VH*(%@GgcLHL7l{sAb|azWfHzx~uEc|&D-$O%
zonBcqF=oA@`3cj%6MxNao>1?pqUvd9cz#LxvR=csmkZA2#Ch|k_->raa(l@Q&+`K5
zdsoCAYIwY1!@hZ|u1W6t@*;f7@wnc}Q+3}hJ@VzIf9JF5i?;2Mv%agS&$(A9f5O#_
ziEAyIFS<{^*ZXaA{9?I)%>qZCc6R$-S8aC5D7`4L=R}#FV)TLNR}XEke4OVa^GoTJ
zne3S=>keI+8z~37%y;~Z@!Ht%*+en*pLXwkUEwB$qYoK{TNPMlr>=5x>0j^ZwQF8`
zub|EMd91g0%~5dWPv_cXn0it5Z~T!TzrA=`rq(?yPFS_`jC-)vmnHiSiOkvVpL$}q
z%8b0v*=vqlw5{9sZuz-0N6nJ=I*SIgzSHc9QaZfbQ76WkB`7L*F7v6bJz)hlmae_~
zg{K~U@7im+n3JVqHcyo#Q<;1B#iJ}e;wwB8`scrYtL3!kiS8a3f#c^n4xMMJ+iXy3
zb}zx&xOz*!+{Z<y-F;fwmM;nab2f5)(ckKid+vE@PFQ_I@B{0mxJi9KS<(y29hE-+
zPWWjSbLt73fb*}*rFj*1cPwf=d-=*Ttr9`&o|{K_w_n|m`BJyIBHdI=W3sELe&(7S
z2UXRBbLO4sP;9hWUA6gX+g={yC5t$B*?+Iu@vdfzmsMBjw>?unm>l23;yCZ=-A0ec
zb9V1cbX)3@S|F6|UoWRV`~9)Yz1ABKSVw!QxU2iD`}kn-jC<7*ORw+uPE~m|v%jS#
z(yHb3G(nfCt;-D}_RaQkm@fZcN%73g#>EoCozo1nwgt{@lH$3k8}#Mw<J_$I2Hzwi
z4sTJBNm4${Tl*qWQS!ir{l9b<<<Dtd9&+1g-tEJm(p~oCt!xWtI=ME@%lLgqLf@^`
zOSQCGLU&tv?mfKr`U<Nf`}X{plY2euo8@wg5~pPoxU5(4M62@YtkORCvZ}l3dF?Uj
zb@i)1ZPC1?5UsTT7Q>qmzkMB6>)9&%rr(I(J8?z{SAn0gu5Up|g5IuIhuilr@!@>*
zs8#Oj{RYpoOBQEMd^Y*`{!=sbD;M^?@7aIrk8IHAsn493vg}^S^P?m+_$tTq>g@MN
z?!EnfWBK1*lC~kDnFdLHrv%qeYHjYi!Tx%>%c5Az+a?nZPLOFVDc!cOH(JNgF3qt!
zOOt2Ekq?r>)itW?&UPx!h-0qTjMgguEfpR;lly9%xaMKruuadC=EwSOPq9y6i~q2)
zx1uk5ZC<?E-}h659~V54aQo-gV|q;JSly&6QWGX^4z@P=F27vr>E*Alcf6OrSyvk7
zw7FH&=;n#Pg0+F{f~q0cA5Jx2+$Fv%>+ENS^tMF@&929+-`;dgZQY#jr*$VMo@aU^
zq9V1!SNerzoSbo5LFW~vrS~pRRem5nQO)BhpN*xm-G%$+37fXqz06Nv;xYSc>c6|*
z`4b(MtP(h>G5_u3cV0ZDdl{pr8GA`LSNO0jJ^u6I_WjG9tb>$9#r(Hje|JnXbI#J|
z^DkfLzM`>Nq)^|yIs8gbs;&R^``!PxS_dBc>XUWJv~EM<f3xEOQfD=1t}L)^4er!1
z=H&2Qwfy$R4(`{#yLWqZ+BKXE4NVk3zwEN~(MOM#O5FMT`NhLf-Q53nv(DR}3X!jv
z_3GYZEB%F@G0}m(w}hCNFV?S5Ve#CYF7Wl+tE#R^Q`?NMx#{rcZaV8={`JeJ^5A9L
z%bK<;I!<6HU3+o4-jd0Z2^zxJjaJ7^>e-r+|Cvu~TEp@cvYiXp8tl0A{ruf4b0j!T
z43n6Xu3!JyvzY6;@3hLdN59!d^!A?nb+GgC=IHbFi<WiG`M#E?Kk{rz@v~GTX6GGu
z^NO7+_8-rD6%(K}MWnu5?ojf_`#$+i`?NwbcO6e<DE@l#y&>;CpT;kXuh+bFYZgwc
zSe<hC^qTJ~e^#hovftGpSh3r?YvQK_lY<W$#G};q&zTd*a_!zvgLQX)PvDqYbwfH|
zy|Zxltbl73YcJi@+Lq$-<dk;gRrO4J>jvvU<=F3&Gc0aK$~>NWT_Yf_DcbJjJ*&AY
z&Mv9zKNx&C<((d)sDE&3qejuoY=<?)Z7p#(>m|GelJ9TlHGKT#j5ohm!S-vmxBr+$
zt44UM?>BLp6skCdRXzVA!`D3@_ryNonK*~5F1#u@YJS!n&2@RLw;H8RU%0h|aYN0=
zZ}#2IXWws_=2EG(@;lRd!HagYVqfImReiTe_<{egkB1~yCFZJ{oLf@J*A-u9#OdiS
z^+1pDrY%Ft*8VFV#ormt7$gt;T`haJo7bl8*=PS5Q}{n$xMN^xZ@<Ttd9i1%n8zLU
zX)7nhtocyYtGP&T_RmdTcm0++F+DrqIbr(jb1s{X)%3quePH%|FR9YFwF^F){>)UE
zX+JwAHst9_v(uAQ|K+&NHvJ$e_`gG9fnTfYD!YS!rf!^Lt;_q|#^M@pSk=^|(AA~M
z^WrV`96$YOrQ|XBZ-1ojaXu8fC$cMs=XbNGs{bkWXJ;#)>8kI^ihA<9F2P;gWcDj#
z$H_|Ro2DPUmwi9a_Gre-d8?c+Z+Y0Gq@DWB$a&voy<1CIRO7GlWY^riRJ7RTrfO?y
zL8^3T`T8vWlM@w=iE0L0$(uj!sAL!4SG2=sDf0p=(Jb|JhLy*sgx%f|n5trTPT>;A
zlaFlf_bgl#O};Yjx|`bPz2nTym;(uXA6h@!d@1R(UK+0QGw7dH@%n`II?p6FF22FL
zI9s@&d9IO+#?G^|*uNgqGVpu*!0ry`ooBmVn8@q>FXQPCUMIlzRhCiBRo0(rxklWn
zrRHv*ci%kOu>1I_>Hf>*WzwIVmP>e)#I8I4Zc~MrMo~c3xpj5(_lW1o*6)14%2w9n
zw{4&2xyjc}{%y0d^VmP<|A~W7XB(;<Y1y}?OyuP)k@-_Nmf7~if4b6nds6g{1;(Ge
zLhoI^y8oO1qZg;%M%4YY*sFePY5L=iHK_(?>MM_4w-G!cy7bmr7tuE-g`!es@>}@G
z-&}iQw*0O?hK+L72Di`e^Qb$<vi3oIw}A8gD|7arK4EKPyV@@%T7U8@Z&7|@HeVLQ
z3ZqTaet-3-c=6iTka=fH;pNo4tE-Jviw^C+mR{kq+Iqha!~OXt0lFf-ldZn@I#ix}
zG5cVNNpI${iT}#lwy^EqX7Wzhh^<o2qdoFS#2mHt0h`*jKFeG>TP<_kdVcVOGG(hB
zpY~m7c*DcjzTy92-T7NLcCq}QktI@IWO|ZoLX`K-M@*N(4|ROMX<u|8ui=_v_0foD
zb_XYF1pHCo_%Gn}@fC*_Z0cNp!{LX4QOz>X<*!pcSX_L4)Yrti%<XUz3h)*%`<1;t
zfIGLYyx>>D%<`!k^*>MQUp}qVAHlijDA$sed7+a-<!&Ady7v6&ykPd1?rh7tt#0fy
zxf!|IcmAJNwhTj8E|XLDRNHU5|IJ=0d`&rEcI!pQHTjdjG3pzC&dE`%Si1h_(+AH5
zZmj?N+GfX!r`buWyNY(5v5DDZB*d-~^m>ZU#yPvU{4ezS=ri%omJQPsKP<hc|L>K}
z2KgmYA(6{m*XDa@G6wVgnP=L6{`Q|6>z6EZurql*`KzqJo1gFazq{{H*xVt0=|L}F
z){<niub=;A+>@U#+M#-2qSNB{HHj~4I=b0=lIKqEjx*L$aX&ph@{H1sS92OunrvfZ
zH<m7(nJ8M}@BM+N=0V8QS>c}FnM;28na5ZBTHPM!yZvKsmEHRLsg}wgck8_VwDDfV
zFKxR!b6U6Qy)F`#UGn9byrEdR`dXETOPl-Wi$^c-{!<ZZpUKrJQNZ@&MeZW~=s%nt
z>heiD1QV)fpP$_H`HNP5yv^c7pVXNF9={jHmVNcpKRsPIWBa~qQyhBI#X^Lt87A)D
zn6{$+`zjS-qk4^>B3~BzJkR)2^~&tO;+=Ure?0i}uB5v^E@P#CUAgOp+Rs*sMysn|
zuYF(i_K1b*+2(yyrFQ#;n%TU$)^bEjzqdTG<Fj+2F3->H$DMwEowmZr{%qkl?Pg7x
zUe&m!JqKSs5D&B}UfA^eO)I~3$I2J$0=Z`k9+uPdiwX}<Qc*sc!h5WU#iFgySEy9Z
zYWKIdTl6m9+M91)QFcQ_ZRR`g^k)UB2hJv*(R=cJNq+2S?(<Kt?=hDBd^mr0Bx8T?
zQl5J~;wo<2cFoZCVD{i%x=~f&7=u-)w$;R+7T;3spUd-|>(`(2ec$xk^4qMwF%?a^
z+hA?`ZrweveHE=&56;YQxc1}FaWV7xiHXxSCSDXM%Ff~xsJ}3ULsfZighYAJd`C^8
zDCI{?EA!$vmJ~hy9bz38vGvcCEC2IWahT|r-FxG|<DCDW#^#@U*Y8n&&z^EB*vfPo
z!_1v!tIJk#KbWKJ*;nII|GC%GHLl|Gp;z@xFIm4wbSY&_xm%rh#GdQIo4SWTo=q!P
z`Fim9l&V#XJ7>8nrCpu!=Sk7B#s`w?o_(4l;VJrY&F9*kmAa~5I26{Zl(YuSo&SU1
z*L1O4g<E8Hx72;EpNm)i`yZn@_xsetrFD-)*~Qt<_kYgM|30Jc&IV1P8pFscP5X^U
zwGzv^PM<k`(A0I^OV?kzasrb33L{T4^yJm59~FG6zW)SMamUPd{yQ^!A4mLr{>ZXF
zKC3>$X@{jJ`^{M0Tavr;Ur(7Z%|E^&v^uGkZ)2&fb*K5UyG65F5+}}3*84wggHQb2
z^^9M1^WFD&KkayWLv`BoG?#~uZwYN<+w1EXE9K1R8}q8dWcP-`TZi|&E_wH;|ButZ
zw_E>I{7dlb;XHBoIjg}z@1koJ{$2rs$`d&3wJIA$53BZAe{8$NE0`8?CuH~e0CARs
zGQVe)2t5h8{iCbojm%%}BEDBYcdT!E|H!iMzk=hJIg`A(Kl$A)V^}0s9?^6quOXt`
zs58cR=`wMj1#_7dmnW#`#GL*x;bqZW>)Df(($_8G;?L6l$Pr&R(RHrm!RWUwwOz5n
zdLGAJL#NLB^U3|%`|11Z-)8jvn125G7u}@k$5OJs->@*b^XRIgMDG355sOycXKD}Z
z71_OX(V5++?WCq}{d&jEW_!ghp|8#Nm37uwY<eA0K6U!?<y*gQSujobX{f`#S9fGi
zgbN>GfADO|R@TS0m+mERTB`lMev(}A-k%&Br*gb|t@mKHv}`utx!L<03OiSLP0~8^
zeUEC)$HTl!*DfuS35>Y-Jl|DU*^2v5r_xTHovAN>|Jm4c+Sa}LXHZ$$zv8;{r_GnH
z{HgQW!g<pKchgr&`uCTd`egE|zy5U69kt(@E0-tb^*-LaB1qLZHGIbDb-WyxEFRyD
zQHhIf>sWd{L1)H9-VN7uSE%+?JiN)`W~#f$X~M^%fPHN95A3-T=PQuMbXP$rZ`pRm
z=J3E!qwg(SzAIMU_v+pDdv|Juo$;%>-LF$R6k}G_i+z2}u6bJ9aE;!~Pwa}nYt**7
z9+GVHow2aEWE;2RzrUK|N8P?Z+?C3tXWpY!_%rvV!vp;@??gX;>|3+<QPQjK)vRV>
zUss5{JYf)iUqSRz|E_!^r%$KvieG%SU{bE#0*T+OGgQsD=uAGF+M5xmDfgkBH9<vu
z)t>89r?`m7Fxwg=i`t$H7kVoC!SbBBkjljA?RVTW;+9qJnY<|fZq)VpwT87u!uOaL
z`LEwI)otCb=&m__`@h}|nR54_L{x9Y0zU1CbGpCN<ZUKh*)L$wDfwJlB=pL~)3p-k
zix!*xooySo_lM<j=Hv1ICRzPhT=%43^uwcbJ~pS=x8GCua#NBIbXD$O5;L9cuH(=1
z3+}z2e@puMtvBoU9R1h3bj7CWOY1&l?pl6As*1lf+i}jZm|Hv6J$kkHW|H`a9)H!Y
zw>5HdXU;F>{w#mrXM&8zz2n)x{`4ey39L3|U|`PyodsaptvXBOoM}M#G@iMWwoCn-
zZuanpm4n{9KWe;A*OYR<$b8P5Vzeq}<NZeNNauqAuch{_QoT{J?x0i~YsoRKEQ{pn
zEi!%Q)jxN2?pbyI&z$Y*ZtlEuC)6))(OPwV|JiM}_XNJ&*d)`o;L7p`tZWx22A*G5
zBgJ|7;-#%Ol8<imRV)Ad@cf1cAzLpmtS=7S8l|*)f@zLgv*(m4C#Pz7bl>cpV)SU%
zh9#91AG*F}H7!wZ5Zd9D<E>#^EpuCEZrrgV(|Ld9?H7r9Zrk<#qU<{PtwF8=FPQk2
zsm!))4vqM>W&@jI`VV%wgRYNugg^WCEa27G8H^!DYo2cX_tGY;(Bz%>f}e-e|8+de
zUB#Qs9-H%;@l{TM?52us9;Io5X)`0$-RktVnz)@aeWh9WV19yCgY^y5t^dNN{HQ*7
zRoq&jEBv$K$<R{?!OZ`bEPC5)c=t+V3g5f_lJyJU?fW61wtjyW-+C1fv%>1FS0*K~
z{1ba1_U>N8ca3>U*VIH-`z-nTWqRlCCt{t7?n?t@c+UBG9$;bEd?-~!Gd?>=Ywq`d
z`r1xs$|HrceBWK~Sz`Q)J*v)o-Qk-H+&%r(rE)@SW0SaLOHXF5EH(6=y!>6m(dU~E
z<n<X^X>5vJ`}K>ti1q}JyE|l$dz^ME7Ou|B>wUc^)8mk;x{B?2McK}h)pxopX00+1
zzsA$Ex9nU@<^%ounqCFY1(x^jd_Eihz2mCYYneT-Yb+k>KUFxVo3&Bv-`&XHo_Ymb
zuZ5g!r=Gj*?qoLENB!BoY34Wf^a;FbRXyqTz1mKB!m~TM$9G++T=>QOuc6-V-8U{3
z%$XpuZtsuwhSe{=ifz2?)9)$1&8aR_CGCRII)(#An+yt;E?FX5;1~Vq-@!%ech&yN
z{<khkn7wVf=7XLeMy*WM*U~fkbq=3a-tt8y_UGEOrmV_=I+0#kGd@ek?fHHBn`o1T
z;Kjtv29Z1N=%)0gpL#Z{x0=Q0^UY<cF{QfYszp!srWbGEma^rTV!Y_AeCoSD=l*Us
z;$!A!So$x|D=MwoTQ%?5<PV3oPfGGST>5U$1S|7ND<6md5t#mL@fKI5l)(Q|(|0*s
zbeq{FXw0{dS3}fGC8=P}wAGC(56aI!a!}(%XrxbKaFtLIM^t5cME37+$vJV%yvzFI
z@>W*+8+}}Jhr@KvhgrD^r8lNOFKkrkkTdTv*~@(V+-idwjna4hM-EJS;Jtmu<~tMK
zd9=q{emnWI<!?~#Pfa0N{vW|B+Sj}=U2$o{tbI0b4(t^X+L5Gb+Td5T`+m$zft~9d
zpSu~U7no)IGv0mQXRY_1by{hmoeb+7ofegz)xGACydo_&>u8|lx_!rPYw0ysTuV|5
zzuCQSF4yBrtM}K2y?HPz`}HT445wMnrzeOP8nC;s>99?_x?%PVpR5`0wrERcZQ8xZ
zSlL6WJ9hDke&sh2tunip>VBIfc=+It(4>kJ4=Q^mxoujm&wr`(z5m&WV`?sS3|c#<
z&P#qY?bG!F$=`bd5~3Dy^o#G7nh+Iy=f-bahV<1<WzSEazq8^!n_Tyon)1%rdDqiE
zc84{DSE=5fzSn#D>oflA4O)GV2nd(#PySWlq-X8DydoyHYgzV@fbQ>gvdhcwFF%#0
z9d>ip^sF;NOce=!(`Dp$cF%b>JG+x*vi&pNvzENmL#}Hz{5XE$&z6HLFHL=R@U2>g
z#(amUO3{0YF`FLDS9&zX{E7L~`<4Io|IeGh|A#J9uzck!maP+Q*|&SB#A#S2v*!zT
zna2gJ^K^aOvS*^C)qR^1FV6a@f5oaS{)9@*`zoJjF8{ypr{W#OLwDPb86}yS$Se=}
zB3K$fe@XI$V<EOeGsWHXFYWUPU7Dp`p_&+Fyf$EN(BrGySE#POan(-r(Ne?wwH)Ur
z$2S(p%+5OT`;6O}U-RYv8^#|}&I|kT<Irs8E3c#$w*FbaV@mDB8&gtyg{Q^cp7G%q
zPk*Cy?TPdCA&Z&s+WoI-dA-p>BJ+aEy(7%7VvEvL1A69&-Pj)SZ0+Su-xt*z?kby}
z9_yaIe6{vD@g3*Qd8amByc@J3|C4q|uC2gJ@0oX_=k*vrR!enEiQ6!(ry{Fmc}RNd
zW{;=J_4lPEG(25v#XPls^(EQbZd}YB%BcSD=v*eY=<EA592H7towuJQqMta)Qm6P;
zkL8@6%5tvbV$Y`b_f<aRer!@-H(}E1Go1_P+^etI%<m;1bSx^$;7sM`C{4S*m)|4b
zJx!YY<IHZ``;~KFRd`R}SkS8ee<t5^d!3DWmyBQdurhsH|7F5v-?Pv6&0%hN`hBzc
zjXLw+nL7V$+EuG_*WR(rk=aoA`G2R>ORI-(^#5vQsgzVk8!r}Ext!nR$(8Wm&yM_W
zpH?yX`5*2(cPl3RJLGpfeDa^K@qbs}y!0*DOYdg7-qpRI|1Vb);@Li@LFPlz^=oCl
zhLdWq*}QsU<aNwu#q7p^w#QAi%wwefE>lx7JpL!M>x|^B8TV%h-&2=0uKm2&fB)0U
z{bCv`-tN(pVNQ@(yifdO;m+9=4Iv?t_j^~YTP)q3T@YKk;eUQxS9g8N>BP_HzrCIO
gQsdtP|408>BTSiZum`!Tf{s%1boFyt=akR{06^$b(f|Me

literal 0
HcmV?d00001

diff --git a/flash2d/doc/grids.ps b/flash2d/doc/grids.ps
new file mode 100644
index 0000000..e494720
--- /dev/null
+++ b/flash2d/doc/grids.ps
@@ -0,0 +1,337 @@
+%!PS-Adobe-2.0
+%%Title: grids.ps
+%%Creator: fig2dev Version 3.2 Patchlevel 1
+%%CreationDate: Wed Aug 19 11:39:22 1998
+%%For: behrens@sunbornemann3 (Joern Behrens)
+%%Orientation: Portrait
+%%BoundingBox: 160 136 435 706
+%%Pages: 1
+%%BeginSetup
+%%IncludeFeature: *PageSize A4
+%%EndSetup
+%%Magnification: 1.0000
+%%EndComments
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+save
+133.0 762.0 translate
+1 -1 scale
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+%%EndProlog
+
+$F2psBegin
+10 setmiterlimit
+n -1000 10928 m -1000 -1000 l 5781 -1000 l 5781 10928 l cp clip
+ 0.06299 0.06299 sc
+%%Page: 1 1
+% Polyline
+7.500 slw
+n 3153 1186 m 3153 1411 l 2928 1636 l 2703 1636 l gs col0 s gr 
+% Polyline
+n 2928 1636 m 3153 1861 l 3153 2311 l 2928 2536 l 2703 2536 l gs col0 s gr 
+% Polyline
+n 2928 2536 m 3153 2761 l 3153 2986 l gs col0 s gr 
+% Polyline
+n 3153 2761 m 3378 2536 l 3873 2716 l 4053 2986 l gs col0 s gr 
+% Polyline
+n 3873 2716 m 4233 2356 l 4503 2536 l gs col0 s gr 
+% Polyline
+n 4233 2356 m 4233 1816 l 4503 1636 l gs col0 s gr 
+% Polyline
+n 4233 1816 m 3873 1456 l 4053 1186 l gs col0 s gr 
+% Polyline
+n 3153 1411 m 3378 1636 l 3873 1456 l gs col0 s gr 
+% Polyline
+n 3378 1636 m 3153 1861 l gs col0 s gr 
+% Polyline
+n 3153 2311 m 3378 2536 l gs col0 s gr 
+% Polyline
+n 2703 4786 m 2928 4786 l 3153 5011 l 3153 5236 l gs col0 s gr 
+% Polyline
+n 3153 5011 m 3378 4786 l 3828 4786 l 4053 5011 l 4053 5236 l gs col0 s gr 
+% Polyline
+n 4053 5011 m 4278 4786 l 4503 4786 l gs col0 s gr 
+% Polyline
+n 4278 4786 m 4053 4561 l 4233 4066 l 4503 3886 l gs col0 s gr 
+% Polyline
+n 4233 4066 m 3873 3706 l 4053 3436 l gs col0 s gr 
+% Polyline
+n 3873 3706 m 3333 3706 l 3153 3436 l gs col0 s gr 
+% Polyline
+n 3333 3706 m 2973 4066 l 2703 3886 l gs col0 s gr 
+% Polyline
+n 2928 4786 m 3153 4561 l 2973 4066 l gs col0 s gr 
+% Polyline
+n 3153 4561 m 3378 4786 l gs col0 s gr 
+% Polyline
+n 3828 4786 m 4053 4561 l gs col0 s gr 
+% Polyline
+n 453 3436 m 453 5236 l 1353 4336 l 453 3436 l cp gs col0 s gr 
+% Polyline
+n 453 4336 m 1353 4336 l gs col0 s gr 
+% Polyline
+n 1353 4336 m 1353 3436 l gs col0 s gr 
+% Polyline
+n 1353 4336 m 2253 4336 l gs col0 s gr 
+% Polyline
+n 1353 4336 m 1353 5236 l gs col0 s gr 
+% Polyline
+n 453 4336 m 1353 5236 l gs col0 s gr 
+% Polyline
+n 2253 4336 m 1353 5236 l gs col0 s gr 
+% Polyline
+n 2253 3436 m 453 3436 l 1353 4336 l 2253 3436 l cp gs col0 s gr 
+% Polyline
+n 453 5236 m 2253 5236 l 1353 4336 l 453 5236 l cp gs col0 s gr 
+% Polyline
+n 2253 5236 m 2253 3436 l 1353 4336 l 2253 5236 l cp gs col0 s gr 
+% Polyline
+n 2253 2986 m 2253 1186 l 1353 2086 l 2253 2986 l cp gs col0 s gr 
+% Polyline
+n 453 1186 m 453 2986 l 1353 2086 l 453 1186 l cp gs col0 s gr 
+% Polyline
+n 453 2986 m 2253 2986 l 1353 2086 l 453 2986 l cp gs col0 s gr 
+% Polyline
+n 2253 1186 m 453 1186 l 1353 2086 l 2253 1186 l cp gs col0 s gr 
+% Polyline
+n 453 2086 m 1353 2086 l gs col0 s gr 
+% Polyline
+n 1353 2086 m 1353 1186 l gs col0 s gr 
+% Polyline
+n 1353 2086 m 2253 2086 l gs col0 s gr 
+% Polyline
+n 1353 2086 m 1353 2986 l gs col0 s gr 
+% Polyline
+n 1353 1186 m 453 2086 l gs col0 s gr 
+% Polyline
+n 453 2086 m 1353 2986 l gs col0 s gr 
+% Polyline
+n 543 5596 m 633 6586 l 1083 6136 l 543 5596 l cp gs col0 s gr 
+% Polyline
+n 1443 5596 m 2343 5506 l 1623 6586 l cp gs col0 s gr 
+% Polyline
+n 1623 6586 m 2523 6586 l 2343 5506 l cp gs col0 s gr 
+% Polyline
+n 2523 6586 m 2433 7666 l 1623 6586 l cp gs col0 s gr 
+% Polyline
+n 1623 6586 m 1533 7666 l 2433 7666 l cp gs col0 s gr 
+% Polyline
+n 1623 6586 m 1083 6136 l 633 6586 l cp gs col0 s gr 
+% Polyline
+n 633 6586 m 543 7666 l 993 7126 l cp gs col0 s gr 
+% Polyline
+n 993 7126 m 543 7666 l 1533 7666 l cp gs col0 s gr 
+% Polyline
+n 1533 7666 m 1623 6586 l 993 7126 l cp gs col0 s gr 
+% Polyline
+n 543 5596 m 1443 5596 l 1083 6136 l cp gs col0 s gr 
+% Polyline
+n 1083 6136 m 1623 6586 l 1443 5596 l cp gs col0 s gr 
+% Polyline
+n 993 9376 m 1533 9916 l 543 9916 l cp gs col0 s gr 
+% Polyline
+n 1443 7846 m 2343 7756 l 1623 8836 l cp gs col0 s gr 
+% Polyline
+n 2523 8836 m 2433 9916 l 1983 9376 l cp gs col0 s gr 
+% Polyline
+n 543 9916 m 993 9376 l 633 8836 l cp gs col0 s gr 
+% Polyline
+n 543 7846 m 1623 8836 l 1443 7846 l cp gs col0 s gr 
+% Polyline
+n 543 7846 m 633 8836 l 1623 8836 l cp gs col0 s gr 
+% Polyline
+n 1623 8836 m 2343 7756 l 2523 8836 l cp gs col0 s gr 
+% Polyline
+n 1623 8836 m 633 8836 l 993 9376 l cp gs col0 s gr 
+% Polyline
+n 1983 9376 m 2433 9916 l 1533 9916 l cp gs col0 s gr 
+% Polyline
+n 1533 9916 m 1983 9376 l 1623 8836 l cp gs col0 s gr 
+% Polyline
+n 2804 6069 m 2991 6095 l 3242 5818 l 3216 5570 l gs col0 s gr 
+% Polyline
+n 2999 6099 m 3284 6384 l 3254 6770 l 2965 7067 l 2796 7097 l gs col0 s gr 
+% Polyline
+n 2965 7078 m 3205 7412 l 3246 7633 l gs col0 s gr 
+% Polyline
+n 3212 7419 m 3554 7127 l 4060 7318 l 4214 7637 l gs col0 s gr 
+% Polyline
+n 4067 7325 m 4412 6875 l 4679 7097 l gs col0 s gr 
+% Polyline
+n 4416 6875 m 4405 6234 l 4634 6017 l gs col0 s gr 
+% Polyline
+n 4409 6238 m 3974 5825 l 4116 5525 l gs col0 s gr 
+% Polyline
+n 3974 5833 m 3561 6084 l 3246 5822 l gs col0 s gr 
+% Polyline
+n 3554 6092 m 3284 6384 l gs col0 s gr 
+% Polyline
+n 3257 6774 m 3554 7127 l gs col0 s gr 
+% Polyline
+n 3291 7829 m 3437 8084 l 3130 8481 l 2834 8309 l gs col0 s gr 
+% Polyline
+n 3130 8485 m 3291 9029 l 2999 9325 l 2826 9392 l gs col0 s gr 
+% Polyline
+n 2999 9332 m 3254 9662 l 3310 9887 l gs col0 s gr 
+% Polyline
+n 3261 9666 m 3599 9385 l 3981 9362 l 4240 9677 l 4247 9884 l gs col0 s gr 
+% Polyline
+n 4247 9681 m 4532 9374 l 4716 9366 l gs col0 s gr 
+% Polyline
+n 4532 9370 m 4251 9010 l 4412 8466 l 4671 8275 l gs col0 s gr 
+% Polyline
+n 4412 8474 m 4026 8084 l 4116 7780 l gs col0 s gr 
+% Polyline
+n 4022 8084 m 3449 8087 l gs col0 s gr 
+% Polyline
+n 3291 9032 m 3599 9374 l gs col0 s gr 
+% Polyline
+n 3989 9362 m 4247 9014 l gs col0 s gr 
+% Polyline
+ [60] 0 sd
+n 453 1186 m 543 1006 l gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 1353 1186 m 1443 1006 l gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 2253 1186 m 2343 916 l gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 903 1636 m 1083 1546 l gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 1353 2086 m 1623 1996 l gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 2253 2086 m 2523 1996 l gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 453 2086 m 633 1996 l gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 903 2536 m 993 2536 l gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 453 2986 m 543 3076 l gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 1353 2986 m 1533 3076 l gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 2253 2986 m 2433 3076 l gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 453 3436 m 543 3256 l gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 453 4336 m 633 4246 l gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 453 5236 m 543 5326 l gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 903 4786 m 993 4786 l gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 1353 3436 m 1443 3256 l gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 1353 4336 m 1623 4246 l gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 1353 5236 m 1533 5326 l gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 2253 5236 m 2433 5326 l gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 2253 4336 m 2523 4246 l gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 2253 3436 m 2343 3166 l gs col0 s gr  [] 0 sd
+% Polyline
+ [60] 0 sd
+n 1803 4786 m 1983 4786 l gs col0 s gr  [] 0 sd
+% Polyline
+n 2700 1187 m 4500 1187 l 4500 2987 l 2700 2987 l cp gs col0 s gr 
+% Polyline
+n 2700 3435 m 4500 3435 l 4500 5235 l 2700 5235 l cp gs col0 s gr 
+% Polyline
+n 2748 5567 m 2838 6553 l 2748 7637 l 4642 7637 l 4731 6549 l 4555 5477 l
+ 3648 5563 l cp gs col0 s gr 
+% Polyline
+n 2786 7822 m 2876 8808 l 2786 9892 l 4680 9892 l 4769 8804 l 4593 7732 l
+ 3686 7818 l cp gs col0 s gr 
+$F2psEnd
+rs
+showpage
diff --git a/flash2d/doc/mainpage.txt b/flash2d/doc/mainpage.txt
new file mode 100644
index 0000000..e24e7dc
--- /dev/null
+++ b/flash2d/doc/mainpage.txt
@@ -0,0 +1,38 @@
+/**
+
+@mainpage Introduction
+
+<tt><b>Flash2d</b></tt> - a Flexible and Adaptive Semi-Lagrangian Hack - is the original
+adaptive advection software, based on the grid generation
+library <tt><b>amatos</b></tt>. It was implemented in the late 1990ies to demonstrate and
+test adaptive semi-Lagrangian advection schemes for further usage in non-linear (shallow
+water equation) solvers for atmospheric and oceanic applications. A publication describing
+the main functionality (where the results of that publication were generated with a 
+predecessor of <tt><b>Flash2d</b></tt>, called <tt><b>STASL</b></tt>) can be found in 
+\cite Behrens1996.
+
+<tt><b>Flash2d</b></tt> solves the linear advection equation in a Cartesian or spherical domain.
+\f[
+   \frac{d \rho}{d t} = r(\rho),
+\f]
+where \f$\rho\f$ is a (possibly multi-component) constituent that is advected and
+\f[
+    \frac{d \rho}{d t} = \frac{\partial \rho}{\partial t}+ \vec{v}\frac{\partial \rho}{\partial x}
+\f]
+is the material (or total) derivative. In <tt><b>Flash2d</b></tt> there are a number of
+conservative semi-Lagrangian methods implemented, as described in \cite Behrens2006.
+
+The method uses an adaptively refined mesh, generated by the mesh generation library
+<tt><b>amatos</b></tt> \cite Behrens2005. During run-time the sea surface anomaly is 
+monitored and the mesh is refined, whenever the sea surface height exceeds a given 
+threshold. Other refinement criteria can also be employed.
+
+
+### Acknowledgements ###
+
+The original implementation was solely achieved by J. Behrens. Extension in terms of conservative
+semi-Lagrangian methods were introduced by L. Mentrup. Further development regarding meshless
+methods was performed by F. Klaschka. S. Reinert introduced an oil dispersion module. S. Paruszewski
+extended the pure advection code to also solve non-linear shallow water equations.
+
+*/
diff --git a/flash2d/doc/modifikationen.txt b/flash2d/doc/modifikationen.txt
new file mode 100644
index 0000000..bd67710
--- /dev/null
+++ b/flash2d/doc/modifikationen.txt
@@ -0,0 +1,126 @@
+
+Stand 14.10.99
+
+Ziemlich viel ausprobiert habe ich an folgenden routinen/funktionen 
+
+
+*) FEM_interpolation.f90, function estmt_gradient
+   
+   Schleife neu strukturiert (gute "ubung, um datenstrukturen und
+   vorgehensweisen nachzuvollziehen), pointer-zuweisungen ersetzt
+   durch direktes rausschreiben der ben"otigeten daten.
+
+   Performancegewinn durch bessere cachenutzung und eingesparte 
+   operationen (gilt auch f"ur andere routinen, siehe unten. Effekt 
+   auf der t3e deutlich. Das ging so schritt f"ur schritt, ich muss
+   mal mit der originalversion vergleichen. W"urde sch"atzen, das
+   ganze modell ist jetzt in etwa doppelt so schnell.)
+
+
+*) GRID_api.f90, function grid_domaincheck
+	
+   Ebenfalls: direktes "ubernehmen der daten statt pointer. 	
+
+
+*) FEM_utils.f90, function in_out
+
+   Pointer: s.o.  Die berechnung der vier dreiecksfl"achen ist
+   zusammengefasst, um rechenoperationen zu sparen. (Kein aufruf von
+   dcalc_area mehr)  
+   Alternativ (auskommentiert): entscheidung durch vergleich punkt
+   links-rechts bzgl aller dreiecksseiten (Das klappt, wenn man bei
+   der urspr. triangulierung darauf achtet, alle kanten von elementen
+   gegen den urzeigersinn anzugeben. Der gittergenerator erh"alt diese
+   eigenschaft) 
+
+
+*) GRID_api.f90, function grid_coordvalue
+
+   Hier wird zu anfang gecheckt, ob der punkt im inneren des gebietes
+  liegt (grid_domaincheck). Bei aufruf von slm_interpolate aus ist die
+  antwort aber bereits bekannt, grid_domaincheck zuvor aufgerufen
+  worden. Also: ist das ergebnis bekannt, kann es grid_coordvalue
+  "ubergeben werden.
+
+  SLM_interpolation.f90,  subroutine slm_interpolate,
+  SLM_interpolation.clip, subroutine slm_interpolate
+
+  Aufruf von grid_coordvalue entsprechend erg"anzt.
+
+
+*) FEM_utils.f90, function edge_intersect
+   (auf englisch, weil ich irgendwann angefangen habe, meinen
+   schmierzettel-file auf englisch zu schreiben)
+
+   Check, wether the nodes of the boundary edge lay on the same side
+   of the line r_check--r_outer => no intersection. In the same way:
+   r_check, r_outer on the same side of the boundary edge => no
+   intersection. 
+
+   These tests can easily be performed by calculating the
+   crossproducts. If they are of equal sign => same side => no
+   intersection. 
+                       X
+                        \
+   A________________B    \
+                          \
+                           Y
+
+   crossproducts (B-A)x(X-A)  (B-A)x(Y-A) have different sign => X, Y on
+   different sides of A--B  => intersection possible
+
+   crossproducts (Y-X)x(B-X)  (Y-X)x(A-X)  have equal sign => A, B on the 
+   same side of X--Y  => no intersection
+
+   Remark: If (and only if !) one of these crossproducts is equal (close
+   to) zero, we have a degenerate case. Using this information, the
+   following calculations can be simplified.	
+
+
+
+*) FEM_gridmanag.f90, FUNCTION grid_findelement
+
+   Loop restructered, less pointers.
+   Less calls to in_out in the hierarchical search: If the point belongs
+   to the parent element, it also has to belong to one of the
+   children. Therefore, it is sufficient to test all children except of
+   one.  
+
+
+*) FEM_saveset.f90, subroutine grid_readdomain 
+   FEM_inittriang.f90, grid_create
+   Domain.dat, Triang.dat
+
+   Reduced format for input of the triangulation. 
+
+   Im beispielfile Triang.dat ist eine triangulierung f"ur ein quadrat
+   mit quadratischer insel beschrieben.
+ ______________          Redundante daten werden jetzt berechnet, es reicht,
+ |\    /\    /|          die knoten mit koordinaten,
+ | \  /  \  / |          die kanten mit zugeh. knoten und randbedg,
+ |  \/___ \/  |          die elemente mit kanten (gegen den uhrzeiger) und
+ |  /|    |\  |                           markierten kanten
+ | / |    | \ |          zeilenweise einzugeben.
+ |/  |    |  \|
+ |\  |    |  /|          Sobald es wirklich kompliziert wird, ist es
+ | \ |    | / |          so viieel angenehmer.
+ |  \|____|/  |
+ |  /\    /\  |    
+ | /  \  /  \ |
+ |/____\/____\|
+
+	
+   Die grafik-schnittstelle weiss mit der insel nix anzufange. Zugleich 
+ist sie bisher die einzige, die den berandenden polygonzug
+braucht. Also gibt's in Domain.dat einfach nur den "ausseren rand.
+
+
+F"ur landmasken ist wahrscheinlich eine bitmap am einfachsten zu
+handhaben... und auch nicht ungenauer, als ein polygonzug, den man in
+endlicher zeit eingeben kann. Mal ein bischen gr"ubeln und
+ausprobieren.
+
+
+
+
+
diff --git a/flash2d/doc/netcdf.doc b/flash2d/doc/netcdf.doc
new file mode 100644
index 0000000..3ea960f
--- /dev/null
+++ b/flash2d/doc/netcdf.doc
@@ -0,0 +1,57 @@
+Reihenfolge der Array-Indices in C/C++
+
+Beitrag von U. G�bel: C and C++ interface to netcdf (version 3.3.1):
+
+With using the C or C++ interface to netcdf there often arises the question in
+which order the data of multidimensional arrays is returned by calls to
+functions like
+ 
+        nc_get_varx_type(...,type * data)
+
+where x is in {1, s, a, , m} and type in {float,double, ....}. The natural
+order returned by the netcdf interface is with the last dimensions varying
+fastest.  E.g. if temperature is a 3 dimensional array of type float
+temperature[5][6][4] then a call like nc_get_varx_float(....,temp_arr) returns
+the data in float *temp_arr in the form 
+
+      { [0][0][0], [0][0][1], [0][0][2], ..... ,[0][0][4],
+        [0][1][0], [0][1][1], [0][1][2], ..... ,[0][1][4],
+        [0][2][0], [0][2][1], [0][2][2], ..... ,[0][2][4],
+        .
+        .
+        .
+        [1][0][0], [1][0][1], [1][0][2], ......,[1][0][4]
+        .
+        .
+        [5][6][0], [5][6][1],[5][6][2], ......,[5][6][4]
+        }
+
+        nc_get_varm_type( int ncid, int varid,const size_t *startp,
+        const size_t *countp, const ptrdiff_t *stridep,
+        const ptrdiff_t *imapp, const float *op);
+
+Instead of giving a detailed explanation of mapping I will simply show how to
+specify reverse order: If your multidimensional array has d dimensions with
+length dim1, dim2, ..., dimd (e.g. float
+temperature[dim1][dim2][dim3]...[dimd]) specify a d dimensional vector imapp of
+type ptrdiff_t (defined in stddef.h usually an unsigned int or long) with the
+following entries: 
+
+        ptrdiff_t imapp[d]={1, dim1, dim1*dim2, dim1*dim2*dim3, ..., dim1*dim2*dim3*...*dim(d-1)}
+
+(Note that the last dimension dimd does not appear anywhere.) Unfortunately the
+C++ interface does not implement the mapped access, so you have to rely on the
+C interface (which is automatically included in netcdf.hh). Using the NcFile
+and NcVar classes the access could look like this: 
+
+   NcFile *NcFile;
+   NcVar *NcVar;
+   int num_of_var;
+   
+   NcFile = new NcFile("myfile");
+   NcVar = NcFile->get_var(num_of_var);
+   
+   nc_get_varm_float(NcFile->id(),NcVar->id(),start,counts,stride,imap,data);
+
+For further explanation of mapped access refer to the netcdf manual sections
+3.2.3, 7.9 and 7.14 (not very elucidating).  
diff --git a/flash2d/doc/para-grid.eps b/flash2d/doc/para-grid.eps
new file mode 100644
index 0000000..9140445
--- /dev/null
+++ b/flash2d/doc/para-grid.eps
@@ -0,0 +1,858 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%BoundingBox: 14 523 298 754
+%%Title: /tmpdir/jbehrens/JB-Local/TeX/GAMM/Vort198/para-grid.eps
+%%CreationDate: 5:15 PM January 21, 1998
+%%Pages: 1
+%%EndComments
+%%BeginProlog
+%%BeginResource ShowcaseResource
+1 setlinejoin
+/M  { moveto } bind def /S { show  } bind def
+/R { rmoveto } bind def /L { lineto } bind def
+/B { newpath 0 0 M 0 1 L 1 1 L 1 0 L closepath } bind def
+/CS { closepath stroke } bind def
+/S {
+    /fixwidth exch def
+    dup length /nchars exch def
+    dup stringwidth pop
+    fixwidth exch sub nchars div
+    exch 0 exch ashow
+} def
+/bwproc {
+	rgbproc
+	dup length 3 idiv string 0 3 0
+	5 -1 roll {
+	add 2 1 roll 1 sub dup 0 eq
+	{ pop 3 idiv 3 -1 roll dup 4 -1 roll dup
+	  3 1 roll 5 -1 roll put 1 add 3 0 }
+	{ 2 1 roll } ifelse
+	} forall
+	pop pop pop
+} def
+systemdict /colorimage known not {
+	/colorimage {
+		pop
+		pop
+		/rgbproc exch def
+		{ bwproc } image
+	} def
+} if
+1 1 scale
+0 setlinewidth
+/drawtri {
+/y3 exch def
+/x3 exch def
+/y2 exch def
+/x2 exch def
+/y1 exch def
+/x1 exch def
+0 setgray
+newpath
+x1 y1 moveto
+x2 y2 lineto
+x3 y3 lineto
+closepath
+stroke
+} bind def
+/filltri {
+/y3 exch def
+/x3 exch def
+/y2 exch def
+/x2 exch def
+/y1 exch def
+/x1 exch def
+newpath
+x1 y1 moveto
+x2 y2 lineto
+x3 y3 lineto
+closepath
+fill
+} bind def
+/cliptri {
+/y3 exch def
+/x3 exch def
+/y2 exch def
+/x2 exch def
+/y1 exch def
+/x1 exch def
+0 setgray
+newpath
+x1 y1 moveto
+x2 y2 lineto
+x3 y3 lineto
+closepath
+clip
+} bind def
+/imgscanrgb {
+gsave
+translate
+/scandy exch def
+/scandx exch def
+/istr scandx 3 mul string def
+scandx scandy scale
+scandx scandy 8
+[scandx 0 0 scandy neg 0 scandy]
+{currentfile istr readhexstring pop}
+false 3
+colorimage
+grestore
+} bind def
+/imgscanbw {
+gsave
+translate
+/scandy exch def
+/scandx exch def
+/istr scandx string def
+scandx scandy scale
+scandx scandy 8
+[scandx 0 0 scandy neg 0 scandy]
+{currentfile istr readhexstring pop}
+image
+grestore
+} bind def
+/showcaseisoencoding [
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign
+/dollar /percent /ampersand /quoteright
+/parenleft /parenright /asterisk /plus
+/comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon
+/less /equal /greater /question
+/at /A /B /C /D /E /F /G
+/H /I /J /K /L /M /N /O
+/P /Q /R /S /T /U /V /W
+/X /Y /Z /bracketleft
+/backslash /bracketright /asciicircum /underscore
+/quoteleft /a /b /c /d /e /f /g
+/h /i /j /k /l /m /n /o
+/p /q /r /s /t /u /v /w
+/x /y /z /braceleft
+/bar /braceright /asciitilde /guilsinglright
+/fraction /florin /quotesingle /quotedblleft
+/guilsinglleft /fi /fl /endash
+/dagger /daggerdbl /bullet /quotesinglbase
+/quotedblbase /quotedblright /ellipsis /trademark
+/dotlessi /grave /acute /circumflex
+/tilde /macron /breve /dotaccent
+/dieresis /perthousand /ring /cedilla
+/Ydieresis /hungarumlaut /ogonek /caron
+/emdash /exclamdown /cent /sterling
+/currency /yen /brokenbar /section
+/dieresis /copyright /ordfeminine /guillemotleft
+/logicalnot /hyphen /registered /macron
+/degree /plusminus /twosuperior /threesuperior
+/acute /mu /paragraph /periodcentered
+/cedilla /onesuperior /ordmasculine /guillemotright
+/onequarter /onehalf /threequarters /questiondown
+/Agrave /Aacute /Acircumflex /Atilde
+/Adieresis /Aring /AE /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis
+/Igrave /Iacute /Icircumflex /Idieresis
+/Eth /Ntilde /Ograve /Oacute
+/Ocircumflex /Otilde /Odieresis /multiply
+/Oslash /Ugrave /Uacute /Ucircumflex
+/Udieresis /Yacute /Thorn /germandbls
+/agrave /aacute /acircumflex /atilde
+/adieresis /aring /ae /ccedilla
+/egrave /eacute /ecircumflex /edieresis
+/igrave /iacute /icircumflex /idieresis
+/eth /ntilde /ograve /oacute
+/ocircumflex /otilde /odieresis /divide
+/oslash /ugrave /uacute /ucircumflex
+/udieresis /yacute /thorn /ydieresis ] def
+/showcasedingbatencoding [
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef
+/.notdef /a1 /a2 /a202 /a3 /a4 /a5 /a119 /a118 /a117
+/a11 /a12 /a13 /a14 /a15 /a16 /a105 /a17 /a18 /a19
+/a20 /a21 /a22 /a23 /a24 /a25 /a26 /a27 /a28 /a6 /a7
+/a8 /a9 /a10 /a29
+/a30 /a31 /a32 /a33 /a34 /a35 /a36 /a37 /a38 /a39
+/a40 /a41 /a42 /a43 /a44 /a45 /a46 /a47 /a48 /a49
+/a50 /a51 /a52 /a53 /a54 /a55 /a56 /a57 /a58 /a59
+/a60 /a61 /a62 /a63 /a64 /a65 /a66 /a67 /a68 /a69
+/a70 /a71 /a72 /a73 /a74 /a203 /a75 /a204 /a76 /a77 /a78
+/a79 /a81 /a82 /a83 /a84 /a97 /a98 /a99 /a100 /.notdef
+/a205 /a85 /a206 /a86 /a87 /a88 /a89 /a90 /a91 /a92 /a93
+/a94 /a95 /a96
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /a101 /a102 /a103 /a104 /a106 /a107 /a108
+/a112 /a111 /a110 /a109
+/a120 /a121 /a122 /a123 /a124 /a125 /a126 /a127 /a128 /a129
+/a130 /a131 /a132 /a133 /a134 /a135 /a136 /a137 /a138 /a139
+/a140 /a141 /a142 /a143 /a144 /a145 /a146 /a147 /a148 /a149
+/a150 /a151 /a152 /a153 /a154 /a155 /a156 /a157 /a158 /a159
+/a160 /a161 /a163 /a164 /a196 /a165 /a192 /a166 /a167 /a168
+/a169 /a170 /a171 /a172 /a173 /a162 /a174 /a175 /a176 /a177
+/a178 /a179 /a193 /a180 /a199 /a181 /a200 /a182 /.notdef
+/a201 /a183 /a184 /a197 /a185 /a194 /a198 /a186 /a195 /a187
+/a188 /a189 /a190 /a191 /.notdef
+] def
+/Helvetica-Bold findfont
+dup length dict begin
+  {1 index /FID ne {def} {pop pop} ifelse} forall
+  /Encoding showcaseisoencoding def
+  currentdict
+end
+/Helvetica-Bold-SHOWISO exch definefont pop
+/newfont 10 dict def
+newfont begin
+
+ /FontType 3 def
+ /FontMatrix [1 0 0 1 0 0] def
+ /FontBBox [0 0 1 1] def
+ /Encoding 256 array def
+ 0 1 255 {Encoding exch /.notdef put} for
+
+ /CharProcs 1 dict def
+ CharProcs begin
+ /.notdef {} def
+
+end
+
+ /BuildChar {
+  1 0
+  0 0 1 1
+  setcachedevice
+  exch begin
+  Encoding exch get
+  CharProcs exch get
+  end
+  exec
+ } def
+end
+/PatternFont newfont definefont pop
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+%%EndSetup
+%%Page: label 1
+gsave
+/saveit save def
+gsave
+gsave
+matrix currentmatrix
+[283.5 0 0 -170 14 693] concat
+B
+setmatrix
+0.219608 0.556863 0.556863 setrgbcolor
+gsave fill grestore
+grestore
+gsave
+matrix currentmatrix
+[113.5 0 0 -113.5 28.5 651.5] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+28.5 651.5 M
+142 538 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+142 651 M
+28.5 538 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+85.5 651.5 M
+85.5 538 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+28.5 594.5 M
+142 594.5 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+85.5 651.5 M
+28.5 594.5 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+85.5 651.5 M
+142 594.5 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+142.5 595 M
+85.5 538 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+28.5 595 M
+85 538 L
+stroke
+grestore
+gsave
+matrix currentmatrix
+[113.5 0 0 -113.5 170.5 651.5] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+170.5 651.5 M
+284 538 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+284 651 M
+170.5 538 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+227.5 651.5 M
+227.5 538 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+170.5 594.5 M
+284 594.5 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+227.5 651.5 M
+170.5 594.5 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+227.5 651.5 M
+284 594.5 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+284.5 595 M
+227.5 538 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+170.5 595 M
+227 538 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+113.5 623 M
+113.5 538 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+57 566.5 M
+113.5 566.5 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+113.5 594.5 M
+85.5 566.5 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+85.5 566.5 M
+113.5 538 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+99.5 580.5 M
+99.5 552 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+198.5 651.5 M
+198.5 538 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+255.5 651.5 M
+255.5 538 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+170.5 566.5 M
+284 566.5 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+170.5 623 M
+284 623 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+226.5 622.5 M
+198.5 594.5 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+255 594.5 M
+227 566.5 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+283.5 566 M
+255.5 538 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+199 594.5 M
+255 538 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+227 623 M
+283 566.5 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+213 580.5 M
+269.5 580.5 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+241 552 M
+283.5 552 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+241 609 M
+241 552 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+269.5 580.5 M
+269.5 552 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+227 580.5 M
+255.5 552 L
+stroke
+grestore
+gsave
+0 0 0 setrgbcolor
+0.500000 setlinewidth
+newpath
+255.5 580 M
+241 566.5 L
+stroke
+grestore
+gsave
+1 0 0 setrgbcolor
+2.000000 setlinewidth
+newpath
+227 651.5 M
+227 594.5 L
+241 580.5 L
+241 566.5 L
+255.5 552 L
+269.5 552 L
+283.5 538 L
+stroke
+grestore
+gsave
+matrix currentmatrix
+[113.5 0 0 -14.5 28 679] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 194.243 664.75] concat
+newpath
+0 0 M 0 14 L 65.014 14 L 65.014 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+191.743 662.25 M 191.743 681.25 L 261.757 681.25 L 261.757 662.25 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 194.243 664.75] concat
+/Helvetica-Bold-SHOWISO findfont 14 scalefont setfont
+0 0 0 setrgbcolor
+0 2.47059 M (GRID_api) 63.014 S
+setmatrix
+grestore
+gsave
+1 0 0 setrgbcolor
+2.000000 setlinewidth
+newpath
+226.5 679 M
+226.5 664.5 L
+stroke
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 52.243 664.75] concat
+newpath
+0 0 M 0 14 L 65.014 14 L 65.014 0 L
+closepath setmatrix
+0 0 0 setrgbcolor
+grestore
+newpath
+49.743 662.25 M 49.743 681.25 L 119.757 681.25 L 119.757 662.25 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 52.243 664.75] concat
+/Helvetica-Bold-SHOWISO findfont 14 scalefont setfont
+0 0 0 setrgbcolor
+0 2.47059 M (GRID_api) 63.014 S
+setmatrix
+grestore
+gsave
+matrix currentmatrix
+[283.5 0 0 -42.5 14 749.5] concat
+B
+setmatrix
+0.556863 0.219608 0.556863 setrgbcolor
+gsave fill grestore
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 91.479 721.5] concat
+newpath
+0 0 M 0 14 L 128.042 14 L 128.042 0 L
+closepath setmatrix
+0.776471 0.439216 0.439216 setrgbcolor
+grestore
+newpath
+88.979 719 M 88.979 738 L 222.021 738 L 222.021 719 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 91.479 721.5] concat
+/Helvetica-Bold-SHOWISO findfont 14 scalefont setfont
+0 0 0 setrgbcolor
+0 2.47059 M (SLM, Solv, VisOGL) 126.042 S
+setmatrix
+grestore
+gsave
+0.776471 0.439216 0.439216 setrgbcolor
+2.000000 setlinewidth
+newpath
+155.5 735.5 M
+155.5 721.5 L
+stroke
+grestore
+gsave
+matrix currentmatrix
+[113.5 0 0 -14.5 170 679] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+matrix currentmatrix
+[255 0 0 -14 28 735.5] concat
+B
+setmatrix
+0 0 0 setrgbcolor
+1.000000 setlinewidth
+gsave stroke grestore
+grestore
+gsave
+0.666667 0.666667 0.666667 setrgbcolor
+newpath
+123.469 740 M
+118.329 740.575 L
+114.908 742.299 L
+113.206 745.173 L
+113 747 L
+113 747 L
+113 747 L
+113 747 L
+113.86 750.437 L
+116.439 752.724 L
+120.737 753.862 L
+123.469 754 L
+123.469 754 L
+124.446 754 L
+126.691 754 L
+130.018 754 L
+134.242 754 L
+139.175 754 L
+144.632 754 L
+150.426 754 L
+156.372 754 L
+162.282 754 L
+167.971 754 L
+173.253 754 L
+177.941 754 L
+181.849 754 L
+184.791 754 L
+186.58 754 L
+187.031 754 L
+187.031 754 L
+192.171 753.425 L
+195.592 751.701 L
+197.294 748.827 L
+197.5 747 L
+197.5 747 L
+197.5 747 L
+197.5 747 L
+196.64 743.563 L
+194.061 741.276 L
+189.763 740.138 L
+187.031 740 L
+187.031 740 L
+186.087 740 L
+183.932 740 L
+180.738 740 L
+176.679 740 L
+171.927 740 L
+166.657 740 L
+161.04 740 L
+155.25 740 L
+149.46 740 L
+143.843 740 L
+138.573 740 L
+133.821 740 L
+129.762 740 L
+126.568 740 L
+124.413 740 L
+123.469 740 L
+closepath
+eofill
+0.776471 0.439216 0.439216 setrgbcolor
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 116.135 740] concat
+newpath
+0 0 M 0 14 L 78.23 14 L 78.23 0 L
+closepath setmatrix
+0.776471 0.439216 0.439216 setrgbcolor
+grestore
+newpath
+113.635 737.5 M 113.635 756.5 L 196.865 756.5 L 196.865 737.5 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 116.135 740] concat
+/Helvetica-Bold-SHOWISO findfont 14 scalefont setfont
+0 0 0 setrgbcolor
+0 2.47059 M (Application) 76.23 S
+setmatrix
+grestore
+gsave
+0.666667 0.666667 0.666667 setrgbcolor
+newpath
+123.969 684.5 M
+116.919 685.786 L
+113.714 689.643 L
+113.5 691.5 L
+113.5 691.5 L
+113.5 691.5 L
+113.5 691.5 L
+115.423 696.214 L
+121.191 698.357 L
+123.969 698.5 L
+123.969 698.5 L
+124.946 698.5 L
+127.191 698.5 L
+130.518 698.5 L
+134.742 698.5 L
+139.675 698.5 L
+145.132 698.5 L
+150.926 698.5 L
+156.872 698.5 L
+162.782 698.5 L
+168.471 698.5 L
+173.753 698.5 L
+178.441 698.5 L
+182.349 698.5 L
+185.291 698.5 L
+187.08 698.5 L
+187.531 698.5 L
+187.531 698.5 L
+194.582 697.214 L
+197.786 693.357 L
+198 691.5 L
+198 691.5 L
+198 691.5 L
+198 691.5 L
+196.077 686.786 L
+190.309 684.643 L
+187.531 684.5 L
+187.531 684.5 L
+186.587 684.5 L
+184.432 684.5 L
+181.238 684.5 L
+177.179 684.5 L
+172.427 684.5 L
+167.157 684.5 L
+161.54 684.5 L
+155.75 684.5 L
+149.96 684.5 L
+144.343 684.5 L
+139.073 684.5 L
+134.321 684.5 L
+130.262 684.5 L
+127.068 684.5 L
+124.913 684.5 L
+123.969 684.5 L
+closepath
+eofill
+0.776471 0.439216 0.439216 setrgbcolor
+grestore
+gsave
+gsave
+matrix currentmatrix
+[1 0 0 1 126.743 684.5] concat
+newpath
+0 0 M 0 14 L 58.014 14 L 58.014 0 L
+closepath setmatrix
+0.776471 0.439216 0.439216 setrgbcolor
+grestore
+newpath
+124.243 682 M 124.243 701 L 187.257 701 L 187.257 682 L
+closepath clip newpath
+0 0 0 setrgbcolor
+matrix currentmatrix
+[1 0 0 1 126.743 684.5] concat
+/Helvetica-Bold-SHOWISO findfont 14 scalefont setfont
+0 0 0 setrgbcolor
+0 2.47059 M (GridGen) 56.014 S
+setmatrix
+grestore
+grestore
+showpage
+saveit restore
+grestore
+%%EOF
diff --git a/flash2d/doc/sources/Callingtree.sc b/flash2d/doc/sources/Callingtree.sc
new file mode 100644
index 0000000000000000000000000000000000000000..7665e78004fb7438f3ac82b919f62b10c8e16413
GIT binary patch
literal 24536
zcmWG`cJpOs`TviBfkBLcfrW#Cfq|hQv7{umC{F<ifP|R}5{nYkixLYm6pBkKb5cRl
zAaUlD)U?FXoDzkS#3Yay2!q5~auX{ub4zm-3KG*(6^b*fQWX?H;;e~9Mfv4W0gz$^
zh&WquPG(A~LU9I2GPx+Tpade$UXq$ykds)Fs*snM3$_&^&XJs1lnikO)D(y~XMRqK
zLSj)eTo7tLS5azmNn&0)vKEkgxIyYmQY%Unl5+Bsv%%Ux;ylJK3T2t8<*7wrAus_F
z=PJn0sZ7tu2p>L>Iq60Dr3GN6U;?C`zbL;nFC{fa0c1Z|6yi>Sywq|?*gyrL?i9?-
z1qB#F5GpQ&=0=bLkom%BeuasP<mH#7qFDe^FA9pM<owdS5|By=28oN6<Y%YmfnpI6
zLLhPR<kF&|)Vvaf%#zexg}l<-q|_pixI|)UN@l)7a!w|~!ys`<P&mNitQcXwRBB#w
zVnJ~!C@NDF0)jy@AobEP^TFu^VZIES88G#-WvNBQnfZAN#U(|VdFdcwaJrHM>qiYd
zkoodSiOJat1^JnICGe;Oi7TY#=anF(DUd-RamCEMvedki{2~Qo7lr(!tkmQZu=z?k
znPsU8Wtl0d`3h-8kfaDwuk4jrkeHWRoT`9`Adt8U%$>>kDbQpKHb)gLjlk?xD=tYa
zDgpVZ7@GPa=|nv>F9lT;BCg?SXyJ!sC(Im8a5$7CCLy8`Y_C>MW?pt`3PcA~8stuG
zaJ*)wAjdpNT!n#wfro*Cfti7Uf#v`I|Nj{n7-Sh37&JmMGK&?`GILTDl8aIkOHxx5
zk}4HEgFJ&3f-~~VlM{<m6^!*vKt?dIFfcH1FfcHsFfcGnFfcGMF)%Q+FfcHPfMp>B
zBZQ(m2?`V)sI6Si`K3jfsYSX@`8g?g#6Wsv7#J8pZsvgM0VzjjvqJm~_9KWb4hla8
z28L-23=GmxHWLFUYX}1ag8%~qg91|uIBY;{khvhtAi$?~24pZ43o$S-9D%Yy6et`)
zG^0}p1A~kC0|qc{lEC1!(byQoX9LSJFo0ssz5&DmW3bs^76StVk~mBVuNce@kYbSD
z|BQ^x3=9wcGjcJq{AXlmVqo~s$OcL=AO&EYo0ysRpOKXX6y5(pib0}W3=9lg7zzrG
zG4%I?(iA9+K;n!}TR?s}zyP8h8W_N|i}?XiB7(acWG_fDG+lz2aD5;SC~iP%4o@;R
z2Jt~`=SjxKpdbLTVP=EWfiOr6Bo9*y(g#y3AjtS9Cn>QQ$u4xagM%4lj<W#7?I0TD
zb`VXB+hOWJ_Jhm;xd-G15Ff-wb{j}7$ZU{05Js0r)+ZpyWC1E2@wlBGWCzF`XE&(Z
z-53}^=EL|bkaP}K2C@sxfRqOyCL>H8hyyYQqz2gyC~k+E4N?cfAhpQyAbp5%XDWf3
z2`YO)O!ROEw^KmoIM+bkUITSIluyv@P<0@~LFRzm19Ah14`L&`4P*x>TtMnT7+oHu
z56SHtKxSYKcZdWhgkoTHo(XmPOsLzTd{ChYRfC)#VPOH+2UWueau3K2AU=qV;&!On
zAa{c>x;#i9lH1>a%)sMzP&|N?Fgio?Du@P!4Ty%OcaS_7gX{t`kkbrQA5<K_+qXc%
z1>|lJ2APNKH&nMXYe3C}g%ilF$mI+-RG!iKJT%<TL(GTq38opSKA1Tm_ki30;)B@8
zZUdPK3Kx*OK^R>gqz@79%&<BKm)l{bDx>o&sM}vb-45jwbURcX$gME<fZPD$qq_}c
z2MKOp05St>nt_z>d{B8tCr}w_!oUEdU7&nIZilIdnFDe!h<!K$Qip-U(HY8ynF;bE
z2*cFE<Uwj-`UC`-?|{s~<92?iJjCt#4G_2MH!y(h(QhDJH-Y@953&_(5;(nsSTHw$
z*f6)j%mld`gz>wb1=OAbX~&gjK<x>TJjCtV&~VpgfVf?ofjGBogNy)U!fuDC1=ZDX
zwJ^VdLICDx0YMf}+XrMQF1HJUBtc;Sj(as|xT`_KU5&_aR|DA!HVN(?m>WQ%Ft>rj
z9io;Pw@(1+#gk@0Z8eY*NVqFO!(9m)?n*?4yAsF<FedDFh+1OY4r^253U^_!jSLJB
zx64AqT^1VdvP6cvED7NbQA>o|Sz&cPF1LdknIPvw+%5?XcS&ftOA;CGk{~0%m~gm5
z)Dq)%7qE$ldJw&C5{1e`+%5tQcM)i~ix3&^A|!-6L@hCHhZ%}1+{IAbE&vU8P`L-i
zM3wKb(u#qBaJWO%665wgP`BZ7JE(64QUVEgZfLl3L&Ke$$Z+R|1rZT$ho~jS?LR;c
z!&A<{%72L4*`eXi4o&auM5cFGFMybEho~jO?QD?VKkoDn$vLoch6x((Owe#=A~M{W
zNC<a`T4LN@Kp@<upz`2wcm4wjcMuJ#M?f?&=^dmFW)7^L$5l5$)e__OHBd8grFYQy
z14s$P?Vq7;{|rep&Yy`(Gaz*!LqPR2LAQSft0czlFTg5sry0<=3rGpX?XRG22eoSj
z7#KipR-(fF703uMCRomZ%mn!ngkk=KwHZJu4;Ehng6yENGLWIT!W}ej29k%k{UOxt
z524}ykjQX<2r>eU3A-JlmWXg?PXL>UJKW`<@({P*fV%w#)a^Hjbo&jcDMXYr&JeZ4
zxP1=PR9xXM50!_w{XEp|pne=E&73FF?dPGU5aV`;T4LM|@g?qX2aPp?EQYxK7}V{@
zpy7UuNVgvY83D$G(+or{5pL&zwY6}CyCT>|X!-8E7wY!CP`B?T((QYprVtbE5Vgd(
zJpgJdF1JHk(=fMhfw~<uZUIU&TZnY~7N{-6xE-RF7`OL8O~vJQWvDzP&8&vHeKj=P
zR}<;>)lgH2aXUmUF>XHrH5HfJVPz=9?TespUj%jgA|l<s2x<#4ZilEP!tI=}Avs)b
zSB2UNar;cD+d<=bpfod+NVm^~nnH}*A!><ny93lzTy9r`%0t{f0qXV%&~TqXq}yS=
zVq)A5QA>>5YoKn!<#u(bJjCtoP`9^3-QG^5+uNb05aV`;T4LP318OQRx5LIOA#SgM
zx*aqw4N5aLM7kXoLd3WoqLvu9e<9#@O{hG??O9N_XF<a~i%7R;K}{jX?GUv@xSh)Y
zYAUX9*MiDJ+#UgSdj!<&5k$H@0%{5|ZilEP#_c&!Q*pT+GQtL{o7|vo2hHDr(u^CC
zZg+#)LX6uXYKd|C3aF{L+zy*-g@ikF9N5_e8tx`Ux*gWDB*yI!wZypn2?4k3LggWD
zhmPqvL&x+$G*NvISj&PKw?ott;dX9VI}um7>!G+EIz9uMO9b~<1&9oH$e0VrD8lVX
zh+1OY9s@EE&lrb3R304ePSCzKhz7YGL=zM4AayWvVEs5)-wh-V>(jx^1oiho7^W5`
zkJ{(so&nN}$L+9k2;z2VzsU*OZvxRoxgFL^AR^6x%mld`gbBF)3IVqpLggWDhqi%1
zbLZeNBC-t(QV%l+<{q5kPIMcX2a>vQ_nVAhc7o;(oS^L)5Dj)ak?k3fdYCx`-A;6S
zhQ|kLCa$~+Ub6s-Kd{@Ob(0gcZUWInr5Q+l1G0)>UIm#6vJZq|{=}Z%c{)G_;z{q2
z(iU1bf!z-+Yrx@7WH|%U2epT=+aW1|h;oJpwsr<rxSPW41ljKhO*0@G<aQ8EOt^#8
z!OVe$C9d=iRZE21K~n`_Q*pW73@i%`cMu!o2M`T%JBTL6?I3kfOfcMG>IkP9E*q#?
znA<^fW3YZ8NXi^UfXs2)!@%HTynq2r8z?Y<+Xco87{Ci`7%|o{*+TV!DOgy8IZy(h
z7|afkQjj{r>zFe0GE3r9i;D7#&{i{{`^N%gCfGl_7#Lji9xyn8Xzc_BXX~^y5Fdws
ztfBhA6v$0r1`>f!3}y#NIY=F0|D>mu#3$#b<YeZhqIwAAAJ`lr$T&+70rt-}1_l?^
z2MkUiS}B3SIcVlg5FdwsVEVw?L2d#wkO+KYFgrlXLF$O}4|sWJW?n&Q396SE(EVfu
zG8gVA8K|Emp?;EifGf?x(kfUx$X#Ft5`j+)>?cXcP%B6saehilEJ@D5<tJDj4sro3
z{V;;<5mA7|lfVK7=cWb*7ZC+qeu9;IATyBH8iDyB0_0W@jf`PpV7mk$%RfM3g#83r
zFB)G`l$n^94q6DDnUA?X5ENgq@)~3<tPBDB&H2Rvu-}{?9$;|#YitbS<4A+Bx)fvv
zS$+fA0n$vI-wJZ_(Ni7+IPD>qcd&Ac(OH;*!9{BU1DIA<U~n!>O9Sz7_yyJ;138Ce
zzrgGOX(rMyMVWb63p`NVAp6G-WF{ytISVl`xF|L-fN41f2IqpbG!P$$e_-u;uy&A}
zzzie;pBT&zkaCbZ!s)JnSpV3A%mn*Kkb%KPB7wmfM2kFNaL!Ll1MzYA2i89XYX`Xr
z%s?XWiNWjuDF>;eqJKO=W`g}A#K7SEfB_so&Nm_P1LEWG4{Y89tR3VgFawFeCkBci
zkR2f9AaxY_2f04-0+|W-&ou{#f6hBFI5*6k<$TQnS2+ipe*<d=xe3fbBJhcU{c|2N
zj0#c*@(&|q-7^FBb<f~kGMUN6@t}qST6F|26OjGn4Rr=1s88;E)`0;`A9G-Et~WLY
z@o~fvY%Uk99po-B1Bt*V2D1aC9Hb89C;V%<Q!7e}5|c~f6N`!xE3x?rxm<wta~MHs
z+j)-zI3GE0bzpFgn>h=_$KfZ~x&V-~NH6CE85lrzfHcGWgg>5AiW1A?(~B}w2>Hhs
zWF|P>fyUW3L*r<T1A}v3TAK4_oaqj>z67it<R&l!iNGfYj-xfCq&u*Gijxy_644r}
z=;gK_)CrLIS$O~wKZ_24%Q@$j2XN&h*g7S!c6@FJD}WL(b>OtH=m1z0BnC=zM8r>7
zYH|sB!yDZ{{$N8H7#N-185o?8GBAMYeGClFlQtWJ_&CxVY`q&;JIGC71`>f!3}y#N
zIY=GIKlt+y&Uy&c$%Bl5fDB_`2!v1!ko_Ho4UqjEAbJA>gNq?}eGF6yWDP8o1M6qO
z^+CnqeY%4Q2=$IowiDD$Q2GX8kY7OhVDg}GFPJ_7L9Pmr9L6{RRFHvzAsotN1dT1Y
zfW~<v7#N&Eb2FfE49GYyR0+Z@Nan%yK^1}Bei%Bs0CF3sZwPV|hz+s>WH!j%APf=%
z$%FKQ*dTo{wE}`%urP*&6MDGAMou7Z&~;z{nePIkH!(1PXxKy`%zO}y;dWg}o`tyw
zqy`p#AT}&qouFod)PXR_y~y$)cf<4v2y%S@$syT=?)FHiJjCrPP`86<kUc66p!L2`
zC3wPJg#@=l)S`@G!2E{lc0SnHKdx|(f;tT1c4?^FK{Uwi(nPvlngq8))Dq+N45-_1
zxjh;x4{^H?)a@V|<aQw<-7Z9e+aYR+ar+Xe+i<xZHvSHFyYtfqaC!&Rn-~~CG%@KN
zqz-BiIIn`(uyhMz!_ovOy+hR!<Msz2y?D}l98{hWH16#JTHg*DTh}<i0OJ#MJ4iij
zMh!Z?ejqI^4P-7TFFK^9rGe5hhz&MV16+5(-42q6sRikSsTC09hpkn^74GpMeV{xK
zHWxIX1agZ!)a{Tp;!q_x@+wF@WR3`=4jk?vH-I=G_aeIuY==D2ZikhDxZDmI!~l&q
zg4_UFXAPpopl*k(vj#Z>j6rSzGZ5qTkoZEh^a#6MjA*w{L9+|Jj7){fGlJ&qoR2Xu
zfa!w`5E`<k3aSKqxP#S0)=7cX;dMJ$?Lkng0PhzCt3{3%P<(-8L182yDBuAy5KnrC
zl|zv5gQatg0}Rgm3=A$B;C+%%Be1(2oDLvq7^DvD9uNatUWJ(nN~0hQawAABEH8uH
z4bvweDDVd)hsW)iP<e>kVd-2R>UMb|-402^AfpJo9ikSVS3#PvyIl}AW{WGmLslNZ
z(mO1ji$UEkMx@&zX&B@T!fuDCCC2U8_ep|mf#7Ti#Q+I+E@&R*g1ViHNVju=^B>44
z!fuDCCC2U8_ep|mfneBL2(a6o?=*nRbr20on;@E)@*SiOVjN;^J}ljW#9?UyW+o`D
zgE0Q|E{J`fB*;JrE`(4Fka7lAzJO>~1_tMYgxl{(We3P8{NWBY6Xb3X#_x7v*uDW=
z=^eD+8Ehx0yl_4R4fj(G;Bp4UCo0@efl3IFF+_wrL@g0%Mi~3PF|ajY0+t`ZX~u=Y
z0i0$)G$?*SG%;=msRNq^Z4-dlxY7(%EirC~%n~E&LG-$*6l4!5{y^aln!5wjFh4-%
zPoYZil<$x^QII-tnmKrK<}45glqMWc&YT5`6%ZR{Hpo5@28n^>VQNA8U}^;fg<<1W
zxYA4+NFT@?kh#vF_3bwp7@U_u(+*^PJ5&j7w}bRS6@lG;$QrSS-^m(j4?omwkbNKw
zayv*Kq!+{n=|i|(1pB@*kYWffhft6*()lvf&6lC+{W4l!g(^m>>%eIZqz@_ub~}iT
zE6qUF5|L&^u<siK84kg)zBt4UJD_gg0d@NhBHg|N6k1>d3A-JlmKe9g48@gZD#12F
z>s9CVP`9s#x_v#7ZeI_xhKO<oqLvu9W8XIhbua@1Llu+>33pgJUj}viG9ul+j0Cqs
z)Dq)%^nGKXu`*bF1#)&Zhydjqr=1&ZoTs0>38p8UVsN&$XK|i>3NlWBIp+@BlMB`k
z%4c8(5`j+)W(P<)NFCv^vZB<q%)C_S=q%{$5PS!XU>m<h_A_MVD=4jP72e_;7BSBW
zM0<p9bhh~5;2ajd5nL}|`Wd$W8{}+~$D?6(fHV{5=j8mvqGC$?3>zZ?Sy>ArK=JG>
zw9(qRPsbljx9c!Cx2k42_vzq@XHdNa)rwM96D0<-1EiQZKSSd=H77MUHLrwlx<HR=
z@O%ogzw1DDgZ(X#RPOBjsLUBen?Bs=-29Kj+4&)^xQ3k%0oD$3JD7n);1h${0a6Z9
zN7x_GxF+A<stgRQ$o_5u*$wtLXfBo+GS}w<qSqN4yYMGK;+p|uEe)uAK%TpS4MZ`5
z=Dk4rz%=&*$eb>J0<O6M#7GJmXA8mX0QrH)@B^Pc6`z-%g0_YQlzw63yddL}K?FEl
zK<jn6A$@%pP6u$G-vzSA7pep$y~FA)a2p<^4yp)TM}qq9AU?>g$bEWHyB%aU$UYE8
zmj~$smHHrY0YUx?ATyBK66kKvg~~(R0CO{lc4c4y*#j=Opo&0dLYb&;=Y&NmfjSau
zCdl0&3^NbbM*_JU)}|2<6oTzvfZ3(Wz`zU}PXsxm5k!E@arR(f0H;G34N8w(4~R{V
zjwt4EJzxNv$DY98JlWXTg$w6;9oQZPuy&YVz#J%nPYh-UNGV7i;ryJKlarrZf+ano
z=Py{Bj?uY}fx(5XfdNdz@+n&buKWetV+3*%$#oIT4v=Qz{6q9y6?nW99M7Qn9d-r=
z(E3pqmIDwPvJV|(Ef|CB1~U--AV#oy$lh|06#o1LvV#RY9szF)A?H8T{3QT7YYt>4
zERCY)FW6phh#O#T2GP|F3?M%c%wGuifb0Rg9mIg;6A&Agf1IIag2D=fVPOH2N6TMm
zXVWmvVqgGa22i;VYvX~8hxrj)UOT^rl>1;Bl+PF!;LB&QejUi1RuBPl7q~2DTmV^H
z@yCI|x#G+j7e<_GF=2bKz}jJc0&}1QJ~5D8&VL}~6G$E5d<I=ZmYS0bYAs+rTMlY3
z0|P@FlnE|BLHp=I<+Jm5NF4y;6O3Oa1_qEim^mOfg3=g>4`L&yJ($^`Fa%+Ad5}I(
z9D~FK1O;GcI^jy2kez0rIc<;|U~UG{pz)sXXnhQj!5~K==PRf_h%n)@9~3SicY`p<
zjUatE(kA+ORiLsTHZK6u23so*J|hmC7Tp*a!1Ov}W9MIpaYwZC2|;Bga+>S}83u9>
z=&U)AJ}~|H0E6?iv@{SO$GkplA1qiq%r9ULl)xtjvje0Qq>gZ!gqHo-(<I1G$nC2x
zkhx$#)iE$Qe_{Za|M0N+#DJ^(hwZ5bYX`Xt%s?XWiGj+0kR2f9Aa#WOM0EMz4Kfq#
zAJ9DiXGr<){H_69{)5hnAehIX`e5dO+y}}lAU=qVlE*-5-+>c5G37tFqQKL>g6*dU
zm;Z1#gWO)tzyRVC<#vdBK+Yvt{)5Z}g%t>c{07p5BacBA*242MsO$$}jPidf$PAEq
zpf-zhRG9{xK51<1+*&OH^8<mr){A0JYqbd2oSJVM&ePM<K<41cYlxbgoOZtl1A}wT
zH*i}L6dr`rB}wIfAKXu%bW>BN0cvYF7encqG7VVRfYgEP2hm9B1(Ggm%E0aeg)vAC
z-n3Z^R!c<M6osy60iUl6vKGB<(hm{@*@@z2klR6NvzSP?L)-&0ig4P5sD-;7qzQZ4
z6os{$V09OI`45|iWdxm_2~LwW3=CizlqM^`!NZ+EnuLv+L(HlCrU5oD`<sUI#<Vo&
z%5NGt(j@FmS&$b<Z!3e`noUZYB&qzL2zC^xUZ2Il;G9vW;S8cd`4$v58D+Tq1Pg1h
zc2GJ5Gmr>;VlX>E%0cP~=QE<q|4AS-!RfS}fx$VeOartY%Q+EBXAzN3q55FvfZT^O
zkAc)C5}n7epN9msh=GA&GL*@P;%1QBXEZQ?{6MgLK)45F6#hI0H4_w8APn*+NE41c
qhISqjsO)E&1wA(!)VBq-AHjK*fq@k?z6n~h&BDMCzvch`{~rL$CdQor

literal 0
HcmV?d00001

diff --git a/flash2d/doc/sources/Dataflow.sc b/flash2d/doc/sources/Dataflow.sc
new file mode 100644
index 0000000000000000000000000000000000000000..10bbc225a9434c605de0892d5023dc10e5ebc432
GIT binary patch
literal 16976
zcmWG`cJpOs`TviBfkBLcfrW#Cfq|hQv7{umC{F<ifP|R}5{nYkixLYm6pBkKb5cRl
zAaUlD)U?FXoDzkS#3Yay2!q5~auX{ub4zm-3KG*(6^b*fQWX?H;;e~9Mfv4W0gz$^
zh&WquPG(A~LU9I2GPx+Tpade$UXq$ykds)Fs*snM3$_&^&XJs1lnikO)D(y~XMRqK
zLSj)eTo7tLS5azmNn&0)vKEkgxIyYmQY%Unl5+Bsv%%Ux;ylJK3T2t8<*7wrAus_F
z=PJn0sZ7tu2p>L>Iq60Dr3GN6U;?C`zbL;nFC{fa0c1Z|6yi>Sywq|?*gyrL?i9?-
z1qB#F5GpQ&=0=bLkom%BeuasP<mH#7qFDe^FA9pM<owdS5|By=28oN6<Y%YmfnpI6
zLLhPR<kF&|)Vvaf%#zexg}l<-q|_pixI|)UN@l)7a!w|~!ys`<P&mNitQcXwRBB#w
zVnJ~!C@NDF0)jy@AobEP^TFu^VZIES88G#-WvNBQnfZAN#U(|VdFdcwaJrHM>qiYd
zkoodSiOJat1^JnICGe;Oi7TY#=anF(DUd-RamCEMvedki{2~Qo7lr(!tkmQZu=z?k
znPsU8Wtl0d`3h-8kfaDwuk4jrkeHWRoT`9`Adt8U%$>>kDbQpKHb)gLjlk?xD=tYa
zDgpVZ7@GPa=|nv>F9lT;BCg?SXyJ!sC(Im8a5$7CCLy8`Y_C>MW?pt`3PcA~8stuG
zaJ*)wAjdpNT!n#wfro*Cfti7Uf#v`I|Nj{n7-Sh37&JmMGK&?`GILTDl8aIkOHxx5
zk}4HEgFJ&3f-~~VlM{<m6^!*vKt?dIFfcH1FfcF$GcYiFGB7YOF)%Q+FfcHPfMp>B
zBZQ(m2?`V)sI6Si`K3jfsYSX@`8g?g#9(?rZWeGXOUx^APb^AF)pbeD%>-%V_ejkt
zOD)MvPDGf*3JC+SpFwPKP<S#hFzjVuV33BgnHV@(Ll_ts1Q-|?6qtg+VFhA?>;Yj0
z0X_pCkOff8#lXO@h2cK~C{92^n?M8u0|TRT3Il`lr-*rA`XK`YnEn(o4-^qlH4F|9
zU@UOlf;ez}AP&eJ`vwMvgFa`@g7_e|BN7{I=0lJS1ITTR=<*<a4GatnAaMba#sw~(
z2SAEJ=?FxlyL}@_5M-y54+DeqM+OEM?VJkX6LLFDJ<J@Cy&(3XzO*zL+X>2snF+EF
zgwf?e?uO|T5NW)F=5|#E2F5)gv!Qr7lxB2xT(#Qy;i}bex+yfw`Q@tBINS~m16cGi
zEJZQrg%-pd5DhZtg%&PzU||Ze|Ap3Sm^m<i9lVAJ14k&^8EPiT{~!!g3zG+h0ZgBO
zNb?@FFhF<vGMJstjaR{b2GgLhfbwyK0mAK2bue>4?l~}X<}45&#CAYp!^{S`8-&s2
zLHa=M2Z;-aG&i8Soe5+ny8GvX>;akO?7+a_B7A@WL_42j0Mj5oLH9%T!OQ{KeW>5q
z7{mv$osiftvqAQOFuFWQAKd+-Z|=CLzFGw>gF(hY+zw(va3_RfV07-Cz~Fq@fdNb(
zQ-IKy9l!-JR1G*kLfMG0hw6ihgY)u14G0h9Hb)Hx2AF$bW`o=f!Z3M|Y7iTw52jW?
zq~!%_*fa3M^A4mgLAYT`1A~hj1A|in1A~jh{{Jp)4Gb>c4vfg*4l*BP4+8@OC&+FP
zcIp7B2bV1%DTv!aENIyS(*vTxW;=t`!pkg>Qji=7gV+b5`oL;E96&-SY8|2SAc_4A
zkn#=e25(fgF!Mk($V`xW5Zi?r>@N@(ZZ617kN`*?gkfxO7+`S&%wCW>kY11;uv#pB
z1KACd2dM?oAPjbc18O*c%!H`{nF(VHi1g+#Fo5fQP`wQj7GhvvxB+57F)WH0odp>f
zTs#^Wz_e2XgY)eb-#~n@0!D}_Ap4>EK>mj^A>jz;Kp9ACp&|%%FgrjJAa(y48JQUw
z8~!tLF|zz;WM^Vv_|M1&YPo<EfN?-ketJ=2u7ZDQNls>7szQF6f}4+Hu*ZK!Ru)iG
z<Ub=cF{0<M4zPAmy$Z@F9|9ox>fr|n{ULz3{PiIKY77G;jaopsAh$bOpyjWJA3&0z
z@Bym@$%6zyY7Zi*6%c7vLCasDx@it1x<EP@VC@)2XSX~H7vsVcaC(QioQqZA32@wi
zl`=3mfHE$G4GIGUkAZ;=BFq3X$JE8D@GL%aK<)&och-WpEkIl_K6oFTmcVQn0ap)l
zqgCMvkT_Hfl-5ol`6n492g>)(DS1{dmVw8?w8_O2&MVF3Tr2}2{(+`7B>zZ4^?@n-
z25=h`%!U#6^?2L`vdiQm++Cow#=xk6C#_}XWtPOJ78T_ep{6cy-J{CDz_bF%Pw7xM
zfWp?=MJ>7C*)0!5PjCjsk#6z?9B~AS>kcGyQpq$2J+49RQIJs(_vj{1!{;7oJTW+H
zfwZ7v0&#8aqMJMcqyuUO$Q{V-StXDhIIhD}4!EdQJ3GVZl9WRrK8|pKW@83Mn0lBw
zP<t2-TF#sWV>?3G&QLQ!_JJ_EJje`~J^|6Uu+}rwE^xep(&`zc_(%ik0h#3-V$I>A
z<J{*QV$JEIet53)#(*6zI?i*!?#E24puPcAD+2@8bcrvmLhS$<0P+J7X*EASJ+&k`
zHw9EGq9#`cu)kCp7??AV`~~j#gZ$;Rj$PJ8{NqU&?cC6K+(qukQ?S244q!kjQ$Xq7
z1u6`p3P1!I=77=(a@mxNWR9GR+{d%1?)i8U**%~z0jbBDUSY8cQUJv;^<XpQKAr>#
zL&ZSuKu)iDAUUvq&VNw{g@Y56c4qk{0^%dP1F39+rXdDKn0lBwP<ybaSE!jF`#>0`
z7M7kt0R&I4B5firZc}z(v>_2iUOvoDXEp@}7YWW<IIRrf6LLFDJ<J@Kdthz=iNoCH
z3^fzvZV-m4g~_A3z4eBR2dEnit4qLX5|r02Af?Gdkoh39oHkv4?IL^eB$$?*xW>6|
zu7->3#Wmmx3^T6@L-m0vm^;86D1lE5W(P<qNF5}v3E-<2z<Dhxu_QSoGq0eu1TDK^
z&u_&b^Fe-dp2c47BL49NoPN(<?jrZ&368jd<TpedXOL+QD4m0%1gf1O3(8=0p2c3~
zBKPqOs(U^{>R_lMP`H4Yq~<rUnQ|ZDbuI$~1IQi7`7Ik{E;w8kHSGk2gENfY$OPu&
z2p4#MgQ<s^19L0ZGz&EoWFH8_)M8DuqVJ|a&4k$nbvwMTp97U=bly01y^92A4V*q8
z3g#1ZJ5(Rc9GH8sx*cjJ$lV|eQ;Xg0?_sTGsN1pTH}F6g$SmjCR;yfOFP;F?k`q@u
zzrEt(B6|@sR)Lw{M4|2lQ!sacIZy(h7|afkQjj`g^BZ{37k_?BK`KisLFR+~=9XvU
z{86UZ8A6vh?=Y8f{;#zLN8F(2w{kMg0i_k>{APw^j;-^5nMzdm$dn+v2NW(K_0F3A
z|AJ^_OrSkx<NRNy1f(8n2FM*-kirGpV_{%)F74U?3I{md=^75=BfA4z{RUGHvI7*p
zP<yb~Z%{Kq>OdH#7M5l~X28<Afat3h7fAaPnr7i;1xOhPTZ0IYInJGTd7M9b--gpO
zV!?cZZiniFnFDhV%ncxMnA@D8W`gVkVVGK&JV-4}pMXeDhKnso1fzaKZcA2xRe<`S
z!R(iu|H|Y!2eV&x{xZkXdE+ZT=f5(RVE1F@H-4x-FlAr={}-5nL||=SLQ@~i4v=z?
z9|-5S;+))gP~RsrF(<Ps6}5H)mm{FIWDHW8ssWh|3M0p9ITFry5BI@nXPdLl&aW>X
z1N#fA2q{gW=d~)R5=NMQ7)`(&P#TB&7Hon&m}Fo8nIrD}`tUqda}M_*y9X2|AoZly
zZD2EBAMOL`g_;3!2dHiX34t(pFbNbcP6v#3fx-b!|AO$5-GLM?u=LLeQx7r>WDe9G
zta;4|Y9>e>2*cFE(km!{5b3ph3u=0W=QUX6<^;3TiC;hl>~<L4*dYYs6LdRNJ<J@K
zdthz=iNoCH1T_=nZV-m4g~_A2-3Ha|;4~@3z`$?>DNR;`%m<m}wB($X^Q#98VER!)
zk<+jAE6%ST6oK83nb$yZ2-S)hr-BP0jT>SUgV_O+1Nnh)UMtAS$Ju^l)j{%4J;+Ru
ze?Vh4&X-rMfzvz8rJWz{z|($Y;XpE{mP~U%;R1>VsCEVqC<8RUVCnpD)kakJtU{?@
zL16(>@2m-4p8#UQF@gHb!ujE<H6X=MGeBhqtQ-Xi!{*XJ;{^Lb;ouye0-<Nba)J2Z
zcm}CN?Z<-rgPd1EbDAJkjLw~RIY9d0G=6j7c@?G}WC$pppzg(*SDm3|g4BU9Of4+E
zgUo>C69JJfAJp^?%d4=g%HRc34>HHOv}+aE?J&C2H4MbZ5e5jiL)F8~fw>3f29P++
zZO%|LLH2<#Of5_vq!y-6K%`3myW8ROo!%hzAamgH28+Lvlzl|G9jYE?4$M6;H-N-p
zZgYm339=7_VQOLWAhj@k0wSGPP~8qLXVBA)FGvr_EO7i^z9kH&L2-QfmN3Dv2c@^m
zw_tr(@K`a(Oqe@BY?%AN=?0<}KCX-`4`Rdg35aygz~X*TIf>lot^?@-yWiu=eCK<8
zR?Z$*7C2wydg{EL`GxbnUdT8QW;w|X)d!~R>;L}&Gmr?pZ4#&*AmyMqAY4v@+9V~J
zxv9k^sRad@dFiOF5(Y${I{~SzYXX@M_M2Otwe$AJ6F_62V0wqSobyrCJ}y%I3o2t=
zkj#OVd!Vw86mvjn1*R9|lt2&xb&s9%(Z^F!-SZe_j2ILyAoW<=CHTkRt(}iP#x^Dk
zG7f};Km^zwop-rG;ouCTXT*Z}M5I};I+!^yx5CmMNE|86!qgIxW;>psrdf=#E*NAs
z*zKiVYrt-Y(V)Ht?l?s*>%jV8=HPWZ)J%|lAPiFr^Bc$vn4bkiI#!^%9b8_3@*DEp
zM<YlN$SmjdJPYT;k0&^%=UF-LPA+j?zFpS&@MB0n5Hr7VLiK?uta%IHcrw%ukY<n{
zh|6zjnR%JT8K^l8>?csVM($HKgUki_$#KQwewT>kei-e<d0f^d^0+K=dIH%GRS%C7
zn0lx<xD0gQvp9QT)vDDX^#}MY&N@KZFf&2+fiSu}vOWRPHySSb;#)ArOraJ**D!&2
zjLyBQR)go(K(uaX7>rNI?J#v9LtySXC{wr@#0R;}5s3{}s~Z{yQU}85^2quGL|?xl
z;P!Tq9UyZ+^Z739Cm?f~{~5qEh)>w<6Bt11VCI0_a}cz83EIwe3_+XIgfuze`4}V*
z(hJiED(paP0g=`Ov^h;kngJ<>;4TOSUGMNxfx+44|9@u?4Vs^QsX*L(>`TxxF0e`9
zGy`Hei9*`#Ah#TXvSDU}!U}{zZUm`?$%EK1eF7paYY4c#8>Aj&j&pAVgNs@Nc;3uK
z9u)2nKH+eOsDqgUa?e2r1_mdSGiO0;M+XLmLr^xT{0Es0vJZsO<&pIXh_n<CaC;BT
zPKet<>r5ILK;}CiV_<MmBW9fm$nCJMEp#5-a^@_UdqHI*%pYJg<-s;0(v0QISulA}
z*$LApAkt!j)$Ncp2Qp+LhyaCw^8^M4=eG?EPPZU5jE@}dSl7lu^});mg(Zj$TGs<&
zgVRjEu`!4ZGaF<d2!q5xYC-FIKx~j&m_7lKt~t(czqR5iXL><;LFRztQ-T4KX7~;;
zfa5`efpB`)VqkEQfSSSp4fmWgXJO&zm~-YVEL_26@}aH`L6$#=q)$Mk{S34WfR)GS
zd9@#ED<e2QL2d`7dyv~fX@(fLL)F2|0fisP4KVkD+y?UpF1N$vk@X3PbZ}q|cSM>2
zw}ZgpKCywp`9lMPGl+h~0HHrLpoBZtGy_uq0TkO{*MrL$P`U;2K>h%wcaSWI4Ko{L
z9|(iQK=LrPAbl{k0wNtQ1l&Feqz`0{^P~m_=gSNXVEP!8zKoh?u(}<p4`vR?JqOj&
zz;oIlwxe2F8q7T~vqAQOFiak#7sLkXgQ*n|>AK+}Qw<s;LQOM>d8)}EeIRq3g&7!J
z#2XmEG-yp8lut0PLe;^{0lDD-I7vgwchJ%&n0sJmgX{xgkXn#DNH2&D(g#y3Akr;D
z!0l5&`atG5?*zI100Wp7VSv!$2MDJbs6LoEFgJksAU3kwU}l5t17UP|6t|0hm_xwr
z(?E8B%yHh;dBX+dX8t$+U>eFN817JYFmpie0kNGnLDrvw!toH4?F=;=WFH8_)WYPE
z^$Cc6P;q|beG93K1ogAlAoa6mgVck}0gWZOuwM;@(>u&%T=+g7$KiHR8ymS#3!eV~
zo8xh1z6;mYaA%Jz3tc#;$~kXme&xb-RSs+pW*b`&YCo7Fxs46A1Ed)g4usp-nfdVr
zr6r)fIJv1MsYS)8Eo}w{2K2Q-pf#@`<3asU3lhQyRGx#P4Wt)@bwLC;eBAOZUHGm>
zp@#F-P;mG_6@mN$VuI=|5RHrpjorEMT@3}PhnfL$2XenbA0!8MN9mPCp!ju$(Vba=
zAU?7?koxDaGKUeS9%c^I9_(XoP%}aHfiO%hsC<U8LFF@uEg<?HTGAlT=V0yo%z@eM
z+z488+`s^)L3JaPkKzZ!+7yHzpz2`efb2i;8L{Tr;j^(ZDDpt!Ftb7K2VsyHNFJmY
z#0KeusTB}?D}kBc822FMw?!a*Aak4@85o>F{RSA_#J~VrUy8%+=<&E1*&G+90}LSZ
zz%<AlCL+p9M+OFvdYCyNzkt}Vwd){1!Pc}pL(K%a8-!tMVe%lgFnt1|Zx&!(ca5m0
zmVoR5nd98p0QNJ828RWdk0T6_;t!$^W)8?bptb8DK8WprvgW-39L^y7Kp0&fqz~kN
zkhp+I^AFVaFxK?90%Q-!EN7clE1l0=4TaN94GbVYLH9%T!OQ{K4PwK>5X6Rstuxe2
zkbNKwQwx&^xgDlYK&06P)%_S_IV(YCgUkWNsq?weP%wQAN}mfwDTlDOZ<-hwK>A?j
zfZPKLLl7UtMhSb6+GC-h@(A7+L6!&U1GyihPe7!Z1H0Sd<JRCg39#GKApIt15Upfr
z4W`lhQCQs$Qm=;Ej{>;?tJ^_pl?*}i-$b~*=?nq4uLaowa=Via1A~ha0|Sh9UeN&N
z6G}5M^)PclVFqF!dI4#hfx^)V%7&Q<vJZq|YGLvqwJ?1GB25zrxP3jy9*{Xs@1Sl6
z(eexoFg`)IgVe)Tr9%5rxWXN5CR+a$cbaJmA>j56Ft<Ce1cmdtqhMO@00Wp-I(L+i
z+hOWp=77Qym)pT=<-pY#F=<AEfZM_2S>SN@U|?`jJiy@O!NB1Bx&cgs_=MaJQV&vx
z?Dj)Fh<#~J$ZV+DAp1ZV<WFRIkUmhl0f`HUG^V(C?g#bwU}dr@0|ToBQauOT=f&uB
z&*G_bS6>*6cD@i(<h;_oABWqa^&Hg23=CVLEQmQv8Q`=tTj2@kr3@(hT(ISNu)Ryc
zd+k6*f%}pm#zE20P>^3hY)2>?W+ur0AdD^#@;^+UfJnm|?C}Q*7Lch7+rcCQ)Xg&=
z_k-Os^Kn1eo|%tvg#j!~A%30t7(NyNa}Uf7AoEe&4p9qFd&u%=Zr_02?eMY|wB{A0
z9pZ+*<Fa74_Z^o7yS)!}d>LoB_Z<iAc?Fw8(CrYl#JIf#&F$!Yk)0q5LGkA-Zt=u<
zrMn!MUU0nMdFFg3c-n*YMG);ncBnouW#0f#GhjZ5fcXK$hGCc(%npz^NDR~$VPwR&
zrq#VDGesdKu_O_+7rQjMq_hZa;Sb1PH<0qwE|A%9f6dcc1GaPOs($B9pKF}wX+hEx
zroTY@W}#Xkbp@OQWq{lZWx^?#7|afk1W1gqzXB3L`@2Eg#qoKLfq?<!zXwSE+YPb<
z?!U==R$#lk`oh3v#$>)QaG8PWKUjVNYX`Xz%s?XWiNWjuDF>+|>_4Z}jKs3c{L&(Y
s<ovvnqWm1ZkqDkAh3rq(gzgCkr*Q@bR?xUGsHS6KU~tm;|Ns970PyL!y#N3J

literal 0
HcmV?d00001

diff --git a/flash2d/doc/sources/Datastruct.old.sc b/flash2d/doc/sources/Datastruct.old.sc
new file mode 100644
index 0000000000000000000000000000000000000000..a441838b7277bf764c9de928100c57ac4862290c
GIT binary patch
literal 8696
zcmWG`cJpOs`TviBfkBLcfrW#Cfq|hQv7{umC{F<ifP|R}5{nYkixLYm6pBkKb5cRl
zAaUlD)U?FXoDzkS#3Yay2!q5~auX{ub4zm-3KG*(6^b*fQWX?H;;e~9Mfv4W0gz$^
zh&WquPG(A~LU9I2GPx+Tpade$UXq$ykds)Fs*snM3$_&^&XJs1lnikO)D(y~XMRqK
zLSj)eTo7tLS5azmNn&0)vKEkgxIyYmQY%Unl5+Bsv%%Ux;ylJK3T2t8<*7wrAus_F
z=PJn0sZ7tu2p>L>Iq60Dr3GN6U;?C`zbL;nFC{fa0c1Z|6yi>Sywq|?*gyrL?i9?-
z1qB#F5GpQ&=0=bLkom%BeuasP<mH#7qFDe^FA9pM<owdS5|By=28oN6<Y%YmfnpI6
zLLhPR<kF&|)Vvaf%#zexg}l<-q|_pixI|)UN@l)7a!w|~!ys`<P&mNitQcXwRBB#w
zVnJ~!C@NDF0)jy@AobEP^TFu^VZIES88G#-WvNBQnfZAN#U(|VdFdcwaJrHM>qiYd
zkoodSiOJat1^JnICGe;Oi7TY#=anF(DUd-RamCEMvedki{2~Qo7lr(!tkmQZu=z?k
znPsU8Wtl0d`3h-8kfaDwuk4jrkeHWRoT`9`Adt8U%$>>kDbQpKHb)gLjlk?xD=tYa
zDgpVZ7@GPa=|nv>F9lT;BCg?SXyJ!sC(Im8a5$7CCLy8`Y_C>MW?pt`3PcA~8stuG
zaJ*)wAjdpNT!n#wfro*Cfti7Uf#v`I|Nj{n7-Sh37&JmMGK&?`GILTDl8aIkOHxx5
zk}4HEgFJ&3f-~~VlM{<m6^!*vKt?dIFfcH1FfcHsFfcGnfJGP>K;|kjFsxdIA2Tp9
zFfg<*FffQf^?@ix5HSE46o5Jm3=AOq1sux~^Ge(ki&9c`T~c#1LC)d#NX;orEy+wy
z)OE_wNdXBlutNL}c0Y(M4hlyG1_pZu1_o&;n~8ywHH3kIL4bjQL4hd+97Z5E$Q}@8
z5a5g412zpps4_6HErBq>qz#y4U|@812n}`oYH|ZkpVM09Y;Exb6agSLpxCo-0I|SW
zm4Sf~*&IEvDAXKhDT^l{bHFrybGR577#bKrDWk8?f`NfS2FaXoXKRZ`Sj}N%U;w$t
z0qP#-7^p5J>JZG~NMbPegUz(Icmk4wiU~0=FkD~&rBM)uq*IVIqjRW|ytDa^CtzA}
z#}ntnN1UCFcRXPO%c8o2fq_93Bn-n)vte8?jZX|_2S_1E-G4?#W=2MZ|BPIWEdLqV
znHU)UGqUk8Ff`c1upg*oa7iplR0u99DorjaElT~*$jSmr@&6f_85o#mF)%QwGB7aB
z0htNKmQWfL=iyFHvvQmrLLqe0?gP$TIO7}?MhC!pAz>s3W`p9~Nl6)`&)G>y+37>!
z3FoBUdqI30VI&OI2c|&&1T&Bbd}1&=K*~YtaD@>_9)ew5-B7}W0pSmb0(l6<!07Da
zE$Ot|*9=Tg_ca6g1H{MS4?(CtFa>f8n1Mv#6NA|SQVvo_*dLA|A^80PDq}##LE^R5
z*9<vcomzd(aQK5CqzQ)Y8yL7@Y#0r4AB+v7VPY^lK;j@V!v65_^G5LpJdJ|ejv#Xw
z7#OUfG^2C>_cCy~1fxOa3H~&C1F9E9DS`-4xeGD}lqNy6)0x5(&gZmNg7`SX1XM0T
zwK6b(`~~Mg8TiCtc7T+E)DaF7&%Bh>3RtK(=jRutWacH7q-q#x!UVzDnE{-3?|{sO
zVhtz_4ku6?gX{)}*Ey|KAU?PlgqD{ew?Nf{>SQRBJpY0002u%>ld%5+Qj0S4Q!<lb
zz6mHwEz8U=E!I)+ORXq@i9-AcN)I3mDz`YMfb4)`TPV%wEaDsQ{8q~hPCwCG;bPHe
z0ro2cq)Z063#uNJu0VCne+Eb$qXZRabe^uZ(M9i^g>%o7NEgkuJkAR<*<Fm^r-03Y
zhM5CYvEvd|aHAE<1yk6>VD>ssSK9zG8>A2_hH%G!aE%8mKNy{-OT2Q?J09jdL2ZMJ
zwx5ObJZ=paBZm^K?vT~F;3%te0c0)+A4KDW#6TEoCxi2Ji8mm#k;Ks50ctORq#2#3
zFI(sQMW)Dk!j=+n_|BX0#`!njI_kJ%*#?l=Ad8@G;{rE_Ky^O|Gl1J`AZbQtIp28a
z&oV`D`o7u*7kxzhf)v5(eg*~xa25vVaXH_3kUEe&h!3*IseZPU)BY_%AoiiOw6sHO
z&YT6YouOue)PXQa%n3>U5RyJnT!P#KQU}5ywTI5H1GUM(WrGtETY&Fm2h@I0`;!6W
z2N!)mP}>G9EWmei1DFA67lW9fvStedC{2JcLL8Jn!TyHX528W-1IGtQCj$cmEPX=T
z*&tE4J`e})-Zf{=g7_e}J0Y<_W}^EISsoN#pk@|Gp8(&<Hy|^R?1H2vkRT)uVNPRo
zexSC_MZeF~`HtKU7u_x!XHXtBoMZx40Lxn-gBchY92x$D!wO^!3}X`mxd9~a`~Z?3
zKy0WOx;wye1M<7GOst=a{v~5jS>d94&cazG*WShOngLbZArtHGqJIh8Q^Da5MB1Fb
zZn^Upm2~IH%QiTFkSTJWy={T>51k~cxMTXd70zE&vXH_9)W$gj;)6>X1_nMb8`M_I
z^Nk0G1Bll2vvA(#;0fY`9f}q&3=9m)P<>zu>PIjeM&J{3hS~vA3sOg@o@lUl%}LD#
zjTE5NhmdLkQum!e$|taP3#0RlWgA@B{Vd@0!etv=6#6Vs`~-3Y1jE_{5FV&Q1x<$_
zf&EBq5Fds??gz1*L1wc<@-s*bm!CjwbddT6d)JioR0V7v0_FP$Nd5u!=|EZ-o#jF0
zn4blR2IWoX`^&)P05q*Af%`rnl@JUT2B&qXK8P>_BglP+Qdia;T4OH<VmsB(u5;SI
zWgdv_Jbl>)kl7%8APf?7I=^<a-HuslAoij2%-Q>PFmr*}F#AF3Ko}%;sKM;M)Be18
z5ZftT`SqbSz11ML0N*KCpAy!_0HsApyg}+;SejyVF7b^A)!Sg&gwMixU2zSFk0aht
z+NB`7p#FqY_{3m#fE0t&VUM?m4-)M9`}piZ7~HqQ5^u1!3C|UfSx{^Tr5T+{9``#(
zuUZYGUD)pwIp3L61dAk4+=1+est5JQ!Q}^(ZwjR$=F}~l1~#W|*)->#IRwmMTmjV!
zqVz!oD6X7J9#3#SBU1#U377*)lc2T|1GL;=M=|HloI<STpp_e>_Q%0y-kAe#UqQnL
zlxD6V^~X8k?&vE#;e6{(krRkMf2YW~eNK_{jXOmsX$Fyp!DAp$z2LeU#)i>Q`(Ru!
z4HJXe0TKj>VNWx#zBq`6m0x(e<d8l&$bZOvX;8R>tYLJj5j)^~^s*0_-gDW<X}{eR
z5FdyCv_YC+*uDWgz69ffX^^|Y3?u?32D1Ys1ro#MKae~G6YNXF@+hNIQ>>r!^2<J8
zdLGyx(?EP2{?LS&4<SkR2gt5@mwiCGiSq}+zBFju5@Z}CAI=K)0q4Vs!Jzn<>O3ph
z2Zuk@L7HHgWPgClj)}n}_yfH!4elR4fZ5N$zyMEI&N7$koR41i1=Fi8`#PsV_&EHb
ziev_ZeLZ-72U!SjUV_;H(m-5%pcJ#9f>*;B-tz_3pGaItYXFpget^t}Vl^nu2)27x
zus4{7m7BAIy}{)#w44ID3924ezJa;+_5c5Z8At?@TDT}o3}y#N0whK_{{$q0CPH)+
zoHH_WQefR)?499&__WNtR2>CBFbz`+@javr0o5Jgv;wl9fq?<m$6$0`xZ??^4ua8y
z>mZb|Tmz_i5OdDR6oJh-BU41c98g+=)g7ST04R<?MuE(E>U?KTAy#vsaRTelky>|v
z&BUxbkjHXi<Bg2YYgspd>JBh{{!Wn#lNk@5x&t;Y2=W6cy`$76AVE-^gJ@(76NA|S
zk^_n1N*kbdA_RldxdNVw1KjQag(-5q0UGHAS;6SMXugm0vCt4Oy*D((dD9yy5FbbW
z2F=5O^ntN`0|QDv011NJ45E=SObliRNDd^1%Woig2qsu>z{brPofmID=DZ>_1WeBd
z`$H1M$KelHn;C2k$^HP@H9r(Ie*%hM2EzUzSZ|1d9RliSE!^?UdDhhsXAnK{Dkwgr
zL3|wkkc8?3Q}zw;{u-DMB0%8`qLDF73}y#N4kSj{A6V-R@O%i!3<d@U&|DLU$>@BA
z>w@#K&@eE)IyB6M@%1?nABR6+`apU?^~N7C1Bn2+4~YwA!o*;9fCNEeg#Ce8Zy-iY
zp=~j&W2lU<F)xr+usR#$*GtZ`t_C_^;kpDWKf&eQtgB%->JHc#1IP@JUw?ubNCe0a
zNL(-zCI+(uBnT2C>{rw}1J{5m@^~utDkLC2DKACG4@9EWDxmU(X%=)o5!4<7wShoo
Y9wP$-D`*}SR35T0FeqO6|Ns970A$S(ZU6uP

literal 0
HcmV?d00001

diff --git a/flash2d/doc/sources/Datastruct.sc b/flash2d/doc/sources/Datastruct.sc
new file mode 100644
index 0000000000000000000000000000000000000000..2bdf293b40d9c6207efdd23540c02ff26a26609c
GIT binary patch
literal 9140
zcmWG`cJpOs`TviBfkBLcfrW#Cfq|hQv7{umC{F<ifP|R}5{nYkixLYm6pBkKb5cRl
zAaUlD)U?FXoDzkS#3Yay2!q5~auX{ub4zm-3KG*(6^b*fQWX?H;;e~9Mfv4W0gz$^
zh&WquPG(A~LU9I2GPx+Tpade$UXq$ykds)Fs*snM3$_&^&XJs1lnikO)D(y~XMRqK
zLSj)eTo7tLS5azmNn&0)vKEkgxIyYmQY%Unl5+Bsv%%Ux;ylJK3T2t8<*7wrAus_F
z=PJn0sZ7tu2p>L>Iq60Dr3GN6U;?C`zbL;nFC{fa0c1Z|6yi>Sywq|?*gyrL?i9?-
z1qB#F5GpQ&=0=bLkom%BeuasP<mH#7qFDe^FA9pM<owdS5|By=28oN6<Y%YmfnpI6
zLLhPR<kF&|)Vvaf%#zexg}l<-q|_pixI|)UN@l)7a!w|~!ys`<P&mNitQcXwRBB#w
zVnJ~!C@NDF0)jy@AobEP^TFu^VZIES88G#-WvNBQnfZAN#U(|VdFdcwaJrHM>qiYd
zkoodSiOJat1^JnICGe;Oi7TY#=anF(DUd-RamCEMvedki{2~Qo7lr(!tkmQZu=z?k
znPsU8Wtl0d`3h-8kfaDwuk4jrkeHWRoT`9`Adt8U%$>>kDbQpKHb)gLjlk?xD=tYa
zDgpVZ7@GPa=|nv>F9lT;BCg?SXyJ!sC(Im8a5$7CCLy8`Y_C>MW?pt`3PcA~8stuG
zaJ*)wAjdpNT!n#wfro*Cfti7Uf#v`I|Nj{n7-Sh37&JmMGK&?`GILTDl8aIkOHxx5
zk}4HEgFJ&3f-~~VlM{<m6^!*vKt?dIFfcH1FfcHCGB7X&gGCq^K;|kjFsxdIA2Tp9
zFfg<*FffQf^?@ix5HSE46o5Jm3=AOq1sux~^Ge(ki&9c`T~c#1LC)d#NX;orEy+wy
z)OE_wNdXBlutNL}c0Y(M4hlyG1_nO{1_o&;n~8ywHH3kIL4bjQL4ny597Z5E$Q}@8
z5D;tzg#p+=1_lOI1_q8PFb)F)gDsTJ=-i~X!Flp3GZ^i{Cm!O$ea-?D0U$M?*t2f{
zvA`Hq&NndpXZX+1*Jr`Nz@P*cWnf@*KCiaLg^AC?`N)$<=byJEoo{BcyRhr0fX!iK
zU;vrp09EX`L={{RK)GNFn;6Vq=ksbCKxTs!Ld6j70J(*MK@cPd3TNl@5-(kt*u$Jp
zsBLimD^uWnja$QowV?#7J7je(ILhi=fa+y9h{lJBL+xa6J}>bGWHv|~Du(V3P#l1y
z8J*8BTjxA$PKoo0EhXUay*A^G^TNJ$)N#kM4bHRXfWr{#4lZyK1LZUjW&q~_h&$TV
zHaO3mQ{)V#UAQMlxG*8&7o^Am5x;C8J~$lPL1BIl6vrSTMvy&D^|Pg%_HPLSu@9xC
zr5##x<}8Q}GZUl_gh66XNb-k}^nv0M<Q|YZ5C*9|bbcKuoil*gPDpG4Ar%Rb<qS~&
zfc)UX1WtEgVF4i(Sds#jH6SrA1_p*L;PeSe7cg;9`rH8WH_Uzz4dR321EiCIfdOV1
zwCn<j!u5eTaQCh`a~8x0yBCQKG85fzPDt{g@B#%jNS}a^N)5;iB)cGK2_y)KLzvST
zU3i2;T$s+8xNz~uxG<cu0q0ScOD13iu)GB_n1O-8k>Nk6`~#T+$JoR`ZU8B8;SmO>
z2M`-7hVBk<+<^S<+@`m}g;~f5R93h!@>w`{nJsW(6*HiQJD_HROMe{hK%~v{>y|su
zT9WE~df5i&X>*F4FK=7mJa0`BRoroY-3sSfOR|u{Lx_Qa;S7k+0ErhqFdJ0ntykLs
z4u|z>8=Qa26ga<g@B;C{4n>O>Q20UhfhnjT!E6|TPs|x=2S_bQ-G4?#W=2MZ|BPIW
zEdLqVnHU)UGqQndU629>28ITE*PPT`Q0vPxFD13&KO-v(s6PD92+0v3Kb=6zC;U)t
zjLsL9ZE)TyQvj!LF5BSzd`<z1pP-5v7#Q>sOb83)HVBJ>VLvoY!uT*6rp6g$_Ewn!
zkT^&Tm!BH!K`Ow0N=Z*uz~&)PzJGw^A5c9B(!}W8zH9@i%mC4#yy?Py8JymsX+;US
zUV_%GDEdGgP~3sscPMpb-Jv!1av-)-{p>oY{afaN*v{vdfy-EsIuHhlIh|j-*>1<I
zG!XmHdFJeWJD9mZY?%EZbs!89JJeuy-)VndJc#X-uKfDYn%-&<TR=z!lI|dFDUeeT
z@dl}Xl|h0abDTG+Z2;BVV4B^}!ueToEr^dJ-gKe*z!b<XFawFeCkC?vq#UFUd%Qh-
zkYLx}$7c`1exQ~tmUv^D1!<dz+JMZ0VqYlD=w$J@-^puM28?!b?Xz_5lqmwo9Rs9I
z0kR*eUX_7??FW<%qP#!^C~Uy`JADmcv~#OW5q@(RS3vcGC|DW?xo3iNp~Vv?i^pJ^
zfH|Nv32G}bK+6qwkYP~wOmXg%Da2|HTDjpI1J#8@9fAb_k{B!;z-D&JAh!)bY32$8
zs2vW%3=Eu5ZH!I{k0&^{#}t9-iXBg!8)S-{TVsk)(hMRG3q$pRDVTj=4wS$r2D1aC
z6r>J&ngQi;7>1Q!E{P?H3c)2srO73wMX9I-894ob{C5CkF4&I@44`laaY6Cb@0_x1
z1}NU0gO<&3n!Dr=h>yd6ur?$}FQ_d7ZbySTPy*y`C=*V>#9(%SBtT-g{0EYUU>8?6
zRL>y%0a3sWp%_5^nCPql_QynLv1K!yW(Es__&EFlE6c&!?Hj;-4=@`>fZPXT!)Tb8
zlf`4O9UyU#7-4@nhJ;}H;{ixN6vN}gnd?%6bIP)rU|Mh4Oy_Vge+CYJ!2Az3#=agr
z)&yq52>bf~zhP_`4RSMx4YLEp28j{&2TJh-DzG$+HDMleO-WBh;zDXsP<*`rnGeP8
zP@2)1>r%b5#&S0h?R3!B#5uTOlC#FLSvdR&YhQu2+t>g917;u*AonA2!AzJK%npzs
zNQ|&QeG`kaQ&V6*^GPjB&4F=(OA<@qIZRJa4<?TAFC?FVEQ9p%K`c=EoaD3?T)s|n
z0+q81?WTeFIQ$Ds4<Nnd<TJ1xAkD=2*T>Hr(;u*U6=aMWhyaz#pfuyO)-T?f>r$gr
zr?0tl-R2WcYke({{Q<HQsvcI3g1Pqf|Nnv+NQ8X@cpL*sgaPDVFdt?IhyyZ{aJ&U1
zf(Fxc6r3|MbKubji5UiPIjG9O0IOm^rZRYgNl-g=mP{6?9(9J&E-ZWm>QTleP`x0^
z07QVpXO>J6sQz<?(ge%_#WSq_1GSt%`2}PYqw_48YEb=$)f@`zKd_mY_1^_>-2kco
zVD%WI^U_Q^Q2hs{LG|CC^Gos6fAS#5!!W7kD$EX$ethu_YU@HUsLWBoQ~81892BOI
zJPGj|sErS@0u;tM&MC`gInR>GaSmEG%Xw9%6^M_VmXZ4Xpz%47J}|a#Kut&>L6Dn4
zG%|*X!R!FZfy4->WrB5|D99{mn#*$5ST-G$cAdqRO?O@yvIoS+;SX55AFLfmo&?Jw
z6CgK(_%J&_Y>*gXe_*Zqu7LDIF=*@##AI|nlNaZlvfLF+J1m>&{1L=oHWP<GVERCM
z8Az@ZKz2DSn+eiPoIfz@J|lSD2Q6Y47(i+51ISD$c7xI&zePH0EO&N3lNaf9&{xm-
z-y{P(afDJxk>NM69U!}j^P694X1bmNs5J?%&zwLLD~UywuzG>CdQS{wH#BW#JFWFK
zcb+9v;MD1B=DgZ}iPKtNQyg(B3DpOt>>C)s%D@~bVPF6MCzJ`NKz;;qV0M7mATh#e
z6KlP92c#d0)uA*f{$ich`qem}$%_Tm6D~~o4e0&=*$Gt-%bQ>>4mV?rLBaIH>;P#7
zi4pb()_N}>wJ0+`B{LZogV00@E)zlhK;(9r56CW1e7W%T89H_P>ceS*{YjL1P!Gu*
zOHe)N!q*3(@tcFF2O)iS86<P8K=mM2b119_!DiyG2VrGCql@st98f(7rYm+ladC)d
z!&47xL){OiKye6WAQAY)V0M6%gVf=Qe@Gn&>I;IJ;w0CDav<}eac<$9vaH{Qug}6c
zXj#9D*p~SqJ~;ECg)svIgC<lTn6hsG&#!>lFaqRe7#l{z#9(%S#6e=X{05STV1o4^
ztj)m)O0%Fo1eg|EHrqu^D;mVd;SX5e23up_0G}TL^Ff4t{r^uO8X1G!4C2G=0I@-0
zg#CfF9=rk455<a5n$bnA1Qh-g!L-A&N#HS^lw}if_yab+1=bF73z&gK;3$8<Dqwbi
zI3T@*{ee;sI_KvXrDWzMmZWN6)P|tC5V?%;0NDXfZ)zoToi&y_xu})Qbvo#)?_#=L
z$5~_9G#vhejK)GWW33DE^ao*ffV30mzktM&<P2DuiBju@CFYc-7Q>_n_WeNfnjmXI
z>Cyt!*8`<}aM>!Ze$i>IuRad{s)97Zuzmf1<ncPNFvuTZ1`+`igV_O+0*MihPpoy|
z36Op$)_~HWbUDvytzV{#TFES@PG1uji}f{5YkiH8{Q<HQsvee}!Cb8EWju8`%np!d
vkeP)2fup(u_xqS;LFa-&Wfy1$05opJ$iTn~n*RlrA1n+E$`k(o|Nj91#@HgZ

literal 0
HcmV?d00001

diff --git a/flash2d/doc/sources/FlowTempl.sc b/flash2d/doc/sources/FlowTempl.sc
new file mode 100644
index 0000000000000000000000000000000000000000..ac3df7cd4e818282cb76932d6498703221a8eeb7
GIT binary patch
literal 13916
zcmWG`cJpOs`TviBfkBLcfrW#Cfq|hQv7{umC{F<ifP|R}5{nYkixLYm6pBkKb5cRl
zAaUlD)U?FXoDzkS#3Yay2!q5~auX{ub4zm-3KG*(6^b*fQWX?H;;e~9Mfv4W0gz$^
zh&WquPG(A~LU9I2GPx+Tpade$UXq$ykds)Fs*snM3$_&^&XJs1lnikO)D(y~XMRqK
zLSj)eTo7tLS5azmNn&0)vKEkgxIyYmQY%Unl5+Bsv%%Ux;ylJK3T2t8<*7wrAus_F
z=PJn0sZ7tu2p>L>Iq60Dr3GN6U;?C`zbL;nFC{fa0c1Z|6yi>Sywq|?*gyrL?i9?-
z1qB#F5GpQ&=0=bLkom%BeuasP<mH#7qFDe^FA9pM<owdS5|By=28oN6<Y%YmfnpI6
zLLhPR<kF&|)Vvaf%#zexg}l<-q|_pixI|)UN@l)7a!w|~!ys`<P&mNitQcXwRBB#w
zVnJ~!C@NDF0)jy@AobEP^TFu^VZIES88G#-WvNBQnfZAN#U(|VdFdcwaJrHM>qiYd
zkoodSiOJat1^JnICGe;Oi7TY#=anF(DUd-RamCEMvedki{2~Qo7lr(!tkmQZu=z?k
znPsU8Wtl0d`3h-8kfaDwuk4jrkeHWRoT`9`Adt8U%$>>kDbQpKHb)gLjlk?xD=tYa
zDgpVZ7@GPa=|nv>F9lT;BCg?SXyJ!sC(Im8a5$7CCLy8`Y_C>MW?pt`3PcA~8stuG
zaJ*)wAjdpNT!n#wfro*Cfti7Uf#v`I|Nj{n7-Sh37&JmMGK&?`GILTDl8aIkOHxx5
zk}4HEgFJ&3f-~~VlM{<m6^!*vKt?dIFfcH1FfcHsFfcGnFfcGMF)%Q+FfcHPfMp>B
zBZQ(m33H1m-EGFS5EMZ=3=9mQun=%8OUx^APb^AF)pbeD%>=3D_ejktOD)MvPSkbE
z&q)CZF@W^QK*N;7Ilr_h6Ou2H*{qQ82ZuL^Ee?uH1_lOi1_lOcD4U6alQo2afkA+Q
zfkA;O1sqQxHpnd?%pkxQZ3DIuLZ~t@Fy4VM!6YbsfEbKU{WAG3)(#9X+PUXql#8PS
zI1zvpfKreHhylSu3=9lcAWSd`whI&nPW>_kAbnuk<^ThVIgAVpAam>+z<NN0Hi&>>
zBypG!13odB9U#RZb^jR|nHd=s{xfnhvixUcXJTOZ&&USK1t0}r?3j{RP?A^zDu6VK
zb8_PoL43{sjI1o6ME#!;92{H>3=CVq${_?Ot$|qB!^j#DMj%B<VFWe|8YbYd1<8Z>
zAh&|phn6tF{pSQ_gTu=jYzin$8DVN+^2quG_(cSq`;LS1HPkMqSquyeAon9en1O*4
zqz7cLQ@>1!i}C-z;5gQ1U~uj~F5_at0FPskI+%UV5#aO;5`yDHpp*sYK^QRgU^5}*
z2Fy=f3=E7B5LI9j<Sq~c5{|MBkhCV-0CI<%i&_I#cR=$1MBiqa0+2co2jm}+-3OJT
zPVbMX<O8vt=H3c*xKvR9W`okR5?CcX91r*jR~$GeTn3VNn7I9bqu}=aAU4?Tvfv<t
zt94pq{O`ciS*t+u2cFJaX)h^w48(TsKQ8Bjrq(gp`H6#g({zyhp;bk%4<<W52C>0v
z)lkhnH2X%NW72viki28kdX@t!cj7>70e&GD=VPIv&@zF+3DvI*0{lXt@&e=`Xk25&
zGdD;Q6fWR+miYe<>@NXmJWEnBo+TkRf!vKHy}@!ED4t7P*dXq3{sVOfI~Co*j@KQ?
z>8-^1)Biu9@Nj+zafkC~>bV1C7RV(y!h;Va2aT6<=j%{+9D};!1{K|L17Z`x9gLv*
z8Y0NRzz=1B;w9gCH3K;RfoM=Vb>55J9Sq3j$7Y!VkUE$-AbSof*-zP@{XYrBcIwZV
z<8Wby281n>?+htL;du(A@1WAF+aP%m+Y!nJrFD=yKw$*JAbF5k2cTww?68O0;oNpy
z23@VAlKm8z{GtAgIWT=-e_?S0%wCWiVD15%yB8z^F89FYF32pHe?WG?{3*aMIKhSK
z07x;oZUDO<q8B8_Aiyt}0cJqjUmzwZErJUI5C>XcgP5SWC~;m0DU+QiK-0t`>~TR(
zne4m>WDUHY0hP(fX+jVp%K&mmzH=5dO=N-HA?MtV-5nTdq8(}q0|PkRK=B0&D^NVb
z!VsMQYQSoVOA}eBYC&ef;ud5FEY6+Vj?01E4oW*93`#$s_=3rU;t{3~oF=fi0Y{nu
zhXKe;5C)kGG7IJ(kR3383h)cuaRD_VAnjyu`3(v`un#~H&MyE-iMZ1Qs7(b@4vLEs
z=Wu8_VFHc|8RrP>aY0s^fY!<&|6nP<VQp%VJ1U$NRxJm$vz&g0hJo4(&I+qmgE|Hv
zhk`KF3<fgXQ2;Uv$qe*7A_kHJg}YO~Ou5t5P%lvWaq5M*!|7^h7?s?S4>Aj67t}B4
zc|;f_2Xcq=!pD8!aDdV-Y#)z-{D93J$a%zh)#E;pI+!^idk!kuPllx(r~ZuDurvj-
z!<lc@YLI;(3{nfy2P>yQY*<<anG13cNF4}+)Pl@9fG9U7!}5R&Q{gdmwT?>maQQ?1
z8M9&f!2ZJG2AI8|f(+&!khxI5!Sgi8ESP^lcEJ28z%QWTd<^6Ra9@%E<bJ4Lu%G}x
zyn%_UjRVPH3=E9U3m;E&x*F;O3NKKaaAEs+92Ae(;sTU+z!o48_}a2yGp~k*fs}*7
zl!1Xk2-3X+iGVS*1;oJUG{t|3i%|m$nAT}vaPF%La4~|mWik6Znqb{f!oC4q*Fbp?
z3ThvO10`W%FgrlPATdyXhl$|;sK3L2y}#p`msygTm;)NV(<o0YNiE7vEXvkVNH5Av
z0d;ynIXyWeF)uw;Au}%}GdZy&zeq<Rv9v-Vv8X7qvKZVm0x5#_jKJZ*@CIZ*6iY#A
zMyDPAi(ORy-vrZg|9?8SR{6WA{Qn7#56o~-hw1}U_VwT~OfVZpfcytz!)TZo%npz^
zNQ`hexaAiqB<AEOq~@gNrskCtE99pslw_nTzycvHGcUEcL?I`&EHy_VB_AdX@iwSj
z{sOWKiec?=MyLHvS6#&G-+^ht1_tNmwM{PKIOARwsvk^|>}QZ&f}orSsmlrb*|oSN
zGZ!@Snv<WLn4^$dRFq$&1M^vNB4{`)F{cz1^N1LSNkcpiN%stYzz&8GpuQ%E#ptwX
z8>b6vgBgf+{?EYR-1T6q3oA~)D}yw_FeuJoY#5DC3}y#NEl3>+e$P#;(9O#)$^}I@
zY6v7J<|KoMGa(_PkX)2ml3J9RpGPnZ<U#HLmA6i_o31&(|Nj$AKVe{S?pfR9`~g}|
zW2SjUs6H?S@&}lKMBo#H*#S}xQb$A>RFo7YCc_eSW?ou;Q7(As1D*&{QbFln0aPXw
zD<tO^6{Qvz<b%g6b1Kn70h9-Rfb521(D)UI2`c{<IbZp|*lCLYBIlC~pz_b(`6|vZ
zfQ21MFKnCu%!Uylzrolr8YTv_10)U-BOC_K8L7$H3h<JzSRpOH2%hPSz}^Ry2RaJL
z`H4lvsd<@s={gFaV9>+jf8_BlSX?qXU6m<v-p(KbrZ+M$IM?)9I&a76e^~wjd4Y8Q
zgY4P})(X~3*#E)#xv3=?paJNTd<BSq?a_P&Dbtbt2Ft6APG?_QJ2x_9f$1^^2ImIh
zm(Gn03~V4LV5V=-m?TIBjO`mBbv&2@B|vcoWx^?#7|afk1W1fTzd_><!*if?3+)wy
zOlAO$i-Q=T`f8E$?EgQUcK9!Hp2oo7+*%djJO^jI!RmXEUQpPB+B#r1i~zYA#)i=_
zF_;}7agZ1heoHNZW=l|lg+v@Ep<<0YWdFhH7>NJ8|9=46?Ev<lzq1d{xC4zXgPaG(
zAUA>;NCZAHm>nSHAa$hr4;p!ydFcfGrv|bET=uSfY40quO4A8MbF5nJ+$sFhSp?cQ
z!AzT=MhsLd0|Uu*FVqf@0mS*w8PwP)$}cU+%u7{J0yVedA(5zr=0o)K32PTII<0(Z
z=d?Gd8%!?^4FmblX>Vv4j=Tr!qkx<UN}pgFnE<&PnGa&a#9(&7#0bY97XLva5u5*z
z%N7lg9iaGg-kjX;EV6Ptm<Gk)9}pjB{K3X4z}jK%26LbUJ~5abAf+I6g#G6Nno-M0
z1viuxAT4B!q6O3^V0ZyC6N+JNdq(F~$-Pb|Lsx+5nW14WOdF3morLyRG1De&Tn=mu
z$bDc25`j+)W(P<)NF8Cn1*euE`wP+Xhb7IDd<CVFqS91saS0yu0@=mDzyO=OVRW`S
zF6+F?RRl~gab<80O4#PS$`vx6kLh1fKObrYq%8~QKp7x^K$&m~CI+(uBmoj5?BB@L
zVwle$&00{NL-q$~?ha%eqjP_srSsmzRxrIi@xSx*gE`K76aVAr!@$PdL3%-D3TTcM
z%!U#6^`O}<7!N{&+zevD>;SPrVubzSht@3tkN?BQlt9Mlfe3KkGGSnF(UvK42GMHC
z{a{*KrU>j0s3MS^P$sOe%?MKm6$g*y9r$=0%mt};_;{QF)B^#r!D`i#`$6`BFh~p}
z4^j+bgY?1F3h?tE0f|HBqd`ni8bEftK1dK`4%l4KoDj(E631m>e4^YAnU?_>h1KmK
z36R^sW=eqP%|P`ySS=p6cYyTaak~Lj9vptoe=Ht@%y<3-aXW}ljN3u#VCI0_2ns(C
zAH+s>8_aA_Sb;FQJV+l>xch+2z~gp9s652&5B~oLn}5B}5==k%4@vt_MIgJNOq4X^
z`~aTL!C?t<14tc6J%-z__gRA64Z`U1Abm(~hYbe7>_Sg7Mj$&t=78OLEHo5M?|BSP
z@1VIfqQV_A=LRy0u-o@MCNjPA!RkC*ZZ`&52zUExnL@DJ7p__jrdP`p66N;QGKDa6
zKw$|AKM)_p#t8R?sAG!A@*sVPaOax=G6PSVfzI+WK+?>F!ed}Jw=*z+=?R6$h;sXc
zLdZxUbj|?e29Uj2-42;wAR@2w#emGf<91W1JjCr;g-5_{4)3!7(^-W_h;n;YA*?(j
zoMyuNEI{!L!svbj`57tPVSQ>`X~qoM?M}aC@<46|jd_CU-!gf`xE-VqW)8?bAUA;c
zAU1NE0GkOJ10^Edxt@T`z!UD~P<cjYP}ySixEoB%|NjrBjUIOsbURcZ%p8z=ak?F(
zRvug?5##n1P&09bJ1G7@O2BRhg&)Yx;Bdd*X9?mH<93ibkRh;ifY0q9vq9=W801gn
zcme4{q#3RpsF}Fj4k~LwO2Fyesn6mbI9>xD_kig>i+cp!Zo<F-(g!jG<{pq6Kzww!
zfz1qf+yhbv!szlKeMoMH)tg9eXN0XC02yxuB0%Oq&7A<JuW!5KY<OH2hucAGr9fIC
zehzp%0mK2B19HzHzI9xOxU$ZH*iQ3pgPrDHnG9k(&p0mY1W^l5GfsRw$3Pe)e~6Fg
z#34SO;~+LjEy#Y5nIH@jbK+ZH=ERj_24WxLTgQ2bE9)$X?F@G7ylRj-5C(}In%5b1
zXkKR|i0#D3XXM1kX9!{o@bkdNnUTT-Wi65|%rBs@a5nz`4@@gU+Ik>9jxd3l2M!aE
zI+!^idqMF6;)B@8X$@vJ$lV}}E)UX&h)*8yq9xQa03|-{Kz4x4aqfTI2U;5dHou2~
z!Fft(7>JL<?TGk<>VugBc8~QMF$abXO(6CmLpj!ipPmPU*f29e_JJ@+%pplj>fpb8
zEf9O(Nlqn)BrORL8>|+TY9W(6;4=M?<Y%sfmlbnC@{X4k^BgA}D+RG(ZU&hN!XU8&
zdv~pJ3N5?}VmmB(8F$FCEe*sL;OBvP2^RjKxkcnOZV&SdI83Uc@d#?WgTka5XPX^0
zOsZwTi+W-1aljWQ5Vi0$jyFuS!REr%;tdltwYbBCyTbXu)*7UAg5Dp4r6We?eg+2T
zw*PHlx{-mwdAhMNXigo+7zk{g8#qX@_Py}-#~2tuW1Aq&ptvKWKZfoPN03>dIB~XY
zU~o=v&;ZlX4GhkKlCzxC8*q)ILRU3Gbc5UiVIfF-VlX>EszK@q`-5Qr*a>77*dI3=
z7@R&c1UQ4}+YAiOPkqihea1Pa2uq`2?I5>+8At>^F_;}7<sfxb@P{+VERa83*d8!A
z%m3#A(;^HEE?hrnIV<4w2Q2S`wUe5zV0M5s6Xy?X{d|;i)D>hF#2-7JIP+ON0k=mg
z9#3%L_;>=uhZQ;?bs#%IGy?+zEIt@r*dY3#;^6WQSD67b6J#F<gUrKKW`NW>Re<YT
z!es`i?S!TlPniLm_lLy=dSB2D<`-~S^aaia(}ALFV7f1GHjXfXnFndx^##s`nFI1C
zsD1<SL2Q(I5#;tjQBW}i_b0MENFSnJ<bsXQ!|Vdp0kAeD$aqf>0Sa4C-QvRkxX-EL
zalZ@K$KznW;>Y7S+zzrIq!nDJgY<zoAalU(RVdxH|MhWM5c`luRk`E$e()MSu$f%o
zK^?f;57}_MJ>a%>9!RZ&+uC_{fp0oMY?wPhW`ZzC?BL}i6^{MaCxX~c(vQ+Wd@vj2
zW<^wU?M`xBaY)j92a-RKr1|dPzkF>F+o{jui3^%qCnJmX2X9RRx62MV{&{Tw_QgGr
zS^>U4cbq>2fV_q){JcPtAoqdlP>{J`Ke9vG6(Byr@auov2T}(!2V}2<y6P(jsmvW9
z_90^>y+f)s;I<v8tpHUE4?l;bB~^!Hr&)p2?pyS0H;4~ngVl0cfci#owTJjpqYi#d
z6$Z&WeoPg1JToT>#0I+=P3?iCXI%Tbe8A!7WTi0KA?X<xTrH%QfSc=Nyz#%2$^&p-
zKA^rv`hev1Zy>b-e1Ah+9Kge!knn@-7XXb_gW4fr{R|9jpuJ<Dxmgwl1~ZHQ|Nnmg
E0IuU&oB#j-

literal 0
HcmV?d00001

diff --git a/flash2d/doc/sources/GridFlow.sc b/flash2d/doc/sources/GridFlow.sc
new file mode 100644
index 0000000000000000000000000000000000000000..d2fde3099608ff19c7f87c258cef4a109fe2fcce
GIT binary patch
literal 91912
zcmWG`cJpOs`TviBfkBLcfrW#Cfq|hQv7{umC{F<ifP|R}5{nYkixLYm6pBkKb5cRl
zAaUlD)U?FXoDzkS#3Yay2!q5~auX{ub4zm-3KG*(6^b*fQWX?H;;e~9Mfv4W0gz$^
zh&WquPG(A~LU9I2GPx+Tpade$UXq$ykds)Fs*snM3$_&^&XJs1lnikO)D(y~XMRqK
zLSj)eTo7tLS5azmNn&0)vKEkgxIyYmQY%Unl5+Bsv%%Ux;ylJK3T2t8<*7wrAus_F
z=PJn0sZ7tu2p>L>Iq60Dr3GN6U;?C`zbL;nFC{fa0c1Z|6yi>Sywq|?*gyrL?i9?-
z1qB#F5GpQ&=0=bLkom%BeuasP<mH#7qFDe^FA9pM<owdS5|By=28oN6<Y%YmfnpI6
zLLhPR<kF&|)Vvaf%#zexg}l<-q|_pixI|)UN@l)7a!w|~!ys`<P&mNitQcXwRBB#w
zVnJ~!C@NDF0)jy@AobEP^TFu^VZIES88G#-WvNBQnfZAN#U(|VdFdcwaJrHM>qiYd
zkoodSiOJat1^JnICGe;Oi7TY#=anF(DUd-RamCEMvedki{2~Qo7lr(!tkmQZu=z?k
znPsU8Wtl0d`3h-8kfaDwuk4jrkeHWRoT`9`Adt8U%$>>kDbQpKHb)gLjlk?xD=tYa
zDgpVZ7@GPa=|nv>F9lT;BCg?SXyJ!sC(Im8a5$7CCLy8`Y_C>MW?pt`3PcA~8stuG
zaJ*)wAjdpNT!n#wfro*Cfti7Uf#v`I|Nj{n7-Sh37&JmMGK&?`GILTDl8aIkOHxx5
zk}4HEgFJ&3f-~~VlM{<m6^!*vKt?dIFfcH1FfcF$GcYiFGB7YOF)%Q+FfcHPfMp>B
zBZQ(m33H1m-EGFS5EMZ=P+>0T{L-S#)FNG{{G1d#VlX|R@Dp$>OUx^APb^AF)pbeD
z%>-%V_ejktOD)MvPDGdl(jx<n2M(w`AhpPBkQxnWyd#_Il%JmsQp*K57sO*=V1>jn
zI8H%qaZq|;U|<5J6=?{Yfs=ugHH3kIL4bjQL4he4oEAWAklR6+L4Yq{4a7Jwsmj2>
zcn8da5TG;&Vlg`P%jCOQJ21d#=bnpEE{+c1ga%RoN~I1U1_TQ+Ffd$!Fu`OXm}Fo8
znNtAL=hQD#;9_%t0cH*xNC6`Q1IQfv1`r2~!EOYz7#J9k#9=~s#b9=T6od5sXJlk%
zWK{Ui$i>L=pOKx3f#E+R8z`rN6o9c~N@77tVhN~_(<si#jZXyeHUBfRvVbzqe@1X{
za4|42Yym5W5J3<M>^ICXvPOgvNF7obfemATgb7$5NFKxoxfR4dv;^U2Cny^nUe;h!
zKw-lOQwx(v)+Zno&2xa^07wXG7t<^T1_qG(5h2XLzzI?Sve&6!ro_eg|6gz%Ycnu7
z_aB#WF=2qmF-RTEKIaGqko_PbI6eeQS#TbN0aFh)6H+$8;*5)dfiVK23QU6B1!92G
zNWP0~10=1<Hh|nA=c3kt)g9100MWNurU0Z4!~yvSWcNX(sMGr+D)~Tcr@6O69WGTA
zfZ3q*tOQmG@&`B^5BLdJ95^Rj29kG}xcz{m;P(9>HrVa5;2?vmby{Qm@4(Ypt3dJx
zp3YinFDZBo#CGmKE(dZu$bJw8i8&@aKXDLmnhs(gT2=J=V6yXL5F4yk4b|L3vu^}C
zCaq@z$vY;kXE~s9Cl16G5Q=U&aNqzaGC}1hgA=M>83cr)*PzBVMm%$aeG5r%B`y;G
z|AGA_0F7r!D#o)U#3qotv7|RxjswMWi3=OV9nOEC?qH{)JJ|8M13A5wIDh*82NWL8
z4<YVw{!Bf0fXo891V?!Af#g7G#i?JW-1$1x9mk;VxIsmC+<@4Ga0er(O#l&OVBm)`
zK=G3AyqW==|3EY-ojUKu?hXdz@?*110Z1Lp9FRQ+mF%bN&;FkTVmtL`%yGCdLj%H=
z$#;g7qVPNg(sxkl)oqYGi0uevgVH+49iT7*VURq?tOHQ9Kz7(e?Qm{8E`zStQOSM^
zO#V=R#vGVFu)nal0cJ1A4KVkB&D{$U0hfE=@&aTQ%s(JIVEz;kim~8o-~wfAcwR*c
z7X|^Ln1u5m(h{I`J;+c{S_G*Fu|XJCl7ix*#Caj4Om?0CO%sc-#|1fMvhyO4b?|xy
zR3;;*2|<V~q;7N0f~JWqush_O+p)U?BTckJO<`aFhZ`uqU||J{M_3qw^Ir{EEpcfg
z3so)1ELhxv?106&bK7w_klR6N2ZTZC2NYj0c~CsU^nud^7B}EX6W}lanF+!mb3tao
z`~$KB=1&2km^Y6b4uawsktPt~!XO|ND{>Gb53Q>)%5PAc3glr(nh1xM6DHueka3Q{
z9v5V#323bh@(-5s8`f?Ixue2aVbyX_JIm>3Xc(xy;H<D}HK_9eawrHx&0rwI9R(n>
zkjy~OBVr&qP`HE2O{c4&UZC{j)C+Nk)78*0D!C&cWERLSs9(_Yh%iVF<PPVBkNd#k
z0Hs~nJ{|-40h>FJ^N91R$9*7mFmpim98|KO3`;vs{TZ`iX$oYAGvBJ!Ap1ZVq!y$P
zR!)J~u(S#?7vvt0IuHh_1(^j)>mWN|dBBCK@EE#UM<x5oF!@9M8M9&f!2ZJG2AI8|
zL=JNg$Xux3;CUKk7R)~&J7E445Q<&E*uV(V4$dPW_e1r9yamc5Cq6KI0I_l95l}N7
zB+ux)@bNUKtD!!i@B*a?7q*YbLGg$!E<kw)qzM`0Ys-Soyc!w?QV$AK1_lNp25_|i
z5&>gq3y6WyX^Q_67o!FiFs;+T;M`Xg;9}IkfW5!NXbRR1CF~ne4Fw59?E^947$yd@
z10(?w1NC>97!H8?I}F(SJDz!&C7Fpipdmty^2CzVqTIxyY#oL4qRbRfrw5eNlQR<Y
z(o+>O^HMUC6HD@obQBUxD-;roiV`b}!9638B52PD5)PpLCddgOECnJ!Y0qhg|6&)F
z|2M(3JOhJsYn7jiDg&-?Fox;_Q}*@XaZ)fFMu7YWW5Z~e7|afkI7kc>4h)cRz|rq>
z%P#^c!XH=)i8(n6sX3{+sd**E3i)XYB^jv-uwY8d%u6jUQOHRxOU+RLnT6lNlzfmH
z{Pw|&h6Sz=0|Ubske{F!G@bxrGCJ*Vy6Pfc{|-zGHZV9huWfP>$C<_qL7HHg<gf+V
zB?!u*kTwHhZ@3nhWaffKk#q8s6LS<&i;D7#bYOlfP6Q3@CFYcZQWzp-!K7hc2jwq@
zKQK2#$HPEeMyEyFI9*s9%s{mBe+CBUt_NFPSaJGYAEXI}L1_cVhSB)MV0M7ig4B`V
z_uRw^-MsvwTu`z>4T0puoMiCOEF@$Ul8Z7+Qj0S4^9Y84Jjfm3yfwS&n)CbrKb=7I
z69xw7p0!QRA8_U^U8p`V1@Z@&fkfaFgV_O64pK)%7*v!LB__kNMrK}Geo-!Xhy|Vq
zQc^*=M*&p!6e}d>7Zs%z7vzJ-UUMqZLIIQqet_(TV$hfwhzTlZ7dc<~zu0Mt|03s;
z44`t>-}x%eFwh2Rf?<$9U~CwTPYh-UNG(Vm;V^K{NKMXGfS0hv3TgR8@S>v#?0rzF
zqN9+UpIB6!nwOcEuA=}720bkPM;=#G1i1m62Cm8!Id5kWaRSjB85o>v`YfHd<Mh8K
zR3DfE`2oy8BJhd9>;NeTsUz(F;QZXwk_^ybdP%+l#J~1vJ_FYsC}W1oAoIa~JNwew
zxsf5u2}GAMFgP~|zjSWI={I$#J}_n903Q1Wvtb0t%`i5MhKa%K0EvUdNc0;t{xCcT
zO1IG7H^^iL&=^06!RWNZf06U-|3AR=G;qBb;5-MX-&8@GV3_3g0m!at5Zy%jEwu!i
zEkOwu5^<n}iZ$+#{ReX=#DCuZKY;z`0QR51vky-H!Qve3NRS)B3?u@d7|afka*#SA
z;ts`s(8$ZoOULRz<oZVqWCu8Hu6$|lEV4?|2}E<OVsP#he(5Z-3Rk-ZmS4fzNv?aL
zc7Qa){D;4p;hdP0LpT%^it<ZKGV@Xult2x?ct|uW5ex%ZK4WxR`O?m5Z%{XwUK#=l
zgI7*_LvV!wtlk2712z^6X2S@O-(YMQ4HJXe0TKs^fqX}UFn}Zl>|uah{(|OfKu%$F
z-kjX;EV6PtnC4iu+W8NNziKs(c0Op12BZ&+LH+<UkO+KYFgrlXLFzzZfWIl}0-9ya
zNCh|S6(B8oj3Nr$#(DuV6N+JV1f%n+<X)$fp)0`j%+N3wrj5s(PKJiz@Ed6E32FqS
zjR@yJ86Y=9nQ#gw2D1Ys0TLtZx8T$gWPc%gDzF4xlCPjtQdF9X9-E*t88n^_vI>M@
zZ30GTtK+iHt6W9E^b%JF=b(gb&Z}H;rDs@Q4`c?(=^17RNHcN%jZ7_u`3%xLM)wD7
zK9kY8zt7TnZ(=K$-k$j1dHTT|=e>#lal{*F{t)C0Ft)D;&BTG3a006sq$|Jxvje1<
zIDh!%qk028-US(r1sTG?pa-EC7@bWR7+kbviomp5azB{XmMOy4mq!{?h3kWv19I1a
zkH^7W5ZmG7aR!j{L2R&@YRUbeG983LVjy{tVh|go52jW?D2^pRkD&_5F3{K%vfE+(
z42T;*b66lhNF0|1+arr}E(<oU0oMnzALbsA8$f)Jdyw4*HdEp_s7!&6u^`KX^dY(3
zfgw3L6_48uKz4xa1expn$Ko-V{seJ5h)+zogVe#y0l63C1`r>_Ms^#_Y><5*j4lt-
zhvfE}lvIX1JZ^{eZNcH^{NVq8u=&^fEWz}H|Nn_{`vZ8|2ai{S+<?>V*ZV9%?gn83
zZr_nul!?#nMj$&t=78OLEHo5M?|BSP@6N|ULy2<xvCvSMIUx7ob^D&j#HRNzC8-RK
zc)}evUIPjD)iQ-(w=Z0^8ceU2DJ076t7Qs_cKbrqF;L_*1@bc@&BPm&=BDM~aXWNY
z8dA<UPbfSFc5^!e1DKvrc#J5wPbfS_wA&%${zT-}_#6Umhm99P!ab|-2-wZxeHLIk
ztMCX>ZqF(_LbTh%`z%0d6of(P3s1PO$VsgL84D}Z(91|OkR-?)kXxO8%jALStD#|F
z`nOCTF>VLxgP8+z4=C<Id=MMiZD2DYW46SE`;*L^6ntf*ImiyM+d*ZE(c^As5H0`z
zKbSUp+)dE!AoWI%yJ6;l+>6ugAhq(~GKmPcCnzu!fENnl3U^TafvjZ&xfK+CU>X$e
z*ZV9%d}7=VQU@{w6b6Lc4jOj{sRLn<TI6^E`5BQ{6JipJLBS4Q`vx)|J<Wj1T97z6
zy*u?;+ylpJz~de;-Dh!+pxaFt7(n_!hQQndas!Bu?l!QQ0grn?>OdG>9;6S+?K2os
z64O!38AjMz2axerAOd6#)Z7Vh`uesz&W6Wjakw3{whN>c;^%<J6F?l0IUx5O;#<dc
zh%4(Hi0w4rHrQ$ImB}Es^Ni!NP7t;5G~>j_a}0z*@`w0%P8{OnISyij)Pn2>nF+!m
zF(<zDWlmf<W+3(<zIB|3xU$ZI*v??L&Z`Eg17VQZp?RHAhvs!gg4j-cd`3=ue1;&l
zfKbAplGI|*qBvY>(H7<xP*^w{|NjT36(Mas5FbaFz{~@O2}m8x9FV=BcmeT2Y~-{C
zGaKY?5Jr~==|jY4qD5*&GFrWX5}$S;J3!_*_do6ftz`h4-^0M*JS8*?#K+-wM0`T^
z!OQ`>$9j#J1H*<U5c`m!9P7bP&x1j1n3*8^Ko}(EkfbGb@L#?bh`sM5r;<aGmIR0m
zRtrkCkVz?U8|IMYXRd>n6>~xIj+Yhl948zr1+ign2AK)MAh82`cdc>?ExZb1J1lt_
zcgV6W4a61@N}N-M(GEZf6ML9nz+qAijYm-19TX<jINR)~VNxvvUg!*Sj|09ifvAP2
zalB!o4K^397H^oKsl^>8NeroZNr_1L9=$&XUaSZ5i*r8%gLB*eHZa}Dz~DUH*ch~i
z0!M!gG_eK^P6h_7eJ^Z%G*AL&0IdmNU;vGgf(!t~9pQd7Mt=<5AC4fi!2YmoU~o=v
z&~OIP(G3jFfs(VF({awZz~;xn+CgpsGmr>;VlX>E%0cP~`-5Qr*a>77*dI3=7@R&c
z1UQ4}+YAiOPkqihea1O930n&T)(&zDn1Mv#6NA|SQVvo_1%Eh$%mVqth3x@@v;2P^
zFfGEs;KKEDma_s*f56sxfwhyGu3&b6G!y3!jC2KBKY?5?x`NDt_+!TtXFiK3;Pyzx
z;|VStA5VbzgvwDDHi$l$IUsl8Dl=eag6sofuv#4DC`heS1-QN?TxNjUPH1ZJlo=_R
z=@}(RWd?dX#|`Eea9H#O&IZ$gqHJKgFK{-FFhSIdAouhI&W4!-@+YW%1Mxv@lzI`Q
zHc%8)48i@0EDzELDpo-H1cZ_nFr+eo*2lx_0>vk+O$jm{wBG<kgX?A&{>Obz6_5K}
zxIP{S)io}PACKd3JIH<%eIO1zjuc9F?SFk-7UYIQ8dc?v-}}L93c+S_fd_TqZa-wh
z@%Dh*+Ib+g4sL7b*#*Ao0I^~20GSEGAhCm&k5oAJU!MqKJ4ruE1M$IZked}z&9ytp
zam67?^BqY3K$7OWga7iiL2Rc!izgs|fy@M9u$Ym>`h&M7f!k#V9REDFfBWJdNL)ZD
zS%Sfp!38z$8Ii-!3+8W79SSlR>_>J;y8^@~7=Hba`#|bo=78*VP*;8BAeFfT#6D!K
zq<2WQ2Hds-wH2Uh;o;|yw4~~g>@+Ko+I@?D?FR8dY_M8RizgsIf-p$z5MOH4!H=oJ
zAhzSjRAI+6bD}_Ou$$4;9!Pq|wXe$u9DYt#3X>g@o^ip|Le}cS-QZ-r@xPPG1902r
zfchHg1CrOjfz%2JB~M_;s4PGVKhRo9^t}z>^+OD9m(M`M07QZ6Gvqm{V2~ilAI`4F
zWnHWo7{Ih?{YU3Bo?l%o|9=E0NQ^xRjG(*<)k?<rHpnj1`i~$3K>h*M1NiqO1i`0=
z6*Q3MXTWQ3K+ByVgTM@sb^XX=kg#<)jLxpd<w5KC;WWs9XzTi6jTEGCh3f;k6%<Y&
z_k!41_a#8h1gQgIm|E=n5|Ym(<`#fDdPrpmcqkTRJP3o=R)Nd`yIJ$9A2@Clu7*0F
zd))7$c@^te7^!Ov!Deb+1&^0O-3y9aP*DeR0|<wM2)H|B>i>ZC2sbc*-64a09G5J2
z$Uv+`xC3Qx1aw6v11L`9T-dZ$IlCT*(B~dcbm7-pg`-RW?<)nnKm52HNFB^SAbW7_
zjR2d?wQ3be9|(ig;@TSlR?DV^q88`g2#{OR)Z*M50aDA4YA)`*5h*T^?Q)R0erHs_
zG6)Ez<a98Aivpzdh7!J!uy6tS$N8g7A)G$<c!CRKp9N9j%LpDD0~rM_w+<>rokH4s
z5(3+M0yg^>c&rm%-W~80E=SsXvLCkh1g!QWs#>Qt#($Cao~(fHJvsMy0?6&4I0Io&
zyg4R2KStVn@(RB91nMu4IuHh_Jv9490MgzQX2jl;lqV7l5+Hwp%T;jrBK*oAAe71j
zl}8F+l>8h8(hRc4+4Z=h^Yh2epnUCo^>ME=$j#3m_hJiQGV+nU^Yh2OAiF^RftHDo
zj0F;8V2FWG;C!Uyyuji**d2WqkHGF&VDX4*?pR>)2xJ!ycf^9^py8qH+}fw_?0Q_m
zIbEgz?2cCK>5Yu=P;hRAq)Dhd(Ca`@zZK*ZM(3!69WH8DE5Nk!)llan(+;_)T@A%i
z2g3Fef%K9-=Lxb)8By+n>OlPS*UsQw)9|&I@I^$R8AOyi5aho<U`IiSBnZX8=<NL~
zz(wl+MKCS$|G)F;lV4n<{^Obph3$z0YscD0LQYj+Rfx6#%npz+DBKDA&l9|uv?x^}
zvsj@Rd974RK75s2acYTzQeJ*uaz1zoU1naolC54yP^c^V8Zq=b4AfQ!IR#XAC^;Vq
z^#G@}O`##+w00ykgi2{%!TCrixXl6bGjvTfto{Mn5327$G^2Ck<aaJyt7d>{_EoE#
z5B$|~;aar{M_Pll3_&^>5Md1Ef+?tdU^a|^iNWjuiG##Iae;rmh)cdgc}8YVDo7>%
zR0&Fbpg|g<Vg<aujS(C^Ah$3uFo4F2K}=BE40d7QGjR6)73};)Ce!)!$!{(Ud?q-;
z12$F$(o1^YgW3VoOk8-7u{IjCk~1|0$0A3Xtd2&{_ZcAnfy-BqgdNTgA8&95(YGJh
zJD;6)$ob*pdK_U3tG~e7LE!^tAQAY)V0M6%gVcdi5dO4A>iR6m(yVxBL5Q}X1w9Nv
z<L)4*FgklA>~cOBngOP_hK7K{;9zJ7jxYeVNkIC*nAA0DFgrk+VPSwj7eUs>7Nr)K
z=70}jC@IQJ%u5F?iAGuk4Ux7&F92aV5Z(s@g~0`o-B1kKA;!SK=$!v6*m;&^5SX4~
z@zQzc$#2fHEM8&{0|wBU3s57-D04t|O|f_hGJv=+0Igvv&C4tVFN06XOh#Yg174ej
z+;;`dOMr}LboQV8&beM@0+=qA$#6dTSIfCxCIg4R{(>~YFvx8%HjKt62D1aC7Nic8
zzVXLxXh8~S<v(cAw?clNLLTTqj)KIJ<P3BVg6b^fzH2VX4siaR85-)MC{ySRqGeXC
z0@I2_tS11eR|L14K}Lbw;|Cu1f!8U3-0pzH2Ae5^+TTHz2k8S<_aJ=&La83V8GeJz
zgq0QOZU?RL0Le3g%@wZy52pF~EWosIJ>fMdAh!$G!_pvOxAXIX#*aYx7OWPJ+glnK
zz)R+Fxji4`aCo@0KJEp(nX&K~m}bS^PDdFt0J)tN(gp{a0}3-x_<_s?v60;dHj}Xs
zv~GeJw;wpz0G@Kg<#y1R5Xc&ExI2I7GXt6L{Cw34F#Vy=3|l(~-R&TKAVY|8JIHL1
zIuJ(p8_3T{Y37ds19({#F1HuL>;$_N)E}7{8tU8{8Uo`J<@P>Ep9AI|kQ+eeqPq=j
zW-GX@Mnt%$Szw+kfHGbQpQ{6#3+mI^JnnP82uU-}KXI<P0vAyrx5D&++zR4@-D_6c
zc7Xl;DG>XR`iefspT{16*kH96QPa#J>lZ%`B)tT;g&dMzGT3!8fX`ZRhPne}CJ2M{
zAG~@b*m1IXGl=aZZ5$2agV<oTKT+3M*c}USbVxGp0?8jpGVVIW$e0RZJG&m20r?AL
zCJ2MXoN$i!rfpzn;0GlIq_{^3zhaobozGi52AK=?<KaFF=gX^BgZMb&9ua;}eK2!C
z?r~6yHgJ%3;RLY{8JnCqr0x_1V#CY?xf_H*VxaNeL$cFsLF|2te(eD9L2R(v6X5<M
zJe?fkOASBxF;x^K@AxrQ)bY%mcn}-xW;C@2>IEk6TlefFNZ!fvkAy?L0Ay_fC~Y4`
zHP^{x{thSAUCJP}2W%FWAJ7#7&p!(YrE5UXy}%WIpm`LK*CF{H)UN^UiCzmWySV1y
zT6=~FKahJif%5~{9FQCAuc&ez@C?!eu@7k^Eq9uKIt;`H`*SV0d_#nZmv+*Dr2k$Z
zd55I`UUqf&_k!4<F>q&ewK}J*oO-@30?9jGK7aX;&S~&CJ4mey*Bnqe05{iOhBeRO
z(e_6mwFe$;e{^Wc&Y2)KDE*<Ub#l6ta%hGm8%X{@Y4J3N{qt{u*aAZ73;r>Hj+sMV
zQ-hNJN<p3mr3Fy>1DOl<<NW{soo~n#f%wFvKae_@IUsu-!tO*noR|rogE{2%V&kE$
zKfZv(VP=Bt17VPu!=qb9hc-X@3S#f)=W+t^L2Qs(=Ow6l{ovs&&O`cb;4pF0Z+qx8
zcO}@LU^k<wJ&^S0(7uL#aGG-RNY-*l`f~_uE-1d|qvmxd!~bedyBx(q^81gNcOCEz
zgwEGwNH8;iw=5u~Ka}%-%3%HmyCL=eUoahF@eoX>{{M?3{9xum(rxO0SlbL-hvO}~
zLo6PG!VZK%?nSOsLHa<24M<!-C?kZi0j2E0Hdg|12j*M}ayz;b?#HNUhg=MHe0B!W
zIu=iykIv9@G1&10oS87@N+1m-s9tdS3}eG+kUL>)7!4DH*#Qy<iGkXi_~%L>eTfkC
z9t2{D2)(TaTEh)8o)K)9){ZZ58ssmn9bb^+4(l8VC>*qQ!1m>W;|^pX);SWWnV@(B
zVUV9dYO&9eWK8%cVE`I*g~ShJeg_n_AT1yaT7w0mLE}0KF7j9X!R3P3)iCFCkNaHY
zuTtgw1F)I$SHbf!Q1^o7dtvhtAp0SwWq|rvuE%9uI4z!l^?+#5T#b;$6XY<2ngP-W
z8yjMD4nHpAA_SgS1c`&g5YOC%j0@KelsQN|a}!|qfWjJtL3ZPro9G9*9i$F~L2B{L
zP4q+E3oom2&rM`<@PLo=gU?MM`;|dJDANG*+z*twiCR#gfZPNMSLg4?W#Kd^d|4j%
z5f#2HkNaTefc%Cxd>N8KYT<sv7rr3(fZPVcAan7BFS=U1;R|su+zoibcg6n$|3UkB
zU~>~PE)cz7?+OTIUig3DJcx~yk5JA%ssl-a+z$@dJAGDg`rPAw=XZUUIKme;Mhs5B
zAayWvK;Zy7e+G801?XHF*m)OVv!C{X)`G(Q2GR#RF9XDeoudKD7tVK3)q>1|ox=gL
z19m=#^U=rs=xRad&%oqC=hDFRf#xoqvA6+dFUSor_khiPhq}iBWERXnAUk0G6cEaa
zF=hbw(cp1`6fO(`LRl?`c^-q#EkKG32IMlW9%MH(E)<<FhkAp<>tHCjOmn_Woikm)
zW?n`)zXMb+AiD#`29>Rf&O25u1nXJ0Y7MAtb>6XR4Yo8v#{7&7$SjbbL1_j$Uxhpl
z(g>0RhX<%%4Jz9~v`}&%sBPgQhP{kO@6&?R!OQ{K18O6H_#ifN+W~B*5Nh5>mIvtr
z1q?`^fKb+f#|`x$E^=HVyS)iy2i)zT`T*p1mg6#DdpL2{3o!G*?ILKI3^EE_FM!+t
z;(*+M>^88OEXP4<3!bl#<w5#Djs@ux5X$=V0OednjJ;>gAUj}gcm8hi7-YWlyU<WD
z{oUd*w)jU6caT1qIUsvMZUFH?Y-G2A&3p&mw?l;6vn?Jx_y{WRVBrKxyU5`VJHHDY
ze$Kc5gU6qoFGI%AKzyRyejD6A2052txP#0Fg%t>+`wir0M7U>{{QvQM4pKOwyS)`;
zA;=tXm>f7R4W_q4`f|<(j!P5e_5;UZdr%3xeLHGj4mn=X+`i!s1Ni6(q;N;+M?rS=
zfZ9Qz{spM40F6H^vUmdWg9`)pvWo$_OcU<sWvgK4v4Y)h|JeJ~0asOU+xd`&w4Bq#
zbBUlZ2AS!+2;63Zry1xth%rdsA?c;DT_*#$4-FpMKvygO{FhUM6)Q-s<MGUihvc9C
z0<l4AL2d=P2ZTXlcG{|K4#~b?vkoNtUOhDJ<2sNys7ypx>tx}5;!w|(N|5~ipZc>L
z?6NXJYyqJhjRy}3AK;1m4tU&y##f#eo&dSU8AL<*1mhm64rUI>UJ%<MxewgO2BpIT
zP&UkLkRL%9rWPiTtWQ8FC#C)XdLNJxHm?d&+6f{+=79Uq458pXOwMzU%Yw#GT)42;
z7Yqyxu(?e}m_C>}Aon=L7OU<LEOr2~53Suk!*Pl46%ZS2CIh(sg2%l>a`1{n^8~=_
z>GmmCYy|OPYC-M*xebItVuz;l|2b4T0j$=kbON`N`?Mb*anKk9hT85kK~57~>_GBP
z?d4Yvb)SKZBZ2m_a)Hw-+zs{&{aOx>{+s}*J@Dwyi9;un!Fv<H=>$!!(>nfwgY%M^
z!D{b5`f7jj1viK-Ae8d~bF364pLM~)2pncytJZ+?0%(5$c)S8<ScAK$pfG^xgP8-e
z*TMeTCx>%k;4z*<E=o#=E<Fb4InWpcDE>hDKp3p{G24to=bORn5%>LwyWsGcZ3ajj
zq}F*RYP=j=x83HD$+Jd~ypzeZ2B+P==Rs_+o6*!Bs5g|`w`k@<ki3(JqlH7gp&W<}
zRyzgNTqh&BRZiD#fX}Mke}w<Yft(t!8w7-MGm0C)(;TpJ3N$B%yssa==gc`+x5Y&+
z)CNpTg!(z3Fo<!H3-tpB6lP!kCp5gk6v$m*1`>f!3}y#NIY=F-FOPrj2<dDxv<Y_D
zte=LSo1;&#s~&hMBxoWYG7Shiiw$|69lRb06nEgYEdo3Cf@!WDPrz$j1aOXBd<VG|
zhDn|W1+8&`^i#p<2;^V<bHQZHvk%A_WQ;zrFkxU|0PP<JaT%R6j?1|)Cr<*=&cBY!
zI`2*Hb74;I!;zN0f;7P}$zhvuTn=OhNIxtsQ7vp!(o<oFyTQ^Kbh@1;3l|{kWKhmM
znh5e2IK8Iowm84&<8TJikNP~E_Z!4Gzv%P85vHG^`oI(@T)+$@0-qSn4v=z?I#7Bg
zkUxtRN-{Ew6;e~uQ=w-%rC=N?0xEkzZB>x5AUp{~fc-XS#}nt<+wM4n=&RdhomaGO
zbiTb^7Kh)!>!qQ3!TAZshS4B5!`LtyCI+(uBn}cI?6*kt`Dt{2Oa_?+_J>1gnDYl$
zQD+eS%2n1mVD}#953acU@gAxVOo7}2W*`yx#9(%Sl!Md}_J<$(85<yffDh0FnZdxo
zFa=68g34#-3!#Nz`bcOjs4j565E_dkKHft0fhmw%zzie;pBT&zkaCbZ!v640EXqbb
z84h+3BP@@Scs|usklo<;3)XFM-n8lr*iCCz&2>Iu5beBa)m$9@eht+Jrbu2F2(oL<
zs<|M|#Q7VvE(ERe!@lMZ+qgcYxr{lkkGzfqbRPi7IgHMZ+Yh?fHt>UKO9npY3$JZl
zY#aD+gadeO3rHgfgZu)bkug3om>nSXAa$VlCorxLKNb(V2Lf_F6S(3>4DMqYKY{Om
za(3K)$i=)t08WGaXWk$H2_%q97#OgQ??d%LR4{=1WFR)y@qMV7pmYVoAisgsVjthn
zUDCi%_!y}_#LvLMxCf*jib4Hk5EC>8CF3Ghcmmvx2GQp&p13H_DMofX%r5A;!r(T!
zbKr5XK9C_W_Z)<BK<Ysl#0Ak{vt<iUfYgC7NDL+iV}ta9*kH8^b3pU{V0%DfAhn<k
zqA>RU2FSW8up5+7)xy+(Xpos8y&$&pNsGrWXlg-b!sJ0}U~F(39*Y}b_JY)b^n&z&
z)nf4*$Zn84NG*s4VXzydP{RRaCQJ>;Oc+~0C@<nT!(mXj5<K1sNq;C~_wzt%LE#Aw
zGYvlQ*s=?V294bt@>$`CL)5tuLq5=WF~}%z`olYRuY)>Xd;rIt7BKgK+y=rRzvCOb
z2e}!f4unB!@s8a?+zU?|ILGcq7sL7`;P3;Dce_CJg8a%LAi4xpu7TLFz6@yY2{yh3
z5}ywuKyCv2hhr6JUyO_khz5nP;3{1EVo=8JT?D~vzd%Mo!`B|`odsY!xKQ_`fHc9z
z%0X<{7&_Q59AI<d;ec=K9^___KR_59zPRoz0Qn1x8({W=+yHYAXzU*9H@F*cj@^qc
zft5FixIlypC@x@U#3087@;u-Ikli5ngTl%An@ka$2DzDqkC;6)GA=COwQL}xpmBly
z{uZ#=|55kz<4fxx_ki36!l3ZQm)6nM;!W!i_aed<*ZnP`OKm`&Vu0Mm#Q;tp5WQew
z0nw$f@g(H%MNaDr!3sg+i=c6?TaWv|VF04fJ??jYgL57bC9Q+h!OQ`L185EjHh%+3
zpRjoyu-T8nbB1ugf%L)B7KjZ?b0EJs-$GRjG7C1}1hNA*4+Tn-=xRZ8NHBR&`h@8N
z&r@M>1I%8K8({7MoBIaU4Ir~%{sGwm^QVC5Qdk=pp4O4Vg+V}c8ED=eWIS?QAg6Wc
ztr_5bL^93?AamYe8Wb0oaL#R@l<Uryz~i?ddkClXlVG**xWJp%51^{Wo7U0P;!EpL
z_rl$PyIfxeJEH~>z6ig9!gmMA(@1R}&^!RB9)$`sEQT^bZ66iqZT~-k)8kSG(7ww)
z(7DFg>P@od-?l?+0_6or{f#moxdb8$j%O9;Nsk-B?r3=22c8F<ggwuZ<&H_<v<vIo
zqKC&)6nDg}>IJ*QYSk*RJK|Pht>?&cM;y4$!sU)-$nJ1@dh9XC9ZqwPOM=|t^z^tS
zwc-V27RW9f@v<Bw2P(@CXIR`l{HXBS;S7r>hrbk_IM{ex;_#!w6Vz}A*vv=Zwji$X
zSP657v+HqHXAO(vpzv^Jv3Lv$4`&VR^Mqu@i-rZLuYl|h<T*dk{#%e!z;k|}wi;;6
z7}S;q(;7J2nXvK=t`B4gC|p6|e&BIm8i)^KJ0P*aW}>yzk>x@9K$#h&Pe63p7myif
zc^%p9tD*7`H*h3R0GrSJ@dTLWNS=T#E|JWG>w}pCvKQnA5Ff-wb{p7C=8q`-9AtTr
zK7`wsgBNWh*#*j%$Zm(v)q%`){w7lbrr$#5{6KtS+zwI)aw{?6?)(<DY{%nv*d7sB
z9HYB^EzC}^n{OAM1k;!LEWz~c!jnX~{dVC=m^q-Z28ADp4`L&`4Q%Em)O94t@*sUk
z;l2W72A*(V2bBlMz4L+Na$xhfKL)Rh0P%@(`+?(fFmpie1-Svl2eFae1~VHJKOl@Q
z57LL^cF@{1kTJNzeLYALWDeL|%RU=0tqxfi;cVGwLzLSs`(W)!aN7ao29UYvZiAT(
zvJZsO<w5!oZeIc39D*m@H-PK_nFBVL#o`%=c6#!-2ShuwSUe-j?JO40VCI0_19Ah1
z4`QQ-JIHL1eISf357LL^cG%u-T;aYEWCzF`&^+g%|9vJP`mkW16^I7$3A){cfdQlr
zW)8?bAUA;cAU2BIO&AzJW`pblVRU(rJ|wr#0GWX&+&4kx!Rg&;cAq^cyq)s@{{z#r
z`|Jt2eP(DVNFU4`kb6LG0P#U=6t{!a=7aCtfw%RL<w5$8+zvYr9Vy&V=4&^D>;Q!U
z$gSXUEStxDE)tM3(nSaR85-#8B0&0J=78O6uBLQ=od>eMT(gwR@#hQpTq($GkbNKw
zQj2e01iIRTSC2$FPBsVc`GD>Zi2#`aS}y={E67X`28r3t;GW>%X1pH6KHz4&?hvDX
z9*FJivT7B&S|{V0rh|9n!E4+PXzq2gzn~4?BOoBU5;mWPEBs*f4P=b~=ng5+Ix0cP
z{t%EoIN}~WbPIATc>GHT6l35J1eX^M>Z;Eiq%wDb+zUMq2)zHp`SPmOATvSwKo}$s
z+7EI_b{cpc!oEenwt)B`aj;rp)HPSo{UK5ydB=~bQjTZlWPsS<xJOfq^E@D^|3LPG
zFi1c2JRlAb`+)iyi35_?!Ru87L|0-PmjLaD1ACT%fnh6@0nR(lpgsg>UCsh%J$Dl4
znS_Y&1Fh#-3N;0KhoJ+${YeW@>p5up1Gn8U_9vmK1?@+|xj*S7>Uam<{YhwQaqdqN
zT?MO0aHT(3Uk#l8oKMOWf#TA6vc+Ri{Db(!q(6{4Xb8g6-wOw+%$=b4gr+}B5F2JD
zDBeLBBnC=vIQJ(_M?D7`n*OlwPeN0RFa3f12eKc8L2hs|-uTZ+<pFrT)B*K1QU@fj
z{{)E(h^~U=Ph8=*6XtJlxPkhPp#4b|(6-8d?DsaJmw(O;kp3aeJ@)IhGY<r@g@W90
zNK@~o)2SPmKy0ub6=1dSvilIe{YmI*%_7*Gc7N0dndP|QW#1vQ2=JaFP#x(E*^vr2
z*Y0~@l*428wIH<z9<#4KbRh%0h6mgSLR0JH>e74YNV))6t&e@T!|5ms5L-ZWHSE3u
zT;aD19)6&GZlF89K>0Dw;xTx=4Kd*d)dw>NWUqtizjY25Chi8Y54p^Jd+1^C1P~i$
zCMcXi7$oNKSi<kny%pfSL;If3s|N8w;$XGusCn|>lK0CFnd_y4<ekj*(wt5gLe^}7
z+>EC7K+>Pv`x^Se<tlW468P?0a2&>g`+M-Pb~3anc6#a$KF4nV5<a~HA&%gEPXeN=
zVPh1?;fH*_B5Y0xoPS-oAZv%6I*-dZ-|4di@p0r|*f|q$eJJ5)6u;9^WzRE^KM#de
zbR2fE0-r4lGZPecAPkas)XKhd*e$UQ#NIEI_Rmo(`!0wLQVVhiNF4}+#11B0_BiCf
zI2put@?V_nY=0OYCKzh<lAWBr{)5lTb+BlcI}~;n9F_v2YhdGSurNVi6SN=Z7w4#i
zoi6%)oM2kB&j`FGNWaerT=-+IfqD+r2d3=n;d{2gd=LS0H;6{YFfo`NAUTj2Xx@`*
z>sAK#Ucx^hKS42Uy$7SS|4Ta;C3Yb&EyFJ6d`kV2ixRsSj<9_S)eojX;R9wM5%|Pl
zc7T+F)Pcel|N0fT%)AuP9c%eHWr;~SsS40@2^13Zz;|DQrj<eGn1I)}KrU>9Oge)u
zXM?RefGjwJuHk|8`#??rO)Y|G$hs&2t!1EfQ7&9stDN^H_qzya;W+Dt0X)V7(g?yJ
ze}HIYj86<^2S`0g9pNx=EJ_94Vp#-Qz*7tj2$0`Eo`;49#*!ZJSro8123d6oM1b<I
z^ZBcxE`l2lgK54EtDJ9ebhrp^z~xua9!98E$Xqd;17(2x0A<1{m>A3skOWAKuwSvR
zg+cbmVUSs1f6Sg!<ih^_zB7ns`M%0|d8WM!`*&RaxDV9_ra*21Gmr>;VlX>E%0cP~
z`vcqBBu3aB79e9_?O{gea@{r;Mm}Q@?fgfk!FiiOj0+>51CIQ67o-`6NiN&Ub=yF8
zfb_%sLAA0Cye1D6GWbm-<5E@7dMM<43p$Ge<OR@qF#*mmA8&Nd{}teT_i=;s&XZr9
zUp{WY5q7shnqU~@e;6A^;}e6~0a6Q62l6TYvda^?>@GL4C>wIn5-8V#mcSy)D2$8?
z@+)$Bhg^gNnopdgwc7c%#v*4BeN`jWdHMGW=i3@M&VFOK334Y4gWL;a!)SbBFgrkM
zLFx$m6(hZ)k7L5eAHi+ZC(wIyK(y;|Ip-%t-kb9Ty#EH|EO7q>#5nM{&lluI5ZeLD
z2A{_WQ44RIA<Kh$*)V+qqH93s{DP#B+98mQM<78428L5mn$g+3@VN8a+8<#0d0nWp
z`wd;^w{^JU;5t+vn1Z<x%z+a4#9(%Sl!DX|jst9EC(2o7r$J_c%g(Ula?a;1w4Fip
zVT-HI$CCS;&s$u@k#DX-^?@mp%N(d3Ak8p;;4dM_SYr*nj~0H&UP(UEvR6>Z;kS{@
zG6}go1wObG9JU?_+nqNuWI2QA)eH>abG$Y}HxOaARWF0W1%^T417pKzd}1&=Kx#qi
z2>X=Ov&<kR6_IC|odvlA90s5@ls!)h!Rs~K9!~|YQ|);?6-WBI2-OFs$Xc)2_87cY
zl(u1zl8$jZA^5yN2IRU4yonhc2E~(KIY+Gg;0&T2R;_a0{#U~}0@wM83^09=FaQ-$
zU>1S^`3=E?uwY^^J3yi!F;F_dUpED%=H{2BD&!{>=jWs*r{<NwswU9k)e8AZS*gh-
zXg3%_{EB?u1T5Y_^>C20jO8BZ{9i%N0v4~p=eEgMyuuORuyg`)E_l2R%s?VQen8@a
znJ_V!9UwuF7-7GH*5{IRZrdf0+2A<zpZwbC?D1@85WV%dwDZZo8ct`AOXKhttb7G)
z2e}Q*KqByo!R!Dj2dN|MFQU(F1Fg?PKYJZAZh(K?@imZJK;hujR(RCKxquN&+kIeg
zp1As)i*o^vyEYkMbv;-+$@d?F?6QL_{egu8jn*B*>SvI@PP*6@Fgdjqf@$Z8tIvY?
z$YU<p)*ZvtgFOlza|W>wEkUe7c7n2DW`e>Kgh74-sfEdd*f4zpqHAC!0CJlIc}+O1
zEz9WC)vW7cJxLi%n+s_>Pgq{!Vm(P4M;e8-CqdSM@*b#t1ZKksn7d$n5DgQ9*#Q#+
zrBP-^h5w9Pj12!7*_jv^{xh;6k7_X};po7lor(!QHwERqhdUrUK;h(+P<X;cC%7L*
zJ9qF|x|jy{BgYNQeb9B)Agzo}Q!Ji<)PXo4b3kf9YusS#%Rp=2VC&AnW*b}v?UMq9
z2fS?wTek)>1Gb(GY_3i)idv9au=Q{tJ7DYNoa<zYKyC-w55gcffY!Ld<UwoSVEVxR
z!r}&)y&yNh+yge(6x9tNvta%K*#YyXfaqFSjDXj9f!z<$3o?>HKy)pvUkXcW=<9c3
zeNIMjI4Ray!Dz6Xwd!!KkA|;l1ly@qhqgW%`}$q5*{c6QYKe;rMX<SWwRqzKO)V&#
zaK;4|H{gs5h~MCDz!Mj+z8xYiAbMeO0b6U06c;FK-R^-EGBAMR;+2cs<#up*iC*q=
z?%=a>k-LoboEcKrGJ(yMy9_#C22@6XtVB-}u<;a-J5IQ8ZI=b>;o2?>P7}i0<%r6k
z!rM{Sc7XB@EZu_Q5tg38X7iha)WX9U<S1Bv0I^|l15RsP+fnY>1(^lQXCOOZaSqN$
zXln7M2`p}a*$Z+5%spUpA%26q7k8Ri2Rj=NktQH|K}IqNh^~XJ`NowdK>PJUYC&=F
z%7r5soF<(AEtdhO365aur3sE;d}#tURtR#(Dd!h?mQD$UU>cMroPXsJJfp{Hip5iq
zI*?~z<s~S-aHNS-&L8tYcTK{>7^Dvt2Ou^qZouZgKvjz`O@Q1EvLA#AmD$+b0J9h5
z2AF$5X#(muxO;J@iS@8M>tSgEIb0Y7MArv^%tl*_0&6pXq`>zYfZXr6q=?P=@p3`O
zC50E9FD{pL&grvue!Lv(J(i@F6JRqRF9+o{q;dkKyn^+OKxyKI^VvKdP+oT4oo5M3
zo6cvkrwLNs0XFk2IDV1bfzqCU&08=!uW4Wa+YhB(cpMmTxdXX9;k>m0tPT{opl}7H
z3tVXvY{wC>d*E>m(g#ZmAT}(GfX&^Fsuow;bYVXLc00&^5C*vcS9t~Y7Zx|b>;<_2
z<{q%Qknn@M7f;%Rwavh36YPG7UXYOt0-_sWML$w`g%TIA`8iOUIN`ixIk@fs(cp4o
z8}_t`92cN6-gz4&-NC{ES6qP8##*pixZgkyh4~%ChJ^{(+$E@Lam58VKclI|6&GNC
zVQ~Y@UXUAL?g5(%@f+N|xZ`32${K#K`yqNkMuOr3wk`xIE>Q9(ti8eLBpF)lydY1@
zNisCTxi8Psxh^!^c>$I3C&<hN;53euKT+HP+p7vn6EB=Qm-B(+E#J=qTuyW@mw_cJ
zkjFsj9z>H>PIN8@oj---4wSSB+dB+$#|dYrJ4Il3INd1%$6?x?B5dx!NSkSQK>IF1
zP6YQQ@TScWuv&OrgEYa?0*DPuBjC7oLRE`5ZKA2gn>Mky0cJ1A4KVkB(<a1kaQEU)
zn;T){>fmw$?0$$|kdX`mq8qWSeMX6kH(-U3w(bdMQ9n?70!)MB!qShJ_QVrsOFvK>
z0b~^6xKIbHh5HSp3FdbY8x|&Dzlfr$#TyrBYVpPe7B|4`1-Sv{9&lVh{04U~p11%X
ziUr%(26jJ0FUUv+0nts^))XVRCtzm@fbzvNXP!F|pnTzUamNdA{^Yq+f-PT=l|Omz
zfZM~+JPw*iLUzYHu!BMKVQU&#oVP6(0@t-mmdk?cI~;WfsqO%q2`xtv?m$VKurnec
z?TNlTE3lrvJS(s}7UU7^6NBr`1$m%;F33xG(<a#L>0q_+xCUv0r3DZhmPWwl_Mxi9
zl{UfkKAKuwX%p-(EN+0=3vvU@Jz#SoeuKLgciP+p+n)h0C&2E9=mi-GN}Jf$E+g-`
zgbWr!(gcHZzMnNXyz>35!EWwcPOvWuwzG3NsDBBvlW<%#fYrkN2GRucJBSSn6R^4Y
ze%7Ei3J8PJ65hB#Q;Rn)u($zcFUSor_kiO9;y1W^amU5x1dv`>IRSP*L@!uaKy)+g
z{5M?f3D_AhpnSpNoOUM)92ZV^%D{1vcBhOQ<pkKwv^(H4y+L7$Wl!KIu!BKq!lTd8
zY0Xt7XOBKhC(l(IoG-Y`I<2`HK^1p^%v^I7yyq0j9k8{gASb}iP-1jeWnch}1%hd<
zm<M252j@5@EPUbmK!(B6(1B#6Jzq#{u$fvhpz#2BTst7igY<z4Q;=H)L^s3Mpup?`
zm9@xj{|2)YY_4LmBbb)^X9=bilO3^zAyS_d;&#PkN0>PvdqHjh@j+~4w}H)+`v<D4
ziEumInYi2zI~NS%2GMsNVDp8yE&<b`?>dNbyXZSudIy&Yc-=0%6|}~a7`J0t%Z+kY
zJ*=*VxSeb1C$O72a{0hC*V0c!xt(h%JP&}v8n4?qa``}M3xq*xk>drV50PfJRDj|R
zDUQ+84D9?lMrYLscjte*c7f?%9-qMUzg@csyB(qrY7c>Mk8pSX<pJ_1G2sqNG`P|X
zY(5_x?#{c7V?p8VyzSsrFumJ2may9y7(n`nb2|eA$ZSxUgD`<`ht+Yo+zwgE4Jz+c
z85o@NBbdN$PAe$_)A<ohM7cdb0$c~f+yjbxkYCW<1~xOT1k}eNBHXuPSv!uL-a$ry
zY+-<eyHoEMu=$p&QoyuRFUtA;Ah&>3LobsBxfP}kDo!BHFfce<t^%Fo0J0dY7I%8z
z3cI5YN4PVB%m7&nal7c@r(n16JO~BTqKBUn74D*k;p0;v|KSaHo(G`2kU{nmayzIz
z0=W&B+u?ET{Akr0=X^f{FrAjQ08Hom84z?kR3FF^P(0vuJ4kI>7U=vDV%!d@!$8Ku
z+zwh72kQ@ltO8GOf*4NAFV(vkU!DY}buUkKF7aRDVtg6bT9cz7Lt&WIGYw&Ofb@g>
z3Y!1Kzs|xFbpBo{>>M-&=u$w~VhhlDXpj{)p!Ldx)&erZ*2^<GYk~HE?KK6{ntK_X
zom^a8boSz!kB6<91vwiw?g3`Q2#{Z3Y#0p_gV_NR2Z<5(Gsap#P~5@hy+Bb0pBHrQ
zC_L?A`uqWyHhRI}JYmT{7t<HG`~h394RQ+U{s7r!1R3rk&L7y;(=i~YK~UWXatk9k
zU1<D$52ls=X@k?C#y?zh@UVRiAiWG^r9q{C+91uu`2#Ht=H-_tl;p$D9E7Alg~Xhq
z)WnoZf@u(Tr!b?l_HkJk#pe&ewA>2@XXk`%E{ZtgZZF8aFbr}xj18mliNWjusRgN{
zLK=k4i8DHP6drfc7U~Am8bS@u6PEmP(H6qBhIlu~4KNIH3yck;@rl9g0I3D3BkT{X
zX%N;Q2IVE>G}z!GeR;Xl@=Faa5|>vym-sJpk-oedTu@@JJB00b1387{yaclYq?tH>
zfR};f=9gro7J>F|C=_QFm!uZK%0cK34Ny4&$)F&E85lurQV@&LX`97k7a_CfV4BBV
z)HzqC$VJFp6o=oSr^SG@lD=mFW(P<&aejm5FNl|*MLf)BcuRPYf04^YevqA@NCl^N
z?sQ1r;>dvHE$$3l<sxkFELc0p&0q!+flmx<7YC%715!sgO%g2MLF>&xwuAE40T<yi
zN#~Bj11<t(pz{5*i*Ok(f57&jgY=S|CSi7fG!y3!ta%G*eIuhF$ShENI9+Dl;=&qS
z2Bw*Ur#Z)M<8omQo`xg+!Ok!MYX`Xn%s?XWiNWjuDF>+|93POp1=(Z(I_DRb_Mo{6
zvThS;?HD5{-GPi}befqX=KLkk8%)2;3w5q;y6*fX57&Bj*qIn0y`Xvv*5?58K?KOX
zAQ~CN#9(%S<UnGC{S}^(SfWr;S&*ubp9bFG1-f`Wvjn4x0`GMKofQKz8Wdf^Fou)A
zOp)_T$2(y9vEyo|dk1rzUpnF{6JckqfVG3%2xcG=_{3m#fRuyO5%!-`eraAxVo@d5
z_(D#Hpe-XHV;P+*`z)MaI<|x9$BrkQcm48re(87uM>>R^*#pu`dVT`g_1F;{uEhB#
zAhjqnKP59+Aqj`aK<N%P<^+l-F|flxeby(dRy)6R{NW6uA3Gj*{to6J$Kfy7c}`&M
zAh&@TNCZAHm>nSHAa#V}$ulnxqpAYmMFZ=jfczp3G7rQ6&5JmHINa|f85-vN7`z7N
z1c;BLF9j0@&8vXb!OQ`<4a9bMjJOx$psy@=A2-<S4~J3KARgEoR&tP!0el~#Lrt-j
z!``q`kQrdLkHK@V@P3!0uPivNgX9ltt=fzj-`PgsEG0(RnR|@Rr3?(9buwW3tZ5jS
zet~_y7-_r+t`FolP<Vmeu+9P;mLRqx5*uvhSyRxxb_lm4$sb&2@c_x~SmqNMz~(~i
zVw8l?42;el$$icr15bcyklP<6_k;Mb$N;GWxdlWsAh!O)^+CnK{cjN4X#xWiNIl3c
zhh}Sl<H#9mCdiK<43c-eR-189M;?6c#-Y|FCqaCWI9M&3KSAbz%m&FjK9>RCKMP_D
zh;D=J6-VkDgMtU78iX08KqSac$7|df&JUKmf$1yDMV-^4*_|IO$JK6H4%G*yKz4x{
zNCZAHm>nSHAa#WERZuEyH!EaYuR<EA+|U8HpkQTUVqS_ua(-!E38-RIKy6LI)F9V$
zDB&OtatkONoQ#w-o#*Bif$52Pj?NWID$aBB9C4H{h*Lxu$Y?);?3$Pd9`hc!a9}{L
z@4@S{z~Ru%y4m@7-c%<LeK1ekxiOl}`FI|#ek$yIM{qEL`~qem5%|Plc7T+F)Dcb(
z;C4&_tP&|mEGo%MEdp2kXfX|{M_}WjAaB9v?VP$<H#%=#whT-!U#<Z5-{$2CIN}+0
zRx8MfB-f8HJ3yL=^Pgw20*3D(141zWp{8$)h7QQz$o&O*klmmFa57+EaNd4?KbYQl
zfx)TW*w}gd1zhcH*m=xg?I5><8At>^F_;}7<sfy0<CS240k-yl(YbZiYLGv`^u`Me
z&b@c<;qeFfjDC<iKp5l}5RHuSiNWjusRyYe><^6o0;uneT)!xS%mT+pLg5MLwOy;7
zY##SJFE9-Qw+YsEttM2zz|_Ia0l5prM!p;Cpz+gxAaStSYr8;gJW!zru8R(YKR9<#
z@x?TdynX*`ONa0W=Rj<*+68F!sPR+qh0`GUgIcSWf$A<0TR?O>Y-|KpzkvJ+n>zt{
zPYL8E5CdF)uI*Y4raM7vI+OcA{>I@?n0b(T6ykP}QDC<pM5^PE>pPg)Ap1ZV<VIw9
zkUk{0dw>i?YHxt@402ha43%eeTF<)4xox=+m@f4*buQS(<J`7f3P)K1yQ2WC9pnZu
z1Bt*V2D1aC9HfqLS_7Abd8wJ{8A<t&5tEEe_<p?PjLe*rqSQPE4W;D#(&Eg#VkPh;
z3!r`itTF`o8@Bcq6l^LWyFm=6Z5B_Q6K*$wX^%Ulps^I^ggd1;{5=z@4@`mF4rU+`
z_{3m#fRuyO5%xFetc#@lk_=F#5Av9TpMMCfbSz3u%gjr~yuJq9|AU=h3i6^V$UYFm
zX~BGNXJg-;U|QPG+PVCtle4j(H4eW{hw1}U_6?A`fWaIn0rCTs38!FUFgrjJATh#z
z^(<CMEK$fwO)M@^$j<}!a!WE&b79_vR1Iit9&B|2DEotK1z|>Y5DE5srQIB7wmUbR
zD(&Vt-QDrpx#i0OXSO?KIQ$OYKMU1MdR+*$1Eilgztf`a$AFyAVe97^o%a}<IB#Aq
z2&R`WmvmuCOLN}5ToOk(!0rqJc?C4a0lV)V%m)!5|AA;^3=@Od0g?lW5l#bC&*z#T
zyFu~qypMswd2a3jFg-EP(uKK!!Fg_;B@TbX?y~}G2e}>0KqByo!R!Dj2dN|MZ>r>T
zEs%X+zwVeh)46TgZD$Z&>Sy7?W^Cfzwp<2>UqSt5s8(?M9ySk(ECy%87$ARv*f2Xl
zY>*gXztSY1gXe$1eqTRxx^u#vE6yO=<4%za*JdN<ggZqz{0_Tk59EAMK1VJ*U}9hz
znE?3{#E01dVuQp8`<*8F9C`i&wzdG2&yAdq=NUNfF*b5Om=_Ap=f`o5Wy0=P1bGD%
z4qzIY0QnD@4`Rc_V0OU72#13!=>9d(%p0^4Q>aYE9LPj(XX%2>2gfmJEMeCJM({Yn
zwmeHPz3TxZ!FCo@AIuz(`*E%<0IA)EI!=UpUBq_S`b$`w4&Ci~Fgw9+T~hT6OfTRx
z0@F*Xei7yNB~`y*<`8uI0!|}PSb;D|EgrYS`cSyst`D;l?AAWfPhh%pi58gd6D7R<
z3KW)oqM&t2Afv$TTfE`kxdc>}f$}0)EgrYS)+oW;j^55Q1X&0Q1LvZHIZg|%{Rh*D
zt2Q|A)@^cHa5Vx)xd6Kx7pxr=eqaU?flmx(2S_<c9pU^Clv<ox0v_qnfwgz?@=G!@
z^U@Vc@)eR&6;kr^QeiU4ZCY5|fxHNcZ;+LY&YEZVom~Q_fN6^$F=xlr70xa}xX!SH
z-2n~KOM2c1*<}#~9=j&auLS$Q;EP~E9&*+^!{IFMyB$n(`&l|WrY>?8_rq0Z!|vfG
z*B>0t+~7S7;4mN@X9WEL+egmm{8Vd=bKm{_V7lW0gY$>)mCk(+aE(X6?r|s2A0WFr
zAl+~(#fK@_A)tAQr&_C>3w^gcgXmO0OXm;YE1U~)#z!MmAD9BU1<XJq@QK0f04WEl
zqe6U`fy@G@tB%6s&KZJkp!EmNF+!ku*k8^WLb&3i9;y#af!qRSAQAY)V0M6%gVYiB
z2gbMxs7yo7=jI@@!2W1=mvy$fy~7zq>)k1G?ym}Pw!+!gsfFqTQy{m18At>^F_;}7
z<sfxb@CWR?YepAtc3I~I%MO6)S<7Wz_!YK0FIbN2KGJHC8(<jZ78n~w;}e6~0a6Q6
zM+JX?)@Xx_gZQH>_YT;OmOM+aKe}-CF)BftU>M{U7#l|86NA|SQVUW?hCe`O7{JE1
zK*<Td_r`@UrpU$MXqfXXt<_GeKc0Z`akNn&XXh|5Fv8S<+ypWZ<Syp|r)!Sg+(jVv
z;kL932WL;<1F=DBoi6SGjmg04`9o?34-f5MmIjh{+P^H#IhF}>jy=d7Xlf69R6V<&
zyYCcO?S%+EhmWeKL2Q_tLH2_%NX+S4)>Y?n=cOR_0f*@P19vaWg4hD0J7D`eVC@I=
zb{lA~3dlR)F*<OVbR_qIXps9sG>$NVnFrSgG6d!x5c|;EQ1HF&Ahr{f4Kov@4unB&
zM3x7Q>%sI1i0;644g&JHq%BA<$Q;m^p^NH@ComdpkLrpiM7dpc1t^X{MuFR6AO_40
zAU2BIA!_0Ai7b!icG!FjES%88-43J|?sk3+h}-!!o`BuXuR)yK`89}lJ47uJZr=$y
zXcpu=WVb^qT#zUOqdk}c)t4O~k2{Af?so>!>Y`!J6WwJ&d>r8p6J`Xf4_OTBm&3!|
z;c6&2Z-Bz`;A|^5Q2KzG2?{F^28lVGh**EH<GB@xeL!eNl*5ULbs#oat-2`6{4vNJ
zkb6P$juVfA=f*&60nweHHQ^vBWPc*3FW3=K5ch)o2lb~5-{L-Jb<r@Ghd_pa%mmR$
zW6^MZP;t0Fv8OMHnIJ!cFw8ty`U8atOrL=0PSCn)kg>Sj4xWz$nd8Ev+~?fTwHi+I
z#T0?~gxn5O53&Sg4$M8EehrKb>bHQ{pfn3I6QmA=L1G|%FnN&MVfq9_cf!sSz~y!)
zkY12EU^h$;JPxNpZl4}_oG7<X4}_h41rK+a8$jm6+y-_#L@i3*fXSn}eHUy!1hU(a
z^M*6XY>?ZXr|x*-q$X43_`1&uL_5!%Qv^DX1BcsT!i*qwAoVbFU}1Ua26*fWEbMH#
z=Q&6mW;Vz^5C(}ITEE-X>FYx^5ZkHRF!<2=-7X+DNG-^IkU9_siGj=k83<w@7MCdk
z`4z+#5Zwh?Ac)v=fnI*W_Ifjd=bHNREI~BL-5?rto&d~4F!Mn)a^8TcgNlRW=+GhX
zy%FI4i4!v0=5asBY>>M_801D|d5}INw-ee2;R>@8v}XfUM}uiK8Svg25TB6S!RjIP
zHOMHi+Yg>XxZM$n4OXj$dLIF@JV+ms+hJ)5Iej6QNp2tuL16%H2e?{10n_XZ3}D(7
z=N*?Y^B7_3VCI0r^1yMh`@rGufW!u?We2N-=M7|ekUoUlcZ1JaK#F7ZGy|KfgN$o|
z&R77An`mXN29L8i;XG>r;dYRE$T<ffM?u0}rVxBSG{_&0NNli~T3IObrO5IJWeSfW
zxgETx6OY?HK^B6;9pnb(0}LSZoo>x30@2RO2N(#Z8K^#(IUx5QTnD~S0vzs+NNkXq
zAhSXCfiOrdvOGv1lG~?1&4h&$DBNM`2&5f$mk~JJolabZw0lA6{ZVp1h>yeVFk!ep
zs6F6tcie-xgYi)1lv<d3z-~uN?}x&eybi9b2j5HKxUT-GBcI1Hke|Tm3r#J^4yVc~
zwIF$rnTOJ4ia~4v(cQ4N4$PmRb;s!ET!M$Y7*Nl-1oZ=8<CmcD@B`TaVmP}!?sL&+
zV1U!-3y-^4AQpgu)Pd{<(a2|hI7dA01F3_GgTn*YnIB-YjX^$Pfaf8QKG=S35F56S
z8*DCQG!m{B*Zy(mV}-{-ZU^}TghB4awSU|h<S#64fY}Rj1I#^Ob0IxfxEpZqAKy~|
z(hJ`|jv6iu0-}4c+@Xeit^%V!R6nEBgu)Y`yD?$3^90aYigO5`zp@2%UL^P~dyr9h
z;{t592Dq$)`wgTC=64Vq7A8(0bJ6b8#2FXuGDRS_gW>^%@x}$nUs&7#vlrwBn0uT-
z=IVg`26r#+xY!Gu^9Rpwf!z<$3o;TJ!}1S$zJQ%E#^}6o)f$k0V6+R{)i4(w!g1le
zYSkK$I;drM;{t3pmT-Xi9b^V9Ou*(685b^0p<y7mgW>^%@x=w$Us&7#vlrwBn0vtH
zLc)`9Tu4O!VSu!9!Eph0KSVFcNCp9k7*Je+&Va@h7lB}fptEp7LnB-y8W^0Qv~%04
z)h>!S@8^T>wR7rQwFaaPW)3JEaFtPDv%x(h!etcLTnW_j3}?Qm4h;jj9TX2B3~~d`
zG797`EN;LS7tSDa6;a)QGhax=Y+${{FdJ4zf!z<$3l16qiI^J<46L9w7E)XwpH;;e
z3|0t=3qDI`7crSkCq9c8E?hE2&eeU^E@Ig4sw4Fb8nBsS;Iawa9>6@~f)TV27~~X2
zr_j)17q0(5!STk#z~J1rYK;pw_IitCcYx9vbk`p!zOc9h)W3$gqs;mLaRHD!oZlXo
z1G&Tb|8cD6uaM&okXay$aJVBJBnL`YPNAV?&M*5k!S1-;X9db5&M*70p2_13Yw1BX
zgQ!EGmIR1_grRnV^Bu@6kQ7u5)V=~IK9Cp#10&2tP`s2mUk-J13Jnc+J{TGXcE{yV
ztm6b^gh#mZ<xp_g<8VhL#61ikchoxX>C<uw4UKnR)n^Tkmpy&fum&AS9n=g4GTagG
zyr&O5ZU{94Jv^d7=7Zy<&*HQ5Qj052eHKrgCtEym?(eg5UW&bsLb5wRW-bNayNoNp
zL?gN5lXG9;PNzPL$IcaxCph=_SvvPo=RR_<nSF@1FqZrRy91Zesn6nrbAG6mQ=i2n
zXYbGmusiZYsd6?A*v$M;a9YF>FR@7B@!r|-II~lq#Y1P=;|gGRI38D^O8Nkq>3AHx
z#utY>Qep0Jo^f2kMX~<7^Ni!NpnAfEDY+k1XHml)U^AiRJPvn&?@<S(Q?NV4WHP~e
zxMYgJ?x0e+4mK0DTnEi}A@3_shlfYfhG-YF26bl;ZP38re6Tyg#jF9>yj?j|ADDvr
z5zK}W_{3m#fYgH25uRUx?t6u-Xvs~@D?wSSp9tRu1{OwNxCrtya-S47zQpMC<c5KZ
zwv0ZQR+Y(iE@R#3qAimR?#N;8V=e``7luLZhOuEZJ~5abAhjTMMEW_iSRoO<lpnT8
z0k-K4&7&ZH!uqM8q?HM>3&e0*<l^q4z@QGMr5G5T3p=`86mZ@X1K$4w)e9@%U|cW_
zazB`XM8L#gc7UWnVnq2fw-WA01?XlBm|r1Lj<FIK<X6}{2gr-rAp1ZJC+ACzF2XW-
zU|K*X)HzT6vWu_`u6?G3P<>zu<X$iXiNGfYvje0Yq>iv(!D}!vc4p+|r=TxDLHA!S
z$PTdoTFYx)I2cTwKr|}@gLD16Pc9rd<1!zr4@`mF2xcG=_{3m#fRuyO5%!;RQEFmI
zszP3Bxq=4Fo0<wZ{D+)Y^FVfh{kO8b*7?uz7$*?@;kdSQ?z>OUe~#nYHv|h8uy&9e
z!3-n<pBT&zkaCbZ!v4b=f3Tzq+Bc?AjIlf(yk;CZt-{7F7@cZ5dYm8kX@KdwecH~A
zM_imA_u=v@ERBPlOY(YQm>nR^#Q7C_T!K6a-yHy1Erp&|VR?$tsb|$1=d+=0VETAy
zsB=wdnDg0CTzL^zUV)rQdbtC#>p0}jHsbsTz0(GIQbcB6T7FS(Vo7Fx9xOf~zQf$p
z4myhp<VH~ZO?BSZXYW+gG1YkkIR4z6x8aOGSX~R!OS=D{c7QaK<iDKEyzF9y%sd4U
zBQ-_AC$kuS0~5rDp!h@H0}d<y8J#||ZgB1>3<T3ng$JB-w{e5cKEP2w!rE3KCz9?z
zkX=oM;I%l!`41_5Vo8+HJ6MtP9r&zQa2d0~;*oQ5=msYc9UkiE+|Fm=oE++h!(Yi@
z4?zi#+n`K1g-;A-2S_nU9pN&D>~slhpD;Qtyj1IKdfXgLYaZu!?pl7y+4ML+4*w;B
z+y=uSH^SI38lM=<4v<=qI->mtN{)onCG4&{P_%*1-~=(8epozno^NRZre|8bcFvM1
zcAjtX8i)VlL2iR#kQ-ra7>!R1W(P<uNF8DSA*D;qiVwZN3TsD$#y!`&aQ*)Q9-Cxh
zU;vK~QfXWTY$pD3l?ssmKw;~=aMgO}{}xw4dYs={JOR1G`9F2~&0sVC<Lx)Y)@^~q
z!}&$wcISnwRy$uSJOOsci^3CB>7Rkje1W&$T!j)I7gx;&yJP>VHDGsKT(yR3?zp%L
zd?qm{Z9&T{<gysH9*@y^SL}V~pB6b_`m@Cy=P%zYoPS!}!I9=;q3#D$P_w~o7=cd=
zW(P<uNF7OOp188O24prky{*z(?fj_li!+G6Q+U{gX=<4Bqr$^D`~@3V0c!`j4a`6y
z@QK0f04WElBkV7-%VOAiP)6rv6NQ{lui62okFHwc!jh!qe0tRq9R7oiqk)`Aavch@
z1EiTG|B+r6*MaN+$KM{UwJsbCTFxMvm4U_iGnmhU!+)@GQ?PcB8^H`D0-qSn4v=z?
zI>PZsQdtaJi_GY}s?WxG<*HfEtNJXRr>|P=!tE~WymA%RJ=LU+9fHkViCC|JWy}sX
zz6){3<ic%WJ&lFO!S0w`h;<DTS?-uz2wtZI3QH{RfUPlyxTC6Y3D_NBg~!0|s46^0
zl`;?%##M-Q6j<ER1d4BPS_8$4@BiCicWD0q2X=?=|9@0-hwp#*K6NbafbAWCgok3E
z2*@2yzh!d3?ojMAqnbMu`@rkzal{L3JptGqPOmJcf!(pl;tt3iPOmKPP|F=4vp``F
zbqA=QfV>~B4I~GSmyNOaT{P#^I)iAnIStN#zgM_u&cSuAA#5%QtQ~4Lm<=QFiNWju
zsRgMcTn2#04l|3vLxT!9hLga3bY#E5_U$k_FI(H{BG+IFrllJgoWDKT;Ub4~Tog86
z2XY=6<@efF7imcLC(du+@d)_d{nVUP(AX$i_Z;ju<TeHToN?#154O1o%Orql0htEp
z_iLM6gk^BW8*E;fJimeL5|9CVjs(A@R%8~JfVOI3Hl@M-LLNhc?JHw+-nRU*^RiVx
z!1SzDt6f;F0-Tqv!gUrKY#j)B{sP%G3sIgEPLD`+5~!`Dkd#_do|+0Db%33?fI12R
z%6rIh*adbhXdU#yl10wFg*%)<bbH|e=l{#EI`<YHz)}DDLiK?uP&|McNCZAHm>nSH
zAa#WO3T;1u{RwVlp!y0jwgOqL05X(;5w=&B(RuCiE6#ZZC&6@5;Q<%UT>;K{IQ``f
z)(#~|zBe9ZR}z_H53u-x9lVU5`yhTq9)|$mYX~kkH}hFIJ26B%gJ{$LKV8__Wt<)V
z|HKh@uyuf7UxLCP%s?XWiNWjuDF>+|I_^jxAA_&0cV1tz$XT>64oq|QnYnOWe&sCM
zXNJRn?jX0pFvyKCHjKt62D1aC7Nm}7|ACVw!SONVx&d|%8mOGP;&jP8-g(>dD^9yC
zu7b)Lr%M)Barh6m_7~(t((4AO9U#pl`461;aE@+*#v?%MPe8_kk|gYG21aMs<FYQs
zg~!3P&T&~VZH&F`iL`bVt`BA)$gKypR?PzOL2O4PHrPxZ@V*H6x+Y|KkUmg_0n#TR
z5i7y~>D3~yl|gnp>^u!d=X0x8gWV3IL2d`p#JC-*4&+u)V1VoexdFrnv60;dwu5-L
z2QbvJgU*e?<#yOQT1Myo$9*mue3l^Ed1)V*2Jx}A=}^KQst@E=nA;C?AlmoN$n5^d
zeIT<z>OdIeH)MH`KBRE(VW?&Xt)Ir_cG!6?pfv_hKyC%Cxo}ZT?g!Hve7NpTgP8}{
zhwOG-;SM%aF&R|G5R+z3FhFLAV0NLWci1^RjLwRnxpxKz5bgZG&k97lFkxTUgc9yh
zeaLP<kPIo}LE-9v#0HrOG8+`;AdD^#(uWB5I2OKR;PVx6xgEB?73_BBw-%4V=D#>D
z3#Q*%JSLcC6lID)`iOS>3)H-d>^C&GJMdL9gZ9Ybay#s-Cy3jx8y*9@`O*PM_+K}~
z+P6dxcjxPd;Pv;gumrgQ<QMdCg_#Xf2g2y`Abm*TUc<P8AGF2@m)pT*8OR*4xd*jY
zg6TawAmM*dYb8<PeozZ`wk&w9D##5u-M(kXV~~9yOu+3s7}@zitGIEw9kdn^WDTRU
z2?K-kWQ)gOy6?Cwn4U~Tnt|#A83J<;PPc>9_7R<CzA)P|g3f)$<#yPfOo-bn{{I8J
zxj?1}OjlqZ2S7<PAoo;2`uIe-y#Tx>5?;>WPVeys%(i@>u>)Lghn*h?al1F48Q9HE
zTC2dcHy_rq0}Qu&^MS_&h;qA=)+&%X5XPTo;&b@rSV8SmTyCESi)(P5C(*zFrp4T4
z!L$U<^}sOmAoVe1-7d%|{OKK32aCCbR^t*A?ko7`Fs?ufC-m|icK#%z^9`9IP<alb
zL1i$A2Js2zRj59Y!(m~GGrixCDFT@dQU}5W!u<*VWqvh0Zinr&WOTmXX9+5&!8E9R
zhw=%!9jcBfw}aFYUA`wMu+HQIt=WLZF?zVe&O2pvzRtkle68>pn7+io0H&{DA3H<}
z3%EYw+|Iz@d<m?Qh%}QB!~cjM6t=kBz6fj*sBis{fx&tDs#VS)8nlKKL{DF}ieR`y
z)xpdGr30L42BdZ}cutHMx6j~TE&w`90GHcg`wtnxZf^YlA52%v6oKi+|Nn_{d*grD
zdHeYDD#-2C#Fmi>SNIk(g7ygDay#rSWQg0twN`-L?B^~6ro**X5asr8El_y?3VOnB
z_j3pB8zds!69pLA7(n;@;d1*jkcFT;4|c0oXb_lIEIbCLwL*i4a=TV&5X>BcX+{w|
zW=@RTefUc7w#8s)af8F%>G%I1AU8X`vUmWdfB*kMjN3u_h;=*2Y*1K%Fvy>{>(#^#
zMq@_M`SG~I9Uj+Uw=M|v0n>ebCSZC&s1H$YUl0o4rwDQnzP#$x*9SU#h?sCc!nl?l
zG!%f#?eO-Wb2|fri_FL4V4CZ3ADEW;h;^O^rHq8?Lk@S)8MPoj$REgO*MiODdJO8A
zz}=2457LKd11B-C&SbogWEXn*4r*I~tYLKK4-IqSk|~7HkNY6BOd-K=hw1|v0!s%t
z!yT*^)$O>`Op*=jOny+W4_CN@_T_@C1?^P`b6&*&+Gi2w%q3Ig6dDTV6LLFD9mo)v
z+YikLmxJJO9VcWq$V@J<96a2S<w5$8!o7k~ivJm&a0jmy0NDv{H_AfW?V$ZYpth~-
zaalrchv`Fh`+=*W;C&OIG~<B82CGGLJF+}TAClX*@QZ-AA|r)6BV;!x*fMZF2C*RF
z4hwIP+d=inI-Fxmpge@455xh50m!|Fa#dy>TI}2fVmn=!mFLVqw++Mwt$hc@DM%d%
zgT$N~yw^DeCp3WAhi2~;I@I939>fN#T?Za3LBtXB>l!E9Lw`W>hini1In+_z2x5cE
z6=yWH4#^5;`{Ea_2FV{vTeBO)2eH9wAvpzZ?qON0`-hfnp9+$9@SL1se_3Z6h%F$I
ztiveF06OmnDg03Gu3QK6H^{x<Jzz7A%Yxhj;}eW~&|U{fe1ePu*N=zRAlAV+A+bSb
zg3Jbm9SDQmh%67%hlu;+41xK0-45#4f$aphVfU|E4W`!>9tYF=vCpj|<pW3?ct2#G
z1?HZEF@<MAhJxJYh{Oh)i55r5@*sUkZePN0fY<FCKz4xabYW*;0F7^fX|Bh8V48^W
zEtoo(IUx5QvRVbI*C6Eu5*w@*t(<m3k_YKSa{B{;k9ge<yB`X)o@zD7?Vxo`ps_hH
zO@!NF>X6-zYitgzmgup$6d8tMA<+FHu=Ea^;{vb$gxJLhyQ7QIS&M<e#W*?-OdCWu
zI6Kaq<zgI-Yn~Ez4hq;9P*{T*NCZAHm>nSHAa#W25eS}D2pgkjbiU@m;9@*G4@?`(
zZg9R=Z0uq@8<#&|=jec(0!}Aj1`+{s9}*YLgo(lI011M`2>XNJ*?6$K-x!@|A7F6N
z`JD%*HGelaFYh_)qVpS<KVWAzft*6RKR|YA{stv^uwKIcAQ&IpzzzYOsm2QO$NhIM
zAX@VQgA3=)SuQ#_&yEC*XF|0i&clHV5V*euW(P<;mEr?-_aLKlj{}2?&i{8{T8n|f
zc}lUdi!RPRA)v8MkTbv-<Q6akiNGfYvje0Yq>gZWV5BSbwj}I+NJgg!P&@e4Dljdk
zzyPLYP7&;H!_<M?1S+RN?!r|@fz^tEw+O=PWaN1rkUmgi1DPQpkrKg>ECf0;6;~Ox
z3uY(ST%G;zz_jK82B+D^#x6PsaP6Oioofiz4zdf(KqByo!R!Dj2dN_*2L$s3?5<Hp
zCq4!S7sdJSz_i=~2B(~~G#AAMxcmV-FB9YxaQ*}{kO+|bkhowbObliRNDw4O1%K=T
znFUG%&dm*Ae}HMZ1q{yJn~m}K19lE8SUboqU<ML_PYh-UNI6IyVSixc2~gdKJjV<=
zp8;eXqjL}ggNs9-6_~c+V{ksv0OI3{4^UbK=>uc?2Jo2*U^a{ZxevyM(J(QX9UyU#
z7|0)tj0*o5xfoggGqN)=F#Km^Lps%xfguQdPX=hwk%C4lWc3kv{}bpKKgi}1=sG%B
z9SDjV*g6)F-<Vvi`mCLU7$EeC1~84>j)fhBhtd{=st36fWFW|`Aoigp4B$2`i0uSr
zJ44L`sRLn{T9`aYEli()M9LJQAO_IgZm|3=z`($Oe$Ef%R4R;feo)SB*atEfWS_GK
z1E-6Aa=Wt!1EY&ta=-Hh21XbC<bGs7!rVmi8cvXz`rx@xSl$Dbt)SuyW<BiwXGX9)
zRNO_u?vQqu1-nDV9czD)EO)4Y$Lw*r1J<sCxI<EFG1wgfTC2hCkkq2i+FDR}NNR!m
z_s}p!4-eSA-Vk^2@fm>K!OCX|b_XB!xoWb)gO3kf#^Z3uAy@=~<Av$tevmtyKR@mR
zyMqb)*biCmVETx>#urr1fYu?vtcTs#&gkqlbGD1_<4s^%{qa=ibDK?EbRXlo+a7lI
zJJ=kkAHi%Gflmx(2S_bQ9jKhaf46;bVp*y}L4IalNor9s=$;zbI<lhF<ovwilA_XN
z(9S*3?X95oJgF%PIT+jA!0QD;^IRZnL0J=aKPaPf;F)tSite0XTFzbD`LyIr7e#km
z`!GTCt57o-NZyADvjb!Raejxcq0324D*@kUU6h%g0onhKw$uz1x5#zKQIH)Vk2<HP
zWw?lGy#>?4TC1H8_?&YQ)55hL5_T5^SUbp#U<ML_PYh-UNI6Iy;kXS-&CM@MRRFJ}
z!?}nK<TvDV3*htqVEcIb^1w7(pElTUJUI7Y!tOEwIS*D=f!Qzu<YpKfM#IElc7Vh|
zVnq9`C^a`VGY_<k6|@=)mUf{FKOsIZLaYFVRh%F{Bd1qzJ_g5U%*<KN{~xV$2GKts
zH#i^NY~uX?F|Pg>?4BNwvq|?e)DDnlV*L!ylCV9epv;JtSh2JV!1w=x{Wq)dxQp7V
z)y^PVrSJrpRwH7J2&7&Ob&Lq-m@-JM3V7@b-VeY%rkrv?$dCclABVLIK=lf8o8}}a
zeBf@EE)4^_S<<EmOiPzyJ%<OSO#^a|bSe0Z9gsPou*U0lNgL2UWFp+2$|Kaz1Zt4s
za{DP1w+lEhfZfc;E(@jw9KeIRP&LTu2WB24OdV7WxDAHa?R@M+&hMvsFn$*Tjg!Ib
zLJ#-TFgw9+VAWa$rkOrM(hRE>!M-C{Ju7&v1js1DZfE)kN~gqxdy7z!5U34+%k8ke
zt>Ex;{+tDNyYssrPe5)0@v*fL(bEh_9mwItq#2OeAax)NN?*9sd+Grpdm+$%D45$p
zWf5}SauH^ybFfUIi`9;&VA{;$iSsF?EiP6&o`47KG0#we-5CegPICVQWS1Fut{j{W
zLFF(0{)uybVo`A_xa1|ie*#%a0Gj^~mdST9+40O7MuYrjvf~+YykPC0K-Ggi$$;pS
z!1@^=aajKY99||nKyyCuG=(e=V#D+aNTmK@5@Z1F8HU9Rw*CnRNDtaMq@egiUS|)h
zR~Vhu7#Li<4nSx(2L|W+4U8^cIL9qu_Z@<*AUXa(cDX@943z!|$DeOvW}ZS(erZW&
zUaEpdaZYZ0NoH<paY<@HL1tb$T2~XjY`6(_Bq$z1_PQKk0{az2-)~@WaXG+5Fdm`$
zVCI0_3}VCL1H^{MBh*Y#-U4BmT9`aYEli()L;>gwMvxFJ9zkwL?zh468l$r-1BZ))
z{a0sK1_l>%2L|VJp#DGhGMVK50mw`TM0`N^A0yvwcpKzMkbj(GjZIwa4#<LOivtYK
zhtkqr>~N+N*!{F%?Xa)_bD#u1F_;}7r66^nbb`Ns;F*_Ml9`y3Sp`18!%CqfGdD9Y
zT?f|EO36%2&&w|^$xJTRQAjOG)`LmFnpzC#;eQWgH`w2x@HhDn34a|1Ncfv#Ul&YP
z_(MmYK>mb;Kd2ah+Rgx;g9mXKon1h4AocISv~B}~^LY>-y7msUoQ2)j4AKiOE5QsT
z0%{+U2x3edW(P<Tq>ga-2jt|JC}ct+K_NLmFD)~@v<Ms*@Hi+a%FHWKNX|$sN=z=%
zQ^+gLO#=1h^3xR3i!xKtBLs9lEciS*kQ*2n7-8pkf${@`i^2g0aDD*M=NcGYG;yAR
z4JivjWk5Is14tdjJV=>*P$}y4{)kHOoheRpZ-qKsswe>Y7i_jFIA4Gw1JWk&6RtRL
zPPhyt?=W%u0Y|~@`$255S_Sa%23)Pv8smQlp3YhYl0Wct)=GOxLCBfYAh)8abxd}C
z;vn8M9i;Zqs-o8ilbs)f*v=renyBU;ntdbCF=;&$NZv7NJ<9==J8>YkfJ6aoZ7k%>
zS5&_;2uKvb`ntHv8_@b<P|$$Fm(xYA9+KWgL2Er57(n|Sk;_Vuogl?zrFS_<F$XmR
zJ)WO}%mwE=HwFe5E(Zo@7=50B(M1@0xyQi3fQV<%9D*=7?m$L?;|^y$gUseb4dVm2
z;u)lt3v4docm}x@O)buN2C0R(7j7=@crLU7c?x!(Ea*H@P?$i)7z88=vE3^I32?9?
zMo>Eg#A0-IW8iXO|Nj*fzRv#`Ams@MmC7|xSV3b15zi>&qt8K(fW|YI^UwNMV0S!+
zlxxmEq2(G>5!4I@lGB?T0|Uq`kTFm*(98K3AUU`@9{q>7<02$HoF7v!JV0iF?84!W
zmmoQ~JI+AEV;3|$&QLKt&Onj_4tKmlamQ9@cr1a2$2Ka42Xqz|hdW-QxMP0(OK|$=
zg@(s`Du%~=yx{>Ga{}iV=Z^m`!0yO{hDRqA!vnf|8Ao`$MG23T|Chk-aD=)em5T0w
zp5leW9q-`oaAn|j*86`6RR1}1L)t~o`c!g<D+2?_ERbC|-0>bH2hJ}bcQF3H2y%zh
z9;iET?As!_`~bNFT%*F<M(E`StgQ^HH@Tfw{$B!ihYQ3VPOGRF9w4(oeujnzs6Pkm
zBY=Y8BS;R!aE>)Lby3^@4orjY3OSUP;i3j@A7Qo=LE|t`t#CiW`5*?=J`fX*VPY^l
zKoTG^!tF$#{QLri{Ib*{g~Xg3P%9nWmqQyG1o;hlj^Z=Oe6Zhw)6!hn>fbqoXody`
z=Mz3>T-cyx0jA%iq58lS$bDc25`j+)W(P<)NF8CnIp*Z#CxcGEEYB~>R!A%=O00x?
zOd~D72-M_FEy_$z%u&cMNQJbHF;0sF`5o3b2YLA`$bJyRIXErVMZg~9_f&AZ2;_Iz
z*c_(cC87Gj6v+Kx1`>f!3~U#q{Q~Yg5cYd`MrKYb_}EWSV_qR6u^80S&r455Z`gzU
z_Xpt&M$npi5SP)}+t|cK=Knh|EzZE;d^#=NMHZTWF#RVE(gef!`~p)0qG9S_cEH34
z`_HAcASV+XxnTckloqEd<maTIbX^ibr`cte=qaR^rWS)IslWk}pO*?Arx0ZTO`n6>
z-{@iR1LO{H9DB^1?fk9&wlj!+)xh9<cC(4|H=OAkWFk~68F?3K2gm?WxDXBl*NPHQ
z*G(ZgKffp?GcU0uwOApoC_fh^5K<CL5)~lxaivA63YmE&`H-xD*1-dX0rJ@$@VmF2
z<BUz5@BhCIrmrwCI3IeJ?)(5}IuHiAABI8xfU#jTJ~5abAhjTMgu}o&F(<h+2b9TE
zGK&jx5|dF6T+s;j@kNVlNS~eo*{{Dr_JQL&oPojlWc_Vt5WTm7!TDGNgY!w8@hu3|
z2c|&o1v8Kcd}1&=K*~YtNbzfFL2*e@YGSTJSz=CUDxy%s;#>51h2?cdu>G6<L;Sj&
z0pi!qIOCNc<W3j{xfjNU(fGu`c0qTwfYg!VSJ2VL;5<&8Ut#_OMJH(gC&+n>&OXK_
z&U5N-gXswk49=&Yr902T8Lyx=1xOzlgWL;dAQAY)V0M6%gVYiBt4n5aNl|7}X-O(H
zK0$|Hfa)w*76n&bpu5q*;eeW>VQOFlXQ22-Zim44jX5WtIqTf?{|=b0VqkDSC^^fy
z8E1S$Pp1U=f{d~ZWEb?rMk2!?H4#s34fPzzZ%FMBCQ$zz<UmGe|1)Qt<Nj|4)9wrm
z&Zi`2I>+Pm8)(lPNFNx3+y`bL5%|Plc7T+F)Dezf$CSi^5`~hCRB*wpkeHkdF0Vni
z-NRxpF;5}2s3^ZkA+@+96YHVJAipD}Z6;_dm;qc*J8S&k4yr?)1tImcvnEczL)J=x
z98X|<EK~`Y0{IiffY||JgTx5?9l3l)8uBg3$uEHqM3xt2mZT~aCzhoar<Uj_K*l9O
z2c*D42O9n0^&+tTA85!0RCj}%!sr~7mg4mNe;$}V!NA~r{LC4rA2`DRw5J244~#+n
z05gyXd}1&=K*~Yt2!{c5Jw<*}aehu}2{aXCmZat)3hv~b)Wjli@<6YxK=F>0pW#y^
zjLr#X&N@x}p9iK(7#N%n%$(&k38$Z7VFhwFxD5$rAQ2$HAaTJ=m>A3skRV8mu%AQn
z)6;WO;T;NvjKsW@9P~5wLFFvcoIMjPZ8AE~1kJ64hJtBRt<_-KJTw&Bm?z5oD^wrI
zouCQ;<kkbRcfsdFfY=VPcV~e{7eH*VnWo^iX`pfhJT3{62k8aLgY?1F3P=>f`jxP7
zM0Y!Mbd3SxcJ2TF!RBjTh4?|6h<&~ww`-&A^F?zz%xy5UL4E{bkb7~vy+{Y74=J3`
z-3}`cA#PV#wGwQ;Ts_1O3abd8p8;~a!YcUwNsxO$;Rmu8#71@-%xsXmK^R>gqz@79
zMX<X;aD_X_FCc3mZWj#=2AeOe1@VJuXfRP}Ml=+5P9QiPfZPBw6y0qwvqA0#VRU(r
zJ|wrp_I~4XJFJd{xSjL=U$FV?S0R4j{Qs9Iw{!mg3vw&WJs>xL_~>qfnGI40!szlK
zeMoMH&F|oHJ8ac4*zL}LL;XPJJOB9q3rznF^&`gZAblXW!rTLL1Bj3AHn5pL{)74?
zMC8?C&>nJ-F}U20l4hKrty%;&{}I#=&sHrW%I(iq!OtZCxfie7ABBSM870Q;usJqd
zZs!Ae3>02qH(yw_5KNy5^##)xRxKpT?H5+T&x0W7_A{ZNGYW}uJM7FXTy6)gjQ}|x
zl4f>6${FWvkaFI67jfkbNFB%!P#6$&`!?|X6GXVZ1eTt0xgFNmV|1ReYPItc1~xD~
zf7K>1y@Y{{V7No|5#@G}+WD(Cf&2)<Ab%p4p`f&e$g3rwv%o;c;&MBzPYwz9-p~+m
zTIpn90MospAq3q%lYzmxH#7uf3CukpH-Px)ZUdVM89OH?+`*H5c<Lt5IysOv5Vz+-
z%1Gx_Xqw3-u8effCBBRVnGNzI2&4NA<Y%OChqcFXg*$9K2;z3`&>(QwFs)hzrny52
zpFsf%cW$&ZDDboioS9aEb~h6d?xnDO;JDl_1`2dg7=YaBwEO=bFuiKk8Zf>4{~uz~
z3`if$98g$-!Vkm;v60g=*vwVnbN7jHJM7*NB)22)YiELuMMA>eVbyA9n^miwts!Z~
zh3_h^b|iR-9L&$o4yfx^?S=319AM5@2f6)_*5qBz;`0xJ*dVuq%m(QLVUXA%>n_a$
z94S2@wgX2>kL|JKb09X%9Uyfe3=%tJ+{NH5^wbT+c8tzH2I7O*AhjU3g4BU9NX&NU
z34MpWJ2yb=19^9@9hU6<2V#Tfp3v1gSyc)j7AsZ;$?xyYf9Q~66#-%kNR-0%PvZ(d
z2~Zq?>;$iA;e)hco%KUQoiB%mg6zQ&_lWQVt%c#c3OiRC+@`XxI?Ln`atVAcz#+>S
z&koDhNr2qr3^fyE9|(iQ9AeM!JuJQPHi*4<9>Y?H*z>zVY>--K$cbC<baF5(gzJ#e
z`9&akC!_O=oJDoNg4p1AK~sA`E4h20^oc_tc_*uwYYtk;-5@qttv+g9;iTU))mhFA
z?DqX;Rhtf|lz{In7to2tGN+G{{y=-EK|u&ke@?EUp`ddcoU~R!`Z20F`!R^{o5{cc
z(g!jG7AAJDPCFmakUs))?;)*!p3Wr?A>jv7s|8N0@Gv>#8Q63{D|bFft%FwXd^-Vm
zIS?D>4v?833=%u!+MVZIR4WByJ1V^M0P#U=kXjd2)G)CN%g%Lp=35MsKk&@A_;7g)
z_>2W``a@Ie<k3`exVZ8fNbUZe*Pl2%T(t|t7SM@>t$W0k{$TS&jNtUA3dy&QzgDew
zzQMo%auZSM58@tB5Q5{-e#_oj4iDdg`@V-fCeA%vwT&6%9+;V+@Bm?un8P#Q2Zt-`
zIY8`vA=8$D_#ie&t&=Efm>iU!!*s}X4*2{CC)YXCoJ&?#gVloK1x@V%$z0LBFHao>
z$vb(*>pMv1ih$Ul^at`E$bJw8i8<+IUU#m3X8~gGyV$?(fOsUhJQ2`|gVn>3@Z)3!
z@j-hET%hZ27#SGYKzrtx7#Pe!Z3AWoh5%5R$-=;p0XkQQm4RUjX#Eiz1H<z*3=9nH
e42=4qwi^cnqYdaR9ne}e76!(&HUIzr{{R579qt4G

literal 0
HcmV?d00001

diff --git a/flash2d/doc/sources/InputDok.tex b/flash2d/doc/sources/InputDok.tex
new file mode 100644
index 0000000..c707ece
--- /dev/null
+++ b/flash2d/doc/sources/InputDok.tex
@@ -0,0 +1,406 @@
+%
+% FILENAME: InputDoc.tex
+%
+% CONTENTS: Dokumentation of input data file formats for FLASH
+%
+%     DATE: 3/98
+%
+%   AUTHOR: j. behrens
+
+
+\documentstyle[a4wide]{article}
+\sloppy
+\parindent0em
+\parskip1.5ex plus0.2ex minus0.2ex
+
+\begin{document}
+
+% PostScript Graphik einbinden --- --- ---
+%\epsfysize 3cm
+%\epsfxsize 14cm
+%\begin{figure}[t]
+%\begin{center}
+%\leavevmode\epsfbox{FILE.eps}
+%\end{center}
+%\caption{... TEXT ...}
+%\protect\label{fig1}
+%\end{figure}
+
+
+% Ueberschrift --- --- ---
+\begin{center}
+{\Large {\sc Input File Formats for FLASH}}
+\\ Version 0.4.3, 3/98
+\end{center}
+
+All the input files are constructed in the same way: KEYWORDS precede
+the values for specified input parameters, COMMENTS are marked by a '!'
+or '\#' in the first line. There are five six which might be
+important: Parameters.dat, Windparam.dat, Land.dat, Triang.dat,
+Domain.dat, and Initial.dat.
+
+% Zwischenueberschrift --- --- ---
+\vspace{5mm}
+{\large {\bf FILE: Parameters.dat}}
+
+{\bf DESCRIPTION:}
+
+This file defines the behaviour of FLASH. It also contains the main
+physical parameters, the user can influence.
+
+{\bf KEYWORDS:}
+
+\begin{small}
+\begin{tabular}{|l|p{55mm}|p{35mm}|} \hline
+Keyword & Description & Range of Values {\bf [Default]}\\ \hline \hline
+EXPERIMENT\_NUMBER &
+This is the experiment number, normally set to 0 (for a new experiment),
+if an experiment is continued, then it is set to the continued counter. &
+0 to 999 {\bf [required]}\\ \hline
+FINE\_GRID\_LEVEL &
+Sets the finest grid level. The mesh size is given by $2^{-(j+1)/2} \times H$,
+where $j$ is the refinement level and $H$ is the coarse mesh size.&
+1 to $\infty$ {\bf [required]} \\ \hline
+COARSE\_GRID\_LEVEL &
+The coarse grid level (or minimum refinement level) &
+1 to $\infty$ should be smaller than FINE\_GRID\_LEVEL
+{\bf [required]} \\ \hline
+TOLERANCE\_OF\_REFINEMENT &
+A global refinement tolerance ($\theta_{ref}$): If the local error estimate $\eta_{l}$ is larger
+than $\theta_{ref} \times \eta_{max}$ then an element will be refined. &
+0.0 to 1.0 {\bf [required]} \\ \hline
+TOLERANCE\_OF\_COARSENING &
+A global coarsening tolerance($\theta_{crs}$): If the local error estimate $\eta_{l}$ is smaller
+than $\theta_{crs} \times \eta_{max}$ then an element will be coarsened. &
+0.0 to 1.0 $< \theta_{ref}$ {\bf [required]} \\ \hline
+WATERMARK\_OF\_REFINEMENT &
+A percentage of changes ($\omega_{ref}$): If more than $\omega_{ref}$ percent
+of the grid elements are marked for refinement, then refine, otherwise leave
+the grid unchanged &
+0.0 to 1.0 {\bf [required]} \\ \hline
+WATERMARK\_OF\_COARSENING &
+A percentage of changes ($\omega_{crs}$): If more than $\omega_{crs}$ percent
+of the grid elements are marked for coarsening, then coarsen, otherwise leave
+the grid unchanged &
+0.0 to 1.0 {\bf [required]} \\ \hline
+TIMESTEP\_LENGTH &
+This is the time step lenght in seconds &
+0.0 to $\infty$ {\bf [required]} \\ \hline
+BEGINNING\_TIMESTEP &
+This is the first timestep count for the experiment. &
+1 to 99999 {\bf [1 if experiment is 0]} \\ \hline
+FINISHING\_TIMESTEP &
+The last timestep of the experiment, thus modelling interval time is
+TIMESTEP\_LENGTH  $\times$ FINISHING\_TIMESTEP - BEGINNING\_TIMESTEP. &
+1 to 99999 {\bf [required]} \\ \hline
+\end{tabular}
+\end{small}
+\pagebreak
+
+Table continued
+
+\begin{small}
+\begin{tabular}{|l|p{55mm}|p{35mm}|} \hline
+Keyword & Description & Range of Values {\bf [Default]}\\ \hline \hline
+TYPE\_OF\_PLOTTING &
+There are different options for real time (online) vizualization: the 
+x-component of wind $u$ [1], the y-component of wind $v$ [2], the 
+geopotential height $\Phi$ [3], $u$ with grid [4], $v$ with grid [5], 
+$\Phi$ with grid [6], the grid alone [7], the wind vector field $(u,v)$ [8],
+the vorticity $\zeta$ [9], the tracer concentration $c_t$ [10], $c_t$ with
+grid [11], no visual output [0]. &
+0 to 11 {\bf [0]} \\ \hline
+PLOT\_TIFF\_FILE &
+Each visual output can be printed into a tiff (tagged image file format) file.
+If value is 0 than no printing is performed. &
+0 to $\infty$ {\bf [?]} \\ \hline
+MATLAB\_PLOTTING &
+Matlab output can be generated in case no OpenGL library for the visualization
+is supported If value is 0 than no printing is performed. &
+0 to $\infty$ {\bf [?]} \\ \hline
+STEPS\_BTW\_PLOTS &
+Timesteps between plots. If a plot is required only every $n$-th step set value
+to $n$. &
+1 to $\infty$ {\bf [?]} \\ \hline
+STEPS\_BTW\_SAVES &
+If an offset file has to be written, in case the computer fails or in case the
+simulation shall be initialized from a certain time. The offset file is written
+every $n$-th step. &
+1 to $\infty$ {\bf [?]} \\ \hline
+SAVE\_FINISH\_CONFIGURATION &
+The finishing configuration can be saved to disk in order to continue the 
+experiment at a later time. If value is 0 than save file will be written. &
+0 to $\infty$ {\bf [?]} \\ \hline
+POLYGON\_FILE\_NAME &
+Take the polygons defined in this file as a land mask (for example). &
+character string of length 32 {\bf ['land.dat' ?]} \\ \hline
+WIND\_FILE\_NAME &
+If wind data shall be read from files, this defines the mode how to do it. &
+character string of length 32 {\bf [?]} \\ \hline
+DOMAIN\_FILE\_NAME &
+The domain outline is given in this file. &
+character string of length 32 {\bf [?]} \\ \hline
+TRIANG\_FILE\_NAME &
+The initial triangulation is given in this file. &
+character string of length 32 {\bf [?]} \\ \hline
+SLM\_ITERATION\_NUMBER &
+The number of iterations in the calculation of the semi-Lagrangian upstream
+displacements is defined by this value. A good value is 4. &
+1 to $\infty$ {\bf [required]} \\ \hline
+\end{tabular}
+\end{small}
+\pagebreak
+
+% Zwischenueberschrift --- --- ---
+\vspace{5mm}
+{\large {\bf FILE: Domain.dat}}
+
+{\bf DESCRIPTION:}
+
+This file defines domain of the calculation. It is used by the grid
+generator and the visualization utility.
+
+{\bf KEYWORDS:}
+
+\begin{small}
+\begin{tabular}{|l|p{55mm}|p{35mm}|} \hline
+Keyword & Description & Range of Values {\bf [Default]}\\ \hline \hline
+NUMBER\_OF\_DIMENSIONS &
+The number of space dimensions &
+1 to 3 {\bf [2]} \\ \hline
+NUMBER\_OF\_POLYGONS &
+The number of polygons defining the domain (think of islands). &
+1 to $\infty$ {\bf [1]} \\ \hline
+NUMBER\_OF\_VERTICES &
+This Keyword occurs as often as polygons are given (previous value). It
+defines the number of vertices of each polygon &
+1 to $\infty$  {\bf [required]} \\ \hline
+VERTEX\_DATA &
+This block of data occurs as often as polygons are given. Each block contains
+NUMBER\_OF\_DIMENSIONS $\times$ NUMBER\_OF\_VERTICES lines with coordinates
+of each vertex. &
+- real range to + real range {\bf [required]} \\ \hline
+\end{tabular}
+\end{small}
+
+% Zwischenueberschrift --- --- ---
+\vspace{5mm}
+{\large {\bf FILE: Land.dat}}
+
+{\bf DESCRIPTION:}
+
+This file is for convenience only and has no meaning to the model
+itself. It is safely omitted. It defines polygonal lines plotted by the
+online visualization utility.
+
+CAUTION: Lnad.dat has a different syntax, as there are no keywords
+supported, but the order of arguments is important. Moreover, only the
+'\#' character is allowed for a comment line (this is for historical
+reasons only and might be changed in later releases). Only
+two-dimenional data are allowed.
+
+{\bf First non-comment line:} Number of Polygons
+
+{\bf Then:} each block with polygon data begins with an integer value in a
+single line defining the number of vertices, then 2 $\times$
+no.-of-vertices coordinates values follow.
+\pagebreak
+
+
+% Zwischenueberschrift --- --- ---
+\vspace{5mm}
+{\large {\bf FILE: Triang.dat}}
+
+{\bf DESCRIPTION:}
+
+This file defines the initial triangulation. The coarsest triangulation
+has to be given by the user, it is not generated automattically from the
+domain data.
+
+{\bf KEYWORDS:}
+
+\begin{small}
+\begin{tabular}{|l|p{55mm}|p{35mm}|} \hline
+Keyword & Description & Range of Values {\bf [Default]}\\ \hline \hline
+GRID\_DIMENSION &
+Global parameter defining the grid's space dimensions. &
+1 to 3 {\bf [2]} \\ \hline
+ELEMENT\_VERTICES &
+Global parameter defining the shape of elements. In 2D for example, 3 
+is triangular mesh, 4 quadrilateral, etc. &
+3 to 4... {\bf [?]} \\ \hline
+NUMBER\_OF\_NODES &
+This defines the total number of nodes in the inital mesh. &
+1 to integer range {\bf [required]} \\ \hline
+NUMBER\_OF\_EDGES &
+This defines the total number of edges in the inital mesh. &
+1 to integer range {\bf [required]} \\ \hline
+NUMBER\_OF\_ELEMENTS &
+This defines the total number of elements in the inital mesh. &
+1 to integer range {\bf [required]} \\ \hline
+DEF\_INNERITEM &
+This global value defines the attribute value for a grid item within
+the domain (no boundary). &
+- integer range to 0 {\bf [required]} \\ \hline
+DEF\_DIRICHLETBOUNDARY &
+This global value defines the attribute value for a grid item on a
+Dirichlet boundary section of the domain. &
+- integer range to 0 {\bf [required]} \\ \hline
+DEF\_NEUMANNBOUNDARY &
+This global value defines the attribute value for a grid item on a
+Neumann boundary section of the domain. [Note: periodic boundary conditions
+are defined by the (positive) index number of the corresponding periodic
+partner item in the grid.] &
+- integer range to 0 {\bf [required]} \\ \hline
+NODE\_INDEXNUMBER &
+Defines the (unique) index of a node. This keyword occurs as often as the
+value of NUMBER\_OF\_NODES indicates. &
+1 to integer range {\bf [required]} \\ \hline
+NODE\_COORDINATES &
+Defines a block of GRID\_DIMENSION coordinates of the node. &
+- real range to + real range {\bf [required]} \\ \hline
+EDGE\_INDEXNUMBER &
+Defines the (unique) index of an edge. This keyword occurs as often as the
+value of NUMBER\_OF\_EDGES indicates. &
+1 to integer range {\bf [required]} \\ \hline
+EDGE\_NODEINDICES &
+Two indices of nodes (defined in the previous section) which span the edge. &
+1 to integer range {\bf [required]} \\ \hline
+EDGE\_ELEMENTINDICES &
+Two indices of elements adjacent to the edge. 0 for one side if the edge is at
+a (non-periodic) boundary. &
+1 to integer range {\bf [required]} \\ \hline
+EDGE\_BOUNDARYCONDITION &
+Defines the boundary condition according to the previosly defined values for
+Dirichlet, Neumann, or periodic boundary conditions. &
+- integer range to + integer range {\bf [required]} \\ \hline
+\end{tabular}
+\end{small}
+\pagebreak
+
+Table continued
+
+\begin{small}
+\begin{tabular}{|l|p{55mm}|p{35mm}|} \hline
+Keyword & Description & Range of Values {\bf [Default]}\\ \hline \hline
+ELEMENT\_INDEXNUMBER &
+Defines the (unique) index of an element. This keyword occurs as often as the
+value of NUMBER\_OF\_ELEMENTS indicates. &
+1 to integer range {\bf [required]} \\ \hline
+ELEMENT\_NODEINDICES &
+Three indices of nodes which span the element. &
+1 to integer range {\bf [required]} \\ \hline
+ELEMENT\_EDGEINDICES &
+Three indices of edges which span the element. &
+1 to integer range {\bf [required]} \\ \hline
+ELEMENT\_MARKEDEDGE &
+The local edge number that is marked for refinement (by bisection). &
+1 to 3 {\bf [required]} \\ \hline
+\end{tabular}
+\end{small}
+
+% Zwischenueberschrift --- --- ---
+\vspace{5mm}
+{\large {\bf FILE: Windparam.dat}}
+
+{\bf DESCRIPTION:}
+
+This file defines the behaviour of FLASH when it comes to reading winddata.
+
+{\bf KEYWORDS:}
+
+\begin{small}
+\begin{tabular}{|l|p{55mm}|p{35mm}|} \hline
+Keyword & Description & Range of Values {\bf [Default]}\\ \hline \hline
+X\_PREFIX &
+This is a prefix for the x-data file name. A file name is constructed from
+[prefix][counter][postfix], where prefix and postfix can be empty. &
+character string of length 32 {\bf [no default]} \\ \hline
+Y\_PREFIX &
+This is a prefix for the y-data file name. &
+character string of length 32 {\bf [no default]} \\ \hline
+X\_POSTFIX &
+This is a postfix for the x-data file name. &
+character string of length 32 {\bf [no default]} \\ \hline
+Y\_POSTFIX &
+This is a postfix for the y-data file name. &
+character string of length 32 {\bf [no default]} \\ \hline
+TIME\_FACTOR &
+This defines the model time between the increments/ wind data updates &
+0.0 to real range {\bf [?]} \\ \hline
+NUMBER\_OF\_INTERVALS &
+This defines the increment for the counter in the file name construction. &
+0 to integer range {\bf [no default]} \\ \hline
+UPSET\_OF\_INTERVALS &
+This is the offset for the first file counter. Thus a x-data file with name
+[X\_PREFIX][$n$][X\_POSTFIX], where $n$ = UPSET\_OF\_INTERVALS + $k$ $\times$
+NUMBER\_OF\_INTERVALS holds data for the model time
+$k$ $\times$ NUMBER\_OF\_INTERVALS $\times$ TIME\_FACTOR. &
+0 to integer range {\bf [no default]} \\ \hline
+X\_NUMBER\_OF\_POINTS &
+Number of points in x-direction. Wind data are assumed to be given on a
+rectangular uniform grid. &
+0 to integer range {\bf [no default]} \\ \hline
+Y\_NUMBER\_OF\_POINTS &
+Number of points in x-direction. Wind data are assumed to be given on a
+rectangular uniform grid. &
+0 to integer range {\bf [no default]} \\ \hline
+\end{tabular}
+\end{small}
+\pagebreak
+
+Table continued
+
+\begin{small}
+\begin{tabular}{|l|p{55mm}|p{35mm}|} \hline
+Keyword & Description & Range of Values {\bf [Default]}\\ \hline \hline
+X\_SCALE\_FACTOR &
+A scaling factor defining the mesh size. When wind is given in meters per second,
+then the scaling factor is just the grid spacing for the rectangular grid in 
+meters. &
+0.0 to real range {\bf [no default]} \\ \hline
+Y\_SCALE\_FACTOR &
+The analog of X\_SCALE\_FACTOR for the y-direction. &
+0.0 to real range {\bf [no default]} \\ \hline
+\end{tabular}
+\end{small}
+
+% Zwischenueberschrift --- --- ---
+\vspace{5mm}
+{\large {\bf FILE: Initial.dat}}
+
+{\bf DESCRIPTION:}
+
+This file defines in a crude way, where to initialize a tracer.
+
+{\bf KEYWORDS:}
+
+\begin{small}
+\begin{tabular}{|l|p{55mm}|p{35mm}|} \hline
+Keyword & Description & Range of Values {\bf [Default]}\\ \hline \hline
+CIRCLES\_INPUT &
+Has no value and is required. Don't ask for more explanations. &
+\  \\ \hline
+NUMBER\_OF\_CIRCLES &
+This is the number of initial circular concentrations. &
+0 to integer range {\bf [no default]} \\ \hline
+CIRCLE\_COORDINATES &
+This block of two coordinate values defines the center of the circle. This 
+keyword occurs as often as NUMBER\_OF\_CIRCLES indicates. &
+- real range to + real range {\bf [no default]} \\ \hline
+CIRCLE\_DIAMETER &
+Defines the diameter of the circle. &
+0.0 to + real range {\bf [no default]} \\ \hline
+CIRCLE\_CONCENTRATION &
+This defines the initial concentration of the tracer. &
+0.0 to + real range {\bf [no default]} \\ \hline
+\end{tabular}
+\end{small}
+
+\vspace{1ex}
+% Unterschrift --- --- ---
+\begin{flushright}
+J"orn Behrens, \today
+\end{flushright}
+
+\end{document}
diff --git a/flash2d/doc/sources/Triang.sc b/flash2d/doc/sources/Triang.sc
new file mode 100644
index 0000000000000000000000000000000000000000..602c36e8572e822378ee087c344211a5dc059ecb
GIT binary patch
literal 9616
zcmWG`cJpOs`TviBfkBLcfrW#Cfq|hQv7{umC{F<ifP|R}5{nYkixLYm6pBkKb5cRl
zAaUlD)U?FXoDzkS#3Yay2!q5~auX{ub4zm-3KG*(6^b*fQWX?H;;e~9Mfv4W0gz$^
zh&WquPG(A~LU9I2GPx+Tpade$UXq$ykds)Fs*snM3$_&^&XJs1lnikO)D(y~XMRqK
zLSj)eTo7tLS5azmNn&0)vKEkgxIyYmQY%Unl5+Bsv%%Ux;ylJK3T2t8<*7wrAus_F
z=PJn0sZ7tu2p>L>Iq60Dr3GN6U;?C`zbL;nFC{fa0c1Z|6yi>Sywq|?*gyrL?i9?-
z1qB#F5GpQ&=0=bLkom%BeuasP<mH#7qFDe^FA9pM<owdS5|By=28oN6<Y%YmfnpI6
zLLhPR<kF&|)Vvaf%#zexg}l<-q|_pixI|)UN@l)7a!w|~!ys`<P&mNitQcXwRBB#w
zVnJ~!C@NDF0)jy@AobEP^TFu^VZIES88G#-WvNBQnfZAN#U(|VdFdcwaJrHM>qiYd
zkoodSiOJat1^JnICGe;Oi7TY#=anF(DUd-RamCEMvedki{2~Qo7lr(!tkmQZu=z?k
znPsU8Wtl0d`3h-8kfaDwuk4jrkeHWRoT`9`Adt8U%$>>kDbQpKHb)gLjlk?xD=tYa
zDgpVZ7@GPa=|nv>F9lT;BCg?SXyJ!sC(Im8a5$7CCLy8`Y_C>MW?pt`3PcA~8stuG
zaJ*)wAjdpNT!n#wfro*Cfti7Uf#v`I|Nj{n7-Sh37&JmMGK&?`GILTDl8aIkOHxx5
zk}4HEgFJ&3f-~~VlM{<m6^!*vKt?dIFfcH1FfcHsFfcGnFfcGMF)%Q+FfcHPfMp>B
zBZQ(m2?`V)sI6Si`K3jfsYSX@`8g?g#9(?rZszw$%_&PQ$xKc}=)xuj(gO+&kl%$6
zdi;}eG7C#nA(r712k8aH11Ju-;Cdl?(D|&8um*=Mh%F9^HwFd<Z3YGgX(*eCfs-|a
zfq_AQfq_ARDFqxSAU4Q9Aj}}Z7r6&wJeX8vV32nKvmk^PgkoTHc3ic}d3)AMIQ`hz
z(nbH&T2O?8)i5$J*f)S#AcBj5fdRpTq$!X%*c=z_&=9aW*BKa`A2cwyXorTv&0#>8
z<6Iva2GWF#57&o+{DUk6w-;n4$SjZ~)GZ))Yyt717-kL39ibpS&IH^6%@ZIa;QBxu
z1_lO3kUfXaxHum=<KhZpJDqWHc7n1&egl~eQU}85^2quG_)eBU%>>0gh>7lYHjp65
z9FVyne>yvbhJnn7@nN0=sRP*sqEXxq4Qr@4-0e=Mckc$N2f6(alnpZ*WFH8l%Y)nw
z(<i`pas$*%nA?RI7#NN~#XuCeodGh(IiZ2U`QrcoVEWYm|ITd=U_RJ$j0_B*QU_!g
zNE1jslm=5s;$S|Az$XT?1E%gjBO@~d!-M~fT#PLL8QGZ_82&S|fl54(0x<T=Pf0EQ
z&&bLGDzE;7R5LIzfc$a*EDa$zAru3nvl9b@^OdQgVEXJ-24|nNH0LW*8F2VT6RHnP
z;d3`w0hEBLgV_NR28j{&iy<L@fYKMpI7a7tAb&V8fa$aLtDPSk8#`aIUyZ{b>L5)p
z3~~#M4Wsdi!R!F31*s$K4<kbU;0BomN-NIy7+78OPc=E;V_<X9@ml8$Eu(PwLlvqI
zOo7}2W*`yv_5ZgcaluTOI+z_GL68_>e;5<;2P`Fm(iM}7{;Ac@P7F*gI$o=tebO>O
zd>sBz2Dt%-L2iMuVKhE5m>nRsAa#WOVS>#c$ax)+u0VPHq+T94A0E<M<=p0Y+WDm3
zDjfb$1i1l*L2iMuVKhE5m>nRsAax*rFyhVYt|{q+^Ew~MJaF1t@M@LwL*^sSAo>;y
zgY(k!EY1&EaOHJ*s6H?Sau1k+MBo#H*#S}xQb*V?1oJvS$SklwZaOfy@FhNS2GLxP
z7@Y5^M7i)K;qnKl{Rh>GsF&daNOd(fF_;}7IpX|5Ft3B!E+FF=o#$N*bJ6VS1=DIg
z4bF>qZgA1;X~2=TK<y!rJ}?Hk1<XJq@QK0f04WElBOD(D^SU6&EO2~yty<;6^YD=~
zh~`XUa1JSsbK!Y}D?TKl`oI*(Eno%`flmx(2S_<c9btc9&Fjc@A*gNy8OP{+U}~82
zzvd%g`g;q5^U=x;&i`6)`2*Be1?dB0kXyhEBm$op%np!pkUGNtFvV78A^SrZWEMC+
zc1#U*k!^hB45Fo&7@YT3u6L1b!sQQ9s6H?SatoM&MBo#H*#S}xQb*VyW`z6!YPW!l
zV|1<x4Ret)HwV*V+Zmjj_*q?~%yIbx=6{f0czYVmff6A1L78w0CI+(uBmoj5><@E7
z{(yxmqjQ7SD(9~=rNH#NnGDXY{4CC2XX5e)EMI|~Lb^XdcD<Vk*Gt$R7TEl80&D<;
zfTeRr=R~bl&inQ9!1NBiQ0Klw$<F)rLUEK=u<{yg3Mfp$3?u@d7|afka*#TZKbRnO
zArtm?uWL?fZfaf$M$;Fg?F;JDgN$W#UckWM{ORyvF#Y=QD(59nqMSb+##Oh&+5{lI
zq{j=$uGfcGfix56AA<EEtQ=)@KE%M_!qw9Yp?Mmdk3ETU;lf#uz}lK1r;zRsuw6Xh
zelc<WAXpztfgQrY!00@0)hZW-?dD)w)||n4aX*WT!ggHw1lETEYX`Xn%s?XWiNWju
zDF>+|oW2Owhp_sY(YXj3A7GlN!MXax7CiC64srtwgWLjR!)SbB5W7f;4~+VdpMil9
zdHh5MYA>U6Yy$&$yaYz~A7F6apS2oC9~~4Qpz#<+=Txvha9Rh|M<DkfShZ?3$XpN`
zgkfy39lNtYYQcJu<zQ@(UJx6XT8CAuR)ge0X6|o*wDG`h*pF&1Obv(znF&%4Vmo((
z{e|KNkeM)fkQx}<859Os+zYc8qz<GPqz9K;kli48kXjH8!eBRSM|CgAOqd#wnJ~5h
z-znI5A833IB#a)1ur@EF^E|E9&aXp5;q=l52ItQV;6YB1Mi2(s526_u7!Yx|@M;)H
zA5<JX&T?Q*;b{;bq~5+w0z3=|VuQ_ocQq6g*B}fMgR29V6buXpriO-s#KCIcg9TCI
z+W{&M(g*T4SS`p6pFtuFaJ9(xBD=>Ki&_U<?gfPb7B|4`1=$F5k26Ru7Qey#15yie
zD+q(#@H!MF9QGrH6S8{*_|6lGLphMypzw4)ptahCbJc1%eY}Ceg{y&Z93H+J2GR#J
z2joWNFhdSYu-V*Mpgal>Ymh#W9uNkxVSa|F1vfoW)WX6Hq!t#I&LB5%p~g3|y~yst
zrWQHOko7r(!hjpo4KRB_Zh*N5q88I{F#mwmg8T@=U^j4r%PP3vaL3^#9*|z>907=l
zo)2MtXh!EbSHoOn85rR760OxP3RlAjmZb|C7(n_!hJ(@q$c@Nhh7u+qJLE9K1f&Oq
zL1w`G40eaSC}?aN?oW_BEX+V`SXerP+@Nq3MJ=+u$nL?W7H1rS!T^gKVD^IC0CSHs
zNG%q>!TbYK3-TifgWUir0pWhb9fwz7W9zueQqX(`$aqHQd<F(keuC4rt5y@056ePB
zLHa<35R5~R9mM8Cuv*OchJ_i(K3G^fgWN!DKE$FHXB>jUfY^KpR!d|)1i69ee0V(u
z<X5D82<p>=0|qJ%8<%5rp4Y(O!r7n&rr8)6oEH}xyKpw(YGZ=tq@YGHFxVGww1#t_
z3{ZN5GT{_V3}y#N0we}%W8xpX$LQmO`W&$I2{HyYPRi))$-v-z;{XGkzUu(y!^;!Y
zxh&Y623#M=Fj!gyu@4<IHU_y7#CC$RouOue)PXR%Jg8KM=@a0)3F|Y$>_T_D3dn4b
zInJI93@%y;3~>4`giqM*5OpwfVD5pr0VIxaJ6tWi3_zAgb^9%t)wtXa8)s*9c5PsA
z(QE+I&bJ)EG>8u~0Mt@}xeI093aSs}22dD))Eqi!Yyxrzi0yRH7&PAs?vH`&0GSO^
z2g2y`$od5MZaF~B#N~E1s63<deFg>>%>xV|+W8iQ2Js2H9jXsz4#+(qH-PvcHj3Nt
zGcbV62DuxA(dCi#3Gm&j0hxgmPUvYy11itxJcoh7`CJ17oL&pz6LdRNAIuz(dqC`i
zkuzt(*p5)PGt^9wyFnOT9u!wFeFA*9c7V)5ayzKZf#m^^6l|`H(Rl*{gYzW^1~7fv
zfx-FaEm;sB>~_rgLRdV4%mAkcFawEzxeG}Mt`24gNDib9ROT>4#!VQokDKHs7J*h+
rq^6{&qKpJF&4SLmgZu$%=YaDO0|V<91_lODyM~2<K{e<9|NkEVE<Wgs

literal 0
HcmV?d00001

diff --git a/flash2d/doc/sources/grids.fig b/flash2d/doc/sources/grids.fig
new file mode 100644
index 0000000..1c8f068
--- /dev/null
+++ b/flash2d/doc/sources/grids.fig
@@ -0,0 +1,245 @@
+#FIG 3.2
+Portrait
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+6 453 916 4716 9916
+6 2703 1186 4503 2986
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 4
+	 3153 1186 3153 1411 2928 1636 2703 1636
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5
+	 2928 1636 3153 1861 3153 2311 2928 2536 2703 2536
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 3
+	 2928 2536 3153 2761 3153 2986
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 4
+	 3153 2761 3378 2536 3873 2716 4053 2986
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 3
+	 3873 2716 4233 2356 4503 2536
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 3
+	 4233 2356 4233 1816 4503 1636
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 3
+	 4233 1816 3873 1456 4053 1186
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 3
+	 3153 1411 3378 1636 3873 1456
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 3378 1636 3153 1861
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 3153 2311 3378 2536
+-6
+6 2703 3436 4503 5236
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 4
+	 2703 4786 2928 4786 3153 5011 3153 5236
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5
+	 3153 5011 3378 4786 3828 4786 4053 5011 4053 5236
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 3
+	 4053 5011 4278 4786 4503 4786
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 4
+	 4278 4786 4053 4561 4233 4066 4503 3886
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 3
+	 4233 4066 3873 3706 4053 3436
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 3
+	 3873 3706 3333 3706 3153 3436
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 3
+	 3333 3706 2973 4066 2703 3886
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 3
+	 2928 4786 3153 4561 2973 4066
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 3153 4561 3378 4786
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 3828 4786 4053 4561
+-6
+6 453 3436 2253 5236
+2 3 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5
+	 453 3436 453 5236 1353 4336 453 3436 453 3436
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 453 4336 1353 4336
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 1353 4336 1353 3436
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 1353 4336 2253 4336
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 1353 4336 1353 5236
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 453 4336 1353 5236
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 2253 4336 1353 5236
+2 3 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5
+	 2253 3436 453 3436 1353 4336 2253 3436 2253 3436
+2 3 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5
+	 453 5236 2253 5236 1353 4336 453 5236 453 5236
+2 3 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5
+	 2253 5236 2253 3436 1353 4336 2253 5236 2253 5236
+-6
+6 453 1186 2253 2986
+6 453 1186 2253 2986
+2 3 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5
+	 2253 2986 2253 1186 1353 2086 2253 2986 2253 2986
+2 3 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5
+	 453 1186 453 2986 1353 2086 453 1186 453 1186
+2 3 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5
+	 453 2986 2253 2986 1353 2086 453 2986 453 2986
+2 3 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5
+	 2253 1186 453 1186 1353 2086 2253 1186 2253 1186
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 453 2086 1353 2086
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 1353 2086 1353 1186
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 1353 2086 2253 2086
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 1353 2086 1353 2986
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 1353 1186 453 2086
+2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2
+	 453 2086 1353 2986
+-6
+-6
+6 543 5506 2523 7666
+2 3 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 5
+	 543 5596 633 6586 1083 6136 543 5596 543 5596
+2 3 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 4
+	 1443 5596 2343 5506 1623 6586 1443 5596
+2 3 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 4
+	 1623 6586 2523 6586 2343 5506 1623 6586
+2 3 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 4
+	 2523 6586 2433 7666 1623 6586 2523 6586
+2 3 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 4
+	 1623 6586 1533 7666 2433 7666 1623 6586
+2 3 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 4
+	 1623 6586 1083 6136 633 6586 1623 6586
+2 3 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 4
+	 633 6586 543 7666 993 7126 633 6586
+2 3 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 4
+	 993 7126 543 7666 1533 7666 993 7126
+2 3 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 4
+	 1533 7666 1623 6586 993 7126 1533 7666
+2 3 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 4
+	 543 5596 1443 5596 1083 6136 543 5596
+2 3 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 4
+	 1083 6136 1623 6586 1443 5596 1083 6136
+-6
+6 543 7756 2523 9916
+2 3 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 4
+	 993 9376 1533 9916 543 9916 993 9376
+2 3 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 4
+	 1443 7846 2343 7756 1623 8836 1443 7846
+2 3 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 4
+	 2523 8836 2433 9916 1983 9376 2523 8836
+2 3 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 4
+	 543 9916 993 9376 633 8836 543 9916
+2 3 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 4
+	 543 7846 1623 8836 1443 7846 543 7846
+2 3 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 4
+	 543 7846 633 8836 1623 8836 543 7846
+2 3 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 4
+	 1623 8836 2343 7756 2523 8836 1623 8836
+2 3 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 4
+	 1623 8836 633 8836 993 9376 1623 8836
+2 3 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 4
+	 1983 9376 2433 9916 1533 9916 1983 9376
+2 3 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 4
+	 1533 9916 1983 9376 1623 8836 1533 9916
+-6
+6 2796 5525 4679 7637
+2 1 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 4
+	 2804 6069 2991 6095 3242 5818 3216 5570
+2 1 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 5
+	 2999 6099 3284 6384 3254 6770 2965 7067 2796 7097
+2 1 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 3
+	 2965 7078 3205 7412 3246 7633
+2 1 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 4
+	 3212 7419 3554 7127 4060 7318 4214 7637
+2 1 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 3
+	 4067 7325 4412 6875 4679 7097
+2 1 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 3
+	 4416 6875 4405 6234 4634 6017
+2 1 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 3
+	 4409 6238 3974 5825 4116 5525
+2 1 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 3
+	 3974 5833 3561 6084 3246 5822
+2 1 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 2
+	 3554 6092 3284 6384
+2 1 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 2
+	 3257 6774 3554 7127
+-6
+6 2826 7780 4716 9887
+2 1 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 4
+	 3291 7829 3437 8084 3130 8481 2834 8309
+2 1 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 4
+	 3130 8485 3291 9029 2999 9325 2826 9392
+2 1 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 3
+	 2999 9332 3254 9662 3310 9887
+2 1 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 5
+	 3261 9666 3599 9385 3981 9362 4240 9677 4247 9884
+2 1 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 3
+	 4247 9681 4532 9374 4716 9366
+2 1 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 4
+	 4532 9370 4251 9010 4412 8466 4671 8275
+2 1 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 3
+	 4412 8474 4026 8084 4116 7780
+2 1 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 2
+	 4022 8084 3449 8087
+2 1 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 2
+	 3291 9032 3599 9374
+2 1 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 2
+	 3989 9362 4247 9014
+-6
+2 1 1 1 0 7 100 0 -1 4.000 0 0 -1 0 0 2
+	 453 1186 543 1006
+2 1 1 1 0 7 100 0 -1 4.000 0 0 -1 0 0 2
+	 1353 1186 1443 1006
+2 1 1 1 0 7 100 0 -1 4.000 0 0 -1 0 0 2
+	 2253 1186 2343 916
+2 1 1 1 0 7 100 0 -1 4.000 0 0 -1 0 0 2
+	 903 1636 1083 1546
+2 1 1 1 0 7 100 0 -1 4.000 0 0 -1 0 0 2
+	 1353 2086 1623 1996
+2 1 1 1 0 7 100 0 -1 4.000 0 0 -1 0 0 2
+	 2253 2086 2523 1996
+2 1 1 1 0 7 100 0 -1 4.000 0 0 -1 0 0 2
+	 453 2086 633 1996
+2 1 1 1 0 7 100 0 -1 4.000 0 0 -1 0 0 2
+	 903 2536 993 2536
+2 1 1 1 0 7 100 0 -1 4.000 0 0 -1 0 0 2
+	 453 2986 543 3076
+2 1 1 1 0 7 100 0 -1 4.000 0 0 -1 0 0 2
+	 1353 2986 1533 3076
+2 1 1 1 0 7 100 0 -1 4.000 0 0 -1 0 0 2
+	 2253 2986 2433 3076
+2 1 1 1 0 7 100 0 -1 4.000 0 0 -1 0 0 2
+	 453 3436 543 3256
+2 1 1 1 0 7 100 0 -1 4.000 0 0 -1 0 0 2
+	 453 4336 633 4246
+2 1 1 1 0 7 100 0 -1 4.000 0 0 -1 0 0 2
+	 453 5236 543 5326
+2 1 1 1 0 7 100 0 -1 4.000 0 0 -1 0 0 2
+	 903 4786 993 4786
+2 1 1 1 0 7 100 0 -1 4.000 0 0 -1 0 0 2
+	 1353 3436 1443 3256
+2 1 1 1 0 7 100 0 -1 4.000 0 0 -1 0 0 2
+	 1353 4336 1623 4246
+2 1 1 1 0 7 100 0 -1 4.000 0 0 -1 0 0 2
+	 1353 5236 1533 5326
+2 1 1 1 0 7 100 0 -1 4.000 0 0 -1 0 0 2
+	 2253 5236 2433 5326
+2 1 1 1 0 7 100 0 -1 4.000 0 0 -1 0 0 2
+	 2253 4336 2523 4246
+2 1 1 1 0 7 100 0 -1 4.000 0 0 -1 0 0 2
+	 2253 3436 2343 3166
+2 1 1 1 0 7 100 0 -1 4.000 0 0 -1 0 0 2
+	 1803 4786 1983 4786
+-6
+2 2 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 5
+	 2700 1187 4500 1187 4500 2987 2700 2987 2700 1187
+2 2 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 5
+	 2700 3435 4500 3435 4500 5235 2700 5235 2700 3435
+2 3 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 8
+	 2748 5567 2838 6553 2748 7637 4642 7637 4731 6549 4555 5477
+	 3648 5563 2748 5567
+2 3 0 1 0 7 100 0 -1 4.000 0 0 -1 0 0 8
+	 2786 7822 2876 8808 2786 9892 4680 9892 4769 8804 4593 7732
+	 3686 7818 2786 7822
diff --git a/flash2d/doc/sources/para-grid.sc b/flash2d/doc/sources/para-grid.sc
new file mode 100644
index 0000000000000000000000000000000000000000..08410ffda394f4cb8f6f21639191db9feb7d7b59
GIT binary patch
literal 12152
zcmWG`cJpOs`TviBfkBLcfrW#Cfq|hQv7{umC{F<ifP|R}5{nYkixLYm6pBkKb5cRl
zAaUlD)U?FXoDzkS#3Yay2!q5~auX{ub4zm-3KG*(6^b*fQWX?H;;e~9Mfv4W0gz$^
zh&WquPG(A~LU9I2GPx+Tpade$UXq$ykds)Fs*snM3$_&^&XJs1lnikO)D(y~XMRqK
zLSj)eTo7tLS5azmNn&0)vKEkgxIyYmQY%Unl5+Bsv%%Ux;ylJK3T2t8<*7wrAus_F
z=PJn0sZ7tu2p>L>Iq60Dr3GN6U;?C`zbL;nFC{fa0c1Z|6yi>Sywq|?*gyrL?i9?-
z1qB#F5GpQ&=0=bLkom%BeuasP<mH#7qFDe^FA9pM<owdS5|By=28oN6<Y%YmfnpI6
zLLhPR<kF&|)Vvaf%#zexg}l<-q|_pixI|)UN@l)7a!w|~!ys`<P&mNitQcXwRBB#w
zVnJ~!C@NDF0)jy@AobEP^TFu^VZIES88G#-WvNBQnfZAN#U(|VdFdcwaJrHM>qiYd
zkoodSiOJat1^JnICGe;Oi7TY#=anF(DUd-RamCEMvedki{2~Qo7lr(!tkmQZu=z?k
znPsU8Wtl0d`3h-8kfaDwuk4jrkeHWRoT`9`Adt8U%$>>kDbQpKHb)gLjlk?xD=tYa
zDgpVZ7@GPa=|nv>F9lT;BCg?SXyJ!sC(Im8a5$7CCLy8`Y_C>MW?pt`3PcA~8stuG
zaJ*)wAjdpNT!n#wfro*Cfti7Uf#v`I|Nj{n7-Sh37&JmMGK&?`GILTDl8aIkOHxx5
zk}4HEgFJ&3f-~~VlM{<m6^!*vKt?dIFfcH1FfcHsFfcGnFfcGMF)%Q+FfcHPfMp>B
zBZQ(m2?`V)1_lO@{rn!OIc2FOnaPQ|PWd@0V7FisV}<w!?0yhi927PT3=Dn@3=Gmx
zHWLFUYX}1ag8%~qg91|u*xw*F$Q}@85a5djg$vjc1_lN$1_p)(1_p-z41IkT3=9ko
zPzgrI1O^5dT?Ym*&2)gldCCDWAFP>?fdLdFFvZTj2cX&z)L|_I8^*E+*~GvAF;f?!
z8!D#Cz#zK<><)-xD+tBF==g+z!G*1X0Y*FbIWV{=Jpe~8R1MtG3=9ma3=GmoVB!o6
z3?M&&xCG4s`Ntll5`tmj0^u<*@Ix68bCez++{4F!;U1`;7@QtMbs<rQu!zCbgZ-%V
z0IV7+26D$1umFSr#U+SEoI5}&AsCd8KrFaE5C@e0K=vFmojD7HL2M_}nX^C`#C8Vx
zjSU=WptQpX5(CMBFo+G(1HvG-fZ#S6sF^Uk(A_Qwm1hK-t8@S@3=g2hDN<a(%!BKL
znFF%-kja^|F!wl_oH+|~4>&B*-Hs%WtWQ92TLjchm|f^@7lO(&I<1DpH<)H?U;xu-
z=@FaTVd`M!fZc97a~6mXVuSnuXM^lOcRP|=kRM@c1q8QE0kNTFC5Vacc43epD6YX_
zBC-Gy?jj2q!0{lmfMB@8^uf#lxfjF+xdX-qxgW%anF+EFgh65;wJ>=Q8>UY{aN7kC
zACKE%Wi>q9VQztiC%8O<8bWNiAKaFf=C~~_4dgZu4dR2@pt43}0mw9XdPkNAsRQvr
zY6S$hgX$-cT3l&H6eI}>1DIREG%Vc7Ofw)i9Nco|EXWNYw>U!C*uouI9$BA&;C2tF
z+i<yE3@Xp)%-6u+B60wd&e<9mV0=R14pRp+2jpIm8$fOXu|YJ54`PGE1ueZJ%Y)Q`
z_#m|cg4;oLILKIBZU@ziAbChxCxR$voK`V_{X)p?kTeFb)4=5($PL)S9c(5Rx5MHE
zS)YL5c9@~aZU+~zAO|xrFo4=AASR=;Rs*<R0n?yx?}L;(C~k-9B(<Ian~A@kkpwvc
zly+fi!89&+Kouk9W4QaFQs6KI<$DkY#UrRZ0AUc@8RR##Fa*hgFi0Mx2ZTXv0l^(5
zP&1Lk5V?+&g32?3%~d+Ufa-Q4>KTxGlweWC0C78xdIn}TD6Bvj<VNIr2(_Nsu>tBf
zTy6)o<3LInos*&Q528Wg4x))DGhq5ahQQnd3Of)V>^7u&1gsWIxWm*U>k|;%@dhN0
z6vycG46Oc##675-1EpaQ4GK>p>KSlYLdsu|Rp4+3F+lDBxgErYr3rA{Le#>`YGip3
z8>UY{aHj@{kH_txz6D4LBHUqary$%xc^_78foKpP<PRi&!rhK64^ju>gVYKL?u7IR
zAblZ_8_~mE4kQSQYjAujJzxOSuy7|c&4Ap1t-Qk)?jW~fFYk7OD^on-E)RD*s9i5|
z0OEE~dWZ5+$~&lHB=Z=-{Q(iwyb5wV$W5T|1JNKphz$-GwDgWF4^ju>gVYKL?z{uF
z4p&|U_2EEDpy?f{oJl6Go`IwTOt)hVcaWJ_+>SlmcfslrTy9qeIUJN`Ky`<U^Z{^R
z1=P=i@d<@HOdZS|P?#M8kKi#dfY?sR?8lHk9LPQpMwds{Cm^^B)PDsTi_7hxu>p`g
zqf-h4gA3OJ1~?6}hl_A~7N#C#2+TboHZ0shY*@I0{mBJR#_+s~EDvJC^a%*=ngHS>
zrBC#{stT271e+_e0Mf1k`2pm1BFadZKA1V6usmpNZ0u-kYz$(9Xb>O72Dhuw+>R^{
zQU~IL)CvghIs-KmSGcP|<sofxkei|X6tJ6!33rfsh<iXrfy?)UW@%|4cYxgBXqJ`+
za}U@|^z@D-kE~BXa5pryfyawLW}}C@I!F){*G|V77+eGu7{D|a1B4b-AlL^2s~3c2
zc}SZ8<OYzrFt@|lV6`9@K*o2#{sj3ACXcL7KybGUNE}a^fz@4%&Th~)0f+{bksz9w
z@*S!UY7f{wpt=#n2e}<or^47^JJ7-%Ssq!RfZ%Ru3lwL#Yl6%Lg}ZY-)a@V|<aQ8E
zjN75=VCI0_i|htuw}I^--tBv!X5vckun{as`OdWf(vAetp!N(A=^b3YqosF{ognvv
z`~hNv+z(=d>s5$alyU|p4^j)$Cm^`{2Z)a+&1ggAA#Rt3)=eN9<aTKy+Q6Xpk2GrC
z1Tqum1`r$OHn7_vYKd_B9?0k{?)Ho>$ZT+$NortlkzT+6PLrVa43tl(ZgPgIgP8*g
zUr-qXD_cM`hz}BnnGLcJgh67+@*s5}K1f_ZaL*d3nYhx79#o#uxgOL8Sis;6s<%OD
z2FfSscBnd-IUswH-2ie6hz}BnnGJF`2!q6s<w5E|e2}<+;GP#yGjX|HA1coX8qam%
zYG8onCm5fg+j|c%fb_x40ojY}29R4oe2_TIY>>M_7$k-)4^ju>gTw^{_rmIYTy8gj
z+3D;K4R;U?E@vQof^G+?hx8{vMuE#nP<!y;#sw!qZUD6l9ieP++@h5;$nwbg1O)dc
zfDFWwR}G=^jNteL<xyCg=>?^KBJwIoJtY5ujKc4BkeO)Z3?8@70U3zL?M6^}M(0pS
zy$Yw>4uI=fg5eI;2Qvp0)*v>lO$B1Z+G5U7GePMEgkfr7@*uS^eFB1eZ-DrC+-?k&
zXLK$EwIdlA;50ZLGZ1VOz|_Ocfw>3f29P++ZIC<!5&_Tofa3_ngUN%~Fnt1o`(Wdq
zxY9eU428H|!U5rSkY6Mmh;zFHWDW)vmY{SCatFvCpfmwvBl#0vz9Y*c>k|;%7XZ?S
zC)`b;@{F+f1k+p$3}Bjwwirwu%p8z=k=s<rZ7r}`qT6EodZ1?F3U@Q8JS49QDnQG3
z21r>+jN3tZ6-zr3<bIGpKyC+N5F1=ZVsSf69;63^L23mA_nm;c4VT-^q4JDia|L1P
zeF4<%M5K36TMRaf!vJXmA6Rqdti#Tkvp{ZeSaas=0Vo@iW>EW0$nwbg1O)fPiV3LO
znLzU*Tnr41p#BtS?ib{AOArA{tKf1HJk9~>SAz2vT3ZsHvcYq}V4aXSgN}QG%mKOi
zV8hS1jtxKGg4j;{1@8{=7rX<p!FE9E19+OZKO&=f;K$;vAo&BmstX)9eQ^V^!G49r
zDO|0Cf(P4y1s-f5`2$I7xEvm>;R3P2YSGGHhdl1S11~?^1IZsyYI)=^e|sN@4UQ+Y
z_y@^>)PUqcdO&(XY;5TqWGBdOkUYpOAUA>7;P67LzYfli?RB#1RRYO7xJ!s1c*(a6
z#1;_T4+~1PxB<@_gC>GO@nZuHVFm_9#|I1yE}91zz_gkIgELnHm=B9!kUEgLAR5%i
z1JTI%U<NV|!iK2_o2dzDlS0Kn^K!6s4^r#|B0zEL>||%|qPhMNm{v1jaBf`i+(mN(
z0~<&I+Wa*G0|O^W7>4Z|z-t9yTrdr_56p%UFfo`NAaRh`e?~@TMurFf8Mzo){xh;O
zF);jRWP{BXffO;g2YI^0Cl+M>XJlmo74`oap@9pEZIB25GeFin*nyQZFffAKw3-JP
zz%(daL2X=3)V2XEqL9j7xIUOUAoqdtD2NYYgYqt@69;0$%m#%Y2!q5x@-Vd^eK55G
zg8Ly8)sS{PXl(^Z84RPxiz8Hm(JA1^Wl+3;X*B}|r&rBWK=A@jADHn1%1=<OkZ~nA
z2g(4s5z2&9Ffo`NAPJBdh4BLNIs-$WMIQqLgEPoXP#A&NM_4C7)-)JE*GX6>K<ZyK
z|A6uxR3Dr=1nXtOMG*dknGKQxxu1c70Tiwm7zzrGfy5XX7<{2Lqtmvp4ld^RAAxC;
z1P15m)&v)G=sF2BcOaz?uy&}~U^a}vCkC?vq!y%(aJUBh`06MG=jW8^D1>De`@8#~
zCwxe{2l)#UzHT71LE-Bx-M|3y2bc!=3(5zl7pNkv=^m;Mss!BLI<VQ;7{mv;*<rJ>
zF(^VoY?#>~`#=~Z29k%V1?hvS6%afCo96&!S@d)d@&`yMtX#AOnE^7>SqoAwf@x6x
z1+_8J@-N6<ka|+fMX;Hu<s!lzknnT`nG13UxC}La04bkA;R)&wz|sj+5zHN+ehyR!
zP922xX5b=7=@nG=n?s5Ps2ThW42*lg>2=krRSXOaUQlg}PLCKETr3$FV6?Mq1EY&g
z1J-;4EuTSU0i)Bm4;mnSFmpim9Jn8L9mEH*?f2({;{?P8n{5RuPEp(3AUO~Q={Ybp
zG!(?frPcu|4^q3o0peG%8*ISQ40aPpKeD~Z?s2wee-H8(DC|KPq}Bn4d%<CV#l0|l
zL2iJ#2bWrye?V$Mc7ZV14UpCo+`ape!U@?u0)j_jYcjy$2rY9?fa4HkC<B8xgkoTH
zdf_VTVpIPJOj|NAI6K7_fc%Q1js>k*gKC9@Bb)<efZPgY!YP;-%npzQNQ`iq<5*CT
zlbM`Yl9``}TH2^GFfd&~@{bS5Oi<i_@|}ye0%R^kTY<sZje*fc4>6wrS|f&3)}W_t
zcbGZO(gzq_bRJ+g2eT{&wLQS`;`IH42FQMxIUs)`rzPYx26n3sIIn^Ag4BZafoKp0
zv0-Tems(g_0;z?iF|Zr-P}}Xu_9DB-*}DBbD11O+2f`qGk<${gK5$rKaWBkXkQ-p`
z!KD`FACOv*T_6m0gEn|v9v%+3)Aj*uY5NFLT7a#KVRZUiljov0{}Gr5r3H(FXFz@h
z*E^VT$PRK741?SSW5Z~CVlX>EYC-A<r)~G5%oO)j)O5`>3%d3bH0BO!ZGyvtfq@mY
Swhc7T%EG{)AM*eI{|^9vBXAM`

literal 0
HcmV?d00001

diff --git a/flash2d/doc/sources/structure.fig b/flash2d/doc/sources/structure.fig
new file mode 100644
index 0000000..5b5cc7c
--- /dev/null
+++ b/flash2d/doc/sources/structure.fig
@@ -0,0 +1,100 @@
+#FIG 2.1
+80 2
+2 2 0 1 -1 0 0 0 0.000 0 0 0
+	 379 119 379 99 119 99 119 119 379 119 9999 9999
+2 2 0 1 -1 0 0 0 0.000 0 0 0
+	 119 179 119 119 239 119 239 179 119 179 9999 9999
+2 2 0 1 -1 0 0 0 0.000 0 0 0
+	 179 319 179 219 119 219 119 319 179 319 9999 9999
+2 2 0 1 -1 0 0 0 0.000 0 0 0
+	 379 179 379 59 119 59 119 179 379 179 9999 9999
+2 2 0 1 -1 0 0 0 0.000 0 0 0
+	 379 259 379 219 219 219 219 259 379 259 9999 9999
+2 2 0 1 -1 0 0 0 0.000 0 0 0
+	 379 319 379 279 219 279 219 319 379 319 9999 9999
+2 2 0 1 -1 0 0 0 0.000 0 0 0
+	 599 319 599 279 419 279 419 319 599 319 9999 9999
+2 2 0 1 -1 0 0 0 0.000 0 0 0
+	 299 459 299 359 119 359 119 459 299 459 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 1 0
+	0 0 1.000 4.000 8.000
+	 79 39 249 39 249 59 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 1 0
+	0 0 1.000 4.000 8.000
+	 139 179 139 199 79 199 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 1 0
+	0 0 1.000 4.000 8.000
+	 309 179 309 199 159 199 159 219 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 1 0
+	0 0 1.000 4.000 8.000
+	 179 239 219 239 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 1 0
+	0 0 1.000 4.000 8.000
+	 179 299 219 299 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 1 0
+	0 0 1.000 4.000 8.000
+	 379 299 419 299 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 1 0
+	0 0 1.000 4.000 8.000
+	 79 339 209 339 209 359 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 1 0
+	0 0 1.000 4.000 8.000
+	 209 459 209 479 79 479 9999 9999
+2 2 0 1 -1 0 0 0 0.000 0 0 0
+	 299 559 299 519 119 519 119 559 299 559 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 1 0
+	0 0 1.000 4.000 8.000
+	 79 499 209 499 209 519 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 1 0
+	0 0 1.000 4.000 8.000
+	 209 559 209 579 79 579 9999 9999
+2 2 0 1 -1 0 0 0 0.000 0 0 0
+	 79 599 79 19 19 19 19 599 79 599 9999 9999
+2 1 1 1 -1 0 0 0 4.000 -1 1 0
+	0 0 1.000 4.000 8.000
+	 299 539 319 539 319 319 9999 9999
+2 1 1 1 -1 0 0 0 4.000 -1 1 0
+	0 0 1.000 4.000 8.000
+	 279 359 279 319 9999 9999
+2 1 0 1 -1 0 0 0 0.000 -1 1 0
+	0 0 1.000 4.000 8.000
+	 439 79 499 79 9999 9999
+2 1 1 1 -1 0 0 0 4.000 -1 1 0
+	0 0 1.000 4.000 8.000
+	 439 119 499 119 9999 9999
+2 1 2 1 -1 0 0 0 3.000 -1 1 0
+	0 0 1.000 4.000 8.000
+	 299 399 359 399 9999 9999
+2 1 2 1 -1 0 0 0 3.000 -1 1 0
+	0 0 1.000 4.000 8.000
+	 459 354 459 319 9999 9999
+2 2 2 1 -1 0 0 0 3.000 0 0 0
+	 479 459 359 459 359 359 479 359 479 459 9999 9999
+2 1 2 1 -1 0 0 0 3.000 -1 1 0
+	0 0 1.000 4.000 8.000
+	 439 159 499 159 9999 9999
+4 0 0 12 0 -1 0 0.00000 4 15 35 139 134 parent:
+4 0 0 12 0 -1 0 0.00000 4 15 93 139 154 return to main part
+4 0 0 12 0 -1 0 0.00000 4 15 26 259 134 child:
+4 0 0 12 0 -1 0 0.00000 4 15 96 259 152 open GL-windows
+4 0 0 12 0 -1 0 0.00000 4 15 99 259 170 enter glutMainLoop
+4 0 0 12 0 -1 0 0.00000 4 15 19 234 114 fork
+4 0 0 12 0 -1 0 0.00000 4 15 70 204 84 graphics_init_
+4 0 0 12 0 -1 0 0.00000 4 15 131 239 244 button and menu functions
+4 0 0 12 0 -1 0 0.00000 4 15 31 134 274 GLUT
+4 0 0 12 0 -1 0 0.00000 4 15 73 139 384 graphics_draw
+4 0 0 12 0 -1 0 0.00000 4 15 132 139 404 copy graphics data to child
+4 0 0 12 0 -1 0 0.00000 4 15 100 139 422 process and set flag
+4 0 0 12 0 -1 0 0.00000 4 15 67 139 544 graphics_quit
+4 0 0 12 0 -1 0 0.00000 4 15 59 519 84 function call
+4 0 0 12 0 -1 0 0.00000 4 15 18 519 124 flag
+4 0 0 12 0 -1 0 0.00000 4 15 67 379 384 graphics data
+4 0 0 12 0 -1 0 0.00000 4 15 89 379 402 in shared memory
+4 0 0 12 0 -1 0 0.00000 4 15 46 519 164 data flow
+4 0 0 12 0 -1 0 0.00000 4 15 145 439 304 draw_it (main draw function)
+4 0 0 24 0 -1 0 0.00000 4 28 177 379 534 Main structure of 
+4 0 0 24 0 -1 0 0.00000 4 28 68 419 569 cfiles.c
+4 1 0 12 0 -1 0 0.00000 4 15 125 449 594 30.7.98 bertram lueckehe
+4 0 0 12 0 -1 0 0.00000 4 15 26 29 304 Main
+4 0 0 12 0 -1 0 0.00000 4 15 41 29 324 program
+4 0 0 12 0 -1 0 0.00000 4 15 52 239 304 chkfordata
diff --git a/flash2d/doc/structure.ps b/flash2d/doc/structure.ps
new file mode 100644
index 0000000..9ecc399
--- /dev/null
+++ b/flash2d/doc/structure.ps
@@ -0,0 +1,211 @@
+%!PS-Adobe-2.0
+%%Title: /tmp/xfig-fig016113
+%%Creator: fig2dev Version 2.1.8 Patchlevel 0
+%%CreationDate: Thu Jul 30 10:22:40 1998
+%%For: bertram@hpux05 (Bertram Lueckehe,FB08,,)
+%%Orientation: Portrait
+%%BoundingBox: 36 160 558 682
+%%Pages: 1
+%%EndComments
+/$F2psDict 200 dict def 
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/l {lineto} bind def
+/m {moveto} bind def
+/s {stroke} bind def
+/n {newpath} bind def
+/gs {gsave} bind def
+/gr {grestore} bind def
+/clp {closepath} bind def
+/graycol {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+4 -2 roll mul setrgbcolor} bind def
+/col-1 {} def
+/col0 {0 0 0 setrgbcolor} bind def
+/col1 {0 0 1 setrgbcolor} bind def
+/col2 {0 1 0 setrgbcolor} bind def
+/col3 {0 1 1 setrgbcolor} bind def
+/col4 {1 0 0 setrgbcolor} bind def
+/col5 {1 0 1 setrgbcolor} bind def
+/col6 {1 1 0 setrgbcolor} bind def
+/col7 {1 1 1 setrgbcolor} bind def
+/col8 {.68 .85 .9 setrgbcolor} bind def
+/col9 {0 .39 0 setrgbcolor} bind def
+/col10 {.65 .17 .17 setrgbcolor} bind def
+/col11 {1 .51 0 setrgbcolor} bind def
+/col12 {.63 .13 .94 setrgbcolor} bind def
+/col13 {1 .75 .8 setrgbcolor} bind def
+/col14 {.7 .13 .13 setrgbcolor} bind def
+/col15 {1 .84 0 setrgbcolor} bind def
+	end
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+%%EndProlog
+
+$F2psBegin
+0 setlinecap 0 setlinejoin
+18.5 700.0 translate 0.900 -0.900 scale
+0.500 setlinewidth
+% Polyline
+n 119 179 m 119 119 l  239 119 l  239 179 l  clp gs col-1 s gr
+% Polyline
+n 179 319 m 179 219 l  119 219 l  119 319 l  clp gs col-1 s gr
+% Polyline
+n 379 179 m 379 59 l  119 59 l  119 179 l  clp gs col-1 s gr
+% Polyline
+n 379 259 m 379 219 l  219 219 l  219 259 l  clp gs col-1 s gr
+% Polyline
+n 379 319 m 379 279 l  219 279 l  219 319 l  clp gs col-1 s gr
+% Polyline
+n 599 319 m 599 279 l  419 279 l  419 319 l  clp gs col-1 s gr
+% Polyline
+n 299 459 m 299 359 l  119 359 l  119 459 l  clp gs col-1 s gr
+% Polyline
+n 79 39 m 249 39 l  249 59 l gs col-1 s gr
+n 251.000 51.000 m 249.000 59.000 l 247.000 51.000 l gs 2 setlinejoin col-1 s gr
+% Polyline
+n 139 179 m 139 199 l  79 199 l gs col-1 s gr
+n 87.000 201.000 m 79.000 199.000 l 87.000 197.000 l gs 2 setlinejoin col-1 s gr
+% Polyline
+n 309 179 m 309 199 l  159 199 l  159 219 l gs col-1 s gr
+n 161.000 211.000 m 159.000 219.000 l 157.000 211.000 l gs 2 setlinejoin col-1 s gr
+% Polyline
+n 179 239 m 219 239 l gs col-1 s gr
+n 211.000 237.000 m 219.000 239.000 l 211.000 241.000 l gs 2 setlinejoin col-1 s gr
+% Polyline
+n 179 299 m 219 299 l gs col-1 s gr
+n 211.000 297.000 m 219.000 299.000 l 211.000 301.000 l gs 2 setlinejoin col-1 s gr
+% Polyline
+n 379 299 m 419 299 l gs col-1 s gr
+n 411.000 297.000 m 419.000 299.000 l 411.000 301.000 l gs 2 setlinejoin col-1 s gr
+% Polyline
+n 79 339 m 209 339 l  209 359 l gs col-1 s gr
+n 211.000 351.000 m 209.000 359.000 l 207.000 351.000 l gs 2 setlinejoin col-1 s gr
+% Polyline
+n 209 459 m 209 479 l  79 479 l gs col-1 s gr
+n 87.000 481.000 m 79.000 479.000 l 87.000 477.000 l gs 2 setlinejoin col-1 s gr
+% Polyline
+n 299 559 m 299 519 l  119 519 l  119 559 l  clp gs col-1 s gr
+% Polyline
+n 79 499 m 209 499 l  209 519 l gs col-1 s gr
+n 211.000 511.000 m 209.000 519.000 l 207.000 511.000 l gs 2 setlinejoin col-1 s gr
+% Polyline
+n 209 559 m 209 579 l  79 579 l gs col-1 s gr
+n 87.000 581.000 m 79.000 579.000 l 87.000 577.000 l gs 2 setlinejoin col-1 s gr
+% Polyline
+n 79 599 m 79 19 l  19 19 l  19 599 l  clp gs col-1 s gr
+	[4.000000] 0 setdash
+% Polyline
+n 299 539 m 319 539 l  319 319 l gs col-1 s gr
+	[] 0 setdash
+n 317.000 327.000 m 319.000 319.000 l 321.000 327.000 l gs 2 setlinejoin col-1 s gr
+	[4.000000] 0 setdash
+% Polyline
+n 279 359 m 279 319 l gs col-1 s gr
+	[] 0 setdash
+n 277.000 327.000 m 279.000 319.000 l 281.000 327.000 l gs 2 setlinejoin col-1 s gr
+% Polyline
+n 439 79 m 499 79 l gs col-1 s gr
+n 491.000 77.000 m 499.000 79.000 l 491.000 81.000 l gs 2 setlinejoin col-1 s gr
+	[4.000000] 0 setdash
+% Polyline
+n 439 119 m 499 119 l gs col-1 s gr
+	[] 0 setdash
+n 491.000 117.000 m 499.000 119.000 l 491.000 121.000 l gs 2 setlinejoin col-1 s gr
+	1 setlinecap [1 3.000000] 3.000000 setdash
+% Polyline
+n 299 399 m 359 399 l gs col-1 s gr
+	[] 0 setdash 0 setlinecap
+n 351.000 397.000 m 359.000 399.000 l 351.000 401.000 l gs 2 setlinejoin col-1 s gr
+	1 setlinecap [1 3.000000] 3.000000 setdash
+% Polyline
+n 459 354 m 459 319 l gs col-1 s gr
+	[] 0 setdash 0 setlinecap
+n 457.000 327.000 m 459.000 319.000 l 461.000 327.000 l gs 2 setlinejoin col-1 s gr
+% Polyline
+n 379 119 m 379 99 l  119 99 l  119 119 l  clp gs col-1 s gr
+	1 setlinecap [1 3.000000] 3.000000 setdash
+% Polyline
+n 479 459 m 359 459 l  359 359 l  479 359 l  clp gs col-1 s gr
+	[] 0 setdash 0 setlinecap
+/Times-Roman findfont 12.00 scalefont setfont
+239 304 m 
+gs 1 -1 scale (chkfordata) col-1 show gr
+	1 setlinecap [1 3.000000] 3.000000 setdash
+% Polyline
+n 439 159 m 499 159 l gs col-1 s gr
+	[] 0 setdash 0 setlinecap
+n 491.000 157.000 m 499.000 159.000 l 491.000 161.000 l gs 2 setlinejoin col-1 s gr
+/Times-Roman findfont 12.00 scalefont setfont
+139 134 m 
+gs 1 -1 scale (parent:) col-1 show gr
+/Times-Roman findfont 12.00 scalefont setfont
+139 154 m 
+gs 1 -1 scale (return to main part) col-1 show gr
+/Times-Roman findfont 12.00 scalefont setfont
+259 134 m 
+gs 1 -1 scale (child:) col-1 show gr
+/Times-Roman findfont 12.00 scalefont setfont
+259 152 m 
+gs 1 -1 scale (open GL-windows) col-1 show gr
+/Times-Roman findfont 12.00 scalefont setfont
+259 170 m 
+gs 1 -1 scale (enter glutMainLoop) col-1 show gr
+/Times-Roman findfont 12.00 scalefont setfont
+234 114 m 
+gs 1 -1 scale (fork) col-1 show gr
+/Times-Roman findfont 12.00 scalefont setfont
+204 84 m 
+gs 1 -1 scale (graphics_init_) col-1 show gr
+/Times-Roman findfont 12.00 scalefont setfont
+239 244 m 
+gs 1 -1 scale (button and menu functions) col-1 show gr
+/Times-Roman findfont 12.00 scalefont setfont
+134 274 m 
+gs 1 -1 scale (GLUT) col-1 show gr
+/Times-Roman findfont 12.00 scalefont setfont
+139 384 m 
+gs 1 -1 scale (graphics_draw) col-1 show gr
+/Times-Roman findfont 12.00 scalefont setfont
+139 404 m 
+gs 1 -1 scale (copy graphics data to child) col-1 show gr
+/Times-Roman findfont 12.00 scalefont setfont
+139 422 m 
+gs 1 -1 scale (process and set flag) col-1 show gr
+/Times-Roman findfont 12.00 scalefont setfont
+139 544 m 
+gs 1 -1 scale (graphics_quit) col-1 show gr
+/Times-Roman findfont 12.00 scalefont setfont
+519 84 m 
+gs 1 -1 scale (function call) col-1 show gr
+/Times-Roman findfont 12.00 scalefont setfont
+519 124 m 
+gs 1 -1 scale (flag) col-1 show gr
+/Times-Roman findfont 12.00 scalefont setfont
+379 384 m 
+gs 1 -1 scale (graphics data) col-1 show gr
+/Times-Roman findfont 12.00 scalefont setfont
+379 402 m 
+gs 1 -1 scale (in shared memory) col-1 show gr
+/Times-Roman findfont 12.00 scalefont setfont
+519 164 m 
+gs 1 -1 scale (data flow) col-1 show gr
+/Times-Roman findfont 12.00 scalefont setfont
+439 304 m 
+gs 1 -1 scale (draw_it \(main draw function\)) col-1 show gr
+/Times-Roman findfont 24.00 scalefont setfont
+379 534 m 
+gs 1 -1 scale (Main structure of ) col-1 show gr
+/Times-Roman findfont 24.00 scalefont setfont
+419 569 m 
+gs 1 -1 scale (cfiles.c) col-1 show gr
+/Times-Roman findfont 12.00 scalefont setfont
+449 594 m 
+gs 1 -1 scale (30.7.98 bertram lueckehe) dup stringwidth pop 2 div neg 0 rmoveto  col-1 show gr
+/Times-Roman findfont 12.00 scalefont setfont
+29 304 m 
+gs 1 -1 scale (Main) col-1 show gr
+/Times-Roman findfont 12.00 scalefont setfont
+29 324 m 
+gs 1 -1 scale (program) col-1 show gr
+showpage
+$F2psEnd
diff --git a/flash2d/eval/diagfile.gnu b/flash2d/eval/diagfile.gnu
new file mode 100644
index 0000000..0e30720
--- /dev/null
+++ b/flash2d/eval/diagfile.gnu
@@ -0,0 +1,112 @@
+# script for visualizing diagnostic output
+# for gnuplot 3.5 (linux version)
+# j. behrens 7/94, 5/97
+#
+# no. of elements
+set term pbm color medium
+set autoscale;
+set title "Flash90 total No. of Elements";
+set xlabel "timestep no.";
+set ylabel "no. of elements";
+set output "elements.ppm"
+plot 'Flash90_diag.0000' us 1:2 wi lines;
+# pause -1 "ENTER to continue";
+#
+# no. of elements
+set title "Flash90 No. of Elements (fine grid)";
+set xlabel "timestep no.";
+set ylabel "no. of elmnts";
+set output "fine-elements.ppm"
+plot 'Flash90_diag.0000' us 1:3 wi lines;
+# pause -1 "ENTER to continue";
+#
+# no. of edges
+set title "Flash90 total No. of Edges";
+set xlabel "timestep no.";
+set ylabel "no. of edges";
+set output "edges.ppm"
+plot 'Flash90_diag.0000' us 1:4 wi lines;
+# pause -1 "ENTER to continue";
+#
+# no. of edges
+set title "Flash90 No. of Edges (fine grid)";
+set xlabel "timestep no.";
+set ylabel "no. of edges";
+set output "fine-edges.ppm"
+plot 'Flash90_diag.0000' us 1:5 wi lines;
+# pause -1 "ENTER to continue";
+#
+# no. of nodes
+set title "Flash90 No. of Nodes";
+set xlabel "timestep no.";
+set ylabel "no. of nodes";
+set output "nodes.ppm"
+plot 'Flash90_diag.0000' us 1:6 wi lines;
+# pause -1 "ENTER to continue";
+#
+# Min
+set title "Flash90 Minimum of u";
+set xlabel "timestep no.";
+set ylabel "Min.";
+set output "minimum.ppm"
+plot 'Flash90_diag.0000' us 1:7 wi lines;
+# pause -1 "ENTER to continue";
+#
+# Max
+set title "Flash90 Maximum of u";
+set xlabel "timestep no.";
+set ylabel "Max.";
+set output "maximum.ppm"
+plot 'Flash90_diag.0000' us 1:8 wi lines;
+# pause -1 "ENTER to continue";
+#
+# rfm
+set title "Flash90 RFM";
+set xlabel "timestep no.";
+set ylabel "rfm";
+#set noautoscale y;
+#set yrange [0.95:1.05];
+set output "rfm.ppm"
+plot 'Flash90_diag.0000' us 1:9 wi lines;
+# pause -1 "ENTER to continue";
+#
+# rsm
+set title "Flash90 RSM";
+set xlabel "timestep no.";
+set ylabel "rsm";
+#set autoscale;
+set output "rsm.ppm"
+plot 'Flash90_diag.0000' us 1:10 wi lines;
+# pause -1 "ENTER to continue";
+#
+# Max Norm Error
+set title "Flash90 Error (Max-Norm)";
+set xlabel "timestep no.";
+set ylabel "maximum norm";
+set output "maxnorm.ppm"
+plot 'Flash90_diag.0000' us 1:11 wi lines;
+# pause -1 "ENTER to continue";
+#
+# L2 Norm Error
+set title "Flash90 Error (L2-Norm)";
+set xlabel "timestep no.";
+set ylabel "L2 norm";
+set output "l2norm.ppm"
+plot 'Flash90_diag.0000' us 1:12 wi lines;
+# pause -1 "ENTER to continue";
+#
+# Diffusion Error
+set title "Flash90 Diffusion Error";
+set xlabel "timestep no.";
+set ylabel "diff. error";
+set output "diffusion.ppm"
+plot 'Flash90_diag.0000' us 1:13 wi lines;
+# pause -1 "ENTER to continue";
+#
+# Dispersion Error
+set title "Flash90 Dispersion Error";
+set xlabel "timestep no.";
+set ylabel "disp. error";
+set output "dispersion.ppm"
+plot 'Flash90_diag.0000' us 1:14 wi lines;
+# pause -1 "ENTER to continue";
diff --git a/flash2d/eval/diagmulti.m b/flash2d/eval/diagmulti.m
new file mode 100644
index 0000000..351eb39
--- /dev/null
+++ b/flash2d/eval/diagmulti.m
@@ -0,0 +1,149 @@
+function diags(file)
+% An M-File to postprocess data written by Flash90
+% j. behrens 03/2002
+%
+% clear old data structures and initialize
+%clear;
+
+% set constants
+LW=2;
+TF=14;
+AF=12;
+%
+% open file and read data
+file1=sprintf('%s%s',file,'.clip');
+disp(sprintf('%s%s\n','reading data from ',file1));
+iou = fopen(file1);
+RAW1 = fscanf(iou,'%d %d %d %d %d %d %f %f %f %f %f %f %f %f',[14,inf]);
+stat = fclose(iou);
+file1=sprintf('%s%s',file,'.dual');
+disp(sprintf('%s%s\n','reading data from ',file1));
+iou = fopen(file1);
+RAW2 = fscanf(iou,'%d %d %d %d %d %d %f %f %f %f %f %f %f %f',[14,inf]);
+stat = fclose(iou);
+file1=sprintf('%s%s',file,'.cons');
+disp(sprintf('%s%s\n','reading data from ',file1));
+iou = fopen(file1);
+RAW3 = fscanf(iou,'%d %d %d %d %d %d %f %f %f %f %f %f %f %f',[14,inf]);
+stat = fclose(iou);
+file1=sprintf('%s%s',file,'.quad');
+disp(sprintf('%s%s\n','reading data from ',file1));
+iou = fopen(file1);
+RAW4 = fscanf(iou,'%d %d %d %d %d %d %f %f %f %f %f %f %f %f',[14,inf]);
+stat = fclose(iou);
+file1=sprintf('%s%s',file,'.quad7');
+disp(sprintf('%s%s\n','reading data from ',file1));
+iou = fopen(file1);
+RAW5 = fscanf(iou,'%d %d %d %d %d %d %f %f %f %f %f %f %f %f',[14,inf]);
+stat = fclose(iou);
+file1=sprintf('%s%s',file,'.machenh');
+disp(sprintf('%s%s\n','reading data from ',file1));
+iou = fopen(file1);
+RAW6 = fscanf(iou,'%d %d %d %d %d %d %f %f %f %f %f %f %f %f',[14,inf]);
+stat = fclose(iou);
+disp('... done, now processing grid ...');
+%
+% determine sizes
+[n,m]= size(RAW1);
+step=RAW1(1,1:m);
+p1=plot(step,RAW1(2,1:m),'r-',step,RAW2(2,1:m),'b--',step,RAW3(2,1:m),'co-',step,RAW4(2,1:m),'y*-',step,RAW5(2,1:m),'gd-',step,RAW6(2,1:m),'m:');
+t1=title('No. of total elements');
+x1=xlabel('time step'); y1=ylabel('elements');
+legend('Clipping    ','Dual Mesh   ','Stani.Gravel','Quadrature  ','Quadrature 7','Machenhauer ',0)
+set(p1,'LineWidth',LW)
+set(t1,'FontSize',TF)
+set(x1,'FontSize',AF)
+set(y1,'FontSize',AF)
+pause
+
+p1=plot(step,RAW1(3,1:m),'r-',step,RAW2(3,1:m),'b--',step,RAW3(3,1:m),'co-',step,RAW4(3,1:m),'y*-',step,RAW5(3,1:m),'gd-',step,RAW6(3,1:m),'m:');
+t1=title('No. of fine grid elements');
+x1=xlabel('time step'); y1=ylabel('elements');
+legend('Clipping    ','Dual Mesh   ','Stani.Gravel','Quadrature  ','Quadrature 7','Machenhauer ',0)
+set(p1,'LineWidth',LW)
+set(t1,'FontSize',TF)
+set(x1,'FontSize',AF)
+set(y1,'FontSize',AF)
+pause
+
+p1=plot(step,RAW1(4,1:m),'r-',step,RAW2(4,1:m),'b--',step,RAW3(4,1:m),'co-',step,RAW4(4,1:m),'y*-',step,RAW5(4,1:m),'gd-',step,RAW6(4,1:m),'m:');
+t1=title('No. of total edges');
+x1=xlabel('time step'); y1=ylabel('edges');
+legend('Clipping    ','Dual Mesh   ','Stani.Gravel','Quadrature  ','Quadrature 7','Machenhauer ',0)
+set(p1,'LineWidth',LW)
+set(t1,'FontSize',TF)
+set(x1,'FontSize',AF)
+set(y1,'FontSize',AF)
+pause
+
+p1=plot(step,RAW1(5,1:m),'r-',step,RAW2(5,1:m),'b--',step,RAW3(5,1:m),'co-',step,RAW4(5,1:m),'y*-',step,RAW5(5,1:m),'gd-',step,RAW6(5,1:m),'m:');
+t1=title('No. of fine grid edges');
+x1=xlabel('time step'); y1=ylabel('edges');
+legend('Clipping    ','Dual Mesh   ','Stani.Gravel','Quadrature  ','Quadrature 7','Machenhauer ',0)
+set(p1,'LineWidth',LW)
+set(t1,'FontSize',TF)
+set(x1,'FontSize',AF)
+set(y1,'FontSize',AF)
+pause
+
+p1=plot(step,RAW1(6,1:m),'r-',step,RAW2(6,1:m),'b--',step,RAW3(6,1:m),'co-',step,RAW4(6,1:m),'y*-',step,RAW5(6,1:m),'gd-',step,RAW6(6,1:m),'m:');
+t1=title('No. of nodes');
+x1=xlabel('time step'); y1=ylabel('nodes');
+legend('Clipping    ','Dual Mesh   ','Stani.Gravel','Quadrature  ','Quadrature 7','Machenhauer ',0)
+set(p1,'LineWidth',LW)
+set(t1,'FontSize',TF)
+set(x1,'FontSize',AF)
+set(y1,'FontSize',AF)
+pause
+
+p1=plot(step,RAW1(7,1:m),'r-',step,RAW2(7,1:m),'b--',step,RAW3(7,1:m),'co-',step,RAW4(7,1:m),'y*-',step,RAW5(7,1:m),'gd-',step,RAW6(7,1:m),'m:');
+t1=title('Minimum tracer concentration');
+x1=xlabel('time step'); y1=ylabel('minimum');
+legend('Clipping    ','Dual Mesh   ','Stani.Gravel','Quadrature  ','Quadrature 7','Machenhauer ',0)
+set(p1,'LineWidth',LW)
+set(t1,'FontSize',TF)
+set(x1,'FontSize',AF)
+set(y1,'FontSize',AF)
+pause
+
+p1=plot(step,RAW1(8,1:m),'r-',step,RAW2(8,1:m),'b--',step,RAW3(8,1:m),'co-',step,RAW4(8,1:m),'y*-',step,RAW5(8,1:m),'gd-',step,RAW6(8,1:m),'m:');
+t1=title('Maximum tracer concentration');
+x1=xlabel('time step'); y1=ylabel('maximum');
+legend('Clipping    ','Dual Mesh   ','Stani.Gravel','Quadrature  ','Quadrature 7','Machenhauer ',0)
+set(p1,'LineWidth',LW)
+set(t1,'FontSize',TF)
+set(x1,'FontSize',AF)
+set(y1,'FontSize',AF)
+pause
+
+p1=plot(step,RAW1(9,1:m),'r-',step,RAW2(9,1:m),'b--',step,RAW3(9,1:m),'co-',step,RAW4(9,1:m),'y*-',step,RAW5(9,1:m),'gd-',step,RAW6(9,1:m),'m:');
+t1=title('Ratio of First Moments');
+x1=xlabel('time step'); y1=ylabel('rfm');
+legend('Clipping    ','Dual Mesh   ','Stani.Gravel','Quadrature  ','Quadrature 7','Machenhauer ',0)
+set(p1,'LineWidth',LW)
+set(t1,'FontSize',TF)
+set(x1,'FontSize',AF)
+set(y1,'FontSize',AF)
+pause
+
+p1=plot(step,RAW1(10,1:m),'r-',step,RAW2(10,1:m),'b--',step,RAW3(10,1:m),'co-',step,RAW4(10,1:m),'y*-',step,RAW5(10,1:m),'gd-',step,RAW6(10,1:m),'m:');
+t1=title('Ratio of Second Moments');
+x1=xlabel('time step'); y1=ylabel('rsm');
+legend('Clipping    ','Dual Mesh   ','Stani.Gravel','Quadrature  ','Quadrature 7','Machenhauer ',0)
+set(p1,'LineWidth',LW)
+set(t1,'FontSize',TF)
+set(x1,'FontSize',AF)
+set(y1,'FontSize',AF)
+pause
+
+p1=plot(step,RAW1(12,1:m),'r-',step,RAW2(12,1:m),'b--',step,RAW3(12,1:m),'co-',step,RAW4(12,1:m),'y*-',step,RAW5(12,1:m),'gd-',step,RAW6(12,1:m),'m:');
+t1=title('L2-Norm');
+x1=xlabel('time step'); y1=ylabel('l2');
+legend('Clipping    ','Dual Mesh   ','Stani.Gravel','Quadrature  ','Quadrature 7','Machenhauer ',0)
+set(p1,'LineWidth',LW)
+set(t1,'FontSize',TF)
+set(x1,'FontSize',AF)
+set(y1,'FontSize',AF)
+%pause
+
+return
diff --git a/flash2d/eval/diagprint.gnu b/flash2d/eval/diagprint.gnu
new file mode 100644
index 0000000..3eff639
--- /dev/null
+++ b/flash2d/eval/diagprint.gnu
@@ -0,0 +1,112 @@
+# script for visualizing diagnostic output
+# for gnuplot 3.5 (linux version)
+# j. behrens 7/94, 5/97
+#
+# no. of elements
+set term post eps
+set autoscale;
+set title "Flash90 total No. of Elements";
+set xlabel "timestep no.";
+set ylabel "no. of elements";
+set output "elements.eps"
+plot 'Flash90_diag.0000' us 1:2 wi lines;
+# pause -1 "ENTER to continue";
+#
+# no. of elements
+set title "Flash90 No. of Elements (fine grid)";
+set xlabel "timestep no.";
+set ylabel "no. of elmnts";
+set output "fine-elements.eps"
+plot 'Flash90_diag.0000' us 1:3 wi lines;
+# pause -1 "ENTER to continue";
+#
+# no. of edges
+set title "Flash90 total No. of Edges";
+set xlabel "timestep no.";
+set ylabel "no. of edges";
+set output "edges.eps"
+plot 'Flash90_diag.0000' us 1:4 wi lines;
+# pause -1 "ENTER to continue";
+#
+# no. of edges
+set title "Flash90 No. of Edges (fine grid)";
+set xlabel "timestep no.";
+set ylabel "no. of edges";
+set output "fine-edges.eps"
+plot 'Flash90_diag.0000' us 1:5 wi lines;
+# pause -1 "ENTER to continue";
+#
+# no. of nodes
+set title "Flash90 No. of Nodes";
+set xlabel "timestep no.";
+set ylabel "no. of nodes";
+set output "nodes.eps"
+plot 'Flash90_diag.0000' us 1:6 wi lines;
+# pause -1 "ENTER to continue";
+#
+# Min
+set title "Flash90 Minimum of u";
+set xlabel "timestep no.";
+set ylabel "Min.";
+set output "minimum.eps"
+plot 'Flash90_diag.0000' us 1:7 wi lines;
+# pause -1 "ENTER to continue";
+#
+# Max
+set title "Flash90 Maximum of u";
+set xlabel "timestep no.";
+set ylabel "Max.";
+set output "maximum.eps"
+plot 'Flash90_diag.0000' us 1:8 wi lines;
+# pause -1 "ENTER to continue";
+#
+# rfm
+set title "Flash90 RFM";
+set xlabel "timestep no.";
+set ylabel "rfm";
+#set noautoscale y;
+#set yrange [0.95:1.05];
+set output "rfm.eps"
+plot 'Flash90_diag.0000' us 1:9 wi lines;
+# pause -1 "ENTER to continue";
+#
+# rsm
+set title "Flash90 RSM";
+set xlabel "timestep no.";
+set ylabel "rsm";
+#set autoscale;
+set output "rsm.eps"
+plot 'Flash90_diag.0000' us 1:10 wi lines;
+# pause -1 "ENTER to continue";
+#
+# Max Norm Error
+set title "Flash90 Error (Max-Norm)";
+set xlabel "timestep no.";
+set ylabel "maximum norm";
+set output "maxnorm.eps"
+plot 'Flash90_diag.0000' us 1:11 wi lines;
+# pause -1 "ENTER to continue";
+#
+# L2 Norm Error
+set title "Flash90 Error (L2-Norm)";
+set xlabel "timestep no.";
+set ylabel "L2 norm";
+set output "l2norm.eps"
+plot 'Flash90_diag.0000' us 1:12 wi lines;
+# pause -1 "ENTER to continue";
+#
+# Diffusion Error
+set title "Flash90 Diffusion Error";
+set xlabel "timestep no.";
+set ylabel "diff. error";
+set output "diffusion.eps"
+plot 'Flash90_diag.0000' us 1:13 wi lines;
+# pause -1 "ENTER to continue";
+#
+# Dispersion Error
+set title "Flash90 Dispersion Error";
+set xlabel "timestep no.";
+set ylabel "disp. error";
+set output "dispersion.eps"
+plot 'Flash90_diag.0000' us 1:14 wi lines;
+# pause -1 "ENTER to continue";
diff --git a/flash2d/eval/diags.gnu b/flash2d/eval/diags.gnu
new file mode 100644
index 0000000..c3b6571
--- /dev/null
+++ b/flash2d/eval/diags.gnu
@@ -0,0 +1,98 @@
+# script for visualizing diagnostic output
+# for gnuplot 3.5 (linux version)
+# j. behrens 7/94, 5/97
+#
+# no. of elements
+set autoscale;
+set title "Flash90 total No. of Elements";
+set xlabel "timestep no.";
+set ylabel "no. of elements";
+plot 'Flash90_diag.0000' us 1:2 wi lines;
+pause -1 "ENTER to continue";
+#
+# no. of elements
+set title "Flash90 No. of Elements (fine grid)";
+set xlabel "timestep no.";
+set ylabel "no. of elmnts";
+plot 'Flash90_diag.0000' us 1:3 wi lines;
+pause -1 "ENTER to continue";
+#
+# no. of edges
+set title "Flash90 total No. of Edges";
+set xlabel "timestep no.";
+set ylabel "no. of edges";
+plot 'Flash90_diag.0000' us 1:4 wi lines;
+pause -1 "ENTER to continue";
+#
+# no. of edges
+set title "Flash90 No. of Edges (fine grid)";
+set xlabel "timestep no.";
+set ylabel "no. of edges";
+plot 'Flash90_diag.0000' us 1:5 wi lines;
+pause -1 "ENTER to continue";
+#
+# no. of nodes
+set title "Flash90 No. of Nodes";
+set xlabel "timestep no.";
+set ylabel "no. of nodes";
+plot 'Flash90_diag.0000' us 1:6 wi lines;
+pause -1 "ENTER to continue";
+#
+# Min
+set title "Flash90 Minimum of u";
+set xlabel "timestep no.";
+set ylabel "Min.";
+plot 'Flash90_diag.0000' us 1:7 wi lines;
+pause -1 "ENTER to continue";
+#
+# Max
+set title "Flash90 Maximum of u";
+set xlabel "timestep no.";
+set ylabel "Max.";
+plot 'Flash90_diag.0000' us 1:8 wi lines;
+pause -1 "ENTER to continue";
+#
+# rfm
+set title "Flash90 RFM";
+set xlabel "timestep no.";
+set ylabel "rfm";
+#set noautoscale y;
+#set yrange [0.95:1.05];
+plot 'Flash90_diag.0000' us 1:9 wi lines;
+pause -1 "ENTER to continue";
+#
+# rsm
+set title "Flash90 RSM";
+set xlabel "timestep no.";
+set ylabel "rsm";
+#set autoscale;
+plot 'Flash90_diag.0000' us 1:10 wi lines;
+pause -1 "ENTER to continue";
+#
+# Max Norm Error
+set title "Flash90 Error (Max-Norm)";
+set xlabel "timestep no.";
+set ylabel "maximum norm";
+plot 'Flash90_diag.0000' us 1:11 wi lines;
+pause -1 "ENTER to continue";
+#
+# L2 Norm Error
+set title "Flash90 Error (L2-Norm)";
+set xlabel "timestep no.";
+set ylabel "L2 norm";
+plot 'Flash90_diag.0000' us 1:12 wi lines;
+pause -1 "ENTER to continue";
+#
+# Diffusion Error
+set title "Flash90 Diffusion Error";
+set xlabel "timestep no.";
+set ylabel "diff. error";
+plot 'Flash90_diag.0000' us 1:13 wi lines;
+pause -1 "ENTER to continue";
+#
+# Dispersion Error
+set title "Flash90 Dispersion Error";
+set xlabel "timestep no.";
+set ylabel "disp. error";
+plot 'Flash90_diag.0000' us 1:14 wi lines;
+pause -1 "ENTER to continue";
diff --git a/flash2d/eval/diags.m b/flash2d/eval/diags.m
new file mode 100644
index 0000000..ee2fa12
--- /dev/null
+++ b/flash2d/eval/diags.m
@@ -0,0 +1,79 @@
+function diags(file)
+% An M-File to postprocess data written by Flash90
+% j. behrens 03/2002
+%
+% clear old data structures and initialize
+%clear;
+%
+% open file and read data
+disp('reading data ...');
+iou = fopen(file);
+RAW = fscanf(iou,'%d %d %d %d %d %d %f %f %f %f %f %f %f %f %f',[15,inf]);
+stat = fclose(iou);
+disp('... done, now processing grid ...');
+%
+% determine sizes
+[n,m]= size(RAW);
+step=RAW(1,1:m);
+elements=RAW(2,1:m);
+plot(step,elements)
+title('No. of total elements')
+xlabel('time step'); ylabel('elements')
+pause
+
+felements=RAW(3,1:m);
+plot(step,felements)
+title('No. of fine grid elements')
+xlabel('time step'); ylabel('elements')
+pause
+
+edges=RAW(4,1:m);
+plot(step,edges)
+title('No. of total edges')
+xlabel('time step'); ylabel('edges')
+pause
+
+fedges=RAW(5,1:m);
+plot(step,fedges)
+title('No. of fine grid edges')
+xlabel('time step'); ylabel('edges')
+pause
+
+nodes=RAW(6,1:m);
+plot(step,nodes)
+title('No. of nodes')
+xlabel('time step'); ylabel('nodes')
+pause
+
+mini=RAW(7,1:m);
+plot(step,mini)
+title('Minimum tracer concentration')
+xlabel('time step'); ylabel('minimum')
+pause
+
+maxi=RAW(8,1:m);
+plot(step,maxi)
+title('Maximum tracer concentration')
+xlabel('time step'); ylabel('maximum')
+pause
+
+rfm=RAW(9,1:m);
+plot(step,rfm)
+title('Ration of First Moments')
+xlabel('time step'); ylabel('rfm')
+pause
+
+rsm=RAW(10,1:m);
+plot(step,rsm)
+title('Ration of Second Moments')
+xlabel('time step'); ylabel('rsm')
+pause
+
+l2=RAW(12,1:m);
+plot(step,l2)
+title('L2-Norm')
+xlabel('time step'); ylabel('l2')
+pause
+
+
+return
diff --git a/flash2d/eval/gmv_default.attr b/flash2d/eval/gmv_default.attr
new file mode 100644
index 0000000..1fdb67b
--- /dev/null
+++ b/flash2d/eval/gmv_default.attr
@@ -0,0 +1,246 @@
+gmv_attributes
+
+filename /home/bornemann/mentrup/dev/flash2d/irix/Flash90_gmv.0000
+
+matrgba 4 0.000000e+00 0.000000e+00 0.000000e+00 1.000000e+00 
+
+active_mat 1 0 
+
+angles -9.000000e+01 9.000000e+01 0.000000e+00
+
+magnify 1.122018e+00
+
+range 1.020000e+00 1.020000e+00 1.020000e+00
+
+span 1.766692e+00
+
+aspect 1.201884e+00
+
+pan 0.000000e+00 0.000000e+00
+
+translate 0.000000e+00 0.000000e+00 -5.000000e-01
+
+glob_icmin -5.100000e-01 -5.100000e-01 -1.000000e-02
+
+glob_icmax 5.100000e-01 5.100000e-01 1.010000e+00
+
+explodefact 0.000000e+00 0.000000e+00
+
+velscale 1.000000e+00
+
+velarrowsize 1.000000e+00
+
+axisflag 1
+
+nodesflag 0
+
+linesflag 0
+
+polysflag 0
+
+cellsflag 1
+
+celledgesflag 1
+
+cellexpflag -1
+
+timeflag 0
+
+cycleflag 0
+
+distscaleflag 0
+
+textureflag 0
+
+tracerflag 0
+
+nodefieldactive -1
+
+cellfieldactive 4
+
+tracefieldactive 0
+
+isosurf_on 1020 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+
+isosurf_val 1020 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+isosurf_field 1020 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+
+backgroundcolor 16777215
+
+globfieldmin 16 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 4.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 -5.000000e-01 -5.000000e-01 0.000000e+00 
+
+globfieldmax 16 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e+00 1.500000e+01 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 5.000000e-01 5.000000e-01 1.000000e+00 
+
+nfld_nice_min 16 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 4.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 -5.000000e-01 -5.000000e-01 0.000000e+00 
+
+nfld_nice_max 16 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e+00 1.500000e+01 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 5.000000e-01 5.000000e-01 1.000000e+00 
+
+nfieldlimauto 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+
+nfld_nice 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+
+nfld_log 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+
+light  0.000000e+00 0.000000e+00
+
+glob_icmino -5.100000e-01 -5.100000e-01 -1.000000e-02
+
+glob_icmaxo 5.100000e-01 5.100000e-01 1.010000e+00
+
+xscale 1.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+yscale 1.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+zscale 1.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+cliponbox 0
+
+nrefl_loops 1
+
+reflect 0 0 0
+
+clipvalue 0.000000e+00 1.000000e+00
+
+_minbdval -5.100000e-01 -5.100000e-01 -1.000000e-02
+
+_maxbdval 5.100000e-01 5.100000e-01 1.010000e+00
+
+_minfdval -5.100000e-01 -5.100000e-01 -1.000000e-02
+
+_maxfdval 5.100000e-01 5.100000e-01 1.010000e+00
+
+mat_order 0 
+
+scaleaxiso 1.000000e+00 1.000000e+00 1.000000e+00
+
+scaleaxis 1.000000e+00 1.000000e+00 1.000000e+00
+
+nodeselflag 11 1000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
+
+nodeandorflag 10 0 0 0 0 0 0 0 0 0 0 
+
+cellselflag 11 1000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
+
+cellandorflag 10 0 0 0 0 0 0 0 0 0 0 
+
+colorbarflag 1
+
+colorbarpref 0
+
+boundingboxflag 0
+
+_minbbval -5.000000e-01 -5.000000e-01 0.000000e+00
+
+_maxbbval 5.000000e-01 5.000000e-01 1.000000e+00
+
+_minbbvalo -5.000000e-01 -5.000000e-01 0.000000e+00
+
+_maxbbvalo 5.000000e-01 5.000000e-01 1.000000e+00
+
+viewflag 0
+
+flypos 0.000000e+00 0.000000e+00 0.000000e+00 
+
+cliponcellsel 0
+
+vectfld_ -1 -1 -1
+
+speedfld 7
+
+maxspeed 0.000000e+00
+
+vectorflag 0
+
+vectorarrow 1
+
+cvectfld_ -1 -1 -1
+
+cspeedfld 2
+
+cmaxspeed 0.000000e+00
+
+cvectorflag 0
+
+titleflag 1
+
+titlestr 
+
+titlestr2 
+
+cellcontflag 0
+
+nodeselmat_on 0
+
+cellselmat_on 0
+
+fieldcalc 5 
+   4 -1 -1 -1 0.000000e+00 FldCalc1 
+   4 -1 -1 -1 0.000000e+00 FldCalc2 
+   4 -1 -1 -1 0.000000e+00 FldCalc3 
+   4 -1 -1 -1 0.000000e+00 FldCalc4 
+   4 -1 -1 -1 0.000000e+00 FldCalc5 
+
+cfieldcalc 5 
+   4 -1 -1 -1 0.000000e+00 FldCalc1 
+   4 -1 -1 -1 0.000000e+00 FldCalc2 
+   4 -1 -1 -1 0.000000e+00 FldCalc3 
+   4 -1 -1 -1 0.000000e+00 FldCalc4 
+   4 -1 -1 -1 0.000000e+00 FldCalc5 
+
+bboxcoordflag 1
+
+nodenumflag 0
+
+cellnumflag 0
+
+globfieldcmax 8 1.500000e+01 1.000000e-05 1.000000e-05 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+globfieldcmin 8 4.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+cfld_nice_min 8 4.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+cfld_nice_max 8 1.500000e+01 1.000000e-05 1.000000e-05 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+cfieldlimauto 8 0 0 0 0 0 0 0 0 
+
+cfld_nice 8 0 0 0 0 0 0 0 0 
+
+cfld_log 8 0 0 0 0 0 0 0 0 
+
+pnt_size 2 0
+
+line_size 1 0
+
+node0matflag 0
+
+cell0matflag 0
+
+tracehistflag 0
+
+tracehiststop 0
+
+tracehiststride 1
+
+tracehistpoints 1
+
+cellshadeflag 0
+
+fieldcolortype 0
+
+nset_contours 10
+
+facerefineflag 0
+
+cellnormflag 0
+
+cellmedianedgeflag 0
+
+cellnodenumflag 0
+
+cellfacenumflag 0
+
+polystiplflag 0
+
+end_attributes
+
diff --git a/flash2d/eval/gmv_wind.attr b/flash2d/eval/gmv_wind.attr
new file mode 100644
index 0000000..69bb94e
--- /dev/null
+++ b/flash2d/eval/gmv_wind.attr
@@ -0,0 +1,246 @@
+gmv_attributes
+
+filename /home/bornemann/mentrup/dev/flash2d/irix/Flash90_gmv.0001
+
+matrgba 4 0.000000e+00 0.000000e+00 0.000000e+00 1.000000e+00 
+
+active_mat 1 0 
+
+angles -9.000000e+01 9.000000e+01 0.000000e+00
+
+magnify 1.122018e+00
+
+range 1.020000e+00 1.020000e+00 1.027721e+00
+
+span 1.771161e+00
+
+aspect 1.201884e+00
+
+pan 0.000000e+00 0.000000e+00
+
+translate 0.000000e+00 0.000000e+00 -5.037850e-01
+
+glob_icmin -5.100000e-01 -5.100000e-01 -1.007570e-02
+
+glob_icmax 5.100000e-01 5.100000e-01 1.017646e+00
+
+explodefact 0.000000e+00 0.000000e+00
+
+velscale 2.200000e+00
+
+velarrowsize 6.000000e-01
+
+axisflag 1
+
+nodesflag 1
+
+linesflag 0
+
+polysflag 0
+
+cellsflag 0
+
+celledgesflag 0
+
+cellexpflag -1
+
+timeflag 0
+
+cycleflag 0
+
+distscaleflag 0
+
+textureflag 0
+
+tracerflag 0
+
+nodefieldactive 4
+
+cellfieldactive -1
+
+tracefieldactive 0
+
+isosurf_on 1020 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+
+isosurf_val 1020 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+isosurf_field 1020 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+
+backgroundcolor 16777215
+
+globfieldmin 16 -7.965000e-02 -1.271300e-01 0.000000e+00 0.000000e+00 0.000000e+00 4.000000e+00 0.000000e+00 0.000000e+00 -8.175000e-02 -3.376000e-02 0.000000e+00 0.000000e+00 0.000000e+00 -5.000000e-01 -5.000000e-01 0.000000e+00 
+
+globfieldmax 16 8.175000e-02 3.376000e-02 1.000000e-05 1.000000e-05 1.000000e+00 1.500000e+01 1.000000e-05 1.328779e-01 7.965000e-02 1.271300e-01 1.000000e-05 1.000000e-05 1.000000e-05 5.000000e-01 5.000000e-01 1.007570e+00 
+
+nfld_nice_min 16 -7.965000e-02 -1.271300e-01 0.000000e+00 0.000000e+00 0.000000e+00 4.000000e+00 0.000000e+00 0.000000e+00 -8.175000e-02 -3.376000e-02 0.000000e+00 0.000000e+00 0.000000e+00 -5.000000e-01 -5.000000e-01 0.000000e+00 
+
+nfld_nice_max 16 8.175000e-02 3.376000e-02 1.000000e-05 1.000000e-05 1.000000e+00 1.500000e+01 1.000000e-05 1.000000e-05 7.965000e-02 1.271300e-01 1.000000e-05 1.000000e-05 1.000000e-05 5.000000e-01 5.000000e-01 1.007570e+00 
+
+nfieldlimauto 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+
+nfld_nice 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+
+nfld_log 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+
+light  0.000000e+00 0.000000e+00
+
+glob_icmino -5.100000e-01 -5.100000e-01 -1.007570e-02
+
+glob_icmaxo 5.100000e-01 5.100000e-01 1.017646e+00
+
+xscale 1.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+yscale 1.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+zscale 1.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+cliponbox 0
+
+nrefl_loops 1
+
+reflect 0 0 0
+
+clipvalue 0.000000e+00 1.000000e+00
+
+_minbdval -5.100000e-01 -5.100000e-01 -1.007570e-02
+
+_maxbdval 5.100000e-01 5.100000e-01 1.017646e+00
+
+_minfdval -5.100000e-01 -5.100000e-01 -1.007570e-02
+
+_maxfdval 5.100000e-01 5.100000e-01 1.017646e+00
+
+mat_order 0 
+
+scaleaxiso 1.000000e+00 1.000000e+00 1.000000e+00
+
+scaleaxis 1.000000e+00 1.000000e+00 1.000000e+00
+
+nodeselflag 11 1000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
+
+nodeandorflag 10 0 0 0 0 0 0 0 0 0 0 
+
+cellselflag 11 1000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
+
+cellandorflag 10 0 0 0 0 0 0 0 0 0 0 
+
+colorbarflag 1
+
+colorbarpref 0
+
+boundingboxflag 0
+
+_minbbval -5.000000e-01 -5.000000e-01 0.000000e+00
+
+_maxbbval 5.000000e-01 5.000000e-01 1.007570e+00
+
+_minbbvalo -5.000000e-01 -5.000000e-01 0.000000e+00
+
+_maxbbvalo 5.000000e-01 5.000000e-01 1.007570e+00
+
+viewflag 0
+
+flypos 0.000000e+00 0.000000e+00 0.000000e+00 
+
+cliponcellsel 0
+
+vectfld_ 8 9 -1
+
+speedfld 7
+
+maxspeed 1.328779e-01
+
+vectorflag 1
+
+vectorarrow 1
+
+cvectfld_ -1 -1 -1
+
+cspeedfld 2
+
+cmaxspeed 0.000000e+00
+
+cvectorflag 0
+
+titleflag 1
+
+titlestr 
+
+titlestr2 
+
+cellcontflag 0
+
+nodeselmat_on 0
+
+cellselmat_on 0
+
+fieldcalc 5 
+   4 0 0 8 -1.000000e+00 -X 
+   4 1 0 8 -1.000000e+00 -Y 
+   4 -1 -1 -1 0.000000e+00 FldCalc3 
+   4 -1 -1 -1 0.000000e+00 FldCalc4 
+   4 -1 -1 -1 0.000000e+00 FldCalc5 
+
+cfieldcalc 5 
+   4 -1 -1 -1 0.000000e+00 FldCalc1 
+   4 -1 -1 -1 0.000000e+00 FldCalc2 
+   4 -1 -1 -1 0.000000e+00 FldCalc3 
+   4 -1 -1 -1 0.000000e+00 FldCalc4 
+   4 -1 -1 -1 0.000000e+00 FldCalc5 
+
+bboxcoordflag 1
+
+nodenumflag 0
+
+cellnumflag 0
+
+globfieldcmax 8 1.500000e+01 1.000000e-05 1.000000e-05 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+globfieldcmin 8 4.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+cfld_nice_min 8 4.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+cfld_nice_max 8 1.500000e+01 1.000000e-05 1.000000e-05 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+cfieldlimauto 8 0 0 0 0 0 0 0 0 
+
+cfld_nice 8 0 0 0 0 0 0 0 0 
+
+cfld_log 8 0 0 0 0 0 0 0 0 
+
+pnt_size 2 0
+
+line_size 1 0
+
+node0matflag 0
+
+cell0matflag 0
+
+tracehistflag 0
+
+tracehiststop 0
+
+tracehiststride 1
+
+tracehistpoints 1
+
+cellshadeflag 0
+
+fieldcolortype 0
+
+nset_contours 10
+
+facerefineflag 0
+
+cellnormflag 0
+
+cellmedianedgeflag 0
+
+cellnodenumflag 0
+
+cellfacenumflag 0
+
+polystiplflag 0
+
+end_attributes
+
diff --git a/flash2d/eval/gmvlevel.attr b/flash2d/eval/gmvlevel.attr
new file mode 100644
index 0000000..1f2c428
--- /dev/null
+++ b/flash2d/eval/gmvlevel.attr
@@ -0,0 +1,244 @@
+gmv_attributes
+
+filename /home/behrens/Development/flash2d/linux/Flash90_gmv.0005
+
+matrgba 4 0.000000e+00 1.000000e+00 0.000000e+00 1.000000e+00 
+
+active_mat 1 0 
+
+angles -9.000000e+01 9.000000e+01 0.000000e+00
+
+magnify 4.998045e+00
+
+range 1.020000e+00 1.020000e+00 6.016807e+00
+
+span 6.187306e+00
+
+aspect 1.285714e+00
+
+pan 0.000000e+00 0.000000e+00
+
+translate -0.000000e+00 -0.000000e+00 -2.102625e+00
+
+glob_icmin -5.100000e-01 -5.100000e-01 -9.057783e-01
+
+glob_icmax 5.100000e-01 5.100000e-01 5.111028e+00
+
+explodefact 0.000000e+00 0.000000e+00
+
+velscale 1.000000e+00
+
+velarrowsize 1.000000e+00
+
+axisflag 1
+
+nodesflag 0
+
+linesflag 0
+
+polysflag 0
+
+cellsflag 1
+
+celledgesflag 1
+
+cellexpflag -1
+
+timeflag 0
+
+cycleflag 0
+
+distscaleflag 0
+
+textureflag 1
+
+tracerflag 0
+
+nodefieldactive -1
+
+cellfieldactive 16
+
+tracefieldactive 0
+
+isosurf_on 1020 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+
+isosurf_val 1020 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+isosurf_field 1020 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+
+backgroundcolor 4294967295
+
+globfieldmin 16 -3.376000e-02 -3.376000e-02 0.000000e+00 0.000000e+00 -8.467900e-01 4.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 -5.000000e-01 -5.000000e-01 -8.467900e-01 
+
+globfieldmax 16 3.376000e-02 3.376000e-02 1.000000e-05 1.000000e-05 5.052040e+00 1.500000e+01 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 5.000000e-01 5.000000e-01 5.052040e+00 
+
+nfld_nice_min 16 -3.376000e-02 -3.376000e-02 0.000000e+00 0.000000e+00 -8.467900e-01 4.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 -5.000000e-01 -5.000000e-01 -8.467900e-01 
+
+nfld_nice_max 16 3.376000e-02 3.376000e-02 1.000000e-05 1.000000e-05 5.052040e+00 1.500000e+01 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 5.000000e-01 5.000000e-01 5.052040e+00 
+
+nfieldlimauto 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+
+nfld_nice 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+
+nfld_log 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+
+light  -7.400000e-01 3.200000e-01
+
+glob_icmino -5.100000e-01 -5.100000e-01 -9.057783e-01
+
+glob_icmaxo 5.100000e-01 5.100000e-01 5.111028e+00
+
+xscale 1.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+yscale 1.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+zscale 1.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+cliponbox 0
+
+nrefl_loops 1
+
+reflect 0 0 0
+
+clipvalue 0.000000e+00 1.000000e+00
+
+_minbdval -5.100000e-01 -5.100000e-01 -9.057783e-01
+
+_maxbdval 5.100000e-01 5.100000e-01 5.111028e+00
+
+_minfdval -5.100000e-01 -5.100000e-01 -9.057783e-01
+
+_maxfdval 5.100000e-01 5.100000e-01 5.111028e+00
+
+mat_order 0 
+
+scaleaxiso 1.000000e+00 1.000000e+00 1.000000e+00
+
+scaleaxis 1.000000e+00 1.000000e+00 1.000000e+00
+
+nodeselflag 11 1000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
+
+nodeandorflag 10 0 0 0 0 0 0 0 0 0 0 
+
+cellselflag 11 1000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
+
+cellandorflag 10 0 0 0 0 0 0 0 0 0 0 
+
+colorbarflag 1
+
+colorbarpref 0
+
+boundingboxflag 0
+
+_minbbval -5.000000e-01 -5.000000e-01 -8.467900e-01
+
+_maxbbval 5.000000e-01 5.000000e-01 5.052040e+00
+
+_minbbvalo -5.000000e-01 -5.000000e-01 -8.467900e-01
+
+_maxbbvalo 5.000000e-01 5.000000e-01 5.052040e+00
+
+viewflag 0
+
+flypos 0.000000e+00 0.000000e+00 0.000000e+00 
+
+cliponcellsel 0
+
+vectfld_ -1 -1 -1
+
+speedfld 7
+
+maxspeed 0.000000e+00
+
+vectorflag 0
+
+vectorarrow 1
+
+vectorlog 0
+
+cvectfld_ -1 -1 -1
+
+cspeedfld 2
+
+cmaxspeed 0.000000e+00
+
+cvectorflag 0
+
+titleflag 0
+
+cellcontflag 0
+
+nodeselmat_on 0
+
+cellselmat_on 0
+
+fieldcalc 5 
+   4 -1 -1 -1 0.000000e+00 FldCalc1 
+   4 -1 -1 -1 0.000000e+00 FldCalc2 
+   4 -1 -1 -1 0.000000e+00 FldCalc3 
+   4 -1 -1 -1 0.000000e+00 FldCalc4 
+   4 -1 -1 -1 0.000000e+00 FldCalc5 
+
+cfieldcalc 5 
+   4 -1 -1 -1 0.000000e+00 FldCalc1 
+   4 -1 -1 -1 0.000000e+00 FldCalc2 
+   4 -1 -1 -1 0.000000e+00 FldCalc3 
+   4 -1 -1 -1 0.000000e+00 FldCalc4 
+   4 -1 -1 -1 0.000000e+00 FldCalc5 
+
+bboxcoordflag 1
+
+nodenumflag 0
+
+cellnumflag 0
+
+globfieldcmax 8 1.500000e+01 1.000000e-05 1.000000e-05 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+globfieldcmin 8 4.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+cfld_nice_min 8 4.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+cfld_nice_max 8 1.500000e+01 1.000000e-05 1.000000e-05 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+cfieldlimauto 8 0 0 0 0 0 0 0 0 
+
+cfld_nice 8 0 0 0 0 0 0 0 0 
+
+cfld_log 8 0 0 0 0 0 0 0 0 
+
+pnt_size 2 0
+
+line_size 1 0
+
+node0matflag 0
+
+cell0matflag 0
+
+tracehistflag 0
+
+tracehiststop 0
+
+tracehiststride 1
+
+tracehistpoints 1
+
+cellshadeflag 0
+
+fieldcolortype 0
+
+nset_contours 10
+
+facerefineflag 0
+
+cellnormflag 0
+
+cellmedianedgeflag 0
+
+cellnodenumflag 0
+
+cellfacenumflag 0
+
+polystiplflag 0
+
+end_attributes
+
diff --git a/flash2d/eval/gmvtracer.attr b/flash2d/eval/gmvtracer.attr
new file mode 100644
index 0000000..e0bca08
--- /dev/null
+++ b/flash2d/eval/gmvtracer.attr
@@ -0,0 +1,244 @@
+gmv_attributes
+
+filename /home/behrens/Development/flash2d/linux/Flash90_gmv.0004
+
+matrgba 4 0.000000e+00 1.000000e+00 0.000000e+00 1.000000e+00 
+
+active_mat 1 0 
+
+angles -9.000000e+01 4.850000e+01 0.000000e+00
+
+magnify 1.357688e+00
+
+range 1.020000e+00 1.020000e+00 6.040124e-01
+
+span 1.563851e+00
+
+aspect 1.285714e+00
+
+pan 0.000000e+00 0.000000e+00
+
+translate 4.336809e-18 -0.000000e+00 -2.039515e-01
+
+glob_icmin -5.100000e-01 -5.100000e-01 -9.805469e-02
+
+glob_icmax 5.100000e-01 5.100000e-01 5.059577e-01
+
+explodefact 0.000000e+00 0.000000e+00
+
+velscale 1.000000e+00
+
+velarrowsize 1.000000e+00
+
+axisflag 1
+
+nodesflag 0
+
+linesflag 0
+
+polysflag 0
+
+cellsflag 1
+
+celledgesflag 1
+
+cellexpflag -1
+
+timeflag 0
+
+cycleflag 0
+
+distscaleflag 0
+
+textureflag 1
+
+tracerflag 0
+
+nodefieldactive -1
+
+cellfieldactive 4
+
+tracefieldactive 0
+
+isosurf_on 1020 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+
+isosurf_val 1020 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+isosurf_field 1020 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+
+backgroundcolor 4294967295
+
+globfieldmin 16 -3.376000e-02 -3.376000e-02 0.000000e+00 0.000000e+00 -9.213300e-01 4.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 -5.000000e-01 -5.000000e-01 -9.213300e-01 
+
+globfieldmax 16 3.376000e-02 3.376000e-02 1.000000e-05 1.000000e-05 5.000360e+00 1.500000e+01 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 5.000000e-01 5.000000e-01 5.000360e+00 
+
+nfld_nice_min 16 -3.376000e-02 -3.376000e-02 0.000000e+00 0.000000e+00 -9.213300e-01 4.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 -5.000000e-01 -5.000000e-01 -9.213300e-01 
+
+nfld_nice_max 16 3.376000e-02 3.376000e-02 1.000000e-05 1.000000e-05 5.000360e+00 1.500000e+01 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 5.000000e-01 5.000000e-01 5.000360e+00 
+
+nfieldlimauto 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+
+nfld_nice 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+
+nfld_log 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+
+light  -7.400000e-01 3.200000e-01
+
+glob_icmino -5.100000e-01 -5.100000e-01 -9.805469e-02
+
+glob_icmaxo 5.100000e-01 5.100000e-01 5.059577e-01
+
+xscale 1.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+yscale 1.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+zscale 1.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+cliponbox 0
+
+nrefl_loops 1
+
+reflect 0 0 0
+
+clipvalue 0.000000e+00 1.000000e+00
+
+_minbdval -5.100000e-01 -5.100000e-01 -9.805469e-02
+
+_maxbdval 5.100000e-01 5.100000e-01 5.059577e-01
+
+_minfdval -5.100000e-01 -5.100000e-01 -9.805469e-02
+
+_maxfdval 5.100000e-01 5.100000e-01 5.059577e-01
+
+mat_order 0 
+
+scaleaxiso 1.000000e+00 1.000000e+00 1.000000e+00
+
+scaleaxis 1.000000e+00 1.000000e+00 1.000000e-01
+
+nodeselflag 11 1000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
+
+nodeandorflag 10 0 0 0 0 0 0 0 0 0 0 
+
+cellselflag 11 1000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
+
+cellandorflag 10 0 0 0 0 0 0 0 0 0 0 
+
+colorbarflag 1
+
+colorbarpref 0
+
+boundingboxflag 0
+
+_minbbval -5.000000e-01 -5.000000e-01 -9.213300e-02
+
+_maxbbval 5.000000e-01 5.000000e-01 5.000360e-01
+
+_minbbvalo -5.000000e-01 -5.000000e-01 -9.213300e-02
+
+_maxbbvalo 5.000000e-01 5.000000e-01 5.000360e-01
+
+viewflag 1
+
+flypos 0.000000e+00 0.000000e+00 0.000000e+00 
+
+cliponcellsel 0
+
+vectfld_ -1 -1 -1
+
+speedfld 7
+
+maxspeed 0.000000e+00
+
+vectorflag 0
+
+vectorarrow 1
+
+vectorlog 0
+
+cvectfld_ -1 -1 -1
+
+cspeedfld 2
+
+cmaxspeed 0.000000e+00
+
+cvectorflag 0
+
+titleflag 0
+
+cellcontflag 0
+
+nodeselmat_on 0
+
+cellselmat_on 0
+
+fieldcalc 5 
+   4 -1 -1 -1 0.000000e+00 FldCalc1 
+   4 -1 -1 -1 0.000000e+00 FldCalc2 
+   4 -1 -1 -1 0.000000e+00 FldCalc3 
+   4 -1 -1 -1 0.000000e+00 FldCalc4 
+   4 -1 -1 -1 0.000000e+00 FldCalc5 
+
+cfieldcalc 5 
+   4 -1 -1 -1 0.000000e+00 FldCalc1 
+   4 -1 -1 -1 0.000000e+00 FldCalc2 
+   4 -1 -1 -1 0.000000e+00 FldCalc3 
+   4 -1 -1 -1 0.000000e+00 FldCalc4 
+   4 -1 -1 -1 0.000000e+00 FldCalc5 
+
+bboxcoordflag 1
+
+nodenumflag 0
+
+cellnumflag 0
+
+globfieldcmax 8 1.500000e+01 1.000000e-05 1.000000e-05 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+globfieldcmin 8 4.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+cfld_nice_min 8 4.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+cfld_nice_max 8 1.500000e+01 1.000000e-05 1.000000e-05 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+cfieldlimauto 8 0 0 0 0 0 0 0 0 
+
+cfld_nice 8 0 0 0 0 0 0 0 0 
+
+cfld_log 8 0 0 0 0 0 0 0 0 
+
+pnt_size 2 0
+
+line_size 1 0
+
+node0matflag 0
+
+cell0matflag 0
+
+tracehistflag 0
+
+tracehiststop 0
+
+tracehiststride 1
+
+tracehistpoints 1
+
+cellshadeflag 1
+
+fieldcolortype 0
+
+nset_contours 10
+
+facerefineflag 0
+
+cellnormflag 0
+
+cellmedianedgeflag 0
+
+cellnodenumflag 0
+
+cellfacenumflag 0
+
+polystiplflag 0
+
+end_attributes
+
diff --git a/flash2d/eval/gmvtracer1.attr b/flash2d/eval/gmvtracer1.attr
new file mode 100644
index 0000000..9929147
--- /dev/null
+++ b/flash2d/eval/gmvtracer1.attr
@@ -0,0 +1,244 @@
+gmv_attributes
+
+filename /home/behrens/Development/flash2d/linux/Flash90_gmv.0000
+
+matrgba 4 0.000000e+00 1.000000e+00 0.000000e+00 1.000000e+00 
+
+active_mat 1 0 
+
+angles -9.000000e+01 4.500000e+01 0.000000e+00
+
+magnify 1.357688e+00
+
+range 1.020000e+00 1.020000e+00 5.100000e-01
+
+span 1.530000e+00
+
+aspect 1.285714e+00
+
+pan 0.000000e+00 0.000000e+00
+
+translate 4.336809e-18 -0.000000e+00 -2.500000e-01
+
+glob_icmin -5.100000e-01 -5.100000e-01 -5.000000e-03
+
+glob_icmax 5.100000e-01 5.100000e-01 5.050000e-01
+
+explodefact 0.000000e+00 0.000000e+00
+
+velscale 1.000000e+00
+
+velarrowsize 1.000000e+00
+
+axisflag 1
+
+nodesflag 0
+
+linesflag 0
+
+polysflag 0
+
+cellsflag 1
+
+celledgesflag 1
+
+cellexpflag -1
+
+timeflag 0
+
+cycleflag 0
+
+distscaleflag 0
+
+textureflag 1
+
+tracerflag 0
+
+nodefieldactive -1
+
+cellfieldactive 4
+
+tracefieldactive 0
+
+isosurf_on 1020 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+
+isosurf_val 1020 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+isosurf_field 1020 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+
+backgroundcolor 4294967295
+
+globfieldmin 16 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 4.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 -5.000000e-01 -5.000000e-01 0.000000e+00 
+
+globfieldmax 16 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e+00 1.500000e+01 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 5.000000e-01 5.000000e-01 1.000000e+00 
+
+nfld_nice_min 16 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 4.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 -5.000000e-01 -5.000000e-01 0.000000e+00 
+
+nfld_nice_max 16 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e+00 1.500000e+01 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 1.000000e-05 5.000000e-01 5.000000e-01 1.000000e+00 
+
+nfieldlimauto 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+
+nfld_nice 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+
+nfld_log 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
+
+light  -7.400000e-01 3.200000e-01
+
+glob_icmino -5.100000e-01 -5.100000e-01 -5.000000e-03
+
+glob_icmaxo 5.100000e-01 5.100000e-01 5.050000e-01
+
+xscale 1.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+yscale 1.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+zscale 1.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+cliponbox 0
+
+nrefl_loops 1
+
+reflect 0 0 0
+
+clipvalue 0.000000e+00 1.000000e+00
+
+_minbdval -5.100000e-01 -5.100000e-01 -5.000000e-03
+
+_maxbdval 5.100000e-01 5.100000e-01 5.050000e-01
+
+_minfdval -5.100000e-01 -5.100000e-01 -5.000000e-03
+
+_maxfdval 5.100000e-01 5.100000e-01 5.050000e-01
+
+mat_order 0 
+
+scaleaxiso 1.000000e+00 1.000000e+00 1.000000e+00
+
+scaleaxis 1.000000e+00 1.000000e+00 5.000000e-01
+
+nodeselflag 11 1000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
+
+nodeandorflag 10 0 0 0 0 0 0 0 0 0 0 
+
+cellselflag 11 1000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
+
+cellandorflag 10 0 0 0 0 0 0 0 0 0 0 
+
+colorbarflag 1
+
+colorbarpref 0
+
+boundingboxflag 0
+
+_minbbval -5.000000e-01 -5.000000e-01 0.000000e+00
+
+_maxbbval 5.000000e-01 5.000000e-01 5.000000e-01
+
+_minbbvalo -5.000000e-01 -5.000000e-01 0.000000e+00
+
+_maxbbvalo 5.000000e-01 5.000000e-01 5.000000e-01
+
+viewflag 1
+
+flypos 0.000000e+00 0.000000e+00 0.000000e+00 
+
+cliponcellsel 0
+
+vectfld_ -1 -1 -1
+
+speedfld 7
+
+maxspeed 0.000000e+00
+
+vectorflag 0
+
+vectorarrow 1
+
+vectorlog 0
+
+cvectfld_ -1 -1 -1
+
+cspeedfld 2
+
+cmaxspeed 0.000000e+00
+
+cvectorflag 0
+
+titleflag 0
+
+cellcontflag 0
+
+nodeselmat_on 0
+
+cellselmat_on 0
+
+fieldcalc 5 
+   4 -1 -1 -1 0.000000e+00 FldCalc1 
+   4 -1 -1 -1 0.000000e+00 FldCalc2 
+   4 -1 -1 -1 0.000000e+00 FldCalc3 
+   4 -1 -1 -1 0.000000e+00 FldCalc4 
+   4 -1 -1 -1 0.000000e+00 FldCalc5 
+
+cfieldcalc 5 
+   4 -1 -1 -1 0.000000e+00 FldCalc1 
+   4 -1 -1 -1 0.000000e+00 FldCalc2 
+   4 -1 -1 -1 0.000000e+00 FldCalc3 
+   4 -1 -1 -1 0.000000e+00 FldCalc4 
+   4 -1 -1 -1 0.000000e+00 FldCalc5 
+
+bboxcoordflag 1
+
+nodenumflag 0
+
+cellnumflag 0
+
+globfieldcmax 8 1.500000e+01 1.000000e-05 1.000000e-05 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+globfieldcmin 8 4.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+cfld_nice_min 8 4.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+cfld_nice_max 8 1.500000e+01 1.000000e-05 1.000000e-05 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 
+
+cfieldlimauto 8 0 0 0 0 0 0 0 0 
+
+cfld_nice 8 0 0 0 0 0 0 0 0 
+
+cfld_log 8 0 0 0 0 0 0 0 0 
+
+pnt_size 2 0
+
+line_size 1 0
+
+node0matflag 0
+
+cell0matflag 0
+
+tracehistflag 0
+
+tracehiststop 0
+
+tracehiststride 1
+
+tracehistpoints 1
+
+cellshadeflag 0
+
+fieldcolortype 0
+
+nset_contours 10
+
+facerefineflag 0
+
+cellnormflag 0
+
+cellmedianedgeflag 0
+
+cellnodenumflag 0
+
+cellfacenumflag 0
+
+polystiplflag 0
+
+end_attributes
+
diff --git a/flash2d/eval/gpc2matlab.m b/flash2d/eval/gpc2matlab.m
new file mode 100644
index 0000000..13bbb12
--- /dev/null
+++ b/flash2d/eval/gpc2matlab.m
@@ -0,0 +1,50 @@
+% An M-File to postprocess data written by gpc DEBUG option
+% Visualization in 2D
+% j. behrens 12/2001
+%
+% clear old data structures and initialize
+clear;
+imax = 3000;
+%  colormap(hsv)
+%  brighten(0.8)
+%
+% pre loop file opening
+hold on
+iou = fopen('GPC_DEBUG_polyisec.dat');
+
+% main loop, first read line
+icnt=0;
+while icnt<imax
+%while 1
+  tline = fgetl(iou);
+  if ~ischar(tline)
+    break
+  else
+    ipoly=sscanf(tline,'%d');
+    for i=1:ipoly
+      tline = fgetl(iou);
+      if ~ischar(tline)
+        break
+      else
+        ivert=sscanf(tline,'%d');
+	xcoo=zeros(1,ivert); ycoo=zeros(1,ivert); zcoo=zeros(1,ivert);
+        for j=1:ivert
+          tline = fgetl(iou);
+          if ~ischar(tline)
+            break
+          else
+%            [xcoo(j) ycoo(j)]=sscanf(tline,'%f %f');
+            a=sscanf(tline,'%f %f');
+	    xcoo(j)=a(1); ycoo(j)=a(2);
+          end
+	end
+	patch(xcoo,ycoo,zcoo,'w');
+      end
+%    disp(tline)
+      icnt= icnt+1;
+    end
+  end
+end
+
+stat = fclose(iou);
+hold off
diff --git a/flash2d/eval/grid_dat.m b/flash2d/eval/grid_dat.m
new file mode 100644
index 0000000..2c5dcc2
--- /dev/null
+++ b/flash2d/eval/grid_dat.m
@@ -0,0 +1,19 @@
+% An M-File to postprocess data written by STASL
+% Visualization in 3D
+% j. behrens 6/94
+%
+% open file and read data
+disp('reading data ...');
+iou = fopen('Flash90_matlab.0000');
+LEN = fscanf(iou,'%d',1)
+LAV = fscanf(iou,'%f',[LEN,LEN]);
+stat = fclose(iou);
+disp('... done, now processing grid ...');
+%
+% transpose
+VAL= LAV.';
+%
+% plot contours
+contourf(VAL);
+disp('... finished');
+
diff --git a/flash2d/eval/gridded.gnu b/flash2d/eval/gridded.gnu
new file mode 100644
index 0000000..9a542ea
--- /dev/null
+++ b/flash2d/eval/gridded.gnu
@@ -0,0 +1,18 @@
+##################################################################
+# SPLASH/fe                                                      #
+# Semi-Lagrangian Parallel and Locally Adaptive                  #
+# SHallow-water model/ with Finite Elements                      #
+##################################################################
+# script for visualizing stasl output                            #
+# for gnuplot 3.5 (linux version)                                #
+# j. behrens 7/94, 3/96                                          #
+##################################################################
+#set noparametric;
+set hidden3d;
+set view 30,322.5,1,2;
+set title "FLASH Data Plot";
+splot 'Flash90_matlab.0001' with lines;
+pause -1 "ENTER to continue";
+#----------------------------------------------------------------#
+# END                                                            #
+#----------------------------------------------------------------#
diff --git a/flash2d/eval/poly.m b/flash2d/eval/poly.m
new file mode 100644
index 0000000..1af2320
--- /dev/null
+++ b/flash2d/eval/poly.m
@@ -0,0 +1,38 @@
+% An M-File to postprocess data written by STASL
+% Visualization in 3D
+% j. behrens 10/96
+%
+% clear old data structures and initialize
+clear;
+  colormap(hsv)
+  brighten(0.8)
+%
+% open file and read data
+disp('reading data ...');
+iou = fopen('../compile/macosx_intel/Flash90_matlab.0001');
+RAW = fscanf(iou,'%f %f %f %f %f %f %d',[7,inf]);
+stat = fclose(iou);
+disp('... done, now processing grid ...');
+%
+% determine sizes
+m= size(RAW,2);
+%
+% loop through elements
+for i=1:m,
+  for j=1:3,
+    XX(j,i)= RAW(j,i);
+    YY(j,i)= RAW(j+3,i);
+  end
+  XX(4,i)= RAW(1,i);
+  YY(4,i)= RAW(4,i);
+  COLOR(i)= RAW(7,i);
+end
+%
+% plot
+if COLOR(1)<0
+  plot(XX,YY,'w');
+else
+  fill(XX,YY,COLOR);
+end
+disp('... finished');
+
diff --git a/flash2d/eval/poly.sci b/flash2d/eval/poly.sci
new file mode 100644
index 0000000..7ddeacd
--- /dev/null
+++ b/flash2d/eval/poly.sci
@@ -0,0 +1,39 @@
+// An M-File to postprocess data written by STASL
+// Visualization in 3D
+// j. behrens 10/96
+//
+// clear old data structures
+clear;
+//
+// open file and read data
+disp('reading data ...');
+//iou = file('open','fort.20');
+RAW = read('fort.20',-1,7);
+//stat = fclose(iou);
+disp('... done, now processing grid ...');
+//
+// determine sizes
+[m,n]= size(RAW);
+//
+// loop through elements
+for i=1:m,
+  for j=1:3,
+    XX(j,i)= RAW(i,j);
+    YY(j,i)= RAW(i,j+3);
+  end
+  XX(4,i)= RAW(i,1);
+  YY(4,i)= RAW(i,4);
+  COLOR(i)= RAW(i,7);
+end
+//
+// plot
+if COLOR(1)<0.
+  plot2d(0,0,-1,"010"," ",[-0.5,-0.5,0.5,0.5])
+  xfpolys(XX,YY);
+else
+  plot2d(0,0,-1,"010"," ",[-0.5,-0.5,0.5,0.5])
+  xfpolys(XX,YY,COLOR);
+  xfpolys(XX,YY);
+end
+disp('... finished');
+
diff --git a/flash2d/eval/triang.m b/flash2d/eval/triang.m
new file mode 100644
index 0000000..2e29375
--- /dev/null
+++ b/flash2d/eval/triang.m
@@ -0,0 +1,53 @@
+%% An M-File to postprocess data
+%%
+%% Aufruf z.B. triang(5) : visualisiert das ergebnis des 5.ten
+%% zeitschritts (vorausgesetzt nat"urlich, die files Flash90_matval.0005
+%% und Flash90_mattri.0005 wurden mit matlab_tri_plot (im modul IO_plot) 
+%% erzeugt).  
+%%
+%% N. Rakowsky 5/99
+%
+%
+function triang(zeitschritt)
+%
+%% knoten-koordinaten und tracer-konzentration
+file_laden = ['load Flash90_matval.',sprintf('%04i',zeitschritt)];
+eval(file_laden)
+%% triangulierung: per element die 3 zugeh"origen knoten 
+%% (zeiger auf zeilen in Flash90_matval)
+file_laden = ['load Flash90_mattri.',sprintf('%04i',zeitschritt)];
+eval(file_laden)
+%
+tri = Flash90_mattri;
+[d,hilf]=size(Flash90_matval);
+x=Flash90_matval(1:d,1);
+y=Flash90_matval(1:d,2);
+z=Flash90_matval(1:d,3);
+%
+%% und 3D-plot
+trisurf(tri,x,y,z)
+%
+%% J"orns colormap:
+cj(1:64,1) = linspace(0,1,64)';
+cj(1:64,2) = zeros(64,1);
+cj(1:64,3) = linspace(1,0,64)';
+colormap(cj)
+%
+%
+%% grid off:
+%shading interp
+%
+%% 2D-plot
+%view(2)
+%axis equal
+%axis([-.5 .5 -.5 .5])
+%
+%% zoomen, ausschnitt x1<x<x2, y1<y<y2
+%% axis([x1 x2 y1 y2])
+%axis([-.4 0 -.4 0]) 
+%
+%
+%% interpolieren auf regelm"assiges gitter, z.b. f"ur schnitte
+%[xi,yi]=meshgrid(-.5:.01:.5);
+%zi=griddata(x,y,z,xi,yi);
+%mesh(xi,yi,zi)
diff --git a/flash2d/lib/visnet4flash/FlashData.C b/flash2d/lib/visnet4flash/FlashData.C
new file mode 100644
index 0000000..ff45dfc
--- /dev/null
+++ b/flash2d/lib/visnet4flash/FlashData.C
@@ -0,0 +1,418 @@
+#include "fortify.h"
+#include "FlashData.h"
+#include "3dutil.h"
+#include <stdio.h>
+
+int FlashData::WCOMP;
+int FlashData::NORM;
+
+FlashData::FlashData(int dim):
+        dim_(dim),
+        grid_(NULL), iso_(NULL),
+	gridDS_(NULL), vec_(NULL),
+	coords_(NULL), vals_(NULL),
+	showGrid_(1), showVecs_(1),
+	//autoMinMax_(0),
+	vecHeight_(0.0),
+        nVal_(TRACER){
+  init();
+}
+FlashData::FlashData(int dim,
+		     int nn, int ne, int nt,
+		     float *coords,
+		     float *vals,
+		     int *edges, int *triangles):
+        dim_(dim),
+        grid_(NULL), iso_(NULL),
+	gridDS_(NULL), vec_(NULL),
+	coords_(NULL), vals_(NULL),
+	showGrid_(1), showVecs_(1),
+	//autoMinMax_(0),
+	vecHeight_(0.0),
+        nVal_(TRACER){
+  init();
+  setData(nn, ne, nt,
+	  coords,
+	  vals,
+	  edges, triangles);
+}
+void FlashData::init(){
+  // set Parameters
+  if(dim_ == 2){
+    WCOMP = -1;
+    NORM = 3;
+  }else{
+    WCOMP = 3;
+    NORM = 4;
+  }
+
+  // create gridDS
+  grid_ = new M3TV_ArrayTriangleList();
+  if(dim_ == 2){
+    gridDS_ = grid_;
+  }else{
+    iso_ = new M3TV_IsoSurfaceDataSource();
+    iso_->setDataSource(grid_);
+    gridDS_ = iso_;
+  }
+
+  zVal_ = dim_==2?TRACER:ZCOORD;
+
+  // create vector list
+  vec_ = new VectorList();
+}
+
+FlashData::~FlashData(){
+    if(grid_ != NULL){
+	delete grid_;
+    }
+    if(iso_ != NULL){
+      delete iso_;
+    }
+    if(vec_ != NULL){
+	delete vec_;
+    }
+}
+
+/*
+void FlashData::setAutoMinMax(int b){
+    autoMinMax_ = b;
+}
+
+int FlashData::getAutoMinMax(){
+    return autoMinMax_;
+}
+*/
+
+void FlashData::setData(int nn, int ne, int nt,
+			float *coords,
+			float *vals,
+			int *edges, int *triangles){
+    
+    //printf("locking ... changed = %d\n", hasChanged());
+    nn_ = nn;
+    ne_ = ne;
+    nt_ = nt;
+    coords_ = coords;
+    vals_ = vals;
+    e_ = edges;
+    t_ = triangles;
+
+    // vals[5*i+0] == tracer
+    // vals[5*i+1] == ucomp
+    // vals[5*i+2] == vcomp
+    // vals[5*i+3] == 3d:wcomp / 2d:uv_norm
+    // vals[5*i+4] == 3d:uvw_norm
+
+    // calc norm / find extrema
+    if(dim_ == 2){
+      // first node
+      vals_[3] = sqrt(vals_[1]*vals_[1] + vals_[2]*vals_[2]);
+      for(int vg = 0; vg < 4; ++vg){
+	valmin_[vg] = vals_[vg];
+	valmax_[vg] = vals_[vg];
+      }
+      for(int i = 1; i < nn_; i++){
+	vals_[5*i+3] = sqrt(vals_[5*i+1]*vals_[5*i+1] + vals_[5*i+2]*vals_[5*i+2]);
+	for(int vg = 0; vg < 4; ++vg){
+	  if(valmin_[vg] > vals_[vg]) valmin_[vg] = vals_[vg];
+	  if(valmax_[vg] < vals_[vg]) valmax_[vg] = vals_[vg];
+	}
+      }
+    }else{
+      // first node
+      vals_[3] = sqrt(vals_[1]*vals_[1] + vals_[2]*vals_[2] + vals_[3]*vals_[3]);
+      for(int vg = 0; vg < 5; ++vg){
+	valmin_[vg] = vals_[vg];
+	valmax_[vg] = vals_[vg];
+      }
+      for(int i = 0; i < nn_; i++){
+	vals_[5*i+4] = sqrt(vals_[5*i+1]*vals_[5*i+1] + vals_[5*i+2]*vals_[5*i+2] + vals_[5*i+3]*vals_[5*i+3]);
+	for(int vg = 0; vg < 4; ++vg){
+	  if(valmin_[vg] > vals_[vg]) valmin_[vg] = vals_[vg];
+	  if(valmax_[vg] < vals_[vg]) valmax_[vg] = vals_[vg];
+	}
+      }
+    }
+
+    lock();
+
+    grid_->setNodes(new M3TV_ArrayWrapper<float>(3, coords_, nn_));
+    grid_->setNodeValues(new M3TV_ArrayWrapper<float>(5, vals_, nn_), dim_==2?4:5);
+    grid_->setEdges(new M3TV_ArrayWrapper<int>(2, e_, ne_));
+    grid_->setTriangles(new M3TV_ArrayWrapper<int>(3, t_, nt_));
+    grid_->setIndexCorrection(-1);
+    grid_->setChanged(1);
+
+    vec_->setData(nn_, dim_, coords_, vals_);
+    //vec_->setHeight(vecHeight_);
+    
+    chooseZValues(zVal_);
+    chooseNodeValueGroup(nVal_);
+
+    /*    
+    if(iso_ != NULL){
+      iso_->regenerateIsoSurface();
+    }
+    */
+
+    // find minimal and maximal coordinates and nodeal values
+
+    /*
+    if(autoMinMax_){
+	printf("finding minimal and maximal coords and nodal values\n");
+	
+	double vg, vv;
+	setMinMaxCoords(((vg=grid_->getMinX()) < (vv=vec_->getMinX())) ? vg : vv,
+			((vg=grid_->getMaxX()) > (vv=vec_->getMaxX())) ? vg : vv,
+			((vg=grid_->getMinY()) < (vv=vec_->getMinY())) ? vg : vv,
+			((vg=grid_->getMaxY()) > (vv=vec_->getMaxY())) ? vg : vv,
+			((vg=grid_->getMinZ()) < (vv=vec_->getMinZ())) ? vg : vv,
+			((vg=grid_->getMaxZ()) > (vv=vec_->getMaxZ())) ? vg : vv);
+	setMinMaxNodeValues(((vg=grid_->getMinNodeValue()) < (vv=vec_->getMinNodeValue())) ? vg : vv,
+			    ((vg=grid_->getMaxNodeValue()) > (vv=vec_->getMaxNodeValue())) ? vg : vv);
+    }
+    */
+    setChanged(1);
+    unlock();
+}
+
+/**
+ * Choose which of the nodal values (tracer, ucomp or vcomp) to use as z-values
+ */
+void FlashData::chooseZValues(int z){
+  int src;
+  float val;
+
+  zVal_ = z;                     // save
+  if(z == ZCOORD){
+    return;
+  }
+
+  src = z;
+
+  //lock();
+
+  // min_ and max_ inherited from M3TV_NodeList
+  Z(min_) = Z(max_) = vals_[src]; // [0*5+src]
+  for(int i = 0; i < nn_; i++){
+    val = vals_[i*5+src];
+    coords_[i*3+2] = val;
+    if(val < Z(min_)) Z(min_) = val;
+    if(val > Z(max_)) Z(max_) = val;
+  }
+  setChanged(1);
+
+  //unlock();
+}
+
+void FlashData::setGridVisibility(int b){
+    showGrid_ = b;
+    setChanged(1);
+}
+int FlashData::getGridVisibility(){
+    return showGrid_;
+}
+void FlashData::setVectorsVisibility(int b){
+    showVecs_ = b;
+    setChanged(1);
+}
+int FlashData::getVectorsVisibility(){
+    return showVecs_;
+}
+void FlashData::setVectorsHeight(double h){
+    vecHeight_ = h;
+    vec_->setHeight(h);
+    setChanged(1);
+}
+double  FlashData::getVectorsHeight(){
+    return vecHeight_;
+}
+
+int FlashData::getNodeValueGroupCount(){
+  return dim_==2?4:5;
+}
+int FlashData::chooseNodeValueGroup(int index){
+    float *src = NULL;
+
+    if(index < 0 || (dim_ == 2 && index >= 4) || index >= 5){
+      return 0;
+    }
+    
+    nVal_ = index;
+
+    grid_->chooseNodeValueGroup(index);
+
+    minnv_ = valmin_[index];
+    maxnv_ = valmax_[index];
+    
+    setChanged(1);
+    
+    return 1;
+}
+int FlashData::getNodeValueGroupName(int index, char *name, int len){
+  switch(index){
+    case 0:
+      strncpy(name, (char*)"Tracer", len);
+      break;
+    case 1:
+      strncpy(name, (char*)"UComp", len);
+      break;
+    case 2:
+      strncpy(name, (char*)"VComp", len);
+      break;
+    case 3:
+      if(dim_ == 2){
+	strncpy(name, (char*)"|(U,V)|", len);
+      }else{
+	strncpy(name, (char*)"WComp", len);
+      }
+    case 4:
+      if(dim_ != 2){
+	strncpy(name, (char*)"|(U,V,W)|", len);
+      }else{
+	return 0;
+      }
+      break;
+  default:
+    return 0;
+  }
+  return 1;
+}
+
+int FlashData::hasChanged(){
+  return M3TV_TriangleList::hasChanged() || gridDS_->hasChanged();
+}
+void FlashData::setChanged(int b){
+  M3TV_TriangleList::setChanged(b);
+  gridDS_->setChanged(b);
+}
+
+void FlashData::firstNode(){
+    if(gridDS_ != NULL && showGrid_ == 1){
+	gridDS_->firstNode();
+    }
+    if(vec_ != NULL && showVecs_ == 1){
+	vec_->firstNode();
+    }
+    
+}
+M3TV_Node* FlashData::nextNode(){
+    M3TV_Node* ret = NULL;
+    if(gridDS_ != NULL && showGrid_ == 1){
+	ret =  gridDS_->nextNode();
+    }
+    if(ret == NULL){
+	if(vec_ != NULL && showVecs_ == 1){
+	    ret = vec_->nextNode();
+	}
+    }
+    return ret;
+}
+
+void FlashData::firstEdge(){
+    if(gridDS_ != NULL && showGrid_ == 1){
+	gridDS_->firstEdge();
+    }
+    if(vec_ != NULL && showVecs_ == 1){
+	vec_->firstEdge();
+    }
+}
+M3TV_Edge* FlashData::nextEdge(){
+    M3TV_Edge* ret = NULL;
+    if(gridDS_ != NULL && showGrid_ == 1){
+	ret = gridDS_->nextEdge();
+    }
+    if(ret == NULL){
+	if(vec_ != NULL && showVecs_ == 1){
+	    ret = vec_->nextEdge();
+	}
+    }
+    return ret;
+}
+
+void FlashData::firstTriangle(){
+    if(gridDS_ != NULL && showGrid_ == 1){
+	gridDS_->firstTriangle();
+    }
+}
+M3TV_Triangle* FlashData::nextTriangle(){
+    if(gridDS_ != NULL && showGrid_ == 1){
+	return gridDS_->nextTriangle();
+    }
+    return NULL;
+}
+
+void FlashData::setTriangleVisibility(int b){
+  if(iso_ != NULL){
+    iso_->setTriangleVisibility(b);
+    setChanged(1);
+  }
+}
+int FlashData::getTriangleVisibility(){
+  if(iso_ != NULL){
+    return iso_->getTriangleVisibility();
+  }
+  return 1;
+}
+
+void FlashData::setEdgeVisibility(int b){
+  if(iso_ != NULL){
+    iso_->setEdgeVisibility(b);
+    setChanged(1);
+  }
+}
+int FlashData::getEdgeVisibility(){
+  if(iso_ != NULL){
+    return iso_->getEdgeVisibility();
+  }
+  return 1;
+}
+
+void FlashData::setNodeVisibility(int b){
+  if(iso_ != NULL){
+    iso_->setNodeVisibility(b);
+    setChanged(1);
+  }
+}
+int FlashData::getNodeVisibility(){
+  if(iso_ != NULL){
+    return iso_->getNodeVisibility();
+  }
+  return 1;
+}
+
+void FlashData::setIsoEdgeVisibility(int b){
+  if(iso_ != NULL){
+    iso_->setIsoEdgeVisibility(b);
+    setChanged(1);
+  }
+}
+int FlashData::getIsoEdgeVisibility(){
+  if(iso_ != NULL){
+    return iso_->getIsoEdgeVisibility();
+  }
+  return 1;
+}
+
+void FlashData::setIsoTriangleVisibility(int b){
+  if(iso_ != NULL){
+    iso_->setIsoTriangleVisibility(b);
+    setChanged(1);
+  }
+}
+int FlashData::getIsoTriangleVisibility(){
+  if(iso_ != NULL){
+    return iso_->getIsoTriangleVisibility();
+  }
+  return 1;
+}
+
+void FlashData::setIsoValue(double iso){
+  if(iso_ != NULL){
+    printf("generating isosurface ...\n");
+    iso_->generateIsoSurface(iso);
+    printf("isosurface done.\n");
+    setChanged(1);
+  }
+}
diff --git a/flash2d/lib/visnet4flash/FlashData.h b/flash2d/lib/visnet4flash/FlashData.h
new file mode 100644
index 0000000..7e254ce
--- /dev/null
+++ b/flash2d/lib/visnet4flash/FlashData.h
@@ -0,0 +1,109 @@
+#ifndef FLASHDATA_H
+#define FLASHDATA_H
+
+#include "M3TV_StdDataSource.h"
+//#include "M3TV_Menu.h"
+#include "VectorList.h"
+
+class FlashData : public M3TV_TriangleList{
+public:
+  //enum NODE_VALUES {TRACER = 0, UCOMP = 1, VCOMP = 2, WCOMP = 3, NORM=4, ZCOORD=5};
+  const static int TRACER = 0;
+  const static int UCOMP = 1;
+  const static int VCOMP = 2;
+  static int       WCOMP;
+  static int       NORM;
+  const static int ZCOORD = 5;
+
+    FlashData(int dim);
+    FlashData(int dim,
+	      int nn, int ne, int nt,
+	      float *coords,
+	      float *vals,
+	      int *edges, int *triangles);
+    ~FlashData();
+    /*
+    void setAutoMinMax(int b);
+    int getAutoMinMax();
+    */
+    void setData(int nn, int ne, int nt,
+		 float *coords,
+		 float *vals,
+		 int *edges, int *triangles);
+
+    /**
+     * Choose which of the nodal values (tracer, ucomp or vcomp) to use as z-values
+     */
+    void chooseZValues(int z);
+
+    void setGridVisibility(int b);
+    int getGridVisibility();
+
+    void setVectorsVisibility(int b);
+    int getVectorsVisibility();
+
+    void setVectorsHeight(double h);
+    double  getVectorsHeight();
+
+    int getNodeValueGroupCount();
+    int chooseNodeValueGroup(int index);
+    int getEdgeValueGroupCount(){return 1;}
+    int chooseEdgeValueGroup(int index){return index == 0;}
+    int getTriangleValueGroupCount(){return 1;}
+    int chooseTriangleValueGroup(int index){return index == 0;}
+
+    int getNodeValueGroupName(int index, char *name, int len);
+    int getEdgeValueGroupName(int index, char *name, int len){return 0;}
+    int getTriangleValueGroupName(int index, char *name, int len){return 0;}
+
+    int hasChanged();
+    void setChanged(int b);
+
+    void firstNode();
+    M3TV_Node* nextNode();
+
+    void firstEdge();
+    M3TV_Edge* nextEdge();
+
+    void firstTriangle();
+    M3TV_Triangle* nextTriangle();
+
+    void setTriangleVisibility(int b);
+    int getTriangleVisibility();
+
+    void setEdgeVisibility(int b);
+    int getEdgeVisibility();
+
+    void setNodeVisibility(int b);
+    int getNodeVisibility();
+
+    void setIsoEdgeVisibility(int b);
+    int getIsoEdgeVisibility();
+
+    void setIsoTriangleVisibility(int b);
+    int getIsoTriangleVisibility();
+
+    void setIsoValue(double iso);
+private:
+    void init();
+    int dim_;
+    M3TV_ArrayTriangleList *grid_;
+    M3TV_IsoSurfaceDataSource *iso_;
+    M3TV_TriangleList *gridDS_;
+    VectorList *vec_;
+    int nn_, ne_, nt_;
+    int *e_, *t_;
+    float *coords_, *vals_;
+    float valmin_[5], valmax_[5];
+    int showGrid_, showVecs_; //, autoMinMax_;
+    double vecHeight_;
+    int zVal_;
+    int nVal_;
+};
+
+#endif
+
+
+
+
+
diff --git a/flash2d/lib/visnet4flash/FlashMenu.C b/flash2d/lib/visnet4flash/FlashMenu.C
new file mode 100644
index 0000000..24b5d7c
--- /dev/null
+++ b/flash2d/lib/visnet4flash/FlashMenu.C
@@ -0,0 +1,325 @@
+#include "fortify.h"
+#include "FlashMenu.h"
+
+FlashMenu::FlashMenu(M3VisNETView *view, int dimension,
+		     FlashData *fd1, FlashData *fd2,
+		     M3TV_DoubleTriangleList *dtl):
+    view_(view), dim_(dimension), fd1_(fd1), fd2_(fd2), dtl_(dtl),
+    isoValue_(0), generateIso_(0),
+    flashMenu_(NULL), isoMenu_(NULL),
+    startstop_(NULL), step_(NULL), shGrid_(NULL), shVecs_(NULL),
+    miT_(NULL), miE_(NULL), miN_(NULL),
+    miIsoT_(NULL), miIsoE_(NULL), miSetValue_(NULL),
+    paused_(-1)
+{
+    sem_init(&wait_, 0, 0);
+}
+
+FlashMenu::~FlashMenu(){
+}
+
+void FlashMenu::buildMenu(M3TV_Menu* menuRoot){
+    M3TV_Menu* menu;
+
+    // FlashMenu
+    flashMenu_ = new M3TV_Menu("FLASH");
+    menuRoot->insert(flashMenu_, 1);
+    startstop_ = new M3TV_MenuItem("Start", 0, this);
+    flashMenu_->append(startstop_);
+    
+    step_ = new M3TV_MenuItem("Step", 1, this);
+    flashMenu_->append(step_);
+    
+    shGrid_ = new M3TV_MenuItem("hide Grid", 10, this);
+    flashMenu_->append(shGrid_);
+    shVecs_ = new M3TV_MenuItem("hide Vectors", 11, this);
+    flashMenu_->append(shVecs_);
+    
+    flashMenu_->append(new M3TV_MenuItem("set Vector Height", 20, this));
+
+    if(dim_ == 2){
+      menu = new M3TV_Menu((char*)"choose Z values");
+      flashMenu_->append(menu);
+      menu->append(new M3TV_MenuItem("Tracer",  31, this));
+      menu->append(new M3TV_MenuItem("UComp",   32, this));
+      menu->append(new M3TV_MenuItem("VComp",   33, this));
+      menu->append(new M3TV_MenuItem("|(U,V)|", 34, this));
+    }
+
+    menu = new M3TV_Menu((char*)"choose nodal values");
+    flashMenu_->append(menu);
+    menu->append(new M3TV_MenuItem("Tracer",  41, this));
+    menu->append(new M3TV_MenuItem("UComp",   42, this));
+    menu->append(new M3TV_MenuItem("VComp",   43, this));
+    if(dim_ == 3){
+      menu->append(new M3TV_MenuItem("WComp",   44, this));
+      menu->append(new M3TV_MenuItem("|(U,V,W)|", 45, this));
+    }else{
+      menu->append(new M3TV_MenuItem("|(U,V)|", 45, this));
+    }
+
+
+    // IsoSurface Menu
+    if(dim_ == 3){
+      isoMenu_ = new M3TV_Menu("IsoSurface");
+      menuRoot->insert(isoMenu_, 2);
+      int showT = fd1_->getTriangleVisibility();
+      miT_ = new M3TV_MenuItem((showT?"hide Triangles":"show Triangles"),
+			       51, this);
+      isoMenu_->append(miT_);
+      int showE = fd1_->getEdgeVisibility();
+      miE_ = new M3TV_MenuItem((showE?"hide Edges":"show Edges"),
+			       52, this);
+      isoMenu_->append(miE_);
+      int showN = fd1_->getNodeVisibility();
+      miN_ = new M3TV_MenuItem((showN?"hide Nodes":"show Nodes"),
+			       53, this);
+      isoMenu_->append(miN_);
+      int showIsoT = fd1_->getIsoTriangleVisibility();
+      miIsoT_ = new M3TV_MenuItem(
+          showIsoT?"hide Isosurface Triangles":"show Isosurface Triangles",
+	  54, this);
+      isoMenu_->append(miIsoT_);
+      int showIsoE = fd1_->getIsoEdgeVisibility();
+      miIsoE_ = new M3TV_MenuItem(
+	  showIsoE?"hide Isosurface Edges":"show Isosurface Edges",
+	  55, this);
+      isoMenu_->append(miIsoE_);
+#ifdef DEBUG_
+      //miTriang_ = new M3TV_MenuItem(
+      //    showTriang_?"hide Triangulation":"show Triangulation", 56, this);
+      //isoMenu_->append(miTriang_);
+#endif
+      miSetValue_ = new M3TV_MenuItem("set Isosurface Value", 57, this);
+      isoMenu_->append(miSetValue_);
+    }
+
+    M3TV_MenuItem *close = menuRoot->find("Close");
+    menuRoot->remove(close);
+    
+}
+void FlashMenu::removeMenu(M3TV_Menu* menuRoot){
+    menuRoot->remove(flashMenu_);
+    delete flashMenu_;
+    menuRoot->remove(isoMenu_);
+    delete isoMenu_;
+}
+
+/*
+  paused:    state:     caption:    step:
+    -1       stopped    Start       y
+     0       running    Pause       n
+     1       stopped    Resume      y
+     2       step       Resume      y
+ */
+void FlashMenu::menuCalled(int command){
+    switch(command){
+	case 0:  // Start/Pause/Resume
+	    switch(paused_){
+	        case -1:
+		  //printf("-1\n");
+		    startstop_->setCaption("Pause");
+		    paused_ = 0;
+		    flashMenu_->remove(step_);
+		    sem_post(&wait_);
+		    break;
+	        case  0:
+		  //printf("0\n");
+		    startstop_->setCaption("Resume");
+		    flashMenu_->insert(step_, 2);
+		    while(sem_trywait(&wait_)==0){}
+		    paused_ = 1;
+		    break;
+		case  1:
+		  //printf("1\n");
+		    flashMenu_->remove(step_);
+		    startstop_->setCaption("Pause");
+		    paused_ = 0;
+		    sem_post(&wait_);
+		    break;
+		case  2:
+		  //printf("2\n");
+		    flashMenu_->remove(step_);
+		    startstop_->setCaption("Pause");
+		    paused_ = 0;
+		    sem_post(&wait_);
+		    break;
+	    }
+	    break;
+	case 1:  // step
+	    paused_ = 2;
+	    startstop_->setCaption("Resume");
+	    sem_post(&wait_);
+	    break;
+
+	case 10: // show, hide Grid
+	    if(fd1_->getGridVisibility()){
+		fd1_->setGridVisibility(0);
+		fd2_->setGridVisibility(0);
+		shGrid_->setCaption("show Grid");
+	    }else{
+		fd1_->setGridVisibility(1);
+		fd2_->setGridVisibility(1);
+		shGrid_->setCaption("hide Grid");
+	    }
+	    dtl_->setChanged(1);
+	    break;
+	case 11: // show, hide Vectors
+	    if(fd1_->getVectorsVisibility()){
+		fd1_->setVectorsVisibility(0);
+		fd2_->setVectorsVisibility(0);
+		shVecs_->setCaption("show Vectors");
+	    }else{
+		fd1_->setVectorsVisibility(1);
+		fd2_->setVectorsVisibility(1);
+		shVecs_->setCaption("hide Vectors");
+	    }
+	    dtl_->setChanged(1);
+	    break;
+	case 20:  // set Vector Height
+	    double h;
+	    cout<<"Enter new Height for Vectors: ";
+	    cin>>h;
+	    fd1_->setVectorsHeight(h);
+	    fd2_->setVectorsHeight(h);
+	    dtl_->setChanged(1);
+	    break;
+
+	case 31:
+	    fd1_->chooseZValues(FlashData::TRACER);
+	    fd2_->chooseZValues(FlashData::TRACER);
+	    break;
+	case 32:
+	    fd1_->chooseZValues(FlashData::UCOMP);
+	    fd2_->chooseZValues(FlashData::UCOMP);
+	    break;
+	case 33:
+	    fd1_->chooseZValues(FlashData::VCOMP);
+	    fd2_->chooseZValues(FlashData::VCOMP);
+	    break;
+	case 34:
+	    fd1_->chooseZValues(FlashData::NORM);
+	    fd2_->chooseZValues(FlashData::NORM);
+	    break;
+
+	case 41:
+	    fd1_->chooseNodeValueGroup(FlashData::TRACER);
+	    fd2_->chooseNodeValueGroup(FlashData::TRACER);
+	    break;
+	case 42:
+	    fd1_->chooseNodeValueGroup(FlashData::UCOMP);
+	    fd2_->chooseNodeValueGroup(FlashData::UCOMP);
+	    break;
+	case 43:
+	    fd1_->chooseNodeValueGroup(FlashData::VCOMP);
+	    fd2_->chooseNodeValueGroup(FlashData::VCOMP);
+	    break;
+	case 44:
+	    fd1_->chooseNodeValueGroup(FlashData::WCOMP);
+	    fd2_->chooseNodeValueGroup(FlashData::WCOMP);
+	    break;
+	case 45:
+	    fd1_->chooseNodeValueGroup(FlashData::NORM);
+	    fd2_->chooseNodeValueGroup(FlashData::NORM);
+	    break;
+
+	// isosurface
+        case 51:
+	  if(fd1_->getTriangleVisibility()){
+	    fd1_->setTriangleVisibility(0);
+	    fd2_->setTriangleVisibility(0);
+	    miT_->setCaption((char*)"show Triangles");
+	  }else{
+	    fd1_->setTriangleVisibility(1);
+	    fd2_->setTriangleVisibility(2);
+	    miT_->setCaption((char*)"hide Triangles");
+	  }
+	  dtl_->setChanged(1);
+	  break;
+        case 52:
+	  if(fd1_->getEdgeVisibility()){
+	    fd1_->setEdgeVisibility(0);
+	    fd2_->setEdgeVisibility(0);
+	    miE_->setCaption((char*)"show Edges");
+	  }else{
+	    fd1_->setEdgeVisibility(1);
+	    fd2_->setEdgeVisibility(2);
+	    miE_->setCaption((char*)"hide Edges");
+	  }
+	  dtl_->setChanged(1);
+	  break;
+        case 53:
+	  if(fd1_->getNodeVisibility()){
+	    fd1_->setNodeVisibility(0);
+	    fd2_->setNodeVisibility(0);
+	    miN_->setCaption((char*)"show Nodes");
+	  }else{
+	    fd1_->setNodeVisibility(1);
+	    fd2_->setNodeVisibility(2);
+	    miN_->setCaption((char*)"hide Node");
+	  }
+	  dtl_->setChanged(1);
+	  break;
+        case 54:
+	  if(fd1_->getIsoTriangleVisibility()){
+	    fd1_->setIsoTriangleVisibility(0);
+	    fd2_->setIsoTriangleVisibility(0);
+	    miIsoT_->setCaption((char*)"show Isosurface Triangles");
+	  }else{
+	    fd1_->setIsoTriangleVisibility(1);
+	    fd2_->setIsoTriangleVisibility(2);
+	    miIsoT_->setCaption((char*)"hide Isosurface Triangles");
+	  }
+	  dtl_->setChanged(1);
+	  break;
+        case 55:
+	  if(fd1_->getIsoEdgeVisibility()){
+	    fd1_->setIsoEdgeVisibility(0);
+	    fd2_->setIsoEdgeVisibility(0);
+	    miIsoE_->setCaption((char*)"show Isosurface Edges");
+	  }else{
+	    fd1_->setIsoEdgeVisibility(1);
+	    fd2_->setIsoEdgeVisibility(2);
+	    miIsoE_->setCaption((char*)"hide Isosurface Edges");
+	  }
+	  dtl_->setChanged(1);
+	  break;
+        case 57:
+	  cout<<"Enter Isosurface Value: ";
+	  cin>>isoValue_;
+	  generateIso_ = 1;
+	  FlashData *fd = (FlashData*)dtl_->getGraphics();
+	  dtl_->lock();
+	  fd->setIsoValue(isoValue_);
+	  dtl_->setChanged(1);
+	  dtl_->unlock();
+	  break;
+    }
+}
+
+void FlashMenu::wait(){
+    switch(paused_){
+	case -1:
+	  //startstop_->setCaption("Start");
+	    //printf("------------------------------------------waiting ...\n");
+	    sem_wait(&wait_);
+	    //printf("------------------------------------------waited\n");
+	    break;
+	case 0:
+	    break;
+	case 1:
+	  //startstop_->setCaption("Resume");
+	    sem_wait(&wait_);
+	    //startstop_->setCaption("Pause");
+	    break;
+        case 2:
+	    sem_wait(&wait_);
+	  break;
+    }
+}
+
+
+int FlashMenu::getIsoValue(double &value){
+  value = isoValue_;
+  return generateIso_;
+}
diff --git a/flash2d/lib/visnet4flash/FlashMenu.h b/flash2d/lib/visnet4flash/FlashMenu.h
new file mode 100644
index 0000000..a937e00
--- /dev/null
+++ b/flash2d/lib/visnet4flash/FlashMenu.h
@@ -0,0 +1,39 @@
+#ifndef FLASHMENU_H
+#define FLASHMENU_H
+
+#include "M3VisNETView.h"
+#include "FlashData.h"
+//#include "M3TV_Menu.h"
+#include <semaphore.h>
+#include <stdio.h>
+
+class FlashMenu: public M3TV_MenuProvider{
+public:
+    FlashMenu(M3VisNETView *view, int dimension,
+	      FlashData *fd1, FlashData *fd2,
+	      M3TV_DoubleTriangleList *dtl);
+    virtual  ~FlashMenu();
+
+    void buildMenu(M3TV_Menu* menuRoot);
+    void removeMenu(M3TV_Menu* menuRoot);
+    void menuCalled(int command);
+
+    void wait();
+    
+    int getIsoValue(double &value);
+private:
+    M3VisNETView *view_;
+    int dim_;
+    FlashData *fd1_, *fd2_;
+    M3TV_DoubleTriangleList *dtl_;
+    double isoValue_;
+    int generateIso_;
+
+    M3TV_Menu *flashMenu_, *isoMenu_;
+    M3TV_MenuItem *startstop_, *step_, *shGrid_, *shVecs_,
+      *miT_, *miE_, *miN_, *miIsoT_, *miIsoE_, *miSetValue_;
+    int paused_;
+    sem_t wait_;
+};
+
+#endif
diff --git a/flash2d/lib/visnet4flash/Makefile b/flash2d/lib/visnet4flash/Makefile
new file mode 100644
index 0000000..7b266db
--- /dev/null
+++ b/flash2d/lib/visnet4flash/Makefile
@@ -0,0 +1,85 @@
+# Set standart Settings
+include ./Makefile.Settings
+
+# SET TARGET NAME
+LIBTARGET := libvisnet4flash.a
+
+# SET MAIN DIRECTORY PATH
+# !! This has to be alterd by user !!
+ROOTDIR = $(HOME)/Development
+
+#SET TARGET DIRECTORY
+# !! This has to be alterd by user !!
+LIBDIR = $(ROOTDIR)/lib/SINGLE
+
+# SET VISNET DIRECTORY
+# !! This has to be alterd by user !!
+VISNETDIR = $(ROOTDIR)/visnet
+
+#LIBPATH := ../lib
+#LIBS := -lm3tv -ldelaunay -ldetri -llia -lsos -lbasic \
+#        $(VISNETDIR)/src/fortify/fortify.o -lglut -lGLU -lGL $(LIBS) -ltiff
+VPATH := $(VISNETDIR)/include/tv \
+	 $(VISNETDIR)/include/delaunay \
+	 $(VISNETDIR)/include/fortify \
+	 $(VISNETDIR)/include/delaunay3d/detri \
+	 $(VISNETDIR)/include/delaunay3d/basic \
+	 $(VISNETDIR)/include/delaunay3d/sos \
+	 $(VISNETDIR)/include/delaunay3d/lia \
+         /usr/include \
+	 /home/bornemann/m3/include \
+	 $(HOME)/include
+INCLUDING := $(foreach dir,$(VPATH),-I$(dir))
+DEFS := $(foreach def,$(MACROS),-D$(def)) -D__EXTENSIONS__
+CFLAGS := $(OPTIONS) $(DEFS) $(INCLUDING)
+#LDFLAGS := $(LIBPATH) $(LIBS)
+
+OBJS := FlashData.o FlashMenu.o VectorList.o VisNET4Flash.o
+
+export MODE
+export MACROS
+export CC
+
+.C.o:
+	@echo ===============================================================
+	$(CC) -c $(CFLAGS) $<
+
+all: visnet visnetinstall lib install
+
+lib: $(OBJS)
+	@echo ===============================================================
+	$(AR) $(ARFLAGS) $(LIBTARGET) $(OBJS)
+
+visnet:
+	cd $(VISNETDIR)/src; $(MAKE)
+
+visnetclean:
+	cd $(VISNETDIR)/src; $(MAKE) clean
+
+visnetinstall:
+	cp $(VISNETDIR)/src/delaunay/libdelaunay.a $(LIBDIR)
+	cp $(VISNETDIR)/src/delaunay3d/libbasic.a $(LIBDIR)
+	cp $(VISNETDIR)/src/delaunay3d/libdetri.a $(LIBDIR)
+	cp $(VISNETDIR)/src/delaunay3d/liblia.a $(LIBDIR)
+	cp $(VISNETDIR)/src/delaunay3d/libsos.a $(LIBDIR)
+	cp $(VISNETDIR)/src/fortify/fortify.o $(LIBDIR)
+	cp $(VISNETDIR)/src/tv/libm3tv.a $(LIBDIR)
+
+visnetuninstall:
+	rm -rf $(LIBDIR)/libdelaunay.a \
+	       $(LIBDIR)/libbasic.a \
+	       $(LIBDIR)/libdetri.a \
+	       $(LIBDIR)/liblia.a \
+	       $(LIBDIR)/libsos.a \
+	       $(LIBDIR)/fortify.o \
+	       $(LIBDIR)/libm3tv.a
+
+
+install:
+	cp libvisnet4flash.a $(LIBDIR)
+
+uninstall:
+	rm -rf $(LIBDIR)/libvisnet4flash.a
+
+clean:
+	rm -rf *.o app core a.out *.a *.C~ *.h~ SunWS_cache
diff --git a/flash2d/lib/visnet4flash/Makefile.Settings b/flash2d/lib/visnet4flash/Makefile.Settings
new file mode 100644
index 0000000..f41d4db
--- /dev/null
+++ b/flash2d/lib/visnet4flash/Makefile.Settings
@@ -0,0 +1,186 @@
+TARGETOS := $(shell uname)
+MODE := norm
+AR := ar
+ARFLAGS := -cr
+
+# ====================================
+# ===== Linux ========================
+# ====================================
+ifeq ($(strip $(TARGETOS)),Linux)
+  CC := g++
+  LD := $(CC)
+  OPTIONS := -D__LINUX__
+  LIBS := -lglut -lGLU -lGL -ltiff $(LIBS)
+  # ----------------------------------
+  # ===== g++ ========================
+  # ----------------------------------
+  ifeq ($(CC),g++)
+    OPTIONS := $(OPTIONS) -Wall -fno-rtti -D__GNU__
+    LIBS := -lpthread $(LIBS)
+    # ===== debug ====================
+    ifeq ($(strip $(MODE)),debug)
+      OPTIONS := -O0 -g -DDEBUG_ $(OPTIONS)
+    endif
+    # ===== norm =====================
+    ifeq ($(strip $(MODE)),norm)
+    endif
+    # ===== opt ======================
+    ifeq ($(strip $(MODE)),opt)
+      OPTIONS := -O2 $(OPTIONS)
+    endif
+  endif
+  # ----------------------------------
+  # ===== CC =========================
+  # ----------------------------------
+  ifeq ($(CC),CC)
+    OPTIONS := +w -DHRTIMER -D__CC__ $(OPTIONS)
+    # ===== debug ====================
+    ifeq ($(strip $(MODE)),debug)
+      OPTIONS := -g -DDEBUG_ $(OPTIONS)
+    endif
+    # ===== norm =====================
+    ifeq ($(strip $(MODE)),norm)
+    endif
+    # ===== opt ======================
+    ifeq ($(strip $(MODE)),opt)
+      OPTIONS := -O5 $(OPTIONS)
+    endif
+  endif
+endif
+
+# ====================================
+# ===== SunOS ========================
+# ====================================
+ifeq ($(strip $(TARGETOS)),SunOS)
+  CC := CC
+  LD := $(CC)
+  OPTIONS := -D__SUN__
+  LIBS := -lglut -lGLU -lGL -ltiff -lXmu -lXext -lX11 -mt -lrt -lsocket $(LIBS)
+  # ------------------------------------
+  # --===== g++ ========================
+  # ------------------------------------
+  ifeq ($(CC),g++)
+    OPTIONS := $(OPTIONS) -Wall -fno-rtti -D__GNU__
+    LIBS := -lpthread $(LIBS) $(OPTIONS)
+    # ===== debug ====================
+    ifeq ($(strip $(MODE)),debug)
+      OPTIONS := -O0 -g -DDEBUG_ $(OPTIONS)
+    endif
+    # ===== norm =====================
+    ifeq ($(strip $(MODE)),norm)
+    endif
+    # ===== opt ======================
+    ifeq ($(strip $(MODE)),opt)
+      OPTIONS := -O2 $(OPTIONS)
+    endif
+  endif
+  # ----------------------------------
+  # ===== CC =========================
+  # ----------------------------------
+  ifeq ($(CC),CC)
+    OPTIONS := +w -DHRTIMER -D__CC__ $(OPTIONS)
+    # ===== debug ====================
+    ifeq ($(strip $(MODE)),debug)
+      OPTIONS := -g -DDEBUG_ $(OPTIONS)
+    endif
+    # ===== norm =====================
+    ifeq ($(strip $(MODE)),norm)
+    endif
+    # ===== opt ======================
+    ifeq ($(strip $(MODE)),opt)
+      OPTIONS := -O5 $(OPTIONS)
+    endif
+  endif
+endif
+
+# ===============================
+# ===== Irix ====================
+# ===============================
+ifeq ($(strip $(TARGETOS)),IRIX64)
+  CC := CC
+  LD := $(CC)
+  OPTIONS := -D__IRIX__
+  LIBS := -lglut -lGLU -lGL -lXmu -lXext -lX11 -lrt -ltiff -lm -lpthread $(LIBS)
+  # ------------------------------------
+  # --===== g++ ========================
+  # ------------------------------------
+  ifeq ($(CC),g++)
+    OPTIONS := $(OPTIONS) -Wall -fno-rtti -D__GNU__
+    LIBS := -lpthread $(LIBS) $(OPTIONS)
+    # ===== debug ====================
+    ifeq ($(strip $(MODE)),debug)
+      OPTIONS := -O0 -g -DDEBUG_ $(OPTIONS)
+    endif
+    # ===== norm =====================
+    ifeq ($(strip $(MODE)),norm)
+    endif
+    # ===== opt ======================
+    ifeq ($(strip $(MODE)),opt)
+      OPTIONS := -O2 $(OPTIONS)
+    endif
+  endif
+  # ----------------------------------
+  # ===== CC =========================
+  # ----------------------------------
+  ifeq ($(CC),CC)
+    OPTIONS := -fullwarn -DHRTIMER -D__CC__ $(OPTIONS)
+    # ===== debug ====================
+    ifeq ($(strip $(MODE)),debug)
+      OPTIONS := -g -DDEBUG_ $(OPTIONS)
+    endif
+    # ===== norm =====================
+    ifeq ($(strip $(MODE)),norm)
+    endif
+    # ===== opt ======================
+    ifeq ($(strip $(MODE)),opt)
+      OPTIONS := -O2 $(OPTIONS)
+    endif
+  endif
+endif
+
+# ===============================
+# ===== CygWin ====================
+# ===============================
+ifeq ($(strip $(TARGETOS)),CYGWIN_NT-5.1)
+  OPTIONS := -Wno-deprecated -D__CYGWIN__
+  CC := g++
+  LD := $(CC)
+  LIBS := -lglut32 -lGLU -lGL -ltiff $(LIBS)
+  # ----------------------------------
+  # ===== g++ ========================
+  # ----------------------------------
+  ifeq ($(CC),g++)
+    OPTIONS := $(OPTIONS) -Wall -fno-rtti -D__GNU__
+    LIBS := -lpthread $(LIBS)
+    # ===== debug ====================
+    ifeq ($(strip $(MODE)),debug)
+      OPTIONS := -O0 -g -DDEBUG_ $(OPTIONS)
+    endif
+    # ===== norm =====================
+    ifeq ($(strip $(MODE)),norm)
+    endif
+    # ===== opt ======================
+    ifeq ($(strip $(MODE)),opt)
+      OPTIONS := -O2 $(OPTIONS)
+    endif
+  endif
+  # ----------------------------------
+  # ===== CC =========================
+  # ----------------------------------
+  ifeq ($(CC),CC)
+    OPTIONS := +w -DHRTIMER -D__CC__ $(OPTIONS)
+    # ===== debug ====================
+    ifeq ($(strip $(MODE)),debug)
+      OPTIONS := -g -DDEBUG_ $(OPTIONS)
+    endif
+    # ===== norm =====================
+    ifeq ($(strip $(MODE)),norm)
+    endif
+    # ===== opt ======================
+    ifeq ($(strip $(MODE)),opt)
+      OPTIONS := -O5 $(OPTIONS)
+    endif
+  endif
+endif
+
+
diff --git a/flash2d/lib/visnet4flash/README b/flash2d/lib/visnet4flash/README
new file mode 100644
index 0000000..3074dc9
--- /dev/null
+++ b/flash2d/lib/visnet4flash/README
@@ -0,0 +1,9 @@
+WHATTODO:
+ - Get VisNET
+ - Copy VisNET to any Directory
+ - Open the Makefile
+ - Set variable VISNETDIR to your VisNET directory
+ - Set variables ROOTDIR and TARGETDIR to whatever you need
+   (should be the same as in flashs Makefile)
+ - Save Makefile
+ - Calling make should do the trick now
diff --git a/flash2d/lib/visnet4flash/VectorList.C b/flash2d/lib/visnet4flash/VectorList.C
new file mode 100644
index 0000000..d19db06
--- /dev/null
+++ b/flash2d/lib/visnet4flash/VectorList.C
@@ -0,0 +1,121 @@
+#include "fortify.h"
+#include "VectorList.h"
+//#include "M3TV_DataSource.h"
+#include "3dutil.h"
+#include "stdio.h"
+
+VectorList::VectorList():
+  nn_(0), coords_(NULL), vals_(NULL)
+{
+    n_ = new M3TV_SimpleNode(0,0,0,0,M3TV_Data::REUSABLE);
+    n1_ = new M3TV_SimpleNode(0,0,0,0,M3TV_Data::REUSABLE);
+    n2_ = new M3TV_SimpleNode(0,0,0,0,M3TV_Data::REUSABLE);
+    e_ = new M3TV_SimpleEdge(n1_, n2_);
+}
+VectorList::VectorList(int nn, int dim,
+		       float *coords,
+		       float *vals,
+		       double height):
+  nn_(0), coords_(NULL), vals_(NULL)
+{
+    n_ = new M3TV_SimpleNode(0,0,0,0,M3TV_Data::REUSABLE);
+    n1_ = new M3TV_SimpleNode(0,0,0,0,M3TV_Data::REUSABLE);
+    n2_ = new M3TV_SimpleNode(0,0,0,0,M3TV_Data::REUSABLE);
+    e_ = new M3TV_SimpleEdge(n1_, n2_);
+
+    setData(nn, dim, coords, vals);
+    setHeight(height);
+}
+
+VectorList::~VectorList(){
+    delete n_;
+    delete e_;
+    delete n1_;
+    delete n2_;
+}
+
+void VectorList::setData(int nn, int dim, float *coords, float *vals){
+  nn_ = nn;
+  dim_ = dim;
+  coords_ = coords;
+  vals_ = vals;
+  setChanged(1);
+}
+
+void VectorList::setHeight(double h){
+    height_ = h;
+    setChanged(1);
+}
+
+double VectorList::getHeight(){
+    return height_;
+}
+
+void VectorList::firstNode(){
+    ni_ = -1;
+}
+
+M3TV_Node *VectorList::nextNode(){
+    if(++ni_ >= nn_){
+	return NULL;
+    }
+    n_->setCoords(coords_[ni_*3], coords_[ni_*3+1], dim_==2?height_:coords_[ni_*3+2]);
+    return n_;
+}
+
+void VectorList::firstEdge(){
+    ei_ = -1;
+    //e_ = new M3TV_SimpleEdge(NULL, NULL);
+}
+
+M3TV_Edge *VectorList::nextEdge(){
+    if(++ei_ >= nn_){
+	return NULL;
+    }
+    // vals[5*ei_+1] == ucomp
+    // vals[5*ei_+2] == vcomp
+    // vals[5*ei_+3] == 3d:wcomp
+    n1_->setCoords(coords_[ei_*3],
+		   coords_[ei_*3+1],
+		   dim_==2?height_:coords_[ei_*3+2]);
+    n2_->setCoords(coords_[ei_*3]+vals_[5*ei_+1],
+		   coords_[ei_*3+1]+vals_[5*ei_+2],
+		   dim_==2?height_:coords_[ei_*3+2]+vals_[5*ei_+3]);
+    return e_;
+}
+
+void VectorList::initMinMax(){
+    M3TV_Edge *e;
+    double *c;
+    
+    firstEdge();
+    e = nextEdge();
+    if(e != NULL){
+	c = e->getNode1()->getCoordsD();
+	X(min_) = X(max_) = X(c);
+	Y(min_) = Y(max_) = Y(c);
+    }
+    firstEdge();
+    while((e = nextEdge()) != NULL){
+	c = e->getNode1()->getCoordsD();
+	if(X(c) < X(min_)) X(min_) = X(c);
+	if(X(c) > X(max_)) X(max_) = X(c);
+	if(Y(c) < Y(min_)) Y(min_) = Y(c);
+	if(Y(c) > Y(max_)) Y(max_) = Y(c);
+	
+	c = e->getNode2()->getCoordsD();
+	if(X(c) < X(min_)) X(min_) = X(c);
+	if(X(c) > X(max_)) X(max_) = X(c);
+	if(Y(c) < Y(min_)) Y(min_) = Y(c);
+	if(Y(c) > Y(max_)) Y(max_) = Y(c);
+    }
+    
+    Z(min_) = Z(max_) = height_;
+    
+    minnv_ = maxnv_ = 0;
+    minev_ = maxev_ = 0;
+    
+    minMaxCoordsSet_ = 1;
+    minMaxNodeValuesSet_ = 1;
+    minMaxEdgeValuesSet_ = 1;
+}
diff --git a/flash2d/lib/visnet4flash/VectorList.h b/flash2d/lib/visnet4flash/VectorList.h
new file mode 100644
index 0000000..b3cbaa5
--- /dev/null
+++ b/flash2d/lib/visnet4flash/VectorList.h
@@ -0,0 +1,47 @@
+#ifndef VECTROLIST_H
+#define VECTROLIST_H
+
+#include "M3TV_StdDataSource.h"
+
+class VectorList : public M3TV_EdgeList{
+ public:
+    VectorList();
+    VectorList(int nn, int dim,
+	       float *coords,
+	       float *vals,
+	       double height = 0.0);
+    ~VectorList();
+
+    void setData(int nn, int dim, float *coords, float *vals);
+    
+    void setHeight(double h);
+    double getHeight();
+    
+    int getNodeValueGroupCount(){return 1;}
+    int chooseNodeValueGroup(int index){return index ==0;}
+    int getEdgeValueGroupCount(){return 1;}
+    int chooseEdgeValueGroup(int index){return index == 0;}
+
+    int getNodeValueGroupName(int index, char *name, int len){return 0;}
+    int getEdgeValueGroupName(int index, char *name, int len){return 0;}
+
+    void firstNode();
+    M3TV_Node *nextNode();
+    
+    void firstEdge();
+    M3TV_Edge *nextEdge();
+
+ protected:
+    void initMinMax();
+
+ private:
+    int nn_, ni_, ei_;
+    int dim_;
+  float *coords_, *vals_;
+    M3TV_SimpleEdge* e_;
+
+    M3TV_SimpleNode *n_, *n1_, *n2_;
+    double height_;
+};
+
+#endif
diff --git a/flash2d/lib/visnet4flash/VisNET4Flash.C b/flash2d/lib/visnet4flash/VisNET4Flash.C
new file mode 100644
index 0000000..822543b
--- /dev/null
+++ b/flash2d/lib/visnet4flash/VisNET4Flash.C
@@ -0,0 +1,193 @@
+// Source file for the VisNET-Flash Interface (C++ part)
+
+#include <semaphore.h>
+#include <stdio.h>
+#include <string.h>
+#include "M3VisNETView.h"
+#include "FlashData.h"
+#include "FlashMenu.h"
+
+//#include "M3TV_DataSource.h"
+//#include "M3TV_StdDataSource.h"
+//#include "3dutil.h"
+//#include "M3TV_Menu.h"
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+    
+M3VisNETView *view;
+M3TV_DoubleTriangleList *dtl;
+FlashData *fd1, *fd2;
+FlashMenu *fm;
+int capture = 0;
+  
+int visnet_graphicsinit_(int *nn,                 // number of boundary nodes
+                         float *xx, float *yy,    // x- and y-coordinates of bounds
+                         int *wtl, char *wtext,   // window description text
+			 int *mtl, char *mskfile, // land data file name
+			 int *tiff,               // screenshot?
+			 int *initial_dimension,  // dimension
+			 int *i_extremes,         // use extremes?
+                         float *extremes){        // minimal and maximal nodal coordinates and values
+                                                  // [[minX,maxX],[minY,maxY],[minZ,maxZ],[minValue,maxValue]]
+    char *wtext_, *mskfile_;
+
+    // copy window description text
+    wtext_ = new char[*wtl+1]; 
+    strncpy(wtext_, wtext, *wtl);
+    wtext_[*wtl] = 0;
+
+    // copy land data fine name
+    mskfile_ = new char[*mtl+5];
+    strncpy(mskfile_, mskfile, *mtl);
+    mskfile_[*mtl] = 0;
+
+    /*/
+    printf("VisNET_GraphicsInit_ called ...\n");
+    printf("Boundary:\n");
+    for(int i = 0; i < *nn; i++){
+	printf("(%f, %f)\n", xx[i], yy[i]);
+    }
+
+    printf("Window Description Text:\n");
+    printf("string length: %d\n", *wtl);
+    printf("\"%s\"\n", wtext_);
+
+    printf("Land Data File Name:\n");
+    printf("string length: %d\n", *mtl);
+    printf("\"%s\"\n", mskfile_);
+
+    printf("Capture to TIFF:\n%d\n", *tiff);
+    printf("Dimension:\n%d\n", *initial_dimension);
+    printf("use extremes?: %d\n", *i_extremes);
+    printf("extremes-pointer: %p\n", extremes);
+    /**/
+
+    // tiff ?
+    if((*tiff) != 0){
+	capture = 1;
+    }
+
+    //bound = new Boundary(*nn, xx, yy);
+    fd1 = new FlashData(*initial_dimension);
+    fd2 = new FlashData(*initial_dimension);
+    dtl = new M3TV_DoubleTriangleList(fd1, fd2);
+
+    if(*i_extremes != 0){
+	fd1->setMinMaxCoords(extremes[0], extremes[1],
+			     extremes[2], extremes[3],
+			     extremes[4], extremes[5]);
+	fd1->setMinMaxNodeValues(extremes[6],
+				 extremes[7]);
+	fd2->setMinMaxCoords(extremes[0], extremes[1],
+			     extremes[2], extremes[3],
+			     extremes[4], extremes[5]);
+	fd2->setMinMaxNodeValues(extremes[6],
+				 extremes[7]);
+    }else{
+      //fd1->setAutoMinMax(1);
+      //fd2->setAutoMinMax(1);
+    }
+
+    //printf("creating view ...\n");
+    view = new M3VisNETView(dtl);
+    fm = new FlashMenu(view, *initial_dimension, fd1, fd2, dtl);
+    //view->addMenu(fd);
+    view->addMenu(fm);
+
+    view->show(0);
+
+    delete[] wtext_;
+    delete[] mskfile_;
+
+    return 0;
+}
+
+int visnet_graphicsdraw_(int *nn,                   // number of nodes
+			 int *ne,                   // number of edges
+			 int *nt,                   // number of elements
+			 float *coords,             // x,y-coordinates of nodes
+			 float *cvals,             // nodes value tracer
+			 int *e,                    // edges node indices
+			 int *t,                    // triangles node indices
+
+			 int *tiffnl, char *tiffname){ // tiff file name
+    
+  static int init = 1;
+ 
+  //printf("VisNET_GraphicsDraw_ called ...\n");
+  //printf("# of nodes: %d\n", *nn);
+  //printf("# of edges: %d\n", *ne);
+  //printf("# of elements: %d\n", *nt);
+  //printf("node coords pointer: %p\n", coords);
+  //printf("node values array pointer: %p\n", cvals); 
+  //printf("node values array : %p\n", *cvals); 
+  //printf("edges: %p\n", e);
+  //printf("triangles: %p\n", t);
+  //printf("TIFF file name length: %d\n", *tiffnl);
+  //printf("TIFF file name:\n");
+
+    char *s = new char[*tiffnl+1];
+    strncpy(s, tiffname, *tiffnl);
+    s[*tiffnl]=0;
+    char *tiffname_ = new char[*tiffnl+5];
+    sprintf(tiffname_, "%s.tif", s);
+    delete[] s;
+    //printf("%s\n", tiffname_);
+
+    if(init){
+      fd1->setData(*nn, *ne, *nt,
+		   coords,
+		   cvals,
+		   e, t);
+      init = 0;
+    }
+
+    FlashData *fd = (FlashData*)dtl->getWork();
+    fd->setData(*nn, *ne, *nt,
+		coords,
+		cvals,
+		e, t);
+    
+    double iso;
+    if(fm->getIsoValue(iso)){
+      fd->setIsoValue(iso);
+    }
+    
+
+    dtl->toggle();
+
+    int ok = view->repaint(capture);
+    
+    //printf("return from repaint: %d\n", ok);
+
+    if(ok){
+      if(capture){
+	view->captureTiffLZW(tiffname_);
+      }
+      
+      fm->wait();
+      
+    }
+
+    delete[] tiffname_;
+
+    return !ok;
+}
+
+void visnet_graphicsquit_(){
+  //printf("VisNET_GraphicsQuit_ called ...\n");
+    //delete fd1;
+    //delete fd2;
+    //delete dtl;
+    //delete fm;
+    //delete view;
+    //printf("VisNET_GraphicsQuit_ done\n");
+}
+
+#ifdef __cplusplus
+} //extern "C"
+#endif
diff --git a/flash2d/lib/visnet4flash/main.C b/flash2d/lib/visnet4flash/main.C
new file mode 100644
index 0000000..0d4d876
--- /dev/null
+++ b/flash2d/lib/visnet4flash/main.C
@@ -0,0 +1,91 @@
+#include "fortify.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int visnet_graphicsinit_(int *nn,                 // number of boundary nodes
+                         float *xx, float *yy,    // x- and y-coordinates of bounds
+                         int *wtl, char *wtext,   // window description text
+			 int *mtl, char *mskfile, // land data file name
+			 int *drwtyp,             // drawing type
+			 int *initial_drawmode,   // drawmode
+			 int *initial_dimension,  // dimension
+                         float *extremes);       // minimal and maximal nodal coordinates and values
+int visnet_graphicsdraw_(int *nn,                    // number of nodes
+			 int *ne,                    // number of edges
+			 int *nt,                    // number of elements
+			 float *coords,             // x,y-coordinates of nodes
+			 float *cval_tracer,        // nodes value tracer
+			 float *cval_ucomp,         // nodes value ucomp
+			 float *cval_vcomp,         // nodes value vcomp
+			 int *e,                    // edges node indices
+			 int *t,                    // triangles node indices
+
+			 int *tiffnl, char *tiffname, // tiff file name
+			 struct destext *dtext);      // tiff file description
+void visnet_graphicsquit_();
+
+
+int main(int argc, char *argv){
+    float h = 1;
+    float coords[5][3] = {{0,0,0},{1,1,0},{-1,1,0},{-1,-1,0},{1,-1,0}} ;
+//    float coords[10] = {0,1,-1,-1,1, 0,2,1,-1,-1};
+    float tracer[5] = {h,0,0,0,0};
+    float ucomp[5] = {0,0,0,0,0};
+    float vcomp[5] = {0,0,0,0,0};
+    int e[8][2] = {{1,2},{1,3},{1,4},{1,5},{2,3},{3,4},{4,5},{5,2}} ;
+    int t[4][3] = {{1,2,3},{1,3,4},{1,4,5},{1,5,2}};
+    int quit = 0;
+
+    int nn = 0;
+    int wtl = 35;
+    int mtl = 1;
+    int drwtyp = 9;
+    int initial_drawmode = 1;
+    int initial_dimension = 3;
+
+    int ne;
+    int nt;
+    int tiffnl;
+
+    Fortify_EnterScope();
+    
+    visnet_graphicsinit_(&nn,
+			 NULL, NULL,
+			 &wtl, (char*)"VisNET4Flash Interface Test Driver",
+			 &mtl, (char*)"x",
+			 &drwtyp,
+			 &initial_drawmode,
+			 &initial_dimension,
+			 NULL);
+    
+    nn = 5;
+    ne = 8;
+    nt = 4;
+    tiffnl = 12;
+
+    while(!quit){
+	quit = visnet_graphicsdraw_(&nn,
+				    &ne,
+				    &nt,
+				    (float*)coords,
+				    (float*)tracer,
+				    (float*)ucomp,
+				    (float*)vcomp,
+				    (int*)e,
+				    (int*)t,
+				    &tiffnl,(char*)"filename.tif",
+				    NULL);
+    }
+    
+    
+	visnet_graphicsquit_();
+
+	Fortify_LeaveScope();
+
+}
+
+#ifdef __cplusplus
+} //extern "C"
+#endif
diff --git a/flash2d/src/README b/flash2d/src/README
new file mode 100644
index 0000000..2cd3ce1
--- /dev/null
+++ b/flash2d/src/README
@@ -0,0 +1,17 @@
+**************************************************************************
+ FLASH90
+ FLexible Adaptive Semi-Lagrangian Hack
+ written in Fortran 90
+
+**************************************************************************
+
+ CONTENTS OF THIS DIRECTORY "$(FLASHDIR)/src"
+
+README			- this file
+flash			- directory for the FLASH sources
+system			- directory for system dependent routines
+utils			- directory for utility programs
+
+**************************************************************************
+ j. behrens, 5/01
+**************************************************************************
diff --git a/flash2d/src/flash-sphere/ADV_rhs.f90 b/flash2d/src/flash-sphere/ADV_rhs.f90
new file mode 100644
index 0000000..546b4cd
--- /dev/null
+++ b/flash2d/src/flash-sphere/ADV_rhs.f90
@@ -0,0 +1,76 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	ADV_rhs
+! FUNCTION:
+!	calculate the (nonhomogeneous) right hand side
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_righthand
+! FUNCTION:
+!	calculate the rhs of the advection equation
+! SYNTAX:
+!	real= slm_righthand(real.arr, real)
+! ON INPUT:
+!	r_coord: coordinates of point		real
+!	r_time:  time coordinate (optional)	real
+! ON OUTPUT:
+!	r_rhs:   right hand side value		real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!
+! COMMENTS:
+!	this is the homogeneous case!
+! USES:
+!	MISC_globalparam, MISC_error
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	2/98
+!	2. compliant to amatos 1.0	j. behrens	12/2000
+!	3. compliant to amatos 1.2	j. behrens	3/2002
+!
+!*****************************************************************
+	MODULE ADV_rhs
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC :: slm_righthand
+	  CONTAINS
+!*****************************************************************
+	  FUNCTION slm_righthand(r_coord, r_time) RESULT (r_rhs)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                  :: r_time
+	  REAL (KIND = GRID_SR)                                        :: r_rhs
+	  REAL (KIND = GRID_SR)                                        :: r_tim
+
+!---------- set time
+
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0
+	  END IF
+
+!---------- calculate the advection at (x,y) (velocity increasing)
+
+	  r_rhs= 0.0
+	
+	  RETURN
+	  END FUNCTION slm_righthand
+
+!*****************************************************************
+	END MODULE ADV_rhs
diff --git a/flash2d/src/flash-sphere/ADV_semilagrange.F90 b/flash2d/src/flash-sphere/ADV_semilagrange.F90
new file mode 100644
index 0000000..eaf4620
--- /dev/null
+++ b/flash2d/src/flash-sphere/ADV_semilagrange.F90
@@ -0,0 +1,850 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	ADV_semilagrange
+! FUNCTION:
+!	perform semi-Lagrangian advection
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_adapt
+! FUNCTION:
+!	adapt the grid according to an error estimate
+! SYNTAX:
+!	CALL slm_adapt(grid, param, logical)
+! ON INPUT:
+!	p_ghand:   handle for the grid		TYPE (grid_handle)
+!	p_param:   global parameter structure	TYPE (global_param)
+! ON OUTPUT:
+!	l_changed: flag for changed grid	LOGICAL
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialize
+! FUNCTION:
+!	initialize the advection problem
+! SYNTAX:
+!	CALL slm_initialize(grid, param)
+! ON INPUT:
+!	p_param: parameter data structure	TYPE (global_param)
+! ON OUTPUT:
+!	p_ghand: grid handling data structure	TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_finish
+! FUNCTION:
+!	terminate slm (free dynamically alloc. memory, ...)
+! SYNTAX:
+!	CALL slm_finish(grid, param)
+! ON INPUT:
+!	p_ghand: grid handling data structure	TYPE (grid_handle)
+!	p_param: parameter data structure	TYPE (global_param)
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_timestepping
+! FUNCTION:
+!	perform the timestepping in the slm
+! SYNTAX:
+!	CALL slm_timestepping(grid, param, cmd)
+! ON INPUT:
+!	p_ghand: grid handling data structure	TYPE (grid_handle)
+!	p_param: parameter data structure	TYPE (global_param)
+!	p_cmdln: command line argument struct.	TYPE (cmdline)
+! ON OUTPUT:
+!	p_ghand: grid handling data structure	TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_displace, slm_update, slm_upstream
+!	slm_initialize, slm_finish, slm_timestepping
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, FEM_handle
+!	FEM_errorestimate, FEM_param
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	10/96
+!	2. several improvements/fixes	j. behrens	11/96-1/97
+!	3. nodal values time depend.	j. behrens	1/97
+!	4. stop_watch removed, plot	j. behrens	1/97
+!	   (position) changed, inner
+!	   iteration counter added
+!	5. slm_adapt changed 		j. behrens	2/97
+!	6. slm_adapt changed to hide
+!	   grid data structures		j. behrens	7/97
+!	7. control data structure	j. behrens	12/97
+!	8. non-homog. rhs added		j. behrens	2/98
+!	9. compliant to amatos 1.0	j. behrens	12/2000
+!	10. compliant to amatos 1.2	j. behrens	3/2002
+!	11. compliant to amatos 2.0	j. behrens	7/2003
+!       12. added visnetplot            f. klaschka     12/2003
+!
+!*****************************************************************
+	MODULE ADV_semilagrange
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE IO_vtuplot
+#ifndef NO_NETCDF
+	  USE IO_netcdfplot
+#endif
+	  USE IO_utils
+	  USE GRID_api
+	  USE SLM_errorestimate
+	  USE SLM_initial
+	  USE SLM_simple
+	  USE SLM_advanced
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_initialize, slm_finish, slm_timestepping
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_adapt(p_ghand, p_param, l_changed, l_water)
+
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (grid_handle), INTENT(inout)      :: p_ghand
+	  TYPE (control_struct), INTENT(in)      :: p_param
+	  LOGICAL, INTENT(out)                   :: l_changed
+	  LOGICAL, OPTIONAL, INTENT(in)          :: l_water
+	  LOGICAL                                :: l_switch
+	  REAL (KIND = GRID_SR)                                   :: r_errmx, &
+	    r_refcrit, r_crscrit, r_fac
+	  INTEGER                                :: i_size, &
+	    i_manyc, i_manyr, i_alct, i_cnt
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE        :: r_aux1
+	  INTEGER, DIMENSION(:), ALLOCATABLE     :: i_aux1, i_aux2, i_aux3
+	  LOGICAL                                :: l_ref, l_crs
+
+!---------- initialize refinement flag
+
+	  l_changed= .FALSE.
+
+!---------- handle watermark switch
+
+	  wat_present: IF(present(l_water)) THEN
+	    l_switch= l_water
+	  ELSE wat_present
+	    l_switch= .TRUE.
+	  END IF wat_present
+
+!---------- allocate work arrays
+
+	  i_size= p_ghand%i_enumfine
+	  allocate(r_aux1(i_size), i_aux1(i_size), i_aux2(i_size), &
+                   i_aux3(i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(35)
+	  END IF not_alloc
+
+!---------- estimate the local error
+
+	  CALL slm_errorest(p_ghand, i_size, r_aux1)
+
+!---------- set coarsening/refinement criterion
+
+	  r_errmx= maxval(r_aux1(1:i_size))
+	  r_crscrit= r_errmx* p_param%num%r_crstolerance
+	  r_refcrit= r_errmx* p_param%num%r_reftolerance
+
+!---------- get level information and set up flags for refinement/coarsening
+
+	  CALL grid_getinfo(p_ghand, l_finelevel= .TRUE., i_elementlevel= i_aux1, &
+	                    i_elementstatus= i_aux3)
+	  DO i_cnt=1,i_size
+	    i_aux2(i_cnt)= 0
+	    IF((i_aux1(i_cnt) > p_param%num%i_crslevel) .AND. &
+	       (r_aux1(i_cnt) < r_crscrit)) i_aux2(i_cnt)= GRID_pleasecoarse
+	    IF((i_aux1(i_cnt) < p_param%num%i_reflevel) .AND. &
+	       (r_aux1(i_cnt) > r_refcrit)) i_aux2(i_cnt)= GRID_pleaserefine
+	  END DO
+
+!---------- determine if there is enough to be done (this can be
+!           switched off by l_water=.FALSE.)
+
+	  IF(l_switch) THEN
+	    i_manyr= count(i_aux2 == GRID_pleaserefine)
+	    r_fac= real(i_manyr,GRID_SR)/ real(i_size,GRID_SR)
+	    enough_ref: IF(r_fac > p_param%num%r_refwatermark) THEN
+	      l_ref= .TRUE.
+	    ELSE
+	      l_ref= .FALSE.
+	    END IF enough_ref
+
+	    i_manyc= count(i_aux2 == GRID_pleasecoarse)
+	    r_fac= real(i_manyc,GRID_SR)/ real(i_size,GRID_SR)
+	    enough_crs: IF(r_fac > p_param%num%r_crswatermark) THEN
+	      l_crs= .TRUE.
+	    ELSE
+	      l_crs= .FALSE.
+	    END IF enough_crs
+	  ELSE
+	    l_ref= .TRUE.
+	    l_crs= .TRUE.
+	  END IF
+
+!---------- update grid flags
+
+	  update: IF(l_ref .OR. l_crs) THEN
+	    IF(l_ref) i_aux3= merge(i_aux2, i_aux3, i_aux2==GRID_pleaserefine)
+	    IF(l_crs) i_aux3= merge(i_aux2, i_aux3, i_aux2==GRID_pleasecoarse)
+	    CALL grid_putinfo(p_ghand, l_finelevel= .TRUE., i_elementstatus= i_aux3)
+	  END IF update
+
+!---------- deallocate work arrays
+
+	  deallocate(r_aux1, i_aux1, i_aux2, i_aux3)
+
+!---------- adapt the grid
+
+	  CALL grid_adapt(p_ghand, l_changed)
+
+	  RETURN
+	  END SUBROUTINE slm_adapt
+
+!*****************************************************************
+	  SUBROUTINE slm_diagnostics(p_ghand, p_param, p_tinfo, c_action)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (grid_handle), INTENT(in)           :: p_ghand
+	  TYPE (control_struct), INTENT(inout)     :: p_param
+	  TYPE (rt_info), INTENT(in)               :: p_tinfo
+	  CHARACTER (len=4), INTENT(in), OPTIONAL  :: c_action
+	  INTEGER, SAVE                            :: i_iodiag
+	  CHARACTER (len=32)                       :: c_file
+	  CHARACTER (len=28)                       :: c_tmp
+	  REAL (KIND = GRID_SR), PARAMETER                          :: r_1o3= (1./3.)
+	  INTEGER                                  :: i_fst, i_tmp, &
+	    i_size, i_alct, i_1, i_2, i_3, i_4, i_5, i_6
+	  REAL (KIND = GRID_SR), SAVE                               :: r_rfm0, r_rsm0
+	  REAL (KIND = GRID_SR)                                     :: r_dispn, r_rfm, r_rsm, &
+	    r_ts, r_calci, r_calcs, r_mxnrm, r_l2nrm, r_max, r_min, r_diffn, &
+	    r_medln
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE          :: r_aux1, r_aux2, &
+	    r_aux3, r_aux4
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_auxx
+	  INTEGER, DIMENSION(1)                    :: i_valind
+
+!---------- action init
+
+	  present_act: IF(present(c_action)) THEN
+	    action_type: IF(c_action == 'init') THEN
+
+!---------- open file for diagnostic output
+
+	      i_iodiag= 9
+	      i_tmp   = p_param%num%i_experiment
+	      write(c_tmp,*) trim(GRID_parameters%program_name), '_diag.'
+	      write(c_file,1010) trim(c_tmp), i_tmp
+	      c_file= adjustl(c_file)
+	      open(i_iodiag, file= c_file, action= 'write', form= 'formatted', &
+	           iostat= i_fst)
+	      not_opened: IF(i_fst /= 0) THEN
+	        CALL grid_error(36)
+	      END IF not_opened
+	      IF(GRID_parameters%iolog > 0) &
+	        write(GRID_parameters%iolog,*) 'INFO: Filename: ', c_file, ' opened on unit: ', i_iodiag
+
+!---------- allocate workspace
+
+	      i_size= p_ghand%i_nnumber
+	      allocate(r_aux1(i_size), r_aux2(i_size), r_aux3(i_size), &
+	               r_aux4(i_size), r_auxx(1,i_size), stat=i_alct)
+	      not_alloc: IF(i_alct /= 0) THEN
+	        CALL grid_error(37)
+	      END IF not_alloc 
+	      r_aux1= 0.0; r_aux2= 0.0; r_aux3= 0.0; r_aux4= 0.0
+
+!---------- get minimum edge length
+
+	      CALL grid_edgelength(p_ghand, r_min=r_medln)
+
+!---------- calculate reference values, ... extract actual calculated concentration
+
+	      i_valind= (/ GRID_tracer /)
+	      CALL grid_getinfo(p_ghand, i_arraypoint=i_valind, &
+	                        r_nodevalues= r_auxx)
+	      r_aux1(:)= r_auxx(1,:)
+	      DEALLOCATE(r_auxx)
+
+!---------- calculate area pieces for each node
+
+	      CALL grid_nodearea(p_ghand, i_size, r_aux2)
+
+!---------- calculate analytical solution
+
+	      r_ts= p_param%num%r_deltatime* float(p_tinfo%i_step)
+	      CALL slm_analyticsolution(p_ghand, r_ts, i_size, r_aux3)
+
+!---------- now the integral of the concentration (mass) is
+
+	      r_calci= dot_product(r_aux1, r_aux2)
+	      r_rfm0 = r_calci
+
+!---------- the integral of the squared concentration ("entropy"(?)) is
+
+	      r_aux4 = r_aux1* r_aux1
+	      r_calcs= dot_product(r_aux4, r_aux2)
+	      r_rsm0 = r_calcs
+
+!---------- the maximum-norm of the error is
+
+	      r_aux4 = abs(r_aux1- r_aux3)
+	      r_mxnrm= maxval(r_aux4)
+
+!---------- the l2-norm of the error is
+
+	      r_aux4 = r_aux4* r_aux4
+	      r_l2nrm= dot_product(r_aux4, r_aux2)
+
+!---------- maximum and minimum
+
+	      r_max  = maxval(r_aux1)
+	      r_min  = minval(r_aux1)
+
+!---------- diffusion and dispersion (not yet implemented)
+
+	      r_diffn= 0.0
+	      r_dispn= 0.0
+
+!---------- print it
+
+	      r_rfm= r_calci/r_rfm0
+	      r_rsm= r_calcs/r_rsm0
+	      write(i_iodiag,1100) GRID_parameters%program_name, GRID_parameters%version, &
+	                           GRID_parameters%subversion, GRID_parameters%patchversion
+	      i_1= p_tinfo%i_step
+	      i_2= p_ghand%i_enumber
+	      i_3= p_ghand%i_enumfine
+	      i_4= p_ghand%i_gnumber
+	      i_5= p_ghand%i_gnumfine
+	      i_6= p_ghand%i_nnumber
+	      write(i_iodiag,1000) i_1, i_2, i_3, i_4, i_5, i_6, r_min, r_max, &
+	                           r_rfm, r_rsm, r_mxnrm, r_l2nrm, r_diffn, &
+				   r_dispn, r_medln
+
+!---------- deallocate workspace
+
+	      deallocate(r_aux1, r_aux2, r_aux3, r_aux4)
+
+!---------- initialization done
+
+	      RETURN
+
+!---------- action quit
+
+	    ELSE IF(c_action == 'quit') THEN action_type
+
+!---------- close diagnostic output file
+
+	      close(i_iodiag)
+ 	      IF(GRID_parameters%iolog > 0) &
+	        write(GRID_parameters%iolog,*) 'INFO: Closed file on unit: ', i_iodiag
+
+!---------- action quit done
+
+	      RETURN
+	    END IF action_type
+	  END IF present_act
+
+!---------- action diag (default): allocate workspace
+
+	  i_size= p_ghand%i_nnumber
+	  allocate(r_aux1(i_size), r_aux2(i_size), r_aux3(i_size), &
+	           r_aux4(i_size), r_auxx(1,i_size), stat=i_alct)
+	  not_allc: IF(i_alct /= 0) THEN
+	    CALL grid_error(37)
+	  END IF not_allc 
+	  r_aux1= 0.0; r_aux2= 0.0; r_aux3= 0.0; r_aux4= 0.0
+
+!---------- get minimum edge length
+
+	  CALL grid_edgelength(p_ghand, r_min=r_medln)
+
+!---------- calculate reference values, ... extract actual calculated concentration
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_getinfo(p_ghand, i_arraypoint=i_valind, &
+	  		   r_nodevalues= r_auxx)
+	  r_aux1(:)= r_auxx(1,:)
+	  DEALLOCATE(r_auxx)
+
+!---------- calculate area pieces for each node
+
+	  CALL grid_nodearea(p_ghand, i_size, r_aux2)
+
+!---------- calculate analytical solution
+
+	  r_ts= p_param%num%r_deltatime* float(p_tinfo%i_step)
+	  CALL slm_analyticsolution(p_ghand, r_ts, i_size, r_aux3)
+
+!---------- now the integral of the concentration (mass) is
+
+	  r_calci= dot_product(r_aux1, r_aux2)
+
+!---------- the integral of the squared concentration ("entropy"(?)) is
+
+	  r_aux4 = r_aux1* r_aux1
+	  r_calcs= dot_product(r_aux4, r_aux2)
+
+!---------- the maximum-norm of the error is
+
+	  r_aux4 = abs(r_aux1- r_aux3)
+	  r_mxnrm= maxval(r_aux4)
+
+!---------- the l2-norm of the error is
+
+	  r_aux4 = r_aux4* r_aux4
+	  r_l2nrm= dot_product(r_aux4, r_aux2)
+
+!---------- maximum and minimum
+
+	  r_max  = maxval(r_aux1)
+	  r_min  = minval(r_aux1)
+
+!---------- diffusion and dispersion (not yet implemented)
+
+	  r_diffn= 0.0
+	  r_dispn= 0.0
+
+!---------- print it
+
+	  r_rfm= r_calci/r_rfm0
+	  r_rsm= r_calcs/r_rsm0
+	  i_1= p_tinfo%i_step
+	  i_2= p_ghand%i_enumber
+	  i_3= p_ghand%i_enumfine
+	  i_4= p_ghand%i_gnumber
+	  i_5= p_ghand%i_gnumfine
+	  i_6= p_ghand%i_nnumber
+	  write(i_iodiag,1000) i_1, i_2, i_3, i_4, i_5, i_6, r_min, r_max, &
+	                       r_rfm, r_rsm, r_mxnrm, r_l2nrm, r_diffn, &
+	                       r_dispn, r_medln
+
+!---------- deallocate workspace
+
+	  deallocate(r_aux1, r_aux2, r_aux3, r_aux4)
+
+	  RETURN
+ 1000	  FORMAT(1x, i10, 1x, i10, 1x, i10, 1x, i10, 1x, i10, 1x, i10, &
+	         1x, e15.8, 1x, e15.8, 1x, e15.8, 1x, e15.8,&
+	         1x, e15.8, 1x, e15.8, 1x, e15.8, 1x, e15.8,&
+	         1x, e15.8)
+ 1010	  FORMAT(a28,i4.4)
+ 1100	  FORMAT(1x,'*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '*************************************',/ &
+	         1x,'***** PROGRAM: ',a15,174x,'*****',/ &
+	         1x,'***** VERSION: ',i2.2,'.',i2.2,'.',i2.2,181x,'*****',/ &
+	         1x,'***** Diagnostic output ',180x,'*****',/ &
+	         1x,'*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '*************************************',/ &
+	         1x,'* timestep ','  elements ','  fine el. ','     edges ', &
+	            '  fine ed. ','     nodes ','        minimum ', &
+	            '        maximum ','            RFM ','            RSM ', &
+                    '       max-norm ','        l2-norm ','      diffusion ', &
+	            '     dispersion ',' min.edge len.*',/ &
+	         1x,'*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '******************************************', &
+	            '**************************************')
+	  END SUBROUTINE slm_diagnostics
+
+!*****************************************************************
+	  SUBROUTINE slm_initialize(p_ghand, p_param)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(out) :: p_ghand
+	  TYPE (control_struct), INTENT(inout)          :: p_param
+
+	  INTEGER                                     :: i_steps
+	  CHARACTER (len=32)                          :: c_file
+	  CHARACTER (len=28)                          :: c_tmp
+	  INTEGER                                     :: i_tmp, i_cnt
+	  LOGICAL                                     :: l_refined
+	  INTEGER                                     :: i_vertnum
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER               :: r_vertinit
+
+!---------- decide whether a new experiment is startet or an old one is continued
+
+	  new_experiment: IF(p_param%num%i_experiment <= 0) THEN
+
+!---------- reset timesteps (start with 1 in any case)
+
+	    time_one: IF(p_param%num%i_frsttimestep /= 1) THEN
+	      IF(GRID_parameters%iolog > 0) &
+	        write(GRID_parameters%iolog,*) 'WARNING      : Timestep counters reset due to new experiment'
+	      i_steps= p_param%num%i_lasttimestep- p_param%num%i_frsttimestep
+	      p_param%num%i_frsttimestep= 1
+	      p_param%num%i_lasttimestep= p_param%num%i_frsttimestep+ i_steps
+	    END IF time_one
+
+!---------- initialize grid parameters
+
+	    CALL grid_setparameter(p_ghand, i_coarselevel= p_param%num%i_crslevel, &
+	                           i_finelevel= p_param%num%i_reflevel)
+
+!---------- define domain, first read data from file (compiled here)
+
+	    CALL grid_readdomain(i_vertnum, r_vertinit, c_readfile=p_param%io%c_domainfile)
+	    CALL grid_definegeometry(i_vertnum, r_vertexarr= r_vertinit)
+
+!---------- create initial triangulation
+
+	    CALL grid_createinitial(p_ghand, c_filename=p_param%io%c_triangfile)
+
+!---------- initialize grid and adapt at steep gradients
+
+	    i_cnt= 0
+	    l_refined= .TRUE.
+	    refine_loop: DO WHILE (l_refined)
+	      CALL slm_initialvalues(p_ghand(i_timeplus))
+	      CALL slm_adapt(p_ghand(i_timeplus), p_param, l_refined, &
+	                     l_water=.FALSE.)
+	    END DO refine_loop
+
+!---------- duplicate grid (old time)
+
+	    CALL grid_timeduplicate(p_ghand(i_timeplus), p_ghand(i_time))
+
+!---------- initialize wind field calculation
+
+	    CALL slm_windinit(p_param)
+
+!---------- if an old experiment is to be continued from stored data:
+
+	  ELSE new_experiment
+
+!---------- create grid from saveset, first compile filename
+
+	    i_tmp= p_param%num%i_experiment- 1
+	    write(c_tmp,*) trim(GRID_parameters%program_name), '_save.'
+	    write(c_file,1010) trim(c_tmp), i_tmp
+	    c_file= adjustl(c_file)
+
+	    CALL grid_readinitial(p_ghand, c_file)
+
+!---------- initialize wind field calculation
+
+	    CALL slm_windinit(p_param)
+
+	  END IF new_experiment
+
+	  RETURN
+ 1010	  FORMAT(a28,i4.4)
+	  END SUBROUTINE slm_initialize
+
+!*****************************************************************
+	  SUBROUTINE slm_finish(p_ghand, p_param)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                          :: p_param
+	  CHARACTER (len=32)                                       :: c_file
+	  CHARACTER (len=28)                                       :: c_tmp
+	  INTEGER                                                  :: i_tmp
+
+!---------- open and write saveset, if required
+
+	  save_req: IF(p_param%io%i_savelast /= 0) THEN
+
+	    i_tmp= p_param%num%i_experiment
+	    write(c_tmp,*) trim(GRID_parameters%program_name), '_save.'
+	    write(c_file,1010) trim(c_tmp), i_tmp
+	    c_file= adjustl(c_file)
+	    CALL grid_writesaveset(c_file, p_ghand)
+
+!---------- write parameter file for next experiment
+
+	    CALL io_putinputfile(p_param)
+	  END IF save_req
+
+!---------- gracefully terminate wind field calculations
+
+	  CALL slm_windquit
+
+	  RETURN
+ 1010	  FORMAT(a28,i4.4)
+	  END SUBROUTINE slm_finish
+
+!*****************************************************************
+	  SUBROUTINE slm_timestepping(p_ghand, p_param)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  INTEGER, PARAMETER                   :: i_innermax=15
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), &
+	                      INTENT(inout)    :: p_ghand
+	  TYPE (control_struct), INTENT(inout) :: p_param
+	  INTEGER                              :: i_timecount
+	  TYPE (sw_info)                       :: p_time, p_timeaux
+	  LOGICAL                              :: l_refined
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE      :: r_tracer
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_coord, r_aux
+	  CHARACTER (len=32)                   :: c_file, c_matfile
+	  CHARACTER (len=28)                   :: c_tmp
+	  INTEGER                              :: i_tmp, &
+	    i_size, i_alct, i_tst, i_fst
+	  INTEGER                              :: i_iomatl=21
+	  REAL (KIND = GRID_SR)                :: r_modtime
+          INTEGER                              :: i_loopquit
+	  INTEGER                              :: i_newlen
+	  INTEGER, DIMENSION(1)                :: i_valind
+		
+!---------- VISNET variable init
+
+		i_loopquit = 0
+		
+!---------- initialize timestep info structure
+
+	  p_timestepinfo%i_step       = 0
+	  p_timestepinfo%i_adapit     = 0
+	  p_timestepinfo%l_ploted     = .FALSE.
+	  p_timestepinfo%l_saved      = .FALSE.
+	  p_timestepinfo%r_modeltime  = 0.0
+
+!---------- initialize timing structure
+
+	  p_time%p_tim%r_tim   = 0.0
+	  p_time%p_tim%r_lap   = 0.0
+	  p_time%p_tim%c_tim   = '                '
+	  p_timeaux%p_tim%r_tim= 0.0
+	  p_timeaux%p_tim%r_lap= 0.0
+	  p_timeaux%p_tim%c_tim= '                '
+
+!---------- initialize stop watches
+
+	  CALL stop_watch_init(1,(/'total time      '/),p_timeaux)
+	  CALL stop_watch_init(8,(/'plotting        ', 'grid duplication', &
+	                           'trajectory calc.', 'right hand side ', &
+	                           'grid value updt.', 'grid adaption   ', &
+	                           'diagnostics     ', 'whole timestep  '/), p_time)
+	                           
+!---------- if diagnostics are demanded, initialize diagnostical output
+
+	  IF(p_param%io%l_diagnostics) THEN
+	    p_timestepinfo%i_step= 0
+	    CALL slm_diagnostics(p_grid(i_timeplus), p_param, p_timestepinfo, c_action='init')
+	  END IF
+
+!---------- plot initial data
+
+	  i_timecount= 0
+#ifndef NO_NETCDF
+	  IF(p_param%io%l_netcdf) THEN
+	    CALL plot_netcdf(p_ghand(i_timeplus), i_time=i_timecount)
+      END IF
+#endif
+	  IF(p_param%io%l_vtu) THEN
+	    CALL generate_vtu(p_ghand(i_timeplus), i_time=i_timecount)
+	  END IF
+!---------- put out initial information
+
+	  CALL io_putruntimeinfo(p_ghand(i_timeplus), p_timestepinfo, p_time)
+
+!---------- timestep loop
+
+      CALL stop_watch('start',1,p_timeaux)
+      CALL stop_watch('start',8,p_time)
+      i_timecount = 0_GRID_SI
+      p_timestepinfo%r_modeltime = p_param%num%r_starttime
+      time_loop: DO WHILE (p_timestepinfo%r_modeltime < p_param%num%r_finaltime - p_param%num%r_deltatime)
+        i_timecount                = i_timecount+ 1_GRID_SI
+        p_timestepinfo%i_step      = i_timecount
+        p_timestepinfo%r_modeltime = p_timestepinfo%r_modeltime + p_param%num%r_deltatime
+        p_timestepinfo%i_adapit    = 0_GRID_SI
+
+!---------- duplicate old grid, use it as first guess for new grid
+
+	    CALL stop_watch('start',2,p_time)
+	    CALL grid_timeduplicate(p_ghand(i_time), p_ghand(i_timeplus))
+	    CALL stop_watch('stop ',2,p_time)
+
+!---------- adaptive (inner) loop
+
+	    l_refined= .TRUE.
+	    adap_loop: DO WHILE(l_refined .AND. p_timestepinfo%i_adapit < i_innermax)
+	      p_timestepinfo%i_adapit= p_timestepinfo%i_adapit+ 1
+
+!---------- allocate and extract working arrays
+!---------- use amatos 1.2 functionality to calculate only new nodes
+
+	      i_size= p_ghand(i_timeplus)%i_nnumber
+	      allocate(r_aux(GRID_dimension,i_size), stat=i_alct)
+	      not_alloc: IF(i_alct /= 0) THEN
+	        CALL grid_error(38)
+	      END IF not_alloc
+
+!-SLM--------- do the following SLM calculations in arrays (grid-point-wise)
+
+	      CALL grid_getinfo(p_ghand(i_timeplus), r_nodecoordinates=r_aux, &
+	                        i_newsdepth= 1, i_nlength= i_newlen)
+	      allocate(r_tracer(i_newlen), r_coord(GRID_dimension,i_newlen), stat=i_alct)
+	      not_alloc0: IF(i_alct /= 0) THEN
+	        CALL grid_error(38)
+	      END IF not_alloc0
+	      r_coord(:,1:i_newlen)= r_aux(:,1:i_newlen)
+	      deallocate(r_aux)
+
+!-SLM--------- call the SLM step
+
+	      r_modtime= p_timestepinfo%r_modeltime- p_param%num%r_deltatime
+	      CALL slm_step(p_ghand, p_param, p_time, r_modtime, i_newlen, &
+	                    r_coord, r_tracer, i_newsdepth=1)
+
+!-SLM--------- update grid data structure and deallocate work arrays
+!-SLM--------- change back from (grid-point)arrays to grid data structure
+
+	      allocate(r_aux(1,i_newlen), stat=i_alct)
+	      not_alloc1: IF(i_alct /= 0) THEN
+	        CALL grid_error(38)
+	      END IF not_alloc1
+	      r_aux(1,:)= r_tracer(:)
+	      i_valind= (/ GRID_tracer /)
+	      CALL grid_putinfo(p_ghand(i_timeplus), i_arraypoint= i_valind, &
+	                        i_newsdepth= 1, r_nodevalues= r_aux)
+
+	      deallocate(r_coord, r_tracer, r_aux)
+
+!-SLM--------- adapt the grid corresponding to an error estimate
+
+	      CALL stop_watch('start',6,p_time)
+	      CALL slm_adapt(p_ghand(i_timeplus), p_param, l_refined)
+	      CALL stop_watch('stop ',6,p_time)
+
+	    END DO adap_loop
+
+!---------- diagnostics, if requested
+
+	    IF(p_param%io%l_diagnostics) THEN
+	      CALL stop_watch('start',7,p_time)
+	      CALL slm_diagnostics(p_grid(i_timeplus), p_param, p_timestepinfo, c_action='diag')
+	      CALL stop_watch('stop ',7,p_time)
+	    END IF
+
+!---------- plot data (every [i_plotoffset]th timestep)
+
+	    CALL stop_watch('start',1,p_time)
+	    plot_step: IF(mod(i_timecount, p_param%io%i_plotoffset) == 0) THEN
+	      IF((p_param%io%l_netcdf) .OR. (p_param%io%l_vtu)) &
+	        p_timestepinfo%l_ploted= .TRUE.
+
+#ifndef NO_NETCDF
+	      IF(p_param%io%l_netcdf) THEN
+	        CALL plot_netcdf(p_ghand(i_timeplus), i_time=i_timecount)
+	      END IF
+#endif
+	      IF(p_param%io%l_vtu) THEN
+	        CALL generate_vtu(p_ghand(i_timeplus), i_time=i_timecount)
+	      END IF
+	    END IF plot_step
+	    CALL stop_watch('stop ',1,p_time)
+
+!---------- put a saveset to disc every ... timesteps
+
+	    save_step: IF((mod(i_timecount, p_param%io%i_saveoffset) == 0) .AND. &
+	                  (i_timecount > 1)) THEN
+	      i_tmp= p_param%num%i_experiment
+ 	      write(c_tmp,*) trim(GRID_parameters%program_name), '_save.'
+	      write(c_file,1010) trim(c_tmp), i_tmp
+	      c_file= adjustl(c_file)
+	      CALL grid_writesaveset(c_file,p_ghand)
+	      p_timestepinfo%l_saved= .TRUE.
+	    END IF save_step
+
+!---------- runtime information output
+
+	    CALL stop_watch('stop ',8,p_time)
+	    CALL io_putruntimeinfo(p_ghand(i_timeplus), p_timestepinfo, p_time)
+	    CALL stop_watch_init(8,(/'plotting        ', 'grid duplication', &
+	                             'trajectory calc.', 'right hand side ', &
+	                             'grid value updt.', 'grid adaption   ', &
+	                             'diagnostics     ', 'whole timestep  '/), p_time)
+	    CALL stop_watch('start',8,p_time)
+
+!---------- remove obsolecent grid items
+
+	    CALL grid_sweep
+
+!---------- toggle time handles for next step if gfx-proces has not exited
+
+	    CALL grid_timetoggle
+
+!---------- exit loop if graphics process has been terminated
+
+            IF (i_loopquit /= 0) EXIT time_loop
+
+	  END DO time_loop
+	  CALL stop_watch('stop ',1,p_timeaux)
+
+!---------- print total time
+
+ 	  write(GRID_parameters%ioout,1005)
+	  write(GRID_parameters%ioout,1003) p_timeaux%p_tim(1)%r_tim
+	  write(GRID_parameters%ioout,1004)
+	  IF(GRID_parameters%iolog > 0) THEN
+	    write(GRID_parameters%iolog,1003) p_timeaux%p_tim(1)%r_tim
+	  END IF
+
+!---------- terminate diagnostics
+
+	  IF(p_param%io%l_diagnostics) THEN
+	    CALL slm_diagnostics(p_grid(i_timeplus), p_param, p_timestepinfo, c_action='quit')
+	  END IF
+
+	  RETURN
+ 1000	  FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/ &
+	         1x,'*****            Runtime Information Output           *****',/ &
+	         1x,'***** ----- ----- ----- ----- ----- ----- ----- ----- *****')
+ 1003	  FORMAT(1x,'***** Total time for timesteps ',10x,e12.4,' *****')
+ 1004	  FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/)
+ 1005	  FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/ &
+	         1x,'*****             Final Information Output            *****',/ &
+	         1x,'***** ----- ----- ----- ----- ----- ----- ----- ----- *****')
+ 1010	  FORMAT(a28,i4.4)
+	  END SUBROUTINE slm_timestepping
+
+	END MODULE ADV_semilagrange
diff --git a/flash2d/src/flash-sphere/ADV_wind.f90 b/flash2d/src/flash-sphere/ADV_wind.f90
new file mode 100644
index 0000000..b6000ca
--- /dev/null
+++ b/flash2d/src/flash-sphere/ADV_wind.f90
@@ -0,0 +1,156 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	ADV_wind
+! FUNCTION:
+!	calculate the windfield for the advection problem
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_windfield
+! FUNCTION:
+!	calculate the advecting force for simple advection
+! SYNTAX:
+!	real.arr= slm_windfield(real.arr, real)
+! ON INPUT:
+!	r_coord: coordinates of point		real
+!	r_time:  time coordinate (optional)	real
+! ON OUTPUT:
+!	r_field: windfield			real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	12/97
+!	2. compliant to amatos 1.0	j. behrens	12/2000
+!	3. compliant to amatos 1.2	j. behrens	3/2002
+!       4. compliant to amatos 2.0      f. klaschka     8/2006
+!
+!*****************************************************************
+	MODULE ADV_wind
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC :: slm_windfield, slm_windinit, slm_windquit
+	  REAL  (KIND = GRID_SR)  :: r_u0
+	  CONTAINS
+!*****************************************************************
+	  FUNCTION slm_windfield(r_coord, r_time, r_lamphi) RESULT (r_field)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimspherical), OPTIONAL :: r_lamphi
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                   :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)              :: r_field
+	  REAL (KIND = GRID_SR)                                         :: r_angl=0.0
+	  REAL (KIND = GRID_SR)                                         :: r_tim
+	  REAL (KIND = GRID_SR)                                         :: r_tmp
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimspherical)           :: r_lp, r_zetet, r_gup
+! 	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)              :: r_kup
+
+!---------- set time
+
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0
+	  END IF
+
+!---------- calculate spherical coordinates
+
+	  IF(present(r_lamphi)) THEN
+	    r_lp= r_lamphi
+	  ELSE
+	    r_lp= grid_kartgeo(r_coord)
+	  END IF
+
+!---------- calculate wind vector in spherical coordinates
+
+	  r_tmp= sin(r_angl)
+	  r_zetet(1)= r_u0* (cos(r_lp(2))* cos(r_angl) + &
+	              sin(r_lp(2))* cos(r_lp(1))* r_tmp)
+	  r_zetet(2)=  -r_u0* sin(r_lp(1))* r_tmp
+
+!---------- calculate wind vector in kartesian coordinates
+
+! 	  r_gup= r_lp- r_zetet
+! 	  r_kup=grid_geokart(r_gup)
+! 	  r_field= r_kup- r_coord
+	  r_field= kartwind(r_zetet,r_lp)
+	
+	  RETURN
+	  END FUNCTION slm_windfield
+
+!*****************************************************************
+	  SUBROUTINE slm_windinit(p_control)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (control_struct)     :: p_control
+
+!---------- calculate velocity factor (one revolution after 12 days/
+!           576 time steps of half an hour)
+
+	  r_u0= (2.0* GRID_PI* GRID_RADIUS)/1.0368e6
+
+	  RETURN
+	  END SUBROUTINE slm_windinit
+
+!*****************************************************************
+	  SUBROUTINE slm_windquit
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  RETURN
+	  END SUBROUTINE slm_windquit
+
+!*****************************************************************
+	  FUNCTION kartwind(r_lamphi, r_lpcoor) RESULT (r_kart)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimspherical) :: r_lamphi, r_lpcoor
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)    :: r_kart
+	  REAL (KIND = GRID_SR)                               :: r_sl, r_cl, r_sp, r_cp
+
+!---------- calculate constants
+
+	  r_sl= sin(r_lpcoor(1))
+	  r_cl= cos(r_lpcoor(1))
+	  r_sp= sin(r_lpcoor(2))
+	  r_cp= cos(r_lpcoor(2))
+
+!---------- calculate 3D kartesian components
+
+	  r_kart(1)= -r_sl* r_lamphi(1)- r_sp* r_cl* r_lamphi(2)
+	  r_kart(2)=  r_cl* r_lamphi(1)- r_sp* r_sl* r_lamphi(2)
+	  r_kart(3)=                     r_cp*       r_lamphi(2)
+
+	  RETURN
+	  END FUNCTION kartwind
+
+!*****************************************************************
+	END MODULE ADV_wind
+
+
diff --git a/flash2d/src/flash-sphere/FLASH_metadata.f90 b/flash2d/src/flash-sphere/FLASH_metadata.f90
new file mode 100644
index 0000000..1a01a38
--- /dev/null
+++ b/flash2d/src/flash-sphere/FLASH_metadata.f90
@@ -0,0 +1,63 @@
+!*******************************************************************************
+!
+!> @file  FLASH_metadata.f90
+!> @brief contains metadata definitions for FLASH_parameters
+!
+!*******************************************************************************
+! MODULE DESCRIPTION:
+!> @brief   This is a meta data structure that contains info for the 
+!>          FLASH_parameters physical parameters, related to different
+!>          Test cases.
+!> @author  J. Behrens
+!> @version 1.0
+!> @date    5/2016
+!*****************************************************************
+    MODULE FLASH_metadata
+
+    IMPLICIT NONE
+
+!---------- character length for comparison
+
+    INTEGER, PARAMETER                          :: i_comparlen=12 
+
+!---------- meta data for logical parameters 
+
+    LOGICAL, PARAMETER                          :: l_logused= .FALSE.
+    INTEGER, PARAMETER                          :: i_lognum=1
+    CHARACTER (len=i_comparlen), DIMENSION(i_lognum)  :: c_logkeywds= &
+                                                (/ '            ' /)
+
+!---------- meta data for integer parameters 
+
+    LOGICAL, PARAMETER                          :: l_intused= .FALSE.
+    INTEGER, PARAMETER                          :: i_intnum=1
+    INTEGER, DIMENSION(i_intnum)                :: i_intsizes= (/ 0 /)
+    CHARACTER (len=i_comparlen), DIMENSION(i_intnum)  :: c_intkeywds= &
+                                                (/ '            ' /)
+
+!---------- meta data for character parameters 
+
+    LOGICAL, PARAMETER                          :: l_charused= .TRUE.
+    INTEGER, PARAMETER                          :: i_charnum=1
+    INTEGER, PARAMETER                          :: i_charlength= 64
+    CHARACTER (len=i_comparlen), DIMENSION(i_charnum) :: c_charkeywds= &
+                                                (/ 'WIND_FILE_NA' /)
+
+!---------- meta data for real parameters 
+
+    LOGICAL, PARAMETER                          :: l_realused= .TRUE.
+    INTEGER, PARAMETER                          :: i_realnum=3
+    INTEGER, DIMENSION(i_realnum)               :: i_realsizes= (/ 1, 1, 1 /)
+    CHARACTER (len=i_comparlen), DIMENSION(i_realnum) :: c_realkeywds= &
+                                                (/ 'DIFFUSION_CO', &
+                                                   'WIND_COEFFIC', &
+                                                   'TOTAL_MASS_P' /)
+
+!---------- convenience pointers
+
+    INTEGER, PARAMETER                          :: PARAM_DIFFCOEF= 1
+    INTEGER, PARAMETER                          :: PARAM_WINDCOEF= 2
+    INTEGER, PARAMETER                          :: PARAM_TOTALMASS= 3
+    INTEGER, PARAMETER                          :: PARAM_WINDFILE= 1
+
+	END MODULE FLASH_metadata
diff --git a/flash2d/src/flash-sphere/FLASH_parameters.f90 b/flash2d/src/flash-sphere/FLASH_parameters.f90
new file mode 100644
index 0000000..397d737
--- /dev/null
+++ b/flash2d/src/flash-sphere/FLASH_parameters.f90
@@ -0,0 +1,111 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	FLASH_parameters
+! FUNCTION:
+!	defines global control structure
+! CONTAINS:
+!
+! PUBLIC:
+!	all
+! COMMENTS:
+!
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	12/2000
+!
+!*****************************************************************
+    MODULE FLASH_parameters
+    
+    USE FLASH_metadata
+
+    IMPLICIT NONE
+    INTEGER, PARAMETER :: io_fillen=128
+    INTEGER, PARAMETER :: i_redirout=8
+    INTEGER, PARAMETER :: i_redirlog=7
+
+!---------- structure for the command line
+
+    TYPE cmdline_param
+      SEQUENCE
+      CHARACTER (len=io_fillen) :: c_infile       ! input file name
+      CHARACTER (len=io_fillen) :: c_directory    ! input file name
+      LOGICAL                   :: l_output       ! redirect std output
+      LOGICAL                   :: l_logging      ! enable logging (verbose)
+    END TYPE cmdline_param
+
+!---------- structure for the i/o behaviour
+
+    TYPE io_param
+      SEQUENCE
+      LOGICAL                   :: l_diagnostics  ! switch on diagnostics
+      LOGICAL                   :: l_vtu          ! switch on vtu output
+      LOGICAL                   :: l_netcdf       ! switch on NetCDF output
+      INTEGER                   :: i_plotoffset   ! timesteps between plots
+      INTEGER                   :: i_saveoffset   ! timesteps between savesets
+      INTEGER                   :: i_savelast     ! indicator for last step saving
+!	  LOGICAL                   :: l_matlab       ! write matlab (offline) output
+!	  LOGICAL                   :: l_gmv          ! write gmv (offline) output
+          !-- BEGIN added for visnetplot [flo]:
+!	  LOGICAL                   :: l_visnet       ! plot visnet (online) output
+!          LOGICAL                   :: l_visnet_tiff  ! enable visnet screenshots
+          !-- END
+!	  CHARACTER (len=io_fillen) :: c_polygonfile  ! file with polygonal lines
+      CHARACTER (len=io_fillen) :: c_domainfile   ! file with definitions for domain
+      CHARACTER (len=io_fillen) :: c_triangfile   ! file with initial triangulation
+!      CHARACTER (len=io_fillen) :: c_windfile     ! file with wind information
+    END TYPE io_param
+
+!---------- structure for global physical and steering parameters
+
+    TYPE num_param
+      SEQUENCE
+      REAL               :: r_deltatime     ! timestep length [s]
+      REAL               :: r_reftolerance  ! tolerance for refinement
+      REAL               :: r_crstolerance  ! tolerance for coarsening
+      REAL               :: r_refwatermark  ! watermark for refinement
+      REAL               :: r_crswatermark  ! watermark for coarsening
+      REAL               :: r_starttime     ! first time (overwrites i_frsttimestep)
+      REAL               :: r_finaltime     ! last time (overwrites i_lasttimestep)
+      INTEGER            :: i_experiment    ! current experiment identification
+      INTEGER            :: i_crslevel      ! coarsest requested level
+      INTEGER            :: i_reflevel      ! finest requested level
+      INTEGER            :: i_frsttimestep  ! first timestep of experiment
+      INTEGER            :: i_lasttimestep  ! last timestep of experiment
+      INTEGER            :: i_adviterations ! iterations in trajectory estimation
+    END TYPE num_param
+
+!---------- structure for global physical and steering parameters
+
+    TYPE phys_param
+      LOGICAL, DIMENSION(:), POINTER                      :: phy_log
+      CHARACTER (len=i_charlength), DIMENSION(:), POINTER :: phy_char
+      INTEGER, DIMENSION(:,:), POINTER                    :: phy_int
+      REAL, DIMENSION(:,:), POINTER                       :: phy_real
+    END TYPE phys_param
+
+!---------- global control structure
+
+	TYPE control_struct
+	  TYPE (num_param)          :: num
+	  TYPE (cmdline_param)      :: cmd
+	  TYPE (io_param)           :: io
+	  TYPE (phys_param)         :: phy
+	END TYPE control_struct
+	TYPE (control_struct)       :: p_contr
+
+!---------- structure for runtime information
+
+	TYPE rt_info
+	  REAL               :: r_modeltime
+	  INTEGER            :: i_step
+	  INTEGER            :: i_adapit
+	  LOGICAL            :: l_saved
+	  LOGICAL            :: l_ploted
+	END TYPE rt_info
+	TYPE (rt_info)       :: p_timestepinfo
+
+	END MODULE FLASH_parameters
diff --git a/flash2d/src/flash-sphere/Flash90.F90 b/flash2d/src/flash-sphere/Flash90.F90
new file mode 100644
index 0000000..a493384
--- /dev/null
+++ b/flash2d/src/flash-sphere/Flash90.F90
@@ -0,0 +1,106 @@
+!*****************************************************************
+!
+! PROJECT:
+!	FLASH90 means
+!	        FLexible Adaptive Semi-Lagrangian Hack
+!	        written in Fortran 90
+! NAME:
+!	Flash90
+! FUNCTION:
+!	main program (driver routine for the adaptive SLM)
+! SYNTAX:
+!	flash90 [options]
+! ON INPUT:
+!
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+! LIBRARIES:
+!	USEs several fortran 90 modules
+! REFERENCES:
+!	this is a complete reimplementation of STASL
+! VERSION(S):
+!	1. original version		j. behrens	11/96
+!	2. tidied up a little		j. behrens	7/97
+!	3. new control struct		j. behrens	12/97
+!	4. compliant to amatos 1.0	j. behrens	12/2000
+!	5. compliant to amatos 1.2	j. behrens	3/2002
+!   6. added visnetplot         f. klaschka 12/2003
+!   7. refactured a bit...      j. behrens  5/2016
+!
+!*****************************************************************
+	PROGRAM flash90
+
+!---------- modules
+
+	USE FLASH_parameters
+	USE IO_utils
+        !-- added for visnetplot [flo]:
+	USE GRID_api
+	USE ADV_semilagrange
+
+!---------- local declarations
+
+	IMPLICIT NONE
+	
+	INTEGER             :: i_dummy
+
+!---------- set FLASH description in global datastruct
+
+	GRID_parameters%program_name= 'Flash90                                         '
+	GRID_parameters%version= 0
+	GRID_parameters%subversion= 9
+	GRID_parameters%patchversion= 0
+	GRID_parameters%datemonth= 5
+	GRID_parameters%dateyear= 2016
+
+!---------- read command line options
+
+	CALL io_getcmdline(p_contr)
+
+!---------- initialize grid generator
+
+	IF(p_contr%cmd%l_output) THEN
+	  IF(p_contr%cmd%l_logging) THEN
+	    CALL grid_initialize(i_output=i_redirout, i_logging=i_redirlog)
+	  ELSE
+	    CALL grid_initialize(i_output=i_redirout)
+	  END IF
+	ELSE
+	  IF(p_contr%cmd%l_logging) THEN
+	    CALL grid_initialize(i_logging=i_redirlog)
+	  ELSE
+	    CALL grid_initialize
+	  END IF
+	END IF
+
+!---------- read parameter input from file
+
+    CALL io_initparams(p_contr)
+    CALL io_getbatchinput(p_contr)
+
+!---------- print global parameters
+
+	CALL io_putparameters(p_contr)
+
+!---------- set up advection starting conditions, initialize grid, etc.
+
+	CALL slm_initialize(p_grid, p_contr)
+
+!---------- call the (major) routine for timestepping
+
+	CALL slm_timestepping(p_grid, p_contr)
+
+!---------- terminate the SLM (gracefully free memory, terminate grid, etc.)
+
+	CALL slm_finish(p_grid, p_contr)
+
+!---------- terminate grid generator
+
+	CALL grid_terminate
+
+	STOP
+	END PROGRAM flash90
diff --git a/flash2d/src/flash-sphere/IO_gmvplot.F90 b/flash2d/src/flash-sphere/IO_gmvplot.F90
new file mode 100644
index 0000000..ab08bd2
--- /dev/null
+++ b/flash2d/src/flash-sphere/IO_gmvplot.F90
@@ -0,0 +1,314 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	IO_gmvplot
+! FUNCTION:
+!	print data in GMV compatible file format
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	plot_netcdf
+! FUNCTION:
+!	create output fin netcdf file format
+! SYNTAX:
+!	call plot_netcdf(handle, char.string)
+! ON INPUT:
+!	p_handle: grid handle for the linked lists  (required)	type (grid_handle)
+!	c_filename: file name for plot file          (optional)	character
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	plot_gmv
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	4/2000
+!	2. amatos-1.0 and 2D compliant	j. behrens	11/2000
+!       7. compliant to amatos 2.0      f. klaschka     8/2006
+!
+!*****************************************************************
+	MODULE IO_gmvplot
+	  USE GRID_api
+	  USE FLASH_parameters
+	  PRIVATE
+	  INTEGER, SAVE :: i_timecounter= 0
+	  PUBLIC :: plot_gmv
+	  CONTAINS
+!*****************************************************************
+  SUBROUTINE gmv_knotenvel(i_iogmv, iiosum, rnuvw)
+    INTEGER, INTENT(in)                                           :: i_iogmv
+    INTEGER, INTENT(inout)                                        :: iiosum
+    REAL (KIND=GRID_SR), DIMENSION(:,:), INTENT(in)               :: rnuvw
+
+    INTEGER                                                       :: i_iostat, incou, iline, inzahl
+    CHARACTER(512)                                                :: ciolist
+    CHARACTER(512)                                                :: cnzahl1, cnzahl2
+
+    inzahl = SIZE(rnuvw,2)
+
+!!!************** write u,v,w- fielddata nodewise
+
+    ! write line with: velocity 1
+    WRITE(i_iogmv,'(a10)', iostat= i_iostat) 'velocity 1'
+    iiosum= iiosum+ ABS(i_iostat)
+
+    ! line with pval%inzahl(ifut) numbers
+    ! 1st line: u- compunent
+    ! 2nd line: v- component
+    ! 3rd line: w- component
+    WRITE(cnzahl1,'(I)') inzahl
+    ciolist = '(' // TRIM(cnzahl1) // 'es11.3)'
+
+    DO iline= 1, 3
+       ! i th line
+       WRITE(i_iogmv, ciolist, iostat= i_iostat) &
+            (rnuvw(iline, incou), incou= 1, inzahl)
+       iiosum= iiosum+ ABS(i_iostat)
+    END DO
+  END SUBROUTINE gmv_knotenvel
+!*****************************************************************
+	  SUBROUTINE plot_gmv(p_handle, i_time, i_newslevel)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (grid_handle), INTENT(in)       :: p_handle
+	  INTEGER, OPTIONAL, INTENT(in)        :: i_time
+	  INTEGER, OPTIONAL, INTENT(in)        :: i_newslevel
+	  INTEGER                              :: i_io1
+	  INTEGER                              :: i_cnt, j_cnt, &
+	    i_alct, i_nnum, i_tnum, i_dim, i_tcnt, i_fst
+	  INTEGER                              :: i_nwl, i_elen, i_glen, i_nlen
+	  REAL, DIMENSION(:), ALLOCATABLE      :: r_ttmp
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_cox, r_val
+	  INTEGER, DIMENSION(:,:), ALLOCATABLE :: i_tets
+	  INTEGER, DIMENSION(:), ALLOCATABLE   :: i_ids, i_sta
+	  CHARACTER (len=32)                   :: c_mfile
+	  CHARACTER (len=28)                   :: c_tmp
+	  LOGICAL                              :: l_news
+	  INTEGER, PARAMETER                   :: i_vallen=6
+	  INTEGER, DIMENSION(i_vallen)         :: i_valind
+
+!!!DBG BGN
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE    :: r_distort
+          REAL (KIND = GRID_SR)                               :: r_minval, r_maxval, r_scal
+!!!DBG END
+
+
+!---------- file handling (open)
+
+	  IF(present(i_time)) THEN
+	    i_tcnt= i_time
+	    i_timecounter= i_timecounter+1
+	  ELSE
+	    i_tcnt= i_timecounter
+	    i_timecounter= i_timecounter+1
+	  END IF
+	  write(c_tmp,*) trim(GRID_parameters%program_name(1:23)), '_gmv.'
+	  write(c_mfile,10101) trim(c_tmp), i_tcnt
+	  c_mfile= adjustl(c_mfile)
+	  i_io1= 15
+	  OPEN(i_io1, file= c_mfile, form= 'formatted', iostat= i_fst)
+	  IF(i_fst /= 0) THEN
+	    RETURN
+	  END IF
+
+!---------- handle news level
+
+	  IF(present(i_newslevel)) THEN
+	    l_news=.TRUE.
+	    i_nwl= i_newslevel
+	  ELSE
+	    l_news=.FALSE.
+	  END IF
+
+!---------- write header
+
+	  WRITE(i_io1,1000)
+	  WRITE(i_io1,1001)
+	  WRITE(i_io1,1002) c_mfile
+	  WRITE(i_io1,1003) GRID_parameters%program_name, GRID_parameters%version, GRID_parameters%subversion, GRID_parameters%patchversion
+	  WRITE(i_io1,1004) GRID_parameters%author_name, GRID_parameters%author_email
+	  WRITE(i_io1,1005)
+
+!---------- the nodes
+
+	    i_nnum = p_handle%i_nnumber
+	    
+
+
+!---------- extract nodal grid data and nodal values
+
+	  ALLOCATE(r_cox(GRID_dimension, i_nnum), r_val(i_vallen, i_nnum), stat=i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(c_error='[plot_gmv]: could not allocate coordinate aux. array')
+	  END IF
+	  i_valind= (/GRID_ucomp, GRID_vcomp, GRID_wcomp, GRID_phi, GRID_zeta, GRID_tracer/)
+	  CALL grid_getinfo(p_handle, r_nodecoordinates= r_cox, &
+	                    r_nodevalues= r_val, i_arraypoint=i_valind)
+!!!DBG BGN
+          r_minval = MINVAL(r_val(i_vallen,:))
+          r_maxval = MAXVAL(r_val(i_vallen,:))
+          r_scal   = 1.0/10.0/(r_maxval-r_minval)
+          ALLOCATE(r_distort(i_nnum))
+          DO i_cnt = 1,i_nnum
+             r_distort(i_cnt) = 1.0 + r_scal * (r_val(i_vallen,i_cnt)-r_minval)
+          END DO
+!!!DBG END
+	  WRITE(i_io1,1010) i_nnum
+	  DO i_dim=1,GRID_dimension
+	    WRITE(i_io1,1011) (r_cox(i_dim,i_cnt), i_cnt=1,i_nnum)
+!!$	    WRITE(i_io1,1011) (r_cox(i_dim,i_cnt)*r_distort(i_cnt), i_cnt=1,i_nnum)
+	  END DO
+	  DEALLOCATE(r_cox)
+
+!!!DBG BGN
+          DEALLOCATE(r_distort)
+!!!DBG END
+
+!---------- extract cells grid data
+
+	  i_tnum= p_handle%i_enumfine
+	  ALLOCATE(i_tets(GRID_elementnodes,i_tnum), &
+	  i_ids(i_tnum), i_sta(i_tnum), stat=i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(c_error='[plot_gmv]: could not allocate integer aux. arrays')
+	  END IF
+	  IF(l_news) THEN
+	    CALL grid_getinfo(p_handle, i_newsdepth= i_nwl, i_elength= i_elen, &
+	      i_elementnodes= i_tets, i_elementlevel= i_ids, i_elementstatus= i_sta)
+	    i_tnum= i_elen
+	  ELSE
+	    CALL grid_getinfo(p_handle, i_elementnodes= i_tets, &
+	      i_elementlevel= i_ids, i_elementstatus= i_sta)
+	  END IF
+	  WRITE(i_io1,1020) i_tnum
+	  tetra_loop: DO j_cnt=1,i_tnum
+	    WRITE(i_io1,1021)
+	    WRITE(i_io1,1022) (i_tets(i_cnt,j_cnt), i_cnt=1,GRID_elementnodes)
+	  END DO tetra_loop
+
+!!!DBG BGN
+          CALL gmv_knotenvel(i_io1, i_tnum, r_val(1:3,:))
+!!!DBG END
+
+
+!---------- write modeltime
+	
+	  WRITE(i_io1,1009) p_timestepinfo%r_modeltime
+
+!----------	  
+	  
+	  WRITE(i_io1,1040)
+	  WRITE(i_io1,1041)
+	  WRITE(i_io1,1022) (i_ids(i_cnt), i_cnt=1,i_tnum)
+	  WRITE(i_io1,1043)
+	  WRITE(i_io1,1022) (i_sta(i_cnt), i_cnt=1,i_tnum)
+
+!---------- show those elements that contain even a tiny proportion of mass,
+!           reuse i_sta array
+
+	  i_sta= 0
+	  DO j_cnt=1,i_tnum
+	    DO i_dim=1,GRID_elementnodes
+	      IF(ABS(r_val(i_vallen,i_tets(i_dim,j_cnt))) > GRID_EPS) &
+	        i_sta(j_cnt)= i_sta(j_cnt)+ 1
+	    END DO
+	  END DO
+	  WRITE(i_io1,10431)
+	  WRITE(i_io1,1022) (i_sta(i_cnt), i_cnt=1,i_tnum)
+	  DEALLOCATE(i_tets, i_ids, i_sta)
+
+!---------- the element processor
+
+#ifdef _OPENMP
+	  ALLOCATE(i_ids(i_tnum), stat=i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(c_error='[plot_gmv]: could not allocate aux. proc. array')
+	  END IF
+
+	  IF(l_news) THEN
+	    CALL grid_getinfo(p_handle, i_newsdepth= i_nwl, i_elength= i_elen, &
+	      i_elementproc= i_ids)
+	    i_tnum= i_elen
+	  ELSE
+	    CALL grid_getinfo(p_handle, i_elementproc= i_ids)
+	  END IF
+	  WRITE(i_io1,1044)
+	  WRITE(i_io1,1022) (i_ids(i_cnt), i_cnt=1,i_tnum)
+	  DEALLOCATE(i_ids)
+#endif
+
+!---------- write the tracer concentration, and velocity
+
+	  WRITE(i_io1,1045)
+	  WRITE(i_io1,1011) (r_val(1,i_cnt), i_cnt=1,i_nnum)
+	  WRITE(i_io1,1046)
+	  WRITE(i_io1,1011) (r_val(2,i_cnt), i_cnt=1,i_nnum)
+	  WRITE(i_io1,10461)
+	  WRITE(i_io1,1011) (r_val(3,i_cnt), i_cnt=1,i_nnum)
+	  WRITE(i_io1,1047)
+	  WRITE(i_io1,1011) (r_val(4,i_cnt), i_cnt=1,i_nnum)
+	  WRITE(i_io1,1048)
+	  WRITE(i_io1,1011) (r_val(5,i_cnt), i_cnt=1,i_nnum)
+	  WRITE(i_io1,1042)
+	  WRITE(i_io1,1011) (r_val(i_vallen,i_cnt), i_cnt=1,i_nnum)
+	  WRITE(i_io1,1049)
+	  DEALLOCATE(r_val)
+
+!---------- close file
+
+	  WRITE(i_io1,1100)
+	  CLOSE(i_io1)
+
+	  RETURN
+  1000	  FORMAT('gmvinput ascii')
+  1001	  FORMAT('comments')
+  1002	  FORMAT(' File: ',a48)
+  1003	  FORMAT(' Written by: ',a15,' Version ',i1,'.',i1,'.',i1)
+  1004	  FORMAT(' Author: ',a48,' <',a48,'>')
+  1005	  FORMAT('endcomm')
+  1009    FORMAT('probtime ',f15.1)
+  1010	  FORMAT('nodes ',i8)
+!  1011	  FORMAT(10f15.5)
+  1011	  FORMAT(10es15.5)
+  1020	  FORMAT('cells ',i8)
+  1021	  FORMAT('tri 3')
+  1022	  FORMAT(10i8)
+  1031	  FORMAT('cellids')
+  1040	  FORMAT('variable')
+  1041	  FORMAT('level 0')
+  1043	  FORMAT('status 0')
+  10431	  FORMAT('num-diff 0')
+#ifdef _OPENMP
+  1044	  FORMAT('proc 0')
+#endif
+  1042	  FORMAT('tracr 1')
+  1045	  FORMAT('u-comp 1')
+  1046	  FORMAT('v-comp 1')
+  10461	  FORMAT('w-comp 1')
+  1047	  FORMAT('phi 1')
+  1048	  FORMAT('zeta 1')
+  1049	  FORMAT('endvars')
+  1100	  FORMAT('endgmv')
+ 10101	  FORMAT(a28,i4.4)
+	  END SUBROUTINE plot_gmv
+
+	END MODULE IO_gmvplot
+
+
+
+
diff --git a/flash2d/src/flash-sphere/IO_griddedplot.f90 b/flash2d/src/flash-sphere/IO_griddedplot.f90
new file mode 100644
index 0000000..195b21a
--- /dev/null
+++ b/flash2d/src/flash-sphere/IO_griddedplot.f90
@@ -0,0 +1,142 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	IO_griddedplot
+! FUNCTION:
+!	perform rendering into file
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	plot_gridded
+! FUNCTION:
+!	create output for visualization by gnuplot and other grid oriented
+!	mapping tools
+! SYNTAX:
+!	call plot_gridded(grid, int, int, char)
+! ON INPUT:
+!	p_handle:grid handle for the linked lists   (required)	type (grid_handle)
+!	i_time: time stamp for file naming          (optional)	integer
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	plot_gridded
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, IO_plotdefine, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!	this module is based on the original implementations in the
+!	splash/fe project (fortran 77 version), but wildly modified!
+! VERSION(S):
+!	1. original version		j. behrens	1/2000
+!	2. compliant to amatos 1.0	j. behrens	12/2000
+!	3. compliant to amatos 1.2	j. behrens	3/2002
+!
+!*****************************************************************
+	MODULE IO_griddedplot
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  INTEGER, SAVE :: i_timecounter=0
+	  PUBLIC :: plot_gridded
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE plot_gridded(p_handle, i_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (grid_handle), INTENT(in)       :: p_handle
+	  INTEGER, OPTIONAL, INTENT(in)        :: i_time
+	  INTEGER                              :: i_io1, i_cnt, j_cnt, i_out, &
+	    i_tim, i_alct, i_gridpoints, i_tcnt, i_fst
+	  REAL, DIMENSION(:,:), ALLOCATABLE    :: r_xytmp
+	  REAL, DIMENSION(GRID_dimension)      :: r_sw, r_ne, r_coo
+	  REAL                                 :: r_tmp, r_xstep, r_ystep
+	  CHARACTER (len=32)                   :: c_matfile
+	  CHARACTER (len=28)                   :: c_tmp
+
+!---------- file handling (open)
+
+	  IF(present(i_time)) THEN
+	    i_tcnt= i_time
+	    i_timecounter= i_timecounter+1
+	  ELSE
+	    i_tcnt= i_timecounter
+	    i_timecounter= i_timecounter+1
+	  END IF
+	  write(c_tmp,*) trim(GRID_parameters%program_name), '_gridded.'
+	  write(c_matfile,1020) trim(c_tmp), i_tcnt
+	  c_matfile= adjustl(c_matfile)
+	  i_io1= 15
+	  OPEN(i_io1, file= c_matfile, form= 'formatted', iostat= i_fst)
+	  IF(i_fst /= 0) THEN
+	    RETURN
+	  END IF
+
+!---------- deternime maximum extent of domain, allocate temporary array
+
+	  i_cnt= p_handle%i_nnumber
+	  allocate(r_xytmp(GRID_dimension,i_cnt), stat=i_alct)
+	  not_alloc1: IF(i_alct /= 0) THEN
+	    CALL grid_error(45)
+	  END IF not_alloc1
+
+!---------- get array with boundary polygonal line
+
+	  CALL grid_getpolyline(p_handle, GRID_boundary, i_cnt, j_cnt, r_xytmp)
+
+!---------- determine minimum/maximum
+
+	  r_sw= minval(r_xytmp(:,1:j_cnt), dim=2)
+	  r_ne= maxval(r_xytmp(:,1:j_cnt), dim=2)
+	  deallocate(r_xytmp)
+
+!---------- determine number of required grid-points
+
+	  r_tmp= (1.+ p_handle%i_maxlvl)* 0.5
+	  i_cnt= ceiling(r_tmp)
+	  i_gridpoints= 2**i_cnt
+	  write(i_io1,1010) i_gridpoints
+
+!---------- determine coordinate step size (only 2D!)
+
+	  r_xstep= (r_ne(1)- r_sw(1))/(i_gridpoints- 1)
+	  r_ystep= (r_ne(2)- r_sw(2))/(i_gridpoints- 1)
+
+!---------- now the nested loop (only 2D!)
+
+	  outer_loop: DO j_cnt=0,i_gridpoints-1
+	    r_coo(2)= r_sw(2)+ j_cnt* r_ystep
+	    inner_loop: DO i_cnt=0,i_gridpoints-1
+	      r_coo(1)= r_sw(1)+ i_cnt* r_xstep
+	      r_tmp= grid_coordvalue(p_handle, r_coo, &
+	             i_interpolorder=GRID_loworder, i_valpoint=GRID_tracer)
+	      write(i_io1,1000) r_tmp
+!gnupl	      write(i_io1,1000) r_tmp
+	    END DO inner_loop
+!gnupl	    write(i_io1,1010)
+	  END DO outer_loop
+
+!---------- close file
+
+	  CLOSE(i_io1)
+
+	  RETURN
+ 1000	  FORMAT(e16.6)
+ 1010	  FORMAT(i8)
+!gnupl 1000	  FORMAT(e12.5)
+!gnupl 1010	  FORMAT(O012)
+ 1020	  FORMAT(a28,i4.4)
+	  END SUBROUTINE plot_gridded
+
+	END MODULE IO_griddedplot
diff --git a/flash2d/src/flash-sphere/IO_matlabplot.F90 b/flash2d/src/flash-sphere/IO_matlabplot.F90
new file mode 100644
index 0000000..2858f12
--- /dev/null
+++ b/flash2d/src/flash-sphere/IO_matlabplot.F90
@@ -0,0 +1,216 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	IO_matlabplot
+! FUNCTION:
+!	perform rendering into a matlab compatible file 
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	plot_matlab
+! FUNCTION:
+!	create output for visualization by matlab
+! SYNTAX:
+!	call plot_matlab(grid, int, int, char)
+! ON INPUT:
+!	p_handle:grid handle for the linked lists   (required)	type (grid_handle)
+!	i_time: time stamp for file naming          (optional)	integer
+!	c_attrib: plot attribute into element       (optional)	character
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!	the following attributes are supported:
+!	  'flag': plot flag of triangle
+!	  'levl': plot refinement level as color
+!	  'vals': plot values as color
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	plot_matlab
+! COMMENTS:
+!
+! USES:
+!	MISC_error, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!	this module is based on the original implementations in the
+!	splash/fe project (fortran 77 version), but wildly modified!
+! VERSION(S):
+!	1. original version		j. behrens	1/2000
+!	2. compliant to amatos 1.0	j. behrens	12/2000
+!	3. compliant to amatos 1.2	j. behrens	3/2002
+!       4. compliant to amatos 2.0      f. klaschka      8/2006
+!
+!*****************************************************************
+	MODULE IO_matlabplot
+	  USE GRID_api
+	  PRIVATE
+	  INTEGER, SAVE :: i_timecounter= 0
+	  PUBLIC :: plot_matlab
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE plot_matlab(p_handle, i_time, c_action)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)       :: p_handle
+	  INTEGER, OPTIONAL, INTENT(in)        :: i_time
+	  CHARACTER (len=4), OPTIONAL          :: c_action
+	  INTEGER                              :: i_io1, i_cnt, i_opt, i_tim, i_alct, i_enum
+	  INTEGER                              :: i_tcnt, i_fst, i_ftyp, i_unknow
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE  :: r_xytmp
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE  :: r_val
+	  INTEGER, DIMENSION(:,:), ALLOCATABLE :: i_edofs
+	  INTEGER, DIMENSION(:), ALLOCATABLE   :: i_val
+	  INTEGER, DIMENSION(1)                :: i_valpoint
+#ifdef _OPENMP
+	  INTEGER, DIMENSION(:), ALLOCATABLE   :: i_prc
+#endif
+	  REAL, PARAMETER                      :: r_1o3=(1./3.)
+	  REAL                                 :: r_tmp
+	  CHARACTER (len=32)                   :: c_matfile
+	  CHARACTER (len=28)                   :: c_tmp
+	  LOGICAL                              :: l_flag, l_levl, l_vals
+	  INTEGER                              :: i_dofnum
+
+!---------- file handling (open)
+
+	  IF(present(i_time)) THEN
+	    i_tcnt= i_time
+	    i_timecounter= i_timecounter+1
+	  ELSE
+	    i_tcnt= i_timecounter
+	    i_timecounter= i_timecounter+1
+	  END IF
+	  write(c_tmp,*) trim(GRID_parameters%program_name(1:23)), '_matlab.'
+	  write(c_matfile,1010) trim(c_tmp), i_tcnt
+	  c_matfile= adjustl(c_matfile)
+	  i_io1= 15
+	  OPEN(i_io1, file= c_matfile, form= 'formatted', iostat= i_fst)
+	  IF(i_fst /= 0) THEN
+	    RETURN
+	  END IF
+
+!---------- set time tag
+
+	  i_tim= p_handle%i_timetag
+	  i_enum= p_handle%i_enumfine
+
+!---------- check input for optional parameters
+
+	  l_flag= .FALSE.
+	  l_levl= .FALSE.
+	  l_vals= .FALSE.
+	  action_present: IF (present(c_action)) THEN
+	    flag: IF(c_action == 'flag') THEN
+	      l_flag= .TRUE.
+	      i_ftyp= 1
+	    END IF flag
+	    levl: IF(c_action == 'levl') THEN
+	      l_levl= .TRUE.
+	      i_ftyp= 1
+	    END IF levl
+	    vals: IF(c_action == 'vals') THEN
+	      l_vals= .TRUE.
+	      i_ftyp= grid_femvarquery(GRID_tracer)
+	      IF(i_ftyp /= 1) CALL grid_error(c_error='[plot_matlab]: invalid FEM type!')
+	    END IF vals
+	  END IF action_present
+	  CALL grid_femtypequery(i_ftyp, i_unknowns=i_unknow)
+	  i_dofnum= p_handle%i_unknowns(i_ftyp)
+	    
+!---------- allocate arrays and extract data
+
+	  i_valpoint= (/ GRID_tracer /)
+	  allocate(r_xytmp(GRID_dimension,i_dofnum), i_edofs(i_unknow,i_enum), stat=i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(c_error='[plot_matlab]: could not allocate aux. arrays r_xytmp...')
+	  END IF
+
+	  CALL grid_getinfo(p_handle, r_dofcoordinates= r_xytmp, &
+	                    i_femtype=i_ftyp, i_elementdofs=i_edofs)
+
+#ifdef _OPENMP
+	  allocate(i_prc(i_enum), stat=i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(c_error='[plot_matlab]: could not allocate aux. array i_prc')
+	  END IF
+
+	  CALL grid_getinfo(p_handle, l_finelevel=.TRUE., &
+	                    i_elementproc= i_prc)
+#endif
+
+	  IF(l_flag) THEN
+	    allocate(i_val(i_enum), stat=i_alct)
+	    IF(i_alct /= 0) THEN
+	      CALL grid_error(c_error='[plot_matlab]: could not allocate aux. array i_val')
+	    END IF
+	    CALL grid_getinfo(p_handle, l_finelevel=.TRUE., &
+	                      i_elementstatus= i_val)
+	  ELSE IF(l_levl) THEN
+	    allocate(i_val(i_enum), stat=i_alct)
+	    IF(i_alct /= 0) THEN
+	      CALL grid_error(c_error='[plot_matlab]: could not allocate aux. array i_val')
+	    END IF
+	    CALL grid_getinfo(p_handle, l_finelevel=.TRUE., &
+	                      i_elementlevel= i_val)
+	  ELSE IF(l_vals) THEN
+	    allocate(r_val(1,i_dofnum), stat=i_alct)
+	    IF(i_alct /= 0) THEN
+	      CALL grid_error(c_error='[plot_matlab]: could not allocate aux. array i_val')
+	    END IF
+	    CALL grid_getinfo(p_handle, i_arraypoint=i_valpoint, &
+	                      r_dofvalues= r_val)
+	  END IF
+
+!---------- print values
+
+	  poly_loop: DO i_cnt=1,i_enum
+	    IF(l_flag .OR. l_levl) THEN
+	      i_opt= i_val(i_cnt)
+	    ELSE IF (l_vals) THEN
+	      r_tmp= sum(r_val(1,i_edofs(:,i_enum)))
+	      r_tmp= r_tmp/ i_unknow
+	      i_opt= anint(r_tmp)
+	    ELSE
+	      i_opt= -99999
+	    END IF
+#ifdef _OPENMP
+	    write(i_io1,1000) r_xytmp(1,i_edofs(1,i_cnt)), r_xytmp(1,i_edofs(2,i_cnt)), r_xytmp(1,i_edofs(3,i_cnt)), &
+	                      r_xytmp(2,i_edofs(1,i_cnt)), r_xytmp(2,i_edofs(2,i_cnt)), r_xytmp(2,i_edofs(3,i_cnt)), &
+	                      i_opt, i_prc(i_cnt)
+#else
+	    write(i_io1,1000) r_xytmp(1,i_edofs(1,i_cnt)), r_xytmp(1,i_edofs(2,i_cnt)), r_xytmp(1,i_edofs(3,i_cnt)), &
+	                      r_xytmp(2,i_edofs(1,i_cnt)), r_xytmp(2,i_edofs(2,i_cnt)), r_xytmp(2,i_edofs(3,i_cnt)), &
+	                      i_opt
+#endif
+	  END DO poly_loop
+
+!---------- close file
+
+	  CLOSE(i_io1)
+#ifdef _OPENMP
+	  DEALLOCATE(i_prc)
+#endif
+	  DEALLOCATE(r_xytmp,i_edofs)
+	  IF(ALLOCATED(i_val)) DEALLOCATE(i_val)
+	  IF(ALLOCATED(r_val)) DEALLOCATE(r_val)
+
+	  RETURN
+#ifdef _OPENMP
+ 1000	  FORMAT(6f15.6,2i8)
+#else
+ 1000	  FORMAT(6f15.6,i8)
+#endif
+ 1010	  FORMAT(a28,i4.4)
+	  END SUBROUTINE plot_matlab
+
+
+	END MODULE IO_matlabplot
diff --git a/flash2d/src/flash-sphere/IO_netcdfplot.f90 b/flash2d/src/flash-sphere/IO_netcdfplot.f90
new file mode 100644
index 0000000..bbc02c1
--- /dev/null
+++ b/flash2d/src/flash-sphere/IO_netcdfplot.f90
@@ -0,0 +1,197 @@
+!*******************************************************************************
+!
+!> @file IO_netcdfplot.f90
+!> @brief contains module IO_netcdfplot
+!
+!*******************************************************************************
+!
+! REFERENCES:
+!   this module is based on the original implementations in the
+!   splash/fe project (fortran 77 version), but wildly modified!
+!
+! VERSION(S):
+!  1. original version                    j. behrens      01/2000
+!  2. compliant to amatos 1.0             j. behrens      12/2000
+!  3. compliant to amatos 1.2             j. behrens      03/2002
+!  3. compliant to amatos 2.0             j. behrens      07/2003
+!  4. rewritten to get more data          s. vater        05/2012
+!  5. rewritten to use IO_ncugrid module  s. vater        03/2014
+!
+!*******************************************************************************
+! MODULE DESCRIPTION:
+!> creates output in NetCDF file format
+!
+MODULE IO_netcdfplot
+  USE IO_ncugrid
+  USE FLASH_parameters
+  USE GRID_api
+
+  PRIVATE
+  PUBLIC :: plot_netcdf
+
+  CONTAINS
+!*******************************************************************************
+! DESCRIPTION of [SUBROUTINE plot_netcdf]:
+!> @brief creates output in netcdf file format
+!>
+!> @param[in]       p_ghand     grid handle for the linked lists
+!> @param[in]       i_time      time stamp for file naming (opt.)
+!
+  SUBROUTINE plot_netcdf(p_ghand, i_time)
+
+    IMPLICIT NONE
+
+!---------- local declarations
+
+    TYPE (grid_handle), INTENT(in)                              :: p_ghand
+    INTEGER, OPTIONAL, INTENT(in)                               :: i_time
+    INTEGER                                                     :: i_cnt, &
+      i_numelmt, i_numnode, i_alct, i_tcnt, i_dimvel, i_unkvel
+    INTEGER, SAVE                                               :: i_timecount = 0
+    CHARACTER (len=32)                                          :: c_file, c_mesh
+    CHARACTER (len=64)                                          :: c_title, c_tmp
+    REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_nodexy
+    REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE, TARGET  :: r_val, r_aux
+    INTEGER, DIMENSION(:,:), ALLOCATABLE                        :: i_elmtnodes, i_eltdofs
+    INTEGER (KIND = GRID_SI), PARAMETER                         :: i_vallen = 5
+    INTEGER (KIND = GRID_SI), DIMENSION(:), ALLOCATABLE, TARGET :: i_eltlev, i_eltsta
+    INTEGER (KIND = GRID_SI), DIMENSION(i_vallen)               :: i_valind
+    INTEGER (KIND = GRID_SI), DIMENSION(GRID_dimension)         :: i_valuv
+    INTEGER (KIND = GRID_SI)                                    :: i_fetyp
+    TYPE (ncugrid_vardatatype), DIMENSION(i_vallen+1)           :: p_vdataarr
+
+!---------- check input for optional parameter
+
+    IF(PRESENT(i_time)) THEN
+      i_tcnt = i_time
+    ELSE
+      i_tcnt = i_timecount
+    END IF
+    i_timecount = i_timecount + 1
+
+!---------- check for FEM types
+
+    i_fetyp = grid_femvarquery(1_GRID_SI)
+
+!---------- create the title
+
+    WRITE(c_title,*) 'netCDF output from ',TRIM(GRID_parameters%program_name)
+    c_title = ADJUSTL(c_title)
+
+!---------- create generic file name
+
+    c_mesh = 'Mesh2'
+
+    WRITE(c_file, '(A, A1, I4.4, A3)') TRIM(GRID_parameters%program_name), '_', i_tcnt, '.nc'
+
+!---------- get array with node coordinates, and variable values
+
+    i_numnode = p_ghand%i_nnumber
+    i_numelmt = p_ghand%i_enumfine
+    i_dimvel = GRID_femtypes%p_type(i_fetyp)%sig%i_unknowns
+    i_unkvel = p_ghand%i_unknowns(i_fetyp)
+
+    ALLOCATE(r_nodexy(GRID_dimension, i_numnode), &
+             i_elmtnodes(GRID_elementnodes, i_numelmt), i_eltdofs(i_dimvel, i_numelmt), &
+             r_val(i_vallen, i_unkvel), r_aux(i_vallen, i_numelmt), &
+             i_eltlev(i_numelmt), i_eltsta(i_numelmt), stat=i_alct)
+    IF (i_alct /= 0) CALL grid_error(c_error='[plot_netcdf]: could not allocate aux. arrays')
+
+    i_valind= (/GRID_ucomp, GRID_vcomp, GRID_phi, GRID_zeta, GRID_tracer/)
+
+    CALL grid_getinfo(p_ghand, l_finelevel=.TRUE., l_relative=.TRUE., &
+                      i_femtype=i_fetyp, i_arraypoint=i_valind, r_nodecoordinates=r_nodexy, &
+                      i_elementnodes=i_elmtnodes, r_dofvalues=r_val, i_elementdofs=i_eltdofs, &
+                      i_elementlevel=i_eltlev, i_elementstatus=i_eltsta)
+
+!---------- create the file for timestep data
+
+    CALL ncugrid_createmesh(c_file, c_mesh, i_numnode, i_numelmt, &
+                            i_elmtnodes, r_nodexy, c_title, TRIM(GRID_parameters%author_affil2), &
+                            c_contact=TRIM(GRID_parameters%author_email))
+
+!---------- define variables (data)
+
+    WRITE(c_tmp, '(A, A4)') TRIM(c_mesh), '_v_x'
+    p_vdataarr(1)%c_varname       = TRIM(c_tmp)
+    p_vdataarr(1)%c_long_name     = 'velocity in x-direction'
+    p_vdataarr(1)%c_standard_name = 'velocity_in_x_direction' ! not CF conform!
+    p_vdataarr(1)%c_units         = 'm/s'
+    p_vdataarr(1)%c_location      = 'node'
+    p_vdataarr(1)%i_datatype      = 1
+
+    WRITE(c_tmp, '(A, A4)') TRIM(c_mesh), '_v_y'
+    p_vdataarr(2)%c_varname       = TRIM(c_tmp)
+    p_vdataarr(2)%c_long_name     = 'velocity in y-direction'
+    p_vdataarr(2)%c_standard_name = 'velocity_in_y_direction' ! not CF conform!
+    p_vdataarr(2)%c_units         = 'm/s'
+    p_vdataarr(2)%c_location      = 'node'
+    p_vdataarr(2)%i_datatype      = 1
+
+    WRITE(c_tmp, '(A, A4)') TRIM(c_mesh), '_phi'
+    p_vdataarr(3)%c_varname       = TRIM(c_tmp)
+    p_vdataarr(3)%c_long_name     = 'geopotential height (arbitrary variable)'
+    p_vdataarr(3)%c_standard_name = 'geopotential_height' ! not CF conform!
+    p_vdataarr(3)%c_units         = 'none'
+    p_vdataarr(3)%c_location      = 'node'
+    p_vdataarr(3)%i_datatype      = 1
+
+    WRITE(c_tmp, '(A, A5)') TRIM(c_mesh), '_zeta'
+    p_vdataarr(4)%c_varname       = TRIM(c_tmp)
+    p_vdataarr(4)%c_long_name     = 'vorticity (arbitrary variable)'
+    p_vdataarr(4)%c_standard_name = 'absolute_vorticity' ! not CF conform!
+    p_vdataarr(4)%c_units         = 'none'
+    p_vdataarr(4)%c_location      = 'node'
+    p_vdataarr(4)%i_datatype      = 1
+
+    WRITE(c_tmp, '(A, A7)') TRIM(c_mesh), '_tracer'
+    p_vdataarr(5)%c_varname       = TRIM(c_tmp)
+    p_vdataarr(5)%c_long_name     = 'tracer density distribution'
+    p_vdataarr(5)%c_standard_name = 'tracer_density' ! not CF conform!
+    p_vdataarr(5)%c_units         = 'none'
+    p_vdataarr(5)%c_location      = 'node'
+    p_vdataarr(5)%i_datatype      = 1
+
+    WRITE(c_tmp, '(A, A6)') TRIM(c_mesh), '_level'
+    p_vdataarr(6)%c_varname       = TRIM(c_tmp)
+    p_vdataarr(6)%c_long_name     = 'grid level'
+    p_vdataarr(6)%c_standard_name = 'grid_level' ! not CF conform!
+    p_vdataarr(6)%c_units         = 'none'
+    p_vdataarr(6)%c_location      = 'face'
+    p_vdataarr(6)%i_datatype      = 0
+!
+!!---------- average over each cell and write into netCDF file
+!
+!    DO i_cnt=1,i_numelmt
+!      r_aux(1, i_cnt) = SUM(r_val(1, i_eltdofs(:, i_cnt))) / REAL(i_dimvel, GRID_SR)
+!      r_aux(2, i_cnt) = SUM(r_val(2, i_eltdofs(:, i_cnt))) / REAL(i_dimvel, GRID_SR)
+!      r_aux(3, i_cnt) = SUM(r_val(3, i_eltdofs(:, i_cnt))) / REAL(i_dimvel, GRID_SR)
+!      r_aux(4, i_cnt) = SUM(r_val(4, i_eltdofs(:, i_cnt))) / REAL(i_dimvel, GRID_SR)
+!    END DO
+
+!---------- write the nodal grid data
+
+    p_vdataarr(1)%p_rvardata => r_val(1,:)
+    p_vdataarr(2)%p_rvardata => r_val(2,:)
+    p_vdataarr(3)%p_rvardata => r_val(3,:)
+    p_vdataarr(4)%p_rvardata => r_val(4,:)
+    p_vdataarr(5)%p_rvardata => r_val(5,:)
+    p_vdataarr(6)%p_ivardata => i_eltlev
+
+!--- write variables
+
+    CALL ncugrid_putvariablearray(c_file, c_mesh, p_vdataarr, REAL(i_tcnt, GRID_SR))
+
+!--- deallocate data arrays
+
+    DO i_cnt=1,SIZE(p_vdataarr)
+      NULLIFY(p_vdataarr(i_cnt)%p_ivardata)
+      NULLIFY(p_vdataarr(i_cnt)%p_rvardata)
+    END DO
+    DEALLOCATE(r_nodexy, i_elmtnodes, r_val, r_aux, i_eltdofs, &
+               i_eltlev, i_eltsta)
+
+  END SUBROUTINE plot_netcdf
+
+!*******************************************************************************
+END MODULE IO_netcdfplot
diff --git a/flash2d/src/flash-sphere/IO_plotdefine.f90 b/flash2d/src/flash-sphere/IO_plotdefine.f90
new file mode 100644
index 0000000..214b441
--- /dev/null
+++ b/flash2d/src/flash-sphere/IO_plotdefine.f90
@@ -0,0 +1,40 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	IO_plotdefine
+! FUNCTION:
+!	define common variables for the plotting routines
+! CONTAINS:
+!
+! PUBLIC:
+!
+! COMMENTS:
+!
+! USES:
+!
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version	j. behrens	9/96
+!	2. added tracergrid	j. behrens	12/97
+!
+!*****************************************************************
+	MODULE IO_plotdefine
+
+!---------- some common definitions
+
+	  INTEGER, PARAMETER              :: i_plotuplain=     1  ! plot u as scalar field
+	  INTEGER, PARAMETER              :: i_plotvplain=     2  ! plot v as scalar field
+	  INTEGER, PARAMETER              :: i_plotphiplain=   3  ! plot phi as scalar
+	  INTEGER, PARAMETER              :: i_plotugrid =     4  ! plot u as scalar field
+	  INTEGER, PARAMETER              :: i_plotvgrid =     5  ! plot v as scalar field
+	  INTEGER, PARAMETER              :: i_plotphigrid=    6  ! plot phi as scalar
+	  INTEGER, PARAMETER              :: i_plotgrid=       7  ! plot grid
+	  INTEGER, PARAMETER              :: i_plotuvvector=   8  ! plot (u,v)-vectors
+	  INTEGER, PARAMETER              :: i_plotvorticity=  9  ! plot vorticity as scalar
+	  INTEGER, PARAMETER              :: i_plottracer=     10 ! plot tracer as scalar
+	  INTEGER, PARAMETER              :: i_plottracergrid= 11 ! plot tracer plus grid
+
+	END MODULE IO_plotdefine
diff --git a/flash2d/src/flash-sphere/IO_utils.f90 b/flash2d/src/flash-sphere/IO_utils.f90
new file mode 100644
index 0000000..96a6d6c
--- /dev/null
+++ b/flash2d/src/flash-sphere/IO_utils.f90
@@ -0,0 +1,1064 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	IO_utils
+! FUNCTION:
+!	input/output routines (io_get...something, io_put...something)
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	io_getcmdline
+! FUNCTION:
+!	read options from command line
+! SYNTAX:
+!	call io_getcmdline(param)
+! ON INPUT:
+!
+! ON OUTPUT:
+!	p_param: control parameters			TYPE(control_struct)
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	io_getinterinput
+! FUNCTION:
+!	get user input interactively
+! SYNTAX:
+!	call io_getinterinput(param)
+! ON INPUT:
+!
+! ON OUTPUT:
+!	p_param: control parameters			TYPE(control_struct)
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	io_getbatchinput
+! FUNCTION:
+!	read user input from file
+! SYNTAX:
+!	call io_getbatchinput(param)
+! ON INPUT:
+!
+! ON OUTPUT:
+!	p_param: control parameters			TYPE(control_struct)
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	io_putparameters
+! FUNCTION:
+!	write out parameters in a nice way
+! SYNTAX:
+!	call io_putparameters(param)
+! ON INPUT:
+!	p_param: data structure containing parameters	TYPE(control_struct)
+! ON OUTPUT:
+!	
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	io_putruntimeinfo
+! FUNCTION:
+!	print some information on the current run time status
+! SYNTAX:
+!	call io_putruntimeinfo(grid, info)
+! ON INPUT:
+!	p_ghand: grid handle for no. of elements...	TYPE(grid_handle)
+!	p_info:  structure containing other info	TYPE(rt_info)
+! ON OUTPUT:
+!	p_info:  structure reseted			TYPE(rt_info)
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	io_putinputfile
+! FUNCTION:
+!	print an input file conforming to io_getbatchinput
+! SYNTAX:
+!	call io_putinputfile(param)
+! ON INPUT:
+!	p_param: global parameter data structure	TYPE(control_struct)
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	io_getcmdline, io_getinterinput, io_getbatchinput,
+!	io_putparameters, io_putruntimeinfo, io_putinputfile
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, MISC_timing, IO_plotdefine,
+!	FEM_handle
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version			j. behrens	7/96
+!	2. largely extended			j. behrens	11/96
+!	3. changed command line io		j. behrens	1/97
+!	4. changed runtime output (adaptations)	j. behrens	1/97
+!	5. control data struct, less command io	j. behrens	12/97
+!	6. tiff file plotting included		j. behrens	1/98
+!	7. adapted to BJuGL			j. behrens	1/2000
+!	8. compliant to amatos 1.0		j. behrens	12/2000
+!	3. compliant to amatos 1.2		j. behrens	3/2002
+!
+!*****************************************************************
+	MODULE IO_utils
+      USE FLASH_metadata
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE MISC_system
+	  USE GRID_api
+	  PRIVATE
+	  INTEGER, PARAMETER :: i_ioerr=0
+	  PUBLIC :: io_getcmdline, io_getinterinput, io_getbatchinput, &
+	    io_putparameters, io_putruntimeinfo, io_putinputfile, io_initparams
+	  CONTAINS
+!*****************************************************************
+	SUBROUTINE io_getcmdline(p_cmd)
+
+!---------- local declarations
+
+	IMPLICIT NONE
+
+	TYPE (control_struct), INTENT(out) :: p_cmd
+
+	LOGICAL                            :: l_ict
+	LOGICAL                            :: l_bat
+	LOGICAL                            :: l_mtl
+	LOGICAL                            :: l_dia
+	CHARACTER (len=io_fillen)          :: a_infln
+	CHARACTER (len=io_fillen)          :: a_outfln
+	INTEGER                            :: numargs
+	INTEGER                            :: i= 1
+	INTEGER                            :: i_fst
+	LOGICAL                            :: help= .true.
+	LOGICAL                            :: shoversion= .false.
+	CHARACTER (len=2)                  :: option
+	CHARACTER (len=15)                 :: comdnam
+	CHARACTER (len=io_fillen)          :: c_dummy
+
+!---------- initialize output variables
+
+	a_infln = adjustl(trim('Parameters.in'))
+	a_outfln= adjustl(trim('./'))
+	l_ict= .false.
+        l_bat= .false.
+	l_mtl= .false.
+	l_dia= .false.
+
+!---------- read number commandline arguments
+!           this is possibly non standard f90, but definitely quasi standard
+
+	numargs= sys_numcmdargs()
+	CALL sys_getcmdargs(0,c_dummy,i_len=len(c_dummy))
+	comdnam= c_dummy(1:15)
+	check_args: IF(numargs < 1) THEN
+	  GOTO 100 ! print_help
+	ELSE check_args
+
+!---------- read command line arguments one by one
+
+	  DO WHILE (i <= numargs)
+	    CALL sys_getcmdargs(i,c_dummy,i_len=len(c_dummy))
+	    option= c_dummy(1:2)
+
+!---------- select the CASEs for command line options
+
+	    eval_option: SELECT CASE (option)
+	      CASE('-h') eval_option !--- request for help ---
+	        help= .true.
+	        i= i+1
+	      CASE('-?') eval_option !--- request for help ---
+	        help= .true.
+	        i= i+1
+	      CASE('-r') eval_option !--- print release information ---
+	        shoversion= .true.
+	        i= i+1
+! 	      CASE('-i') eval_option !--- select interactive input mode ---
+! 	        help= .false.
+! 	        l_ict= .true.
+! 	        i= i+1
+! 	      CASE('-d') eval_option !--- switch on diagnostics ---
+! 	        help= .false.
+! 	        l_dia= .true.
+! 	        i= i+1
+	      CASE('-l') eval_option !--- switch on logging ---
+	        help= .false.
+	        p_cmd%cmd%l_logging= .true.
+	        i= i+1
+	      CASE('-o') eval_option !--- redirect output into file ---
+	        help= .false.
+	        p_cmd%cmd%l_output= .true.
+	        i= i+1
+! 	      CASE('-b') eval_option !--- select batch input mode ---
+! 	        help= .false.
+! 	        l_bat= .true.
+! 	        IF(a_infln == 'xxxxxxxxxxxxxxxxxxxx') &
+! 	          a_infln= 'Parameters.in' !--- default input file name ---
+! 	        i= i+1
+	      CASE('-f') eval_option !--- supply input file name ---
+	        help= .false.
+	        i= i+1
+	        CALL sys_getcmdargs(i,c_dummy,i_len=len(c_dummy))
+	        a_infln= c_dummy(1:io_fillen)
+	        IF(a_infln(1:1) == '-') THEN  !--- check correctnes of file name ---
+	          help= .true.
+	          GOTO 100 ! print_help
+	        ELSE
+	          i= i+1
+	        END IF
+	      CASE('-d') eval_option !--- directory path in which to find and write data ---
+	        help= .false.
+	        i= i+1
+	        CALL sys_getcmdargs(i,c_dummy,i_len=len(c_dummy))
+	        a_outfln= c_dummy(1:io_fillen)
+	        IF(a_outfln(1:1) == '-') THEN  !--- check correctnes of file name ---
+	          help= .true.
+	          GOTO 100 ! print_help
+	        ELSE
+	          i= i+1
+	        END IF
+	      CASE DEFAULT eval_option !--- default CASE: show help ---
+	        help= .true.
+	        GOTO 100 ! print_help
+	    END SELECT eval_option
+	  END DO
+	END IF check_args
+
+!---------- update output structure
+
+	p_cmd%cmd%c_infile = a_infln
+	p_cmd%cmd%c_directory = a_outfln
+! 	p_cmd%cmd%l_interactive= l_ict
+! 	p_cmd%cmd%l_diagnostics= l_dia
+!         p_cmd%cmd%l_batchmode= l_bat
+
+!---------- print help information
+
+ 100	print_help: IF(help) THEN
+	  IF(shoversion) THEN
+	    write(GRID_parameters%ioout,1001) GRID_parameters%program_name, GRID_parameters%version, GRID_parameters%subversion, &
+	                        GRID_parameters%patchversion, GRID_parameters%datemonth, GRID_parameters%dateyear, &
+	                        GRID_parameters%author_name, GRID_parameters%author_email, GRID_parameters%author_affil1, &
+	                        GRID_parameters%author_affil2, GRID_parameters%author_affil3
+	    write(GRID_parameters%ioout,1002) comdnam
+	    write(i_ioerr,*) 'STOPPED ... this is all I can say'
+	    STOP
+	  ELSE
+	    write(GRID_parameters%ioout,1010) comdnam
+	    write(GRID_parameters%ioout,1011) GRID_parameters%author_name
+	    write(i_ioerr,*) 'STOPPED ... hope this made it clear'
+	    STOP
+	  END IF
+	END IF print_help
+
+!---------- print version information
+
+	print_version: IF(shoversion) THEN
+	  write(GRID_parameters%ioout,1001) GRID_parameters%program_name, GRID_parameters%version, GRID_parameters%subversion, &
+	                        GRID_parameters%patchversion, GRID_parameters%datemonth, GRID_parameters%dateyear, &
+	                        GRID_parameters%author_name, GRID_parameters%author_email, GRID_parameters%author_affil1, &
+	                        GRID_parameters%author_affil2, GRID_parameters%author_affil3
+	  IF(GRID_parameters%iolog > 0) &
+	    write(GRID_parameters%iolog,1001) GRID_parameters%program_name, GRID_parameters%version, GRID_parameters%subversion, &
+	                        GRID_parameters%patchversion, GRID_parameters%datemonth, GRID_parameters%dateyear, &
+	                        GRID_parameters%author_name, GRID_parameters%author_email, GRID_parameters%author_affil1, &
+	                        GRID_parameters%author_affil2, GRID_parameters%author_affil3
+	END IF print_version
+
+	RETURN
+
+ 1001	FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/ &
+	       1x,'***** PROGRAM: ',a15,24x,'*****',/ &
+	       1x,'***** VERSION: ',i2.2,'.',i2.2,'.',i2.2,31x,'*****',/ &
+	       1x,'***** DATE:    ',i2.2,'/',i4.4,32x,'*****',/ &
+	       1x,'***** AUTHOR:  ',a12,27x,'*****',/ &
+	       1x,'***** E-MAIL:  ',a39,'*****',/ &
+	       1x,'***** ADDRESS: ',a39,'*****',/ &
+	       1x,'*****          ',a39,'*****',/ &
+	       1x,'*****          ',a39,'*****',/ &
+	       1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****')
+ 1002	FORMAT(1x,'***** TYPE ',a15,' -h, to get help',12x,'*****',/ &
+	       1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****')
+ 1010	FORMAT(1x,'USAGE: ',a15,' {-d dir} {-f file} {-h} {-l} {-o} {-r}',/ &
+	       1x,'       -d: determine input/output file directory path << dir >>, default ./',/ &
+	       1x,'       -f: input filename is << name >>, default Parameters.in',/ &
+	       1x,'       -h: help information (this output)',/ &
+	       1x,'       -l: switch on log file output',/ &
+	       1x,'       -o: redirect standard output to a file',/ &
+	       1x,'       -r: release information')
+ 1011	FORMAT(1x,'Copyright (c) 2016',a13)
+	END SUBROUTINE io_getcmdline
+!*****************************************************************
+	SUBROUTINE io_initparams(p_param)
+	
+!---------- local declarations
+
+	IMPLICIT NONE
+
+	TYPE (control_struct), INTENT(out) :: p_param
+	INTEGER                            :: i_maxsize, i_alct
+
+!---------- initialize
+
+	p_param%num%r_deltatime     = -1.0
+	p_param%num%r_reftolerance  = -1.0
+	p_param%num%r_crstolerance  = -1.0
+	p_param%num%r_refwatermark  = -1.0
+	p_param%num%r_crswatermark  = -1.0
+	p_param%num%i_experiment    = -1
+	p_param%num%i_crslevel      = -1
+	p_param%num%i_reflevel      = -1
+	p_param%num%i_frsttimestep  = -1
+	p_param%num%i_lasttimestep  = -1
+    p_param%num%r_starttime     = -1.0
+    p_param%num%r_finaltime     = -1.0
+	p_param%num%i_adviterations = -1
+	p_param%io%i_plotoffset     = -1
+	p_param%io%i_saveoffset     = -1
+	p_param%io%i_savelast       = -1
+	p_param%io%l_diagnostics    = .FALSE.
+	p_param%io%l_vtu            = .FALSE.
+	p_param%io%l_netcdf         = .FALSE.
+	p_param%io%c_domainfile     = 'Domain.dat'
+	p_param%io%c_triangfile     = 'Triang.dat'
+
+!---------- allocate from meta data structure
+
+    log_init: IF(l_logused) THEN
+      ALLOCATE(p_param%phy%phy_log(i_lognum), stat=i_alct)
+      IF(i_alct /= 0) CALL grid_error(c_error='[io_initparams]: could not allocate log pointers')
+    END IF log_init
+
+    char_init: IF(l_charused) THEN
+      ALLOCATE(p_param%phy%phy_char(i_charnum), stat=i_alct)
+      IF(i_alct /= 0) CALL grid_error(c_error='[io_initparams]: could not allocate char pointers')
+    END IF char_init
+
+    int_init: IF(l_intused) THEN
+      i_maxsize= maxval(i_intsizes)
+      ALLOCATE(p_param%phy%phy_int(i_maxsize,i_intnum), stat=i_alct)
+      IF(i_alct /= 0) CALL grid_error(c_error='[io_initparams]: could not allocate int pointers')
+    END IF int_init
+
+    real_init: IF(l_realused) THEN
+      i_maxsize= maxval(i_realsizes)
+      ALLOCATE(p_param%phy%phy_real(i_maxsize,i_realnum), stat=i_alct)
+      IF(i_alct /= 0) CALL grid_error(c_error='[io_initparams]: could not allocate real pointers')
+    END IF real_init
+
+	END SUBROUTINE io_initparams
+! *****************************************************************
+! 	SUBROUTINE io_getinterinput(p_param)
+! 
+! ---------- local declarations
+! 
+! 	IMPLICIT NONE
+! 
+! 	TYPE (control_struct), INTENT(out) :: p_param
+! 	INTEGER                            :: i_iost, i_tmp, i_cln
+! 	CHARACTER (len=io_fillen)          :: c_tmp
+! 
+! ---------- initialize
+! 
+! 	CALL io_initparams(p_param)
+! 	i_cln= MAX(GRID_parameters%i_stringlength,io_fillen)
+! 
+! ---------- prompt user for input (loop in case of wrong input)
+!         
+! 	write(GRID_parameters%ioout,1000) GRID_parameters%program_name, GRID_parameters%version, &
+! 	                    GRID_parameters%subversion, GRID_parameters%patchversion
+! 
+! ---------- Experiment Control
+! 
+! 	write(GRID_parameters%ioout,1001)
+! 	write(GRID_parameters%ioout,1010)
+! 	write(GRID_parameters%ioout,1011,advance='NO')
+! 	read(*,*) p_param%phy%i_experiment
+! 
+! ---------- Adaptivity Control
+! 
+! 	write(GRID_parameters%ioout,1001)
+! 	write(GRID_parameters%ioout,1020)
+! 	write(GRID_parameters%ioout,1021,advance='NO')
+! 	read(*,*) p_param%phy%i_reflevel
+! 	write(GRID_parameters%ioout,1022,advance='NO')
+! 	read(*,*) p_param%phy%i_crslevel
+! 	write(GRID_parameters%ioout,1023,advance='NO')
+! 	read(*,*) p_param%phy%r_reftolerance
+! 	write(GRID_parameters%ioout,1024,advance='NO')
+! 	read(*,*) p_param%phy%r_crstolerance
+! 	write(GRID_parameters%ioout,1025,advance='NO')
+! 	read(*,*) p_param%phy%r_refwatermark
+! 	write(GRID_parameters%ioout,1026,advance='NO')
+! 	read(*,*) p_param%phy%r_crswatermark
+! 
+! ---------- Time Step Control
+! 
+! 	write(GRID_parameters%ioout,1001)
+! 	write(GRID_parameters%ioout,1030)
+! 	write(GRID_parameters%ioout,1031,advance='NO')
+! 	read(*,*) p_param%phy%r_deltatime
+! 	write(GRID_parameters%ioout,1032,advance='NO')
+! 	read(*,*) p_param%phy%i_frsttimestep
+! 	write(GRID_parameters%ioout,1033,advance='NO')
+! 	read(*,*) p_param%phy%i_lasttimestep
+! 
+! ---------- Output Control
+! 
+! 	write(GRID_parameters%ioout,1001)
+! 	write(GRID_parameters%ioout,1040)
+! 	write(GRID_parameters%ioout,1041,advance='NO')
+! 	read(*,*) p_param%io%i_saveoffset
+! 	write(GRID_parameters%ioout,1043,advance='NO')
+! 	read(*,*) p_param%io%i_savelast
+! 	write(GRID_parameters%ioout,1042,advance='NO')
+! 	read(*,*) p_param%io%i_plotoffset
+! 	write(GRID_parameters%ioout,1049,advance='NO')
+! 	read(*,*) i_tmp
+! 	IF(i_tmp /= 0) THEN
+! 	  p_param%io%l_matlab= .True.
+! 	END IF
+! 	write(GRID_parameters%ioout,10491,advance='NO')
+! 	read(*,*) i_tmp
+! 	IF(i_tmp /= 0) THEN
+! 	  p_param%io%l_gmv= .True.
+! 	END IF
+!         -- BEGIN added for visnetplot [flo]
+! 	write(GRID_parameters%ioout,10492,advance='NO')
+! 	read(*,*) i_tmp
+! 	IF(i_tmp /= 0) THEN
+! 	  p_param%io%l_visnet= .True.
+! 	END IF
+! 	write(GRID_parameters%ioout,10493,advance='NO')
+! 	read(*,*) i_tmp
+! 	IF(i_tmp /= 0) THEN
+! 	  p_param%io%l_visnet_tiff= .True.
+! 	END IF
+!         -- END
+! 	write(GRID_parameters%ioout,1047,advance='NO')
+! 	read(*,2000,iostat=i_iost) c_tmp
+! 	IF(i_iost == 0) THEN
+! 	  p_param%io%c_triangfile(1:i_cln)= c_tmp(1:i_cln)
+! 	END IF
+! 
+! ---------- Iteration Control
+! 
+! 	write(GRID_parameters%ioout,1001)
+! 	write(GRID_parameters%ioout,1050)
+! 	write(GRID_parameters%ioout,1051,advance='NO')
+! 	read(*,*) p_param%phy%i_adviterations
+! 	write(GRID_parameters%ioout,1002)
+! 
+! ---------- error handling
+! 
+! 	no_value: IF((p_param%phy%r_deltatime     < 0.0) .OR. &
+! 	             (p_param%phy%r_reftolerance  < 0.0) .OR. &
+! 	             (p_param%phy%r_crstolerance  < 0.0) .OR. &
+! 	             (p_param%phy%r_refwatermark  < 0.0) .OR. &
+! 	             (p_param%phy%r_crswatermark  < 0.0) .OR. &
+! 	             (p_param%phy%i_experiment    < 0)   .OR. &
+! 	             (p_param%phy%i_crslevel      < 0)   .OR. &
+! 	             (p_param%phy%i_reflevel      < 0)   .OR. &
+! 	             (p_param%phy%i_frsttimestep  < 0)   .OR. &
+! 	             (p_param%phy%i_lasttimestep  < 0)   .OR. &
+! 	             (p_param%io%i_plotoffset     < 0)   .OR. &
+! 	             (p_param%io%i_saveoffset     < 0)   .OR. &
+! 	             (p_param%phy%i_adviterations < 0)) THEN
+! 	  CALL grid_error(20)
+! 	END IF no_value
+! 	RETURN
+! 
+!  1000	FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/ &
+! 	       1x,'***** PROGRAM: ',a15,24x,'*****',/ &
+! 	       1x,'***** VERSION: ',i2.2,'.',i2.2,'.',i2.2,31x,'*****',/ &
+! 	       1x,'*****          Started in INTERACTIVE input mode      *****',/ &
+! 	       1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/)
+!  1001	FORMAT(1x,'-----------------------------------------------------------',/)
+!  1002	FORMAT(1x,'---------------------- end of input -----------------------',/)
+!  1010	FORMAT(1x,'                        Experiment')
+!  1020	FORMAT(1x,'                    Adaptivity Control')
+!  1030	FORMAT(1x,'                     Timestep Control')
+!  1040	FORMAT(1x,'                   Input/Output Control')
+!  1050	FORMAT(1x,'                    Iteration Control')
+!  1011	FORMAT(1x,'INPUT: Experiment No. (first exp. = 0)              > ')
+!  1021	FORMAT(1x,'INPUT: Finest level of refinement                   > ')
+!  1022	FORMAT(1x,'INPUT: Coarsest level of refinement                 > ')
+!  1023	FORMAT(1x,'INPUT: Tolerance for refinement (|t_r| < 1)         > ')
+!  1024	FORMAT(1x,'INPUT: Tolerance for Coarsening (t_c < t_r)         > ')
+!  1025	FORMAT(1x,'INPUT: Watermark for refinement (|w_r| < 1)         > ')
+!  1026	FORMAT(1x,'INPUT: Watermark for coarsening (|w_c| < 1)         > ')
+!  1031	FORMAT(1x,'INPUT: Timestep length (delta t)                    > ')
+!  1032	FORMAT(1x,'INPUT: First timestep number                        > ')
+!  1033	FORMAT(1x,'INPUT: Last timestep number                         > ')
+!  1041	FORMAT(1x,'INPUT: Number of timesteps between saves            > ')
+!  1042	FORMAT(1x,'INPUT: Number of timesteps between plots            > ')
+!  1043	FORMAT(1x,'INPUT: Save last step for next experiment (no = 0)  > ')
+!  1045	FORMAT(1x,'INPUT: Plot polygonal outline (no = 0)              > ')
+!  10451	FORMAT(1x,'INPUT: Filename for polygon data    (Polyline.dat)  > ')
+!  1046	FORMAT(1x,'INPUT: Read wind data from file (no = 0)            > ')
+!  10461	FORMAT(1x,'INPUT: Filename for wind data       (Flow.dat)      > ')
+!  1047	FORMAT(1x,'INPUT: Filename for triangulation   (Triang.dat)    > ')
+!  1049	FORMAT(1x,'INPUT: Write matlab compatible output file (no = 0) > ')
+!  10491	FORMAT(1x,'INPUT: Write gmv compatible output file (no = 0)    > ')
+!  -- BEGIN added for visnetplot [flo]:
+!  10492  FORMAT(1x,'INPUT: Plot to visnet window (no = 0)               > ')
+!  10493 FORMAT(1x,'INPUT: Make visnet screenshots (no = 0)             > ')
+!  -- END
+!  1051	FORMAT(1x,'INPUT: Iterations in trajectory estimation          > ')
+! 
+!  2000	FORMAT(a32)
+! 
+! 	END SUBROUTINE io_getinterinput
+!*****************************************************************
+	SUBROUTINE io_getbatchinput(p_param)
+
+!---------- local declarations
+
+	IMPLICIT NONE
+
+	TYPE (control_struct), INTENT(out)         :: p_param
+	INTEGER, PARAMETER                         :: i_iofil= 10
+	CHARACTER (len=80)                         :: a_filrow
+	CHARACTER (LEN=GRID_parameters%i_stringlength) :: c_tmp
+	INTEGER                                    :: i_iost, i_ioend, &
+	  i_tmp, i_cln, i_cnt, i_len
+	CHARACTER (LEN=2*io_fillen)                :: c_inputfile, ctest
+!	CHARACTER (LEN=io_fillen)                :: c_inputfile
+	INTEGER, PARAMETER                         :: i_filstrlen=2*io_fillen
+
+!---------- initialize
+
+	i_cln= MIN(GRID_parameters%i_stringlength,io_fillen)
+	i_iost= 0
+
+!---------- input file
+
+    WRITE(c_inputfile,*) trim(p_param%cmd%c_directory),p_param%cmd%c_infile
+    c_inputfile= adjustl(trim(c_inputfile))
+
+!---------- open input file
+
+	OPEN(unit= i_iofil, file= c_inputfile, status= 'OLD', action= 'READ', iostat= i_iost)
+	file_notopen: IF(i_iost /= 0) THEN
+	  WRITE(i_ioerr,*) 'ERROR: Filename: ', c_inputfile
+	  IF(GRID_parameters%iolog > 0) &
+	    WRITE(GRID_parameters%iolog,*) 'ERROR: Filename: ', c_inputfile
+	  CALL grid_error(c_error='[io_getbatchinput]: Could not open parameters file')
+	ELSE file_notopen
+	  WRITE(GRID_parameters%ioout,1000) GRID_parameters%program_name, GRID_parameters%version, GRID_parameters%subversion, &
+	                      GRID_parameters%patchversion, c_inputfile
+	  IF(GRID_parameters%iolog > 0) THEN
+	    WRITE(GRID_parameters%iolog,*) 'INFO: Filename: ', c_inputfile, ' opened on unit: ', i_iofil
+	    WRITE(GRID_parameters%iolog,1000) GRID_parameters%program_name, GRID_parameters%version, GRID_parameters%subversion, &
+	                        GRID_parameters%patchversion, c_inputfile
+	  END IF
+	END IF file_notopen
+
+!---------- read line by line
+
+	read_loop: DO
+	  READ(i_iofil,2000,iostat=i_ioend) a_filrow
+
+!---------- if file ended
+
+	  file_end: IF(i_ioend /= 0) THEN
+	    CLOSE(i_iofil)
+	    IF(GRID_parameters%iolog > 0) &
+	      WRITE(GRID_parameters%iolog,*) 'INFO: Closed file on unit: ', i_iofil
+	    EXIT
+	  ELSE file_end
+
+!---------- decide what to DO with line according to first character
+
+	    comment_line: IF(a_filrow(1:1) == '#' .or. a_filrow(1:1) == '!') THEN
+	      CYCLE read_loop
+	    ELSE IF(a_filrow(1:14) == 'EXPERIMENT_NUM') THEN comment_line
+	      read(i_iofil,*) p_param%num%i_experiment
+	    ELSE IF(a_filrow(1:14) == 'FINE_GRID_LEVE') THEN comment_line
+	      read(i_iofil,*) p_param%num%i_reflevel
+	    ELSE IF(a_filrow(1:14) == 'COARSE_GRID_LE') THEN comment_line
+	      read(i_iofil,*) p_param%num%i_crslevel
+	    ELSE IF(a_filrow(1:14) == 'TOLERANCE_OF_R') THEN comment_line
+	      read(i_iofil,*) p_param%num%r_reftolerance
+	    ELSE IF(a_filrow(1:14) == 'TOLERANCE_OF_C') THEN comment_line
+	      read(i_iofil,*) p_param%num%r_crstolerance
+	    ELSE IF(a_filrow(1:14) == 'WATERMARK_OF_R') THEN comment_line
+	      read(i_iofil,*) p_param%num%r_refwatermark
+	    ELSE IF(a_filrow(1:14) == 'WATERMARK_OF_C') THEN comment_line
+	      read(i_iofil,*) p_param%num%r_crswatermark
+	    ELSE IF(a_filrow(1:14) == 'TIMESTEP_LENGT') THEN comment_line
+	      read(i_iofil,*) p_param%num%r_deltatime
+	    ELSE IF(a_filrow(1:14) == 'BEGINNING_TIME') THEN comment_line
+	      read(i_iofil,*) p_param%num%i_frsttimestep
+	    ELSE IF(a_filrow(1:14) == 'FINISHING_TIME') THEN comment_line
+	      read(i_iofil,*) p_param%num%i_lasttimestep
+        ELSE IF(a_filrow(1:14) == 'TIMESTEPPING_S') THEN comment_line
+          read(i_iofil,*) p_param%num%r_starttime
+        ELSE IF(a_filrow(1:14) == 'TIMESTEPPING_E') THEN comment_line
+          read(i_iofil,*) p_param%num%r_finaltime
+	    ELSE IF(a_filrow(1:14) == 'SLM_ITERATION_') THEN comment_line
+	      read(i_iofil,*) p_param%num%i_adviterations
+	    ELSE IF(a_filrow(1:14) == 'STEPS_BTW_PLOT') THEN comment_line
+	      read(i_iofil,*) p_param%io%i_plotoffset
+	    ELSE IF(a_filrow(1:14) == 'SWITCH_ON_DIAG') THEN comment_line
+	      read(i_iofil,*) i_tmp
+	      IF(i_tmp /= 0) p_param%io%l_diagnostics= .TRUE.
+	    ELSE IF(a_filrow(1:14) == 'NETCDF_FILE_PL') THEN comment_line
+	      read(i_iofil,*) i_tmp
+	      IF(i_tmp /= 0) p_param%io%l_netcdf= .TRUE.
+	    ELSE IF(a_filrow(1:14) == 'VTU_FILE_PLOTT') THEN comment_line
+	      read(i_iofil,*) i_tmp
+	      IF(i_tmp /= 0) p_param%io%l_vtu= .TRUE.
+	    ELSE IF(a_filrow(1:14) == 'STEPS_BTW_SAVE') THEN comment_line
+	      read(i_iofil,*) p_param%io%i_saveoffset
+	    ELSE IF(a_filrow(1:14) == 'SAVE_FINISH_CO') THEN comment_line
+	      read(i_iofil,*) p_param%io%i_savelast
+	    ELSE IF(a_filrow(1:14) == 'DOMAIN_FILE_NA') THEN comment_line
+	      read(i_iofil,2010,iostat=i_tmp) c_tmp
+	      IF(i_tmp == 0) p_param%io%c_domainfile(1:i_cln)= c_tmp(1:i_cln)
+	    ELSE IF(a_filrow(1:14) == 'TRIANG_FILE_NA') THEN comment_line
+	      read(i_iofil,2010,iostat=i_tmp) c_tmp
+	      IF(i_tmp == 0) p_param%io%c_triangfile(1:i_cln)= c_tmp(1:i_cln)
+!---------- look for additional parameters in the physical parameter set
+	    ELSE comment_line
+	      IF(l_logused) THEN
+            log_loop: DO i_cnt=1,i_lognum
+	          IF(a_filrow(1:i_comparlen) == c_logkeywds(i_cnt)) THEN
+	            read(i_iofil,*) p_param%phy%phy_log(i_cnt)
+	          END IF
+	        END DO log_loop
+	      END IF
+	      IF(l_charused) THEN
+	        char_loop: DO i_cnt=1,i_charnum
+	          IF(a_filrow(1:i_comparlen) == c_charkeywds(i_cnt)) THEN
+	            read(i_iofil,*) p_param%phy%phy_char(i_cnt)
+	          END IF
+	        END DO char_loop
+	      END IF
+	      IF(l_intused) THEN
+	        int_loop: DO i_cnt=1,i_intnum
+	          IF(a_filrow(1:i_comparlen) == c_intkeywds(i_cnt)) THEN
+                DO i_len=1,i_intsizes(i_cnt)
+	              read(i_iofil,*) p_param%phy%phy_int(i_len,i_cnt)
+	            END DO
+	          END IF
+	        END DO int_loop
+	      END IF
+	      IF(l_realused) THEN
+	        real_loop: DO i_cnt=1,i_realnum
+	          IF(a_filrow(1:i_comparlen) == c_realkeywds(i_cnt)) THEN
+                DO i_len=1,i_realsizes(i_cnt)
+	              read(i_iofil,*) p_param%phy%phy_real(i_len,i_cnt)
+	            END DO
+	          END IF
+	        END DO real_loop	      
+	      END IF
+	    END IF comment_line
+	  END IF file_end
+	END DO read_loop
+
+!---------- for backward compatibility we accept time step input, but
+!           it is necessary to compute the initial and final time...
+    no_inittime: IF((p_param%num%r_starttime < 0.0) .OR. &
+                    (p_param%num%r_finaltime < 0.0)) THEN
+
+!---------- check if at least first and last timestep are given
+      no_step: IF((p_param%num%i_frsttimestep < 0) .OR. &
+                  (p_param%num%i_lasttimestep < 0)) THEN
+        CALL grid_error(c_error='[io_getbatchinput]: incomplete time stepping info')
+      END IF no_step
+
+!---------- check if delta time is given
+      no_delta: IF((p_param%num%r_deltatime < 0.0)) THEN
+        CALL grid_error(c_error='[io_getbatchinput]: incomplete delta t')
+      END IF no_delta
+
+!---------- now compute initial and final time from time stepping info
+
+      p_param%num%r_starttime = p_param%num%r_deltatime * p_param%num%i_frsttimestep
+      p_param%num%r_finaltime = p_param%num%r_deltatime * p_param%num%i_lasttimestep
+
+    END IF no_inittime
+
+!---------- error handling
+
+	no_value: IF((p_param%num%r_deltatime     < 0.0) .OR. &
+                 (p_param%num%r_starttime     < 0.0) .OR. &
+                 (p_param%num%r_finaltime     < 0.0) .OR. &
+	             (p_param%num%r_reftolerance  < 0.0) .OR. &
+	             (p_param%num%r_crstolerance  < 0.0) .OR. &
+	             (p_param%num%r_refwatermark  < 0.0) .OR. &
+	             (p_param%num%r_crswatermark  < 0.0) .OR. &
+	             (p_param%num%i_experiment    < 0)   .OR. &
+	             (p_param%num%i_crslevel      < 0)   .OR. &
+	             (p_param%num%i_reflevel      < 0)   .OR. &
+	             (p_param%io%i_plotoffset     < 0)   .OR. &
+	             (p_param%io%i_saveoffset     < 0)   .OR. &
+	             (p_param%num%i_adviterations < 0)) THEN
+	  CALL grid_error(c_error='[io_getbatchinput]: Insufficient input parameters')
+	END IF no_value
+
+	RETURN
+
+ 1000	FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/ &
+	       1x,'***** PROGRAM:   ',a15,22x,'*****',/ &
+	       1x,'***** VERSION:   ',i2.2,'.',i2.2,'.',i2.2,29x,'*****',/ &
+	       1x,'*****            Started in BATCH input mode',10x,'*****',/ &
+	       1x,'***** INPUTFILE: ',a20,17x,'*****',/ &
+	       1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/)
+ 2000	FORMAT(a80)
+ 2010	FORMAT(a32)
+
+	END SUBROUTINE io_getbatchinput
+!*****************************************************************
+	SUBROUTINE io_putparameters(p_param)
+
+!---------- local declarations
+
+	IMPLICIT NONE
+
+	TYPE (control_struct), INTENT(in) :: p_param
+	INTEGER                         :: i1, i2, i3, i9, i10, i11, i12, i13, i14
+	REAL (KIND = GRID_SR)           :: r4, r5, r6, r7, r8, r9, r10
+	CHARACTER (len=3)               :: c_diag, c_netc, c_vtup
+
+!---------- temporary store
+
+	i1 = p_param%num%i_experiment
+	i2 = p_param%num%i_reflevel
+	i3 = p_param%num%i_crslevel
+	r4 = p_param%num%r_reftolerance
+	r5 = p_param%num%r_crstolerance
+	r6 = p_param%num%r_refwatermark
+	r7 = p_param%num%r_crswatermark
+	r8 = p_param%num%r_deltatime
+	r9 = p_param%num%r_starttime
+	r10= p_param%num%r_finaltime
+	i11= p_param%io%i_saveoffset
+	i12= p_param%io%i_plotoffset
+	i13= p_param%io%i_savelast
+	i14= p_param%num%i_adviterations
+	
+	IF(p_param%io%l_diagnostics) THEN
+	  c_diag= ' ON'
+	ELSE
+	  c_diag= 'OFF'
+	END IF
+	IF(p_param%io%l_netcdf) THEN
+	  c_netc= ' ON'
+	ELSE
+	  c_netc= 'OFF'
+	END IF
+	IF(p_param%io%l_vtu) THEN
+	  c_vtup= ' ON'
+	ELSE
+	  c_vtup= 'OFF'
+	END IF
+
+!---------- write satement
+
+	write(GRID_parameters%ioout,1000) i1, i2, i3, r4, r5, r6, r7, r8, r9, r10, i11, i12, &
+	                    i13, i14, c_diag, c_netc, c_vtup
+	IF(GRID_parameters%iolog > 0) &
+	  write(GRID_parameters%iolog,1000) i1, i2, i3, r4, r5, r6, r7, r8, r9, r10, i11, i12, &
+	                      i13, i14, c_diag, c_netc, c_vtup
+
+	RETURN
+
+ 1000	FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/ &
+	       1x,'*****                Global Parameters',16x,'*****',/ &
+	       1x,'***** ----- ----- ----- ----- ----- ----- ----- ----- *****',/ &
+	       1x,'***** Experiment No.',25x,i8,' *****',/ &
+	       1x,'***** ----- ----- ----- ----- ----- ----- ----- ----- *****',/ &
+	       1x,'***** Finest grid level',22x,i8,' *****',/ &
+	       1x,'***** Coarsest grid level',20x,i8,' *****',/ &
+	       1x,'***** Refinement tolerance',15x,e12.4,' *****',/ &
+	       1x,'***** Coarsening tolerance',15x,e12.4,' *****',/ &
+	       1x,'***** Refinement watermark',15x,e12.4,' *****',/ &
+	       1x,'***** Coarsening watermark',15x,e12.4,' *****',/ &
+	       1x,'***** ----- ----- ----- ----- ----- ----- ----- ----- *****',/ &
+	       1x,'***** Timestep length',20x,e12.4,' *****',/ &
+	       1x,'***** Start time',25x,e12.4,' *****',/ &
+	       1x,'***** Final time',25x,e12.4,' *****',/ &
+	       1x,'***** ----- ----- ----- ----- ----- ----- ----- ----- *****',/ &
+	       1x,'***** Timesteps between save',17x,i8,' *****',/ &
+	       1x,'***** Timesteps between plot',17x,i8,' *****',/ &
+	       1x,'***** Flag for last save',21x,i8,' *****',/ &
+	       1x,'***** ----- ----- ----- ----- ----- ----- ----- ----- *****',/ &
+	       1x,'***** Iterations for trajectories',12x,i8,' *****',/ &
+	       1x,'***** ----- ----- ----- ----- ----- ----- ----- ----- *****',/ &
+	       1x,'***** Diagnostics switched',24x,a3,' *****',/ &
+	       1x,'***** NetCDF plotting switched',20x,a3,' *****',/ &
+	       1x,'***** VTU plotting switched',23x,a3,' *****',/ &
+	       1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/)
+
+	END SUBROUTINE io_putparameters
+!*****************************************************************
+	SUBROUTINE io_putruntimeinfo(p_ghand, p_info, p_time)
+
+!---------- local declarations
+
+	IMPLICIT NONE
+
+	TYPE (grid_handle), INTENT(in) :: p_ghand
+	TYPE (rt_info), INTENT(inout)  :: p_info
+	TYPE (sw_info), INTENT(inout)  :: p_time
+	INTEGER                        :: i_cnt
+
+!---------- output
+
+	write(GRID_parameters%ioout,1000) p_info%i_step, p_info%r_modeltime, p_info%i_adapit, &
+	                    p_ghand%i_enumber, p_ghand%i_enumfine, &
+	                    p_ghand%i_gnumber, p_ghand%i_gnumfine, &
+	                    p_ghand%i_nnumber
+	IF(GRID_parameters%iolog > 0) &
+	  write(GRID_parameters%iolog,1000) p_info%i_step, p_info%r_modeltime, p_info%i_adapit, &
+	                      p_ghand%i_enumber, p_ghand%i_enumfine, &
+	                      p_ghand%i_gnumber, p_ghand%i_gnumfine, &
+	                      p_ghand%i_nnumber
+	times_loop: DO i_cnt=1,p_time%i_num
+	  write(GRID_parameters%ioout,1003) p_time%p_tim(i_cnt)%c_tim, p_time%p_tim(i_cnt)%r_tim
+	  IF(GRID_parameters%iolog > 0) &
+	    write(GRID_parameters%iolog,1003) p_time%p_tim(i_cnt)%c_tim, p_time%p_tim(i_cnt)%r_tim
+	END DO times_loop
+	save_perf: IF(p_info%l_saved) THEN
+	  write(GRID_parameters%ioout,1002)
+	  IF(GRID_parameters%iolog > 0) &
+	    write(GRID_parameters%iolog,1002)
+	  also_plot: IF(p_info%l_ploted) THEN
+	    write(GRID_parameters%ioout,1005)
+	    write(GRID_parameters%ioout,1006)
+	    IF(GRID_parameters%iolog > 0) THEN
+	      write(GRID_parameters%iolog,1005)
+	      write(GRID_parameters%iolog,1006)
+	    END IF
+	  ELSE also_plot
+	    write(GRID_parameters%ioout,1005)
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,1005)
+	  END IF also_plot
+	ELSE save_perf
+	  but_plot: IF(p_info%l_ploted) THEN
+	    write(GRID_parameters%ioout,1002)
+	    write(GRID_parameters%ioout,1006)
+	    IF(GRID_parameters%iolog > 0) THEN
+	      write(GRID_parameters%iolog,1002)
+	      write(GRID_parameters%iolog,1006)
+	    END IF
+	  END IF but_plot
+	END IF save_perf
+	write(GRID_parameters%ioout,1010)
+	IF(GRID_parameters%iolog > 0) &
+	  write(GRID_parameters%iolog,1010)
+
+!---------- reset info structure
+
+	p_info%i_step  = 0
+	p_info%i_adapit= 0
+	p_info%l_saved = .FALSE.
+	p_info%l_ploted= .FALSE.
+
+	RETURN
+	
+ 1000	FORMAT(1x,'+++++ +++++ +++++ +++++ +++++ +++++ +++++ +++++ +++++ +++++',/ &
+	       1x,'+++++            Runtime Information Output           +++++',/ &
+	       1x,'+++++ ----- ----- ----- ----- ----- ----- ----- ----- +++++',/ &
+	       1x,'+++++ Timestep Number',24x,i8,' +++++',/ &
+	       1x,'+++++ Model time',25x,e12.4,' +++++',/ &
+	       1x,'+++++ ----- ----- ----- ----- ----- ----- ----- ----- +++++',/ &
+	       1x,'+++++ Inner iterations (for adaptation)',6x,i8,' +++++',/ &
+	       1x,'+++++ ----- ----- ----- ----- ----- ----- ----- ----- +++++',/ &
+	       1x,'+++++ Number of elements',21x,i8,' +++++',/ &
+	       1x,'+++++ Number of elements (fine grid)',9x,i8,' +++++',/ &
+	       1x,'+++++ Number of edges',24x,i8,' +++++',/ &
+	       1x,'+++++ Number of edges (fine grid)',12x,i8,' +++++',/ &
+	       1x,'+++++ Number of nodes',24x,i8,' +++++',/ &
+	       1x,'+++++ ----- ----- ----- ----- ----- ----- ----- ----- +++++')
+ 1002	FORMAT(1x,'+++++ ----- ----- ----- ----- ----- ----- ----- ----- +++++')
+ 1003	FORMAT(1x,'+++++ Time spent in ',a16,5x,e12.4,' +++++')
+ 1005	FORMAT(1x,'+++++ Saveset transferred to disk in this step        +++++')
+ 1006	FORMAT(1x,'+++++ Plotting performed in this step                 +++++')
+ 1010	FORMAT(1x,'+++++ +++++ +++++ +++++ +++++ +++++ +++++ +++++ +++++ +++++',/)
+
+	END SUBROUTINE io_putruntimeinfo
+!*****************************************************************
+	SUBROUTINE io_putinputfile(p_param)
+
+!---------- local declarations
+
+	IMPLICIT NONE
+
+	TYPE (control_struct), INTENT(in) :: p_param
+	INTEGER                         :: i1, i2, i3, i9, i10, i11, &
+	  i12, i13, i14, i15, i16, i17, i18, i19, i20, i31
+	INTEGER                         :: i_cnt, i_true, i_false, i_len
+	REAL (KIND = GRID_SR)           :: r4, r5, r6, r7, r8, r9, r10
+	INTEGER                         :: i_unit=15, i_fst
+	CHARACTER (len=32)              :: c_file
+	CHARACTER (len=28)              :: c_tmp
+
+!---------- temporary store
+
+	i1 = p_param%num%i_experiment+ 1
+	i2 = p_param%num%i_reflevel
+	i3 = p_param%num%i_crslevel
+	r4 = p_param%num%r_reftolerance
+	r5 = p_param%num%r_crstolerance
+	r6 = p_param%num%r_refwatermark
+	r7 = p_param%num%r_crswatermark
+	r8 = p_param%num%r_deltatime
+	r9 = p_param%num%r_finaltime
+	r10= p_param%num%r_finaltime + (p_param%num%r_finaltime- p_param%num%r_starttime)
+	i12= 0
+	IF(p_param%io%l_netcdf) i12= 1
+	i11= 0
+	IF(p_param%io%l_vtu) i11= 1
+	i31= 0
+	IF(p_param%io%l_diagnostics) i31= 1
+	i13= p_param%io%i_plotoffset
+	i14= p_param%io%i_saveoffset
+	i15= p_param%io%i_savelast
+	i16= p_param%num%i_adviterations
+	
+	i_true= 1
+	i_false= 0
+
+!---------- open file
+
+	  write(c_tmp,*) trim(GRID_parameters%program_name), '_input.'
+	  write(c_file,1010) trim(c_tmp), i1
+	  c_file= adjustl(c_file)
+	  open(i_unit, file= c_file, action= 'write', form= 'formatted', &
+	       status='replace', iostat= i_fst)
+	  not_opened: IF(i_fst /= 0) THEN
+	    CALL grid_error(c_error='[io_putinputfile]: Could not open parameters file for output')
+	  END IF not_opened
+	  IF(GRID_parameters%iolog > 0) &
+	    write(GRID_parameters%iolog,*) 'INFO: Filename: ', c_file, ' opened on unit: ', i_unit
+
+!---------- write statement
+
+	write(i_unit,1001) c_file, GRID_parameters%program_name
+	write(i_unit,1002) i1, i2, i3, r4, r5, r6, r7, r8, r9, r10
+	write(i_unit,1003) i12, i11, i31, i13, i14, &
+	  i15, p_param%io%c_domainfile, p_param%io%c_triangfile, i16
+
+!---------- write statements for the generic phy part
+
+    IF(l_logused) THEN
+      log_loop: DO i_cnt=1,i_lognum
+        write(i_unit,1011) c_logkeywds(i_cnt)
+        IF(p_param%phy%phy_log(i_cnt)) THEN
+          write(i_unit,*) i_true
+        ELSE
+          write(i_unit,*) i_false
+        END IF
+      END DO log_loop
+    END IF
+    IF(l_charused) THEN
+      char_loop: DO i_cnt=1,i_charnum
+        write(i_unit,1011) c_charkeywds(i_cnt)
+        write(i_unit,*) p_param%phy%phy_char(i_cnt)
+      END DO char_loop
+    END IF
+    IF(l_intused) THEN
+      int_loop: DO i_cnt=1,i_intnum
+        write(i_unit,1011) c_intkeywds(i_cnt)
+        DO i_len=1,i_intsizes(i_cnt)
+          write(i_unit,*) p_param%phy%phy_int(i_len,i_cnt)
+        END DO
+      END DO int_loop
+    END IF
+    IF(l_realused) THEN
+      real_loop: DO i_cnt=1,i_realnum
+        write(i_unit,1011) c_realkeywds(i_cnt)
+        DO i_len=1,i_realsizes(i_cnt)
+          write(i_unit,*) p_param%phy%phy_real(i_len,i_cnt)
+        END DO
+      END DO real_loop
+    END IF
+	write(i_unit,1004)
+
+!---------- close file
+
+	close(i_unit)
+	IF(GRID_parameters%iolog > 0) &
+	  write(GRID_parameters%iolog,*) 'INFO: Closed file on unit: ', i_unit
+
+	RETURN
+
+ 1001	FORMAT('# --- --- --- --- --- --- --- --- --- --- --- --- ---',/ &
+	       '# Parameter file ',a32,/ &
+	       '# created automatically by program ',a15,/ &
+	       '# --- --- --- --- --- --- --- --- --- --- --- --- ---')
+ 1002	FORMAT('EXPERIMENT_NUMBER',/ &
+	       i8,/ &
+	       'FINE_GRID_LEVEL',/ &
+	       i8,/ &
+	       'COARSE_GRID_LEVEL',/ &
+	       i8,/ &
+	       'TOLERANCE_OF_REFINEMENT',/ &
+	       e12.4,/ &
+	       'TOLERANCE_OF_COARSENING',/ &
+	       e12.4,/ &
+	       'WATERMARK_OF_REFINEMENT',/ &
+	       e12.4,/ &
+	       'WATERMARK_OF_COARSENING',/ &
+	       e12.4,/ &
+	       'TIMESTEP_LENGTH',/ &
+	       e12.4,/ &
+	       'TIMESTEPPING_START_TIME',/ &
+	       e12.4,/ &
+	       'TIMESTEPPING_END_TIME',/ &
+	       e12.4)
+ 1003	FORMAT('NETCDF_FILE_PLOTTING',/ &
+	       i8,/ &
+	       'VTU_FILE_PLOTTING',/ &
+	       i8,/ &
+	       'SWITCH_ON_DIAGNOSTICS',/ &
+	       i8,/ &
+	       'STEPS_BTW_PLOTS',/ &
+	       i8,/ &
+	       'STEPS_BTW_SAVES',/ &
+	       i8,/ &
+	       'SAVE_FINISH_CONFIGURATION',/ &
+	       i8,/ &
+	       'DOMAIN_FILE_NAME',/ &
+	       a32,/ &
+	       'TRIANG_FILE_NAME',/ &
+	       a32,/ &
+	       'SLM_ITERATION_NUMBER',/ &
+	       i8)
+ 1004	FORMAT('# --- ---  End of parameter file  --- --- --- --- ---')
+ 1010	FORMAT(a28,i4.4)
+ 1011   FORMAT(a12) ! CAUTION: Make sure this is exactly as long as i_comparlen in FLASH_metadata
+
+	END SUBROUTINE io_putinputfile
+	END MODULE IO_utils
diff --git a/flash2d/src/flash-sphere/IO_vtu.F90 b/flash2d/src/flash-sphere/IO_vtu.F90
new file mode 100644
index 0000000..b024189
--- /dev/null
+++ b/flash2d/src/flash-sphere/IO_vtu.F90
@@ -0,0 +1,554 @@
+!-----------------------------------------------------------------------
+!> \file IO_vtu.F90
+!> \brief Contains the module IO_vtu
+!-----------------------------------------------------------------------
+!> The MODULE IO_vtu create a vtu file, unstructered grid, readable by
+!!                     paraview
+!
+!> Actually, amatos' structure denies a unified handling for
+!! 2d, 3d and spherical case. Therefore the corresponding definition
+!! has to be uncommented
+!-----------------------------------------------------------------------
+
+!#define VTU_OUTPUT2D
+!#define VTU_OUTPUT3D
+#define VTU_OUTPUTSPH
+
+MODULE IO_vtu
+
+USE GRID_api
+
+PUBLIC :: plot_vtu, t_vtu_data
+
+#if defined VTU_OUTPUT2D || defined VTU_OUTPUTSPH
+  INTEGER(KIND=GRID_SI), PARAMETER         :: i_nodespercell = GRID_elementnodes
+  INTEGER(KIND=GRID_SI), PARAMETER         :: i_nodesperface = GRID_edgenodes
+
+  ! This defines a triangle in VTK format
+  INTEGER(KIND=GRID_SI), PARAMETER         :: i_vtucelltype = 5
+#elif defined VTU_OUTPUT3D
+  INTEGER(KIND=GRID_SI), PARAMETER         :: i_nodespercell = GRID_tetranodes
+  INTEGER(KIND=GRID_SI), PARAMETER         :: i_nodesperface = GRID_elementnodes
+
+  ! This defines a tetrahedron in VTK format
+  INTEGER(KIND=GRID_SI), PARAMETER         :: i_vtucelltype = 10
+#endif
+
+
+!> Structure for variable information
+TYPE t_vtu_data
+  CHARACTER(LEN=32)                              :: c_name  !< VTU variable name
+  INTEGER(KIND=GRID_SI)                          :: i_size  !< data dimension
+  REAL(KIND=GRID_SR),POINTER, DIMENSION(:,:)     :: p_vdata !< pointer to data
+END TYPE t_vtu_data
+
+!> Very small values can cause errors when read in paraview.
+!! This is the threshold for filtering.
+REAL(KIND = GRID_SR), PARAMETER                  :: r_vtueps = 1e-12
+CONTAINS
+
+!---------------------------------------------------------------------
+!> \brief Writes a VTU file
+!> Use this routine to plot continuous or discontinuous data.
+!> \param[in] p_mesh          The mesh
+!> \param[in] c_filename      The name of the file to write to
+!> \param[in] i_nodedata      Size of the array p_nodedata
+!> \param[in] p_nodedata      Array of type t_vtu_data for node
+!!                            data. For each node one entry has to exist in
+!!                            p_vdata.
+!> \param[in] i_celldata      Size of the array p_celldata
+!> \param[in] p_nodedata      Array of type t_vtu_data for cell
+!!                            data. For each tetrahedron one entry has to
+!!                            exist in p_vdata.
+#ifdef VTU_OUTPUT2D
+!> \param[in] r_zcoordinate   The z-coordinate values
+!> \param[in] i_zcoordinate   Use the i_zcoordinate component of p_nodedata
+!!                            also as z-coordinate
+#endif
+!> \param[in] l_continuous    Write continuous node data.
+!!                            This needs less space than discontinuous.
+!!                            default: .true.
+!> \param[in] l_grid_info     Write grid numbering information
+!!                            default: .false.
+!---------------------------------------------------------------------
+SUBROUTINE plot_vtu(p_mesh, c_filename, &
+                    i_nodedata, p_nodedata, i_celldata, p_celldata, &
+#ifdef VTU_OUTPUT2D
+                    r_zcoordinate, i_zcoordinate, &
+#endif
+                    l_continuous, l_grid_info)
+  IMPLICIT NONE
+
+  TYPE (grid_handle), INTENT(in)                 :: p_mesh
+  CHARACTER (len=*), INTENT(IN)                  :: c_filename
+  INTEGER(KIND=GRID_SI), INTENT(IN), OPTIONAL    :: i_nodedata
+  TYPE(t_vtu_data), INTENT(IN), DIMENSION(:), OPTIONAL &
+                                                 :: p_nodedata
+  INTEGER(KIND=GRID_SI), INTENT(IN), OPTIONAL    :: i_celldata
+  TYPE(t_vtu_data), INTENT(IN), DIMENSION(:), OPTIONAL &
+                                                 :: p_celldata
+#ifdef VTU_OUTPUT2D
+  REAL(KIND=GRID_SR), POINTER, DIMENSION(:,:), OPTIONAL &
+                                                 :: r_zcoordinate
+  INTEGER(KIND=GRID_SI), OPTIONAL, INTENT(IN)    :: i_zcoordinate
+#endif
+
+  LOGICAL, INTENT(IN), OPTIONAL                  :: l_grid_info
+  LOGICAL, INTENT(IN), OPTIONAL                  :: l_continuous
+
+  INTEGER( KIND = GRID_SI)                       :: i_alct
+  INTEGER( KIND = GRID_SI)                       :: i_cnt
+  INTEGER( KIND = GRID_SI)                       :: i_fst
+  INTEGER( KIND = GRID_SI)                       :: i_ncnt
+  INTEGER( KIND = GRID_SI), PARAMETER            :: i_fhandle = 89
+
+  ! this variables result from different naming conventions in two and
+  ! three dimensions
+  INTEGER( KIND = GRID_SI)                       :: i_numberofcells
+  INTEGER( KIND = GRID_SI)                       :: i_numberoffaces
+  INTEGER( KIND = GRID_SI)                       :: i_numberofpoints
+
+  INTEGER (KIND = GRID_SI), DIMENSION(:,:), ALLOCATABLE     :: i_cellnodes
+  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_nodecoor
+  INTEGER (KIND = GRID_SI), DIMENSION(:), ALLOCATABLE       :: i_nodes
+
+  LOGICAL                                        :: l_write_grid_info
+  LOGICAL                                        :: l_continuous_data
+
+
+#ifdef VTU_OUTPUT2D
+  IF(PRESENT(i_zcoordinate) .AND. PRESENT(r_zcoordinate)) THEN
+    CALL GRID_error(c_error='[plot_vtu] z-coordinate is defined twice')
+  END IF
+#endif
+
+  ! set the value of l_continuous. The default is .true.
+  IF(PRESENT(l_continuous)) THEN
+    l_continuous_data = l_continuous
+  ELSE
+    l_continuous_data = .TRUE.
+  END IF
+
+  ! set the value of l_grid_info. The default is .false..
+  IF(PRESENT(l_grid_info)) THEN
+    l_write_grid_info = l_grid_info
+  ELSE
+    l_write_grid_info = .FALSE.
+  END IF
+
+  ! Set dimension depending types
+#if defined VTU_OUTPUT2D || defined VTU_OUTPUTSPH
+  i_numberofcells = p_mesh%i_enumfine
+  i_numberoffaces = p_mesh%i_gnumfine
+#elif defined VTU_OUTPUT3D
+  i_numberofcells = p_mesh%i_tnumfine
+  i_numberoffaces = p_mesh%i_enumfine
+#endif
+
+  IF(l_continuous_data) THEN
+    i_numberofpoints = p_mesh%i_nnumber
+  ELSE
+    i_numberofpoints = i_numberofcells * i_nodespercell
+  END IF
+
+  ! We only need the node coordinates and the nodes per tetra
+  ! as additional information.
+  ALLOCATE(r_nodecoor(GRID_dimension, p_mesh%i_nnumber), &
+           i_cellnodes(i_nodespercell, i_numberofcells), &
+           stat = i_alct)
+
+  IF(i_alct /= 0) THEN
+    CALL grid_error(c_error='[write_vtu]: could not allocate data arrays')
+  END IF
+
+  CALL GRID_getinfo(p_mesh, r_nodecoordinates = r_nodecoor, &
+#if defined VTU_OUTPUT2D || defined VTU_OUTPUTSPH
+                   i_elementnodes = i_cellnodes)
+#elif defined VTU_OUTPUT3D
+                   i_tetranodes   = i_cellnodes)
+#endif
+
+  ! open the file and write header information
+  OPEN(i_fhandle, file = c_filename, iostat= i_fst)
+  IF(i_fst /= 0) THEN
+    RETURN
+  END IF
+
+  WRITE(i_fhandle, "(A)") '<?xml version="1.0"?>'
+  WRITE(i_fhandle, "(A)") '<VTKFile type="UnstructuredGrid" version="0.1" byte_order="LittleEndian">'
+  WRITE(i_fhandle, *) '<UnstructuredGrid>'
+  WRITE(i_fhandle, "(A,I8,A,I8,A)") '<Piece NumberOfPoints="', &
+                        i_numberofpoints, &
+                        '" NumberOfCells="', &
+                        i_numberofcells, &
+                        '">'
+
+  ! write the node coordinates to VTU file
+  WRITE(i_fhandle, *) '<Points>'
+  WRITE(i_fhandle, "(A,I1,A)") '<DataArray type="Float32" NumberOfComponents="', &
+  3, '" format="ascii">'
+
+  ! Distunguish between continuous and discontinuous case
+  IF(l_continuous_data) THEN
+    !> The continuous case is represented by amatos' grid topology.
+    DO i_cnt = 1, p_mesh%i_nnumber
+#if defined VTU_OUTPUT3D || defined VTU_OUTPUTSPH
+      WRITE(i_fhandle, *) r_nodecoor(:, i_cnt)
+#elif defined  VTU_OUTPUT2D
+    IF(PRESENT(r_zcoordinate)) THEN
+      WRITE(i_fhandle, *) r_nodecoor(:, i_cnt), r_zcoordinate(1, i_cnt)
+    ELSE IF(PRESENT(i_zcoordinate)) THEN
+      WRITE(i_fhandle, *) r_nodecoor(:, i_cnt), &
+                          p_nodedata(i_zcoordinate)%p_vdata(1, i_cnt)
+    ELSE
+      WRITE(i_fhandle, *) r_nodecoor(:, i_cnt), 0.0
+    END IF
+#endif
+    END DO
+
+  ELSE
+    ! Write the node coordinates. In this discontinuous case one node in
+    ! paraview belongs only to one cell.
+    DO i_cnt = 1, i_numberofcells
+      DO i_ncnt = 1, i_nodespercell
+#if defined VTU_OUTPUT2D || defined VTU_OUTPUTSPH
+        WRITE(i_fhandle, *) r_nodecoor(:, i_cellnodes(i_ncnt, i_cnt))
+#elif defined VTU_OUTPUT2D
+        IF(PRESENT(r_zcoordinate)) THEN
+          WRITE(i_fhandle, *) r_nodecoor(:, i_cellnodes(i_ncnt, i_cnt)), &
+                              r_zcoordinate(1, i_cellnodes(i_ncnt, i_cnt))
+        ELSE IF(PRESENT(i_zcoordinate)) THEN
+          WRITE(i_fhandle, *) r_nodecoor(:, i_cellnodes(i_ncnt, i_cnt)), &
+              p_nodedata(i_zcoordinate)%p_vdata(1, i_cellnodes(i_ncnt, i_cnt))
+        ELSE
+          WRITE(i_fhandle, *) r_nodecoor(:, i_cellnodes(i_ncnt, i_cnt)), 0.0
+        END IF
+#endif
+      END DO
+    END DO
+  END IF
+
+  WRITE(i_fhandle, *) '</DataArray>'
+  WRITE(i_fhandle, *) '</Points>'
+
+  ! Write the node connectivity
+  WRITE(i_fhandle, *) '<Cells>'
+  WRITE(i_fhandle, *) '<DataArray type="Int32" Name="connectivity" format="ascii">'
+
+  ! check wether continuous data is written
+  IF(l_continuous_data) THEN
+    ! The indexing in paraview starts with 0. Therefore we subtract one from
+    ! the node connectivity information.
+#if defined VTU_OUTPUT2D || defined VTU_OUTPUTSPH
+    DO i_cnt = 1, p_mesh%i_enumfine
+#elif defined VTU_OUTPUT3D
+    DO i_cnt = 1, p_mesh%i_tnumfine
+#endif
+      WRITE(i_fhandle, *) i_cellnodes(:, i_cnt) - 1
+    END DO
+  ELSE
+    ! Write element nodes (indexing starts by 0!)
+    ! In the discontinuous case each tetrahedron has its own nodes
+    ALLOCATE(i_nodes(i_nodespercell), stat = i_alct)
+
+    IF(i_alct /= 0) THEN
+      CALL grid_error(c_error='[write_vtu]: could not allocate node array for VTU output')
+    END IF
+
+    DO i_cnt = 1, i_numberofcells * i_nodespercell, i_nodespercell
+
+      DO i_ncnt = 1, i_nodespercell
+        i_nodes(i_ncnt) = i_ncnt + i_cnt - 2
+      END DO
+
+      WRITE(i_fhandle, *) i_nodes
+    END DO
+
+    DEALLOCATE(i_nodes)
+  END IF
+
+  WRITE(i_fhandle, *) '</DataArray>'
+
+  ! write the cell type. Tetrahedra are represented by 10 and triangles by 5
+  WRITE(i_fhandle, *) '<DataArray type="UInt8" Name="types" format="ascii">'
+  DO i_cnt = 1, i_numberofcells
+    WRITE(i_fhandle, *) i_vtucelltype
+  END DO
+  WRITE(i_fhandle, *) '</DataArray>'
+  WRITE(i_fhandle, *) '<DataArray type="Int32" Name="offsets" format="ascii">'
+  DO i_cnt = 1, i_numberofcells
+    WRITE(i_fhandle, *) i_cnt * i_nodespercell
+  END DO
+  WRITE(i_fhandle, *) '</DataArray>'
+  WRITE(i_fhandle, *) '</Cells>'
+
+  ! Write the point data / node data
+  ! If the grid information is requested save the node numbering of amatos.
+  ! Since every node number in paraview is decreased by one, this option is
+  ! in continuous plotting not too useful.
+  WRITE(i_fhandle, *) '<PointData>'
+
+  IF(l_write_grid_info) THEN
+    WRITE(i_fhandle, *) '<DataArray type="Int32" Name="Nodenumber" format="ascii">'
+
+    DO i_cnt = 1, p_mesh%i_nnumber
+      WRITE(i_fhandle, *) i_cnt
+    END DO
+
+    WRITE(i_fhandle, *) '</DataArray>'
+  END IF
+
+  ! When variables for the node data are present, save them.
+  IF(PRESENT(i_nodedata) .AND. PRESENT(p_nodedata)) THEN
+    DO i_cnt = 1, i_nodedata
+      CALL write_vtu_data(i_fhandle, p_nodedata(i_cnt))
+    END DO
+  END IF
+
+  WRITE(i_fhandle, *) '</PointData>'
+
+
+
+  ! write the cell data.
+  WRITE(i_fhandle, *) '<CellData>'
+
+  ! Write the element numbers when requested.
+  IF(l_write_grid_info) THEN
+    WRITE(i_fhandle, *) '<DataArray type="Int32" Name="Elementnumber" format="ascii">'
+
+    DO i_cnt = 1, i_numberofcells
+      WRITE(i_fhandle, *) i_cnt
+    END DO
+
+    WRITE(i_fhandle, *) '</DataArray>'
+  END IF
+
+  ! Write the variable belonging to the tetradra.
+  IF(PRESENT(i_celldata) .AND. PRESENT(p_celldata)) THEN
+    DO i_cnt = 1, i_celldata
+      CALL write_vtu_data(i_fhandle, p_celldata(i_cnt))
+    END DO
+  END IF
+
+  ! write the end of cell data and the footer.
+  WRITE(i_fhandle, *) '</CellData>'
+  WRITE(i_fhandle, *) '</Piece>'
+  WRITE(i_fhandle, *) '</UnstructuredGrid>'
+  WRITE(i_fhandle, *) '</VTKFile>'
+
+  ! tidy up
+  CLOSE(i_fhandle)
+  DEALLOCATE(r_nodecoor, i_cellnodes)
+END SUBROUTINE plot_vtu
+
+
+#ifdef VTU_OUTPUT3D
+!---------------------------------------------------------------------
+!> Use this routine to plot the mesh consisting of face and
+!! continuous data on it.
+!> \param p_mesh      - the mesh
+!> \param c_filename    - the name of the file to write to
+!> \param i_nodedata    - (optional) size of the array p_nodedata
+!> \param p_nodedata    - (optional) array of type t_vtu_data for node
+!!                        data. For each node one entry has to exist in
+!!                        p_vdata.
+!> \param i_celldata    - (optional) size of the array p_celldata
+!> \param p_nodedata    - (optional) array of type t_vtu_data for cell
+!!                        data. For each face one entry has to
+!!                        exist in p_vdata.
+!> \param l_grid_info   - (optional) Write grid numbering information
+!!                        default: .false.
+!---------------------------------------------------------------------
+SUBROUTINE plot_vtu_elements(p_mesh, c_filename, i_nodedata, &
+                             p_nodedata, i_celldata, p_celldata, &
+                             l_grid_info)
+  IMPLICIT NONE
+
+  TYPE (grid_handle), INTENT(in)                 :: p_mesh
+  CHARACTER (len=*), INTENT(IN)                  :: c_filename
+  INTEGER(KIND=GRID_SI), INTENT(IN), OPTIONAL    :: i_nodedata
+  TYPE(t_vtu_data), INTENT(IN), DIMENSION(:), OPTIONAL &
+                                                 :: p_nodedata
+  INTEGER(KIND=GRID_SI), INTENT(IN), OPTIONAL    :: i_celldata
+  TYPE(t_vtu_data), INTENT(IN), DIMENSION(:), OPTIONAL &
+                                                 :: p_celldata
+
+  LOGICAL, INTENT(IN), OPTIONAL                  :: l_grid_info
+
+  LOGICAL                                        :: l_write_grid_info
+
+  INTEGER( KIND = GRID_SI)             :: i_alct, i_cnt, i_fst
+  INTEGER( KIND = GRID_SI)             :: i_fhandle = 89
+
+  INTEGER (KIND = GRID_SI), DIMENSION(:,:), ALLOCATABLE     :: i_enodes
+  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_nodecoor
+
+  !> set the optional data
+  IF(PRESENT(l_grid_info)) THEN
+    l_write_grid_info = l_grid_info
+  ELSE
+    l_write_grid_info = .FALSE.
+  END IF
+
+  ALLOCATE(r_nodecoor(GRID_dimension, p_mesh%i_nnumber), &
+           i_enodes(GRID_elementnodes, p_mesh%i_enumfine), &
+           stat = i_alct)
+
+  IF(i_alct /= 0) THEN
+    CALL grid_error(c_error='[write_vtu]: could not allocate data arrays')
+  END IF
+
+  CALL GRID_getinfo(p_mesh, r_nodecoordinates = r_nodecoor, &
+                   i_elementnodes = i_enodes)
+
+
+  OPEN(i_fhandle, file = c_filename, iostat= i_fst)
+  IF(i_fst /= 0) THEN
+    RETURN
+  END IF
+
+  !> Write the VTK header
+  WRITE(i_fhandle, "(A)") '<?xml version="1.0"?>'
+  WRITE(i_fhandle, "(A)") '<VTKFile type="UnstructuredGrid" version="0.1" byte_order="LittleEndian">'
+  WRITE(i_fhandle, *) '<UnstructuredGrid>'
+  WRITE(i_fhandle, "(A,I8,A,I8,A)") '<Piece NumberOfPoints="', &
+                        p_mesh%i_nnumber, &
+                        '" NumberOfCells="', &
+                        p_mesh%i_enumfine, &
+                        '">'
+
+  !> Save the coordinates of all nodes
+  WRITE(i_fhandle, *) '<Points>'
+  WRITE(i_fhandle, "(A,I1,A)") '<DataArray type="Float32" NumberOfComponents="', &
+ 3 , '" format="ascii">'
+  DO i_cnt = 1, p_mesh%i_nnumber
+    WRITE(i_fhandle, *) r_nodecoor(:, i_cnt)
+  END DO
+  WRITE(i_fhandle, *) '</DataArray>'
+  WRITE(i_fhandle, *) '</Points>'
+
+  !> Write the cell (element) information
+  WRITE(i_fhandle, *) '<Cells>'
+
+  !> Save the node connectivity
+  WRITE(i_fhandle, *) '<DataArray type="Int32" Name="connectivity" format="ascii">'
+
+
+  !> write element nodes.  Write connectivity (indexing starts by 0!)
+  DO i_cnt = 1, p_mesh%i_enumfine
+    WRITE(i_fhandle, *) i_enodes(:, i_cnt) - 1
+  END DO
+  WRITE(i_fhandle, *) '</DataArray>'
+
+  !> Write the cell type (triangle = 5, tetrahedron = 10).
+  WRITE(i_fhandle, *) '<DataArray type="UInt8" Name="types" format="ascii">'
+  DO i_cnt = 1, p_mesh%i_enumfine
+    WRITE(i_fhandle, *) '5'
+  END DO
+  WRITE(i_fhandle, *) '</DataArray>'
+  WRITE(i_fhandle, *) '<DataArray type="Int32" Name="offsets" format="ascii">'
+  DO i_cnt = 1, p_mesh%i_enumfine
+    WRITE(i_fhandle, *) i_cnt * GRID_elementnodes
+  END DO
+  WRITE(i_fhandle, *) '</DataArray>'
+  WRITE(i_fhandle, *) '</Cells>'
+
+  !> write point data
+  WRITE(i_fhandle, *) '<PointData>'
+
+  !> Save the node numbers, when requested.
+  IF(l_write_grid_info) THEN
+    WRITE(i_fhandle, *) '<DataArray type="Int32" Name="Nodenumber" format="ascii">'
+
+    DO i_cnt = 1, p_mesh%i_nnumber
+      WRITE(i_fhandle, *) i_cnt
+    END DO
+
+    WRITE(i_fhandle, *) '</DataArray>'
+  END IF
+
+  !> Write the nodal variables, when present.
+  IF(PRESENT(i_nodedata) .AND. PRESENT(p_nodedata)) THEN
+    DO i_cnt = 1, i_nodedata
+      CALL write_vtu_data(i_fhandle, p_nodedata(i_cnt))
+    END DO
+  END IF
+
+  WRITE(i_fhandle, *) '</PointData>'
+
+
+
+  !> write cell data
+  WRITE(i_fhandle, *) '<CellData>'
+
+  !> save the element numbers, when requested.
+  IF(l_write_grid_info) THEN
+    WRITE(i_fhandle, *) '<DataArray type="Int32" Name="Elementnumber" format="ascii">'
+
+    DO i_cnt = 1, p_mesh%i_enumfine
+      WRITE(i_fhandle, *) i_cnt
+    END DO
+
+    WRITE(i_fhandle, *) '</DataArray>'
+  END IF
+
+  !> Write the cell variables (when present)
+  IF(PRESENT(i_celldata) .AND. PRESENT(p_celldata)) THEN
+    DO i_cnt = 1, i_celldata
+      CALL write_vtu_data(i_fhandle, p_celldata(i_cnt))
+    END DO
+  END IF
+
+  !> write the footer.
+  WRITE(i_fhandle, *) '</CellData>'
+  WRITE(i_fhandle, *) '</Piece>'
+  WRITE(i_fhandle, *) '</UnstructuredGrid>'
+  WRITE(i_fhandle, *) '</VTKFile>'
+
+  !> finally close the file and deallocate the data
+  CLOSE(i_fhandle)
+  DEALLOCATE(r_nodecoor, i_enodes)
+END SUBROUTINE plot_vtu_elements
+#endif !----3D output only
+
+!---------------------------------------------------------------------
+!> write_vtu_data writes a single variable (node or cell) to the
+!! VTK file.
+!> \param i_fhandle - the file handle
+!> \param p_data    - the variable
+!---------------------------------------------------------------------
+SUBROUTINE write_vtu_data(i_fhandle, p_data)
+  IMPLICIT NONE
+
+  INTEGER(KIND=GRID_SI), INTENT(IN)             :: i_fhandle
+  TYPE(t_vtu_data)                              :: p_data
+  INTEGER(KIND=GRID_SI)                         :: i_size
+  INTEGER(KIND=GRID_SI)                         :: i_cnt
+  INTEGER(KIND=GRID_SI)                         :: i_cnt2
+
+  !> Special treatment for vector valued data
+  IF(p_data%i_size > 1) THEN
+    WRITE(i_fhandle, "(A,A,A,I1, A)") &
+                '<DataArray type="Float32" Name="', &
+                TRIM(p_data%c_name), '" NumberOfComponents="', &
+                p_data%i_size, '" format="ascii">'
+  ELSE
+    WRITE(i_fhandle, "(A,A,A)") '<DataArray type="Float32" Name="', &
+                TRIM(p_data%c_name), '" format="ascii">'
+  END IF
+  i_size = SIZE(p_data%p_vdata, 2)
+
+  !> Write the data to file with respect to the threshold value
+  DO i_cnt = 1, i_size
+    DO i_cnt2 = 1, p_data%i_size
+      IF(ABS(p_data%p_vdata(i_cnt2, i_cnt)) < r_vtueps) &
+          p_data%p_vdata(i_cnt2, i_cnt) = 0
+    END DO
+
+    WRITE(i_fhandle, "(10e15.7)") p_data%p_vdata(1:p_data%i_size, i_cnt)
+  END DO
+  WRITE(i_fhandle, *) '</DataArray>'
+
+END SUBROUTINE write_vtu_data
+
+END MODULE IO_vtu
diff --git a/flash2d/src/flash-sphere/IO_vtuplot.F90 b/flash2d/src/flash-sphere/IO_vtuplot.F90
new file mode 100644
index 0000000..af94424
--- /dev/null
+++ b/flash2d/src/flash-sphere/IO_vtuplot.F90
@@ -0,0 +1,166 @@
+!*****************************************************************
+!
+!> @file IO_vtuplot.F90
+!> @brief includes module IO_vtuplot
+!
+!*****************************************************************
+!
+! VERSION(S):
+!  1. original version                        j. behrens    04/2000
+!  2. amatos-1.0 and 2D compliant             j. behrens    11/2000
+!  3. adapted to flash2d                      j. behrens    12/2014
+!
+!*****************************************************************
+! MODULE DESCRIPTION:
+!> prints data in VTU compatible file format
+!
+MODULE IO_vtuplot
+  USE FLASH_parameters
+  USE MISC_outputdata
+  USE GRID_api
+  USE IO_vtu
+  PRIVATE
+  INTEGER, SAVE :: i_timecounter= 0
+  PUBLIC :: generate_vtu
+  CONTAINS
+
+!*****************************************************************
+! DESCRIPTION of [SUBROUTINE generate_vtu]:
+!> @brief creates output in GMV compatible file format
+!>
+!> @param[in]       p_handle      grid handle for the linked lists
+!> @param[in]       i_time        time step number
+!> @param[in]       i_newslevel   the time level
+!>
+!> @note ON OUTPUT: a number of VTU compatible ascii files for each plotted time step
+!
+  SUBROUTINE generate_vtu(p_handle, i_time, i_newslevel)
+
+    IMPLICIT NONE
+
+!---------- local declarations
+
+    TYPE (grid_handle), INTENT(in)                        :: p_handle
+    INTEGER (KIND = GRID_SI), OPTIONAL, INTENT(in)        :: i_time
+    INTEGER (KIND = GRID_SI), OPTIONAL, INTENT(in)        :: i_newslevel
+    INTEGER (KIND = GRID_SI)                              :: i_alct, i_nnum, i_tnum
+    INTEGER (KIND = GRID_SI)                              :: i_nwl, i_elen, i_tcnt
+    REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER    :: r_val
+    REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER    :: r_velo
+    REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER    :: r_sta, r_lvl
+    INTEGER (KIND = GRID_SI), DIMENSION(:), ALLOCATABLE   :: i_ids, i_sta
+    CHARACTER (len=32)                                    :: c_mfile
+    CHARACTER (len=26)                                    :: c_tmp
+    LOGICAL                                               :: l_news
+    INTEGER, PARAMETER                                    :: i_vallen=5
+    INTEGER, DIMENSION(i_vallen)                          :: i_valind
+
+    TYPE(t_vtu_data), DIMENSION(2)                        :: celldata
+    TYPE(t_vtu_data), DIMENSION(4)                        :: nodedata
+    
+!---------- file handling (open)
+
+    IF(present(i_time)) THEN
+      i_tcnt= i_time
+      i_timecounter= i_timecounter+1
+    ELSE
+      i_tcnt= i_timecounter
+      i_timecounter= i_timecounter+1
+    END IF
+    write(c_tmp,*) trim(GRID_parameters%program_name(1:20))
+    write(c_mfile,10101) trim(c_tmp), '_', i_tcnt
+    c_tmp = adjustl(c_mfile)
+    write(c_mfile,*) TRIM(c_tmp), '.vtu'
+    c_mfile= adjustl(c_mfile)
+
+!---------- handle news level
+
+    IF(present(i_newslevel)) THEN
+      l_news=.TRUE.
+      i_nwl= i_newslevel
+    ELSE
+      l_news=.FALSE.
+    END IF
+
+!---------- the nodes
+
+    i_nnum = p_handle%i_nnumber
+
+!---------- extract nodal grid data and nodal values
+
+	ALLOCATE(r_val(i_vallen, i_nnum), stat=i_alct)
+	IF(i_alct /= 0) THEN
+	  CALL grid_error(c_error='[generate_vtu]: could not allocate values array')
+	END IF
+	i_valind= (/GRID_ucomp, GRID_vcomp, GRID_phi, GRID_zeta, GRID_tracer/)
+	CALL grid_getinfo(p_handle, r_nodevalues= r_val, i_arraypoint=i_valind)
+
+!---------- assign nodal values, but before allocate aux. arrays
+
+    ALLOCATE(r_velo(2,i_nnum), stat=i_alct)
+	IF(i_alct /= 0) THEN
+	  CALL grid_error(c_error='[generate_vtu]: could not allocate aux. velo arrays')
+	END IF
+
+!---------- generate 2D velocity field
+
+    r_velo(1:2,:)= r_val(1:2,:)
+
+    nodedata(1)%c_name = 'velocity'
+    nodedata(1)%i_size = 2
+    nodedata(1)%p_vdata => r_velo
+
+    nodedata(2)%c_name = 'height'
+    nodedata(2)%i_size = 1
+    nodedata(2)%p_vdata => r_val(3:3,:)
+
+    nodedata(3)%c_name = 'vorticity'
+    nodedata(3)%i_size = 1
+    nodedata(3)%p_vdata => r_val(4:4,:)
+
+    nodedata(4)%c_name = 'tracer'
+    nodedata(4)%i_size = 1
+    nodedata(4)%p_vdata => r_val(5:5,:)
+
+!---------- extract cells grid data
+
+	i_tnum= p_handle%i_enumfine
+	ALLOCATE(i_ids(i_tnum), i_sta(i_tnum), r_sta(1,i_tnum), r_lvl(1,i_tnum), stat=i_alct)
+	IF(i_alct /= 0) THEN
+	  CALL grid_error(c_error='[generate_vtu]: could not allocate cell value arrays')
+	END IF
+	IF(l_news) THEN
+	  CALL grid_getinfo(p_handle, i_newsdepth= i_nwl, i_elength= i_elen, &
+	    i_elementlevel= i_ids, i_elementstatus= i_sta)
+	  i_tnum= i_elen
+	ELSE
+	  CALL grid_getinfo(p_handle, i_elementlevel= i_ids, i_elementstatus= i_sta)
+	END IF
+
+    r_sta(1, :) = REAL(i_sta, GRID_SR)
+    r_lvl(1, :) = REAL(i_ids, GRID_SR)
+
+    ! Assign all values to driver
+    celldata(1)%c_name = 'status'
+    celldata(1)%i_size = 1
+    celldata(1)%p_vdata => r_sta
+
+    celldata(2)%c_name = 'level'
+    celldata(2)%i_size = 1
+    celldata(2)%p_vdata => r_lvl
+    
+    ! plot the vtu data
+    CALL plot_vtu(p_handle, c_mfile, i_nodedata = 4, p_nodedata = nodedata, &
+                  i_celldata = 2, p_celldata = celldata) !, i_zcoordinate = 4)
+
+    DEALLOCATE(i_ids, i_sta, r_sta, r_lvl, &
+               r_val, r_velo)
+
+    RETURN
+
+!---------- FORMAT
+ 10101    FORMAT(a19,a1,i6.6)
+
+  END SUBROUTINE generate_vtu
+
+END MODULE IO_vtuplot
diff --git a/flash2d/src/flash-sphere/MISC_outputdata.F90 b/flash2d/src/flash-sphere/MISC_outputdata.F90
new file mode 100644
index 0000000..8f924c0
--- /dev/null
+++ b/flash2d/src/flash-sphere/MISC_outputdata.F90
@@ -0,0 +1,155 @@
+!*****************************************************************
+!
+!> @file MISC_outputdata.F90
+!> @brief includes module MISC_outputdata
+!
+!*****************************************************************
+!
+! VERSION(S):
+!
+!*****************************************************************
+! MODULE DESCRIPTION:
+!> This module contains routines for retrieving some additional data
+!> for plotting from standard grids (no grid variables required)
+!
+MODULE MISC_outputdata
+
+  USE GRID_api
+
+  PUBLIC :: data_markededgevector, data_sfcvector
+
+  PRIVATE
+
+  CONTAINS
+!*****************************************************************
+! DESCRIPTION of [SUBROUTINE ]:
+!> @brief short description
+!>
+!> @param           p_mesh
+!> @param           r_sfc
+!
+  SUBROUTINE DATA_sfcvector(p_mesh, r_sfc)
+
+    IMPLICIT NONE
+
+    TYPE(GRID_handle), INTENT(IN)                         :: p_mesh
+    REAL(KIND=GRID_SR), INTENT(OUT), DIMENSION(:,:)       :: r_sfc
+
+    REAL(KIND=GRID_SR), DIMENSION(:,:), ALLOCATABLE       :: r_nodecoor
+    INTEGER(KIND=GRID_SI), DIMENSION(:,:), ALLOCATABLE    :: i_enodes
+
+    REAL(KIND=GRID_SR), DIMENSION(GRID_dimension)         :: r_midpoint1
+    REAL(KIND=GRID_SR), DIMENSION(GRID_dimension)         :: r_midpoint2
+
+    INTEGER(KIND=GRID_SI)                                 :: i_ecnt, i_ncnt
+!- allocate the needed memory
+    ALLOCATE( r_nodecoor(GRID_dimension, p_mesh%i_nnumber), &
+              i_enodes(GRID_elementnodes, p_mesh%i_enumfine))
+
+    CALL GRID_getinfo(p_mesh, r_nodecoordinates = r_nodecoor, &
+                      i_elementnodes = i_enodes)
+
+! initialize data
+    r_midpoint2 = 0_GRID_SR
+
+    DO i_ncnt = 1, GRID_elementnodes
+      r_midpoint2 = r_midpoint2 + r_nodecoor(:,i_enodes(i_ncnt, 1))
+    END DO
+
+    r_midpoint2 = 1_GRID_SR / REAL(GRID_elementnodes, GRID_SR) * r_midpoint2
+
+    DO i_ecnt = 1, p_mesh%i_enumfine - 1
+      r_midpoint1 = r_midpoint2
+
+      r_midpoint2 = 0_GRID_SR
+      DO i_ncnt = 1, GRID_elementnodes
+        r_midpoint2 = r_midpoint2 + r_nodecoor(:,i_enodes(i_ncnt, i_ecnt+1))
+      END DO
+
+      r_midpoint2 = 1_GRID_SR / REAL(GRID_elementnodes, GRID_SR) * r_midpoint2
+
+      r_sfc(1:GRID_dimension, i_ecnt)=r_midpoint2 - r_midpoint1
+
+      r_sfc((GRID_dimension+1), i_ecnt) = 0.0
+
+    END DO
+
+    r_sfc(:, p_mesh%i_enumfine) = 0_GRID_SR
+
+    DEALLOCATE( r_nodecoor, i_enodes )
+  END SUBROUTINE DATA_sfcvector
+
+!*****************************************************************
+! DESCRIPTION of [SUBROUTINE ]:
+!> @brief short description
+!>
+!> @param           p_mesh
+!> @param           r_mvec
+!
+  SUBROUTINE DATA_markededgevector(p_mesh, r_mvec)
+
+    IMPLICIT NONE
+
+    TYPE(GRID_handle), INTENT(IN)                         :: p_mesh
+    REAL(KIND=GRID_SR), INTENT(OUT), DIMENSION(:, :)      :: r_mvec
+
+    REAL(KIND=GRID_SR), DIMENSION(:,:), ALLOCATABLE       :: r_nodecoor
+    INTEGER(KIND=GRID_SI), DIMENSION(:,:), ALLOCATABLE    :: i_gnodes
+    INTEGER(KIND=GRID_SI), DIMENSION(:,:), ALLOCATABLE    :: i_enodes
+    INTEGER(KIND=GRID_SI), DIMENSION(:), ALLOCATABLE      :: i_emark
+    INTEGER(KIND=GRID_SI), DIMENSION(:,:), ALLOCATABLE    :: i_eedges
+
+    REAL(KIND=GRID_SR), DIMENSION(GRID_dimension)         :: r_midpoint
+    REAL(KIND=GRID_SR), DIMENSION(GRID_dimension)         :: r_egpoint
+
+    INTEGER(KIND=GRID_SI)                                 :: i_ncnt, i_ecnt
+    INTEGER(KIND=GRID_SI)                                 :: i_markededge
+
+!- allocate the needed memory
+    ALLOCATE( r_nodecoor(GRID_dimension, p_mesh%i_nnumber), &
+              i_gnodes(GRID_edgenodes, p_mesh%i_gnumfine), &
+              i_enodes(GRID_elementnodes, p_mesh%i_enumfine), &
+              i_emark(p_mesh%i_enumfine), &
+              i_eedges(GRID_elementedges, p_mesh%i_enumfine))
+
+!- get the needed information from mesh
+    CALL GRID_getinfo(p_mesh, r_nodecoordinates = r_nodecoor, &
+                      i_edgenodes = i_gnodes, &
+                      i_elementnodes = i_enodes, &
+                      i_elementmark = i_emark, &
+                      i_elementedges = i_eedges, &
+                      l_finelevel = .TRUE.)
+
+    DO i_ecnt = 1, p_mesh%i_enumfine
+      r_midpoint = 0_GRID_SR
+
+      DO i_ncnt = 1, GRID_elementnodes
+        r_midpoint = r_midpoint + r_nodecoor(:,i_enodes(i_ncnt, i_ecnt))
+      END DO
+
+      r_midpoint = 1._GRID_SR/REAL(GRID_elementnodes, GRID_SR) * r_midpoint
+
+      i_markededge = i_eedges(i_emark(i_ecnt), i_ecnt)
+
+      r_egpoint = 0_GRID_SR
+      DO i_ncnt = 1, GRID_edgenodes
+        r_egpoint = r_egpoint + r_nodecoor(:,i_gnodes(i_ncnt, i_markededge))
+      END DO
+
+      r_egpoint = 1._GRID_SR/REAL(GRID_edgenodes, GRID_SR) * r_egpoint
+
+      r_mvec(1:GRID_dimension, i_ecnt) = r_egpoint - r_midpoint
+      r_mvec((GRID_dimension+1), i_ecnt)   = 0.0
+    END DO
+
+!- deallocate
+    DEALLOCATE( r_nodecoor, &
+                i_gnodes, &
+                i_enodes, &
+                i_emark, &
+                i_eedges)
+
+  END SUBROUTINE DATA_markededgevector
+
+!*****************************************************************
+END MODULE MISC_outputdata
diff --git a/flash2d/src/flash-sphere/README b/flash2d/src/flash-sphere/README
new file mode 100644
index 0000000..2990304
--- /dev/null
+++ b/flash2d/src/flash-sphere/README
@@ -0,0 +1,48 @@
+**************************************************************************
+ FLASH90
+ FLexible Adaptive Semi-Lagrangian Hack
+ written in Fortran 90
+
+**************************************************************************
+
+ CONTENTS OF THIS DIRECTORY "$(FLASHDIR)/lib"
+
+ADV_rhs.f		- Module for calculating Right Hand Side
+ADV_rhs.gerrit		- Module for Right Hand Side (Aerosol Exper.)
+ADV_rhs.hom		- Module for Right Hand Side (homogeneous RHS)
+ADV_semilagrange.dual	- Module for SLM with dual grid approach
+ADV_semilagrange.f	- Module for SLM
+ADV_wind.bar		- Module for wind field (shear stress example)
+ADV_wind.constant	- Module for wind field (constant wind for Slotted Cyl.)
+ADV_wind.f		- Module for wind field
+ADV_wind.file		- Module for wind field (read wind field from file)
+Flash90.f		- Main program
+gridgen			- directory for the grid generator
+IO_plot.f		- Module for the plotting routines
+IO_plotdefine.f		- Module for definitions in plotting routines
+IO_utils.f		- Module for IO utility routines
+MISC_globalparam.f	- Module for global parameter definitions
+MISC_timing.f		- Module for the timing routines
+README			- this file
+SLM_errorestimate.f	- Module for the error estimation calculation
+SLM_initial.bar		- Module for the initial values (shear stress example)
+SLM_initial.f		- Module for the initial values 
+SLM_initial.file	- Module for the initial values (read from file)
+SLM_initial.gerrit	- Module for the initial values (Aerosol Exper.)
+SLM_initial.slot	- Module for the initial values (Slotted Cyl.)
+SLM_interpolation.clip	- Module for SLM interpolation (clipping)
+SLM_interpolation.cons	- Module for SLM interpolation (quasi conservative)
+SLM_interpolation.f	- Module for SLM interpolation 
+SLM_interpolation.plain	- Module for SLM interpolation (plain bicubic)
+system			- directory for system dependent routines
+utils			- directory for utility programs
+
+--------------------------------------------------------------------------
+
+ WHAT TO DO HERE:
+
+just look around, find better ways...
+
+**************************************************************************
+ j. behrens, 8/98
+**************************************************************************
diff --git a/flash2d/src/flash-sphere/SLM_advanced.f90 b/flash2d/src/flash-sphere/SLM_advanced.f90
new file mode 100644
index 0000000..140723e
--- /dev/null
+++ b/flash2d/src/flash-sphere/SLM_advanced.f90
@@ -0,0 +1,423 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_advanced
+! FUNCTION:
+!	provide advanced semi-Lagrangian routines
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_step
+! FUNCTION:
+!	one step of the basic SLM algorithm
+! SYNTAX:
+!	CALL slm_step(int, real.arr, real.arr)
+! ON INPUT:
+!	...
+! ON OUTPUT:
+!	r_tracer: array with tracer values	real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_displace
+! FUNCTION:
+!	extrapolate the alpha, values for the displacements of the upstream
+!	points from the gridpoints
+! SYNTAX:
+!	CALL slm_displace(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_coord: real array of xy-coordinates		real
+! ON OUTPUT:
+!	r_alpha: displacement vectors to each point	real
+! CALLS:
+!	wind_field
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_update
+! FUNCTION:
+!	calculate the update to the velocity
+! SYNTAX:
+!	CALL slm_update(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_rside: array with right hand side values	real
+! ON OUTPUT:
+!	r_udate: array with new (updated) gid values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is trivial for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_upstream
+! FUNCTION:
+!	calculate right hand side of the equation (upstream values)
+! SYNTAX:
+!	CALL slm_upstream(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_alpha: displacement vectors to each point	real
+! ON OUTPUT:
+!	r_rside: array with right hand side values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is just interpolation for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_interpolate
+! FUNCTION:
+!	do the interpolation
+! SYNTAX:
+!	CALL slm_interpolate(grid, int, real, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	p_ogrid: grid handle to old grid (with data)	TYPE (grid_handle)
+!	r_fac:   factor at which point to interpolate	REAL
+!	i_arlen: array length for the following arrays	INTEGER
+!	r_coord: coordinate array (new grid)		REAL
+!	r_alpha: displacement array (corr. to r_coord)	REAL
+!	r_value: values on the old grid (array)		REAL
+! ON OUTPUT:
+!	r_rside: right hand side (interpolated)		REAL
+! CALLS:
+!
+! COMMENTS:
+!	this one is plain bi-cubic spline interpolation
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_astep
+! COMMENTS:
+!
+! USES:
+!	FLASH_parameters, GRID_api, ADV_wind, ADV_rhs
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	4/2002
+!	2. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_advanced
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE GRID_api
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_astep
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_astep(p_ghand, p_param, p_time, r_modtime, i_size, &
+	                       r_coord, r_tracer, i_newsdepth)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                         :: p_param
+	  TYPE (sw_info), INTENT(inout)                             :: p_time
+	  REAL (KIND = GRID_SR), INTENT(in)                         :: r_modtime
+	  INTEGER, INTENT(in)                                       :: i_size
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_size), INTENT(out)     :: r_tracer
+	  INTEGER, OPTIONAL, INTENT(in)                             :: i_newsdepth
+	  
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE          :: r_newvl
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_alpha
+	  INTEGER                                                   :: i_alct
+
+!---------- check size!
+
+	  IF(i_size <= 0) THEN
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'INFO [slm_astep]: Zero step size, returning to calling routine'
+	    RETURN
+	  END IF
+
+!---------- allocate auxiliary arrays
+
+	  allocate(r_newvl(i_size), r_alpha(GRID_dimension,i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(38)
+	  END IF not_alloc
+
+!-SLM--------- calculate trajectory pieces (displacements)
+
+	  CALL stop_watch('start',3,p_time)
+	  CALL slm_adisplace(p_param, i_size, r_coord, r_alpha, r_time=r_modtime)
+	  CALL stop_watch('stop ',3,p_time)
+
+!-SLM--------- calculate right hand side
+
+	  CALL stop_watch('start',4,p_time)
+	  CALL slm_aupstream(p_ghand, i_size, r_coord, r_alpha, r_newvl)
+	  CALL stop_watch('stop ',4,p_time)
+
+!-SLM--------- calculate new grid values
+
+	  CALL stop_watch('start',5,p_time)
+	  CALL slm_aupdate(p_param, i_size, r_coord, r_newvl, r_tracer, r_time=r_modtime)
+	  CALL stop_watch('stop ',5,p_time)
+
+!-SLM--------- put alpha values to u and v field entries
+
+	  r_alpha= -r_alpha
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_newsdepth=i_newsdepth, i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  ELSE
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  END IF
+
+!-SLM--------- deallocate work arrays
+
+	  deallocate(r_alpha, r_newvl)
+
+	  RETURN
+	  END SUBROUTINE slm_astep
+
+!*****************************************************************
+	  SUBROUTINE slm_adisplace(p_param, i_arlen, r_coord, r_alpha, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                      :: p_param
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_alpha
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                           :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_fac, r_caf, &
+	    r_axy, r_xyc, r_sxy
+	  REAL (KIND = GRID_SR)                                                 :: r_dt0, r_dt1, &
+	    r_dt2, r_tim
+	  INTEGER                                              :: i_cnt1, i_cnt2
+          
+!---------- set constants
+
+	  r_dt0= p_param%num%r_deltatime
+	  r_dt1= 0.5_GRID_SR* p_param%num%r_deltatime
+	  r_dt2= 1.5_GRID_SR* p_param%num%r_deltatime
+	  r_fac= 0.5_GRID_SR
+	  r_caf= 2.0_GRID_SR
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- calculate in an iteration process the displacements
+
+	  unknown_loop: DO i_cnt1=1,i_arlen
+	    r_axy= 0.0_GRID_SR
+
+	    iter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_coord(:,i_cnt1)- r_fac* r_axy
+	      r_sxy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	      r_axy= sphere_correct(r_coord(:,i_cnt1),r_sxy)
+	    END DO iter_loop
+
+	    r_alpha(:,i_cnt1)= r_axy
+	  END DO unknown_loop
+
+	  RETURN
+	  END SUBROUTINE slm_adisplace
+
+!*****************************************************************
+	  SUBROUTINE slm_aupdate(p_param, i_arlen, r_coord, r_rside, r_udate, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                   :: p_param
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_udate
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                          :: r_time
+	  INTEGER                                             :: i_cnt
+	  REAL (KIND = GRID_SR)                                                :: r_dt, r_tim
+
+!---------- in the linear advection case and with f90 this is just
+
+!	  r_udate= r_rside
+
+!---------- including a non-zero right hand side, we have
+
+	  r_dt= p_param%num%r_deltatime
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+	  main_loop: DO i_cnt=1, i_arlen
+	    r_udate(i_cnt)= r_rside(i_cnt)+ r_dt* slm_righthand(r_coord(:,i_cnt))
+	  END DO main_loop
+
+	  RETURN
+	  END SUBROUTINE slm_aupdate
+
+!*****************************************************************
+	  SUBROUTINE slm_aupstream(p_mesh, i_arlen, r_coord, &
+	                          r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                     :: r_fac
+
+!---------- set factor (at which point of trajectory shall i interpolate)
+
+	  r_fac= 1.0_GRID_SR
+
+!---------- in the linear advection case this is just interpolation
+
+	  CALL slm_ainterpolate(p_mesh, r_fac, i_arlen, r_coord, &
+	                       r_alpha, r_rside)
+
+	  RETURN
+	  END SUBROUTINE slm_aupstream
+!*****************************************************************
+	  SUBROUTINE slm_ainterpolate(p_mesh, r_fac, i_arlen, &
+	                             r_coord, r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in)         :: r_fac
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE                   :: r_upstr
+	  REAL (KIND = GRID_SR)                                                :: r_eps
+	  INTEGER                                             :: i_cnt, i_alct, &
+	    i_val, i_out, i_stat
+
+!---------- initialize constant
+
+	  i_val= GRID_tracer
+	  r_eps= GRID_EPS
+
+!---------- allocate work array
+
+	  ALLOCATE(r_upstr(GRID_dimension,i_arlen), stat=i_alct)
+	  not_allocated: IF(i_alct /= 0) THEN
+	    CALL grid_error(60)
+	  END IF not_allocated
+
+!---------- calculate upstream coordinates
+
+	  dim_loop: DO i_cnt=1, GRID_dimension
+	    r_upstr(i_cnt,:) = r_coord(i_cnt,:)- r_fac(i_cnt)* r_alpha(i_cnt,:)
+	  END DO dim_loop
+
+!---------- loop over nodes: find element containing upstream point
+
+	  node_loop: DO i_cnt=1, i_arlen
+
+!---------- check if upstream value is outside of the domain
+
+	    i_out= grid_domaincheck(p_mesh(i_time), r_upstr(:,i_cnt))
+
+!---------- take the intersection of the trajectory with the boundary as new upstream point
+
+	    out_domain: IF(i_out /= 0) then
+	      r_upstr(:,i_cnt)= grid_boundintersect(p_mesh(i_time), &
+	                        r_coord(:,i_cnt), r_upstr(:,i_cnt), i_info=i_stat)
+	      no_intersect: IF(i_stat /= 0) THEN
+	        r_rside(i_cnt)= 0.0_GRID_SR
+	        CYCLE node_loop
+	      END IF no_intersect
+	    END IF out_domain
+
+!---------- interpolate
+
+	    r_rside(i_cnt)= grid_coordvalue(p_mesh(i_time), r_upstr(:,i_cnt), &
+	                    i_interpolorder=GRID_loworder, i_valpoint=i_val)
+	    small_val: IF(abs(r_rside(i_cnt)) < r_eps) THEN
+	      r_rside(i_cnt)= 0.0_GRID_SR
+	    END IF small_val
+
+	  END DO node_loop
+
+!---------- deallocate work array
+
+	  DEALLOCATE(r_upstr)
+
+	  RETURN
+	  END SUBROUTINE slm_ainterpolate
+
+!*****************************************************************
+	  FUNCTION sphere_correct(r_coord, r_displ) RESULT (r_corct)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_coord, r_displ
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_corct
+
+	  REAL (KIND = GRID_SR)                            :: r_e, r_rat
+	  REAL (KIND = GRID_SR)                            :: r_c
+
+!---------- calculate Euklidean norm
+
+	  r_e  = eukl_norm(r_displ)
+	  r_rat= r_e/ GRID_RADIUS
+
+!---------- calculate correction
+
+	  r_c  = tan(r_rat)/r_rat
+	  r_corct= r_displ* r_c
+
+	  RETURN
+	  END FUNCTION sphere_correct
+
+!*****************************************************************
+	  FUNCTION eukl_norm(r_vec) RESULT(r_rst)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_vec
+	  REAL (KIND = GRID_SR)                            :: r_rst, r_tmp
+
+!---------- calculate vector crossproduct, 3D only
+
+	  r_tmp= dot_product(r_vec, r_vec)
+	  r_rst= sqrt(r_tmp)
+
+	  END FUNCTION eukl_norm
+
+	END MODULE SLM_advanced
diff --git a/flash2d/src/flash-sphere/SLM_errorestimate.f90 b/flash2d/src/flash-sphere/SLM_errorestimate.f90
new file mode 100644
index 0000000..a29f62e
--- /dev/null
+++ b/flash2d/src/flash-sphere/SLM_errorestimate.f90
@@ -0,0 +1,144 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_errorestimate
+! FUNCTION:
+!	provide an error estimator for the adaptive SLM scheme
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_error
+! FUNCTION:
+!	estimate the error elementwise
+! SYNTAX:
+!	real= slm_error(real.arr)
+! ON INPUT:
+!	r_v:       values at element nodes	REAL
+! ON OUTPUT:
+!	r_esterr:  estimated error		REAL
+! CALLS:
+!
+! COMMENTS:
+!	this is only a simple estimator based on local gradients
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_errorest
+! FUNCTION:
+!	this hides the loop structure from the advection part
+! SYNTAX:
+!	CALL slm_errorest(grid, int, real.arr)
+! ON INPUT:
+!	p_ghand: handle for the grid		TYPE (grid_handle)
+!	i_siz:   size of array for local errors	INTEGER
+! ON OUTPUT:
+!	i_siz:   size of array for local errors	INTEGER
+!	r_arr:   estimated error		REAL
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_errorest
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	11/96
+!	2. nodal values time depend.	j. behrens	1/97
+!	3. FEM_handle added		j. behrens	7/97
+!	4. version with hashing		j. behrens	7/97
+!	5. changed to use GRID_api	j. behrens	11/97
+!	6. compliant to amatos 1.0	j. behrens	12/2000
+!	7. compliant to amatos 1.2	j. behrens	3/2002
+!       8. compliant to amatos 2.0      f. klaschka     8/2006
+!
+!*****************************************************************
+	MODULE SLM_errorestimate
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC :: slm_errorest
+	  CONTAINS
+!*****************************************************************
+	  FUNCTION slm_error(r_v) RESULT (r_esterr)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_elementnodes) :: r_v
+	  REAL (KIND = GRID_SR)                               :: r_esterr
+	  REAL (KIND = GRID_SR), PARAMETER                    :: r_1o3= (1.0/3.0)
+	  REAL (KIND = GRID_SR)                               :: r_d1, r_d2, r_d3
+
+!---------- calculate differences
+
+	  r_d1  =  abs(r_v(1)- r_v(2))
+	  r_d2  =  abs(r_v(2)- r_v(3))
+	  r_d3  =  abs(r_v(3)- r_v(1))
+
+!---------- this is the estimated error
+
+	  r_esterr= (r_d1+ r_d2+ r_d3)* r_1o3
+
+	  RETURN
+	  END FUNCTION slm_error
+
+!*****************************************************************
+	  SUBROUTINE slm_errorest(p_ghand, i_siz, r_arr)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (grid_handle), INTENT(in)  :: p_ghand
+	  INTEGER, INTENT(in)             :: i_siz
+	  REAL (KIND = GRID_SR), DIMENSION(:), INTENT(out)    :: r_arr
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE  :: r_aux
+	  INTEGER, DIMENSION(:,:), ALLOCATABLE                :: i_enods
+	  INTEGER                         :: i_cnt, i_size, i_alct, i_nnum
+	  INTEGER, DIMENSION(1)           :: i_valind
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_elementnodes) :: r_tmp
+
+!---------- allocate auxilliary array
+
+	  i_size= p_ghand%i_enumfine
+	  i_nnum= p_ghand%i_nnumber
+	  IF(i_siz /= i_size) THEN
+	    CALL grid_error(48)
+	  END IF
+
+	  ALLOCATE(r_aux(1,i_nnum), &
+	           i_enods(GRID_elementnodes,i_size), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(49)
+	  END IF
+
+!---------- get values
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_getinfo(p_ghand, l_finelevel= .TRUE., i_arraypoint=i_valind, &
+	                    r_nodevalues= r_aux, i_elementnodes=i_enods)
+
+!---------- loop through all elements of finest loop
+
+	  elmt_loop: DO i_cnt=1,i_siz
+	    r_tmp(1:GRID_elementnodes)= r_aux(1,i_enods(1:GRID_elementnodes,i_cnt))
+	    r_arr(i_cnt)= slm_error(r_tmp)
+	  END DO elmt_loop
+
+!---------- deallocate and exit
+
+	  DEALLOCATE(r_aux, i_enods)
+
+	  RETURN
+	  END SUBROUTINE slm_errorest
+
+	END MODULE SLM_errorestimate
diff --git a/flash2d/src/flash-sphere/SLM_initial.f90 b/flash2d/src/flash-sphere/SLM_initial.f90
new file mode 100644
index 0000000..2814fa4
--- /dev/null
+++ b/flash2d/src/flash-sphere/SLM_initial.f90
@@ -0,0 +1,337 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_initial
+! FUNCTION:
+!	initialize slotted cylinder for semi-Lagrangian advection
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialvalues
+! FUNCTION:
+!	initialize a grid with values
+! SYNTAX:
+!	CALL slm_initialvalues(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initslot
+! FUNCTION:
+!	initialize a grid with values of slotted cylinder test case
+! SYNTAX:
+!	CALL slm_initslot(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_analyticsolution
+! FUNCTION:
+!	calculates the 'analytic solution' to compare with in diagnostics
+! SYNTAX:
+!	CALL slm_analyticsolution(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initcylndr
+! FUNCTION:
+!	initialize a grid with values of a cylinder test case
+! SYNTAX:
+!	CALL slm_initcylndr(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_centr: coordinates of cyl. centre	REAL
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	in_side
+! FUNCTION:
+!	checks, if a given point (x,y) lies within a given triangle
+! SYNTAX:
+!	logical= in_side(real.arr, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	r_coord: coordinate array		REAL
+!	r_node1: node1 of triangle		REAL
+!	r_node2: node2 of triangle		REAL
+!	r_node3: node3 of triangle		REAL
+! ON OUTPUT:
+!	l_in:    .true. if r_coord \in p_elem	logical
+! CALLS:
+!
+! COMMENTS:
+!	this routine decides whether a point lies in or out of a
+!	triangle. this is done with the following approach:
+!	calculate the area for the given triangle and for the 
+!	three triangles resulting from drawing lines from the given
+!	point to all three triangle nodes.
+!	if the sum of the areas of those three trianlges exceeds
+!	the area of the given trianlge, the the point lies outside
+!	of it.
+!	for calculation of the areas following formula is used:
+!	(Herons formula(?))
+!
+!	A = sqrt(s* (s- a)* (s- b)* (s- c)),
+!
+!	where s= 1/2* (a+ b+ c)
+!	      a, b, c sides.
+!
+!	in order to calculate the sidelengths |x-y|= sqrt(x**2-y**2)
+!	the complex absolute value intrinsic function is used.
+!	hopefully this fuction is faster than using sqrt and
+!	power-of-two instead.
+!
+!	internally double precision is used in this function, because
+!	machine precision is crucial when a coordinate pair appears
+!	near the edge or corner of an element.
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	dc_area
+! FUNCTION:
+!	calculate area of a triangle (in a plain) in double precision
+! SYNTAX:
+!	real= dc_area(real.arr, real.arr, real.arr)
+! ON INPUT:
+!	r_coord1: node1 of triangle			REAL
+!	r_coord2: node2 of triangle			REAL
+!	r_coord3: node3 of triangle			REAL
+! ON OUTPUT:
+!	r_area:   area of triangle			REAL
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_initialvalues, slm_analyticsolution
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	7/97
+!	2. names changed		j. behrens	7/97
+!	3. changed to use GRID_api	j. behrens	11/97
+!	4. changed interfaces		j. behrens	12/97
+!	5. compliant to amatos 1.0	j. behrens	12/2000
+!	6. compliant to amatos 1.2	j. behrens	3/2002
+!       7. compliant to amatos 2.0      f. klaschka     8/2006
+!
+!*****************************************************************
+	MODULE SLM_initial
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC slm_initialvalues, slm_analyticsolution
+! 	  REAL, DIMENSION(GRID_dimension) :: r_cntr=(/ -0.25, 0.0 /)
+! 	  REAL                            :: r_hgt=4.0
+! 	  REAL                            :: r_srd=0.15
+! 	  REAL                            :: r_sln=0.22
+! 	  REAL                            :: r_swd=0.06
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_initialvalues(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  INTEGER                                    :: i_lev= 6
+
+!---------- initialize some constant for the slotted cylinder
+
+	  CALL slm_initcoshill(p_ghand)
+
+	  RETURN
+	  END SUBROUTINE slm_initialvalues
+!*****************************************************************
+	  SUBROUTINE slm_analyticsolution(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)              :: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  INTEGER, INTENT(in)                         :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)       :: r_array
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_centr
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimspherical)          :: r_sentr=(/ 0.0, 0.0 /)
+	  REAL (KIND = GRID_SR)                                        :: r_rds, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_tmp
+	  INTEGER                                                      :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE           :: r_coo
+
+!---------- calculate center ! CAUTION: THIS IS NOT IMPLEMENTED YET !!!
+
+	  r_centr= grid_geokart(r_sentr)
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(55)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- check array length
+
+	  IF(i_arlen < i_num) THEN
+	    IF(GRID_parameters%iolog > 0) THEN
+	      write(GRID_parameters%iolog,*) '[slm_analyticsolution]: Array sizes did not match, adjusting to the smaller size!'
+	    END IF
+	    i_num= i_arlen
+	  END IF
+
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_array(i_count)= coshill(r_coo(:,i_count),r_centr)
+	  END DO node_loop
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsolution
+
+!*****************************************************************
+	  SUBROUTINE slm_initcoshill(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_centr
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimspherical)         :: r_sentr=(/ 0.0, 0.0 /)
+	  REAL (KIND = GRID_SR)                                       :: r_rds, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_tmp
+	  INTEGER                                    :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_coo
+	  INTEGER (KIND = GRID_SI), DIMENSION(1)                      :: i_valind
+
+!---------- get center
+
+	  r_centr= grid_geokart(r_sentr)
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(55)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_aux(1,i_count)= coshill(r_coo(:,i_count),r_centr)
+	  END DO node_loop
+
+!---------- update grid information
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_initcoshill
+
+!*****************************************************************
+	  FUNCTION coshill(r_coor, r_centr) RESULT (r_hill)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)    :: r_coor
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)    :: r_centr
+	  REAL (KIND = GRID_SR)                               :: r_hill
+	  REAL (KIND = GRID_SR)                               :: r_maxheight=1.0
+	  REAL (KIND = GRID_SR)                               :: r_maxrad
+	  REAL (KIND = GRID_SR)                               :: r_dist, r_tmp
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)    :: r_xy
+
+!---------- initialize r_hill
+
+	  r_maxrad= GRID_RADIUS/ 6.0
+	  r_hill= 0.0
+
+!---------- calculate distance to center
+
+	  r_xy= r_centr- r_coor
+	  r_dist= DOT_PRODUCT(r_xy,r_xy)
+
+!---------- calculate inner values
+
+	  IF(r_dist < r_maxrad) THEN
+	    r_tmp = (GRID_PI* r_dist)/r_maxrad
+	    r_hill= r_maxheight *(1.0+ cos(r_tmp))
+	  END IF
+
+	  RETURN
+	  END FUNCTION coshill
+
+!*****************************************************************
+
+	END MODULE SLM_initial
+
+
+
+
diff --git a/flash2d/src/flash-sphere/SLM_simple.f90 b/flash2d/src/flash-sphere/SLM_simple.f90
new file mode 100644
index 0000000..f0bb380
--- /dev/null
+++ b/flash2d/src/flash-sphere/SLM_simple.f90
@@ -0,0 +1,424 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_simple
+! FUNCTION:
+!	provide simple semi-Lagrangian routines
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_step
+! FUNCTION:
+!	one step of the basic SLM algorithm
+! SYNTAX:
+!	CALL slm_step(int, real.arr, real.arr)
+! ON INPUT:
+!	...
+! ON OUTPUT:
+!	r_tracer: array with tracer values	real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_displace
+! FUNCTION:
+!	extrapolate the alpha, values for the displacements of the upstream
+!	points from the gridpoints
+! SYNTAX:
+!	CALL slm_displace(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_coord: real array of xy-coordinates		real
+! ON OUTPUT:
+!	r_alpha: displacement vectors to each point	real
+! CALLS:
+!	wind_field
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_update
+! FUNCTION:
+!	calculate the update to the velocity
+! SYNTAX:
+!	CALL slm_update(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_rside: array with right hand side values	real
+! ON OUTPUT:
+!	r_udate: array with new (updated) gid values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is trivial for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_upstream
+! FUNCTION:
+!	calculate right hand side of the equation (upstream values)
+! SYNTAX:
+!	CALL slm_upstream(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_alpha: displacement vectors to each point	real
+! ON OUTPUT:
+!	r_rside: array with right hand side values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is just interpolation for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_interpolate
+! FUNCTION:
+!	do the interpolation
+! SYNTAX:
+!	CALL slm_interpolate(grid, int, real, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	p_ogrid: grid handle to old grid (with data)	TYPE (grid_handle)
+!	r_fac:   factor at which point to interpolate	REAL
+!	i_arlen: array length for the following arrays	INTEGER
+!	r_coord: coordinate array (new grid)		REAL
+!	r_alpha: displacement array (corr. to r_coord)	REAL
+!	r_value: values on the old grid (array)		REAL
+! ON OUTPUT:
+!	r_rside: right hand side (interpolated)		REAL
+! CALLS:
+!
+! COMMENTS:
+!	this one is plain bi-cubic spline interpolation
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_step
+! COMMENTS:
+!
+! USES:
+!	FLASH_parameters, GRID_api, ADV_wind, ADV_rhs
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	4/2002
+!	2. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_simple
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE GRID_api
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_step
+	  CONTAINS
+
+!*****************************************************************
+	  SUBROUTINE slm_step(p_ghand, p_param, p_time, r_modtime, i_size, &
+	                       r_coord, r_tracer, i_newsdepth)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                         :: p_param
+	  TYPE (sw_info), INTENT(inout)                             :: p_time
+	  REAL (KIND = GRID_SR), INTENT(in)                         :: r_modtime
+	  INTEGER, INTENT(in)                                       :: i_size
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_size), INTENT(out)     :: r_tracer
+	  INTEGER, OPTIONAL, INTENT(in)                             :: i_newsdepth
+	  
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE          :: r_newvl
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_alpha
+	  INTEGER                                                   :: i_alct
+
+!---------- check size!
+
+	  IF(i_size <= 0) THEN
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'INFO [slm_step]: Zero step size, returning to calling routine'
+	    RETURN
+	  END IF
+
+!---------- allocate auxiliary arrays
+
+	  allocate(r_newvl(i_size), r_alpha(GRID_dimension,i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(38)
+	  END IF not_alloc
+
+!-SLM--------- calculate trajectory pieces (displacements)
+
+	  CALL stop_watch('start',3,p_time)
+	  CALL slm_displace(p_param, i_size, r_coord, r_alpha, r_time=r_modtime)
+	  CALL stop_watch('stop ',3,p_time)
+
+!-SLM--------- calculate right hand side
+
+	  CALL stop_watch('start',4,p_time)
+	  CALL slm_upstream(p_ghand, i_size, r_coord, r_alpha, r_newvl)
+	  CALL stop_watch('stop ',4,p_time)
+
+!-SLM--------- calculate new grid values
+
+	  CALL stop_watch('start',5,p_time)
+	  CALL slm_update(p_param, i_size, r_coord, r_newvl, r_tracer, r_time=r_modtime)
+	  CALL stop_watch('stop ',5,p_time)
+
+!-SLM--------- put alpha values to u and v field entries
+
+	  r_alpha= -r_alpha
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_newsdepth=i_newsdepth, i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  ELSE
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  END IF
+
+!-SLM--------- deallocate work arrays
+
+	  deallocate(r_alpha, r_newvl)
+
+	  RETURN
+	  END SUBROUTINE slm_step
+
+!*****************************************************************
+	  SUBROUTINE slm_displace(p_param, i_arlen, r_coord, r_alpha, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                      :: p_param
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_alpha
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                           :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_fac, r_caf, &
+	    r_axy, r_xyc, r_sxy
+	  REAL (KIND = GRID_SR)                                                 :: r_dt0, r_dt1, &
+	    r_dt2, r_tim
+	  INTEGER                                              :: i_cnt1, i_cnt2
+          
+!---------- set constants
+ 
+ 	  r_dt0= p_param%num%r_deltatime
+	  r_dt1= 0.5* p_param%num%r_deltatime
+	  r_dt2= 1.5* p_param%num%r_deltatime
+	  r_fac= 0.5
+	  r_caf= 2.0
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0
+	  END IF
+
+!---------- calculate in an iteration process the displacements
+
+	  unknown_loop: DO i_cnt1=1,i_arlen
+	    r_axy= 0.0
+
+	    iter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_coord(:,i_cnt1)- r_fac* r_axy
+	      r_sxy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	      r_axy= sphere_correct(r_coord(:,i_cnt1),r_sxy)
+	    END DO iter_loop
+
+	    r_alpha(:,i_cnt1)= r_axy
+	  END DO unknown_loop
+
+	  RETURN
+	  END SUBROUTINE slm_displace
+
+!*****************************************************************
+	  SUBROUTINE slm_update(p_param, i_arlen, r_coord, r_rside, r_udate, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                   :: p_param
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_udate
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                          :: r_time
+	  INTEGER                                             :: i_cnt
+	  REAL (KIND = GRID_SR)                                                :: r_dt, r_tim
+
+!---------- in the linear advection case and with f90 this is just
+
+!	  r_udate= r_rside
+
+!---------- including a non-zero right hand side, we have
+
+	  r_dt= p_param%num%r_deltatime
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0
+	  END IF
+
+	  main_loop: DO i_cnt=1, i_arlen
+	    r_udate(i_cnt)= r_rside(i_cnt)+ r_dt* slm_righthand(r_coord(:,i_cnt))
+	  END DO main_loop
+
+	  RETURN
+	  END SUBROUTINE slm_update
+
+!*****************************************************************
+	  SUBROUTINE slm_upstream(p_mesh, i_arlen, r_coord, &
+	                          r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                     :: r_fac
+
+!---------- set factor (at which point of trajectory shall i interpolate)
+
+	  r_fac= 1.0
+
+!---------- in the linear advection case this is just interpolation
+
+	  CALL slm_interpolate(p_mesh, r_fac, i_arlen, r_coord, &
+	                       r_alpha, r_rside)
+
+	  RETURN
+	  END SUBROUTINE slm_upstream
+!*****************************************************************
+	  SUBROUTINE slm_interpolate(p_mesh, r_fac, i_arlen, &
+	                             r_coord, r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in)         :: r_fac
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE                   :: r_upstr
+	  REAL (KIND = GRID_SR)                                                :: r_eps
+	  INTEGER                                             :: i_cnt, i_alct, &
+	    i_val, i_out, i_stat
+
+!---------- initialize constant
+
+	  i_val= GRID_tracer
+	  r_eps= GRID_EPS
+
+!---------- allocate work array
+
+	  ALLOCATE(r_upstr(GRID_dimension,i_arlen), stat=i_alct)
+	  not_allocated: IF(i_alct /= 0) THEN
+	    CALL grid_error(60)
+	  END IF not_allocated
+
+!---------- calculate upstream coordinates
+
+	  dim_loop: DO i_cnt=1, GRID_dimension
+	    r_upstr(i_cnt,:) = r_coord(i_cnt,:)- r_fac(i_cnt)* r_alpha(i_cnt,:)
+	  END DO dim_loop
+
+!---------- loop over nodes: find element containing upstream point
+
+	  node_loop: DO i_cnt=1, i_arlen
+
+!---------- check if upstream value is outside of the domain
+
+	    i_out= grid_domaincheck(p_mesh(i_time), r_upstr(:,i_cnt))
+
+!---------- take the intersection of the trajectory with the boundary as new upstream point
+
+	    out_domain: IF(i_out /= 0) then
+	      r_upstr(:,i_cnt)= grid_boundintersect(p_mesh(i_time), &
+	                        r_coord(:,i_cnt), r_upstr(:,i_cnt), i_info=i_stat)
+	      no_intersect: IF(i_stat /= 0) THEN
+	        r_rside(i_cnt)= 0.0
+	        CYCLE node_loop
+	      END IF no_intersect
+	    END IF out_domain
+
+!---------- interpolate
+
+	    r_rside(i_cnt)= grid_coordvalue(p_mesh(i_time), r_upstr(:,i_cnt), &
+	                    i_interpolorder=GRID_loworder, i_valpoint=i_val)
+	    small_val: IF(abs(r_rside(i_cnt)) < r_eps) THEN
+	      r_rside(i_cnt)= 0.0
+	    END IF small_val
+
+	  END DO node_loop
+
+!---------- deallocate work array
+
+	  DEALLOCATE(r_upstr)
+
+	  RETURN
+	  END SUBROUTINE slm_interpolate
+
+!*****************************************************************
+	  FUNCTION sphere_correct(r_coord, r_displ) RESULT (r_corct)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_coord, r_displ
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_corct
+
+	  REAL (KIND = GRID_SR)                            :: r_e, r_rat
+	  REAL (KIND = GRID_SR)                            :: r_c
+
+!---------- calculate Euklidean norm
+
+	  r_e  = eukl_norm(r_displ)
+	  r_rat= r_e/ GRID_RADIUS
+
+!---------- calculate correction
+
+	  r_c  = tan(r_rat)/r_rat
+	  r_corct= r_displ* r_c
+
+	  RETURN
+	  END FUNCTION sphere_correct
+
+!*****************************************************************
+	  FUNCTION eukl_norm(r_vec) RESULT(r_rst)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_vec
+	  REAL (KIND = GRID_SR)                            :: r_rst, r_tmp
+
+!---------- calculate vector crossproduct, 3D only
+
+	  r_tmp= dot_product(r_vec, r_vec)
+	  r_rst= sqrt(r_tmp)
+
+	  END FUNCTION eukl_norm
+
+	END MODULE SLM_simple
diff --git a/flash2d/src/flash/ADV_rhs.f90 b/flash2d/src/flash/ADV_rhs.f90
new file mode 100644
index 0000000..546b4cd
--- /dev/null
+++ b/flash2d/src/flash/ADV_rhs.f90
@@ -0,0 +1,76 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	ADV_rhs
+! FUNCTION:
+!	calculate the (nonhomogeneous) right hand side
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_righthand
+! FUNCTION:
+!	calculate the rhs of the advection equation
+! SYNTAX:
+!	real= slm_righthand(real.arr, real)
+! ON INPUT:
+!	r_coord: coordinates of point		real
+!	r_time:  time coordinate (optional)	real
+! ON OUTPUT:
+!	r_rhs:   right hand side value		real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!
+! COMMENTS:
+!	this is the homogeneous case!
+! USES:
+!	MISC_globalparam, MISC_error
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	2/98
+!	2. compliant to amatos 1.0	j. behrens	12/2000
+!	3. compliant to amatos 1.2	j. behrens	3/2002
+!
+!*****************************************************************
+	MODULE ADV_rhs
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC :: slm_righthand
+	  CONTAINS
+!*****************************************************************
+	  FUNCTION slm_righthand(r_coord, r_time) RESULT (r_rhs)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                  :: r_time
+	  REAL (KIND = GRID_SR)                                        :: r_rhs
+	  REAL (KIND = GRID_SR)                                        :: r_tim
+
+!---------- set time
+
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0
+	  END IF
+
+!---------- calculate the advection at (x,y) (velocity increasing)
+
+	  r_rhs= 0.0
+	
+	  RETURN
+	  END FUNCTION slm_righthand
+
+!*****************************************************************
+	END MODULE ADV_rhs
diff --git a/flash2d/src/flash/ADV_semilagrange.F90 b/flash2d/src/flash/ADV_semilagrange.F90
new file mode 100644
index 0000000..eaf4620
--- /dev/null
+++ b/flash2d/src/flash/ADV_semilagrange.F90
@@ -0,0 +1,850 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	ADV_semilagrange
+! FUNCTION:
+!	perform semi-Lagrangian advection
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_adapt
+! FUNCTION:
+!	adapt the grid according to an error estimate
+! SYNTAX:
+!	CALL slm_adapt(grid, param, logical)
+! ON INPUT:
+!	p_ghand:   handle for the grid		TYPE (grid_handle)
+!	p_param:   global parameter structure	TYPE (global_param)
+! ON OUTPUT:
+!	l_changed: flag for changed grid	LOGICAL
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialize
+! FUNCTION:
+!	initialize the advection problem
+! SYNTAX:
+!	CALL slm_initialize(grid, param)
+! ON INPUT:
+!	p_param: parameter data structure	TYPE (global_param)
+! ON OUTPUT:
+!	p_ghand: grid handling data structure	TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_finish
+! FUNCTION:
+!	terminate slm (free dynamically alloc. memory, ...)
+! SYNTAX:
+!	CALL slm_finish(grid, param)
+! ON INPUT:
+!	p_ghand: grid handling data structure	TYPE (grid_handle)
+!	p_param: parameter data structure	TYPE (global_param)
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_timestepping
+! FUNCTION:
+!	perform the timestepping in the slm
+! SYNTAX:
+!	CALL slm_timestepping(grid, param, cmd)
+! ON INPUT:
+!	p_ghand: grid handling data structure	TYPE (grid_handle)
+!	p_param: parameter data structure	TYPE (global_param)
+!	p_cmdln: command line argument struct.	TYPE (cmdline)
+! ON OUTPUT:
+!	p_ghand: grid handling data structure	TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_displace, slm_update, slm_upstream
+!	slm_initialize, slm_finish, slm_timestepping
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, FEM_handle
+!	FEM_errorestimate, FEM_param
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	10/96
+!	2. several improvements/fixes	j. behrens	11/96-1/97
+!	3. nodal values time depend.	j. behrens	1/97
+!	4. stop_watch removed, plot	j. behrens	1/97
+!	   (position) changed, inner
+!	   iteration counter added
+!	5. slm_adapt changed 		j. behrens	2/97
+!	6. slm_adapt changed to hide
+!	   grid data structures		j. behrens	7/97
+!	7. control data structure	j. behrens	12/97
+!	8. non-homog. rhs added		j. behrens	2/98
+!	9. compliant to amatos 1.0	j. behrens	12/2000
+!	10. compliant to amatos 1.2	j. behrens	3/2002
+!	11. compliant to amatos 2.0	j. behrens	7/2003
+!       12. added visnetplot            f. klaschka     12/2003
+!
+!*****************************************************************
+	MODULE ADV_semilagrange
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE IO_vtuplot
+#ifndef NO_NETCDF
+	  USE IO_netcdfplot
+#endif
+	  USE IO_utils
+	  USE GRID_api
+	  USE SLM_errorestimate
+	  USE SLM_initial
+	  USE SLM_simple
+	  USE SLM_advanced
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_initialize, slm_finish, slm_timestepping
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_adapt(p_ghand, p_param, l_changed, l_water)
+
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (grid_handle), INTENT(inout)      :: p_ghand
+	  TYPE (control_struct), INTENT(in)      :: p_param
+	  LOGICAL, INTENT(out)                   :: l_changed
+	  LOGICAL, OPTIONAL, INTENT(in)          :: l_water
+	  LOGICAL                                :: l_switch
+	  REAL (KIND = GRID_SR)                                   :: r_errmx, &
+	    r_refcrit, r_crscrit, r_fac
+	  INTEGER                                :: i_size, &
+	    i_manyc, i_manyr, i_alct, i_cnt
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE        :: r_aux1
+	  INTEGER, DIMENSION(:), ALLOCATABLE     :: i_aux1, i_aux2, i_aux3
+	  LOGICAL                                :: l_ref, l_crs
+
+!---------- initialize refinement flag
+
+	  l_changed= .FALSE.
+
+!---------- handle watermark switch
+
+	  wat_present: IF(present(l_water)) THEN
+	    l_switch= l_water
+	  ELSE wat_present
+	    l_switch= .TRUE.
+	  END IF wat_present
+
+!---------- allocate work arrays
+
+	  i_size= p_ghand%i_enumfine
+	  allocate(r_aux1(i_size), i_aux1(i_size), i_aux2(i_size), &
+                   i_aux3(i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(35)
+	  END IF not_alloc
+
+!---------- estimate the local error
+
+	  CALL slm_errorest(p_ghand, i_size, r_aux1)
+
+!---------- set coarsening/refinement criterion
+
+	  r_errmx= maxval(r_aux1(1:i_size))
+	  r_crscrit= r_errmx* p_param%num%r_crstolerance
+	  r_refcrit= r_errmx* p_param%num%r_reftolerance
+
+!---------- get level information and set up flags for refinement/coarsening
+
+	  CALL grid_getinfo(p_ghand, l_finelevel= .TRUE., i_elementlevel= i_aux1, &
+	                    i_elementstatus= i_aux3)
+	  DO i_cnt=1,i_size
+	    i_aux2(i_cnt)= 0
+	    IF((i_aux1(i_cnt) > p_param%num%i_crslevel) .AND. &
+	       (r_aux1(i_cnt) < r_crscrit)) i_aux2(i_cnt)= GRID_pleasecoarse
+	    IF((i_aux1(i_cnt) < p_param%num%i_reflevel) .AND. &
+	       (r_aux1(i_cnt) > r_refcrit)) i_aux2(i_cnt)= GRID_pleaserefine
+	  END DO
+
+!---------- determine if there is enough to be done (this can be
+!           switched off by l_water=.FALSE.)
+
+	  IF(l_switch) THEN
+	    i_manyr= count(i_aux2 == GRID_pleaserefine)
+	    r_fac= real(i_manyr,GRID_SR)/ real(i_size,GRID_SR)
+	    enough_ref: IF(r_fac > p_param%num%r_refwatermark) THEN
+	      l_ref= .TRUE.
+	    ELSE
+	      l_ref= .FALSE.
+	    END IF enough_ref
+
+	    i_manyc= count(i_aux2 == GRID_pleasecoarse)
+	    r_fac= real(i_manyc,GRID_SR)/ real(i_size,GRID_SR)
+	    enough_crs: IF(r_fac > p_param%num%r_crswatermark) THEN
+	      l_crs= .TRUE.
+	    ELSE
+	      l_crs= .FALSE.
+	    END IF enough_crs
+	  ELSE
+	    l_ref= .TRUE.
+	    l_crs= .TRUE.
+	  END IF
+
+!---------- update grid flags
+
+	  update: IF(l_ref .OR. l_crs) THEN
+	    IF(l_ref) i_aux3= merge(i_aux2, i_aux3, i_aux2==GRID_pleaserefine)
+	    IF(l_crs) i_aux3= merge(i_aux2, i_aux3, i_aux2==GRID_pleasecoarse)
+	    CALL grid_putinfo(p_ghand, l_finelevel= .TRUE., i_elementstatus= i_aux3)
+	  END IF update
+
+!---------- deallocate work arrays
+
+	  deallocate(r_aux1, i_aux1, i_aux2, i_aux3)
+
+!---------- adapt the grid
+
+	  CALL grid_adapt(p_ghand, l_changed)
+
+	  RETURN
+	  END SUBROUTINE slm_adapt
+
+!*****************************************************************
+	  SUBROUTINE slm_diagnostics(p_ghand, p_param, p_tinfo, c_action)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (grid_handle), INTENT(in)           :: p_ghand
+	  TYPE (control_struct), INTENT(inout)     :: p_param
+	  TYPE (rt_info), INTENT(in)               :: p_tinfo
+	  CHARACTER (len=4), INTENT(in), OPTIONAL  :: c_action
+	  INTEGER, SAVE                            :: i_iodiag
+	  CHARACTER (len=32)                       :: c_file
+	  CHARACTER (len=28)                       :: c_tmp
+	  REAL (KIND = GRID_SR), PARAMETER                          :: r_1o3= (1./3.)
+	  INTEGER                                  :: i_fst, i_tmp, &
+	    i_size, i_alct, i_1, i_2, i_3, i_4, i_5, i_6
+	  REAL (KIND = GRID_SR), SAVE                               :: r_rfm0, r_rsm0
+	  REAL (KIND = GRID_SR)                                     :: r_dispn, r_rfm, r_rsm, &
+	    r_ts, r_calci, r_calcs, r_mxnrm, r_l2nrm, r_max, r_min, r_diffn, &
+	    r_medln
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE          :: r_aux1, r_aux2, &
+	    r_aux3, r_aux4
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_auxx
+	  INTEGER, DIMENSION(1)                    :: i_valind
+
+!---------- action init
+
+	  present_act: IF(present(c_action)) THEN
+	    action_type: IF(c_action == 'init') THEN
+
+!---------- open file for diagnostic output
+
+	      i_iodiag= 9
+	      i_tmp   = p_param%num%i_experiment
+	      write(c_tmp,*) trim(GRID_parameters%program_name), '_diag.'
+	      write(c_file,1010) trim(c_tmp), i_tmp
+	      c_file= adjustl(c_file)
+	      open(i_iodiag, file= c_file, action= 'write', form= 'formatted', &
+	           iostat= i_fst)
+	      not_opened: IF(i_fst /= 0) THEN
+	        CALL grid_error(36)
+	      END IF not_opened
+	      IF(GRID_parameters%iolog > 0) &
+	        write(GRID_parameters%iolog,*) 'INFO: Filename: ', c_file, ' opened on unit: ', i_iodiag
+
+!---------- allocate workspace
+
+	      i_size= p_ghand%i_nnumber
+	      allocate(r_aux1(i_size), r_aux2(i_size), r_aux3(i_size), &
+	               r_aux4(i_size), r_auxx(1,i_size), stat=i_alct)
+	      not_alloc: IF(i_alct /= 0) THEN
+	        CALL grid_error(37)
+	      END IF not_alloc 
+	      r_aux1= 0.0; r_aux2= 0.0; r_aux3= 0.0; r_aux4= 0.0
+
+!---------- get minimum edge length
+
+	      CALL grid_edgelength(p_ghand, r_min=r_medln)
+
+!---------- calculate reference values, ... extract actual calculated concentration
+
+	      i_valind= (/ GRID_tracer /)
+	      CALL grid_getinfo(p_ghand, i_arraypoint=i_valind, &
+	                        r_nodevalues= r_auxx)
+	      r_aux1(:)= r_auxx(1,:)
+	      DEALLOCATE(r_auxx)
+
+!---------- calculate area pieces for each node
+
+	      CALL grid_nodearea(p_ghand, i_size, r_aux2)
+
+!---------- calculate analytical solution
+
+	      r_ts= p_param%num%r_deltatime* float(p_tinfo%i_step)
+	      CALL slm_analyticsolution(p_ghand, r_ts, i_size, r_aux3)
+
+!---------- now the integral of the concentration (mass) is
+
+	      r_calci= dot_product(r_aux1, r_aux2)
+	      r_rfm0 = r_calci
+
+!---------- the integral of the squared concentration ("entropy"(?)) is
+
+	      r_aux4 = r_aux1* r_aux1
+	      r_calcs= dot_product(r_aux4, r_aux2)
+	      r_rsm0 = r_calcs
+
+!---------- the maximum-norm of the error is
+
+	      r_aux4 = abs(r_aux1- r_aux3)
+	      r_mxnrm= maxval(r_aux4)
+
+!---------- the l2-norm of the error is
+
+	      r_aux4 = r_aux4* r_aux4
+	      r_l2nrm= dot_product(r_aux4, r_aux2)
+
+!---------- maximum and minimum
+
+	      r_max  = maxval(r_aux1)
+	      r_min  = minval(r_aux1)
+
+!---------- diffusion and dispersion (not yet implemented)
+
+	      r_diffn= 0.0
+	      r_dispn= 0.0
+
+!---------- print it
+
+	      r_rfm= r_calci/r_rfm0
+	      r_rsm= r_calcs/r_rsm0
+	      write(i_iodiag,1100) GRID_parameters%program_name, GRID_parameters%version, &
+	                           GRID_parameters%subversion, GRID_parameters%patchversion
+	      i_1= p_tinfo%i_step
+	      i_2= p_ghand%i_enumber
+	      i_3= p_ghand%i_enumfine
+	      i_4= p_ghand%i_gnumber
+	      i_5= p_ghand%i_gnumfine
+	      i_6= p_ghand%i_nnumber
+	      write(i_iodiag,1000) i_1, i_2, i_3, i_4, i_5, i_6, r_min, r_max, &
+	                           r_rfm, r_rsm, r_mxnrm, r_l2nrm, r_diffn, &
+				   r_dispn, r_medln
+
+!---------- deallocate workspace
+
+	      deallocate(r_aux1, r_aux2, r_aux3, r_aux4)
+
+!---------- initialization done
+
+	      RETURN
+
+!---------- action quit
+
+	    ELSE IF(c_action == 'quit') THEN action_type
+
+!---------- close diagnostic output file
+
+	      close(i_iodiag)
+ 	      IF(GRID_parameters%iolog > 0) &
+	        write(GRID_parameters%iolog,*) 'INFO: Closed file on unit: ', i_iodiag
+
+!---------- action quit done
+
+	      RETURN
+	    END IF action_type
+	  END IF present_act
+
+!---------- action diag (default): allocate workspace
+
+	  i_size= p_ghand%i_nnumber
+	  allocate(r_aux1(i_size), r_aux2(i_size), r_aux3(i_size), &
+	           r_aux4(i_size), r_auxx(1,i_size), stat=i_alct)
+	  not_allc: IF(i_alct /= 0) THEN
+	    CALL grid_error(37)
+	  END IF not_allc 
+	  r_aux1= 0.0; r_aux2= 0.0; r_aux3= 0.0; r_aux4= 0.0
+
+!---------- get minimum edge length
+
+	  CALL grid_edgelength(p_ghand, r_min=r_medln)
+
+!---------- calculate reference values, ... extract actual calculated concentration
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_getinfo(p_ghand, i_arraypoint=i_valind, &
+	  		   r_nodevalues= r_auxx)
+	  r_aux1(:)= r_auxx(1,:)
+	  DEALLOCATE(r_auxx)
+
+!---------- calculate area pieces for each node
+
+	  CALL grid_nodearea(p_ghand, i_size, r_aux2)
+
+!---------- calculate analytical solution
+
+	  r_ts= p_param%num%r_deltatime* float(p_tinfo%i_step)
+	  CALL slm_analyticsolution(p_ghand, r_ts, i_size, r_aux3)
+
+!---------- now the integral of the concentration (mass) is
+
+	  r_calci= dot_product(r_aux1, r_aux2)
+
+!---------- the integral of the squared concentration ("entropy"(?)) is
+
+	  r_aux4 = r_aux1* r_aux1
+	  r_calcs= dot_product(r_aux4, r_aux2)
+
+!---------- the maximum-norm of the error is
+
+	  r_aux4 = abs(r_aux1- r_aux3)
+	  r_mxnrm= maxval(r_aux4)
+
+!---------- the l2-norm of the error is
+
+	  r_aux4 = r_aux4* r_aux4
+	  r_l2nrm= dot_product(r_aux4, r_aux2)
+
+!---------- maximum and minimum
+
+	  r_max  = maxval(r_aux1)
+	  r_min  = minval(r_aux1)
+
+!---------- diffusion and dispersion (not yet implemented)
+
+	  r_diffn= 0.0
+	  r_dispn= 0.0
+
+!---------- print it
+
+	  r_rfm= r_calci/r_rfm0
+	  r_rsm= r_calcs/r_rsm0
+	  i_1= p_tinfo%i_step
+	  i_2= p_ghand%i_enumber
+	  i_3= p_ghand%i_enumfine
+	  i_4= p_ghand%i_gnumber
+	  i_5= p_ghand%i_gnumfine
+	  i_6= p_ghand%i_nnumber
+	  write(i_iodiag,1000) i_1, i_2, i_3, i_4, i_5, i_6, r_min, r_max, &
+	                       r_rfm, r_rsm, r_mxnrm, r_l2nrm, r_diffn, &
+	                       r_dispn, r_medln
+
+!---------- deallocate workspace
+
+	  deallocate(r_aux1, r_aux2, r_aux3, r_aux4)
+
+	  RETURN
+ 1000	  FORMAT(1x, i10, 1x, i10, 1x, i10, 1x, i10, 1x, i10, 1x, i10, &
+	         1x, e15.8, 1x, e15.8, 1x, e15.8, 1x, e15.8,&
+	         1x, e15.8, 1x, e15.8, 1x, e15.8, 1x, e15.8,&
+	         1x, e15.8)
+ 1010	  FORMAT(a28,i4.4)
+ 1100	  FORMAT(1x,'*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '*************************************',/ &
+	         1x,'***** PROGRAM: ',a15,174x,'*****',/ &
+	         1x,'***** VERSION: ',i2.2,'.',i2.2,'.',i2.2,181x,'*****',/ &
+	         1x,'***** Diagnostic output ',180x,'*****',/ &
+	         1x,'*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '*************************************',/ &
+	         1x,'* timestep ','  elements ','  fine el. ','     edges ', &
+	            '  fine ed. ','     nodes ','        minimum ', &
+	            '        maximum ','            RFM ','            RSM ', &
+                    '       max-norm ','        l2-norm ','      diffusion ', &
+	            '     dispersion ',' min.edge len.*',/ &
+	         1x,'*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '******************************************', &
+	            '**************************************')
+	  END SUBROUTINE slm_diagnostics
+
+!*****************************************************************
+	  SUBROUTINE slm_initialize(p_ghand, p_param)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(out) :: p_ghand
+	  TYPE (control_struct), INTENT(inout)          :: p_param
+
+	  INTEGER                                     :: i_steps
+	  CHARACTER (len=32)                          :: c_file
+	  CHARACTER (len=28)                          :: c_tmp
+	  INTEGER                                     :: i_tmp, i_cnt
+	  LOGICAL                                     :: l_refined
+	  INTEGER                                     :: i_vertnum
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER               :: r_vertinit
+
+!---------- decide whether a new experiment is startet or an old one is continued
+
+	  new_experiment: IF(p_param%num%i_experiment <= 0) THEN
+
+!---------- reset timesteps (start with 1 in any case)
+
+	    time_one: IF(p_param%num%i_frsttimestep /= 1) THEN
+	      IF(GRID_parameters%iolog > 0) &
+	        write(GRID_parameters%iolog,*) 'WARNING      : Timestep counters reset due to new experiment'
+	      i_steps= p_param%num%i_lasttimestep- p_param%num%i_frsttimestep
+	      p_param%num%i_frsttimestep= 1
+	      p_param%num%i_lasttimestep= p_param%num%i_frsttimestep+ i_steps
+	    END IF time_one
+
+!---------- initialize grid parameters
+
+	    CALL grid_setparameter(p_ghand, i_coarselevel= p_param%num%i_crslevel, &
+	                           i_finelevel= p_param%num%i_reflevel)
+
+!---------- define domain, first read data from file (compiled here)
+
+	    CALL grid_readdomain(i_vertnum, r_vertinit, c_readfile=p_param%io%c_domainfile)
+	    CALL grid_definegeometry(i_vertnum, r_vertexarr= r_vertinit)
+
+!---------- create initial triangulation
+
+	    CALL grid_createinitial(p_ghand, c_filename=p_param%io%c_triangfile)
+
+!---------- initialize grid and adapt at steep gradients
+
+	    i_cnt= 0
+	    l_refined= .TRUE.
+	    refine_loop: DO WHILE (l_refined)
+	      CALL slm_initialvalues(p_ghand(i_timeplus))
+	      CALL slm_adapt(p_ghand(i_timeplus), p_param, l_refined, &
+	                     l_water=.FALSE.)
+	    END DO refine_loop
+
+!---------- duplicate grid (old time)
+
+	    CALL grid_timeduplicate(p_ghand(i_timeplus), p_ghand(i_time))
+
+!---------- initialize wind field calculation
+
+	    CALL slm_windinit(p_param)
+
+!---------- if an old experiment is to be continued from stored data:
+
+	  ELSE new_experiment
+
+!---------- create grid from saveset, first compile filename
+
+	    i_tmp= p_param%num%i_experiment- 1
+	    write(c_tmp,*) trim(GRID_parameters%program_name), '_save.'
+	    write(c_file,1010) trim(c_tmp), i_tmp
+	    c_file= adjustl(c_file)
+
+	    CALL grid_readinitial(p_ghand, c_file)
+
+!---------- initialize wind field calculation
+
+	    CALL slm_windinit(p_param)
+
+	  END IF new_experiment
+
+	  RETURN
+ 1010	  FORMAT(a28,i4.4)
+	  END SUBROUTINE slm_initialize
+
+!*****************************************************************
+	  SUBROUTINE slm_finish(p_ghand, p_param)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                          :: p_param
+	  CHARACTER (len=32)                                       :: c_file
+	  CHARACTER (len=28)                                       :: c_tmp
+	  INTEGER                                                  :: i_tmp
+
+!---------- open and write saveset, if required
+
+	  save_req: IF(p_param%io%i_savelast /= 0) THEN
+
+	    i_tmp= p_param%num%i_experiment
+	    write(c_tmp,*) trim(GRID_parameters%program_name), '_save.'
+	    write(c_file,1010) trim(c_tmp), i_tmp
+	    c_file= adjustl(c_file)
+	    CALL grid_writesaveset(c_file, p_ghand)
+
+!---------- write parameter file for next experiment
+
+	    CALL io_putinputfile(p_param)
+	  END IF save_req
+
+!---------- gracefully terminate wind field calculations
+
+	  CALL slm_windquit
+
+	  RETURN
+ 1010	  FORMAT(a28,i4.4)
+	  END SUBROUTINE slm_finish
+
+!*****************************************************************
+	  SUBROUTINE slm_timestepping(p_ghand, p_param)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  INTEGER, PARAMETER                   :: i_innermax=15
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), &
+	                      INTENT(inout)    :: p_ghand
+	  TYPE (control_struct), INTENT(inout) :: p_param
+	  INTEGER                              :: i_timecount
+	  TYPE (sw_info)                       :: p_time, p_timeaux
+	  LOGICAL                              :: l_refined
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE      :: r_tracer
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_coord, r_aux
+	  CHARACTER (len=32)                   :: c_file, c_matfile
+	  CHARACTER (len=28)                   :: c_tmp
+	  INTEGER                              :: i_tmp, &
+	    i_size, i_alct, i_tst, i_fst
+	  INTEGER                              :: i_iomatl=21
+	  REAL (KIND = GRID_SR)                :: r_modtime
+          INTEGER                              :: i_loopquit
+	  INTEGER                              :: i_newlen
+	  INTEGER, DIMENSION(1)                :: i_valind
+		
+!---------- VISNET variable init
+
+		i_loopquit = 0
+		
+!---------- initialize timestep info structure
+
+	  p_timestepinfo%i_step       = 0
+	  p_timestepinfo%i_adapit     = 0
+	  p_timestepinfo%l_ploted     = .FALSE.
+	  p_timestepinfo%l_saved      = .FALSE.
+	  p_timestepinfo%r_modeltime  = 0.0
+
+!---------- initialize timing structure
+
+	  p_time%p_tim%r_tim   = 0.0
+	  p_time%p_tim%r_lap   = 0.0
+	  p_time%p_tim%c_tim   = '                '
+	  p_timeaux%p_tim%r_tim= 0.0
+	  p_timeaux%p_tim%r_lap= 0.0
+	  p_timeaux%p_tim%c_tim= '                '
+
+!---------- initialize stop watches
+
+	  CALL stop_watch_init(1,(/'total time      '/),p_timeaux)
+	  CALL stop_watch_init(8,(/'plotting        ', 'grid duplication', &
+	                           'trajectory calc.', 'right hand side ', &
+	                           'grid value updt.', 'grid adaption   ', &
+	                           'diagnostics     ', 'whole timestep  '/), p_time)
+	                           
+!---------- if diagnostics are demanded, initialize diagnostical output
+
+	  IF(p_param%io%l_diagnostics) THEN
+	    p_timestepinfo%i_step= 0
+	    CALL slm_diagnostics(p_grid(i_timeplus), p_param, p_timestepinfo, c_action='init')
+	  END IF
+
+!---------- plot initial data
+
+	  i_timecount= 0
+#ifndef NO_NETCDF
+	  IF(p_param%io%l_netcdf) THEN
+	    CALL plot_netcdf(p_ghand(i_timeplus), i_time=i_timecount)
+      END IF
+#endif
+	  IF(p_param%io%l_vtu) THEN
+	    CALL generate_vtu(p_ghand(i_timeplus), i_time=i_timecount)
+	  END IF
+!---------- put out initial information
+
+	  CALL io_putruntimeinfo(p_ghand(i_timeplus), p_timestepinfo, p_time)
+
+!---------- timestep loop
+
+      CALL stop_watch('start',1,p_timeaux)
+      CALL stop_watch('start',8,p_time)
+      i_timecount = 0_GRID_SI
+      p_timestepinfo%r_modeltime = p_param%num%r_starttime
+      time_loop: DO WHILE (p_timestepinfo%r_modeltime < p_param%num%r_finaltime - p_param%num%r_deltatime)
+        i_timecount                = i_timecount+ 1_GRID_SI
+        p_timestepinfo%i_step      = i_timecount
+        p_timestepinfo%r_modeltime = p_timestepinfo%r_modeltime + p_param%num%r_deltatime
+        p_timestepinfo%i_adapit    = 0_GRID_SI
+
+!---------- duplicate old grid, use it as first guess for new grid
+
+	    CALL stop_watch('start',2,p_time)
+	    CALL grid_timeduplicate(p_ghand(i_time), p_ghand(i_timeplus))
+	    CALL stop_watch('stop ',2,p_time)
+
+!---------- adaptive (inner) loop
+
+	    l_refined= .TRUE.
+	    adap_loop: DO WHILE(l_refined .AND. p_timestepinfo%i_adapit < i_innermax)
+	      p_timestepinfo%i_adapit= p_timestepinfo%i_adapit+ 1
+
+!---------- allocate and extract working arrays
+!---------- use amatos 1.2 functionality to calculate only new nodes
+
+	      i_size= p_ghand(i_timeplus)%i_nnumber
+	      allocate(r_aux(GRID_dimension,i_size), stat=i_alct)
+	      not_alloc: IF(i_alct /= 0) THEN
+	        CALL grid_error(38)
+	      END IF not_alloc
+
+!-SLM--------- do the following SLM calculations in arrays (grid-point-wise)
+
+	      CALL grid_getinfo(p_ghand(i_timeplus), r_nodecoordinates=r_aux, &
+	                        i_newsdepth= 1, i_nlength= i_newlen)
+	      allocate(r_tracer(i_newlen), r_coord(GRID_dimension,i_newlen), stat=i_alct)
+	      not_alloc0: IF(i_alct /= 0) THEN
+	        CALL grid_error(38)
+	      END IF not_alloc0
+	      r_coord(:,1:i_newlen)= r_aux(:,1:i_newlen)
+	      deallocate(r_aux)
+
+!-SLM--------- call the SLM step
+
+	      r_modtime= p_timestepinfo%r_modeltime- p_param%num%r_deltatime
+	      CALL slm_step(p_ghand, p_param, p_time, r_modtime, i_newlen, &
+	                    r_coord, r_tracer, i_newsdepth=1)
+
+!-SLM--------- update grid data structure and deallocate work arrays
+!-SLM--------- change back from (grid-point)arrays to grid data structure
+
+	      allocate(r_aux(1,i_newlen), stat=i_alct)
+	      not_alloc1: IF(i_alct /= 0) THEN
+	        CALL grid_error(38)
+	      END IF not_alloc1
+	      r_aux(1,:)= r_tracer(:)
+	      i_valind= (/ GRID_tracer /)
+	      CALL grid_putinfo(p_ghand(i_timeplus), i_arraypoint= i_valind, &
+	                        i_newsdepth= 1, r_nodevalues= r_aux)
+
+	      deallocate(r_coord, r_tracer, r_aux)
+
+!-SLM--------- adapt the grid corresponding to an error estimate
+
+	      CALL stop_watch('start',6,p_time)
+	      CALL slm_adapt(p_ghand(i_timeplus), p_param, l_refined)
+	      CALL stop_watch('stop ',6,p_time)
+
+	    END DO adap_loop
+
+!---------- diagnostics, if requested
+
+	    IF(p_param%io%l_diagnostics) THEN
+	      CALL stop_watch('start',7,p_time)
+	      CALL slm_diagnostics(p_grid(i_timeplus), p_param, p_timestepinfo, c_action='diag')
+	      CALL stop_watch('stop ',7,p_time)
+	    END IF
+
+!---------- plot data (every [i_plotoffset]th timestep)
+
+	    CALL stop_watch('start',1,p_time)
+	    plot_step: IF(mod(i_timecount, p_param%io%i_plotoffset) == 0) THEN
+	      IF((p_param%io%l_netcdf) .OR. (p_param%io%l_vtu)) &
+	        p_timestepinfo%l_ploted= .TRUE.
+
+#ifndef NO_NETCDF
+	      IF(p_param%io%l_netcdf) THEN
+	        CALL plot_netcdf(p_ghand(i_timeplus), i_time=i_timecount)
+	      END IF
+#endif
+	      IF(p_param%io%l_vtu) THEN
+	        CALL generate_vtu(p_ghand(i_timeplus), i_time=i_timecount)
+	      END IF
+	    END IF plot_step
+	    CALL stop_watch('stop ',1,p_time)
+
+!---------- put a saveset to disc every ... timesteps
+
+	    save_step: IF((mod(i_timecount, p_param%io%i_saveoffset) == 0) .AND. &
+	                  (i_timecount > 1)) THEN
+	      i_tmp= p_param%num%i_experiment
+ 	      write(c_tmp,*) trim(GRID_parameters%program_name), '_save.'
+	      write(c_file,1010) trim(c_tmp), i_tmp
+	      c_file= adjustl(c_file)
+	      CALL grid_writesaveset(c_file,p_ghand)
+	      p_timestepinfo%l_saved= .TRUE.
+	    END IF save_step
+
+!---------- runtime information output
+
+	    CALL stop_watch('stop ',8,p_time)
+	    CALL io_putruntimeinfo(p_ghand(i_timeplus), p_timestepinfo, p_time)
+	    CALL stop_watch_init(8,(/'plotting        ', 'grid duplication', &
+	                             'trajectory calc.', 'right hand side ', &
+	                             'grid value updt.', 'grid adaption   ', &
+	                             'diagnostics     ', 'whole timestep  '/), p_time)
+	    CALL stop_watch('start',8,p_time)
+
+!---------- remove obsolecent grid items
+
+	    CALL grid_sweep
+
+!---------- toggle time handles for next step if gfx-proces has not exited
+
+	    CALL grid_timetoggle
+
+!---------- exit loop if graphics process has been terminated
+
+            IF (i_loopquit /= 0) EXIT time_loop
+
+	  END DO time_loop
+	  CALL stop_watch('stop ',1,p_timeaux)
+
+!---------- print total time
+
+ 	  write(GRID_parameters%ioout,1005)
+	  write(GRID_parameters%ioout,1003) p_timeaux%p_tim(1)%r_tim
+	  write(GRID_parameters%ioout,1004)
+	  IF(GRID_parameters%iolog > 0) THEN
+	    write(GRID_parameters%iolog,1003) p_timeaux%p_tim(1)%r_tim
+	  END IF
+
+!---------- terminate diagnostics
+
+	  IF(p_param%io%l_diagnostics) THEN
+	    CALL slm_diagnostics(p_grid(i_timeplus), p_param, p_timestepinfo, c_action='quit')
+	  END IF
+
+	  RETURN
+ 1000	  FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/ &
+	         1x,'*****            Runtime Information Output           *****',/ &
+	         1x,'***** ----- ----- ----- ----- ----- ----- ----- ----- *****')
+ 1003	  FORMAT(1x,'***** Total time for timesteps ',10x,e12.4,' *****')
+ 1004	  FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/)
+ 1005	  FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/ &
+	         1x,'*****             Final Information Output            *****',/ &
+	         1x,'***** ----- ----- ----- ----- ----- ----- ----- ----- *****')
+ 1010	  FORMAT(a28,i4.4)
+	  END SUBROUTINE slm_timestepping
+
+	END MODULE ADV_semilagrange
diff --git a/flash2d/src/flash/ADV_wind.f90 b/flash2d/src/flash/ADV_wind.f90
new file mode 100644
index 0000000..3da9ab1
--- /dev/null
+++ b/flash2d/src/flash/ADV_wind.f90
@@ -0,0 +1,107 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	ADV_wind
+! FUNCTION:
+!	calculate the windfield for the advection problem
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_windfield
+! FUNCTION:
+!	calculate the advecting force for simple advection
+! SYNTAX:
+!	real.arr= slm_windfield(real.arr, real)
+! ON INPUT:
+!	r_coord: coordinates of point		real
+!	r_time:  time coordinate (optional)	real
+! ON OUTPUT:
+!	r_field: windfield			real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	12/97
+!	2. compliant to amatos 1.0	j. behrens	12/2000
+!	3. compliant to amatos 1.2	j. behrens	3/2002
+!
+!*****************************************************************
+	MODULE ADV_wind
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC :: slm_windfield, slm_windinit, slm_windquit
+	  CONTAINS
+!*****************************************************************
+	  FUNCTION slm_windfield(r_coord, r_time) RESULT (r_field)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                  :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_field
+	  REAL (KIND = GRID_SR)                                        :: r_fac=.363610260832151995e-4
+	  REAL (KIND = GRID_SR)                                        :: r_tim
+	  REAL (KIND = GRID_SR)                                        :: r_dis
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_dif
+
+!---------- set time
+
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0
+	  END IF
+
+!---------- calculate distance from center (0,0)
+
+	  r_dif= (/0.5,0.5/)- abs(r_coord)
+	  r_dis= dot_product(r_dif, r_dif)* 4.
+
+!---------- calculate the advection at (x,y) (velocity increasing)
+
+	  r_field(1)=  r_coord(2)* r_dis* r_fac
+	  r_field(2)= -r_coord(1)* r_dis* r_fac
+	
+	  RETURN
+	  END FUNCTION slm_windfield
+
+!*****************************************************************
+	  SUBROUTINE slm_windinit(p_control)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (control_struct)     :: p_control
+
+	  RETURN
+	  END SUBROUTINE slm_windinit
+
+!*****************************************************************
+	  SUBROUTINE slm_windquit
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  RETURN
+	  END SUBROUTINE slm_windquit
+
+!*****************************************************************
+	END MODULE ADV_wind
diff --git a/flash2d/src/flash/FLASH_metadata.f90 b/flash2d/src/flash/FLASH_metadata.f90
new file mode 100644
index 0000000..1a01a38
--- /dev/null
+++ b/flash2d/src/flash/FLASH_metadata.f90
@@ -0,0 +1,63 @@
+!*******************************************************************************
+!
+!> @file  FLASH_metadata.f90
+!> @brief contains metadata definitions for FLASH_parameters
+!
+!*******************************************************************************
+! MODULE DESCRIPTION:
+!> @brief   This is a meta data structure that contains info for the 
+!>          FLASH_parameters physical parameters, related to different
+!>          Test cases.
+!> @author  J. Behrens
+!> @version 1.0
+!> @date    5/2016
+!*****************************************************************
+    MODULE FLASH_metadata
+
+    IMPLICIT NONE
+
+!---------- character length for comparison
+
+    INTEGER, PARAMETER                          :: i_comparlen=12 
+
+!---------- meta data for logical parameters 
+
+    LOGICAL, PARAMETER                          :: l_logused= .FALSE.
+    INTEGER, PARAMETER                          :: i_lognum=1
+    CHARACTER (len=i_comparlen), DIMENSION(i_lognum)  :: c_logkeywds= &
+                                                (/ '            ' /)
+
+!---------- meta data for integer parameters 
+
+    LOGICAL, PARAMETER                          :: l_intused= .FALSE.
+    INTEGER, PARAMETER                          :: i_intnum=1
+    INTEGER, DIMENSION(i_intnum)                :: i_intsizes= (/ 0 /)
+    CHARACTER (len=i_comparlen), DIMENSION(i_intnum)  :: c_intkeywds= &
+                                                (/ '            ' /)
+
+!---------- meta data for character parameters 
+
+    LOGICAL, PARAMETER                          :: l_charused= .TRUE.
+    INTEGER, PARAMETER                          :: i_charnum=1
+    INTEGER, PARAMETER                          :: i_charlength= 64
+    CHARACTER (len=i_comparlen), DIMENSION(i_charnum) :: c_charkeywds= &
+                                                (/ 'WIND_FILE_NA' /)
+
+!---------- meta data for real parameters 
+
+    LOGICAL, PARAMETER                          :: l_realused= .TRUE.
+    INTEGER, PARAMETER                          :: i_realnum=3
+    INTEGER, DIMENSION(i_realnum)               :: i_realsizes= (/ 1, 1, 1 /)
+    CHARACTER (len=i_comparlen), DIMENSION(i_realnum) :: c_realkeywds= &
+                                                (/ 'DIFFUSION_CO', &
+                                                   'WIND_COEFFIC', &
+                                                   'TOTAL_MASS_P' /)
+
+!---------- convenience pointers
+
+    INTEGER, PARAMETER                          :: PARAM_DIFFCOEF= 1
+    INTEGER, PARAMETER                          :: PARAM_WINDCOEF= 2
+    INTEGER, PARAMETER                          :: PARAM_TOTALMASS= 3
+    INTEGER, PARAMETER                          :: PARAM_WINDFILE= 1
+
+	END MODULE FLASH_metadata
diff --git a/flash2d/src/flash/FLASH_parameters.f90 b/flash2d/src/flash/FLASH_parameters.f90
new file mode 100644
index 0000000..3aa23ca
--- /dev/null
+++ b/flash2d/src/flash/FLASH_parameters.f90
@@ -0,0 +1,112 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	FLASH_parameters
+! FUNCTION:
+!	defines global control structure
+! CONTAINS:
+!
+! PUBLIC:
+!	all
+! COMMENTS:
+!
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	12/2000
+!
+!*****************************************************************
+    MODULE FLASH_parameters
+    
+    IMPLICIT NONE
+    INTEGER, PARAMETER :: io_fillen=128
+    INTEGER, PARAMETER :: i_redirout=8
+    INTEGER, PARAMETER :: i_redirlog=7
+    INTEGER, PARAMETER :: i_comparlen=14 
+
+!---------- structure for the command line
+
+    TYPE cmdline_param
+      SEQUENCE
+      CHARACTER (len=io_fillen) :: c_infile       ! input file name
+      CHARACTER (len=io_fillen) :: c_directory    ! input file name
+      LOGICAL                   :: l_output       ! redirect std output
+      LOGICAL                   :: l_logging      ! enable logging (verbose)
+    END TYPE cmdline_param
+
+!---------- structure for the i/o behaviour
+
+    TYPE io_param
+      SEQUENCE
+      LOGICAL                   :: l_diagnostics  ! switch on diagnostics
+      LOGICAL                   :: l_vtu          ! switch on vtu output
+      LOGICAL                   :: l_netcdf       ! switch on NetCDF output
+      INTEGER                   :: i_plotoffset   ! timesteps between plots
+      INTEGER                   :: i_saveoffset   ! timesteps between savesets
+      INTEGER                   :: i_savelast     ! indicator for last step saving
+      CHARACTER (len=io_fillen) :: c_domainfile   ! file with definitions for domain
+      CHARACTER (len=io_fillen) :: c_triangfile   ! file with initial triangulation
+    END TYPE io_param
+
+!---------- structure for global physical and steering parameters
+
+    TYPE num_param
+      SEQUENCE
+      REAL               :: r_deltatime     ! timestep length [s]
+      REAL               :: r_reftolerance  ! tolerance for refinement
+      REAL               :: r_crstolerance  ! tolerance for coarsening
+      REAL               :: r_refwatermark  ! watermark for refinement
+      REAL               :: r_crswatermark  ! watermark for coarsening
+      REAL               :: r_starttime     ! first time (overwrites i_frsttimestep)
+      REAL               :: r_finaltime     ! last time (overwrites i_lasttimestep)
+      INTEGER            :: i_experiment    ! current experiment identification
+      INTEGER            :: i_crslevel      ! coarsest requested level
+      INTEGER            :: i_reflevel      ! finest requested level
+      INTEGER            :: i_frsttimestep  ! first timestep of experiment
+      INTEGER            :: i_lasttimestep  ! last timestep of experiment
+      INTEGER            :: i_adviterations ! iterations in trajectory estimation
+    END TYPE num_param
+
+!---------- structure for global physical and steering parameters
+
+    TYPE test_param
+      INTEGER                                             :: i_lognum
+      INTEGER                                             :: i_intnum
+      INTEGER                                             :: i_realnum
+      INTEGER                                             :: i_charnum
+      INTEGER, DIMENSION(:), POINTER                      :: i_intsizes
+      INTEGER, DIMENSION(:), POINTER                      :: i_realsizes
+      CHARACTER (len=i_comparlen), DIMENSION(:), POINTER  :: c_logkeywds
+      CHARACTER (len=i_comparlen), DIMENSION(:), POINTER  :: c_intkeywds
+      CHARACTER (len=i_comparlen), DIMENSION(:), POINTER  :: c_realkeywds
+      CHARACTER (len=i_comparlen), DIMENSION(:), POINTER  :: c_charkeywds
+      LOGICAL, DIMENSION(:), POINTER                      :: tst_log
+      CHARACTER (len=io_fillen), DIMENSION(:), POINTER    :: tst_char
+      INTEGER, DIMENSION(:,:), POINTER                    :: tst_int
+      REAL, DIMENSION(:,:), POINTER                       :: tst_real
+    END TYPE test_param
+
+!---------- global control structure
+
+	TYPE control_struct
+	  TYPE (num_param)          :: num
+	  TYPE (cmdline_param)      :: cmd
+	  TYPE (io_param)           :: io
+	  TYPE (test_param)         :: tst
+	END TYPE control_struct
+	TYPE (control_struct)       :: p_contr
+
+!---------- structure for runtime information
+
+	TYPE rt_info
+	  REAL               :: r_modeltime
+	  INTEGER            :: i_step
+	  INTEGER            :: i_adapit
+	  LOGICAL            :: l_saved
+	  LOGICAL            :: l_ploted
+	END TYPE rt_info
+	TYPE (rt_info)       :: p_timestepinfo
+
+	END MODULE FLASH_parameters
diff --git a/flash2d/src/flash/Flash90.F90 b/flash2d/src/flash/Flash90.F90
new file mode 100644
index 0000000..a493384
--- /dev/null
+++ b/flash2d/src/flash/Flash90.F90
@@ -0,0 +1,106 @@
+!*****************************************************************
+!
+! PROJECT:
+!	FLASH90 means
+!	        FLexible Adaptive Semi-Lagrangian Hack
+!	        written in Fortran 90
+! NAME:
+!	Flash90
+! FUNCTION:
+!	main program (driver routine for the adaptive SLM)
+! SYNTAX:
+!	flash90 [options]
+! ON INPUT:
+!
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+! LIBRARIES:
+!	USEs several fortran 90 modules
+! REFERENCES:
+!	this is a complete reimplementation of STASL
+! VERSION(S):
+!	1. original version		j. behrens	11/96
+!	2. tidied up a little		j. behrens	7/97
+!	3. new control struct		j. behrens	12/97
+!	4. compliant to amatos 1.0	j. behrens	12/2000
+!	5. compliant to amatos 1.2	j. behrens	3/2002
+!   6. added visnetplot         f. klaschka 12/2003
+!   7. refactured a bit...      j. behrens  5/2016
+!
+!*****************************************************************
+	PROGRAM flash90
+
+!---------- modules
+
+	USE FLASH_parameters
+	USE IO_utils
+        !-- added for visnetplot [flo]:
+	USE GRID_api
+	USE ADV_semilagrange
+
+!---------- local declarations
+
+	IMPLICIT NONE
+	
+	INTEGER             :: i_dummy
+
+!---------- set FLASH description in global datastruct
+
+	GRID_parameters%program_name= 'Flash90                                         '
+	GRID_parameters%version= 0
+	GRID_parameters%subversion= 9
+	GRID_parameters%patchversion= 0
+	GRID_parameters%datemonth= 5
+	GRID_parameters%dateyear= 2016
+
+!---------- read command line options
+
+	CALL io_getcmdline(p_contr)
+
+!---------- initialize grid generator
+
+	IF(p_contr%cmd%l_output) THEN
+	  IF(p_contr%cmd%l_logging) THEN
+	    CALL grid_initialize(i_output=i_redirout, i_logging=i_redirlog)
+	  ELSE
+	    CALL grid_initialize(i_output=i_redirout)
+	  END IF
+	ELSE
+	  IF(p_contr%cmd%l_logging) THEN
+	    CALL grid_initialize(i_logging=i_redirlog)
+	  ELSE
+	    CALL grid_initialize
+	  END IF
+	END IF
+
+!---------- read parameter input from file
+
+    CALL io_initparams(p_contr)
+    CALL io_getbatchinput(p_contr)
+
+!---------- print global parameters
+
+	CALL io_putparameters(p_contr)
+
+!---------- set up advection starting conditions, initialize grid, etc.
+
+	CALL slm_initialize(p_grid, p_contr)
+
+!---------- call the (major) routine for timestepping
+
+	CALL slm_timestepping(p_grid, p_contr)
+
+!---------- terminate the SLM (gracefully free memory, terminate grid, etc.)
+
+	CALL slm_finish(p_grid, p_contr)
+
+!---------- terminate grid generator
+
+	CALL grid_terminate
+
+	STOP
+	END PROGRAM flash90
diff --git a/flash2d/src/flash/IO_netcdfplot.f90 b/flash2d/src/flash/IO_netcdfplot.f90
new file mode 100644
index 0000000..bbc02c1
--- /dev/null
+++ b/flash2d/src/flash/IO_netcdfplot.f90
@@ -0,0 +1,197 @@
+!*******************************************************************************
+!
+!> @file IO_netcdfplot.f90
+!> @brief contains module IO_netcdfplot
+!
+!*******************************************************************************
+!
+! REFERENCES:
+!   this module is based on the original implementations in the
+!   splash/fe project (fortran 77 version), but wildly modified!
+!
+! VERSION(S):
+!  1. original version                    j. behrens      01/2000
+!  2. compliant to amatos 1.0             j. behrens      12/2000
+!  3. compliant to amatos 1.2             j. behrens      03/2002
+!  3. compliant to amatos 2.0             j. behrens      07/2003
+!  4. rewritten to get more data          s. vater        05/2012
+!  5. rewritten to use IO_ncugrid module  s. vater        03/2014
+!
+!*******************************************************************************
+! MODULE DESCRIPTION:
+!> creates output in NetCDF file format
+!
+MODULE IO_netcdfplot
+  USE IO_ncugrid
+  USE FLASH_parameters
+  USE GRID_api
+
+  PRIVATE
+  PUBLIC :: plot_netcdf
+
+  CONTAINS
+!*******************************************************************************
+! DESCRIPTION of [SUBROUTINE plot_netcdf]:
+!> @brief creates output in netcdf file format
+!>
+!> @param[in]       p_ghand     grid handle for the linked lists
+!> @param[in]       i_time      time stamp for file naming (opt.)
+!
+  SUBROUTINE plot_netcdf(p_ghand, i_time)
+
+    IMPLICIT NONE
+
+!---------- local declarations
+
+    TYPE (grid_handle), INTENT(in)                              :: p_ghand
+    INTEGER, OPTIONAL, INTENT(in)                               :: i_time
+    INTEGER                                                     :: i_cnt, &
+      i_numelmt, i_numnode, i_alct, i_tcnt, i_dimvel, i_unkvel
+    INTEGER, SAVE                                               :: i_timecount = 0
+    CHARACTER (len=32)                                          :: c_file, c_mesh
+    CHARACTER (len=64)                                          :: c_title, c_tmp
+    REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_nodexy
+    REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE, TARGET  :: r_val, r_aux
+    INTEGER, DIMENSION(:,:), ALLOCATABLE                        :: i_elmtnodes, i_eltdofs
+    INTEGER (KIND = GRID_SI), PARAMETER                         :: i_vallen = 5
+    INTEGER (KIND = GRID_SI), DIMENSION(:), ALLOCATABLE, TARGET :: i_eltlev, i_eltsta
+    INTEGER (KIND = GRID_SI), DIMENSION(i_vallen)               :: i_valind
+    INTEGER (KIND = GRID_SI), DIMENSION(GRID_dimension)         :: i_valuv
+    INTEGER (KIND = GRID_SI)                                    :: i_fetyp
+    TYPE (ncugrid_vardatatype), DIMENSION(i_vallen+1)           :: p_vdataarr
+
+!---------- check input for optional parameter
+
+    IF(PRESENT(i_time)) THEN
+      i_tcnt = i_time
+    ELSE
+      i_tcnt = i_timecount
+    END IF
+    i_timecount = i_timecount + 1
+
+!---------- check for FEM types
+
+    i_fetyp = grid_femvarquery(1_GRID_SI)
+
+!---------- create the title
+
+    WRITE(c_title,*) 'netCDF output from ',TRIM(GRID_parameters%program_name)
+    c_title = ADJUSTL(c_title)
+
+!---------- create generic file name
+
+    c_mesh = 'Mesh2'
+
+    WRITE(c_file, '(A, A1, I4.4, A3)') TRIM(GRID_parameters%program_name), '_', i_tcnt, '.nc'
+
+!---------- get array with node coordinates, and variable values
+
+    i_numnode = p_ghand%i_nnumber
+    i_numelmt = p_ghand%i_enumfine
+    i_dimvel = GRID_femtypes%p_type(i_fetyp)%sig%i_unknowns
+    i_unkvel = p_ghand%i_unknowns(i_fetyp)
+
+    ALLOCATE(r_nodexy(GRID_dimension, i_numnode), &
+             i_elmtnodes(GRID_elementnodes, i_numelmt), i_eltdofs(i_dimvel, i_numelmt), &
+             r_val(i_vallen, i_unkvel), r_aux(i_vallen, i_numelmt), &
+             i_eltlev(i_numelmt), i_eltsta(i_numelmt), stat=i_alct)
+    IF (i_alct /= 0) CALL grid_error(c_error='[plot_netcdf]: could not allocate aux. arrays')
+
+    i_valind= (/GRID_ucomp, GRID_vcomp, GRID_phi, GRID_zeta, GRID_tracer/)
+
+    CALL grid_getinfo(p_ghand, l_finelevel=.TRUE., l_relative=.TRUE., &
+                      i_femtype=i_fetyp, i_arraypoint=i_valind, r_nodecoordinates=r_nodexy, &
+                      i_elementnodes=i_elmtnodes, r_dofvalues=r_val, i_elementdofs=i_eltdofs, &
+                      i_elementlevel=i_eltlev, i_elementstatus=i_eltsta)
+
+!---------- create the file for timestep data
+
+    CALL ncugrid_createmesh(c_file, c_mesh, i_numnode, i_numelmt, &
+                            i_elmtnodes, r_nodexy, c_title, TRIM(GRID_parameters%author_affil2), &
+                            c_contact=TRIM(GRID_parameters%author_email))
+
+!---------- define variables (data)
+
+    WRITE(c_tmp, '(A, A4)') TRIM(c_mesh), '_v_x'
+    p_vdataarr(1)%c_varname       = TRIM(c_tmp)
+    p_vdataarr(1)%c_long_name     = 'velocity in x-direction'
+    p_vdataarr(1)%c_standard_name = 'velocity_in_x_direction' ! not CF conform!
+    p_vdataarr(1)%c_units         = 'm/s'
+    p_vdataarr(1)%c_location      = 'node'
+    p_vdataarr(1)%i_datatype      = 1
+
+    WRITE(c_tmp, '(A, A4)') TRIM(c_mesh), '_v_y'
+    p_vdataarr(2)%c_varname       = TRIM(c_tmp)
+    p_vdataarr(2)%c_long_name     = 'velocity in y-direction'
+    p_vdataarr(2)%c_standard_name = 'velocity_in_y_direction' ! not CF conform!
+    p_vdataarr(2)%c_units         = 'm/s'
+    p_vdataarr(2)%c_location      = 'node'
+    p_vdataarr(2)%i_datatype      = 1
+
+    WRITE(c_tmp, '(A, A4)') TRIM(c_mesh), '_phi'
+    p_vdataarr(3)%c_varname       = TRIM(c_tmp)
+    p_vdataarr(3)%c_long_name     = 'geopotential height (arbitrary variable)'
+    p_vdataarr(3)%c_standard_name = 'geopotential_height' ! not CF conform!
+    p_vdataarr(3)%c_units         = 'none'
+    p_vdataarr(3)%c_location      = 'node'
+    p_vdataarr(3)%i_datatype      = 1
+
+    WRITE(c_tmp, '(A, A5)') TRIM(c_mesh), '_zeta'
+    p_vdataarr(4)%c_varname       = TRIM(c_tmp)
+    p_vdataarr(4)%c_long_name     = 'vorticity (arbitrary variable)'
+    p_vdataarr(4)%c_standard_name = 'absolute_vorticity' ! not CF conform!
+    p_vdataarr(4)%c_units         = 'none'
+    p_vdataarr(4)%c_location      = 'node'
+    p_vdataarr(4)%i_datatype      = 1
+
+    WRITE(c_tmp, '(A, A7)') TRIM(c_mesh), '_tracer'
+    p_vdataarr(5)%c_varname       = TRIM(c_tmp)
+    p_vdataarr(5)%c_long_name     = 'tracer density distribution'
+    p_vdataarr(5)%c_standard_name = 'tracer_density' ! not CF conform!
+    p_vdataarr(5)%c_units         = 'none'
+    p_vdataarr(5)%c_location      = 'node'
+    p_vdataarr(5)%i_datatype      = 1
+
+    WRITE(c_tmp, '(A, A6)') TRIM(c_mesh), '_level'
+    p_vdataarr(6)%c_varname       = TRIM(c_tmp)
+    p_vdataarr(6)%c_long_name     = 'grid level'
+    p_vdataarr(6)%c_standard_name = 'grid_level' ! not CF conform!
+    p_vdataarr(6)%c_units         = 'none'
+    p_vdataarr(6)%c_location      = 'face'
+    p_vdataarr(6)%i_datatype      = 0
+!
+!!---------- average over each cell and write into netCDF file
+!
+!    DO i_cnt=1,i_numelmt
+!      r_aux(1, i_cnt) = SUM(r_val(1, i_eltdofs(:, i_cnt))) / REAL(i_dimvel, GRID_SR)
+!      r_aux(2, i_cnt) = SUM(r_val(2, i_eltdofs(:, i_cnt))) / REAL(i_dimvel, GRID_SR)
+!      r_aux(3, i_cnt) = SUM(r_val(3, i_eltdofs(:, i_cnt))) / REAL(i_dimvel, GRID_SR)
+!      r_aux(4, i_cnt) = SUM(r_val(4, i_eltdofs(:, i_cnt))) / REAL(i_dimvel, GRID_SR)
+!    END DO
+
+!---------- write the nodal grid data
+
+    p_vdataarr(1)%p_rvardata => r_val(1,:)
+    p_vdataarr(2)%p_rvardata => r_val(2,:)
+    p_vdataarr(3)%p_rvardata => r_val(3,:)
+    p_vdataarr(4)%p_rvardata => r_val(4,:)
+    p_vdataarr(5)%p_rvardata => r_val(5,:)
+    p_vdataarr(6)%p_ivardata => i_eltlev
+
+!--- write variables
+
+    CALL ncugrid_putvariablearray(c_file, c_mesh, p_vdataarr, REAL(i_tcnt, GRID_SR))
+
+!--- deallocate data arrays
+
+    DO i_cnt=1,SIZE(p_vdataarr)
+      NULLIFY(p_vdataarr(i_cnt)%p_ivardata)
+      NULLIFY(p_vdataarr(i_cnt)%p_rvardata)
+    END DO
+    DEALLOCATE(r_nodexy, i_elmtnodes, r_val, r_aux, i_eltdofs, &
+               i_eltlev, i_eltsta)
+
+  END SUBROUTINE plot_netcdf
+
+!*******************************************************************************
+END MODULE IO_netcdfplot
diff --git a/flash2d/src/flash/IO_utils.f90 b/flash2d/src/flash/IO_utils.f90
new file mode 100644
index 0000000..e783a65
--- /dev/null
+++ b/flash2d/src/flash/IO_utils.f90
@@ -0,0 +1,915 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	IO_utils
+! FUNCTION:
+!	input/output routines (io_get...something, io_put...something)
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	io_getcmdline
+! FUNCTION:
+!	read options from command line
+! SYNTAX:
+!	call io_getcmdline(param)
+! ON INPUT:
+!
+! ON OUTPUT:
+!	p_param: control parameters			TYPE(control_struct)
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	io_getinterinput
+! FUNCTION:
+!	get user input interactively
+! SYNTAX:
+!	call io_getinterinput(param)
+! ON INPUT:
+!
+! ON OUTPUT:
+!	p_param: control parameters			TYPE(control_struct)
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	io_getbatchinput
+! FUNCTION:
+!	read user input from file
+! SYNTAX:
+!	call io_getbatchinput(param)
+! ON INPUT:
+!
+! ON OUTPUT:
+!	p_param: control parameters			TYPE(control_struct)
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	io_putparameters
+! FUNCTION:
+!	write out parameters in a nice way
+! SYNTAX:
+!	call io_putparameters(param)
+! ON INPUT:
+!	p_param: data structure containing parameters	TYPE(control_struct)
+! ON OUTPUT:
+!	
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	io_putruntimeinfo
+! FUNCTION:
+!	print some information on the current run time status
+! SYNTAX:
+!	call io_putruntimeinfo(grid, info)
+! ON INPUT:
+!	p_ghand: grid handle for no. of elements...	TYPE(grid_handle)
+!	p_info:  structure containing other info	TYPE(rt_info)
+! ON OUTPUT:
+!	p_info:  structure reseted			TYPE(rt_info)
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	io_putinputfile
+! FUNCTION:
+!	print an input file conforming to io_getbatchinput
+! SYNTAX:
+!	call io_putinputfile(param)
+! ON INPUT:
+!	p_param: global parameter data structure	TYPE(control_struct)
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	io_getcmdline, io_getinterinput, io_getbatchinput,
+!	io_putparameters, io_putruntimeinfo, io_putinputfile
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, MISC_timing, IO_plotdefine,
+!	FEM_handle
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version			j. behrens	7/96
+!	2. largely extended			j. behrens	11/96
+!	3. changed command line io		j. behrens	1/97
+!	4. changed runtime output (adaptations)	j. behrens	1/97
+!	5. control data struct, less command io	j. behrens	12/97
+!	6. tiff file plotting included		j. behrens	1/98
+!	7. adapted to BJuGL			j. behrens	1/2000
+!	8. compliant to amatos 1.0		j. behrens	12/2000
+!	3. compliant to amatos 1.2		j. behrens	3/2002
+!
+!*****************************************************************
+	MODULE IO_utils
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE MISC_system
+	  USE GRID_api
+	  PRIVATE
+	  INTEGER, PARAMETER :: i_ioerr=0
+	  PUBLIC :: io_getcmdline, io_getinterinput, io_getbatchinput, &
+	    io_putparameters, io_putruntimeinfo, io_putinputfile, io_initparams
+	  CONTAINS
+!*****************************************************************
+	SUBROUTINE io_getcmdline(p_cmd)
+
+!---------- local declarations
+
+	IMPLICIT NONE
+
+	TYPE (control_struct), INTENT(out) :: p_cmd
+
+	LOGICAL                            :: l_ict
+	LOGICAL                            :: l_bat
+	LOGICAL                            :: l_mtl
+	LOGICAL                            :: l_dia
+	CHARACTER (len=io_fillen)          :: a_infln
+	CHARACTER (len=io_fillen)          :: a_outfln
+	INTEGER                            :: numargs
+	INTEGER                            :: i= 1
+	INTEGER                            :: i_fst
+	LOGICAL                            :: help= .true.
+	LOGICAL                            :: shoversion= .false.
+	CHARACTER (len=2)                  :: option
+	CHARACTER (len=15)                 :: comdnam
+	CHARACTER (len=32)                 :: c_file
+	CHARACTER (len=io_fillen)          :: c_dummy
+
+!---------- initialize output variables
+
+	a_infln = 'Parameters.in'
+	a_outfln= './'
+	l_ict= .false.
+        l_bat= .false.
+	l_mtl= .false.
+	l_dia= .false.
+
+!---------- read number commandline arguments
+!           this is possibly non standard f90, but definitely quasi standard
+
+	numargs= sys_numcmdargs()
+	CALL sys_getcmdargs(0,c_dummy,i_len=len(c_dummy))
+	comdnam= c_dummy(1:15)
+	check_args: IF(numargs < 1) THEN
+	  GOTO 100 ! print_help
+	ELSE check_args
+
+!---------- read command line arguments one by one
+
+	  DO WHILE (i <= numargs)
+	    CALL sys_getcmdargs(i,c_dummy,i_len=len(c_dummy))
+	    option= c_dummy(1:2)
+
+!---------- select the CASEs for command line options
+
+	    eval_option: SELECT CASE (option)
+	      CASE('-h') eval_option !--- request for help ---
+	        help= .true.
+	        i= i+1
+	      CASE('-?') eval_option !--- request for help ---
+	        help= .true.
+	        i= i+1
+	      CASE('-r') eval_option !--- print release information ---
+	        shoversion= .true.
+	        i= i+1
+	      CASE('-l') eval_option !--- switch on logging ---
+	        help= .false.
+	        p_cmd%cmd%l_logging= .true.
+	        i= i+1
+	      CASE('-o') eval_option !--- redirect output into file ---
+	        help= .false.
+	        p_cmd%cmd%l_output= .true.
+	        i= i+1
+	      CASE('-f') eval_option !--- supply input file name ---
+	        help= .false.
+	        i= i+1
+	        CALL sys_getcmdargs(i,c_dummy,i_len=len(c_dummy))
+	        a_infln= c_dummy(1:io_fillen)
+	        IF(a_infln(1:1) == '-') THEN  !--- check correctnes of file name ---
+	          help= .true.
+	          GOTO 100 ! print_help
+	        ELSE
+	          i= i+1
+	        END IF
+	      CASE('-d') eval_option !--- directory path in which to find and write data ---
+	        help= .false.
+	        i= i+1
+	        CALL sys_getcmdargs(i,c_dummy,i_len=len(c_dummy))
+	        a_outfln= c_dummy(1:io_fillen)
+	        IF(a_outfln(1:1) == '-') THEN  !--- check correctnes of file name ---
+	          help= .true.
+	          GOTO 100 ! print_help
+	        ELSE
+	          i= i+1
+	        END IF
+	      CASE DEFAULT eval_option !--- default CASE: show help ---
+	        help= .true.
+	        GOTO 100 ! print_help
+	    END SELECT eval_option
+	  END DO
+	END IF check_args
+
+!---------- update output structure
+
+	p_cmd%cmd%c_infile = a_infln
+	p_cmd%cmd%c_directory = a_outfln
+
+!---------- print help information
+
+ 100	print_help: IF(help) THEN
+	  IF(shoversion) THEN
+	    write(GRID_parameters%ioout,1001) GRID_parameters%program_name, GRID_parameters%version, GRID_parameters%subversion, &
+	                        GRID_parameters%patchversion, GRID_parameters%datemonth, GRID_parameters%dateyear, &
+	                        GRID_parameters%author_name, GRID_parameters%author_email, GRID_parameters%author_affil1, &
+	                        GRID_parameters%author_affil2, GRID_parameters%author_affil3
+	    write(GRID_parameters%ioout,1002) comdnam
+	    write(i_ioerr,*) 'STOPPED ... this is all I can say'
+	    STOP
+	  ELSE
+	    write(GRID_parameters%ioout,1010) comdnam
+	    write(GRID_parameters%ioout,1011) GRID_parameters%author_name
+	    write(i_ioerr,*) 'STOPPED ... hope this made it clear'
+	    STOP
+	  END IF
+	END IF print_help
+
+!---------- print version information
+
+	print_version: IF(shoversion) THEN
+	  write(GRID_parameters%ioout,1001) GRID_parameters%program_name, GRID_parameters%version, GRID_parameters%subversion, &
+	                        GRID_parameters%patchversion, GRID_parameters%datemonth, GRID_parameters%dateyear, &
+	                        GRID_parameters%author_name, GRID_parameters%author_email, GRID_parameters%author_affil1, &
+	                        GRID_parameters%author_affil2, GRID_parameters%author_affil3
+	  IF(GRID_parameters%iolog > 0) &
+	    write(GRID_parameters%iolog,1001) GRID_parameters%program_name, GRID_parameters%version, GRID_parameters%subversion, &
+	                        GRID_parameters%patchversion, GRID_parameters%datemonth, GRID_parameters%dateyear, &
+	                        GRID_parameters%author_name, GRID_parameters%author_email, GRID_parameters%author_affil1, &
+	                        GRID_parameters%author_affil2, GRID_parameters%author_affil3
+	END IF print_version
+
+	RETURN
+
+ 1001	FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/ &
+	       1x,'***** PROGRAM: ',a15,24x,'*****',/ &
+	       1x,'***** VERSION: ',i2.2,'.',i2.2,'.',i2.2,31x,'*****',/ &
+	       1x,'***** DATE:    ',i2.2,'/',i4.4,32x,'*****',/ &
+	       1x,'***** AUTHOR:  ',a12,27x,'*****',/ &
+	       1x,'***** E-MAIL:  ',a39,'*****',/ &
+	       1x,'***** ADDRESS: ',a39,'*****',/ &
+	       1x,'*****          ',a39,'*****',/ &
+	       1x,'*****          ',a39,'*****',/ &
+	       1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****')
+ 1002	FORMAT(1x,'***** TYPE ',a15,' -h, to get help',12x,'*****',/ &
+	       1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****')
+ 1010	FORMAT(1x,'USAGE: ',a15,' {-d dir} {-f file} {-h} {-l} {-o} {-r}',/ &
+	       1x,'       -d: determine input/output file directory path << dir >>, default ./',/ &
+	       1x,'       -f: input filename is << name >>, default Parameters.in',/ &
+	       1x,'       -h: help information (this output)',/ &
+	       1x,'       -l: switch on log file output',/ &
+	       1x,'       -o: redirect standard output to a file',/ &
+	       1x,'       -r: release information')
+ 1011	FORMAT(1x,'Copyright (c) 2016',a13)
+	END SUBROUTINE io_getcmdline
+!*****************************************************************
+	SUBROUTINE io_initparams(p_param)
+	
+!---------- local declarations
+
+	IMPLICIT NONE
+
+	TYPE (control_struct), INTENT(out) :: p_param
+	INTEGER                            :: i_maxsize, i_alct
+
+!---------- initialize
+
+	p_param%num%r_deltatime     = -1.0
+	p_param%num%r_reftolerance  = -1.0
+	p_param%num%r_crstolerance  = -1.0
+	p_param%num%r_refwatermark  = -1.0
+	p_param%num%r_crswatermark  = -1.0
+	p_param%num%i_experiment    = -1
+	p_param%num%i_crslevel      = -1
+	p_param%num%i_reflevel      = -1
+	p_param%num%i_frsttimestep  = -1
+	p_param%num%i_lasttimestep  = -1
+    p_param%num%r_starttime     = -1.0
+    p_param%num%r_finaltime     = -1.0
+	p_param%num%i_adviterations = -1
+	p_param%io%i_plotoffset     = -1
+	p_param%io%i_saveoffset     = -1
+	p_param%io%i_savelast       = -1
+	p_param%io%l_diagnostics    = .FALSE.
+	p_param%io%l_vtu            = .FALSE.
+	p_param%io%l_netcdf         = .FALSE.
+	p_param%io%c_domainfile     = 'Domain.dat'
+	p_param%io%c_triangfile     = 'Triang.dat'
+
+!---------- initialize meta data
+
+    p_param%tst%i_lognum        = 0
+    p_param%tst%i_intnum        = 0
+    p_param%tst%i_charnum       = 0
+    p_param%tst%i_realnum       = 0
+
+	END SUBROUTINE io_initparams
+!*****************************************************************
+	SUBROUTINE io_getbatchinput(p_param)
+
+!---------- local declarations
+
+	IMPLICIT NONE
+
+	TYPE (control_struct), INTENT(out)         :: p_param
+	INTEGER, PARAMETER                         :: i_iofil= 10
+	CHARACTER (len=80)                         :: a_filrow
+	CHARACTER (LEN=GRID_parameters%i_stringlength) :: c_tmp
+	INTEGER                                    :: i_iost, i_ioend, &
+	  i_tmp, i_cln, i_cnt, i_len, i_alct, i_maxsize
+	CHARACTER (LEN=2*io_fillen)                :: c_inputfile
+
+!---------- initialize
+
+	i_cln= MIN(GRID_parameters%i_stringlength,io_fillen)
+
+!---------- input file
+
+    WRITE(c_inputfile,*) trim(p_param%cmd%c_directory),p_param%cmd%c_infile
+    c_inputfile= adjustl(c_inputfile)
+
+!---------- open input file
+
+	OPEN(unit= i_iofil, file= c_inputfile, status= 'OLD', action= 'READ', iostat= i_iost)
+	file_notopen: IF(i_iost /= 0) THEN
+	  WRITE(i_ioerr,*) 'ERROR: Filename: ', c_inputfile
+	  IF(GRID_parameters%iolog > 0) &
+	    WRITE(GRID_parameters%iolog,*) 'ERROR: Filename: ', c_inputfile
+	  CALL grid_error(21)
+	ELSE file_notopen
+	  WRITE(GRID_parameters%ioout,1000) GRID_parameters%program_name, GRID_parameters%version, GRID_parameters%subversion, &
+	                      GRID_parameters%patchversion, c_inputfile
+	  IF(GRID_parameters%iolog > 0) THEN
+	    WRITE(GRID_parameters%iolog,*) 'INFO: Filename: ', c_inputfile, ' opened on unit: ', i_iofil
+	    WRITE(GRID_parameters%iolog,1000) GRID_parameters%program_name, GRID_parameters%version, GRID_parameters%subversion, &
+	                        GRID_parameters%patchversion, c_inputfile
+	  END IF
+	END IF file_notopen
+
+!---------- read line by line
+
+	read_loop: DO
+	  READ(i_iofil,2000,iostat=i_ioend) a_filrow
+
+!---------- if file ended
+
+	  file_end: IF(i_ioend /= 0) THEN
+	    CLOSE(i_iofil)
+	    IF(GRID_parameters%iolog > 0) &
+	      WRITE(GRID_parameters%iolog,*) 'INFO: Closed file on unit: ', i_iofil
+	    EXIT
+	  ELSE file_end
+
+!---------- decide what to DO with line according to first character
+
+	    comment_line: IF(a_filrow(1:1) == '#' .or. a_filrow(1:1) == '!') THEN
+	      CYCLE read_loop
+	    ELSE IF(a_filrow(1:14) == 'EXPERIMENT_NUM') THEN comment_line
+	      read(i_iofil,*) p_param%num%i_experiment
+	    ELSE IF(a_filrow(1:14) == 'FINE_GRID_LEVE') THEN comment_line
+	      read(i_iofil,*) p_param%num%i_reflevel
+	    ELSE IF(a_filrow(1:14) == 'COARSE_GRID_LE') THEN comment_line
+	      read(i_iofil,*) p_param%num%i_crslevel
+	    ELSE IF(a_filrow(1:14) == 'TOLERANCE_OF_R') THEN comment_line
+	      read(i_iofil,*) p_param%num%r_reftolerance
+	    ELSE IF(a_filrow(1:14) == 'TOLERANCE_OF_C') THEN comment_line
+	      read(i_iofil,*) p_param%num%r_crstolerance
+	    ELSE IF(a_filrow(1:14) == 'WATERMARK_OF_R') THEN comment_line
+	      read(i_iofil,*) p_param%num%r_refwatermark
+	    ELSE IF(a_filrow(1:14) == 'WATERMARK_OF_C') THEN comment_line
+	      read(i_iofil,*) p_param%num%r_crswatermark
+	    ELSE IF(a_filrow(1:14) == 'TIMESTEP_LENGT') THEN comment_line
+	      read(i_iofil,*) p_param%num%r_deltatime
+	    ELSE IF(a_filrow(1:14) == 'BEGINNING_TIME') THEN comment_line
+	      read(i_iofil,*) p_param%num%i_frsttimestep
+	    ELSE IF(a_filrow(1:14) == 'FINISHING_TIME') THEN comment_line
+	      read(i_iofil,*) p_param%num%i_lasttimestep
+        ELSE IF(a_filrow(1:14) == 'TIMESTEPPING_S') THEN comment_line
+          read(i_iofil,*) p_param%num%r_starttime
+        ELSE IF(a_filrow(1:14) == 'TIMESTEPPING_E') THEN comment_line
+          read(i_iofil,*) p_param%num%r_finaltime
+	    ELSE IF(a_filrow(1:14) == 'SLM_ITERATION_') THEN comment_line
+	      read(i_iofil,*) p_param%num%i_adviterations
+	    ELSE IF(a_filrow(1:14) == 'STEPS_BTW_PLOT') THEN comment_line
+	      read(i_iofil,*) p_param%io%i_plotoffset
+	    ELSE IF(a_filrow(1:14) == 'SWITCH_ON_DIAG') THEN comment_line
+	      read(i_iofil,*) i_tmp
+	      IF(i_tmp /= 0) p_param%io%l_diagnostics= .TRUE.
+	    ELSE IF(a_filrow(1:14) == 'NETCDF_FILE_PL') THEN comment_line
+	      read(i_iofil,*) i_tmp
+	      IF(i_tmp /= 0) p_param%io%l_netcdf= .TRUE.
+	    ELSE IF(a_filrow(1:14) == 'VTU_FILE_PLOTT') THEN comment_line
+	      read(i_iofil,*) i_tmp
+	      IF(i_tmp /= 0) p_param%io%l_vtu= .TRUE.
+	    ELSE IF(a_filrow(1:14) == 'STEPS_BTW_SAVE') THEN comment_line
+	      read(i_iofil,*) p_param%io%i_saveoffset
+	    ELSE IF(a_filrow(1:14) == 'SAVE_FINISH_CO') THEN comment_line
+	      read(i_iofil,*) p_param%io%i_savelast
+	    ELSE IF(a_filrow(1:14) == 'DOMAIN_FILE_NA') THEN comment_line
+	      read(i_iofil,2010,iostat=i_tmp) c_tmp
+	      IF(i_tmp == 0) p_param%io%c_domainfile(1:i_cln)= c_tmp(1:i_cln)
+	    ELSE IF(a_filrow(1:14) == 'TRIANG_FILE_NA') THEN comment_line
+	      read(i_iofil,2010,iostat=i_tmp) c_tmp
+	      IF(i_tmp == 0) p_param%io%c_triangfile(1:i_cln)= c_tmp(1:i_cln)
+!---------- look for additional parameters in the physical parameter set
+        ELSE IF(a_filrow(1:14) == 'TST_INT_PARAME') THEN comment_line
+          read(i_iofil,*) p_param%tst%i_intnum
+          IF (p_param%tst%i_intnum > 0) THEN
+!---------- allocate integer data structure for parameters and read the structure
+            ALLOCATE(p_param%tst%i_intsizes(p_param%tst%i_intnum), stat=i_alct)
+            IF(i_alct /= 0) CALL grid_error(c_error='[io_getbatchinput]: intsizes parameter not allocated')
+	        read(i_iofil,2010,iostat=i_tmp) c_tmp
+	        IF(c_tmp(1:14) .NE. 'TST_INT_STRUCT') CALL grid_error(c_error='[io_getbatchinput]: inconsistent integer params')
+            read(i_iofil,*) p_param%tst%i_intsizes
+!---------- allocate space for keywords
+            ALLOCATE(p_param%tst%c_intkeywds(p_param%tst%i_intnum), stat=i_alct)
+            IF(i_alct /= 0) CALL grid_error(c_error='[io_getbatchinput]: intkeywds parameter not allocated')
+!---------- allocate space for parameters
+            i_maxsize= maxval(p_param%tst%i_intsizes)
+            ALLOCATE(p_param%tst%tst_int(i_maxsize,p_param%tst%i_intnum), stat=i_alct)
+            IF(i_alct /= 0) CALL grid_error(c_error='[io_getbatchinput]: could not allocate int pointers')
+!---------- read keywords and parameters
+            int_loop: DO i_cnt=1,p_param%tst%i_intnum
+              read(i_iofil,2010,iostat=i_tmp) c_tmp
+              p_param%tst%c_intkeywds(i_cnt)=c_tmp(1:i_comparlen)
+              read(i_iofil,*) p_param%tst%tst_int(1:p_param%tst%i_intsizes(i_cnt),i_cnt)
+            END DO int_loop
+          END IF
+        ELSE IF(a_filrow(1:14) == 'TST_REAL_PARAM') THEN comment_line
+          read(i_iofil,*) p_param%tst%i_realnum
+          IF (p_param%tst%i_realnum > 0) THEN
+!---------- allocate real data structure for parameters and read the structure
+            ALLOCATE(p_param%tst%i_realsizes(p_param%tst%i_realnum), stat=i_alct)
+            IF(i_alct /= 0) CALL grid_error(c_error='[io_getbatchinput]: realsizes parameter not allocated')
+	        read(i_iofil,2010,iostat=i_tmp) c_tmp
+	        IF(c_tmp(1:14) .NE. 'TST_REAL_STRUC') CALL grid_error(c_error='[io_getbatchinput]: inconsistent real params')
+            read(i_iofil,*) p_param%tst%i_realsizes
+!---------- allocate space for keywords
+            ALLOCATE(p_param%tst%c_realkeywds(p_param%tst%i_realnum), stat=i_alct)
+            IF(i_alct /= 0) CALL grid_error(c_error='[io_getbatchinput]: realkeywds parameter not allocated')
+!---------- allocate space for parameters
+            i_maxsize= maxval(p_param%tst%i_realsizes)
+            ALLOCATE(p_param%tst%tst_real(i_maxsize,p_param%tst%i_realnum), stat=i_alct)
+            IF(i_alct /= 0) CALL grid_error(c_error='[io_getbatchinput]: could not allocate real pointers')
+!---------- read keywords and parameters
+            real_loop: DO i_cnt=1,p_param%tst%i_realnum
+              read(i_iofil,2010,iostat=i_tmp) c_tmp
+              p_param%tst%c_realkeywds(i_cnt)=c_tmp(1:i_comparlen)
+              read(i_iofil,*) p_param%tst%tst_real(1:p_param%tst%i_realsizes(i_cnt),i_cnt)
+            END DO real_loop
+          END IF
+        ELSE IF(a_filrow(1:14) == 'TST_LOG_PARAME') THEN comment_line
+          read(i_iofil,*) p_param%tst%i_lognum
+          IF (p_param%tst%i_lognum > 0) THEN
+!---------- allocate space for keywords
+            ALLOCATE(p_param%tst%c_logkeywds(p_param%tst%i_lognum), stat=i_alct)
+            IF(i_alct /= 0) CALL grid_error(c_error='[io_getbatchinput]: logkeywds parameter not allocated')
+!---------- allocate space for parameters
+            ALLOCATE(p_param%tst%tst_log(p_param%tst%i_lognum), stat=i_alct)
+            IF(i_alct /= 0) CALL grid_error(c_error='[io_getbatchinput]: could not allocate logical pointers')
+!---------- read keywords and parameters
+            log_loop: DO i_cnt=1,p_param%tst%i_lognum
+              read(i_iofil,2010,iostat=i_tmp) c_tmp
+              p_param%tst%c_logkeywds(i_cnt)=c_tmp(1:i_comparlen)
+              p_param%tst%tst_log(i_cnt)= .FALSE. ! default value!
+	          read(i_iofil,*) i_tmp
+	          IF(i_tmp /= 0) p_param%tst%tst_log(i_cnt)= .TRUE.
+            END DO log_loop
+          END IF
+        ELSE IF(a_filrow(1:14) == 'TST_CHAR_PARAM') THEN comment_line
+          read(i_iofil,*) p_param%tst%i_charnum
+          IF (p_param%tst%i_charnum > 0) THEN
+!---------- allocate space for keywords
+            ALLOCATE(p_param%tst%c_charkeywds(p_param%tst%i_charnum), stat=i_alct)
+            IF(i_alct /= 0) CALL grid_error(c_error='[io_getbatchinput]: charkeywds parameter not allocated')
+!---------- allocate space for parameters
+            ALLOCATE(p_param%tst%tst_char(p_param%tst%i_charnum), stat=i_alct)
+            IF(i_alct /= 0) CALL grid_error(c_error='[io_getbatchinput]: could not allocate char pointers')
+!---------- read keywords and parameters
+            char_loop: DO i_cnt=1,p_param%tst%i_charnum
+              read(i_iofil,2010,iostat=i_tmp) c_tmp
+              p_param%tst%c_charkeywds(i_cnt)=c_tmp(1:i_comparlen)
+              read(i_iofil,2020,iostat=i_tmp) p_param%tst%tst_char(i_cnt)
+            END DO char_loop
+          END IF
+	    END IF comment_line
+	  END IF file_end
+	END DO read_loop
+
+!---------- for backward compatibility we accept time step input, but
+!           it is necessary to compute the initial and final time...
+    no_inittime: IF((p_param%num%r_starttime < 0.0) .OR. &
+                    (p_param%num%r_finaltime < 0.0)) THEN
+
+!---------- check if at least first and last timestep are given
+      no_step: IF((p_param%num%i_frsttimestep < 0) .OR. &
+                  (p_param%num%i_lasttimestep < 0)) THEN
+        CALL grid_error(c_error='[io_getbatchinput]: incomplete time stepping info')
+      END IF no_step
+
+!---------- check if delta time is given
+      no_delta: IF((p_param%num%r_deltatime < 0.0)) THEN
+        CALL grid_error(c_error='[io_getbatchinput]: incomplete delta t')
+      END IF no_delta
+
+!---------- now compute initial and final time from time stepping info
+
+      p_param%num%r_starttime = p_param%num%r_deltatime * p_param%num%i_frsttimestep
+      p_param%num%r_finaltime = p_param%num%r_deltatime * p_param%num%i_lasttimestep
+
+    END IF no_inittime
+
+!---------- error handling
+
+	no_value: IF((p_param%num%r_deltatime     < 0.0) .OR. &
+                 (p_param%num%r_starttime     < 0.0) .OR. &
+                 (p_param%num%r_finaltime     < 0.0) .OR. &
+	             (p_param%num%r_reftolerance  < 0.0) .OR. &
+	             (p_param%num%r_crstolerance  < 0.0) .OR. &
+	             (p_param%num%r_refwatermark  < 0.0) .OR. &
+	             (p_param%num%r_crswatermark  < 0.0) .OR. &
+	             (p_param%num%i_experiment    < 0)   .OR. &
+	             (p_param%num%i_crslevel      < 0)   .OR. &
+	             (p_param%num%i_reflevel      < 0)   .OR. &
+	             (p_param%io%i_plotoffset     < 0)   .OR. &
+	             (p_param%io%i_saveoffset     < 0)   .OR. &
+	             (p_param%num%i_adviterations < 0)) THEN
+	  CALL grid_error(22)
+	END IF no_value
+
+	RETURN
+
+ 1000	FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/ &
+	       1x,'***** PROGRAM:   ',a15,22x,'*****',/ &
+	       1x,'***** VERSION:   ',i2.2,'.',i2.2,'.',i2.2,29x,'*****',/ &
+	       1x,'*****            Started in BATCH input mode',10x,'*****',/ &
+	       1x,'***** INPUTFILE: ',a20,17x,'*****',/ &
+	       1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/)
+ 2000	FORMAT(a80)
+ 2010	FORMAT(a32)
+ 2020   FORMAT(a)
+
+	END SUBROUTINE io_getbatchinput
+!*****************************************************************
+	SUBROUTINE io_putparameters(p_param)
+
+!---------- local declarations
+
+	IMPLICIT NONE
+
+	TYPE (control_struct), INTENT(in) :: p_param
+	INTEGER                         :: i1, i2, i3, i9, i10, i11, i12, i13, i14
+	REAL (KIND = GRID_SR)           :: r4, r5, r6, r7, r8, r9, r10
+	CHARACTER (len=3)               :: c_diag, c_netc, c_vtup
+
+!---------- temporary store
+
+	i1 = p_param%num%i_experiment
+	i2 = p_param%num%i_reflevel
+	i3 = p_param%num%i_crslevel
+	r4 = p_param%num%r_reftolerance
+	r5 = p_param%num%r_crstolerance
+	r6 = p_param%num%r_refwatermark
+	r7 = p_param%num%r_crswatermark
+	r8 = p_param%num%r_deltatime
+	r9 = p_param%num%r_starttime
+	r10= p_param%num%r_finaltime
+	i11= p_param%io%i_saveoffset
+	i12= p_param%io%i_plotoffset
+	i13= p_param%io%i_savelast
+	i14= p_param%num%i_adviterations
+	
+	IF(p_param%io%l_diagnostics) THEN
+	  c_diag= ' ON'
+	ELSE
+	  c_diag= 'OFF'
+	END IF
+	IF(p_param%io%l_netcdf) THEN
+	  c_netc= ' ON'
+	ELSE
+	  c_netc= 'OFF'
+	END IF
+	IF(p_param%io%l_vtu) THEN
+	  c_vtup= ' ON'
+	ELSE
+	  c_vtup= 'OFF'
+	END IF
+
+!---------- write satement
+
+	write(GRID_parameters%ioout,1000) i1, i2, i3, r4, r5, r6, r7, r8, r9, r10, i11, i12, &
+	                    i13, i14, c_diag, c_netc, c_vtup
+	IF(GRID_parameters%iolog > 0) &
+	  write(GRID_parameters%iolog,1000) i1, i2, i3, r4, r5, r6, r7, r8, r9, r10, i11, i12, &
+	                      i13, i14, c_diag, c_netc, c_vtup
+
+	RETURN
+
+ 1000	FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/ &
+	       1x,'*****                Global Parameters',16x,'*****',/ &
+	       1x,'***** ----- ----- ----- ----- ----- ----- ----- ----- *****',/ &
+	       1x,'***** Experiment No.',25x,i8,' *****',/ &
+	       1x,'***** ----- ----- ----- ----- ----- ----- ----- ----- *****',/ &
+	       1x,'***** Finest grid level',22x,i8,' *****',/ &
+	       1x,'***** Coarsest grid level',20x,i8,' *****',/ &
+	       1x,'***** Refinement tolerance',15x,e12.4,' *****',/ &
+	       1x,'***** Coarsening tolerance',15x,e12.4,' *****',/ &
+	       1x,'***** Refinement watermark',15x,e12.4,' *****',/ &
+	       1x,'***** Coarsening watermark',15x,e12.4,' *****',/ &
+	       1x,'***** ----- ----- ----- ----- ----- ----- ----- ----- *****',/ &
+	       1x,'***** Timestep length',20x,e12.4,' *****',/ &
+	       1x,'***** Start time',25x,e12.4,' *****',/ &
+	       1x,'***** Final time',25x,e12.4,' *****',/ &
+	       1x,'***** ----- ----- ----- ----- ----- ----- ----- ----- *****',/ &
+	       1x,'***** Timesteps between save',17x,i8,' *****',/ &
+	       1x,'***** Timesteps between plot',17x,i8,' *****',/ &
+	       1x,'***** Flag for last save',21x,i8,' *****',/ &
+	       1x,'***** ----- ----- ----- ----- ----- ----- ----- ----- *****',/ &
+	       1x,'***** Iterations for trajectories',12x,i8,' *****',/ &
+	       1x,'***** ----- ----- ----- ----- ----- ----- ----- ----- *****',/ &
+	       1x,'***** Diagnostics switched',24x,a3,' *****',/ &
+	       1x,'***** NetCDF plotting switched',20x,a3,' *****',/ &
+	       1x,'***** VTU plotting switched',23x,a3,' *****',/ &
+	       1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/)
+
+	END SUBROUTINE io_putparameters
+!*****************************************************************
+	SUBROUTINE io_putruntimeinfo(p_ghand, p_info, p_time)
+
+!---------- local declarations
+
+	IMPLICIT NONE
+
+	TYPE (grid_handle), INTENT(in) :: p_ghand
+	TYPE (rt_info), INTENT(inout)  :: p_info
+	TYPE (sw_info), INTENT(inout)  :: p_time
+	INTEGER                        :: i_cnt
+
+!---------- output
+
+	write(GRID_parameters%ioout,1000) p_info%i_step, p_info%r_modeltime, p_info%i_adapit, &
+	                    p_ghand%i_enumber, p_ghand%i_enumfine, &
+	                    p_ghand%i_gnumber, p_ghand%i_gnumfine, &
+	                    p_ghand%i_nnumber
+	IF(GRID_parameters%iolog > 0) &
+	  write(GRID_parameters%iolog,1000) p_info%i_step, p_info%r_modeltime, p_info%i_adapit, &
+	                      p_ghand%i_enumber, p_ghand%i_enumfine, &
+	                      p_ghand%i_gnumber, p_ghand%i_gnumfine, &
+	                      p_ghand%i_nnumber
+	times_loop: DO i_cnt=1,p_time%i_num
+	  write(GRID_parameters%ioout,1003) p_time%p_tim(i_cnt)%c_tim, p_time%p_tim(i_cnt)%r_tim
+	  IF(GRID_parameters%iolog > 0) &
+	    write(GRID_parameters%iolog,1003) p_time%p_tim(i_cnt)%c_tim, p_time%p_tim(i_cnt)%r_tim
+	END DO times_loop
+	save_perf: IF(p_info%l_saved) THEN
+	  write(GRID_parameters%ioout,1002)
+	  IF(GRID_parameters%iolog > 0) &
+	    write(GRID_parameters%iolog,1002)
+	  also_plot: IF(p_info%l_ploted) THEN
+	    write(GRID_parameters%ioout,1005)
+	    write(GRID_parameters%ioout,1006)
+	    IF(GRID_parameters%iolog > 0) THEN
+	      write(GRID_parameters%iolog,1005)
+	      write(GRID_parameters%iolog,1006)
+	    END IF
+	  ELSE also_plot
+	    write(GRID_parameters%ioout,1005)
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,1005)
+	  END IF also_plot
+	ELSE save_perf
+	  but_plot: IF(p_info%l_ploted) THEN
+	    write(GRID_parameters%ioout,1002)
+	    write(GRID_parameters%ioout,1006)
+	    IF(GRID_parameters%iolog > 0) THEN
+	      write(GRID_parameters%iolog,1002)
+	      write(GRID_parameters%iolog,1006)
+	    END IF
+	  END IF but_plot
+	END IF save_perf
+	write(GRID_parameters%ioout,1010)
+	IF(GRID_parameters%iolog > 0) &
+	  write(GRID_parameters%iolog,1010)
+
+!---------- reset info structure
+
+	p_info%i_step  = 0
+	p_info%i_adapit= 0
+	p_info%l_saved = .FALSE.
+	p_info%l_ploted= .FALSE.
+
+	RETURN
+	
+ 1000	FORMAT(1x,'+++++ +++++ +++++ +++++ +++++ +++++ +++++ +++++ +++++ +++++',/ &
+	       1x,'+++++            Runtime Information Output           +++++',/ &
+	       1x,'+++++ ----- ----- ----- ----- ----- ----- ----- ----- +++++',/ &
+	       1x,'+++++ Timestep Number',24x,i8,' +++++',/ &
+	       1x,'+++++ Model time',25x,e12.4,' +++++',/ &
+	       1x,'+++++ ----- ----- ----- ----- ----- ----- ----- ----- +++++',/ &
+	       1x,'+++++ Inner iterations (for adaptation)',6x,i8,' +++++',/ &
+	       1x,'+++++ ----- ----- ----- ----- ----- ----- ----- ----- +++++',/ &
+	       1x,'+++++ Number of elements',21x,i8,' +++++',/ &
+	       1x,'+++++ Number of elements (fine grid)',9x,i8,' +++++',/ &
+	       1x,'+++++ Number of edges',24x,i8,' +++++',/ &
+	       1x,'+++++ Number of edges (fine grid)',12x,i8,' +++++',/ &
+	       1x,'+++++ Number of nodes',24x,i8,' +++++',/ &
+	       1x,'+++++ ----- ----- ----- ----- ----- ----- ----- ----- +++++')
+ 1002	FORMAT(1x,'+++++ ----- ----- ----- ----- ----- ----- ----- ----- +++++')
+ 1003	FORMAT(1x,'+++++ Time spent in ',a16,5x,e12.4,' +++++')
+ 1005	FORMAT(1x,'+++++ Saveset transferred to disk in this step        +++++')
+ 1006	FORMAT(1x,'+++++ Plotting performed in this step                 +++++')
+ 1010	FORMAT(1x,'+++++ +++++ +++++ +++++ +++++ +++++ +++++ +++++ +++++ +++++',/)
+
+	END SUBROUTINE io_putruntimeinfo
+!*****************************************************************
+	SUBROUTINE io_putinputfile(p_param)
+
+!---------- local declarations
+
+	IMPLICIT NONE
+
+	TYPE (control_struct), INTENT(in) :: p_param
+	INTEGER                         :: i1, i2, i3, i9, i10, i11, &
+	  i12, i13, i14, i15, i16, i17, i18, i19, i20, i31
+	INTEGER                         :: i_cnt, i_true, i_false, i_len
+	REAL (KIND = GRID_SR)           :: r4, r5, r6, r7, r8, r9, r10
+	INTEGER                         :: i_unit=15, i_fst
+	CHARACTER (len=32)              :: c_file
+	CHARACTER (len=28)              :: c_tmp
+
+!---------- temporary store
+
+	i1 = p_param%num%i_experiment+ 1
+	i2 = p_param%num%i_reflevel
+	i3 = p_param%num%i_crslevel
+	r4 = p_param%num%r_reftolerance
+	r5 = p_param%num%r_crstolerance
+	r6 = p_param%num%r_refwatermark
+	r7 = p_param%num%r_crswatermark
+	r8 = p_param%num%r_deltatime
+	r9 = p_param%num%r_finaltime
+	r10= p_param%num%r_finaltime + (p_param%num%r_finaltime- p_param%num%r_starttime)
+	i12= 0
+	IF(p_param%io%l_netcdf) i12= 1
+	i11= 0
+	IF(p_param%io%l_vtu) i11= 1
+	i31= 0
+	IF(p_param%io%l_diagnostics) i31= 1
+	i13= p_param%io%i_plotoffset
+	i14= p_param%io%i_saveoffset
+	i15= p_param%io%i_savelast
+	i16= p_param%num%i_adviterations
+	
+	i_true= 1
+	i_false= 0
+
+!---------- open file
+
+	  write(c_tmp,*) trim(GRID_parameters%program_name), '_input.'
+	  write(c_file,1010) trim(c_tmp), i1
+	  c_file= adjustl(c_file)
+	  open(i_unit, file= c_file, action= 'write', form= 'formatted', &
+	       status='replace', iostat= i_fst)
+	  not_opened: IF(i_fst /= 0) THEN
+	    CALL grid_error(23)
+	  END IF not_opened
+	  IF(GRID_parameters%iolog > 0) &
+	    write(GRID_parameters%iolog,*) 'INFO: Filename: ', c_file, ' opened on unit: ', i_unit
+
+!---------- write statement
+
+	write(i_unit,1001) c_file, GRID_parameters%program_name
+	write(i_unit,1002) i1, i2, i3, r4, r5, r6, r7, r8, r9, r10
+	write(i_unit,1003) i12, i11, i31, i13, i14, &
+	  i15, p_param%io%c_domainfile, p_param%io%c_triangfile, i16
+
+!---------- write statements for the generic phy part
+
+    IF(p_param%tst%i_lognum > 0) THEN
+      log_loop: DO i_cnt=1,p_param%tst%i_lognum
+        write(i_unit,1011) p_param%tst%c_logkeywds(i_cnt)
+        IF(p_param%tst%tst_log(i_cnt)) THEN
+          write(i_unit,*) i_true
+        ELSE
+          write(i_unit,*) i_false
+        END IF
+      END DO log_loop
+    END IF
+    IF(p_param%tst%i_charnum > 0) THEN
+      char_loop: DO i_cnt=1,p_param%tst%i_charnum
+        write(i_unit,1011) p_param%tst%c_charkeywds(i_cnt)
+        write(i_unit,*) p_param%tst%tst_char(i_cnt)
+      END DO char_loop
+    END IF
+    IF(p_param%tst%i_intnum > 0) THEN
+      write(i_unit,1011) 'TST_INT_STRUCT'
+      write(i_unit,*) p_param%tst%i_intsizes
+      int_loop: DO i_cnt=1,p_param%tst%i_intnum
+        write(i_unit,1011) p_param%tst%c_intkeywds(i_cnt)
+        i_len=p_param%tst%i_intsizes(i_cnt)
+        write(i_unit,*) p_param%tst%tst_int(1:i_len,i_cnt)
+      END DO int_loop
+    END IF
+    IF(p_param%tst%i_realnum > 0) THEN
+      write(i_unit,1011) 'TST_REAL_STRUC'
+      write(i_unit,*) p_param%tst%i_realsizes
+      real_loop: DO i_cnt=1,p_param%tst%i_realnum
+        write(i_unit,1011) p_param%tst%c_realkeywds(i_cnt)
+        i_len=p_param%tst%i_realsizes(i_cnt)
+        write(i_unit,*) p_param%tst%tst_real(1:i_len,i_cnt)
+      END DO real_loop
+    END IF
+	write(i_unit,1004)
+
+!---------- close file
+
+	close(i_unit)
+	IF(GRID_parameters%iolog > 0) &
+	  write(GRID_parameters%iolog,*) 'INFO: Closed file on unit: ', i_unit
+
+	RETURN
+
+ 1001	FORMAT('# --- --- --- --- --- --- --- --- --- --- --- --- ---',/ &
+	       '# Parameter file ',a32,/ &
+	       '# created automatically by program ',a15,/ &
+	       '# --- --- --- --- --- --- --- --- --- --- --- --- ---')
+ 1002	FORMAT('EXPERIMENT_NUMBER',/ &
+	       i8,/ &
+	       'FINE_GRID_LEVEL',/ &
+	       i8,/ &
+	       'COARSE_GRID_LEVEL',/ &
+	       i8,/ &
+	       'TOLERANCE_OF_REFINEMENT',/ &
+	       e12.4,/ &
+	       'TOLERANCE_OF_COARSENING',/ &
+	       e12.4,/ &
+	       'WATERMARK_OF_REFINEMENT',/ &
+	       e12.4,/ &
+	       'WATERMARK_OF_COARSENING',/ &
+	       e12.4,/ &
+	       'TIMESTEP_LENGTH',/ &
+	       e12.4,/ &
+	       'TIMESTEPPING_START_TIME',/ &
+	       e12.4,/ &
+	       'TIMESTEPPING_END_TIME',/ &
+	       e12.4)
+ 1003	FORMAT('NETCDF_FILE_PLOTTING',/ &
+	       i8,/ &
+	       'VTU_FILE_PLOTTING',/ &
+	       i8,/ &
+	       'SWITCH_ON_DIAGNOSTICS',/ &
+	       i8,/ &
+	       'STEPS_BTW_PLOTS',/ &
+	       i8,/ &
+	       'STEPS_BTW_SAVES',/ &
+	       i8,/ &
+	       'SAVE_FINISH_CONFIGURATION',/ &
+	       i8,/ &
+	       'DOMAIN_FILE_NAME',/ &
+	       a32,/ &
+	       'TRIANG_FILE_NAME',/ &
+	       a32,/ &
+	       'SLM_ITERATION_NUMBER',/ &
+	       i8)
+ 1004	FORMAT('# --- ---  End of parameter file  --- --- --- --- ---')
+ 1010	FORMAT(a28,i4.4)
+ 1011   FORMAT(a14) ! CAUTION: Make sure this is exactly as long as i_comparlen in FLASH_metadata
+
+	END SUBROUTINE io_putinputfile
+	END MODULE IO_utils
diff --git a/flash2d/src/flash/IO_vtu.F90 b/flash2d/src/flash/IO_vtu.F90
new file mode 100644
index 0000000..eb6a44c
--- /dev/null
+++ b/flash2d/src/flash/IO_vtu.F90
@@ -0,0 +1,553 @@
+!-----------------------------------------------------------------------
+!> \file IO_vtu.F90
+!> \brief Contains the module IO_vtu
+!-----------------------------------------------------------------------
+!> The MODULE IO_vtu create a vtu file, unstructered grid, readable by
+!!                     paraview
+!
+!> Actually, amatos' structure denies a unified handling for
+!! 2d, 3d and spherical case. Therefore the corresponding definition
+!! has to be uncommented
+!-----------------------------------------------------------------------
+
+#define VTU_OUTPUT2D
+!#define VTU_OUTPUT3D
+
+MODULE IO_vtu
+
+USE GRID_api
+
+PUBLIC :: plot_vtu, t_vtu_data
+
+#ifdef VTU_OUTPUT2D
+  INTEGER(KIND=GRID_SI), PARAMETER         :: i_nodespercell = GRID_elementnodes
+  INTEGER(KIND=GRID_SI), PARAMETER         :: i_nodesperface = GRID_edgenodes
+
+  ! This defines a triangle in VTK format
+  INTEGER(KIND=GRID_SI), PARAMETER         :: i_vtucelltype = 5
+#elif defined VTU_OUTPUT3D
+  INTEGER(KIND=GRID_SI), PARAMETER         :: i_nodespercell = GRID_tetranodes
+  INTEGER(KIND=GRID_SI), PARAMETER         :: i_nodesperface = GRID_elementnodes
+
+  ! This defines a tetrahedron in VTK format
+  INTEGER(KIND=GRID_SI), PARAMETER         :: i_vtucelltype = 10
+#endif
+
+
+!> Structure for variable information
+TYPE t_vtu_data
+  CHARACTER(LEN=32)                              :: c_name  !< VTU variable name
+  INTEGER(KIND=GRID_SI)                          :: i_size  !< data dimension
+  REAL(KIND=GRID_SR),POINTER, DIMENSION(:,:)     :: p_vdata !< pointer to data
+END TYPE t_vtu_data
+
+!> Very small values can cause errors when read in paraview.
+!! This is the threshold for filtering.
+REAL(KIND = GRID_SR), PARAMETER                  :: r_vtueps = 1e-12
+CONTAINS
+
+!---------------------------------------------------------------------
+!> \brief Writes a VTU file
+!> Use this routine to plot continuous or discontinuous data.
+!> \param[in] p_mesh          The mesh
+!> \param[in] c_filename      The name of the file to write to
+!> \param[in] i_nodedata      Size of the array p_nodedata
+!> \param[in] p_nodedata      Array of type t_vtu_data for node
+!!                            data. For each node one entry has to exist in
+!!                            p_vdata.
+!> \param[in] i_celldata      Size of the array p_celldata
+!> \param[in] p_nodedata      Array of type t_vtu_data for cell
+!!                            data. For each tetrahedron one entry has to
+!!                            exist in p_vdata.
+#ifdef VTU_OUTPUT2D
+!> \param[in] r_zcoordinate   The z-coordinate values
+!> \param[in] i_zcoordinate   Use the i_zcoordinate component of p_nodedata
+!!                            also as z-coordinate
+#endif
+!> \param[in] l_continuous    Write continuous node data.
+!!                            This needs less space than discontinuous.
+!!                            default: .true.
+!> \param[in] l_grid_info     Write grid numbering information
+!!                            default: .false.
+!---------------------------------------------------------------------
+SUBROUTINE plot_vtu(p_mesh, c_filename, &
+                    i_nodedata, p_nodedata, i_celldata, p_celldata, &
+#ifdef VTU_OUTPUT2D
+                    r_zcoordinate, i_zcoordinate, &
+#endif
+                    l_continuous, l_grid_info)
+  IMPLICIT NONE
+
+  TYPE (grid_handle), INTENT(in)                 :: p_mesh
+  CHARACTER (len=*), INTENT(IN)                  :: c_filename
+  INTEGER(KIND=GRID_SI), INTENT(IN), OPTIONAL    :: i_nodedata
+  TYPE(t_vtu_data), INTENT(IN), DIMENSION(:), OPTIONAL &
+                                                 :: p_nodedata
+  INTEGER(KIND=GRID_SI), INTENT(IN), OPTIONAL    :: i_celldata
+  TYPE(t_vtu_data), INTENT(IN), DIMENSION(:), OPTIONAL &
+                                                 :: p_celldata
+#ifdef VTU_OUTPUT2D
+  REAL(KIND=GRID_SR), POINTER, DIMENSION(:,:), OPTIONAL &
+                                                 :: r_zcoordinate
+  INTEGER(KIND=GRID_SI), OPTIONAL, INTENT(IN)    :: i_zcoordinate
+#endif
+
+  LOGICAL, INTENT(IN), OPTIONAL                  :: l_grid_info
+  LOGICAL, INTENT(IN), OPTIONAL                  :: l_continuous
+
+  INTEGER( KIND = GRID_SI)                       :: i_alct
+  INTEGER( KIND = GRID_SI)                       :: i_cnt
+  INTEGER( KIND = GRID_SI)                       :: i_fst
+  INTEGER( KIND = GRID_SI)                       :: i_ncnt
+  INTEGER( KIND = GRID_SI), PARAMETER            :: i_fhandle = 89
+
+  ! this variables result from different naming conventions in two and
+  ! three dimensions
+  INTEGER( KIND = GRID_SI)                       :: i_numberofcells
+  INTEGER( KIND = GRID_SI)                       :: i_numberoffaces
+  INTEGER( KIND = GRID_SI)                       :: i_numberofpoints
+
+  INTEGER (KIND = GRID_SI), DIMENSION(:,:), ALLOCATABLE     :: i_cellnodes
+  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_nodecoor
+  INTEGER (KIND = GRID_SI), DIMENSION(:), ALLOCATABLE       :: i_nodes
+
+  LOGICAL                                        :: l_write_grid_info
+  LOGICAL                                        :: l_continuous_data
+
+
+#ifdef VTU_OUTPUT2D
+  IF(PRESENT(i_zcoordinate) .AND. PRESENT(r_zcoordinate)) THEN
+    CALL GRID_error(c_error='[plot_vtu] z-coordinate is defined twice')
+  END IF
+#endif
+
+  ! set the value of l_continuous. The default is .true.
+  IF(PRESENT(l_continuous)) THEN
+    l_continuous_data = l_continuous
+  ELSE
+    l_continuous_data = .TRUE.
+  END IF
+
+  ! set the value of l_grid_info. The default is .false..
+  IF(PRESENT(l_grid_info)) THEN
+    l_write_grid_info = l_grid_info
+  ELSE
+    l_write_grid_info = .FALSE.
+  END IF
+
+  ! Set dimension depending types
+#ifdef  VTU_OUTPUT2D
+  i_numberofcells = p_mesh%i_enumfine
+  i_numberoffaces = p_mesh%i_gnumfine
+#elif defined VTU_OUTPUT3D
+  i_numberofcells = p_mesh%i_tnumfine
+  i_numberoffaces = p_mesh%i_enumfine
+#endif
+
+  IF(l_continuous_data) THEN
+    i_numberofpoints = p_mesh%i_nnumber
+  ELSE
+    i_numberofpoints = i_numberofcells * i_nodespercell
+  END IF
+
+  ! We only need the node coordinates and the nodes per tetra
+  ! as additional information.
+  ALLOCATE(r_nodecoor(GRID_dimension, p_mesh%i_nnumber), &
+           i_cellnodes(i_nodespercell, i_numberofcells), &
+           stat = i_alct)
+
+  IF(i_alct /= 0) THEN
+    CALL grid_error(c_error='[write_vtu]: could not allocate data arrays')
+  END IF
+
+  CALL GRID_getinfo(p_mesh, r_nodecoordinates = r_nodecoor, &
+#ifdef VTU_OUTPUT2D
+                   i_elementnodes = i_cellnodes)
+#elif defined VTU_OUTPUT3D
+                   i_tetranodes   = i_cellnodes)
+#endif
+
+  ! open the file and write header information
+  OPEN(i_fhandle, file = c_filename, iostat= i_fst)
+  IF(i_fst /= 0) THEN
+    RETURN
+  END IF
+
+  WRITE(i_fhandle, "(A)") '<?xml version="1.0"?>'
+  WRITE(i_fhandle, "(A)") '<VTKFile type="UnstructuredGrid" version="0.1" byte_order="LittleEndian">'
+  WRITE(i_fhandle, *) '<UnstructuredGrid>'
+  WRITE(i_fhandle, "(A,I8,A,I8,A)") '<Piece NumberOfPoints="', &
+                        i_numberofpoints, &
+                        '" NumberOfCells="', &
+                        i_numberofcells, &
+                        '">'
+
+  ! write the node coordinates to VTU file
+  WRITE(i_fhandle, *) '<Points>'
+  WRITE(i_fhandle, "(A,I1,A)") '<DataArray type="Float32" NumberOfComponents="', &
+  3, '" format="ascii">'
+
+  ! Distunguish between continuous and discontinuous case
+  IF(l_continuous_data) THEN
+    !> The continuous case is represented by amatos' grid topology.
+    DO i_cnt = 1, p_mesh%i_nnumber
+#ifdef VTU_OUTPUT3D
+      WRITE(i_fhandle, *) r_nodecoor(:, i_cnt)
+#elif defined  VTU_OUTPUT2D
+    IF(PRESENT(r_zcoordinate)) THEN
+      WRITE(i_fhandle, *) r_nodecoor(:, i_cnt), r_zcoordinate(1, i_cnt)
+    ELSE IF(PRESENT(i_zcoordinate)) THEN
+      WRITE(i_fhandle, *) r_nodecoor(:, i_cnt), &
+                          p_nodedata(i_zcoordinate)%p_vdata(1, i_cnt)
+    ELSE
+      WRITE(i_fhandle, *) r_nodecoor(:, i_cnt), 0.0
+    END IF
+#endif
+    END DO
+
+  ELSE
+    ! Write the node coordinates. In this discontinuous case one node in
+    ! paraview belongs only to one cell.
+    DO i_cnt = 1, i_numberofcells
+      DO i_ncnt = 1, i_nodespercell
+#ifdef VTU_OUTPUT3D
+        WRITE(i_fhandle, *) r_nodecoor(:, i_cellnodes(i_ncnt, i_cnt))
+#elif defined VTU_OUTPUT2D
+        IF(PRESENT(r_zcoordinate)) THEN
+          WRITE(i_fhandle, *) r_nodecoor(:, i_cellnodes(i_ncnt, i_cnt)), &
+                              r_zcoordinate(1, i_cellnodes(i_ncnt, i_cnt))
+        ELSE IF(PRESENT(i_zcoordinate)) THEN
+          WRITE(i_fhandle, *) r_nodecoor(:, i_cellnodes(i_ncnt, i_cnt)), &
+              p_nodedata(i_zcoordinate)%p_vdata(1, i_cellnodes(i_ncnt, i_cnt))
+        ELSE
+          WRITE(i_fhandle, *) r_nodecoor(:, i_cellnodes(i_ncnt, i_cnt)), 0.0
+        END IF
+#endif
+      END DO
+    END DO
+  END IF
+
+  WRITE(i_fhandle, *) '</DataArray>'
+  WRITE(i_fhandle, *) '</Points>'
+
+  ! Write the node connectivity
+  WRITE(i_fhandle, *) '<Cells>'
+  WRITE(i_fhandle, *) '<DataArray type="Int32" Name="connectivity" format="ascii">'
+
+  ! check wether continuous data is written
+  IF(l_continuous_data) THEN
+    ! The indexing in paraview starts with 0. Therefore we subtract one from
+    ! the node connectivity information.
+#ifdef VTU_OUTPUT2D
+    DO i_cnt = 1, p_mesh%i_enumfine
+#elif defined VTU_OUTPUT3D
+    DO i_cnt = 1, p_mesh%i_tnumfine
+#endif
+      WRITE(i_fhandle, *) i_cellnodes(:, i_cnt) - 1
+    END DO
+  ELSE
+    ! Write element nodes (indexing starts by 0!)
+    ! In the discontinuous case each tetrahedron has its own nodes
+    ALLOCATE(i_nodes(i_nodespercell), stat = i_alct)
+
+    IF(i_alct /= 0) THEN
+      CALL grid_error(c_error='[write_vtu]: could not allocate node array for VTU output')
+    END IF
+
+    DO i_cnt = 1, i_numberofcells * i_nodespercell, i_nodespercell
+
+      DO i_ncnt = 1, i_nodespercell
+        i_nodes(i_ncnt) = i_ncnt + i_cnt - 2
+      END DO
+
+      WRITE(i_fhandle, *) i_nodes
+    END DO
+
+    DEALLOCATE(i_nodes)
+  END IF
+
+  WRITE(i_fhandle, *) '</DataArray>'
+
+  ! write the cell type. Tetrahedra are represented by 10 and triangles by 5
+  WRITE(i_fhandle, *) '<DataArray type="UInt8" Name="types" format="ascii">'
+  DO i_cnt = 1, i_numberofcells
+    WRITE(i_fhandle, *) i_vtucelltype
+  END DO
+  WRITE(i_fhandle, *) '</DataArray>'
+  WRITE(i_fhandle, *) '<DataArray type="Int32" Name="offsets" format="ascii">'
+  DO i_cnt = 1, i_numberofcells
+    WRITE(i_fhandle, *) i_cnt * i_nodespercell
+  END DO
+  WRITE(i_fhandle, *) '</DataArray>'
+  WRITE(i_fhandle, *) '</Cells>'
+
+  ! Write the point data / node data
+  ! If the grid information is requested save the node numbering of amatos.
+  ! Since every node number in paraview is decreased by one, this option is
+  ! in continuous plotting not too useful.
+  WRITE(i_fhandle, *) '<PointData>'
+
+  IF(l_write_grid_info) THEN
+    WRITE(i_fhandle, *) '<DataArray type="Int32" Name="Nodenumber" format="ascii">'
+
+    DO i_cnt = 1, p_mesh%i_nnumber
+      WRITE(i_fhandle, *) i_cnt
+    END DO
+
+    WRITE(i_fhandle, *) '</DataArray>'
+  END IF
+
+  ! When variables for the node data are present, save them.
+  IF(PRESENT(i_nodedata) .AND. PRESENT(p_nodedata)) THEN
+    DO i_cnt = 1, i_nodedata
+      CALL write_vtu_data(i_fhandle, p_nodedata(i_cnt))
+    END DO
+  END IF
+
+  WRITE(i_fhandle, *) '</PointData>'
+
+
+
+  ! write the cell data.
+  WRITE(i_fhandle, *) '<CellData>'
+
+  ! Write the element numbers when requested.
+  IF(l_write_grid_info) THEN
+    WRITE(i_fhandle, *) '<DataArray type="Int32" Name="Elementnumber" format="ascii">'
+
+    DO i_cnt = 1, i_numberofcells
+      WRITE(i_fhandle, *) i_cnt
+    END DO
+
+    WRITE(i_fhandle, *) '</DataArray>'
+  END IF
+
+  ! Write the variable belonging to the tetradra.
+  IF(PRESENT(i_celldata) .AND. PRESENT(p_celldata)) THEN
+    DO i_cnt = 1, i_celldata
+      CALL write_vtu_data(i_fhandle, p_celldata(i_cnt))
+    END DO
+  END IF
+
+  ! write the end of cell data and the footer.
+  WRITE(i_fhandle, *) '</CellData>'
+  WRITE(i_fhandle, *) '</Piece>'
+  WRITE(i_fhandle, *) '</UnstructuredGrid>'
+  WRITE(i_fhandle, *) '</VTKFile>'
+
+  ! tidy up
+  CLOSE(i_fhandle)
+  DEALLOCATE(r_nodecoor, i_cellnodes)
+END SUBROUTINE plot_vtu
+
+
+#ifdef VTU_OUTPUT3D
+!---------------------------------------------------------------------
+!> Use this routine to plot the mesh consisting of face and
+!! continuous data on it.
+!> \param p_mesh      - the mesh
+!> \param c_filename    - the name of the file to write to
+!> \param i_nodedata    - (optional) size of the array p_nodedata
+!> \param p_nodedata    - (optional) array of type t_vtu_data for node
+!!                        data. For each node one entry has to exist in
+!!                        p_vdata.
+!> \param i_celldata    - (optional) size of the array p_celldata
+!> \param p_nodedata    - (optional) array of type t_vtu_data for cell
+!!                        data. For each face one entry has to
+!!                        exist in p_vdata.
+!> \param l_grid_info   - (optional) Write grid numbering information
+!!                        default: .false.
+!---------------------------------------------------------------------
+SUBROUTINE plot_vtu_elements(p_mesh, c_filename, i_nodedata, &
+                             p_nodedata, i_celldata, p_celldata, &
+                             l_grid_info)
+  IMPLICIT NONE
+
+  TYPE (grid_handle), INTENT(in)                 :: p_mesh
+  CHARACTER (len=*), INTENT(IN)                  :: c_filename
+  INTEGER(KIND=GRID_SI), INTENT(IN), OPTIONAL    :: i_nodedata
+  TYPE(t_vtu_data), INTENT(IN), DIMENSION(:), OPTIONAL &
+                                                 :: p_nodedata
+  INTEGER(KIND=GRID_SI), INTENT(IN), OPTIONAL    :: i_celldata
+  TYPE(t_vtu_data), INTENT(IN), DIMENSION(:), OPTIONAL &
+                                                 :: p_celldata
+
+  LOGICAL, INTENT(IN), OPTIONAL                  :: l_grid_info
+
+  LOGICAL                                        :: l_write_grid_info
+
+  INTEGER( KIND = GRID_SI)             :: i_alct, i_cnt, i_fst
+  INTEGER( KIND = GRID_SI)             :: i_fhandle = 89
+
+  INTEGER (KIND = GRID_SI), DIMENSION(:,:), ALLOCATABLE     :: i_enodes
+  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_nodecoor
+
+  !> set the optional data
+  IF(PRESENT(l_grid_info)) THEN
+    l_write_grid_info = l_grid_info
+  ELSE
+    l_write_grid_info = .FALSE.
+  END IF
+
+  ALLOCATE(r_nodecoor(GRID_dimension, p_mesh%i_nnumber), &
+           i_enodes(GRID_elementnodes, p_mesh%i_enumfine), &
+           stat = i_alct)
+
+  IF(i_alct /= 0) THEN
+    CALL grid_error(c_error='[write_vtu]: could not allocate data arrays')
+  END IF
+
+  CALL GRID_getinfo(p_mesh, r_nodecoordinates = r_nodecoor, &
+                   i_elementnodes = i_enodes)
+
+
+  OPEN(i_fhandle, file = c_filename, iostat= i_fst)
+  IF(i_fst /= 0) THEN
+    RETURN
+  END IF
+
+  !> Write the VTK header
+  WRITE(i_fhandle, "(A)") '<?xml version="1.0"?>'
+  WRITE(i_fhandle, "(A)") '<VTKFile type="UnstructuredGrid" version="0.1" byte_order="LittleEndian">'
+  WRITE(i_fhandle, *) '<UnstructuredGrid>'
+  WRITE(i_fhandle, "(A,I8,A,I8,A)") '<Piece NumberOfPoints="', &
+                        p_mesh%i_nnumber, &
+                        '" NumberOfCells="', &
+                        p_mesh%i_enumfine, &
+                        '">'
+
+  !> Save the coordinates of all nodes
+  WRITE(i_fhandle, *) '<Points>'
+  WRITE(i_fhandle, "(A,I1,A)") '<DataArray type="Float32" NumberOfComponents="', &
+ 3 , '" format="ascii">'
+  DO i_cnt = 1, p_mesh%i_nnumber
+    WRITE(i_fhandle, *) r_nodecoor(:, i_cnt)
+  END DO
+  WRITE(i_fhandle, *) '</DataArray>'
+  WRITE(i_fhandle, *) '</Points>'
+
+  !> Write the cell (element) information
+  WRITE(i_fhandle, *) '<Cells>'
+
+  !> Save the node connectivity
+  WRITE(i_fhandle, *) '<DataArray type="Int32" Name="connectivity" format="ascii">'
+
+
+  !> write element nodes.  Write connectivity (indexing starts by 0!)
+  DO i_cnt = 1, p_mesh%i_enumfine
+    WRITE(i_fhandle, *) i_enodes(:, i_cnt) - 1
+  END DO
+  WRITE(i_fhandle, *) '</DataArray>'
+
+  !> Write the cell type (triangle = 5, tetrahedron = 10).
+  WRITE(i_fhandle, *) '<DataArray type="UInt8" Name="types" format="ascii">'
+  DO i_cnt = 1, p_mesh%i_enumfine
+    WRITE(i_fhandle, *) '5'
+  END DO
+  WRITE(i_fhandle, *) '</DataArray>'
+  WRITE(i_fhandle, *) '<DataArray type="Int32" Name="offsets" format="ascii">'
+  DO i_cnt = 1, p_mesh%i_enumfine
+    WRITE(i_fhandle, *) i_cnt * GRID_elementnodes
+  END DO
+  WRITE(i_fhandle, *) '</DataArray>'
+  WRITE(i_fhandle, *) '</Cells>'
+
+  !> write point data
+  WRITE(i_fhandle, *) '<PointData>'
+
+  !> Save the node numbers, when requested.
+  IF(l_write_grid_info) THEN
+    WRITE(i_fhandle, *) '<DataArray type="Int32" Name="Nodenumber" format="ascii">'
+
+    DO i_cnt = 1, p_mesh%i_nnumber
+      WRITE(i_fhandle, *) i_cnt
+    END DO
+
+    WRITE(i_fhandle, *) '</DataArray>'
+  END IF
+
+  !> Write the nodal variables, when present.
+  IF(PRESENT(i_nodedata) .AND. PRESENT(p_nodedata)) THEN
+    DO i_cnt = 1, i_nodedata
+      CALL write_vtu_data(i_fhandle, p_nodedata(i_cnt))
+    END DO
+  END IF
+
+  WRITE(i_fhandle, *) '</PointData>'
+
+
+
+  !> write cell data
+  WRITE(i_fhandle, *) '<CellData>'
+
+  !> save the element numbers, when requested.
+  IF(l_write_grid_info) THEN
+    WRITE(i_fhandle, *) '<DataArray type="Int32" Name="Elementnumber" format="ascii">'
+
+    DO i_cnt = 1, p_mesh%i_enumfine
+      WRITE(i_fhandle, *) i_cnt
+    END DO
+
+    WRITE(i_fhandle, *) '</DataArray>'
+  END IF
+
+  !> Write the cell variables (when present)
+  IF(PRESENT(i_celldata) .AND. PRESENT(p_celldata)) THEN
+    DO i_cnt = 1, i_celldata
+      CALL write_vtu_data(i_fhandle, p_celldata(i_cnt))
+    END DO
+  END IF
+
+  !> write the footer.
+  WRITE(i_fhandle, *) '</CellData>'
+  WRITE(i_fhandle, *) '</Piece>'
+  WRITE(i_fhandle, *) '</UnstructuredGrid>'
+  WRITE(i_fhandle, *) '</VTKFile>'
+
+  !> finally close the file and deallocate the data
+  CLOSE(i_fhandle)
+  DEALLOCATE(r_nodecoor, i_enodes)
+END SUBROUTINE plot_vtu_elements
+#endif !----3D output only
+
+!---------------------------------------------------------------------
+!> write_vtu_data writes a single variable (node or cell) to the
+!! VTK file.
+!> \param i_fhandle - the file handle
+!> \param p_data    - the variable
+!---------------------------------------------------------------------
+SUBROUTINE write_vtu_data(i_fhandle, p_data)
+  IMPLICIT NONE
+
+  INTEGER(KIND=GRID_SI), INTENT(IN)             :: i_fhandle
+  TYPE(t_vtu_data)                              :: p_data
+  INTEGER(KIND=GRID_SI)                         :: i_size
+  INTEGER(KIND=GRID_SI)                         :: i_cnt
+  INTEGER(KIND=GRID_SI)                         :: i_cnt2
+
+  !> Special treatment for vector valued data
+  IF(p_data%i_size > 1) THEN
+    WRITE(i_fhandle, "(A,A,A,I1, A)") &
+                '<DataArray type="Float32" Name="', &
+                TRIM(p_data%c_name), '" NumberOfComponents="', &
+                p_data%i_size, '" format="ascii">'
+  ELSE
+    WRITE(i_fhandle, "(A,A,A)") '<DataArray type="Float32" Name="', &
+                TRIM(p_data%c_name), '" format="ascii">'
+  END IF
+  i_size = SIZE(p_data%p_vdata, 2)
+
+  !> Write the data to file with respect to the threshold value
+  DO i_cnt = 1, i_size
+    DO i_cnt2 = 1, p_data%i_size
+      IF(ABS(p_data%p_vdata(i_cnt2, i_cnt)) < r_vtueps) &
+          p_data%p_vdata(i_cnt2, i_cnt) = 0
+    END DO
+
+    WRITE(i_fhandle, "(10e15.7)") p_data%p_vdata(1:p_data%i_size, i_cnt)
+  END DO
+  WRITE(i_fhandle, *) '</DataArray>'
+
+END SUBROUTINE write_vtu_data
+
+END MODULE IO_vtu
diff --git a/flash2d/src/flash/IO_vtuplot.F90 b/flash2d/src/flash/IO_vtuplot.F90
new file mode 100644
index 0000000..a3a2474
--- /dev/null
+++ b/flash2d/src/flash/IO_vtuplot.F90
@@ -0,0 +1,166 @@
+!*****************************************************************
+!
+!> @file IO_vtuplot.F90
+!> @brief includes module IO_vtuplot
+!
+!*****************************************************************
+!
+! VERSION(S):
+!  1. original version                        j. behrens    04/2000
+!  2. amatos-1.0 and 2D compliant             j. behrens    11/2000
+!  3. adapted to flash2d                      j. behrens    12/2014
+!
+!*****************************************************************
+! MODULE DESCRIPTION:
+!> prints data in VTU compatible file format
+!
+MODULE IO_vtuplot
+  USE FLASH_parameters
+  USE MISC_outputdata
+  USE GRID_api
+  USE IO_vtu
+  PRIVATE
+  INTEGER, SAVE :: i_timecounter= 0
+  PUBLIC :: generate_vtu
+  CONTAINS
+
+!*****************************************************************
+! DESCRIPTION of [SUBROUTINE generate_vtu]:
+!> @brief creates output in GMV compatible file format
+!>
+!> @param[in]       p_handle      grid handle for the linked lists
+!> @param[in]       i_time        time step number
+!> @param[in]       i_newslevel   the time level
+!>
+!> @note ON OUTPUT: a number of VTU compatible ascii files for each plotted time step
+!
+  SUBROUTINE generate_vtu(p_handle, i_time, i_newslevel)
+
+    IMPLICIT NONE
+
+!---------- local declarations
+
+    TYPE (grid_handle), INTENT(in)                        :: p_handle
+    INTEGER (KIND = GRID_SI), OPTIONAL, INTENT(in)        :: i_time
+    INTEGER (KIND = GRID_SI), OPTIONAL, INTENT(in)        :: i_newslevel
+    INTEGER (KIND = GRID_SI)                              :: i_alct, i_nnum, i_tnum
+    INTEGER (KIND = GRID_SI)                              :: i_nwl, i_elen, i_tcnt
+    REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER    :: r_val
+    REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER    :: r_velo
+    REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER    :: r_sta, r_lvl
+    INTEGER (KIND = GRID_SI), DIMENSION(:), ALLOCATABLE   :: i_ids, i_sta
+    CHARACTER (len=32)                                    :: c_mfile
+    CHARACTER (len=26)                                    :: c_tmp
+    LOGICAL                                               :: l_news
+    INTEGER, PARAMETER                                    :: i_vallen=5
+    INTEGER, DIMENSION(i_vallen)                          :: i_valind
+
+    TYPE(t_vtu_data), DIMENSION(2)                        :: celldata
+    TYPE(t_vtu_data), DIMENSION(4)                        :: nodedata
+    
+!---------- file handling (open)
+
+    IF(present(i_time)) THEN
+      i_tcnt= i_time
+      i_timecounter= i_timecounter+1
+    ELSE
+      i_tcnt= i_timecounter
+      i_timecounter= i_timecounter+1
+    END IF
+    write(c_tmp,*) trim(GRID_parameters%program_name(1:20))
+    write(c_mfile,10101) trim(c_tmp), '_', i_tcnt
+    c_tmp = adjustl(c_mfile)
+    write(c_mfile,*) TRIM(c_tmp), '.vtu'
+    c_mfile= adjustl(c_mfile)
+
+!---------- handle news level
+
+    IF(present(i_newslevel)) THEN
+      l_news=.TRUE.
+      i_nwl= i_newslevel
+    ELSE
+      l_news=.FALSE.
+    END IF
+
+!---------- the nodes
+
+    i_nnum = p_handle%i_nnumber
+
+!---------- extract nodal grid data and nodal values
+
+	ALLOCATE(r_val(i_vallen, i_nnum), stat=i_alct)
+	IF(i_alct /= 0) THEN
+	  CALL grid_error(c_error='[generate_vtu]: could not allocate values array')
+	END IF
+	i_valind= (/GRID_ucomp, GRID_vcomp, GRID_phi, GRID_zeta, GRID_tracer/)
+	CALL grid_getinfo(p_handle, r_nodevalues= r_val, i_arraypoint=i_valind)
+
+!---------- assign nodal values, but before allocate aux. arrays
+
+    ALLOCATE(r_velo(2,i_nnum), stat=i_alct)
+	IF(i_alct /= 0) THEN
+	  CALL grid_error(c_error='[generate_vtu]: could not allocate aux. velo arrays')
+	END IF
+
+!---------- generate 2D velocity field
+
+    r_velo(1:2,:)= r_val(1:2,:)
+
+    nodedata(1)%c_name = 'velocity'
+    nodedata(1)%i_size = 2
+    nodedata(1)%p_vdata => r_velo
+
+    nodedata(2)%c_name = 'height'
+    nodedata(2)%i_size = 1
+    nodedata(2)%p_vdata => r_val(3:3,:)
+
+    nodedata(3)%c_name = 'vorticity'
+    nodedata(3)%i_size = 1
+    nodedata(3)%p_vdata => r_val(4:4,:)
+
+    nodedata(4)%c_name = 'tracer'
+    nodedata(4)%i_size = 1
+    nodedata(4)%p_vdata => r_val(5:5,:)
+
+!---------- extract cells grid data
+
+	i_tnum= p_handle%i_enumfine
+	ALLOCATE(i_ids(i_tnum), i_sta(i_tnum), r_sta(1,i_tnum), r_lvl(1,i_tnum), stat=i_alct)
+	IF(i_alct /= 0) THEN
+	  CALL grid_error(c_error='[generate_vtu]: could not allocate cell value arrays')
+	END IF
+	IF(l_news) THEN
+	  CALL grid_getinfo(p_handle, i_newsdepth= i_nwl, i_elength= i_elen, &
+	    i_elementlevel= i_ids, i_elementstatus= i_sta)
+	  i_tnum= i_elen
+	ELSE
+	  CALL grid_getinfo(p_handle, i_elementlevel= i_ids, i_elementstatus= i_sta)
+	END IF
+
+    r_sta(1, :) = REAL(i_sta, GRID_SR)
+    r_lvl(1, :) = REAL(i_ids, GRID_SR)
+
+    ! Assign all values to driver
+    celldata(1)%c_name = 'status'
+    celldata(1)%i_size = 1
+    celldata(1)%p_vdata => r_sta
+
+    celldata(2)%c_name = 'level'
+    celldata(2)%i_size = 1
+    celldata(2)%p_vdata => r_lvl
+    
+    ! plot the vtu data
+    CALL plot_vtu(p_handle, c_mfile, i_nodedata = 4, p_nodedata = nodedata, &
+                  i_celldata = 2, p_celldata = celldata, i_zcoordinate = 4)
+
+    DEALLOCATE(i_ids, i_sta, r_sta, r_lvl, &
+               r_val, r_velo)
+
+    RETURN
+
+!---------- FORMAT
+ 10101    FORMAT(a19,a1,i6.6)
+
+  END SUBROUTINE generate_vtu
+
+END MODULE IO_vtuplot
diff --git a/flash2d/src/flash/MISC_outputdata.F90 b/flash2d/src/flash/MISC_outputdata.F90
new file mode 100644
index 0000000..5b4f09f
--- /dev/null
+++ b/flash2d/src/flash/MISC_outputdata.F90
@@ -0,0 +1,155 @@
+!*****************************************************************
+!
+!> @file MISC_outputdata.F90
+!> @brief includes module MISC_outputdata
+!
+!*****************************************************************
+!
+! VERSION(S):
+!
+!*****************************************************************
+! MODULE DESCRIPTION:
+!> This module contains routines for retrieving some additional data
+!> for plotting from standard grids (no grid variables required)
+!
+MODULE MISC_outputdata
+
+  USE GRID_api
+
+  PUBLIC :: data_markededgevector, data_sfcvector
+
+  PRIVATE
+
+  CONTAINS
+!*****************************************************************
+! DESCRIPTION of [SUBROUTINE ]:
+!> @brief short description
+!>
+!> @param           p_mesh
+!> @param           r_sfc
+!
+  SUBROUTINE DATA_sfcvector(p_mesh, r_sfc)
+
+    IMPLICIT NONE
+
+    TYPE(GRID_handle), INTENT(IN)                         :: p_mesh
+    REAL(KIND=GRID_SR), INTENT(OUT), DIMENSION(:,:)       :: r_sfc
+
+    REAL(KIND=GRID_SR), DIMENSION(:,:), ALLOCATABLE       :: r_nodecoor
+    INTEGER(KIND=GRID_SI), DIMENSION(:,:), ALLOCATABLE    :: i_enodes
+
+    REAL(KIND=GRID_SR), DIMENSION(GRID_dimension)         :: r_midpoint1
+    REAL(KIND=GRID_SR), DIMENSION(GRID_dimension)         :: r_midpoint2
+
+    INTEGER(KIND=GRID_SI)                                 :: i_ecnt, i_ncnt
+!- allocate the needed memory
+    ALLOCATE( r_nodecoor(GRID_dimension, p_mesh%i_nnumber), &
+              i_enodes(GRID_elementnodes, p_mesh%i_enumfine))
+
+    CALL GRID_getinfo(p_mesh, r_nodecoordinates = r_nodecoor, &
+                      i_elementnodes = i_enodes)
+
+! initialize data
+    r_midpoint2 = 0_GRID_SR
+
+    DO i_ncnt = 1, GRID_elementnodes
+      r_midpoint2 = r_midpoint2 + r_nodecoor(:,i_enodes(i_ncnt, 1))
+    END DO
+
+    r_midpoint2 = 1_GRID_SR / REAL(GRID_elementnodes, GRID_SR) * r_midpoint2
+
+    DO i_ecnt = 1, p_mesh%i_enumfine - 1
+      r_midpoint1 = r_midpoint2
+
+      r_midpoint2 = 0_GRID_SR
+      DO i_ncnt = 1, GRID_elementnodes
+        r_midpoint2 = r_midpoint2 + r_nodecoor(:,i_enodes(i_ncnt, i_ecnt+1))
+      END DO
+
+      r_midpoint2 = 1_GRID_SR / REAL(GRID_elementnodes, GRID_SR) * r_midpoint2
+
+      r_sfc(1:2, i_ecnt)=r_midpoint2 - r_midpoint1
+
+      r_sfc(3, i_ecnt) = 0.0
+
+    END DO
+
+    r_sfc(:, p_mesh%i_enumfine) = 0_GRID_SR
+
+    DEALLOCATE( r_nodecoor, i_enodes )
+  END SUBROUTINE DATA_sfcvector
+
+!*****************************************************************
+! DESCRIPTION of [SUBROUTINE ]:
+!> @brief short description
+!>
+!> @param           p_mesh
+!> @param           r_mvec
+!
+  SUBROUTINE DATA_markededgevector(p_mesh, r_mvec)
+
+    IMPLICIT NONE
+
+    TYPE(GRID_handle), INTENT(IN)                         :: p_mesh
+    REAL(KIND=GRID_SR), INTENT(OUT), DIMENSION(:, :)      :: r_mvec
+
+    REAL(KIND=GRID_SR), DIMENSION(:,:), ALLOCATABLE       :: r_nodecoor
+    INTEGER(KIND=GRID_SI), DIMENSION(:,:), ALLOCATABLE    :: i_gnodes
+    INTEGER(KIND=GRID_SI), DIMENSION(:,:), ALLOCATABLE    :: i_enodes
+    INTEGER(KIND=GRID_SI), DIMENSION(:), ALLOCATABLE      :: i_emark
+    INTEGER(KIND=GRID_SI), DIMENSION(:,:), ALLOCATABLE    :: i_eedges
+
+    REAL(KIND=GRID_SR), DIMENSION(GRID_dimension)         :: r_midpoint
+    REAL(KIND=GRID_SR), DIMENSION(GRID_dimension)         :: r_egpoint
+
+    INTEGER(KIND=GRID_SI)                                 :: i_ncnt, i_ecnt
+    INTEGER(KIND=GRID_SI)                                 :: i_markededge
+
+!- allocate the needed memory
+    ALLOCATE( r_nodecoor(GRID_dimension, p_mesh%i_nnumber), &
+              i_gnodes(GRID_edgenodes, p_mesh%i_gnumfine), &
+              i_enodes(GRID_elementnodes, p_mesh%i_enumfine), &
+              i_emark(p_mesh%i_enumfine), &
+              i_eedges(GRID_elementedges, p_mesh%i_enumfine))
+
+!- get the needed information from mesh
+    CALL GRID_getinfo(p_mesh, r_nodecoordinates = r_nodecoor, &
+                      i_edgenodes = i_gnodes, &
+                      i_elementnodes = i_enodes, &
+                      i_elementmark = i_emark, &
+                      i_elementedges = i_eedges, &
+                      l_finelevel = .TRUE.)
+
+    DO i_ecnt = 1, p_mesh%i_enumfine
+      r_midpoint = 0_GRID_SR
+
+      DO i_ncnt = 1, GRID_elementnodes
+        r_midpoint = r_midpoint + r_nodecoor(:,i_enodes(i_ncnt, i_ecnt))
+      END DO
+
+      r_midpoint = 1._GRID_SR/REAL(GRID_elementnodes, GRID_SR) * r_midpoint
+
+      i_markededge = i_eedges(i_emark(i_ecnt), i_ecnt)
+
+      r_egpoint = 0_GRID_SR
+      DO i_ncnt = 1, GRID_edgenodes
+        r_egpoint = r_egpoint + r_nodecoor(:,i_gnodes(i_ncnt, i_markededge))
+      END DO
+
+      r_egpoint = 1._GRID_SR/REAL(GRID_edgenodes, GRID_SR) * r_egpoint
+
+      r_mvec(1:2, i_ecnt) = r_egpoint - r_midpoint
+      r_mvec(3, i_ecnt)   = 0.0
+    END DO
+
+!- deallocate
+    DEALLOCATE( r_nodecoor, &
+                i_gnodes, &
+                i_enodes, &
+                i_emark, &
+                i_eedges)
+
+  END SUBROUTINE DATA_markededgevector
+
+!*****************************************************************
+END MODULE MISC_outputdata
diff --git a/flash2d/src/flash/README b/flash2d/src/flash/README
new file mode 100644
index 0000000..2990304
--- /dev/null
+++ b/flash2d/src/flash/README
@@ -0,0 +1,48 @@
+**************************************************************************
+ FLASH90
+ FLexible Adaptive Semi-Lagrangian Hack
+ written in Fortran 90
+
+**************************************************************************
+
+ CONTENTS OF THIS DIRECTORY "$(FLASHDIR)/lib"
+
+ADV_rhs.f		- Module for calculating Right Hand Side
+ADV_rhs.gerrit		- Module for Right Hand Side (Aerosol Exper.)
+ADV_rhs.hom		- Module for Right Hand Side (homogeneous RHS)
+ADV_semilagrange.dual	- Module for SLM with dual grid approach
+ADV_semilagrange.f	- Module for SLM
+ADV_wind.bar		- Module for wind field (shear stress example)
+ADV_wind.constant	- Module for wind field (constant wind for Slotted Cyl.)
+ADV_wind.f		- Module for wind field
+ADV_wind.file		- Module for wind field (read wind field from file)
+Flash90.f		- Main program
+gridgen			- directory for the grid generator
+IO_plot.f		- Module for the plotting routines
+IO_plotdefine.f		- Module for definitions in plotting routines
+IO_utils.f		- Module for IO utility routines
+MISC_globalparam.f	- Module for global parameter definitions
+MISC_timing.f		- Module for the timing routines
+README			- this file
+SLM_errorestimate.f	- Module for the error estimation calculation
+SLM_initial.bar		- Module for the initial values (shear stress example)
+SLM_initial.f		- Module for the initial values 
+SLM_initial.file	- Module for the initial values (read from file)
+SLM_initial.gerrit	- Module for the initial values (Aerosol Exper.)
+SLM_initial.slot	- Module for the initial values (Slotted Cyl.)
+SLM_interpolation.clip	- Module for SLM interpolation (clipping)
+SLM_interpolation.cons	- Module for SLM interpolation (quasi conservative)
+SLM_interpolation.f	- Module for SLM interpolation 
+SLM_interpolation.plain	- Module for SLM interpolation (plain bicubic)
+system			- directory for system dependent routines
+utils			- directory for utility programs
+
+--------------------------------------------------------------------------
+
+ WHAT TO DO HERE:
+
+just look around, find better ways...
+
+**************************************************************************
+ j. behrens, 8/98
+**************************************************************************
diff --git a/flash2d/src/flash/SLM_advanced.f90 b/flash2d/src/flash/SLM_advanced.f90
new file mode 100644
index 0000000..ca6dfec
--- /dev/null
+++ b/flash2d/src/flash/SLM_advanced.f90
@@ -0,0 +1,381 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_advanced
+! FUNCTION:
+!	provide advanced semi-Lagrangian routines
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_step
+! FUNCTION:
+!	one step of the basic SLM algorithm
+! SYNTAX:
+!	CALL slm_step(int, real.arr, real.arr)
+! ON INPUT:
+!	...
+! ON OUTPUT:
+!	r_tracer: array with tracer values	real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_displace
+! FUNCTION:
+!	extrapolate the alpha, values for the displacements of the upstream
+!	points from the gridpoints
+! SYNTAX:
+!	CALL slm_displace(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_coord: real array of xy-coordinates		real
+! ON OUTPUT:
+!	r_alpha: displacement vectors to each point	real
+! CALLS:
+!	wind_field
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_update
+! FUNCTION:
+!	calculate the update to the velocity
+! SYNTAX:
+!	CALL slm_update(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_rside: array with right hand side values	real
+! ON OUTPUT:
+!	r_udate: array with new (updated) gid values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is trivial for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_upstream
+! FUNCTION:
+!	calculate right hand side of the equation (upstream values)
+! SYNTAX:
+!	CALL slm_upstream(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_alpha: displacement vectors to each point	real
+! ON OUTPUT:
+!	r_rside: array with right hand side values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is just interpolation for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_interpolate
+! FUNCTION:
+!	do the interpolation
+! SYNTAX:
+!	CALL slm_interpolate(grid, int, real, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	p_ogrid: grid handle to old grid (with data)	TYPE (grid_handle)
+!	r_fac:   factor at which point to interpolate	REAL
+!	i_arlen: array length for the following arrays	INTEGER
+!	r_coord: coordinate array (new grid)		REAL
+!	r_alpha: displacement array (corr. to r_coord)	REAL
+!	r_value: values on the old grid (array)		REAL
+! ON OUTPUT:
+!	r_rside: right hand side (interpolated)		REAL
+! CALLS:
+!
+! COMMENTS:
+!	this one is plain bi-cubic spline interpolation
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_astep
+! COMMENTS:
+!
+! USES:
+!	FLASH_parameters, GRID_api, ADV_wind, ADV_rhs
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	4/2002
+!	2. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_advanced
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE GRID_api
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_astep
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_astep(p_ghand, p_param, p_time, r_modtime, i_size, &
+	                       r_coord, r_tracer, i_newsdepth)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                         :: p_param
+	  TYPE (sw_info), INTENT(inout)                             :: p_time
+	  REAL (KIND = GRID_SR), INTENT(in)                         :: r_modtime
+	  INTEGER, INTENT(in)                                       :: i_size
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_size), INTENT(out)     :: r_tracer
+	  INTEGER, OPTIONAL, INTENT(in)                             :: i_newsdepth
+	  
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE          :: r_newvl
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_alpha
+	  INTEGER                                                   :: i_alct
+
+!---------- check size!
+
+	  IF(i_size <= 0) THEN
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'INFO [slm_astep]: Zero step size, returning to calling routine'
+	    RETURN
+	  END IF
+
+!---------- allocate auxiliary arrays
+
+	  allocate(r_newvl(i_size), r_alpha(GRID_dimension,i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(38)
+	  END IF not_alloc
+
+!-SLM--------- calculate trajectory pieces (displacements)
+
+	  CALL stop_watch('start',3,p_time)
+	  CALL slm_adisplace(p_param, i_size, r_coord, r_alpha, r_time=r_modtime)
+	  CALL stop_watch('stop ',3,p_time)
+
+!-SLM--------- calculate right hand side
+
+	  CALL stop_watch('start',4,p_time)
+	  CALL slm_aupstream(p_ghand, i_size, r_coord, r_alpha, r_newvl)
+	  CALL stop_watch('stop ',4,p_time)
+
+!-SLM--------- calculate new grid values
+
+	  CALL stop_watch('start',5,p_time)
+	  CALL slm_aupdate(p_param, i_size, r_coord, r_newvl, r_tracer, r_time=r_modtime)
+	  CALL stop_watch('stop ',5,p_time)
+
+!-SLM--------- put alpha values to u and v field entries
+
+	  r_alpha= -r_alpha
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_newsdepth=i_newsdepth, i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  ELSE
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  END IF
+
+!-SLM--------- deallocate work arrays
+
+	  deallocate(r_alpha, r_newvl)
+
+	  RETURN
+	  END SUBROUTINE slm_astep
+
+!*****************************************************************
+	  SUBROUTINE slm_adisplace(p_param, i_arlen, r_coord, r_alpha, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                      :: p_param
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_alpha
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                           :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_fac, r_caf, &
+	    r_axy, r_xyc
+	  REAL (KIND = GRID_SR)                                                 :: r_dt0, r_dt1, &
+	    r_dt2, r_tim
+	  INTEGER                                              :: i_cnt1, i_cnt2
+          
+!---------- set constants
+
+	  r_dt0= p_param%num%r_deltatime
+	  r_dt1= 0.5_GRID_SR* p_param%num%r_deltatime
+	  r_dt2= 1.5_GRID_SR* p_param%num%r_deltatime
+	  r_fac= 0.5_GRID_SR
+	  r_caf= 2.0_GRID_SR
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- calculate in an iteration process the displacements
+
+	  unknown_loop: DO i_cnt1=1,i_arlen
+	    r_axy= 0.0_GRID_SR
+
+	    iter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_coord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO iter_loop
+
+	    r_alpha(:,i_cnt1)= r_axy
+	  END DO unknown_loop
+
+	  RETURN
+	  END SUBROUTINE slm_adisplace
+
+!*****************************************************************
+	  SUBROUTINE slm_aupdate(p_param, i_arlen, r_coord, r_rside, r_udate, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                   :: p_param
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_udate
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                          :: r_time
+	  INTEGER                                             :: i_cnt
+	  REAL (KIND = GRID_SR)                                                :: r_dt, r_tim
+
+!---------- in the linear advection case and with f90 this is just
+
+!	  r_udate= r_rside
+
+!---------- including a non-zero right hand side, we have
+
+	  r_dt= p_param%num%r_deltatime
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+	  main_loop: DO i_cnt=1, i_arlen
+	    r_udate(i_cnt)= r_rside(i_cnt)+ r_dt* slm_righthand(r_coord(:,i_cnt))
+	  END DO main_loop
+
+	  RETURN
+	  END SUBROUTINE slm_aupdate
+
+!*****************************************************************
+	  SUBROUTINE slm_aupstream(p_mesh, i_arlen, r_coord, &
+	                          r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                     :: r_fac
+
+!---------- set factor (at which point of trajectory shall i interpolate)
+
+	  r_fac= 1.0_GRID_SR
+
+!---------- in the linear advection case this is just interpolation
+
+	  CALL slm_ainterpolate(p_mesh, r_fac, i_arlen, r_coord, &
+	                       r_alpha, r_rside)
+
+	  RETURN
+	  END SUBROUTINE slm_aupstream
+!*****************************************************************
+	  SUBROUTINE slm_ainterpolate(p_mesh, r_fac, i_arlen, &
+	                             r_coord, r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in)         :: r_fac
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE                   :: r_upstr
+	  REAL (KIND = GRID_SR)                                                :: r_eps
+	  INTEGER                                             :: i_cnt, i_alct, &
+	    i_val, i_out, i_stat
+
+!---------- initialize constant
+
+	  i_val= GRID_tracer
+	  r_eps= GRID_EPS
+
+!---------- allocate work array
+
+	  ALLOCATE(r_upstr(GRID_dimension,i_arlen), stat=i_alct)
+	  not_allocated: IF(i_alct /= 0) THEN
+	    CALL grid_error(60)
+	  END IF not_allocated
+
+!---------- calculate upstream coordinates
+
+	  dim_loop: DO i_cnt=1, GRID_dimension
+	    r_upstr(i_cnt,:) = r_coord(i_cnt,:)- r_fac(i_cnt)* r_alpha(i_cnt,:)
+	  END DO dim_loop
+
+!---------- loop over nodes: find element containing upstream point
+
+	  node_loop: DO i_cnt=1, i_arlen
+
+!---------- check if upstream value is outside of the domain
+
+	    i_out= grid_domaincheck(p_mesh(i_time), r_upstr(:,i_cnt))
+
+!---------- take the intersection of the trajectory with the boundary as new upstream point
+
+	    out_domain: IF(i_out /= 0) then
+	      r_upstr(:,i_cnt)= grid_boundintersect(p_mesh(i_time), &
+	                        r_coord(:,i_cnt), r_upstr(:,i_cnt), i_info=i_stat)
+	      no_intersect: IF(i_stat /= 0) THEN
+	        r_rside(i_cnt)= 0.0_GRID_SR
+	        CYCLE node_loop
+	      END IF no_intersect
+	    END IF out_domain
+
+!---------- interpolate
+
+	    r_rside(i_cnt)= grid_coordvalue(p_mesh(i_time), r_upstr(:,i_cnt), &
+	                    i_interpolorder=GRID_highorder, i_valpoint=i_val)
+	    small_val: IF(abs(r_rside(i_cnt)) < r_eps) THEN
+	      r_rside(i_cnt)= 0.0_GRID_SR
+	    END IF small_val
+
+	  END DO node_loop
+
+!---------- deallocate work array
+
+	  DEALLOCATE(r_upstr)
+
+	  RETURN
+	  END SUBROUTINE slm_ainterpolate
+
+
+	END MODULE SLM_advanced
diff --git a/flash2d/src/flash/SLM_errorestimate.f90 b/flash2d/src/flash/SLM_errorestimate.f90
new file mode 100644
index 0000000..08463f4
--- /dev/null
+++ b/flash2d/src/flash/SLM_errorestimate.f90
@@ -0,0 +1,144 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_errorestimate
+! FUNCTION:
+!	provide an error estimator for the adaptive SLM scheme
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_error
+! FUNCTION:
+!	estimate the error elementwise
+! SYNTAX:
+!	real= slm_error(real.arr)
+! ON INPUT:
+!	r_v:       values at element nodes	REAL
+! ON OUTPUT:
+!	r_esterr:  estimated error		REAL
+! CALLS:
+!
+! COMMENTS:
+!	this is only a simple estimator based on local gradients
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_errorest
+! FUNCTION:
+!	this hides the loop structure from the advection part
+! SYNTAX:
+!	CALL slm_errorest(grid, int, real.arr)
+! ON INPUT:
+!	p_ghand: handle for the grid		TYPE (grid_handle)
+!	i_siz:   size of array for local errors	INTEGER
+! ON OUTPUT:
+!	i_siz:   size of array for local errors	INTEGER
+!	r_arr:   estimated error		REAL
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_errorest
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	11/96
+!	2. nodal values time depend.	j. behrens	1/97
+!	3. FEM_handle added		j. behrens	7/97
+!	4. version with hashing		j. behrens	7/97
+!	5. changed to use GRID_api	j. behrens	11/97
+!	6. compliant to amatos 1.0	j. behrens	12/2000
+!	7. compliant to amatos 1.2	j. behrens	3/2002
+!	8. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_errorestimate
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC :: slm_errorest
+	  CONTAINS
+!*****************************************************************
+	  FUNCTION slm_error(r_v) RESULT (r_esterr)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_elementnodes) :: r_v
+	  REAL (KIND = GRID_SR)                               :: r_esterr
+	  REAL (KIND = GRID_SR), PARAMETER                    :: r_1o3= (1.0/3.0)
+	  REAL (KIND = GRID_SR)                               :: r_d1, r_d2, r_d3
+
+!---------- calculate differences
+
+	  r_d1  =  abs(r_v(1)- r_v(2))
+	  r_d2  =  abs(r_v(2)- r_v(3))
+	  r_d3  =  abs(r_v(3)- r_v(1))
+
+!---------- this is the estimated error
+
+	  r_esterr= (r_d1+ r_d2+ r_d3)* r_1o3
+
+	  RETURN
+	  END FUNCTION slm_error
+
+!*****************************************************************
+	  SUBROUTINE slm_errorest(p_ghand, i_siz, r_arr)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (grid_handle), INTENT(in)  :: p_ghand
+	  INTEGER, INTENT(in)             :: i_siz
+	  REAL (KIND = GRID_SR), DIMENSION(:), INTENT(out)    :: r_arr
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE  :: r_aux
+	  INTEGER, DIMENSION(:,:), ALLOCATABLE                :: i_enods
+	  INTEGER                         :: i_cnt, i_size, i_alct, i_nnum
+	  INTEGER, DIMENSION(1)           :: i_valind
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_elementnodes) :: r_tmp
+
+!---------- allocate auxilliary array
+
+	  i_size= p_ghand%i_enumfine
+	  i_nnum= p_ghand%i_nnumber
+	  IF(i_siz /= i_size) THEN
+	    CALL grid_error(48)
+	  END IF
+
+	  ALLOCATE(r_aux(1,i_nnum), &
+	           i_enods(GRID_elementnodes,i_size), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(49)
+	  END IF
+
+!---------- get values
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_getinfo(p_ghand, l_finelevel= .TRUE., i_arraypoint=i_valind, &
+	                    r_nodevalues= r_aux, i_elementnodes=i_enods)
+
+!---------- loop through all elements of finest loop
+
+	  elmt_loop: DO i_cnt=1,i_siz
+	    r_tmp(1:GRID_elementnodes)= r_aux(1,i_enods(1:GRID_elementnodes,i_cnt))
+	    r_arr(i_cnt)= slm_error(r_tmp)
+	  END DO elmt_loop
+
+!---------- deallocate and exit
+
+	  DEALLOCATE(r_aux, i_enods)
+
+	  RETURN
+	  END SUBROUTINE slm_errorest
+
+	END MODULE SLM_errorestimate
diff --git a/flash2d/src/flash/SLM_initial.f90 b/flash2d/src/flash/SLM_initial.f90
new file mode 100644
index 0000000..c3dd7dd
--- /dev/null
+++ b/flash2d/src/flash/SLM_initial.f90
@@ -0,0 +1,495 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_initial
+! FUNCTION:
+!	initialize slotted cylinder for semi-Lagrangian advection
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialvalues
+! FUNCTION:
+!	initialize a grid with values
+! SYNTAX:
+!	CALL slm_initialvalues(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initslot
+! FUNCTION:
+!	initialize a grid with values of slotted cylinder test case
+! SYNTAX:
+!	CALL slm_initslot(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_analyticsolution
+! FUNCTION:
+!	calculates the 'analytic solution' to compare with in diagnostics
+! SYNTAX:
+!	CALL slm_analyticsolution(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initcylndr
+! FUNCTION:
+!	initialize a grid with values of a cylinder test case
+! SYNTAX:
+!	CALL slm_initcylndr(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_centr: coordinates of cyl. centre	REAL
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	in_side
+! FUNCTION:
+!	checks, if a given point (x,y) lies within a given triangle
+! SYNTAX:
+!	logical= in_side(real.arr, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	r_coord: coordinate array		REAL
+!	r_node1: node1 of triangle		REAL
+!	r_node2: node2 of triangle		REAL
+!	r_node3: node3 of triangle		REAL
+! ON OUTPUT:
+!	l_in:    .true. if r_coord \in p_elem	logical
+! CALLS:
+!
+! COMMENTS:
+!	this routine decides whether a point lies in or out of a
+!	triangle. this is done with the following approach:
+!	calculate the area for the given triangle and for the 
+!	three triangles resulting from drawing lines from the given
+!	point to all three triangle nodes.
+!	if the sum of the areas of those three trianlges exceeds
+!	the area of the given trianlge, the the point lies outside
+!	of it.
+!	for calculation of the areas following formula is used:
+!	(Herons formula(?))
+!
+!	A = sqrt(s* (s- a)* (s- b)* (s- c)),
+!
+!	where s= 1/2* (a+ b+ c)
+!	      a, b, c sides.
+!
+!	in order to calculate the sidelengths |x-y|= sqrt(x**2-y**2)
+!	the complex absolute value intrinsic function is used.
+!	hopefully this fuction is faster than using sqrt and
+!	power-of-two instead.
+!
+!	internally double precision is used in this function, because
+!	machine precision is crucial when a coordinate pair appears
+!	near the edge or corner of an element.
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	dc_area
+! FUNCTION:
+!	calculate area of a triangle (in a plain) in double precision
+! SYNTAX:
+!	real= dc_area(real.arr, real.arr, real.arr)
+! ON INPUT:
+!	r_coord1: node1 of triangle			REAL
+!	r_coord2: node2 of triangle			REAL
+!	r_coord3: node3 of triangle			REAL
+! ON OUTPUT:
+!	r_area:   area of triangle			REAL
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_initialvalues, slm_analyticsolution
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	7/97
+!	2. names changed		j. behrens	7/97
+!	3. changed to use GRID_api	j. behrens	11/97
+!	4. changed interfaces		j. behrens	12/97
+!	5. compliant to amatos 1.0	j. behrens	12/2000
+!	6. compliant to amatos 1.2	j. behrens	3/2002
+!	7. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_initial
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC slm_initialvalues, slm_analyticsolution
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_cntr=(/ -0.25, 0.0 /)
+	  REAL (KIND = GRID_SR)                            :: r_hgt=4.0
+	  REAL (KIND = GRID_SR)                            :: r_srd=0.15
+	  REAL (KIND = GRID_SR)                            :: r_sln=0.22
+	  REAL (KIND = GRID_SR)                            :: r_swd=0.06
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_initialvalues(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  INTEGER                                    :: i_lev= 6
+
+!---------- initialize some constant for the slotted cylinder
+
+	  cyl_slot: IF(p_ghand%i_maxlvl < i_lev) THEN
+	    CALL slm_initcylndr(p_ghand)
+	  ELSE cyl_slot
+	    CALL slm_initslot(p_ghand)
+	  END IF cyl_slot
+
+	  RETURN
+	  END SUBROUTINE slm_initialvalues
+!*****************************************************************
+	  SUBROUTINE slm_analyticsolution(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)              :: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  INTEGER, INTENT(in)                         :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)       :: r_array
+	  REAL (KIND = GRID_SR)                                        :: r_fac=.36361e-4
+	  REAL (KIND = GRID_SR)                                        :: r_rds, r_ras, r_rad, &
+	    r_ads, r_bds, r_cds, r_f1, r_f2, r_xya, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_fc, r_p1, r_p2, &
+	    r_pa, r_pb, r_pc, r_pd, r_tmp, r_centr
+	  INTEGER                                     :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE           :: r_coo
+	  LOGICAL                                     :: l_aux
+
+!---------- initialize some constants for the slotted cylinder
+
+	  r_centr(1)= -cos(r_fac* r_time)* 0.25_GRID_SR ! <--- based on 2D
+	  r_centr(2)= -sin(r_fac* r_time)* 0.25_GRID_SR ! <--- based on 2D
+
+	  r_rds= r_srd* r_srd
+	  r_ras= dot_product(r_centr, r_centr)
+	  r_rad= sqrt(r_ras)
+	  r_ads= r_swd* 0.5_GRID_SR
+	  r_bds= r_srd- r_sln
+	  r_cds= r_srd
+	  r_f1 = (r_rad- r_ads)/ r_rad
+	  r_f2 = (r_rad+ r_ads)/ r_rad
+	  r_p1 = abs(r_centr)
+	  r_xya= sum(r_p1)
+	  IF(r_xya == 0.0_GRID_SR) THEN
+	    r_fc= 0.0_GRID_SR
+	  ELSE
+	    r_fc(1)= -r_centr(2)/ r_xya
+	    r_fc(2)=  r_centr(1)/ r_xya
+	  END IF
+
+!---------- calculate endpoints of the slot
+
+	  r_p1= r_f1* r_centr
+	  r_p2= r_f2* r_centr
+
+	  r_pa= r_p1+ r_fc* r_bds
+	  r_pb= r_p1+ r_fc* r_cds
+	  r_pc= r_p2+ r_fc* r_cds
+	  r_pd= r_p2+ r_fc* r_bds
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  IF(i_arlen /= i_num) THEN
+	    CALL grid_error(52)
+	  END IF
+
+	  ALLOCATE(r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(53)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_array(i_count)= 0.0
+	    r_tmp(:)        = r_coo(:,i_count)- r_centr(:)
+	    r_dpt= dot_product(r_tmp, r_tmp)
+	    inside: IF(r_dpt < r_rds) THEN
+	      r_array(i_count)= r_hgt
+	      l_aux= in_side(r_coo(:,i_count), r_pa, r_pb, r_pc)
+	      IF(l_aux) r_array(i_count)= 0.0
+	      l_aux= in_side(r_coo(:,i_count), r_pa, r_pc, r_pd)
+	      IF(l_aux) r_array(i_count)= 0.0
+	    END IF inside
+	  END DO node_loop
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsolution
+
+!*****************************************************************
+	  FUNCTION dc_area(r_coord1, r_coord2, r_coord3) RESULT (r_area)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord1, r_coord2, r_coord3
+	  REAL (KIND = GRID_DR)                            :: r_area
+	  REAL (KIND = GRID_DR)                            :: r_c
+	  REAL (KIND = GRID_DR), DIMENSION(GRID_dimension) :: r_a, r_b
+	  INTEGER                                     :: i_cnt
+
+!---------- calculate vector components
+
+	  dim_loop: DO i_cnt=1, GRID_dimension
+	    r_a(i_cnt)= REAL((r_coord2(i_cnt)- r_coord1(i_cnt)),GRID_DR)
+	    r_b(i_cnt)= REAL((r_coord3(i_cnt)- r_coord1(i_cnt)),GRID_DR)
+	  END DO dim_loop
+
+!---------- calculate components (a,b,c) of cross product vector
+
+	  r_c= (r_a(1)* r_b(2)- r_a(2)* r_b(1))
+
+!---------- calculate area
+
+	  r_area= abs(r_c)* 0.5_GRID_DR
+
+	  RETURN
+	  END FUNCTION dc_area
+
+!*****************************************************************
+	  FUNCTION in_side(r_coord, r_node1, r_node2, r_node3) RESULT (l_in)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_node1, r_node2, r_node3
+	  LOGICAL                                     :: l_in
+	  REAL (KIND = GRID_DR)                            :: r_sum, r_f, r_f1, r_f2, r_f3
+	  REAL (KIND = GRID_DR)                            :: r_eps
+
+!---------- set in_side value to out
+
+ 	  l_in= .FALSE.
+
+!---------- set epsilon (machine precision)
+
+	  r_eps= GRID_eps
+
+!---------- calculate areas (f, f1, f2, f3)
+
+	  r_f = dc_area(r_node1, r_node2, r_node3)
+	  r_f1= dc_area(r_coord, r_node2, r_node3)
+	  r_f2= dc_area(r_coord, r_node1, r_node2)
+	  r_f3= dc_area(r_coord, r_node1, r_node3)
+
+!---------- check if summed area is bigger than triangle area
+
+	  r_sum= r_f1+ r_f2+ r_f3
+	  if((r_sum- r_f) < r_eps) l_in= .TRUE.
+
+	  RETURN
+	  END FUNCTION in_side
+
+!*****************************************************************
+	  SUBROUTINE slm_initslot(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_centr
+	  REAL (KIND = GRID_SR)                                       :: r_rds, r_ras, r_rad, &
+	    r_ads, r_bds, r_cds, r_f1, r_f2, r_xya, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_fc, r_p1, r_p2, &
+	    r_pa, r_pb, r_pc, r_pd, r_tmp
+	  INTEGER                                    :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_coo
+	  LOGICAL                                     :: l_aux
+	  INTEGER, DIMENSION(1)                       :: i_valind
+
+!---------- initialize some constants for the slotted cylinder
+
+	  r_centr= r_cntr
+	  r_rds= r_srd* r_srd
+	  r_ras= dot_product(r_centr, r_centr)
+	  r_rad= sqrt(r_ras)
+	  r_ads= r_swd* 0.5_GRID_SR
+	  r_bds= r_srd- r_sln
+	  r_cds= r_srd
+	  r_f1 = (r_rad- r_ads)/ r_rad
+	  r_f2 = (r_rad+ r_ads)/ r_rad
+	  r_p1 = abs(r_centr)
+	  r_xya= sum(r_p1)
+	  IF(r_xya == 0.0_GRID_SR) THEN
+	    r_fc= 0.0_GRID_SR
+	  ELSE
+	    r_fc(1)= -r_centr(2)/ r_xya
+	    r_fc(2)=  r_centr(1)/ r_xya
+	  END IF
+
+!---------- calculate endpoints of the slot
+
+	  r_p1= r_f1* r_centr
+	  r_p2= r_f2* r_centr
+
+	  r_pa= r_p1+ r_fc* r_bds
+	  r_pb= r_p1+ r_fc* r_cds
+	  r_pc= r_p2+ r_fc* r_cds
+	  r_pd= r_p2+ r_fc* r_bds
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(54)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_aux(1,i_count)= 0.0_GRID_SR
+	    r_tmp(:)        = r_coo(:,i_count)- r_centr(:)
+	    r_dpt= dot_product(r_tmp, r_tmp)
+	    inside: IF(r_dpt < r_rds) THEN
+	      r_aux(1,i_count)= r_hgt
+	      l_aux= in_side(r_coo(:,i_count), r_pa, r_pb, r_pc)
+	      IF(l_aux) r_aux(1,i_count)= 0.0
+	      l_aux= in_side(r_coo(:,i_count), r_pa, r_pc, r_pd)
+	      IF(l_aux) r_aux(1,i_count)= 0.0
+	    END IF inside
+	  END DO node_loop
+
+!---------- update grid information
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_initslot
+
+!*****************************************************************
+	  SUBROUTINE slm_initcylndr(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_centr
+	  REAL (KIND = GRID_SR)                                       :: r_rds, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_tmp
+	  INTEGER                                    :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_coo
+	  INTEGER, DIMENSION(1)                       :: i_valind
+
+!---------- initialize some constant for the slotted cylinder
+
+	  r_rds= r_srd* r_srd
+	  r_centr= r_cntr
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(55)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_aux(1,i_count)= 0.0_GRID_SR
+	    r_tmp(:)      = r_coo(:,i_count)- r_centr(:)
+	    r_dpt= dot_product(r_tmp, r_tmp)
+	    inside: IF(r_dpt < r_rds) THEN
+	      r_aux(1,i_count)= r_hgt
+	    END IF inside
+	  END DO node_loop
+
+!---------- update grid information
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_initcylndr
+
+	END MODULE SLM_initial
diff --git a/flash2d/src/flash/SLM_simple.f90 b/flash2d/src/flash/SLM_simple.f90
new file mode 100644
index 0000000..a9e7808
--- /dev/null
+++ b/flash2d/src/flash/SLM_simple.f90
@@ -0,0 +1,388 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_simple
+! FUNCTION:
+!	provide simple semi-Lagrangian routines
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_step
+! FUNCTION:
+!	one step of the basic SLM algorithm
+! SYNTAX:
+!	CALL slm_step(int, real.arr, real.arr)
+! ON INPUT:
+!	...
+! ON OUTPUT:
+!	r_tracer: array with tracer values	real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_displace
+! FUNCTION:
+!	extrapolate the alpha, values for the displacements of the upstream
+!	points from the gridpoints
+! SYNTAX:
+!	CALL slm_displace(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_coord: real array of xy-coordinates		real
+! ON OUTPUT:
+!	r_alpha: displacement vectors to each point	real
+! CALLS:
+!	wind_field
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_update
+! FUNCTION:
+!	calculate the update to the velocity
+! SYNTAX:
+!	CALL slm_update(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_rside: array with right hand side values	real
+! ON OUTPUT:
+!	r_udate: array with new (updated) gid values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is trivial for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_upstream
+! FUNCTION:
+!	calculate right hand side of the equation (upstream values)
+! SYNTAX:
+!	CALL slm_upstream(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_alpha: displacement vectors to each point	real
+! ON OUTPUT:
+!	r_rside: array with right hand side values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is just interpolation for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_interpolate
+! FUNCTION:
+!	do the interpolation
+! SYNTAX:
+!	CALL slm_interpolate(grid, int, real, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	p_ogrid: grid handle to old grid (with data)	TYPE (grid_handle)
+!	r_fac:   factor at which point to interpolate	REAL
+!	i_arlen: array length for the following arrays	INTEGER
+!	r_coord: coordinate array (new grid)		REAL
+!	r_alpha: displacement array (corr. to r_coord)	REAL
+!	r_value: values on the old grid (array)		REAL
+! ON OUTPUT:
+!	r_rside: right hand side (interpolated)		REAL
+! CALLS:
+!
+! COMMENTS:
+!	this one is plain bi-cubic spline interpolation
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_step
+! COMMENTS:
+!
+! USES:
+!	FLASH_parameters, GRID_api, ADV_wind, ADV_rhs
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	4/2002
+!	2. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_simple
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE GRID_api
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_step
+	  CONTAINS
+
+!*****************************************************************
+	  SUBROUTINE slm_step(p_ghand, p_param, p_time, r_modtime, i_size, &
+	                       r_coord, r_tracer, i_newsdepth)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                         :: p_param
+	  TYPE (sw_info), INTENT(inout)                             :: p_time
+	  REAL (KIND = GRID_SR), INTENT(in)                         :: r_modtime
+	  INTEGER, INTENT(in)                                       :: i_size
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_size), INTENT(out)     :: r_tracer
+	  INTEGER, OPTIONAL, INTENT(in)                             :: i_newsdepth
+	  
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE          :: r_newvl
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_alpha
+	  INTEGER                                                   :: i_alct
+
+!---------- check size!
+
+	  IF(i_size <= 0) THEN
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'INFO [slm_step]: Zero step size, returning to calling routine'
+	    RETURN
+	  END IF
+
+!---------- allocate auxiliary arrays
+
+	  allocate(r_newvl(i_size), r_alpha(GRID_dimension,i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(38)
+	  END IF not_alloc
+
+!-SLM--------- calculate trajectory pieces (displacements)
+
+	  CALL stop_watch('start',3,p_time)
+	  CALL slm_displace(p_param, i_size, r_coord, r_alpha, r_time=r_modtime)
+	  CALL stop_watch('stop ',3,p_time)
+
+!-SLM--------- calculate right hand side
+
+	  CALL stop_watch('start',4,p_time)
+	  CALL slm_upstream(p_ghand, i_size, r_coord, r_alpha, r_newvl)
+	  CALL stop_watch('stop ',4,p_time)
+
+!-SLM--------- calculate new grid values
+
+	  CALL stop_watch('start',5,p_time)
+	  CALL slm_update(p_param, i_size, r_coord, r_newvl, r_tracer, r_time=r_modtime)
+	  CALL stop_watch('stop ',5,p_time)
+
+!-SLM--------- put alpha values to u and v field entries
+
+	  r_alpha= -r_alpha
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_newsdepth=i_newsdepth, i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  ELSE
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  END IF
+
+!-SLM--------- deallocate work arrays
+
+	  deallocate(r_alpha, r_newvl)
+
+	  RETURN
+	  END SUBROUTINE slm_step
+
+!*****************************************************************
+	  SUBROUTINE slm_displace(p_param, i_arlen, r_coord, r_alpha, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                      :: p_param
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_alpha
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                           :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_fac, r_caf, &
+	    r_axy, r_xyc
+	  REAL (KIND = GRID_SR)                                                 :: r_dt0, r_dt1, &
+	    r_dt2, r_tim
+	  INTEGER                                              :: i_cnt1, i_cnt2
+          
+!---------- set constants
+!DEBUG:
+ write(*,*) 'DEGBUG: entering slm_displace'
+ 
+ 	  r_dt0= p_param%num%r_deltatime
+	  r_dt1= 0.5* p_param%num%r_deltatime
+	  r_dt2= 1.5* p_param%num%r_deltatime
+	  r_fac= 0.5
+	  r_caf= 2.0
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0
+	  END IF
+
+!---------- calculate in an iteration process the displacements
+
+	  unknown_loop: DO i_cnt1=1,i_arlen
+	    r_axy= 0.0
+
+	    iter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_coord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO iter_loop
+
+	    r_alpha(:,i_cnt1)= r_axy
+	  END DO unknown_loop
+
+	  RETURN
+	  END SUBROUTINE slm_displace
+
+!*****************************************************************
+	  SUBROUTINE slm_update(p_param, i_arlen, r_coord, r_rside, r_udate, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                   :: p_param
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_udate
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                          :: r_time
+	  INTEGER                                             :: i_cnt
+	  REAL (KIND = GRID_SR)                                                :: r_dt, r_tim
+
+!---------- in the linear advection case and with f90 this is just
+
+!	  r_udate= r_rside
+
+!---------- including a non-zero right hand side, we have
+
+	  r_dt= p_param%num%r_deltatime
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0
+	  END IF
+
+	  main_loop: DO i_cnt=1, i_arlen
+	    r_udate(i_cnt)= r_rside(i_cnt)+ r_dt* slm_righthand(r_coord(:,i_cnt))
+	  END DO main_loop
+
+	  RETURN
+	  END SUBROUTINE slm_update
+
+!*****************************************************************
+	  SUBROUTINE slm_upstream(p_mesh, i_arlen, r_coord, &
+	                          r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                     :: r_fac
+
+!---------- set factor (at which point of trajectory shall i interpolate)
+
+	  r_fac= 1.0
+
+!---------- in the linear advection case this is just interpolation
+
+	  CALL slm_interpolate(p_mesh, r_fac, i_arlen, r_coord, &
+	                       r_alpha, r_rside)
+
+	  RETURN
+	  END SUBROUTINE slm_upstream
+!*****************************************************************
+	  SUBROUTINE slm_interpolate(p_mesh, r_fac, i_arlen, &
+	                             r_coord, r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in)         :: r_fac
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE                   :: r_upstr
+	  REAL (KIND = GRID_SR)                                                :: r_eps
+	  INTEGER                                             :: i_cnt, i_alct, &
+	    i_val, i_out, i_stat
+
+!---------- initialize constant
+!DEBUG:
+ write(*,*) 'DEGBUG: entering slm_interpolate'
+
+	  i_val= GRID_tracer
+	  r_eps= GRID_EPS
+
+!---------- allocate work array
+
+	  ALLOCATE(r_upstr(GRID_dimension,i_arlen), stat=i_alct)
+	  not_allocated: IF(i_alct /= 0) THEN
+	    CALL grid_error(60)
+	  END IF not_allocated
+
+!---------- calculate upstream coordinates
+
+	  dim_loop: DO i_cnt=1, GRID_dimension
+	    r_upstr(i_cnt,:) = r_coord(i_cnt,:)- r_fac(i_cnt)* r_alpha(i_cnt,:)
+	  END DO dim_loop
+
+!---------- loop over nodes: find element containing upstream point
+
+	  node_loop: DO i_cnt=1, i_arlen
+
+!---------- check if upstream value is outside of the domain
+!DEBUG:
+! write(*,*) 'DEGBUG: calling grid_domaincheck with r_upstr, r_coord:', r_upstr(:,i_cnt), r_coord(:,i_cnt)
+
+	    i_out= grid_domaincheck(p_mesh(i_time), r_upstr(:,i_cnt))
+
+!---------- take the intersection of the trajectory with the boundary as new upstream point
+
+	    out_domain: IF(i_out /= 0) then
+	      r_upstr(:,i_cnt)= grid_boundintersect(p_mesh(i_time), &
+	                        r_coord(:,i_cnt), r_upstr(:,i_cnt), i_info=i_stat)
+	      no_intersect: IF(i_stat /= 0) THEN
+	        r_rside(i_cnt)= 0.0
+	        CYCLE node_loop
+	      END IF no_intersect
+	    END IF out_domain
+
+!---------- interpolate
+
+	    r_rside(i_cnt)= grid_coordvalue(p_mesh(i_time), r_upstr(:,i_cnt), &
+	                    i_interpolorder=GRID_highorder, i_valpoint=i_val)
+	    small_val: IF(abs(r_rside(i_cnt)) < r_eps) THEN
+	      r_rside(i_cnt)= 0.0
+	    END IF small_val
+
+	  END DO node_loop
+
+!---------- deallocate work array
+
+	  DEALLOCATE(r_upstr)
+
+	  RETURN
+	  END SUBROUTINE slm_interpolate
+
+
+	END MODULE SLM_simple
diff --git a/flash2d/src/options-sphere/ADV_semilagrange.adv.F90 b/flash2d/src/options-sphere/ADV_semilagrange.adv.F90
new file mode 100644
index 0000000..874438e
--- /dev/null
+++ b/flash2d/src/options-sphere/ADV_semilagrange.adv.F90
@@ -0,0 +1,882 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	ADV_semilagrange
+! FUNCTION:
+!	perform semi-Lagrangian advection
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_adapt
+! FUNCTION:
+!	adapt the grid according to an error estimate
+! SYNTAX:
+!	CALL slm_adapt(grid, param, logical)
+! ON INPUT:
+!	p_ghand:   handle for the grid		TYPE (grid_handle)
+!	p_param:   global parameter structure	TYPE (global_param)
+! ON OUTPUT:
+!	l_changed: flag for changed grid	LOGICAL
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialize
+! FUNCTION:
+!	initialize the advection problem
+! SYNTAX:
+!	CALL slm_initialize(grid, param)
+! ON INPUT:
+!	p_param: parameter data structure	TYPE (global_param)
+! ON OUTPUT:
+!	p_ghand: grid handling data structure	TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_finish
+! FUNCTION:
+!	terminate slm (free dynamically alloc. memory, ...)
+! SYNTAX:
+!	CALL slm_finish(grid, param)
+! ON INPUT:
+!	p_ghand: grid handling data structure	TYPE (grid_handle)
+!	p_param: parameter data structure	TYPE (global_param)
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_timestepping
+! FUNCTION:
+!	perform the timestepping in the slm
+! SYNTAX:
+!	CALL slm_timestepping(grid, param, cmd)
+! ON INPUT:
+!	p_ghand: grid handling data structure	TYPE (grid_handle)
+!	p_param: parameter data structure	TYPE (global_param)
+!	p_cmdln: command line argument struct.	TYPE (cmdline)
+! ON OUTPUT:
+!	p_ghand: grid handling data structure	TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_displace, slm_update, slm_upstream
+!	slm_initialize, slm_finish, slm_timestepping
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, FEM_handle
+!	FEM_errorestimate, FEM_param
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	10/96
+!	2. several improvements/fixes	j. behrens	11/96-1/97
+!	3. nodal values time depend.	j. behrens	1/97
+!	4. stop_watch removed, plot	j. behrens	1/97
+!	   (position) changed, inner
+!	   iteration counter added
+!	5. slm_adapt changed 		j. behrens	2/97
+!	6. slm_adapt changed to hide
+!	   grid data structures		j. behrens	7/97
+!	7. control data structure	j. behrens	12/97
+!	8. non-homog. rhs added		j. behrens	2/98
+!	9. compliant to amatos 1.0	j. behrens	12/2000
+!	10. compliant to amatos 1.2	j. behrens	3/2002
+!	11. compliant to amatos 2.0	j. behrens	7/2003
+!       12. added visnetplot            f. klaschka     12/2003
+!
+!*****************************************************************
+	MODULE ADV_semilagrange
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE IO_vtuplot
+#ifndef NO_NETCDF
+	  USE IO_netcdfplot
+#endif
+	  USE IO_utils
+	  USE GRID_api
+	  USE SLM_errorestimate
+	  USE SLM_initial
+	  USE SLM_simple
+	  USE SLM_advanced
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_initialize, slm_finish, slm_timestepping
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_adapt(p_ghand, p_param, l_changed, l_water)
+
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (grid_handle), INTENT(inout)      :: p_ghand
+	  TYPE (control_struct), INTENT(in)      :: p_param
+	  LOGICAL, INTENT(out)                   :: l_changed
+	  LOGICAL, OPTIONAL, INTENT(in)          :: l_water
+	  LOGICAL                                :: l_switch
+	  REAL (KIND = GRID_SR)                  :: r_errmx, &
+	    r_refcrit, r_crscrit, r_fac
+	  INTEGER                                :: i_size, &
+	    i_manyc, i_manyr, i_alct, i_cnt
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE        :: r_aux1
+	  INTEGER, DIMENSION(:), ALLOCATABLE     :: i_aux1, i_aux2, i_aux3
+	  LOGICAL                                :: l_ref, l_crs
+
+!---------- initialize refinement flag
+
+	  l_changed= .FALSE.
+
+!---------- handle watermark switch
+
+	  wat_present: IF(present(l_water)) THEN
+	    l_switch= l_water
+	  ELSE wat_present
+	    l_switch= .TRUE.
+	  END IF wat_present
+
+!---------- allocate work arrays
+
+	  i_size= p_ghand%i_enumfine
+	  allocate(r_aux1(i_size), i_aux1(i_size), i_aux2(i_size), &
+                   i_aux3(i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(35)
+	  END IF not_alloc
+
+!---------- estimate the local error
+
+	  CALL slm_errorest(p_ghand, i_size, r_aux1)
+
+!---------- set coarsening/refinement criterion
+
+	  r_errmx= maxval(r_aux1(1:i_size))
+	  r_crscrit= r_errmx* p_param%num%r_crstolerance
+	  r_refcrit= r_errmx* p_param%num%r_reftolerance
+
+!---------- get level information and set up flags for refinement/coarsening
+
+	  CALL grid_getinfo(p_ghand, l_finelevel= .TRUE., i_elementlevel= i_aux1, &
+	                    i_elementstatus= i_aux3)
+	  DO i_cnt=1,i_size
+	    i_aux2(i_cnt)= 0
+	    IF((i_aux1(i_cnt) > p_param%num%i_crslevel) .AND. &
+	       (r_aux1(i_cnt) < r_crscrit)) i_aux2(i_cnt)= GRID_pleasecoarse
+	    IF((i_aux1(i_cnt) < p_param%num%i_reflevel) .AND. &
+	       (r_aux1(i_cnt) > r_refcrit)) i_aux2(i_cnt)= GRID_pleaserefine
+	  END DO
+
+!---------- determine if there is enough to be done (this can be
+!           switched off by l_water=.FALSE.)
+
+	  IF(l_switch) THEN
+	    i_manyr= count(i_aux2 == GRID_pleaserefine)
+	    r_fac= real(i_manyr,GRID_SR)/ real(i_size,GRID_SR)
+	    enough_ref: IF(r_fac > p_param%num%r_refwatermark) THEN
+	      l_ref= .TRUE.
+	    ELSE
+	      l_ref= .FALSE.
+	    END IF enough_ref
+
+	    i_manyc= count(i_aux2 == GRID_pleasecoarse)
+	    r_fac= real(i_manyc,GRID_SR)/ real(i_size,GRID_SR)
+	    enough_crs: IF(r_fac > p_param%num%r_crswatermark) THEN
+	      l_crs= .TRUE.
+	    ELSE
+	      l_crs= .FALSE.
+	    END IF enough_crs
+	  ELSE
+	    l_ref= .TRUE.
+	    l_crs= .TRUE.
+	  END IF
+
+!---------- update grid flags
+
+	  update: IF(l_ref .OR. l_crs) THEN
+	    IF(l_ref) i_aux3= merge(i_aux2, i_aux3, i_aux2==GRID_pleaserefine)
+	    IF(l_crs) i_aux3= merge(i_aux2, i_aux3, i_aux2==GRID_pleasecoarse)
+	    CALL grid_putinfo(p_ghand, l_finelevel= .TRUE., i_elementstatus= i_aux3)
+	  END IF update
+
+!---------- deallocate work arrays
+
+	  deallocate(r_aux1, i_aux1, i_aux2, i_aux3)
+
+!---------- adapt the grid
+
+	  CALL grid_adapt(p_ghand, l_changed)
+
+	  RETURN
+	  END SUBROUTINE slm_adapt
+
+!*****************************************************************
+	  SUBROUTINE slm_diagnostics(p_ghand, p_param, p_tinfo, c_action)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (grid_handle), INTENT(in)           :: p_ghand
+	  TYPE (control_struct), INTENT(inout)     :: p_param
+	  TYPE (rt_info), INTENT(in)               :: p_tinfo
+	  CHARACTER (len=4), INTENT(in), OPTIONAL  :: c_action
+	  INTEGER, SAVE                            :: i_iodiag
+	  CHARACTER (len=32)                       :: c_file
+	  CHARACTER (len=28)                       :: c_tmp
+	  REAL (KIND = GRID_SR), PARAMETER                          :: r_1o3= (1./3.)
+	  INTEGER                                  :: i_fst, i_tmp, &
+	    i_size, i_alct, i_1, i_2, i_3, i_4, i_5, i_6
+	  REAL (KIND = GRID_SR), SAVE                               :: r_rfm0, r_rsm0
+	  REAL (KIND = GRID_SR)                                     :: r_dispn, r_rfm, r_rsm, &
+	    r_ts, r_calci, r_calcs, r_mxnrm, r_l2nrm, r_max, r_min, r_diffn, &
+	    r_medln
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE          :: r_aux1, r_aux2, &
+	    r_aux3, r_aux4
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_auxx
+	  INTEGER, DIMENSION(1)                    :: i_valind
+
+!---------- action init
+
+	  present_act: IF(present(c_action)) THEN
+	    action_type: IF(c_action == 'init') THEN
+
+!---------- open file for diagnostic output
+
+	      i_iodiag= 9
+	      i_tmp   = p_param%num%i_experiment
+	      write(c_tmp,*) trim(GRID_parameters%program_name), '_diag.'
+	      write(c_file,1010) trim(c_tmp), i_tmp
+	      c_file= adjustl(c_file)
+	      open(i_iodiag, file= c_file, action= 'write', form= 'formatted', &
+	           iostat= i_fst)
+	      not_opened: IF(i_fst /= 0) THEN
+	        CALL grid_error(36)
+	      END IF not_opened
+	      IF(GRID_parameters%iolog > 0) &
+	        write(GRID_parameters%iolog,*) 'INFO: Filename: ', c_file, ' opened on unit: ', i_iodiag
+
+!---------- allocate workspace
+
+	      i_size= p_ghand%i_nnumber
+	      allocate(r_aux1(i_size), r_aux2(i_size), r_aux3(i_size), &
+	               r_aux4(i_size), r_auxx(1,i_size), stat=i_alct)
+	      not_alloc: IF(i_alct /= 0) THEN
+	        CALL grid_error(37)
+	      END IF not_alloc 
+	      r_aux1= 0.0; r_aux2= 0.0; r_aux3= 0.0; r_aux4= 0.0
+
+!---------- get minimum edge length
+
+	      CALL grid_edgelength(p_ghand, r_min=r_medln)
+
+!---------- calculate reference values, ... extract actual calculated concentration
+
+	      i_valind= (/ GRID_tracer /)
+	      CALL grid_getinfo(p_ghand, i_arraypoint=i_valind, &
+	                        r_nodevalues= r_auxx)
+	      r_aux1(:)= r_auxx(1,:)
+	      DEALLOCATE(r_auxx)
+
+!---------- calculate area pieces for each node
+
+	      CALL grid_nodearea(p_ghand, i_size, r_aux2)
+
+!---------- calculate analytical solution
+
+	      r_ts= p_param%num%r_deltatime* float(p_tinfo%i_step)
+	      CALL slm_analyticsolution(p_ghand, r_ts, i_size, r_aux3)
+
+!---------- now the integral of the concentration (mass) is
+
+	      r_calci= dot_product(r_aux1, r_aux2)
+	      r_rfm0 = r_calci
+
+!---------- the integral of the squared concentration ("entropy"(?)) is
+
+	      r_aux4 = r_aux1* r_aux1
+	      r_calcs= dot_product(r_aux4, r_aux2)
+	      r_rsm0 = r_calcs
+
+!---------- the maximum-norm of the error is
+
+	      r_aux4 = abs(r_aux1- r_aux3)
+	      r_mxnrm= maxval(r_aux4)
+
+!---------- the l2-norm of the error is
+
+	      r_aux4 = r_aux4* r_aux4
+	      r_l2nrm= dot_product(r_aux4, r_aux2)
+
+!---------- maximum and minimum
+
+	      r_max  = maxval(r_aux1)
+	      r_min  = minval(r_aux1)
+
+!---------- diffusion and dispersion (not yet implemented)
+
+	      r_diffn= 0.0
+	      r_dispn= 0.0
+
+!---------- print it
+
+	      r_rfm= r_calci/r_rfm0
+	      r_rsm= r_calcs/r_rsm0
+	      write(i_iodiag,1100) GRID_parameters%program_name, GRID_parameters%version, &
+	                           GRID_parameters%subversion, GRID_parameters%patchversion
+	      i_1= p_tinfo%i_step
+	      i_2= p_ghand%i_enumber
+	      i_3= p_ghand%i_enumfine
+	      i_4= p_ghand%i_gnumber
+	      i_5= p_ghand%i_gnumfine
+	      i_6= p_ghand%i_nnumber
+	      write(i_iodiag,1000) i_1, i_2, i_3, i_4, i_5, i_6, r_min, r_max, &
+	                           r_rfm, r_rsm, r_mxnrm, r_l2nrm, r_diffn, &
+				   r_dispn, r_medln
+
+!---------- deallocate workspace
+
+	      deallocate(r_aux1, r_aux2, r_aux3, r_aux4)
+
+!---------- initialization done
+
+	      RETURN
+
+!---------- action quit
+
+	    ELSE IF(c_action == 'quit') THEN action_type
+
+!---------- close diagnostic output file
+
+	      close(i_iodiag)
+ 	      IF(GRID_parameters%iolog > 0) &
+	        write(GRID_parameters%iolog,*) 'INFO: Closed file on unit: ', i_iodiag
+
+!---------- action quit done
+
+	      RETURN
+	    END IF action_type
+	  END IF present_act
+
+!---------- action diag (default): allocate workspace
+
+	  i_size= p_ghand%i_nnumber
+	  allocate(r_aux1(i_size), r_aux2(i_size), r_aux3(i_size), &
+	           r_aux4(i_size), r_auxx(1,i_size), stat=i_alct)
+	  not_allc: IF(i_alct /= 0) THEN
+	    CALL grid_error(37)
+	  END IF not_allc 
+	  r_aux1= 0.0; r_aux2= 0.0; r_aux3= 0.0; r_aux4= 0.0
+
+!---------- get minimum edge length
+
+	  CALL grid_edgelength(p_ghand, r_min=r_medln)
+
+!---------- calculate reference values, ... extract actual calculated concentration
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_getinfo(p_ghand, i_arraypoint=i_valind, &
+	  		   r_nodevalues= r_auxx)
+	  r_aux1(:)= r_auxx(1,:)
+	  DEALLOCATE(r_auxx)
+
+!---------- calculate area pieces for each node
+
+	  CALL grid_nodearea(p_ghand, i_size, r_aux2)
+
+!---------- calculate analytical solution
+
+	  r_ts= p_param%num%r_deltatime* float(p_tinfo%i_step)
+	  CALL slm_analyticsolution(p_ghand, r_ts, i_size, r_aux3)
+
+!---------- now the integral of the concentration (mass) is
+
+	  r_calci= dot_product(r_aux1, r_aux2)
+
+!---------- the integral of the squared concentration ("entropy"(?)) is
+
+	  r_aux4 = r_aux1* r_aux1
+	  r_calcs= dot_product(r_aux4, r_aux2)
+
+!---------- the maximum-norm of the error is
+
+	  r_aux4 = abs(r_aux1- r_aux3)
+	  r_mxnrm= maxval(r_aux4)
+
+!---------- the l2-norm of the error is
+
+	  r_aux4 = r_aux4* r_aux4
+	  r_l2nrm= dot_product(r_aux4, r_aux2)
+
+!---------- maximum and minimum
+
+	  r_max  = maxval(r_aux1)
+	  r_min  = minval(r_aux1)
+
+!---------- diffusion and dispersion (not yet implemented)
+
+	  r_diffn= 0.0
+	  r_dispn= 0.0
+
+!---------- print it
+
+	  r_rfm= r_calci/r_rfm0
+	  r_rsm= r_calcs/r_rsm0
+	  i_1= p_tinfo%i_step
+	  i_2= p_ghand%i_enumber
+	  i_3= p_ghand%i_enumfine
+	  i_4= p_ghand%i_gnumber
+	  i_5= p_ghand%i_gnumfine
+	  i_6= p_ghand%i_nnumber
+	  write(i_iodiag,1000) i_1, i_2, i_3, i_4, i_5, i_6, r_min, r_max, &
+	                       r_rfm, r_rsm, r_mxnrm, r_l2nrm, r_diffn, &
+	                       r_dispn, r_medln
+
+!---------- deallocate workspace
+
+	  deallocate(r_aux1, r_aux2, r_aux3, r_aux4)
+
+	  RETURN
+ 1000	  FORMAT(1x, i10, 1x, i10, 1x, i10, 1x, i10, 1x, i10, 1x, i10, &
+	         1x, e15.8, 1x, e15.8, 1x, e15.8, 1x, e15.8,&
+	         1x, e15.8, 1x, e15.8, 1x, e15.8, 1x, e15.8,&
+	         1x, e15.8)
+ 1010	  FORMAT(a28,i4.4)
+ 1100	  FORMAT(1x,'*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '*************************************',/ &
+	         1x,'***** PROGRAM: ',a15,174x,'*****',/ &
+	         1x,'***** VERSION: ',i2.2,'.',i2.2,'.',i2.2,181x,'*****',/ &
+	         1x,'***** Diagnostic output ',180x,'*****',/ &
+	         1x,'*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '*************************************',/ &
+	         1x,'* timestep ','  elements ','  fine el. ','     edges ', &
+	            '  fine ed. ','     nodes ','        minimum ', &
+	            '        maximum ','            RFM ','            RSM ', &
+                    '       max-norm ','        l2-norm ','      diffusion ', &
+	            '     dispersion ',' min.edge len.*',/ &
+	         1x,'*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '******************************************', &
+	            '**************************************')
+	  END SUBROUTINE slm_diagnostics
+
+!*****************************************************************
+	  SUBROUTINE slm_initialize(p_ghand, p_param)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(out) :: p_ghand
+	  TYPE (control_struct), INTENT(inout)          :: p_param
+
+	  INTEGER                                     :: i_steps
+	  CHARACTER (len=32)                          :: c_file
+	  CHARACTER (len=28)                          :: c_tmp
+	  INTEGER                                     :: i_tmp, i_cnt
+	  LOGICAL                                     :: l_refined
+	  INTEGER                                     :: i_vertnum
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER               :: r_vertinit
+
+!---------- decide whether a new experiment is startet or an old one is continued
+
+	  new_experiment: IF(p_param%num%i_experiment <= 0) THEN
+
+!---------- reset timesteps (start with 1 in any case)
+
+	    time_one: IF(p_param%num%i_frsttimestep /= 1) THEN
+	      IF(GRID_parameters%iolog > 0) &
+	        write(GRID_parameters%iolog,*) 'WARNING      : Timestep counters reset due to new experiment'
+	      i_steps= p_param%num%i_lasttimestep- p_param%num%i_frsttimestep
+	      p_param%num%i_frsttimestep= 1
+	      p_param%num%i_lasttimestep= p_param%num%i_frsttimestep+ i_steps
+	    END IF time_one
+
+!---------- initialize grid parameters
+
+	    CALL grid_setparameter(p_ghand, i_coarselevel= p_param%num%i_crslevel, &
+	                           i_finelevel= p_param%num%i_reflevel)
+
+!---------- define domain, first read data from file (compiled here)
+
+	    CALL grid_readdomain(i_vertnum, r_vertinit, c_readfile=p_param%io%c_domainfile)
+	    CALL grid_definegeometry(i_vertnum, r_vertexarr= r_vertinit)
+
+!---------- create initial triangulation
+
+	    CALL grid_createinitial(p_ghand, c_filename=p_param%io%c_triangfile)
+
+!---------- initialize grid and adapt at steep gradients
+
+	    i_cnt= 0
+	    l_refined= .TRUE.
+	    refine_loop: DO WHILE (l_refined)
+	      CALL slm_initialvalues(p_ghand(i_timeplus))
+	      CALL slm_adapt(p_ghand(i_timeplus), p_param, l_refined, &
+	                     l_water=.FALSE.)
+	    END DO refine_loop
+
+!---------- duplicate grid (old time)
+
+	    CALL grid_timeduplicate(p_ghand(i_timeplus), p_ghand(i_time))
+
+!---------- initialize wind field calculation
+
+	    CALL slm_windinit(p_param)
+
+!---------- if an old experiment is to be continued from stored data:
+
+	  ELSE new_experiment
+
+!---------- create grid from saveset, first compile filename
+
+	    i_tmp= p_param%num%i_experiment- 1
+	    write(c_tmp,*) trim(GRID_parameters%program_name), '_save.'
+	    write(c_file,1010) trim(c_tmp), i_tmp
+	    c_file= adjustl(c_file)
+
+	    CALL grid_readinitial(p_ghand, c_file)
+
+!---------- initialize wind field calculation
+
+	    CALL slm_windinit(p_param)
+
+	  END IF new_experiment
+
+	  RETURN
+ 1010	  FORMAT(a28,i4.4)
+	  END SUBROUTINE slm_initialize
+
+!*****************************************************************
+	  SUBROUTINE slm_finish(p_ghand, p_param)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                          :: p_param
+	  CHARACTER (len=32)                                       :: c_file
+	  CHARACTER (len=28)                                       :: c_tmp
+	  INTEGER                                                  :: i_tmp
+
+!---------- open and write saveset, if required
+
+	  save_req: IF(p_param%io%i_savelast /= 0) THEN
+
+	    i_tmp= p_param%num%i_experiment
+	    write(c_tmp,*) trim(GRID_parameters%program_name), '_save.'
+	    write(c_file,1010) trim(c_tmp), i_tmp
+	    c_file= adjustl(c_file)
+	    CALL grid_writesaveset(c_file, p_ghand)
+
+!---------- write parameter file for next experiment
+
+	    CALL io_putinputfile(p_param)
+	  END IF save_req
+
+!---------- gracefully terminate wind field calculations
+
+	  CALL slm_windquit
+
+	  RETURN
+ 1010	  FORMAT(a28,i4.4)
+	  END SUBROUTINE slm_finish
+
+!*****************************************************************
+	  SUBROUTINE slm_timestepping(p_ghand, p_param)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  INTEGER, PARAMETER                   :: i_innermax=15
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), &
+	                      INTENT(inout)    :: p_ghand
+	  TYPE (control_struct), INTENT(inout) :: p_param
+	  INTEGER                              :: i_timecount
+	  TYPE (sw_info)                       :: p_time, p_timeaux
+	  LOGICAL                              :: l_refined
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE      :: r_tracer
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_coord, r_aux
+	  CHARACTER (len=32)                   :: c_file, c_matfile
+	  CHARACTER (len=28)                   :: c_tmp
+	  INTEGER                              :: i_tmp, &
+	    i_size, i_alct, i_tst, i_fst
+	  INTEGER                              :: i_iomatl=21
+	  REAL (KIND = GRID_SR)                :: r_modtime
+          INTEGER                              :: i_loopquit
+	  INTEGER                              :: i_newlen
+	  INTEGER, DIMENSION(1)                :: i_valind
+		
+!---------- VISNET variable init
+
+		i_loopquit = 0
+
+!---------- initialize timestep info structure
+
+	  p_timestepinfo%i_step       = 0
+	  p_timestepinfo%i_adapit     = 0
+	  p_timestepinfo%l_ploted     = .FALSE.
+	  p_timestepinfo%l_saved      = .FALSE.
+	  p_timestepinfo%r_modeltime  = 0.0
+
+!---------- initialize timing structure
+
+	  p_time%p_tim%r_tim   = 0.0
+	  p_time%p_tim%r_lap   = 0.0
+	  p_time%p_tim%c_tim   = '                '
+	  p_timeaux%p_tim%r_tim= 0.0
+	  p_timeaux%p_tim%r_lap= 0.0
+	  p_timeaux%p_tim%c_tim= '                '
+
+!---------- initialize stop watches
+
+	  CALL stop_watch_init(1,(/'total time      '/),p_timeaux)
+	  CALL stop_watch_init(8,(/'plotting        ', 'grid duplication', &
+	                           'trajectory calc.', 'right hand side ', &
+	                           'grid value updt.', 'grid adaption   ', &
+	                           'diagnostics     ', 'whole timestep  '/), p_time)
+	                           
+!---------- if diagnostics are demanded, initialize diagnostical output
+
+	  IF(p_param%io%l_diagnostics) THEN
+	    p_timestepinfo%i_step= 0
+	    CALL slm_diagnostics(p_grid(i_timeplus), p_param, p_timestepinfo, c_action='init')
+	  END IF
+
+!---------- plot initial data
+
+	  i_timecount= 0
+#ifndef NO_NETCDF
+	  IF(p_param%io%l_netcdf) THEN
+	    CALL plot_netcdf(p_ghand(i_timeplus), i_time=i_timecount)
+      END IF
+#endif
+	  IF(p_param%io%l_vtu) THEN
+	    CALL generate_vtu(p_ghand(i_timeplus), i_time=i_timecount)
+	  END IF
+!---------- put out initial information
+
+	  CALL io_putruntimeinfo(p_ghand(i_timeplus), p_timestepinfo, p_time)
+
+!---------- timestep loop
+
+      CALL stop_watch('start',1,p_timeaux)
+      CALL stop_watch('start',8,p_time)
+      i_timecount = 0_GRID_SI
+      p_timestepinfo%r_modeltime = p_param%num%r_starttime
+      time_loop: DO WHILE (p_timestepinfo%r_modeltime < p_param%num%r_finaltime - p_param%num%r_deltatime)
+        i_timecount                = i_timecount+ 1_GRID_SI
+        p_timestepinfo%i_step      = i_timecount
+        p_timestepinfo%r_modeltime = p_timestepinfo%r_modeltime + p_param%num%r_deltatime
+        p_timestepinfo%i_adapit    = 0_GRID_SI
+
+!---------- duplicate old grid, use it as first guess for new grid
+
+	    CALL stop_watch('start',2,p_time)
+	    CALL grid_timeduplicate(p_ghand(i_time), p_ghand(i_timeplus))
+	    CALL stop_watch('stop ',2,p_time)
+
+!---------- adaptive (inner) loop
+
+	    l_refined= .TRUE.
+	    adap_loop: DO WHILE(l_refined .AND. p_timestepinfo%i_adapit < i_innermax)
+	      p_timestepinfo%i_adapit= p_timestepinfo%i_adapit+ 1
+
+!---------- allocate and extract working arrays
+!---------- use amatos 1.2 functionality to calculate only new nodes
+
+	      i_size= p_ghand(i_timeplus)%i_nnumber
+	      allocate(r_aux(GRID_dimension,i_size), stat=i_alct)
+	      not_alloc: IF(i_alct /= 0) THEN
+	        CALL grid_error(38)
+	      END IF not_alloc
+
+!-SLM--------- do the following SLM calculations in arrays (grid-point-wise)
+
+	      CALL grid_getinfo(p_ghand(i_timeplus), r_nodecoordinates=r_aux, &
+	                        i_newsdepth= 1, i_nlength= i_newlen)
+	      allocate(r_tracer(i_newlen), r_coord(GRID_dimension,i_newlen), stat=i_alct)
+	      not_alloc0: IF(i_alct /= 0) THEN
+	        CALL grid_error(38)
+	      END IF not_alloc0
+	      r_coord(:,1:i_newlen)= r_aux(:,1:i_newlen)
+	      deallocate(r_aux)
+
+!-SLM--------- call the SLM step
+
+	      r_modtime= p_timestepinfo%r_modeltime- p_param%num%r_deltatime
+	      CALL slm_step(p_ghand, p_param, p_time, r_modtime, i_newlen, &
+	                    r_coord, r_tracer, i_newsdepth=1)
+
+!-SLM--------- update grid data structure and deallocate work arrays
+!-SLM--------- change back from (grid-point)arrays to grid data structure
+
+	      allocate(r_aux(1,i_newlen), stat=i_alct)
+	      not_alloc1: IF(i_alct /= 0) THEN
+	        CALL grid_error(38)
+	      END IF not_alloc1
+	      r_aux(1,:)= r_tracer(:)
+	      i_valind= (/ GRID_tracer /)
+	      CALL grid_putinfo(p_ghand(i_timeplus), i_arraypoint= i_valind, &
+	                        i_newsdepth= 1, r_nodevalues= r_aux)
+
+	      deallocate(r_coord, r_tracer, r_aux)
+
+!-SLM--------- adapt the grid corresponding to an error estimate
+
+	      CALL stop_watch('start',6,p_time)
+	      CALL slm_adapt(p_ghand(i_timeplus), p_param, l_refined)
+	      CALL stop_watch('stop ',6,p_time)
+
+	    END DO adap_loop
+
+!-SLM--------- insert a full advanced SLM step here, if required
+!-SLM--------- retrieve coordinates of grid points
+
+	    i_size= p_ghand(i_timeplus)%i_nnumber
+	    allocate(r_tracer(i_size), r_coord(GRID_dimension,i_size), stat=i_alct)
+	    not_allocfinal: IF(i_alct /= 0) THEN
+	      CALL grid_error(38)
+	    END IF not_allocfinal
+
+!-SLM--------- do the following SLM calculations in arrays (grid-point-wise)
+
+	    CALL grid_getinfo(p_ghand(i_timeplus), r_nodecoordinates=r_coord)
+
+!-SLM--------- call the SLM step
+
+	    r_modtime= p_timestepinfo%r_modeltime- p_param%num%r_deltatime
+	    CALL slm_astep(p_ghand, p_param, p_time, r_modtime, i_size, r_coord, r_tracer)
+
+!-SLM--------- update grid data structure and deallocate work arrays
+!-SLM--------- change back from (grid-point)arrays to grid data structure
+
+	      allocate(r_aux(1,i_size), stat=i_alct)
+	      not_allocfinal1: IF(i_alct /= 0) THEN
+	        CALL grid_error(38)
+	      END IF not_allocfinal1
+	      r_aux(1,:)= r_tracer(:)
+	      i_valind= (/ GRID_tracer /)
+	      CALL grid_putinfo(p_ghand(i_timeplus), i_arraypoint= i_valind, &
+	                        r_nodevalues= r_aux)
+
+	      deallocate(r_coord, r_tracer, r_aux)
+
+!---------- diagnostics, if requested
+
+	    IF(p_param%io%l_diagnostics) THEN
+	      CALL stop_watch('start',7,p_time)
+	      CALL slm_diagnostics(p_grid(i_timeplus), p_param, p_timestepinfo, c_action='diag')
+	      CALL stop_watch('stop ',7,p_time)
+	    END IF
+
+!---------- plot data (every [i_plotoffset]th timestep)
+
+	    CALL stop_watch('start',1,p_time)
+	    plot_step: IF(mod(i_timecount, p_param%io%i_plotoffset) == 0) THEN
+	      IF((p_param%io%l_netcdf) .OR. (p_param%io%l_vtu)) &
+	        p_timestepinfo%l_ploted= .TRUE.
+
+#ifndef NO_NETCDF
+	      IF(p_param%io%l_netcdf) THEN
+	        CALL plot_netcdf(p_ghand(i_timeplus), i_time=i_timecount)
+	      END IF
+#endif
+	      IF(p_param%io%l_vtu) THEN
+	        CALL generate_vtu(p_ghand(i_timeplus), i_time=i_timecount)
+	      END IF
+	    END IF plot_step
+	    CALL stop_watch('stop ',1,p_time)
+
+!---------- put a saveset to disc every ... timesteps
+
+	    save_step: IF((mod(i_timecount, p_param%io%i_saveoffset) == 0) .AND. &
+	                  (i_timecount > 1)) THEN
+	      i_tmp= p_param%num%i_experiment
+ 	      write(c_tmp,*) trim(GRID_parameters%program_name), '_save.'
+	      write(c_file,1010) trim(c_tmp), i_tmp
+	      c_file= adjustl(c_file)
+	      CALL grid_writesaveset(c_file,p_ghand)
+	      p_timestepinfo%l_saved= .TRUE.
+	    END IF save_step
+
+!---------- runtime information output
+
+	    CALL stop_watch('stop ',8,p_time)
+	    CALL io_putruntimeinfo(p_ghand(i_timeplus), p_timestepinfo, p_time)
+	    CALL stop_watch_init(8,(/'plotting        ', 'grid duplication', &
+	                             'trajectory calc.', 'right hand side ', &
+	                             'grid value updt.', 'grid adaption   ', &
+	                             'diagnostics     ', 'whole timestep  '/), p_time)
+	    CALL stop_watch('start',8,p_time)
+
+!---------- remove obsolecent grid items
+
+	    CALL grid_sweep
+
+!---------- toggle time handles for next step if gfx-proces has not exited
+
+	    CALL grid_timetoggle
+
+!---------- exit loop if graphics process has been terminated
+
+            IF (i_loopquit /= 0) EXIT time_loop
+
+	  END DO time_loop
+	  CALL stop_watch('stop ',1,p_timeaux)
+
+!---------- print total time
+
+ 	  write(GRID_parameters%ioout,1005)
+	  write(GRID_parameters%ioout,1003) p_timeaux%p_tim(1)%r_tim
+	  write(GRID_parameters%ioout,1004)
+	  IF(GRID_parameters%iolog > 0) THEN
+	    write(GRID_parameters%iolog,1003) p_timeaux%p_tim(1)%r_tim
+	  END IF
+
+!---------- terminate diagnostics
+
+	  IF(p_param%io%l_diagnostics) THEN
+	    CALL slm_diagnostics(p_grid(i_timeplus), p_param, p_timestepinfo, c_action='quit')
+	  END IF
+
+	  RETURN
+ 1000	  FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/ &
+	         1x,'*****            Runtime Information Output           *****',/ &
+	         1x,'***** ----- ----- ----- ----- ----- ----- ----- ----- *****')
+ 1003	  FORMAT(1x,'***** Total time for timesteps ',10x,e12.4,' *****')
+ 1004	  FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/)
+ 1005	  FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/ &
+	         1x,'*****             Final Information Output            *****',/ &
+	         1x,'***** ----- ----- ----- ----- ----- ----- ----- ----- *****')
+ 1010	  FORMAT(a28,i4.4)
+	  END SUBROUTINE slm_timestepping
+
+	END MODULE ADV_semilagrange
diff --git a/flash2d/src/options-sphere/ADV_semilagrange.sim.F90 b/flash2d/src/options-sphere/ADV_semilagrange.sim.F90
new file mode 100644
index 0000000..eaf4620
--- /dev/null
+++ b/flash2d/src/options-sphere/ADV_semilagrange.sim.F90
@@ -0,0 +1,850 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	ADV_semilagrange
+! FUNCTION:
+!	perform semi-Lagrangian advection
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_adapt
+! FUNCTION:
+!	adapt the grid according to an error estimate
+! SYNTAX:
+!	CALL slm_adapt(grid, param, logical)
+! ON INPUT:
+!	p_ghand:   handle for the grid		TYPE (grid_handle)
+!	p_param:   global parameter structure	TYPE (global_param)
+! ON OUTPUT:
+!	l_changed: flag for changed grid	LOGICAL
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialize
+! FUNCTION:
+!	initialize the advection problem
+! SYNTAX:
+!	CALL slm_initialize(grid, param)
+! ON INPUT:
+!	p_param: parameter data structure	TYPE (global_param)
+! ON OUTPUT:
+!	p_ghand: grid handling data structure	TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_finish
+! FUNCTION:
+!	terminate slm (free dynamically alloc. memory, ...)
+! SYNTAX:
+!	CALL slm_finish(grid, param)
+! ON INPUT:
+!	p_ghand: grid handling data structure	TYPE (grid_handle)
+!	p_param: parameter data structure	TYPE (global_param)
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_timestepping
+! FUNCTION:
+!	perform the timestepping in the slm
+! SYNTAX:
+!	CALL slm_timestepping(grid, param, cmd)
+! ON INPUT:
+!	p_ghand: grid handling data structure	TYPE (grid_handle)
+!	p_param: parameter data structure	TYPE (global_param)
+!	p_cmdln: command line argument struct.	TYPE (cmdline)
+! ON OUTPUT:
+!	p_ghand: grid handling data structure	TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_displace, slm_update, slm_upstream
+!	slm_initialize, slm_finish, slm_timestepping
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, FEM_handle
+!	FEM_errorestimate, FEM_param
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	10/96
+!	2. several improvements/fixes	j. behrens	11/96-1/97
+!	3. nodal values time depend.	j. behrens	1/97
+!	4. stop_watch removed, plot	j. behrens	1/97
+!	   (position) changed, inner
+!	   iteration counter added
+!	5. slm_adapt changed 		j. behrens	2/97
+!	6. slm_adapt changed to hide
+!	   grid data structures		j. behrens	7/97
+!	7. control data structure	j. behrens	12/97
+!	8. non-homog. rhs added		j. behrens	2/98
+!	9. compliant to amatos 1.0	j. behrens	12/2000
+!	10. compliant to amatos 1.2	j. behrens	3/2002
+!	11. compliant to amatos 2.0	j. behrens	7/2003
+!       12. added visnetplot            f. klaschka     12/2003
+!
+!*****************************************************************
+	MODULE ADV_semilagrange
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE IO_vtuplot
+#ifndef NO_NETCDF
+	  USE IO_netcdfplot
+#endif
+	  USE IO_utils
+	  USE GRID_api
+	  USE SLM_errorestimate
+	  USE SLM_initial
+	  USE SLM_simple
+	  USE SLM_advanced
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_initialize, slm_finish, slm_timestepping
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_adapt(p_ghand, p_param, l_changed, l_water)
+
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (grid_handle), INTENT(inout)      :: p_ghand
+	  TYPE (control_struct), INTENT(in)      :: p_param
+	  LOGICAL, INTENT(out)                   :: l_changed
+	  LOGICAL, OPTIONAL, INTENT(in)          :: l_water
+	  LOGICAL                                :: l_switch
+	  REAL (KIND = GRID_SR)                                   :: r_errmx, &
+	    r_refcrit, r_crscrit, r_fac
+	  INTEGER                                :: i_size, &
+	    i_manyc, i_manyr, i_alct, i_cnt
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE        :: r_aux1
+	  INTEGER, DIMENSION(:), ALLOCATABLE     :: i_aux1, i_aux2, i_aux3
+	  LOGICAL                                :: l_ref, l_crs
+
+!---------- initialize refinement flag
+
+	  l_changed= .FALSE.
+
+!---------- handle watermark switch
+
+	  wat_present: IF(present(l_water)) THEN
+	    l_switch= l_water
+	  ELSE wat_present
+	    l_switch= .TRUE.
+	  END IF wat_present
+
+!---------- allocate work arrays
+
+	  i_size= p_ghand%i_enumfine
+	  allocate(r_aux1(i_size), i_aux1(i_size), i_aux2(i_size), &
+                   i_aux3(i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(35)
+	  END IF not_alloc
+
+!---------- estimate the local error
+
+	  CALL slm_errorest(p_ghand, i_size, r_aux1)
+
+!---------- set coarsening/refinement criterion
+
+	  r_errmx= maxval(r_aux1(1:i_size))
+	  r_crscrit= r_errmx* p_param%num%r_crstolerance
+	  r_refcrit= r_errmx* p_param%num%r_reftolerance
+
+!---------- get level information and set up flags for refinement/coarsening
+
+	  CALL grid_getinfo(p_ghand, l_finelevel= .TRUE., i_elementlevel= i_aux1, &
+	                    i_elementstatus= i_aux3)
+	  DO i_cnt=1,i_size
+	    i_aux2(i_cnt)= 0
+	    IF((i_aux1(i_cnt) > p_param%num%i_crslevel) .AND. &
+	       (r_aux1(i_cnt) < r_crscrit)) i_aux2(i_cnt)= GRID_pleasecoarse
+	    IF((i_aux1(i_cnt) < p_param%num%i_reflevel) .AND. &
+	       (r_aux1(i_cnt) > r_refcrit)) i_aux2(i_cnt)= GRID_pleaserefine
+	  END DO
+
+!---------- determine if there is enough to be done (this can be
+!           switched off by l_water=.FALSE.)
+
+	  IF(l_switch) THEN
+	    i_manyr= count(i_aux2 == GRID_pleaserefine)
+	    r_fac= real(i_manyr,GRID_SR)/ real(i_size,GRID_SR)
+	    enough_ref: IF(r_fac > p_param%num%r_refwatermark) THEN
+	      l_ref= .TRUE.
+	    ELSE
+	      l_ref= .FALSE.
+	    END IF enough_ref
+
+	    i_manyc= count(i_aux2 == GRID_pleasecoarse)
+	    r_fac= real(i_manyc,GRID_SR)/ real(i_size,GRID_SR)
+	    enough_crs: IF(r_fac > p_param%num%r_crswatermark) THEN
+	      l_crs= .TRUE.
+	    ELSE
+	      l_crs= .FALSE.
+	    END IF enough_crs
+	  ELSE
+	    l_ref= .TRUE.
+	    l_crs= .TRUE.
+	  END IF
+
+!---------- update grid flags
+
+	  update: IF(l_ref .OR. l_crs) THEN
+	    IF(l_ref) i_aux3= merge(i_aux2, i_aux3, i_aux2==GRID_pleaserefine)
+	    IF(l_crs) i_aux3= merge(i_aux2, i_aux3, i_aux2==GRID_pleasecoarse)
+	    CALL grid_putinfo(p_ghand, l_finelevel= .TRUE., i_elementstatus= i_aux3)
+	  END IF update
+
+!---------- deallocate work arrays
+
+	  deallocate(r_aux1, i_aux1, i_aux2, i_aux3)
+
+!---------- adapt the grid
+
+	  CALL grid_adapt(p_ghand, l_changed)
+
+	  RETURN
+	  END SUBROUTINE slm_adapt
+
+!*****************************************************************
+	  SUBROUTINE slm_diagnostics(p_ghand, p_param, p_tinfo, c_action)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (grid_handle), INTENT(in)           :: p_ghand
+	  TYPE (control_struct), INTENT(inout)     :: p_param
+	  TYPE (rt_info), INTENT(in)               :: p_tinfo
+	  CHARACTER (len=4), INTENT(in), OPTIONAL  :: c_action
+	  INTEGER, SAVE                            :: i_iodiag
+	  CHARACTER (len=32)                       :: c_file
+	  CHARACTER (len=28)                       :: c_tmp
+	  REAL (KIND = GRID_SR), PARAMETER                          :: r_1o3= (1./3.)
+	  INTEGER                                  :: i_fst, i_tmp, &
+	    i_size, i_alct, i_1, i_2, i_3, i_4, i_5, i_6
+	  REAL (KIND = GRID_SR), SAVE                               :: r_rfm0, r_rsm0
+	  REAL (KIND = GRID_SR)                                     :: r_dispn, r_rfm, r_rsm, &
+	    r_ts, r_calci, r_calcs, r_mxnrm, r_l2nrm, r_max, r_min, r_diffn, &
+	    r_medln
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE          :: r_aux1, r_aux2, &
+	    r_aux3, r_aux4
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_auxx
+	  INTEGER, DIMENSION(1)                    :: i_valind
+
+!---------- action init
+
+	  present_act: IF(present(c_action)) THEN
+	    action_type: IF(c_action == 'init') THEN
+
+!---------- open file for diagnostic output
+
+	      i_iodiag= 9
+	      i_tmp   = p_param%num%i_experiment
+	      write(c_tmp,*) trim(GRID_parameters%program_name), '_diag.'
+	      write(c_file,1010) trim(c_tmp), i_tmp
+	      c_file= adjustl(c_file)
+	      open(i_iodiag, file= c_file, action= 'write', form= 'formatted', &
+	           iostat= i_fst)
+	      not_opened: IF(i_fst /= 0) THEN
+	        CALL grid_error(36)
+	      END IF not_opened
+	      IF(GRID_parameters%iolog > 0) &
+	        write(GRID_parameters%iolog,*) 'INFO: Filename: ', c_file, ' opened on unit: ', i_iodiag
+
+!---------- allocate workspace
+
+	      i_size= p_ghand%i_nnumber
+	      allocate(r_aux1(i_size), r_aux2(i_size), r_aux3(i_size), &
+	               r_aux4(i_size), r_auxx(1,i_size), stat=i_alct)
+	      not_alloc: IF(i_alct /= 0) THEN
+	        CALL grid_error(37)
+	      END IF not_alloc 
+	      r_aux1= 0.0; r_aux2= 0.0; r_aux3= 0.0; r_aux4= 0.0
+
+!---------- get minimum edge length
+
+	      CALL grid_edgelength(p_ghand, r_min=r_medln)
+
+!---------- calculate reference values, ... extract actual calculated concentration
+
+	      i_valind= (/ GRID_tracer /)
+	      CALL grid_getinfo(p_ghand, i_arraypoint=i_valind, &
+	                        r_nodevalues= r_auxx)
+	      r_aux1(:)= r_auxx(1,:)
+	      DEALLOCATE(r_auxx)
+
+!---------- calculate area pieces for each node
+
+	      CALL grid_nodearea(p_ghand, i_size, r_aux2)
+
+!---------- calculate analytical solution
+
+	      r_ts= p_param%num%r_deltatime* float(p_tinfo%i_step)
+	      CALL slm_analyticsolution(p_ghand, r_ts, i_size, r_aux3)
+
+!---------- now the integral of the concentration (mass) is
+
+	      r_calci= dot_product(r_aux1, r_aux2)
+	      r_rfm0 = r_calci
+
+!---------- the integral of the squared concentration ("entropy"(?)) is
+
+	      r_aux4 = r_aux1* r_aux1
+	      r_calcs= dot_product(r_aux4, r_aux2)
+	      r_rsm0 = r_calcs
+
+!---------- the maximum-norm of the error is
+
+	      r_aux4 = abs(r_aux1- r_aux3)
+	      r_mxnrm= maxval(r_aux4)
+
+!---------- the l2-norm of the error is
+
+	      r_aux4 = r_aux4* r_aux4
+	      r_l2nrm= dot_product(r_aux4, r_aux2)
+
+!---------- maximum and minimum
+
+	      r_max  = maxval(r_aux1)
+	      r_min  = minval(r_aux1)
+
+!---------- diffusion and dispersion (not yet implemented)
+
+	      r_diffn= 0.0
+	      r_dispn= 0.0
+
+!---------- print it
+
+	      r_rfm= r_calci/r_rfm0
+	      r_rsm= r_calcs/r_rsm0
+	      write(i_iodiag,1100) GRID_parameters%program_name, GRID_parameters%version, &
+	                           GRID_parameters%subversion, GRID_parameters%patchversion
+	      i_1= p_tinfo%i_step
+	      i_2= p_ghand%i_enumber
+	      i_3= p_ghand%i_enumfine
+	      i_4= p_ghand%i_gnumber
+	      i_5= p_ghand%i_gnumfine
+	      i_6= p_ghand%i_nnumber
+	      write(i_iodiag,1000) i_1, i_2, i_3, i_4, i_5, i_6, r_min, r_max, &
+	                           r_rfm, r_rsm, r_mxnrm, r_l2nrm, r_diffn, &
+				   r_dispn, r_medln
+
+!---------- deallocate workspace
+
+	      deallocate(r_aux1, r_aux2, r_aux3, r_aux4)
+
+!---------- initialization done
+
+	      RETURN
+
+!---------- action quit
+
+	    ELSE IF(c_action == 'quit') THEN action_type
+
+!---------- close diagnostic output file
+
+	      close(i_iodiag)
+ 	      IF(GRID_parameters%iolog > 0) &
+	        write(GRID_parameters%iolog,*) 'INFO: Closed file on unit: ', i_iodiag
+
+!---------- action quit done
+
+	      RETURN
+	    END IF action_type
+	  END IF present_act
+
+!---------- action diag (default): allocate workspace
+
+	  i_size= p_ghand%i_nnumber
+	  allocate(r_aux1(i_size), r_aux2(i_size), r_aux3(i_size), &
+	           r_aux4(i_size), r_auxx(1,i_size), stat=i_alct)
+	  not_allc: IF(i_alct /= 0) THEN
+	    CALL grid_error(37)
+	  END IF not_allc 
+	  r_aux1= 0.0; r_aux2= 0.0; r_aux3= 0.0; r_aux4= 0.0
+
+!---------- get minimum edge length
+
+	  CALL grid_edgelength(p_ghand, r_min=r_medln)
+
+!---------- calculate reference values, ... extract actual calculated concentration
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_getinfo(p_ghand, i_arraypoint=i_valind, &
+	  		   r_nodevalues= r_auxx)
+	  r_aux1(:)= r_auxx(1,:)
+	  DEALLOCATE(r_auxx)
+
+!---------- calculate area pieces for each node
+
+	  CALL grid_nodearea(p_ghand, i_size, r_aux2)
+
+!---------- calculate analytical solution
+
+	  r_ts= p_param%num%r_deltatime* float(p_tinfo%i_step)
+	  CALL slm_analyticsolution(p_ghand, r_ts, i_size, r_aux3)
+
+!---------- now the integral of the concentration (mass) is
+
+	  r_calci= dot_product(r_aux1, r_aux2)
+
+!---------- the integral of the squared concentration ("entropy"(?)) is
+
+	  r_aux4 = r_aux1* r_aux1
+	  r_calcs= dot_product(r_aux4, r_aux2)
+
+!---------- the maximum-norm of the error is
+
+	  r_aux4 = abs(r_aux1- r_aux3)
+	  r_mxnrm= maxval(r_aux4)
+
+!---------- the l2-norm of the error is
+
+	  r_aux4 = r_aux4* r_aux4
+	  r_l2nrm= dot_product(r_aux4, r_aux2)
+
+!---------- maximum and minimum
+
+	  r_max  = maxval(r_aux1)
+	  r_min  = minval(r_aux1)
+
+!---------- diffusion and dispersion (not yet implemented)
+
+	  r_diffn= 0.0
+	  r_dispn= 0.0
+
+!---------- print it
+
+	  r_rfm= r_calci/r_rfm0
+	  r_rsm= r_calcs/r_rsm0
+	  i_1= p_tinfo%i_step
+	  i_2= p_ghand%i_enumber
+	  i_3= p_ghand%i_enumfine
+	  i_4= p_ghand%i_gnumber
+	  i_5= p_ghand%i_gnumfine
+	  i_6= p_ghand%i_nnumber
+	  write(i_iodiag,1000) i_1, i_2, i_3, i_4, i_5, i_6, r_min, r_max, &
+	                       r_rfm, r_rsm, r_mxnrm, r_l2nrm, r_diffn, &
+	                       r_dispn, r_medln
+
+!---------- deallocate workspace
+
+	  deallocate(r_aux1, r_aux2, r_aux3, r_aux4)
+
+	  RETURN
+ 1000	  FORMAT(1x, i10, 1x, i10, 1x, i10, 1x, i10, 1x, i10, 1x, i10, &
+	         1x, e15.8, 1x, e15.8, 1x, e15.8, 1x, e15.8,&
+	         1x, e15.8, 1x, e15.8, 1x, e15.8, 1x, e15.8,&
+	         1x, e15.8)
+ 1010	  FORMAT(a28,i4.4)
+ 1100	  FORMAT(1x,'*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '*************************************',/ &
+	         1x,'***** PROGRAM: ',a15,174x,'*****',/ &
+	         1x,'***** VERSION: ',i2.2,'.',i2.2,'.',i2.2,181x,'*****',/ &
+	         1x,'***** Diagnostic output ',180x,'*****',/ &
+	         1x,'*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '*************************************',/ &
+	         1x,'* timestep ','  elements ','  fine el. ','     edges ', &
+	            '  fine ed. ','     nodes ','        minimum ', &
+	            '        maximum ','            RFM ','            RSM ', &
+                    '       max-norm ','        l2-norm ','      diffusion ', &
+	            '     dispersion ',' min.edge len.*',/ &
+	         1x,'*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '******************************************', &
+	            '**************************************')
+	  END SUBROUTINE slm_diagnostics
+
+!*****************************************************************
+	  SUBROUTINE slm_initialize(p_ghand, p_param)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(out) :: p_ghand
+	  TYPE (control_struct), INTENT(inout)          :: p_param
+
+	  INTEGER                                     :: i_steps
+	  CHARACTER (len=32)                          :: c_file
+	  CHARACTER (len=28)                          :: c_tmp
+	  INTEGER                                     :: i_tmp, i_cnt
+	  LOGICAL                                     :: l_refined
+	  INTEGER                                     :: i_vertnum
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER               :: r_vertinit
+
+!---------- decide whether a new experiment is startet or an old one is continued
+
+	  new_experiment: IF(p_param%num%i_experiment <= 0) THEN
+
+!---------- reset timesteps (start with 1 in any case)
+
+	    time_one: IF(p_param%num%i_frsttimestep /= 1) THEN
+	      IF(GRID_parameters%iolog > 0) &
+	        write(GRID_parameters%iolog,*) 'WARNING      : Timestep counters reset due to new experiment'
+	      i_steps= p_param%num%i_lasttimestep- p_param%num%i_frsttimestep
+	      p_param%num%i_frsttimestep= 1
+	      p_param%num%i_lasttimestep= p_param%num%i_frsttimestep+ i_steps
+	    END IF time_one
+
+!---------- initialize grid parameters
+
+	    CALL grid_setparameter(p_ghand, i_coarselevel= p_param%num%i_crslevel, &
+	                           i_finelevel= p_param%num%i_reflevel)
+
+!---------- define domain, first read data from file (compiled here)
+
+	    CALL grid_readdomain(i_vertnum, r_vertinit, c_readfile=p_param%io%c_domainfile)
+	    CALL grid_definegeometry(i_vertnum, r_vertexarr= r_vertinit)
+
+!---------- create initial triangulation
+
+	    CALL grid_createinitial(p_ghand, c_filename=p_param%io%c_triangfile)
+
+!---------- initialize grid and adapt at steep gradients
+
+	    i_cnt= 0
+	    l_refined= .TRUE.
+	    refine_loop: DO WHILE (l_refined)
+	      CALL slm_initialvalues(p_ghand(i_timeplus))
+	      CALL slm_adapt(p_ghand(i_timeplus), p_param, l_refined, &
+	                     l_water=.FALSE.)
+	    END DO refine_loop
+
+!---------- duplicate grid (old time)
+
+	    CALL grid_timeduplicate(p_ghand(i_timeplus), p_ghand(i_time))
+
+!---------- initialize wind field calculation
+
+	    CALL slm_windinit(p_param)
+
+!---------- if an old experiment is to be continued from stored data:
+
+	  ELSE new_experiment
+
+!---------- create grid from saveset, first compile filename
+
+	    i_tmp= p_param%num%i_experiment- 1
+	    write(c_tmp,*) trim(GRID_parameters%program_name), '_save.'
+	    write(c_file,1010) trim(c_tmp), i_tmp
+	    c_file= adjustl(c_file)
+
+	    CALL grid_readinitial(p_ghand, c_file)
+
+!---------- initialize wind field calculation
+
+	    CALL slm_windinit(p_param)
+
+	  END IF new_experiment
+
+	  RETURN
+ 1010	  FORMAT(a28,i4.4)
+	  END SUBROUTINE slm_initialize
+
+!*****************************************************************
+	  SUBROUTINE slm_finish(p_ghand, p_param)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                          :: p_param
+	  CHARACTER (len=32)                                       :: c_file
+	  CHARACTER (len=28)                                       :: c_tmp
+	  INTEGER                                                  :: i_tmp
+
+!---------- open and write saveset, if required
+
+	  save_req: IF(p_param%io%i_savelast /= 0) THEN
+
+	    i_tmp= p_param%num%i_experiment
+	    write(c_tmp,*) trim(GRID_parameters%program_name), '_save.'
+	    write(c_file,1010) trim(c_tmp), i_tmp
+	    c_file= adjustl(c_file)
+	    CALL grid_writesaveset(c_file, p_ghand)
+
+!---------- write parameter file for next experiment
+
+	    CALL io_putinputfile(p_param)
+	  END IF save_req
+
+!---------- gracefully terminate wind field calculations
+
+	  CALL slm_windquit
+
+	  RETURN
+ 1010	  FORMAT(a28,i4.4)
+	  END SUBROUTINE slm_finish
+
+!*****************************************************************
+	  SUBROUTINE slm_timestepping(p_ghand, p_param)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  INTEGER, PARAMETER                   :: i_innermax=15
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), &
+	                      INTENT(inout)    :: p_ghand
+	  TYPE (control_struct), INTENT(inout) :: p_param
+	  INTEGER                              :: i_timecount
+	  TYPE (sw_info)                       :: p_time, p_timeaux
+	  LOGICAL                              :: l_refined
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE      :: r_tracer
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_coord, r_aux
+	  CHARACTER (len=32)                   :: c_file, c_matfile
+	  CHARACTER (len=28)                   :: c_tmp
+	  INTEGER                              :: i_tmp, &
+	    i_size, i_alct, i_tst, i_fst
+	  INTEGER                              :: i_iomatl=21
+	  REAL (KIND = GRID_SR)                :: r_modtime
+          INTEGER                              :: i_loopquit
+	  INTEGER                              :: i_newlen
+	  INTEGER, DIMENSION(1)                :: i_valind
+		
+!---------- VISNET variable init
+
+		i_loopquit = 0
+		
+!---------- initialize timestep info structure
+
+	  p_timestepinfo%i_step       = 0
+	  p_timestepinfo%i_adapit     = 0
+	  p_timestepinfo%l_ploted     = .FALSE.
+	  p_timestepinfo%l_saved      = .FALSE.
+	  p_timestepinfo%r_modeltime  = 0.0
+
+!---------- initialize timing structure
+
+	  p_time%p_tim%r_tim   = 0.0
+	  p_time%p_tim%r_lap   = 0.0
+	  p_time%p_tim%c_tim   = '                '
+	  p_timeaux%p_tim%r_tim= 0.0
+	  p_timeaux%p_tim%r_lap= 0.0
+	  p_timeaux%p_tim%c_tim= '                '
+
+!---------- initialize stop watches
+
+	  CALL stop_watch_init(1,(/'total time      '/),p_timeaux)
+	  CALL stop_watch_init(8,(/'plotting        ', 'grid duplication', &
+	                           'trajectory calc.', 'right hand side ', &
+	                           'grid value updt.', 'grid adaption   ', &
+	                           'diagnostics     ', 'whole timestep  '/), p_time)
+	                           
+!---------- if diagnostics are demanded, initialize diagnostical output
+
+	  IF(p_param%io%l_diagnostics) THEN
+	    p_timestepinfo%i_step= 0
+	    CALL slm_diagnostics(p_grid(i_timeplus), p_param, p_timestepinfo, c_action='init')
+	  END IF
+
+!---------- plot initial data
+
+	  i_timecount= 0
+#ifndef NO_NETCDF
+	  IF(p_param%io%l_netcdf) THEN
+	    CALL plot_netcdf(p_ghand(i_timeplus), i_time=i_timecount)
+      END IF
+#endif
+	  IF(p_param%io%l_vtu) THEN
+	    CALL generate_vtu(p_ghand(i_timeplus), i_time=i_timecount)
+	  END IF
+!---------- put out initial information
+
+	  CALL io_putruntimeinfo(p_ghand(i_timeplus), p_timestepinfo, p_time)
+
+!---------- timestep loop
+
+      CALL stop_watch('start',1,p_timeaux)
+      CALL stop_watch('start',8,p_time)
+      i_timecount = 0_GRID_SI
+      p_timestepinfo%r_modeltime = p_param%num%r_starttime
+      time_loop: DO WHILE (p_timestepinfo%r_modeltime < p_param%num%r_finaltime - p_param%num%r_deltatime)
+        i_timecount                = i_timecount+ 1_GRID_SI
+        p_timestepinfo%i_step      = i_timecount
+        p_timestepinfo%r_modeltime = p_timestepinfo%r_modeltime + p_param%num%r_deltatime
+        p_timestepinfo%i_adapit    = 0_GRID_SI
+
+!---------- duplicate old grid, use it as first guess for new grid
+
+	    CALL stop_watch('start',2,p_time)
+	    CALL grid_timeduplicate(p_ghand(i_time), p_ghand(i_timeplus))
+	    CALL stop_watch('stop ',2,p_time)
+
+!---------- adaptive (inner) loop
+
+	    l_refined= .TRUE.
+	    adap_loop: DO WHILE(l_refined .AND. p_timestepinfo%i_adapit < i_innermax)
+	      p_timestepinfo%i_adapit= p_timestepinfo%i_adapit+ 1
+
+!---------- allocate and extract working arrays
+!---------- use amatos 1.2 functionality to calculate only new nodes
+
+	      i_size= p_ghand(i_timeplus)%i_nnumber
+	      allocate(r_aux(GRID_dimension,i_size), stat=i_alct)
+	      not_alloc: IF(i_alct /= 0) THEN
+	        CALL grid_error(38)
+	      END IF not_alloc
+
+!-SLM--------- do the following SLM calculations in arrays (grid-point-wise)
+
+	      CALL grid_getinfo(p_ghand(i_timeplus), r_nodecoordinates=r_aux, &
+	                        i_newsdepth= 1, i_nlength= i_newlen)
+	      allocate(r_tracer(i_newlen), r_coord(GRID_dimension,i_newlen), stat=i_alct)
+	      not_alloc0: IF(i_alct /= 0) THEN
+	        CALL grid_error(38)
+	      END IF not_alloc0
+	      r_coord(:,1:i_newlen)= r_aux(:,1:i_newlen)
+	      deallocate(r_aux)
+
+!-SLM--------- call the SLM step
+
+	      r_modtime= p_timestepinfo%r_modeltime- p_param%num%r_deltatime
+	      CALL slm_step(p_ghand, p_param, p_time, r_modtime, i_newlen, &
+	                    r_coord, r_tracer, i_newsdepth=1)
+
+!-SLM--------- update grid data structure and deallocate work arrays
+!-SLM--------- change back from (grid-point)arrays to grid data structure
+
+	      allocate(r_aux(1,i_newlen), stat=i_alct)
+	      not_alloc1: IF(i_alct /= 0) THEN
+	        CALL grid_error(38)
+	      END IF not_alloc1
+	      r_aux(1,:)= r_tracer(:)
+	      i_valind= (/ GRID_tracer /)
+	      CALL grid_putinfo(p_ghand(i_timeplus), i_arraypoint= i_valind, &
+	                        i_newsdepth= 1, r_nodevalues= r_aux)
+
+	      deallocate(r_coord, r_tracer, r_aux)
+
+!-SLM--------- adapt the grid corresponding to an error estimate
+
+	      CALL stop_watch('start',6,p_time)
+	      CALL slm_adapt(p_ghand(i_timeplus), p_param, l_refined)
+	      CALL stop_watch('stop ',6,p_time)
+
+	    END DO adap_loop
+
+!---------- diagnostics, if requested
+
+	    IF(p_param%io%l_diagnostics) THEN
+	      CALL stop_watch('start',7,p_time)
+	      CALL slm_diagnostics(p_grid(i_timeplus), p_param, p_timestepinfo, c_action='diag')
+	      CALL stop_watch('stop ',7,p_time)
+	    END IF
+
+!---------- plot data (every [i_plotoffset]th timestep)
+
+	    CALL stop_watch('start',1,p_time)
+	    plot_step: IF(mod(i_timecount, p_param%io%i_plotoffset) == 0) THEN
+	      IF((p_param%io%l_netcdf) .OR. (p_param%io%l_vtu)) &
+	        p_timestepinfo%l_ploted= .TRUE.
+
+#ifndef NO_NETCDF
+	      IF(p_param%io%l_netcdf) THEN
+	        CALL plot_netcdf(p_ghand(i_timeplus), i_time=i_timecount)
+	      END IF
+#endif
+	      IF(p_param%io%l_vtu) THEN
+	        CALL generate_vtu(p_ghand(i_timeplus), i_time=i_timecount)
+	      END IF
+	    END IF plot_step
+	    CALL stop_watch('stop ',1,p_time)
+
+!---------- put a saveset to disc every ... timesteps
+
+	    save_step: IF((mod(i_timecount, p_param%io%i_saveoffset) == 0) .AND. &
+	                  (i_timecount > 1)) THEN
+	      i_tmp= p_param%num%i_experiment
+ 	      write(c_tmp,*) trim(GRID_parameters%program_name), '_save.'
+	      write(c_file,1010) trim(c_tmp), i_tmp
+	      c_file= adjustl(c_file)
+	      CALL grid_writesaveset(c_file,p_ghand)
+	      p_timestepinfo%l_saved= .TRUE.
+	    END IF save_step
+
+!---------- runtime information output
+
+	    CALL stop_watch('stop ',8,p_time)
+	    CALL io_putruntimeinfo(p_ghand(i_timeplus), p_timestepinfo, p_time)
+	    CALL stop_watch_init(8,(/'plotting        ', 'grid duplication', &
+	                             'trajectory calc.', 'right hand side ', &
+	                             'grid value updt.', 'grid adaption   ', &
+	                             'diagnostics     ', 'whole timestep  '/), p_time)
+	    CALL stop_watch('start',8,p_time)
+
+!---------- remove obsolecent grid items
+
+	    CALL grid_sweep
+
+!---------- toggle time handles for next step if gfx-proces has not exited
+
+	    CALL grid_timetoggle
+
+!---------- exit loop if graphics process has been terminated
+
+            IF (i_loopquit /= 0) EXIT time_loop
+
+	  END DO time_loop
+	  CALL stop_watch('stop ',1,p_timeaux)
+
+!---------- print total time
+
+ 	  write(GRID_parameters%ioout,1005)
+	  write(GRID_parameters%ioout,1003) p_timeaux%p_tim(1)%r_tim
+	  write(GRID_parameters%ioout,1004)
+	  IF(GRID_parameters%iolog > 0) THEN
+	    write(GRID_parameters%iolog,1003) p_timeaux%p_tim(1)%r_tim
+	  END IF
+
+!---------- terminate diagnostics
+
+	  IF(p_param%io%l_diagnostics) THEN
+	    CALL slm_diagnostics(p_grid(i_timeplus), p_param, p_timestepinfo, c_action='quit')
+	  END IF
+
+	  RETURN
+ 1000	  FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/ &
+	         1x,'*****            Runtime Information Output           *****',/ &
+	         1x,'***** ----- ----- ----- ----- ----- ----- ----- ----- *****')
+ 1003	  FORMAT(1x,'***** Total time for timesteps ',10x,e12.4,' *****')
+ 1004	  FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/)
+ 1005	  FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/ &
+	         1x,'*****             Final Information Output            *****',/ &
+	         1x,'***** ----- ----- ----- ----- ----- ----- ----- ----- *****')
+ 1010	  FORMAT(a28,i4.4)
+	  END SUBROUTINE slm_timestepping
+
+	END MODULE ADV_semilagrange
diff --git a/flash2d/src/options-sphere/ADV_wind.div b/flash2d/src/options-sphere/ADV_wind.div
new file mode 100644
index 0000000..3599827
--- /dev/null
+++ b/flash2d/src/options-sphere/ADV_wind.div
@@ -0,0 +1,150 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	ADV_wind
+! FUNCTION:
+!	calculate the windfield for the advection problem
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_windfield
+! FUNCTION:
+!	calculate the advecting force for simple advection
+! SYNTAX:
+!	real.arr= slm_windfield(real.arr, real)
+! ON INPUT:
+!	r_coord: coordinates of point		real
+!	r_time:  time coordinate (optional)	real
+! ON OUTPUT:
+!	r_field: windfield			real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	12/97
+!	2. compliant to amatos 1.0	j. behrens	12/2000
+!	3. compliant to amatos 1.2	j. behrens	3/2002
+!       4. compliant to amatos 2.0      f. klaschka     8/2006
+!
+!*****************************************************************
+	MODULE ADV_wind
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC :: slm_windfield, slm_windinit, slm_windquit
+	  REAL   :: r_u0
+	  CONTAINS
+!*****************************************************************
+	  FUNCTION slm_windfield(r_coord, r_time, r_lamphi) RESULT (r_field)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimspherical), OPTIONAL :: r_lamphi
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                   :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)              :: r_field
+	  REAL (KIND = GRID_SR)                                         :: r_angl=0.0
+	  REAL (KIND = GRID_SR)                                         :: r_tim
+	  REAL (KIND = GRID_SR)                                         :: r_tmp
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimspherical)           :: r_lp, r_zetet, r_gup
+! 	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)              :: r_kup
+
+!---------- set time
+
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0
+	  END IF
+
+!---------- calculate spherical coordinates
+
+	  IF(present(r_lamphi)) THEN
+	    r_lp= r_lamphi
+	  ELSE
+	    r_lp= grid_kartgeo(r_coord)
+	  END IF
+
+!---------- calculate wind vector in spherical coordinates
+
+	  r_zetet(1)= r_u0* cos(r_lp(2))
+	  r_zetet(2)= r_u0* sin(r_lp(2))
+
+!---------- calculate wind vector in kartesian coordinates
+
+	  r_field= kartwind(r_zetet,r_lp)
+	
+	  RETURN
+	  END FUNCTION slm_windfield
+
+!*****************************************************************
+	  SUBROUTINE slm_windinit(p_control)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (control_struct)     :: p_control
+
+!---------- calculate velocity factor (one revolution after 12 days/
+!           576 time steps of half an hour)
+
+	  r_u0= (2.0* GRID_PI* GRID_RADIUS)/1.0368e6
+
+	  RETURN
+	  END SUBROUTINE slm_windinit
+
+!*****************************************************************
+	  SUBROUTINE slm_windquit
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  RETURN
+	  END SUBROUTINE slm_windquit
+
+!*****************************************************************
+	  FUNCTION kartwind(r_lamphi, r_lpcoor) RESULT (r_kart)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimspherical) :: r_lamphi, r_lpcoor
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)    :: r_kart
+	  REAL (KIND = GRID_SR)                               :: r_sl, r_cl, r_sp, r_cp
+
+!---------- calculate constants
+
+	  r_sl= sin(r_lpcoor(1))
+	  r_cl= cos(r_lpcoor(1))
+	  r_sp= sin(r_lpcoor(2))
+	  r_cp= cos(r_lpcoor(2))
+
+!---------- calculate 3D kartesian components
+
+	  r_kart(1)= -r_sl* r_lamphi(1)- r_sp* r_cl* r_lamphi(2)
+	  r_kart(2)=  r_cl* r_lamphi(1)- r_sp* r_sl* r_lamphi(2)
+	  r_kart(3)=                     r_cp*       r_lamphi(2)
+
+	  RETURN
+	  END FUNCTION kartwind
+
+!*****************************************************************
+	END MODULE ADV_wind
+
diff --git a/flash2d/src/options-sphere/ADV_wind.mvortex b/flash2d/src/options-sphere/ADV_wind.mvortex
new file mode 100644
index 0000000..187b297
--- /dev/null
+++ b/flash2d/src/options-sphere/ADV_wind.mvortex
@@ -0,0 +1,321 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	ADV_wind
+! FUNCTION:
+!	calculate the windfield for the advection problem
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_windfield
+! FUNCTION:
+!	calculate the advecting force for simple advection
+! SYNTAX:
+!	real.arr= slm_windfield(real.arr, real)
+! ON INPUT:
+!	r_coord: coordinates of point		real
+!	r_time:  time coordinate (optional)	real
+! ON OUTPUT:
+!	r_field: windfield			real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	12/97
+!	2. compliant to amatos 1.0	j. behrens	12/2000
+!	3. compliant to amatos 1.2	j. behrens	3/2002
+! 4. compliant to amatos 2.0      f. klaschka     8/2006
+!
+!*****************************************************************
+	MODULE ADV_wind
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC :: slm_windfield, slm_windinit, slm_windquit
+	  REAL  (KIND = GRID_SR)  :: r_u0
+    REAL (KIND=GRID_SR) 	  :: r_beta = 0._GRID_SR * 0.785398163397448279_GRID_SR   ! Check SLM_initial when changing this value!!!
+
+	  CONTAINS
+!*****************************************************************
+	  FUNCTION slm_windfield(r_coord, r_time, r_lamphi) RESULT (r_field)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimspherical), OPTIONAL :: r_lamphi
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                   :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)              :: r_field
+	  REAL (KIND = GRID_SR)                                         :: r_angl=0.0
+	  REAL (KIND = GRID_SR)                                         :: r_tim
+	  REAL (KIND = GRID_SR)                                         :: r_tmp
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimspherical)           :: r_lp, r_zetet, r_gup
+! 	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_kup
+
+!---------- Nairs variables
+    
+		REAL (KIND = GRID_SR) 																			:: r_scale,	r_unot, r_vnot
+		
+		REAL (KIND = GRID_SR) 																			:: r_lm0, r_th0 				! initial vortex center
+		REAL (KIND = GRID_SR) 																			:: r_s_alpha, r_c_alpha 
+		REAL (KIND = GRID_SR) 																			:: r_lmc, r_thc 				! north pole coordinates
+		REAL (KIND = GRID_SR) 																			:: r_ldt, r_tdt
+		REAL (KIND = GRID_SR) 																			:: r_pl, r_pt 					! vortex position
+		REAL (KIND = GRID_SR) 																			:: r_th, r_lm 					! point of interest
+		REAL (KIND = GRID_SR) 																			:: r_rl, r_rt
+		REAL (KIND = GRID_SR) 																			:: r_rd, r_vmax
+		REAL (KIND = GRID_SR) 																			:: r_rth, r_rlm 			  ! rotated theta and lambda?
+		REAL (KIND = GRID_SR) 																			:: r_rho								! density
+		REAL (KIND = GRID_SR) 																			:: r_tt, r_tv
+		REAL (KIND = GRID_SR) 																			:: r_omg, r_trm 				
+		REAL (KIND = GRID_SR) 																			:: r_us, r_vs 					! solid body tangential	velocities
+
+!---------- set time
+
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0
+	  END IF
+
+!---------- calculate spherical coordinates
+
+	  IF(present(r_lamphi)) THEN
+	    r_lp= r_lamphi
+	  ELSE
+	    r_lp= grid_kartgeo(r_coord)
+	  END IF
+
+!---------- calculate wind vector in spherical coordinates
+
+!---------- Parameters for a unit sphere (see dynamic_vortex.f, Nair)
+
+    r_scale = 2._GRID_SR*GRID_PI / float(1036800)     !12 days scale
+    r_unot  = 2._GRID_SR*GRID_PI / float(1036800)     !12 dyas rate
+		r_vnot  = 2._GRID_SR*GRID_PI / float(1036800)
+
+    r_lm0 = 1.5_GRID_SR * GRID_PI            !intial center position (3pi/2,0)
+    r_th0 = 0.0_GRID_SR
+		
+		r_c_alpha = cos(r_beta)
+		r_s_alpha = sin(r_beta)
+		
+!*--------Note:
+!*      keep the vortex position (pl,pt)  "fixed" and rotate the background 
+!*      away by "unot*dtime*ditn" units from its initial position on
+!*      the latitudes of a rotated sphere. Transform back to the regular coordinates
+!*      and form the vortex with center at the "fixed" position (pl,pt).
+!*
+            
+!---------- To find the central position of the distribution as a function of alpha and time  
+
+	  r_lmc = 0._GRID_SR
+		r_thc = 0.5_GRID_SR * GRID_PI - r_beta
+		r_ldt = r_lm0 + r_unot * r_time
+		r_tdt = r_th0 + 0._GRID_SR
+		CALL rotated_sphere(r_lmc,r_thc,r_ldt,r_tdt,r_rl,r_rt)
+		
+		r_pl = r_rl 	 
+		r_pt = r_rt
+
+    !vortex parameters  (Nair & Machenhauer 2002)
+
+    r_rd = 3.0_GRID_SR
+    r_vmax = 1.5_GRID_SR *sqrt(3.0_GRID_SR)   
+
+!----------- Analytic Vortex field at any given time (iteration)
+!----------- Smooth Vortex making parameters  
+
+		r_lm = r_lp(1)
+		r_th = r_lp(2)  
+	
+    CALL rotated_sphere(r_pl,r_pt,r_lm,r_th,r_rlm, r_rth)
+		
+    r_rho = r_rd * cos(r_rth)
+    r_tt = tanh(r_rho)
+    r_tv = (1.0_GRID_SR - r_tt*r_tt) * r_tt * r_vmax
+
+    if (r_rho == 0.0_GRID_SR ) then
+      r_omg = 0.0_GRID_SR
+    else
+      r_omg = r_tv / r_rho
+    endif
+	
+		
+		! Solid body rotation flow
+		r_us = r_unot * (cos(r_th)*r_c_alpha + sin(r_th)*cos(r_lm)*r_s_alpha)
+		r_vs =-r_unot *  sin(r_lm)*r_s_alpha
+		
+!	  r_us = 0._GRID_SR 	! for no solid body rotation flow
+!	  r_vs = 0._GRID_SR
+		
+		! tangential velocity ( solid body rotation + vortex)
+	  r_zetet(1)= r_us + r_vnot * r_omg * (sin(r_pt)*cos(r_th) - &
+		                                     cos(r_pt)*cos(r_lm - r_pl)*sin(r_th))
+		r_zetet(2)= r_vs + r_vnot * r_omg * (cos(r_pt)*sin(r_lm - r_pl))
+
+
+!---------- calculate wind vector in kartesian coordinates
+
+! 	  r_gup= r_lp- r_zetet
+! 	  r_kup=grid_geokart(r_gup)
+! 	  r_field= r_kup- r_coord
+	  r_field= kartwind(r_zetet,r_lp)
+	
+	  RETURN
+	  END FUNCTION slm_windfield
+
+!*****************************************************************
+	  SUBROUTINE slm_windinit(p_control)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (control_struct)     :: p_control
+
+!---------- calculate velocity factor (one revolution after 12 days/
+!           576 time steps of half an hour)
+
+	  r_u0= (2.0_GRID_SR* GRID_PI* GRID_RADIUS)/1.0368e6_GRID_SR
+
+	  RETURN
+	  END SUBROUTINE slm_windinit
+
+!*****************************************************************
+	  SUBROUTINE slm_windquit
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  RETURN
+	  END SUBROUTINE slm_windquit
+
+!*****************************************************************
+	  FUNCTION kartwind(r_lamphi, r_lpcoor) RESULT (r_kart)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimspherical) :: r_lamphi, r_lpcoor
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)    :: r_kart
+	  REAL (KIND = GRID_SR)                               :: r_sl, r_cl, r_sp, r_cp
+
+!---------- calculate constants
+
+	  r_sl= sin(r_lpcoor(1))
+	  r_cl= cos(r_lpcoor(1))
+	  r_sp= sin(r_lpcoor(2))
+	  r_cp= cos(r_lpcoor(2))
+
+!---------- calculate 3D kartesian components
+
+	  r_kart(1)= -r_sl* r_lamphi(1)- r_sp* r_cl* r_lamphi(2)
+	  r_kart(2)=  r_cl* r_lamphi(1)- r_sp* r_sl* r_lamphi(2)
+	  r_kart(3)=                     r_cp*       r_lamphi(2)
+
+	  RETURN
+	  END FUNCTION kartwind
+
+!*****************************************************************
+
+!*******************************************************************
+!* Ram Nair (Ncar/SCD) 08/06
+!*  Rotate a sphere  so that its NP is at (lc,tc). The rotated coordinates
+!* (rol,rot) corresponding to (la,th) in the regular Sph.  coordinates
+!*******************************************************************
+    SUBROUTINE Rotated_Sphere(lc,tc,la,th,rol,rot)
+!*
+!      include 'params.h'
+!      include 'const.h'
+!*
+
+
+    IMPLICIT NONE
+    REAL (KIND = GRID_SR), INTENT(in)			:: lc,tc,la,th          !In
+    REAL (KIND = GRID_SR), INTENT(out)    :: rol,rot              !Out
+
+    REAL (KIND = GRID_SR)									:: cost,sint,sinc,cosc
+    REAL (KIND = GRID_SR)									:: trm, trm1,trm2,trm3
+    REAL (KIND = GRID_SR)       					:: twopi
+		
+		twopi=2._GRID_SR * GRID_PI
+		
+    sinc = sin(tc)
+    cosc = cos(tc)
+    cost = cos(th)
+    sint = sin(th)
+
+    trm  = cost * cos(la- lc)
+    trm1 = cost * sin(la- lc)
+    trm2 = sinc * trm  - cosc * sint
+    trm3 = sinc * sint + cosc * trm
+     
+    rol = atan2(trm1,trm2)
+    if (rol > twopi)        rol = rol - twopi
+    if (rol < 0.0_GRID_SR ) rol = rol + twopi
+    rot = asin(trm3)
+
+    RETURN
+    END SUBROUTINE Rotated_Sphere
+
+
+!*******************************************************************
+!* Ram Nair (Ncar/SCD) 10/06
+!*Rotate a sphere  back to the regular (rla,rth) coordinates from
+!* a  totated sphere whose  NP is at (lmc,thc). The unrotated coordinates
+!*(rla,rth) corresponds to the (lam,the) of the  rotated Sphere
+!*******************************************************************
+    SUBROUTINE Rotate_Back(lmc,thc,lam,the,rla,rth)
+!*
+!      include 'params.h'
+!      include 'const.h'
+!*
+
+	  IMPLICIT NONE
+    REAL (KIND = GRID_SR), INTENT(in)			:: lmc,thc,lam,the      !In
+    REAL (KIND = GRID_SR), INTENT(out)		:: rla,rth              !Out
+
+    REAL (KIND = GRID_SR)									:: cost,sint,cosp,sinp,clam,slam 
+    REAL (KIND = GRID_SR)									:: trm, t1,t2,t3
+    REAL (KIND = GRID_SR) 					      :: twopi
+
+
+		twopi=2._GRID_SR * GRID_PI
+		
+!* Back to unrotated system
+    cost = cos(the)
+    sint = sin(the)
+    clam = cos(lam)
+    slam = sin(lam)
+    cosp = cos(thc)
+    sinp = sin(thc)
+     t1 = slam * cost
+     t2 = sint*cosp + cost*clam*sinp
+     t3 = sint*sinp - cost*clam*cosp
+    rla =  lmc + atan2(t1,t2)
+    if (rla < 0.0 )  rla = rla + twopi
+    if (rla > twopi )  rla = rla - twopi
+    rth =  asin(t3)
+
+    RETURN
+    END SUBROUTINE Rotate_Back
+		
+	END MODULE ADV_wind
+
+
diff --git a/flash2d/src/options-sphere/SLM_advanced.cellint.f90 b/flash2d/src/options-sphere/SLM_advanced.cellint.f90
new file mode 100644
index 0000000..bc137e2
--- /dev/null
+++ b/flash2d/src/options-sphere/SLM_advanced.cellint.f90
@@ -0,0 +1,631 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_advanced
+! FUNCTION:
+!	provide advanced semi-Lagrangian routines
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_step
+! FUNCTION:
+!	one step of the basic SLM algorithm
+! SYNTAX:
+!	CALL slm_step(int, real.arr, real.arr)
+! ON INPUT:
+!	...
+! ON OUTPUT:
+!	r_tracer: array with tracer values	real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_displace
+! FUNCTION:
+!	extrapolate the alpha, values for the displacements of the upstream
+!	points from the gridpoints
+! SYNTAX:
+!	CALL slm_displace(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_coord: real array of xy-coordinates		real
+! ON OUTPUT:
+!	r_alpha: displacement vectors to each point	real
+! CALLS:
+!	wind_field
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_update
+! FUNCTION:
+!	calculate the update to the velocity
+! SYNTAX:
+!	CALL slm_update(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_rside: array with right hand side values	real
+! ON OUTPUT:
+!	r_udate: array with new (updated) gid values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is trivial for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_upstream
+! FUNCTION:
+!	calculate right hand side of the equation (upstream values)
+! SYNTAX:
+!	CALL slm_upstream(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_alpha: displacement vectors to each point	real
+! ON OUTPUT:
+!	r_rside: array with right hand side values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is just interpolation for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_interpolate
+! FUNCTION:
+!	do the interpolation
+! SYNTAX:
+!	CALL slm_interpolate(grid, int, real, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	p_ogrid: grid handle to old grid (with data)	TYPE (grid_handle)
+!	r_fac:   factor at which point to interpolate	REAL
+!	i_arlen: array length for the following arrays	INTEGER
+!	r_coord: coordinate array (new grid)		REAL
+!	r_alpha: displacement array (corr. to r_coord)	REAL
+!	r_value: values on the old grid (array)		REAL
+! ON OUTPUT:
+!	r_rside: right hand side (interpolated)		REAL
+! CALLS:
+!
+! COMMENTS:
+!	this one is plain bi-cubic spline interpolation
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_interpolinit
+! FUNCTION:
+!	initialize the interpolation (conservative interpolation)
+! SYNTAX:
+!	CALL slm_interpolate(grid)
+! ON INPUT:
+!	p_ogrid: grid handle to old grid (with data)	TYPE (grid_handle)
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!	we set a global value present in this module:
+!	r_conservation: conservation value		REAL
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	triang_ar
+! FUNCTION:
+!	calculate triangle area given by three coordinates
+! SYNTAX:
+!
+! ON INPUT:
+!
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_displace, slm_update, slm_upstream
+! COMMENTS:
+!
+! USES:
+!	FLASH_parameters, GRID_api, SLM_interpolation, ADV_wind, ADV_rhs
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!   1. original version		j. behrens	4/2002
+!   2. compliant to amatos 2.0      f. klaschka     8/2006
+!
+!*****************************************************************
+	MODULE SLM_advanced
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE GRID_api
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_astep
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_astep(p_ghand, p_param, p_time, r_modtime, i_size, &
+	                       r_coord, r_tracer, i_newsdepth)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                         :: p_param
+	  TYPE (sw_info), INTENT(inout)                             :: p_time
+	  REAL (KIND = GRID_SR), INTENT(in)                         :: r_modtime
+	  INTEGER (KIND = GRID_SI), INTENT(in)                      :: i_size
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_size), INTENT(out)     :: r_tracer
+	  INTEGER (KIND = GRID_SI), OPTIONAL, INTENT(in)            :: i_newsdepth
+	  
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE          :: r_newvl
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_alpha
+	  INTEGER (KIND = GRID_SI)                                  :: i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER            :: r_dualcoordinates
+	  INTEGER (KIND = GRID_SI), DIMENSION(:,:,:), POINTER       :: i_dualedges
+	  INTEGER (KIND = GRID_SI)                                  :: i_dual
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_dualalpha
+
+!---------- check size!
+
+	  IF(i_size <= 0) THEN
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'INFO [slm_astep]: Zero step size, returning to calling routine'
+	    RETURN
+	  END IF
+
+!---------- check newslevel (Not supported for Cell-integrated scheme due to dual)
+
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_error(c_error='[slm_astep]: no newslevel in Cell-Integrated Scheme supported')
+	  END IF
+	  IF(i_size /= p_ghand(i_timeplus)%i_nnumber) THEN
+	    CALL grid_error(c_error='[slm_astep]: incompatible array size')
+	  END IF	  
+
+!---------- allocate auxiliary arrays
+
+	  allocate(r_newvl(i_size), r_alpha(GRID_dimension,i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(38)
+	  END IF not_alloc
+
+!---------- create dual mesh
+
+	  CALL grid_createdual_donald(p_ghand(i_timeplus), i_dual, i_dualedges, &
+	                       r_dualcoordinates)
+
+!---------- allocate array for dual displacements
+
+	  allocate(r_dualalpha(GRID_dimension,i_dual), stat=i_alct)
+	  not_allocdual: IF(i_alct /= 0) THEN
+	    CALL grid_error(40)
+	  END IF not_allocdual
+
+!-SLM--------- calculate trajectory pieces (displacements)
+
+	  CALL stop_watch('start',3,p_time)
+	  CALL slm_adisplace(p_param, i_size, r_coord, r_alpha, &
+	  		    i_dual, r_dualcoordinates, r_dualalpha, r_time=r_modtime)
+	  CALL stop_watch('stop ',3,p_time)
+
+!-SLM--------- calculate right hand side
+
+	  CALL stop_watch('start',4,p_time)
+	  CALL slm_aupstream(p_ghand, i_size, r_coord, r_alpha, &
+	  		    i_dual, r_dualcoordinates, r_dualalpha, &
+	  		    i_dualedges, r_newvl)
+	  CALL stop_watch('stop ',4,p_time)
+
+!-SLM--------- calculate new grid values
+
+	  CALL stop_watch('start',5,p_time)
+	  CALL slm_aupdate(p_param, i_size, r_coord, r_newvl, r_tracer, r_time=r_modtime)
+	  CALL stop_watch('stop ',5,p_time)
+
+!---------- destroy dual mesh
+
+	  CALL grid_destroydual(i_dual, i_dualedges, r_dualcoordinates)
+
+!-SLM--------- put alpha values to u and v field entries
+
+	  r_alpha= -r_alpha
+	  CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	                    i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+
+!-SLM--------- deallocate work arrays
+
+	  deallocate(r_dualalpha, r_alpha, r_newvl)
+
+	  RETURN
+	  END SUBROUTINE slm_astep
+
+!*****************************************************************
+	  SUBROUTINE slm_adisplace(p_param, i_arlen, r_coord, r_alpha, &
+	                          i_darlen, r_dcoord, r_dalpha, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                      :: p_param
+	  INTEGER (KIND = GRID_SI), INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_alpha
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                           :: r_time
+	  INTEGER (KIND = GRID_SI), INTENT(in)                                  :: i_darlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in)  :: r_dcoord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(out) :: r_dalpha
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_fac, r_caf, &
+	    r_axy, r_xyc, r_sxy
+	  REAL (KIND = GRID_SR)                                                 :: r_dt0, r_dt1, &
+	    r_dt2, r_tim
+	  INTEGER (KIND = GRID_SI)                                              :: i_cnt1, i_cnt2
+
+!---------- set constants
+
+	  r_dt0= p_param%num%r_deltatime
+	  r_dt1= 0.5_GRID_SR* p_param%num%r_deltatime
+	  r_dt2= 1.5_GRID_SR* p_param%num%r_deltatime
+	  r_fac= 0.5_GRID_SR
+	  r_caf= 2.0_GRID_SR
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- calculate in an iteration process the displacements
+
+	  unknown_loop: DO i_cnt1=1,i_arlen
+	    r_axy= 0.0_GRID_SR
+
+	    iter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_coord(:,i_cnt1)- r_fac* r_axy
+	      r_sxy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	      r_axy= sphere_correct(r_coord(:,i_cnt1),r_sxy)
+	    END DO iter_loop
+
+	    r_alpha(:,i_cnt1)= r_axy
+	  END DO unknown_loop
+
+!---------- the same for the dual grid
+
+	  dual_loop: DO i_cnt1=1,i_darlen
+	    r_axy= 0.0_GRID_SR
+
+	    diter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_dcoord(:,i_cnt1)- r_fac* r_axy
+              r_sxy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+              r_axy= sphere_correct(r_dcoord(:,i_cnt1),r_sxy)
+	    END DO diter_loop
+
+	    r_dalpha(:,i_cnt1)= r_axy
+	  END DO dual_loop
+
+	  RETURN
+	  END SUBROUTINE slm_adisplace
+
+!*****************************************************************
+	  SUBROUTINE slm_aupdate(p_param, i_arlen, r_coord, r_rside, r_udate, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                                    :: p_param
+	  INTEGER (KIND = GRID_SI), INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_udate
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                          :: r_time
+	  INTEGER (KIND = GRID_SI)                                             :: i_cnt
+	  REAL (KIND = GRID_SR)                                                :: r_dt, r_tim
+
+!---------- in the linear advection case and with f90 this is just
+
+!	  r_udate= r_rside
+
+!---------- including a non-zero right hand side, we have
+
+	  r_dt= p_param%num%r_deltatime
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+	  main_loop: DO i_cnt=1, i_arlen
+	    r_udate(i_cnt)= r_rside(i_cnt)+ r_dt* slm_righthand(r_coord(:,i_cnt))
+	  END DO main_loop
+
+	  RETURN
+	  END SUBROUTINE slm_aupdate
+
+!*****************************************************************
+	  SUBROUTINE slm_aupstream(p_mesh, i_arlen, r_coord, r_alpha, &
+	                          i_darlen, r_dcoord, r_dalpha, &
+	                          i_dedge, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)                         :: p_mesh
+	  INTEGER (KIND = GRID_SI), INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_alpha
+	  INTEGER (KIND = GRID_SI), INTENT(in)                                  :: i_darlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in) :: r_dcoord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in) :: r_dalpha
+	  INTEGER (KIND = GRID_SI), DIMENSION(2,2*GRID_patchelements,i_arlen), INTENT(in) :: i_dedge
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)                :: r_rside
+	  INTEGER (KIND = GRID_SI)                                              :: i_alct, i_cnt, &
+             j_cnt, i_tnc, i_oarlen, i_fill, i_len, i_tmp
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_1, r_2, r_3
+	  REAL (KIND = GRID_SR)                                                 :: r_oarea, r_narea
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE                    :: r_aux1
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE                    :: r_aux2
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE                      :: r_conc
+	  REAL (KIND = GRID_SR)                                                 :: r_onethird= 1._GRID_SR/3._GRID_SR
+	  INTEGER (KIND = GRID_SI), DIMENSION(:,:), ALLOCATABLE                 :: i_enods
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimspherical,GRID_elementnodes) :: r_vertx
+	  REAL (KIND = GRID_SR)                                                 :: r_part, r_isarea
+	  REAL (KIND = GRID_SR), EXTERNAL                                       :: triatria_isectar
+	  REAL (KIND = GRID_SR)                                                 :: r_xmax, r_ymax, r_xmin, r_ymin
+	  REAL (KIND = GRID_SR)                                                 :: r_maxx, r_maxy, r_minx, r_miny
+	  REAL (KIND = GRID_SR)                                                 :: r_mass
+	  INTEGER (KIND = GRID_SI), DIMENSION(:), POINTER                       :: i_triang
+	  REAL (KIND = GRID_SR), DIMENSION(:), POINTER                          :: r_area
+	  INTEGER (KIND = GRID_SI), DIMENSION(1)                                :: i_valind
+	  
+	  	  
+!---------- allocate auxilliary arrays
+
+	  i_oarlen= p_mesh(i_time)%i_enumfine
+	  allocate(r_aux1(GRID_dimension,i_oarlen), &
+               r_aux2(1,i_oarlen), i_enods(GRID_elementnodes,i_oarlen), &
+               r_conc(i_oarlen), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(39)
+	  END IF not_alloc
+	  i_valind= (/ GRID_tracer /)
+
+!---------- get info from old grid to calculate mass elements
+
+	  CALL grid_getinfo(p_mesh(i_time), r_nodecoordinates= r_aux1, &
+	                    i_elementnodes=i_enods, i_arraypoint=i_valind, &
+	                    r_nodevalues= r_aux2, l_finelevel=.TRUE.)
+
+!---------- calculate concentration in elements
+
+	  conc_calc: DO i_cnt=1,i_oarlen
+	    r_conc(i_cnt)= r_onethird* (r_aux2(1,i_enods(1,i_cnt))+ &
+	                   r_aux2(1,i_enods(2,i_cnt))+ r_aux2(1,i_enods(3,i_cnt)))				   		
+	  END DO conc_calc
+	  
+!---------- now the main loop over the nodes of the new grid
+
+	  node_loop: DO i_cnt=1,i_arlen
+
+	    r_mass= 0.0_GRID_SR
+	    r_narea= 0.0_GRID_SR
+	    r_vertx= 0.0_GRID_SR
+
+!---------- the upstream dual element's center node
+
+	    r_vertx(:,1)= grid_kartgeo(r_coord(:,i_cnt)- r_alpha(:,i_cnt))
+
+!---------- now calculate the interference of the voronoi thing with elements from old mesh
+
+	    dual_ptch_loop: DO i_tnc= 1, 2*GRID_patchelements
+	    IF(i_dedge(1,i_tnc,i_cnt) == 0) THEN
+	      EXIT dual_ptch_loop
+	    ELSE
+
+!---------- nullify pointer arrays
+
+	      NULLIFY(i_triang,r_area)
+
+!---------- the upstream dual element's outer nodes
+
+	      r_vertx(:,2)= grid_kartgeo(r_dcoord(:,i_dedge(1,i_tnc,i_cnt))- r_dalpha(:,i_dedge(1,i_tnc,i_cnt)))
+	      r_vertx(:,3)= grid_kartgeo(r_dcoord(:,i_dedge(2,i_tnc,i_cnt))- r_dalpha(:,i_dedge(2,i_tnc,i_cnt)))
+
+!---------- calculate downstream area around primal node
+
+	      r_narea= r_narea+ triang_area(r_coord(:,i_cnt), &
+	                                    r_dcoord(:,i_dedge(1,i_tnc,i_cnt)), &
+	                                    r_dcoord(:,i_dedge(2,i_tnc,i_cnt)))
+
+!---------- calculate intersection
+
+	      CALL grid_polygridintersect(p_mesh(i_time),GRID_elementnodes,r_vertx,&
+	                                  i_len, i_triang, r_area, .TRUE.)
+									  
+	      DO j_cnt=1,i_len
+	        i_tmp= i_triang(j_cnt)
+	        r_mass= r_mass + r_area(j_cnt)* r_conc(i_tmp)
+	      END DO
+
+	      IF(ASSOCIATED(i_triang)) THEN
+	        DEALLOCATE(i_triang)
+	        NULLIFY(i_triang)
+	      END IF
+	      IF(ASSOCIATED(r_area)) THEN
+	        DEALLOCATE(r_area)
+	        NULLIFY(r_area)
+	      END IF
+	    END IF
+	    END DO dual_ptch_loop
+
+!---------- now calculate concentration
+        
+	    r_rside(i_cnt)= r_mass/r_narea
+		
+	  END DO node_loop
+
+!---------- deallocate auxilliary arrays
+
+	  deallocate(r_aux1, r_aux2, r_conc, i_enods)
+
+	  RETURN
+	  END SUBROUTINE slm_aupstream
+
+!*****************************************************************
+	  FUNCTION triang_area(r_coord1, r_coord2, r_coord3) RESULT (r_area)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord1, r_coord2, r_coord3
+	  REAL (KIND = GRID_SR)                                        :: r_area
+
+	  REAL (KIND = GRID_SR)                                        :: r_sum, r_hav, &
+	    r_a, r_b, r_c, r_s, r_t, r_e
+	  REAL (KIND = GRID_SR)                                        :: r_halfpi
+	  REAL (KIND = GRID_SR), PARAMETER                             :: r_degree=57.295779513082320876798 ! degrees per radian
+	  REAL (KIND = GRID_SR)                                        :: r_cosb1, r_cosb2, r_cosb3
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimspherical)          :: r_lam1, r_lam2, r_lam3
+
+!---------- initialization
+
+	  r_sum= 0.0_GRID_SR
+	  r_halfpi=GRID_PI*0.5_GRID_SR
+
+!---------- calculate spherical coordinates
+
+	  r_lam1= grid_kartgeo(r_coord1)
+	  r_lam2= grid_kartgeo(r_coord2)
+	  r_lam3= grid_kartgeo(r_coord3)
+
+!---------- calculate cosines
+
+	  r_cosb1= cos(r_lam1(2))
+	  r_cosb2= cos(r_lam2(2))
+	  r_cosb3= cos(r_lam3(2))
+	  
+!---------- for all three pairs do the excess calculation
+
+	  IF(r_lam1(1) /= r_lam2(1)) THEN
+	    r_hav= hav(r_lam2(2)- r_lam1(2))+ r_cosb1*r_cosb2*hav(r_lam2(1)- r_lam1(1))
+	    r_a  = 2.0_GRID_SR* asin(sqrt(r_hav))
+	    r_b  = r_halfpi- r_lam2(2)
+	    r_c  = r_halfpi- r_lam1(2)
+	    r_s  = 0.5_GRID_SR* (r_a+ r_b+ r_c);
+	    r_t  = tan(r_s* 0.5_GRID_SR)* tan((r_s-r_a)*0.5_GRID_SR)* tan((r_s-r_b)*0.5_GRID_SR)* tan((r_s-r_c)*0.5_GRID_SR)
+	    r_e  = abs(4.0_GRID_SR* atan(sqrt(abs(r_t))))* r_degree
+	    IF(r_lam1(1) > r_lam2(1)) r_e= -r_e
+	    
+	    r_sum= r_sum+ r_e
+	  END IF
+
+	  IF(r_lam2(1) /= r_lam3(1)) THEN
+	    r_hav= hav(r_lam3(2)- r_lam2(2))+ r_cosb2*r_cosb3*hav(r_lam3(1)- r_lam2(1))
+	    r_a  = 2.0_GRID_SR* asin(sqrt(r_hav))
+	    r_b  = r_halfpi- r_lam3(2)
+	    r_c  = r_halfpi- r_lam2(2)
+	    r_s  = 0.5_GRID_SR* (r_a+ r_b+ r_c);
+	    r_t  = tan(r_s* 0.5_GRID_SR)* tan((r_s-r_a)*0.5_GRID_SR)* tan((r_s-r_b)*0.5_GRID_SR)* tan((r_s-r_c)*0.5_GRID_SR)
+	    r_e  = abs(4.0_GRID_SR* atan(sqrt(abs(r_t))))* r_degree
+	    IF(r_lam2(1) > r_lam3(1)) r_e= -r_e
+	    
+	    r_sum= r_sum+ r_e
+	  END IF
+
+	  IF(r_lam3(1) /= r_lam1(1)) THEN
+	    r_hav= hav(r_lam1(2)- r_lam3(2))+ r_cosb3*r_cosb1*hav(r_lam1(1)- r_lam3(1))
+	    r_a  = 2.0_GRID_SR* asin(sqrt(r_hav))
+	    r_b  = r_halfpi- r_lam1(2)
+	    r_c  = r_halfpi- r_lam3(2)
+	    r_s  = 0.5_GRID_SR* (r_a+ r_b+ r_c);
+	    r_t  = tan(r_s* 0.5_GRID_SR)* tan((r_s-r_a)*0.5_GRID_SR)* tan((r_s-r_b)*0.5_GRID_SR)* tan((r_s-r_c)*0.5_GRID_SR)
+	    r_e  = abs(4.0_GRID_SR* atan(sqrt(abs(r_t))))* r_degree
+	    IF(r_lam3(1) > r_lam1(1)) r_e= -r_e
+	    
+	    r_sum= r_sum+ r_e
+	  END IF
+
+	  r_area= abs(r_sum)
+
+	  RETURN
+	  END FUNCTION triang_area
+
+!*****************************************************************
+	  FUNCTION hav(r_in) RESULT (r_out)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_in
+	  REAL (KIND = GRID_SR)                                        :: r_out
+
+!---------- calculate haversine function
+
+	  r_out= (1.0_GRID_SR - cos(r_in))* 0.5_GRID_SR
+
+	  RETURN
+	  END FUNCTION hav
+
+!*****************************************************************
+	  FUNCTION sphere_correct(r_coord, r_displ) RESULT (r_corct)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_coord, r_displ
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_corct
+
+	  REAL (KIND = GRID_SR)                            :: r_e, r_rat
+	  REAL (KIND = GRID_SR)                            :: r_c
+
+!---------- calculate Euklidean norm
+
+	  r_e  = eukl_norm(r_displ)
+	  r_rat= r_e/ GRID_RADIUS
+
+!---------- calculate correction
+
+	  r_c  = tan(r_rat)/r_rat
+	  r_corct= r_displ* r_c
+
+	  RETURN
+	  END FUNCTION sphere_correct
+
+!*****************************************************************
+	  FUNCTION eukl_norm(r_vec) RESULT(r_rst)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_vec
+	  REAL (KIND = GRID_SR)                            :: r_rst, r_tmp
+
+!---------- calculate vector crossproduct, 3D only
+
+	  r_tmp= dot_product(r_vec, r_vec)
+	  r_rst= sqrt(r_tmp)
+
+	  END FUNCTION eukl_norm
+
+	END MODULE SLM_advanced
+
diff --git a/flash2d/src/options-sphere/SLM_advanced.dual.f90 b/flash2d/src/options-sphere/SLM_advanced.dual.f90
new file mode 100644
index 0000000..a14432d
--- /dev/null
+++ b/flash2d/src/options-sphere/SLM_advanced.dual.f90
@@ -0,0 +1,667 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_advanced
+! FUNCTION:
+!	provide advanced semi-Lagrangian routines
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_step
+! FUNCTION:
+!	one step of the basic SLM algorithm
+! SYNTAX:
+!	CALL slm_step(int, real.arr, real.arr)
+! ON INPUT:
+!	...
+! ON OUTPUT:
+!	r_tracer: array with tracer values	real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_displace
+! FUNCTION:
+!	extrapolate the alpha, values for the displacements of the upstream
+!	points from the gridpoints
+! SYNTAX:
+!	CALL slm_displace(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_coord: real array of xy-coordinates		real
+! ON OUTPUT:
+!	r_alpha: displacement vectors to each point	real
+! CALLS:
+!	wind_field
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_update
+! FUNCTION:
+!	calculate the update to the velocity
+! SYNTAX:
+!	CALL slm_update(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_rside: array with right hand side values	real
+! ON OUTPUT:
+!	r_udate: array with new (updated) gid values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is trivial for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_upstream
+! FUNCTION:
+!	calculate right hand side of the equation (upstream values)
+! SYNTAX:
+!	CALL slm_upstream(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_alpha: displacement vectors to each point	real
+! ON OUTPUT:
+!	r_rside: array with right hand side values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is just interpolation for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	triang_area
+! FUNCTION:
+!	calculate triangle area given by three coordinates
+! SYNTAX:
+!
+! ON INPUT:
+!
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_displace, slm_update, slm_upstream
+! COMMENTS:
+!
+! USES:
+!	FLASH_parameters, GRID_api, ADV_wind, ADV_rhs
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!   1. original version		j. behrens	4/2002
+!   2. compliant to amatos 2.0      f. klaschka     8/2006
+!
+!*****************************************************************
+    MODULE SLM_advanced
+      USE FLASH_parameters
+      USE MISC_timing
+      USE GRID_api
+      USE ADV_wind
+      USE ADV_rhs
+      PRIVATE
+      PUBLIC  :: slm_astep
+      CONTAINS
+!*****************************************************************
+      SUBROUTINE slm_astep(p_ghand, p_param, p_time, r_modtime, i_size, &
+                           r_coord, r_tracer, i_newsdepth)
+
+!---------- local declarations
+
+      IMPLICIT NONE
+
+      TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+      TYPE (control_struct), INTENT(in)                         :: p_param
+      TYPE (sw_info), INTENT(inout)                             :: p_time
+      REAL (KIND = GRID_SR), INTENT(in)                         :: r_modtime
+      INTEGER (KIND = GRID_SI), INTENT(in)                      :: i_size
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size), INTENT(in) :: r_coord
+      REAL (KIND = GRID_SR), DIMENSION(i_size), INTENT(out)               :: r_tracer
+      INTEGER (KIND = GRID_SI), OPTIONAL, INTENT(in)            :: i_newsdepth
+  
+      REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE          :: r_newvl
+      REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_alpha
+      INTEGER (KIND = GRID_SI)                                  :: i_alct
+      REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER            :: r_dualcoordinates
+      INTEGER (KIND = GRID_SI), DIMENSION(:,:,:), POINTER       :: i_dualedges
+      INTEGER (KIND = GRID_SI)                                  :: i_dual
+      REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_dualalpha
+
+!---------- check size!
+
+	  IF(i_size <= 0) THEN
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'INFO [slm_astep]: Zero step size, returning to calling routine'
+	    RETURN
+	  END IF
+
+!---------- allocate auxiliary arrays
+
+	  allocate(r_newvl(i_size), r_alpha(GRID_dimension,i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(38)
+	  END IF not_alloc
+
+!---------- create dual mesh
+
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_createdual(p_ghand(i_timeplus), i_dual, i_dualedges, &
+	                         r_dualcoordinates, i_newsdepth= i_newsdepth, i_newlength=i_size)
+	    IF(i_alct /= i_size) CALL grid_error(c_error='[slm_astep]: incompatible new lengths...')
+	  ELSE
+	    CALL grid_createdual(p_ghand(i_timeplus), i_dual, i_dualedges, &
+	                         r_dualcoordinates)
+	  END IF
+
+!---------- allocate array for dual displacements
+
+	  allocate(r_dualalpha(GRID_dimension,i_dual), stat=i_alct)
+	  not_allocdual: IF(i_alct /= 0) THEN
+	    CALL grid_error(40)
+	  END IF not_allocdual
+
+!-SLM--------- calculate trajectory pieces (displacements)
+
+	  CALL stop_watch('start',3,p_time)
+	  CALL slm_adisplace(p_param, i_size, r_coord, r_alpha, &
+	  		    i_dual, r_dualcoordinates, r_dualalpha, r_time=r_modtime)
+	  CALL stop_watch('stop ',3,p_time)
+
+!-SLM--------- calculate right hand side
+
+	  CALL stop_watch('start',4,p_time)
+	  CALL slm_aupstream(p_ghand, i_size, r_coord, r_alpha, &
+	  		    i_dual, r_dualcoordinates, r_dualalpha, &
+	  		    i_dualedges, r_newvl)
+	  CALL stop_watch('stop ',4,p_time)
+
+!-SLM--------- calculate new grid values
+
+	  CALL stop_watch('start',5,p_time)
+	  CALL slm_aupdate(p_param, i_size, r_coord, r_newvl, r_tracer, r_time=r_modtime)
+	  CALL stop_watch('stop ',5,p_time)
+
+!---------- destroy dual mesh
+
+	  CALL grid_destroydual(i_dual, i_dualedges, r_dualcoordinates)
+
+!-SLM--------- put alpha values to u and v field entries
+
+	  r_alpha= -r_alpha
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_newsdepth=i_newsdepth, i_arraypoint=(/ GRID_ucomp, GRID_vcomp, GRID_wcomp /))
+	  ELSE
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_arraypoint=(/ GRID_ucomp, GRID_vcomp, GRID_wcomp /))
+	  END IF
+
+!-SLM--------- deallocate work arrays
+
+	  deallocate(r_dualalpha, r_alpha, r_newvl)
+
+	  RETURN
+	  END SUBROUTINE slm_astep
+
+!*****************************************************************
+	  SUBROUTINE slm_adisplace(p_param, i_arlen, r_coord, r_alpha, &
+	                          i_darlen, r_dcoord, r_dalpha, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                                     :: p_param
+	  INTEGER (KIND = GRID_SI), INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_alpha
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                           :: r_time
+	  INTEGER (KIND = GRID_SI), INTENT(in)                                  :: i_darlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in) :: r_dcoord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(out) :: r_dalpha
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_fac, r_caf, &
+	    r_axy, r_xyc, r_sxy
+	  REAL (KIND = GRID_SR)                                                 :: r_dt0, r_dt1, &
+	    r_dt2, r_tim
+	  INTEGER (KIND = GRID_SI)                                              :: i_cnt1, i_cnt2
+
+!---------- set constants
+
+	  r_dt0= p_param%num%r_deltatime
+	  r_dt1= 0.5_GRID_SR* p_param%num%r_deltatime
+	  r_dt2= 1.5_GRID_SR* p_param%num%r_deltatime
+	  r_fac= 0.5_GRID_SR
+	  r_caf= 2.0_GRID_SR
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- calculate in an iteration process the displacements
+
+	  unknown_loop: DO i_cnt1=1,i_arlen
+	    r_axy= 0.0_GRID_SR
+
+	    iter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_coord(:,i_cnt1)- r_fac* r_axy
+	      r_sxy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	      r_axy= sphere_correct(r_coord(:,i_cnt1),r_sxy)
+	    END DO iter_loop
+
+	    r_alpha(:,i_cnt1)= r_axy
+	  END DO unknown_loop
+
+!---------- the same for the dual grid
+
+	  dual_loop: DO i_cnt1=1,i_darlen
+	    r_axy= 0.0_GRID_SR
+
+	    diter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_dcoord(:,i_cnt1)- r_fac* r_axy
+	      r_sxy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	      r_axy= sphere_correct(r_dcoord(:,i_cnt1),r_sxy)
+	    END DO diter_loop
+
+	    r_dalpha(:,i_cnt1)= r_axy
+	  END DO dual_loop
+
+	  RETURN
+	  END SUBROUTINE slm_adisplace
+
+!*****************************************************************
+	  SUBROUTINE slm_aupdate(p_param, i_arlen, r_coord, r_rside, r_udate, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                                    :: p_param
+	  INTEGER (KIND = GRID_SI), INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_udate
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                          :: r_time
+	  INTEGER (KIND = GRID_SI)                                             :: i_cnt
+	  REAL (KIND = GRID_SR)                                                :: r_dt, r_tim
+
+!---------- in the linear advection case and with f90 this is just
+
+!	  r_udate= r_rside
+
+!---------- including a non-zero right hand side, we have
+
+	  r_dt= p_param%num%r_deltatime
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+	  main_loop: DO i_cnt=1, i_arlen
+	    r_udate(i_cnt)= r_rside(i_cnt)+ r_dt* slm_righthand(r_coord(:,i_cnt))
+	  END DO main_loop
+
+	  RETURN
+	  END SUBROUTINE slm_aupdate
+
+!*****************************************************************
+	  SUBROUTINE slm_aupstream(p_mesh, i_arlen, r_coord, r_alpha, &
+	                          i_darlen, r_dcoord, r_dalpha, &
+	                          i_dedge, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle),    DIMENSION(GRID_timesteps)                            :: p_mesh
+	  INTEGER (KIND = GRID_SI),                                       INTENT(in)  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen),       INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen),       INTENT(in)  :: r_alpha
+	  INTEGER (KIND = GRID_SI),                                       INTENT(in)  :: i_darlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen),      INTENT(in)  :: r_dcoord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen),      INTENT(in)  :: r_dalpha
+	  INTEGER (KIND = GRID_SI),DIMENSION(2,GRID_patchelements,i_arlen), INTENT(in)  :: i_dedge
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen),                      INTENT(out) :: r_rside
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                            :: r_fac
+	  REAL (KIND = GRID_SR), DIMENSION(:),                            ALLOCATABLE :: r_aux, r_daux, &
+                                                                                         r_uparea, r_dwarea
+	  INTEGER (KIND = GRID_SI)                                                    :: i_alct, i_cnt, j_cnt, &
+                                                                                         i_ind, i_dualplen
+	  REAL (KIND = GRID_SR)                                                       :: r_oarea, r_narea
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                            :: r_dual1, r_dual2, &
+                                                                                         r_updual1, r_updual2
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                            :: r_upcoord
+
+!---------- set factor (at which point of trajectory shall i interpolate)
+
+	  r_fac= 1.0_GRID_SR
+
+!---------- allocate auxilliary arrays
+
+	  allocate(r_aux(i_arlen), r_daux(i_darlen), &
+	           r_uparea(i_arlen), r_dwarea(i_arlen), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(39)
+	  END IF not_alloc
+
+!---------- interpolation of node values
+
+	  CALL slm_ainterpolate(p_mesh, r_fac, i_arlen, r_coord, &
+	                       r_alpha, r_aux)
+
+!---------- loop over nodes
+
+	  node_loop: DO i_cnt= 1, i_arlen
+	    r_oarea= 0.
+	    r_narea= 0.
+	    r_upcoord= r_coord(:,i_cnt)- r_alpha(:,i_cnt)
+
+!---------- first collect dual mesh nodes and do tangential projection
+
+	    clct_loop: DO j_cnt= 1, GRID_patchelements
+	      IF(i_dedge(1,j_cnt,i_cnt) == 0) THEN
+	        EXIT clct_loop
+	      ELSE
+	        r_dual1   = r_dcoord(:,i_dedge(1,j_cnt,i_cnt))
+	        r_dual2   = r_dcoord(:,i_dedge(2,j_cnt,i_cnt))
+	        r_updual1 = r_dcoord(:,i_dedge(1,j_cnt,i_cnt))- r_dalpha(:,i_dedge(1,j_cnt,i_cnt))
+	        r_updual2 = r_dcoord(:,i_dedge(2,j_cnt,i_cnt))- r_dalpha(:,i_dedge(2,j_cnt,i_cnt))
+
+!---------- the upstream dual element
+
+	        r_oarea= r_oarea+ triang_area(r_coord(:,i_cnt), r_dual1, r_dual2)
+
+!---------- the downstream dual element
+
+	        r_narea= r_narea+ triang_area(r_upcoord, r_updual1, r_updual2)
+
+	      END IF
+	    END DO clct_loop
+
+	    r_uparea(i_cnt)= r_oarea
+	    IF(r_narea /= 0._GRID_SR) THEN
+	      r_dwarea(i_cnt)= 1._GRID_SR/ r_narea
+	    ELSE
+	      r_dwarea(i_cnt)= 0._GRID_SR
+	    END IF
+	  END DO node_loop
+
+!---------- now calculate new values using a (nonexact) interpolation formula
+
+	  r_rside= r_aux* r_uparea* r_dwarea
+
+!---------- deallocate auxilliary arrays
+
+	  deallocate(r_aux, r_daux, r_uparea, r_dwarea)
+
+	  RETURN
+	  END SUBROUTINE slm_aupstream
+
+!*****************************************************************
+	  SUBROUTINE slm_ainterpolate(p_mesh, r_fac, i_arlen, &
+	                             r_coord, r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in)         :: r_fac
+	  INTEGER (KIND = GRID_SI), INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE                   :: r_upstr
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_nodevalues)                    :: r_tval
+	  INTEGER (KIND = GRID_SI), DIMENSION(GRID_elementnodes)               :: i_ttmp
+	  REAL (KIND = GRID_SR)                                                :: r_eps, r_max, r_min, r_tmp
+	  INTEGER (KIND = GRID_SI)                                             :: i_cnt, i_alct, i_val
+	  INTEGER (KIND = GRID_SI)                                             :: i_ind, i_tim, &
+	    j_cnt, i_out, i_stat
+
+!---------- initialize constant
+
+	  i_val= GRID_tracer
+	  r_eps= GRID_EPS
+	  i_tim= p_mesh(i_time)%i_timetag
+
+!---------- allocate work array
+
+	  ALLOCATE(r_upstr(GRID_dimension,i_arlen), stat=i_alct)
+	  not_allocated: IF(i_alct /= 0) THEN
+	    CALL grid_error(60)
+	  END IF not_allocated
+
+!---------- calculate upstream coordinates
+
+	  dim_loop: DO i_cnt=1, GRID_dimension
+	    r_upstr(i_cnt,:) = r_coord(i_cnt,:)- r_fac(i_cnt)* r_alpha(i_cnt,:)
+	  END DO dim_loop
+
+!---------- loop over nodes: find element containing upstream point
+
+	  node_loop: DO i_cnt=1, i_arlen
+
+!---------- check if upstream value is outside of the domain
+
+	    i_out= grid_domaincheck(p_mesh(i_time), r_upstr(:,i_cnt))
+
+!---------- take the intersection of the trajectory with the boundary as new upstream point
+
+	    out_domain: IF(i_out /= 0) then
+	       r_upstr(:,i_cnt)= grid_boundintersect(p_mesh(i_time), &
+	                        r_coord(:,i_cnt), r_upstr(:,i_cnt), i_info=i_stat)
+               no_intersect: IF(i_stat /= 0) THEN
+                  r_rside(i_cnt)= 0.0
+                  CYCLE node_loop
+               END IF no_intersect
+	    END IF out_domain
+
+!---------- interpolate
+
+	    r_tmp= grid_coordvalue(p_mesh(i_time), r_upstr(:,i_cnt), &
+	           i_interpolorder=GRID_loworder, i_valpoint=i_val, &
+               i_index=i_ind, i_domaincheck=0, l_relative=.FALSE., l_sfcorder=.FALSE.)
+
+
+	    index_valid: IF(i_ind > 0_GRID_SI) THEN
+
+!---------- get nodes of element surrounding r_upstr
+
+	       CALL grid_getiteminfo(i_ind, 'elmt', i_arrlen=GRID_elementnodes, i_nodes=i_ttmp)
+
+!---------- get values at nodes of element surrounding r_upstr, and obtain min/max
+
+               r_min= 0.0_GRID_SR; r_max= 0.0_GRID_SR
+               elmt_loop: DO j_cnt=1,GRID_elementnodes
+                  CALL grid_getiteminfo(i_ttmp(j_cnt), 'node', i_arrlen=GRID_nodevalues, &
+                                        r_values= r_tval, i_time=i_tim)
+                  r_min= MIN(r_min, r_tval(i_val))
+                  r_max= MAX(r_max, r_tval(i_val))	      
+               END DO elmt_loop
+
+!---------- clip value
+
+               IF(r_tmp > r_max) THEN
+                  r_tmp= r_max
+               ELSE IF(r_tmp < r_min) THEN
+                  r_tmp= r_min
+               END IF
+	    END IF index_valid
+
+!---------- set interpolation value
+
+	    r_rside(i_cnt)= r_tmp
+	 
+	    small_val: IF(abs(r_rside(i_cnt)) < r_eps) THEN
+               r_rside(i_cnt)= 0.0_GRID_SR
+	    END IF small_val
+
+	  END DO node_loop
+
+!---------- deallocate work array
+
+	  DEALLOCATE(r_upstr)
+
+	  RETURN
+	  END SUBROUTINE slm_ainterpolate
+
+!*****************************************************************
+	  FUNCTION triang_area(r_coord1, r_coord2, r_coord3) RESULT (r_area)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord1, r_coord2, r_coord3
+	  REAL (KIND = GRID_SR)                                        :: r_area
+
+	  REAL (KIND = GRID_SR)                                        :: r_sum, r_hav, &
+	    r_a, r_b, r_c, r_s, r_t, r_e
+	  REAL (KIND = GRID_SR)                                        :: r_halfpi
+	  REAL (KIND = GRID_SR), PARAMETER                             :: r_degree=57.295779513082320876798 ! degrees per radian
+	  REAL (KIND = GRID_SR)                                        :: r_cosb1, r_cosb2, r_cosb3
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimspherical)          :: r_lam1, r_lam2, r_lam3
+
+!---------- initialization
+
+	  r_sum= 0.0
+	  r_halfpi=GRID_PI*0.5
+
+!---------- calculate spherical coordinates
+
+	  r_lam1= grid_kartgeo(r_coord1)
+	  r_lam2= grid_kartgeo(r_coord2)
+	  r_lam3= grid_kartgeo(r_coord3)
+
+!---------- calculate cosines
+
+	  r_cosb1= cos(r_lam1(2))
+	  r_cosb2= cos(r_lam2(2))
+	  r_cosb3= cos(r_lam3(2))
+	  
+!---------- for all three pairs do the excess calculation
+
+	  IF(r_lam1(1) /= r_lam2(1)) THEN
+	    r_hav= hav(r_lam2(2)- r_lam1(2))+ r_cosb1*r_cosb2*hav(r_lam2(1)- r_lam1(1))
+	    r_a  = 2.0* asin(sqrt(r_hav))
+	    r_b  = r_halfpi- r_lam2(2)
+	    r_c  = r_halfpi- r_lam1(2)
+	    r_s  = 0.5* (r_a+ r_b+ r_c);
+	    r_t  = tan(r_s* 0.5)* tan((r_s-r_a)*0.5)* tan((r_s-r_b)*0.5)* tan((r_s-r_c)*0.5)
+	    r_e  = abs(4.0* atan(sqrt(abs(r_t))))* r_degree
+	    IF(r_lam1(1) > r_lam2(1)) r_e= -r_e
+	    
+	    r_sum= r_sum+ r_e
+	  END IF
+
+	  IF(r_lam2(1) /= r_lam3(1)) THEN
+	    r_hav= hav(r_lam3(2)- r_lam2(2))+ r_cosb2*r_cosb3*hav(r_lam3(1)- r_lam2(1))
+	    r_a  = 2.0* asin(sqrt(r_hav))
+	    r_b  = r_halfpi- r_lam3(2)
+	    r_c  = r_halfpi- r_lam2(2)
+	    r_s  = 0.5* (r_a+ r_b+ r_c);
+	    r_t  = tan(r_s* 0.5)* tan((r_s-r_a)*0.5)* tan((r_s-r_b)*0.5)* tan((r_s-r_c)*0.5)
+	    r_e  = abs(4.0* atan(sqrt(abs(r_t))))* r_degree
+	    IF(r_lam2(1) > r_lam3(1)) r_e= -r_e
+	    
+	    r_sum= r_sum+ r_e
+	  END IF
+
+	  IF(r_lam3(1) /= r_lam1(1)) THEN
+	    r_hav= hav(r_lam1(2)- r_lam3(2))+ r_cosb3*r_cosb1*hav(r_lam1(1)- r_lam3(1))
+	    r_a  = 2.0* asin(sqrt(r_hav))
+	    r_b  = r_halfpi- r_lam1(2)
+	    r_c  = r_halfpi- r_lam3(2)
+	    r_s  = 0.5* (r_a+ r_b+ r_c);
+	    r_t  = tan(r_s* 0.5)* tan((r_s-r_a)*0.5)* tan((r_s-r_b)*0.5)* tan((r_s-r_c)*0.5)
+	    r_e  = abs(4.0* atan(sqrt(abs(r_t))))* r_degree
+	    IF(r_lam3(1) > r_lam1(1)) r_e= -r_e
+	    
+	    r_sum= r_sum+ r_e
+	  END IF
+
+	  !r_area= abs(r_sum)
+          r_area= r_sum
+
+	  RETURN
+	  END FUNCTION triang_area
+
+!*****************************************************************
+	  FUNCTION hav(r_in) RESULT (r_out)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_in
+	  REAL (KIND = GRID_SR)                                        :: r_out
+
+!---------- calculate haversine function
+
+	  r_out= (1.0 - cos(r_in))* 0.5
+
+	  RETURN
+	  END FUNCTION hav
+
+!*****************************************************************
+	  FUNCTION sphere_correct(r_coord, r_displ) RESULT (r_corct)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_coord, r_displ
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_corct
+
+	  REAL (KIND = GRID_SR)                            :: r_e, r_rat
+	  REAL (KIND = GRID_SR)                            :: r_c
+
+!---------- calculate Euklidean norm
+
+	  r_e  = eukl_norm(r_displ)
+	  r_rat= r_e/ GRID_RADIUS
+
+!---------- calculate correction
+
+	  r_c  = tan(r_rat)/r_rat
+	  r_corct= r_displ* r_c
+
+	  RETURN
+	  END FUNCTION sphere_correct
+
+!*****************************************************************
+	  FUNCTION eukl_norm(r_vec) RESULT(r_rst)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_vec
+	  REAL (KIND = GRID_SR)                            :: r_rst, r_tmp
+
+!---------- calculate vector crossproduct, 3D only
+
+	  r_tmp= dot_product(r_vec, r_vec)
+	  r_rst= sqrt(r_tmp)
+
+	  END FUNCTION eukl_norm
+
+	END MODULE SLM_advanced
diff --git a/flash2d/src/options-sphere/SLM_advanced.dual2 b/flash2d/src/options-sphere/SLM_advanced.dual2
new file mode 100644
index 0000000..052b710
--- /dev/null
+++ b/flash2d/src/options-sphere/SLM_advanced.dual2
@@ -0,0 +1,625 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_advanced
+! FUNCTION:
+!	provide advanced semi-Lagrangian routines
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_step
+! FUNCTION:
+!	one step of the basic SLM algorithm
+! SYNTAX:
+!	CALL slm_step(int, real.arr, real.arr)
+! ON INPUT:
+!	...
+! ON OUTPUT:
+!	r_tracer: array with tracer values	real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_displace
+! FUNCTION:
+!	extrapolate the alpha, values for the displacements of the upstream
+!	points from the gridpoints
+! SYNTAX:
+!	CALL slm_displace(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_coord: real array of xy-coordinates		real
+! ON OUTPUT:
+!	r_alpha: displacement vectors to each point	real
+! CALLS:
+!	wind_field
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_update
+! FUNCTION:
+!	calculate the update to the velocity
+! SYNTAX:
+!	CALL slm_update(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_rside: array with right hand side values	real
+! ON OUTPUT:
+!	r_udate: array with new (updated) gid values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is trivial for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_upstream
+! FUNCTION:
+!	calculate right hand side of the equation (upstream values)
+! SYNTAX:
+!	CALL slm_upstream(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_alpha: displacement vectors to each point	real
+! ON OUTPUT:
+!	r_rside: array with right hand side values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is just interpolation for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_interpolate
+! FUNCTION:
+!	do the interpolation
+! SYNTAX:
+!	CALL slm_interpolate(grid, int, real, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	p_ogrid: grid handle to old grid (with data)	TYPE (grid_handle)
+!	r_fac:   factor at which point to interpolate	REAL
+!	i_arlen: array length for the following arrays	INTEGER
+!	r_coord: coordinate array (new grid)		REAL
+!	r_alpha: displacement array (corr. to r_coord)	REAL
+!	r_value: values on the old grid (array)		REAL
+! ON OUTPUT:
+!	r_rside: right hand side (interpolated)		REAL
+! CALLS:
+!
+! COMMENTS:
+!	this one is plain bi-cubic spline interpolation
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_interpolinit
+! FUNCTION:
+!	initialize the interpolation (conservative interpolation)
+! SYNTAX:
+!	CALL slm_interpolate(grid)
+! ON INPUT:
+!	p_ogrid: grid handle to old grid (with data)	TYPE (grid_handle)
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!	we set a global value present in this module:
+!	r_conservation: conservation value		REAL
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	triang_ar
+! FUNCTION:
+!	calculate triangle area given by three coordinates
+! SYNTAX:
+!
+! ON INPUT:
+!
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_displace, slm_update, slm_upstream
+! COMMENTS:
+!
+! USES:
+!	FLASH_parameters, GRID_api, SLM_interpolation, ADV_wind, ADV_rhs
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	4/2002
+!       2. compliant to amatos 2.0      f. klaschka     8/2006
+!
+!*****************************************************************
+	MODULE SLM_advanced
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE GRID_api
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_astep
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_astep(p_ghand, p_param, p_time, r_modtime, i_size, &
+	                       r_coord, r_tracer, i_newsdepth)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                         :: p_param
+	  TYPE (sw_info), INTENT(inout)                             :: p_time
+	  REAL (KIND = GRID_SR), INTENT(in)                                          :: r_modtime
+	  INTEGER, INTENT(in)                                       :: i_size
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size), INTENT(in)        :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_size), INTENT(out)                      :: r_tracer
+	  INTEGER, OPTIONAL, INTENT(in)                             :: i_newsdepth
+	  
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE      :: r_newvl
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_alpha
+	  INTEGER                              :: i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER        :: r_dualcoordinates
+	  INTEGER, DIMENSION(:,:,:), POINTER   :: i_dualedges
+	  INTEGER                              :: i_dual
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_dualalpha
+	  REAL (KIND = GRID_SR), DIMENSION(:,:,:), ALLOCATABLE  :: r_newdualalpha
+	  REAL (KIND = GRID_SR), DIMENSION(:,:,:), POINTER      :: r_newdualcoor
+
+!---------- check size!
+
+	  IF(i_size <= 0) THEN
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'INFO [slm_step]: Zero step size, returning to calling routine'
+	    RETURN
+	  END IF
+
+!---------- allocate auxiliary arrays
+
+	  nullify(r_newdualcoor)
+	  allocate(r_newvl(i_size), r_alpha(GRID_dimension,i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(38)
+	  END IF not_alloc
+
+!---------- create dual mesh
+
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_createdual(p_ghand(i_timeplus), i_dual, i_dualedges, &
+	                         r_dualcoordinates, i_newsdepth= i_newsdepth, i_newlength=i_size)
+	    IF(i_alct /= i_size) CALL grid_error(c_error='[slm_step]: incompatible new lengths...')
+	  ELSE
+	    CALL grid_createdual(p_ghand(i_timeplus), i_dual, i_dualedges, &
+	                         r_dualcoordinates)
+	  END IF
+
+!---------- calculate dual triangle positions
+
+	  CALL create_newdualpoints(i_size, r_coord, &
+	                            i_dual, r_dualcoordinates, i_dualedges, &
+	                            r_newdualcoor)
+
+!---------- allocate arrays for dual displacements
+
+	  allocate(r_newdualalpha(GRID_dimension,GRID_patchelements,i_size), &
+	           r_dualalpha(GRID_dimension,i_dual), stat=i_alct)
+	  not_allocdual: IF(i_alct /= 0) THEN
+	    CALL grid_error(40)
+	  END IF not_allocdual
+
+!-SLM--------- calculate trajectory pieces (displacements)
+
+	  CALL stop_watch('start',3,p_time)
+	  CALL slm_adisplace(p_param, i_size, r_coord, r_alpha, &
+	                     i_dual, r_dualcoordinates, r_dualalpha, &
+	                     r_newdualcoor, r_newdualalpha, r_time=r_modtime)
+	  CALL stop_watch('stop ',3,p_time)
+
+!-SLM--------- calculate right hand side
+
+	  CALL stop_watch('start',4,p_time)
+	  CALL slm_aupstream(p_ghand, i_size, r_coord, r_alpha, &
+	  		    i_dual, r_dualcoordinates, r_dualalpha, &
+	  		    i_dualedges, r_newdualcoor, r_newdualalpha, &
+	  		    r_newvl)
+	  CALL stop_watch('stop ',4,p_time)
+
+!-SLM--------- calculate new grid values
+
+	  CALL stop_watch('start',5,p_time)
+	  CALL slm_aupdate(p_param, i_size, r_coord, r_newvl, r_tracer, r_time=r_modtime)
+	  CALL stop_watch('stop ',5,p_time)
+
+!---------- destroy dual mesh
+
+	  CALL grid_destroydual(i_dual, i_dualedges, r_dualcoordinates)
+
+!-SLM--------- put alpha values to u and v field entries
+
+	  r_alpha= -r_alpha
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_newsdepth=i_newsdepth, i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  ELSE
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  END IF
+
+!-SLM--------- deallocate work arrays
+
+	  deallocate(r_dualalpha, r_alpha, r_newvl, r_newdualcoor, r_newdualalpha)
+	  nullify(r_newdualcoor)
+
+	  RETURN
+	  END SUBROUTINE slm_astep
+
+!*****************************************************************
+	  SUBROUTINE slm_adisplace(p_param, i_arlen, r_coord, r_alpha, &
+	                          i_darlen, r_dcoord, r_dalpha, &
+				  r_ndcoord, r_ndalpha, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                      :: p_param
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_alpha
+	  INTEGER, INTENT(in)                                  :: i_darlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in)  :: r_dcoord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(out) :: r_dalpha
+	  REAL (KIND = GRID_SR), DIMENSION(:,:,:), POINTER                      :: r_ndcoord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,GRID_patchelements,i_arlen), INTENT(out) :: r_ndalpha
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                           :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_fac, r_caf, &
+	    r_axy, r_xyc
+	  REAL (KIND = GRID_SR)                                                 :: r_dt0, r_dt1, &
+	    r_dt2, r_tim
+	  INTEGER                                              :: i_cnt1, i_cnt2, i_cnt3
+
+!---------- set constants
+
+	  r_dt0= p_param%phy%r_deltatime
+	  r_dt1= 0.5_GRID_SR* p_param%phy%r_deltatime
+	  r_dt2= 1.5_GRID_SR* p_param%phy%r_deltatime
+	  r_fac= 0.5_GRID_SR
+	  r_caf= 2.0_GRID_SR
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- calculate in an iteration process the displacements
+
+	  unknown_loop: DO i_cnt1=1,i_arlen
+	    r_axy= 0.0_GRID_SR
+
+	    iter_loop: DO i_cnt2=1, p_param%phy%i_adviterations
+	      r_xyc= r_coord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO iter_loop
+
+	    r_alpha(:,i_cnt1)= r_axy
+
+!---------- the same for the dual triangle positions
+
+	    ndual_loop: DO i_cnt3=1,GRID_patchelements
+	      r_axy= 0.0_GRID_SR
+
+	      nditer_loop: DO i_cnt2=1, p_param%phy%i_adviterations
+	        r_xyc= r_ndcoord(:,i_cnt3,i_cnt1)- r_fac* r_axy
+	        r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	      END DO nditer_loop
+
+	      r_ndalpha(:,i_cnt3,i_cnt1)= r_axy
+	    END DO ndual_loop
+	  END DO unknown_loop
+
+!---------- the same for the dual nodes
+
+	  dual_loop: DO i_cnt1=1,i_darlen
+	    r_axy= 0.0_GRID_SR
+
+	    diter_loop: DO i_cnt2=1, p_param%phy%i_adviterations
+	      r_xyc= r_dcoord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO diter_loop
+
+	    r_dalpha(:,i_cnt1)= r_axy
+	  END DO dual_loop
+
+	  RETURN
+	  END SUBROUTINE slm_adisplace
+
+!*****************************************************************
+	  SUBROUTINE slm_aupdate(p_param, i_arlen, r_coord, r_rside, r_udate, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                   :: p_param
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_udate
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                          :: r_time
+	  INTEGER                                             :: i_cnt
+	  REAL (KIND = GRID_SR)                                                :: r_dt, r_tim
+
+!---------- in the linear advection case and with f90 this is just
+
+!	  r_udate= r_rside
+
+!---------- including a non-zero right hand side, we have
+
+	  r_dt= p_param%phy%r_deltatime
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+	  main_loop: DO i_cnt=1, i_arlen
+	    r_udate(i_cnt)= r_rside(i_cnt)+ r_dt* slm_righthand(r_coord(:,i_cnt))
+	  END DO main_loop
+
+	  RETURN
+	  END SUBROUTINE slm_aupdate
+
+!*****************************************************************
+	  SUBROUTINE slm_aupstream(p_mesh, i_arlen, r_coord, r_alpha, &
+	                             i_darlen, r_dcoord, r_dalpha, &
+	                             i_dedge, r_ndcoor, r_ndalpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)        :: p_mesh
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_alpha
+	  INTEGER, INTENT(in)                                  :: i_darlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in) :: r_dcoord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in) :: r_dalpha
+	  INTEGER, DIMENSION(2,GRID_patchelements,i_arlen), INTENT(in) :: i_dedge
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,GRID_patchelements,i_arlen), INTENT(in) :: r_ndcoor
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,GRID_patchelements,i_arlen), INTENT(in) :: r_ndalpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)                :: r_rside
+	  INTEGER                                              :: i_cnt, i_tnc, &
+	    i_out, i_stat, j_cnt, i_ind, i_dualplen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_1
+	  REAL (KIND = GRID_SR)                                                 :: r_oarea, r_narea
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,GRID_elementnodes)    :: r_vertx
+	  REAL (KIND = GRID_SR)                                                 :: r_val, r_tmp
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,2*GRID_patchelements) :: r_dual3, r_updual3
+	  REAL (KIND = GRID_SR), DIMENSION(2,2*GRID_patchelements)              :: r_dual2, r_updual2
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_foot, r_upfoot
+	  REAL (KIND = GRID_SR), DIMENSION(2)                                   :: r_orig
+
+	  i_stat= 0
+	  r_orig=(/0.0, 0.0/)
+
+!---------- main loop over the nodes of the new grid
+
+	  node_loop: DO i_cnt=1,i_arlen
+
+	    r_val= 0.0
+	    r_narea= 0.0
+	    r_vertx= 0.0
+
+!---------- the upstream dual element's center node
+
+	    r_vertx(1,1)= r_coord(1,i_cnt)- r_alpha(1,i_cnt)
+	    r_vertx(2,1)= r_coord(2,i_cnt)- r_alpha(2,i_cnt)
+
+	    r_foot = r_coord(:,i_cnt)
+	    r_upfoot= r_coord(:,i_cnt)- r_alpha(:,i_cnt)
+
+!---------- first collect dual mesh nodes and do tangential projection
+
+	    clct_loop: DO j_cnt= 1, GRID_patchelements
+	      IF(i_dedge(1,j_cnt,i_cnt) == 0) THEN
+	        EXIT clct_loop
+	      ELSE
+	        i_ind= (j_cnt-1)*2 + 1
+	        r_dual3(:,i_ind)  = r_dcoord(:,i_dedge(1,j_cnt,i_cnt))
+	        r_dual3(:,i_ind+1)= r_dcoord(:,i_dedge(2,j_cnt,i_cnt))
+	        r_updual3(:,i_ind)  = r_dcoord(:,i_dedge(1,j_cnt,i_cnt))- r_dalpha(:,i_dedge(1,j_cnt,i_cnt))
+	        r_updual3(:,i_ind+1)= r_dcoord(:,i_dedge(2,j_cnt,i_cnt))- r_dalpha(:,i_dedge(2,j_cnt,i_cnt))
+	      END IF
+	    END DO clct_loop
+	    i_dualplen= j_cnt-1
+
+!---------- projection to corresponding tangential planes
+
+	    CALL grid_tangentproject(r_foot,i_dualplen,r_dual3,r_dual2)
+	    CALL grid_tangentproject(r_upfoot,i_dualplen,r_updual3,r_updual2)
+
+!---------- now calculate the interference of the voronoi thing with elements from old mesh
+
+	    ptch_loop: DO j_cnt= 1, i_dualplen
+	      i_ind= (j_cnt-1)*2 + 1
+
+!---------- calculate area
+
+	      r_narea= r_narea+ triang_ar2(r_orig, r_updual2(:,i_ind), r_updual2(:,i_ind+1))
+
+!---------- calculate area of upstream dual triangle
+
+	      r_oarea= triang_ar2(r_orig, r_dual2(:,i_ind), r_dual2(:,i_ind+1))
+
+!---------- check if upstream value is outside of the domain
+
+	      r_1= r_ndcoor(:,j_cnt,i_cnt)- r_ndalpha(:,j_cnt,i_cnt)
+	      i_out= grid_domaincheck(p_mesh(i_time), r_1)
+
+!---------- take the intersection of the trajectory with the boundary as new upstream point
+
+	      out_domain: IF(i_out /= 0) then
+	        r_1= grid_boundintersect(p_mesh(i_time), &
+	             r_ndcoor(:,j_cnt,i_cnt), r_1, i_info=i_stat)
+	      END IF out_domain
+
+!---------- interpolate
+
+              no_intersect: IF(i_stat /= 0) THEN
+                r_tmp= 0.0_GRID_SR
+	      ELSE no_intersect
+	        r_tmp= grid_coordvalue(p_mesh(i_time), r_1, i_interpolorder=GRID_highorder)
+	        IF(abs(r_tmp) < GRID_EPS) THEN
+		  r_tmp= 0.0_GRID_SR
+		END IF
+              END IF no_intersect
+
+!---------- interpolate upstream concentration and calculate integral with quadrature rule
+
+	      r_val= r_val+ r_oarea* r_tmp
+
+	    END DO ptch_loop
+
+!---------- now calculate concentration
+
+	    r_rside(i_cnt)= r_val/r_narea
+
+	  END DO node_loop
+
+	  RETURN
+	  END SUBROUTINE slm_aupstream
+
+!*****************************************************************
+	  FUNCTION triang_ar(r_coord1, r_coord2, r_coord3) RESULT (r_area)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord1, r_coord2, r_coord3
+	  REAL (KIND = GRID_SR)                                        :: r_area
+	  REAL (KIND = GRID_SR)                                        :: r_c
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_a, r_b
+
+!---------- calculate vector components
+
+	  r_a= r_coord2- r_coord1
+	  r_b= r_coord3- r_coord1
+
+!---------- calculate components (a,b,c) of cross product vector
+
+	  r_c= (r_a(1)* r_b(2)- r_a(2)* r_b(1))
+
+!---------- calculate area
+
+	  r_area= abs(r_c)* 0.5_GRID_SR
+
+	  RETURN
+	  END FUNCTION triang_ar
+!*****************************************************************
+	  FUNCTION triang_ar2(r_coord1, r_coord2, r_coord3) RESULT (r_area)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(2), INTENT(in) :: r_coord1, r_coord2, r_coord3
+	  REAL (KIND = GRID_SR)  			 :: r_area
+	  REAL (KIND = GRID_SR)  			 :: r_c
+	  REAL (KIND = GRID_SR), DIMENSION(2)		 :: r_a, r_b
+
+!---------- calculate vector components
+
+	  r_a= r_coord2- r_coord1
+	  r_b= r_coord3- r_coord1
+
+!---------- calculate components (a,b,c) of cross product vector
+
+	  r_c= (r_a(1)* r_b(2)- r_a(2)* r_b(1))
+
+!---------- calculate area
+
+	  r_area= abs(r_c)* 0.5
+
+	  RETURN
+	  END FUNCTION triang_ar2
+
+!*****************************************************************
+	  SUBROUTINE create_newdualpoints(i_arlen, r_coord, &
+	                                  i_darlen, r_dcoord, i_dedge, r_ndcoor)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  INTEGER, INTENT(in)                                  :: i_darlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in) :: r_dcoord
+	  INTEGER, DIMENSION(2,GRID_patchelements,i_arlen), INTENT(in) :: i_dedge
+	  REAL (KIND = GRID_SR), DIMENSION(:,:,:), POINTER                      :: r_ndcoor
+
+	  REAL (KIND = GRID_SR)                                                 :: r_onethird=1./3.
+	  INTEGER                                              :: i_alct, i_cnt, i_tnc
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,GRID_elementnodes)    :: r_vertx
+
+!---------- allocate array for dual coordinates
+
+	  allocate(r_ndcoor(GRID_dimension,GRID_patchelements,i_arlen), stat=i_alct)
+	  not_allocdual: IF(i_alct /= 0) THEN
+	    CALL grid_error(c_error='[create_newdualpoints]: dual points array not allocated!')
+	  END IF not_allocdual
+
+!---------- main loop over the nodes of the new grid
+
+	  node_loop: DO i_cnt=1,i_arlen
+
+	    r_vertx= 0.0_GRID_SR
+
+!---------- the upstream dual element's center node
+
+	    r_vertx(:,1)= r_coord(:,i_cnt)
+
+!---------- now calculate the interference of the voronoi thing with elements from old mesh
+
+	    ptch_loop: DO i_tnc= 1, GRID_patchelements
+	    IF(i_dedge(1,i_tnc,i_cnt) == 0) THEN
+	      EXIT ptch_loop
+	    ELSE
+
+!---------- the upstream dual element's outer nodes
+
+	      r_vertx(:,2)= r_dcoord(:,i_dedge(1,i_tnc,i_cnt))
+	      r_vertx(:,3)= r_dcoord(:,i_dedge(2,i_tnc,i_cnt))
+
+!---------- calculate dual triangles center point
+
+	      r_ndcoor(:, i_tnc, i_cnt)= r_onethird* &
+	                                (r_vertx(:,1)+ r_vertx(:,2)+ r_vertx(:,3))
+	    END IF
+	    END DO ptch_loop
+	  END DO node_loop
+
+	  RETURN
+	  END SUBROUTINE create_newdualpoints
+
+	END MODULE SLM_advanced
diff --git a/flash2d/src/options-sphere/SLM_advanced.dual2s b/flash2d/src/options-sphere/SLM_advanced.dual2s
new file mode 100644
index 0000000..93e2d2c
--- /dev/null
+++ b/flash2d/src/options-sphere/SLM_advanced.dual2s
@@ -0,0 +1,662 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_advanced
+! FUNCTION:
+!	provide advanced semi-Lagrangian routines
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_step
+! FUNCTION:
+!	one step of the basic SLM algorithm
+! SYNTAX:
+!	CALL slm_step(int, real.arr, real.arr)
+! ON INPUT:
+!	...
+! ON OUTPUT:
+!	r_tracer: array with tracer values	real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_displace
+! FUNCTION:
+!	extrapolate the alpha, values for the displacements of the upstream
+!	points from the gridpoints
+! SYNTAX:
+!	CALL slm_displace(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_coord: real array of xy-coordinates		real
+! ON OUTPUT:
+!	r_alpha: displacement vectors to each point	real
+! CALLS:
+!	wind_field
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_update
+! FUNCTION:
+!	calculate the update to the velocity
+! SYNTAX:
+!	CALL slm_update(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_rside: array with right hand side values	real
+! ON OUTPUT:
+!	r_udate: array with new (updated) gid values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is trivial for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_upstream
+! FUNCTION:
+!	calculate right hand side of the equation (upstream values)
+! SYNTAX:
+!	CALL slm_upstream(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_alpha: displacement vectors to each point	real
+! ON OUTPUT:
+!	r_rside: array with right hand side values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is just interpolation for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_interpolate
+! FUNCTION:
+!	do the interpolation
+! SYNTAX:
+!	CALL slm_interpolate(grid, int, real, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	p_ogrid: grid handle to old grid (with data)	TYPE (grid_handle)
+!	r_fac:   factor at which point to interpolate	REAL
+!	i_arlen: array length for the following arrays	INTEGER
+!	r_coord: coordinate array (new grid)		REAL
+!	r_alpha: displacement array (corr. to r_coord)	REAL
+!	r_value: values on the old grid (array)		REAL
+! ON OUTPUT:
+!	r_rside: right hand side (interpolated)		REAL
+! CALLS:
+!
+! COMMENTS:
+!	this one is plain bi-cubic spline interpolation
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_interpolinit
+! FUNCTION:
+!	initialize the interpolation (conservative interpolation)
+! SYNTAX:
+!	CALL slm_interpolate(grid)
+! ON INPUT:
+!	p_ogrid: grid handle to old grid (with data)	TYPE (grid_handle)
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!	we set a global value present in this module:
+!	r_conservation: conservation value		REAL
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	triang_ar
+! FUNCTION:
+!	calculate triangle area given by three coordinates
+! SYNTAX:
+!
+! ON INPUT:
+!
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_displace, slm_update, slm_upstream
+! COMMENTS:
+!
+! USES:
+!	FLASH_parameters, GRID_api, SLM_interpolation, ADV_wind, ADV_rhs
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	4/2002
+!       2. compliant to amatos 2.0      f. klaschka     8/2006
+!
+!*****************************************************************
+	MODULE SLM_advanced
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE GRID_api
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_astep
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_astep(p_ghand, p_param, p_time, r_modtime, i_size, &
+	                       r_coord, r_tracer, i_newsdepth)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                         :: p_param
+	  TYPE (sw_info), INTENT(inout)                             :: p_time
+	  REAL (KIND = GRID_SR), INTENT(in)                                          :: r_modtime
+	  INTEGER, INTENT(in)                                       :: i_size
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size), INTENT(in)        :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_size), INTENT(out)                      :: r_tracer
+	  INTEGER, OPTIONAL, INTENT(in)                             :: i_newsdepth
+	  
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE      :: r_newvl
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_alpha
+	  INTEGER                              :: i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER        :: r_dualcoordinates
+	  INTEGER, DIMENSION(:,:,:), POINTER   :: i_dualedges
+	  INTEGER                              :: i_dual
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_dualalpha
+	  REAL (KIND = GRID_SR), DIMENSION(:,:,:), ALLOCATABLE  :: r_newdualalpha
+	  REAL (KIND = GRID_SR), DIMENSION(:,:,:), POINTER      :: r_newdualcoor
+
+!---------- check size!
+
+	  IF(i_size <= 0) THEN
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'INFO [slm_step]: Zero step size, returning to calling routine'
+	    RETURN
+	  END IF
+
+!---------- allocate auxiliary arrays
+
+	  nullify(r_newdualcoor)
+	  allocate(r_newvl(i_size), r_alpha(GRID_dimension,i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(38)
+	  END IF not_alloc
+
+!---------- create dual mesh
+
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_createdual(p_ghand(i_timeplus), i_dual, i_dualedges, &
+	                         r_dualcoordinates, i_newsdepth= i_newsdepth, i_newlength=i_size)
+	    IF(i_alct /= i_size) CALL grid_error(c_error='[slm_step]: incompatible new lengths...')
+	  ELSE
+	    CALL grid_createdual(p_ghand(i_timeplus), i_dual, i_dualedges, &
+	                         r_dualcoordinates)
+	  END IF
+
+!---------- calculate dual triangle positions
+
+	  CALL create_newdualpoints(i_size, r_coord, &
+	                            i_dual, r_dualcoordinates, i_dualedges, &
+	                            r_newdualcoor)
+
+!---------- allocate arrays for dual displacements
+
+	  allocate(r_newdualalpha(GRID_dimension,GRID_patchelements,i_size), &
+	           r_dualalpha(GRID_dimension,i_dual), stat=i_alct)
+	  not_allocdual: IF(i_alct /= 0) THEN
+	    CALL grid_error(40)
+	  END IF not_allocdual
+
+!-SLM--------- calculate trajectory pieces (displacements)
+
+	  CALL stop_watch('start',3,p_time)
+	  CALL slm_adisplace(p_param, i_size, r_coord, r_alpha, &
+	                     i_dual, r_dualcoordinates, r_dualalpha, &
+	                     r_newdualcoor, r_newdualalpha, r_time=r_modtime)
+	  CALL stop_watch('stop ',3,p_time)
+
+!-SLM--------- calculate right hand side
+
+	  CALL stop_watch('start',4,p_time)
+	  CALL slm_aupstream(p_ghand, i_size, r_coord, r_alpha, &
+	  		    i_dual, r_dualcoordinates, r_dualalpha, &
+	  		    i_dualedges, r_newdualcoor, r_newdualalpha, &
+	  		    r_newvl)
+	  CALL stop_watch('stop ',4,p_time)
+
+!-SLM--------- calculate new grid values
+
+	  CALL stop_watch('start',5,p_time)
+	  CALL slm_aupdate(p_param, i_size, r_coord, r_newvl, r_tracer, r_time=r_modtime)
+	  CALL stop_watch('stop ',5,p_time)
+
+!---------- destroy dual mesh
+
+	  CALL grid_destroydual(i_dual, i_dualedges, r_dualcoordinates)
+
+!-SLM--------- put alpha values to u and v field entries
+
+	  r_alpha= -r_alpha
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_newsdepth=i_newsdepth, i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  ELSE
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  END IF
+
+!-SLM--------- deallocate work arrays
+
+	  deallocate(r_dualalpha, r_alpha, r_newvl, r_newdualcoor, r_newdualalpha)
+	  nullify(r_newdualcoor)
+
+	  RETURN
+	  END SUBROUTINE slm_astep
+
+!*****************************************************************
+	  SUBROUTINE slm_adisplace(p_param, i_arlen, r_coord, r_alpha, &
+	                          i_darlen, r_dcoord, r_dalpha, &
+				  r_ndcoord, r_ndalpha, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                      :: p_param
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_alpha
+	  INTEGER, INTENT(in)                                  :: i_darlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in)  :: r_dcoord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(out) :: r_dalpha
+	  REAL (KIND = GRID_SR), DIMENSION(:,:,:), POINTER                      :: r_ndcoord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,GRID_patchelements,i_arlen), INTENT(out) :: r_ndalpha
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                           :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_fac, r_caf, &
+	    r_axy, r_xyc
+	  REAL (KIND = GRID_SR)                                                 :: r_dt0, r_dt1, &
+	    r_dt2, r_tim
+	  INTEGER                                              :: i_cnt1, i_cnt2, i_cnt3
+
+!---------- set constants
+
+	  r_dt0= p_param%phy%r_deltatime
+	  r_dt1= 0.5_GRID_SR* p_param%phy%r_deltatime
+	  r_dt2= 1.5_GRID_SR* p_param%phy%r_deltatime
+	  r_fac= 0.5_GRID_SR
+	  r_caf= 2.0_GRID_SR
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- calculate in an iteration process the displacements
+
+	  unknown_loop: DO i_cnt1=1,i_arlen
+	    r_axy= 0.0_GRID_SR
+
+	    iter_loop: DO i_cnt2=1, p_param%phy%i_adviterations
+	      r_xyc= r_coord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO iter_loop
+
+	    r_alpha(:,i_cnt1)= r_axy
+
+!---------- the same for the dual triangle positions
+
+	    ndual_loop: DO i_cnt3=1,GRID_patchelements
+	      r_axy= 0.0_GRID_SR
+
+	      nditer_loop: DO i_cnt2=1, p_param%phy%i_adviterations
+	        r_xyc= r_ndcoord(:,i_cnt3,i_cnt1)- r_fac* r_axy
+	        r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	      END DO nditer_loop
+
+	      r_ndalpha(:,i_cnt3,i_cnt1)= r_axy
+	    END DO ndual_loop
+	  END DO unknown_loop
+
+!---------- the same for the dual nodes
+
+	  dual_loop: DO i_cnt1=1,i_darlen
+	    r_axy= 0.0_GRID_SR
+
+	    diter_loop: DO i_cnt2=1, p_param%phy%i_adviterations
+	      r_xyc= r_dcoord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO diter_loop
+
+	    r_dalpha(:,i_cnt1)= r_axy
+	  END DO dual_loop
+
+	  RETURN
+	  END SUBROUTINE slm_adisplace
+
+!*****************************************************************
+	  SUBROUTINE slm_aupdate(p_param, i_arlen, r_coord, r_rside, r_udate, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                   :: p_param
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_udate
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                          :: r_time
+	  INTEGER                                             :: i_cnt
+	  REAL (KIND = GRID_SR)                                                :: r_dt, r_tim
+
+!---------- in the linear advection case and with f90 this is just
+
+!	  r_udate= r_rside
+
+!---------- including a non-zero right hand side, we have
+
+	  r_dt= p_param%phy%r_deltatime
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+	  main_loop: DO i_cnt=1, i_arlen
+	    r_udate(i_cnt)= r_rside(i_cnt)+ r_dt* slm_righthand(r_coord(:,i_cnt))
+	  END DO main_loop
+
+	  RETURN
+	  END SUBROUTINE slm_aupdate
+
+!*****************************************************************
+	  SUBROUTINE slm_aupstream(p_mesh, i_arlen, r_coord, r_alpha, &
+	                             i_darlen, r_dcoord, r_dalpha, &
+	                             i_dedge, r_ndcoor, r_ndalpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)        :: p_mesh
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_alpha
+	  INTEGER, INTENT(in)                                  :: i_darlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in) :: r_dcoord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in) :: r_dalpha
+	  INTEGER, DIMENSION(2,GRID_patchelements,i_arlen), INTENT(in) :: i_dedge
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,GRID_patchelements,i_arlen), INTENT(in) :: r_ndcoor
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,GRID_patchelements,i_arlen), INTENT(in) :: r_ndalpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)                :: r_rside
+	  INTEGER                                              :: i_cnt, i_tnc, &
+	    i_out, i_stat, j_cnt, i_ind, i_dualplen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_1
+	  REAL (KIND = GRID_SR)                                                 :: r_oarea, r_narea
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,GRID_elementnodes)    :: r_vertx
+	  REAL (KIND = GRID_SR)                                                 :: r_val, r_tmp
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,2*GRID_patchelements) :: r_dual3, r_updual3
+	  REAL (KIND = GRID_SR), DIMENSION(2,2*GRID_patchelements)              :: r_dual2, r_updual2
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_foot, r_upfoot
+	  REAL (KIND = GRID_SR), DIMENSION(2)                                   :: r_orig
+
+	  i_stat= 0
+	  r_orig=(/0.0, 0.0/)
+
+!---------- main loop over the nodes of the new grid
+
+	  node_loop: DO i_cnt=1,i_arlen
+
+	    r_val= 0.0
+	    r_narea= 0.0
+	    r_vertx= 0.0
+
+!---------- the upstream dual element's center node
+
+	    r_vertx(1,1)= r_coord(1,i_cnt)- r_alpha(1,i_cnt)
+	    r_vertx(2,1)= r_coord(2,i_cnt)- r_alpha(2,i_cnt)
+
+	    r_foot = r_coord(:,i_cnt)
+	    r_upfoot= r_coord(:,i_cnt)- r_alpha(:,i_cnt)
+
+!---------- first collect dual mesh nodes and do tangential projection
+
+	    clct_loop: DO j_cnt= 1, GRID_patchelements
+	      IF(i_dedge(1,j_cnt,i_cnt) == 0) THEN
+	        EXIT clct_loop
+	      ELSE
+	        i_ind= (j_cnt-1)*2 + 1
+	        r_dual3(:,i_ind)  = r_dcoord(:,i_dedge(1,j_cnt,i_cnt))
+	        r_dual3(:,i_ind+1)= r_dcoord(:,i_dedge(2,j_cnt,i_cnt))
+	        r_updual3(:,i_ind)  = r_dcoord(:,i_dedge(1,j_cnt,i_cnt))- r_dalpha(:,i_dedge(1,j_cnt,i_cnt))
+	        r_updual3(:,i_ind+1)= r_dcoord(:,i_dedge(2,j_cnt,i_cnt))- r_dalpha(:,i_dedge(2,j_cnt,i_cnt))
+	      END IF
+	    END DO clct_loop
+	    i_dualplen= j_cnt-1
+
+!---------- now calculate the interference of the voronoi thing with elements from old mesh
+
+	    ptch_loop: DO j_cnt= 1, i_dualplen
+	      i_ind= (j_cnt-1)*2 + 1
+
+!---------- calculate area
+
+	      r_narea= r_narea+ triang_sph(r_upfoot, r_updual3(:,i_ind), r_updual3(:,i_ind+1))
+
+!---------- calculate area of upstream dual triangle
+
+              r_oarea= triang_sph(r_foot, r_dual3(:,i_ind), r_dual3(:,i_ind+1))
+
+!---------- check if upstream value is outside of the domain
+
+	      r_1= r_ndcoor(:,j_cnt,i_cnt)- r_ndalpha(:,j_cnt,i_cnt)
+	      i_out= grid_domaincheck(p_mesh(i_time), r_1)
+
+!---------- take the intersection of the trajectory with the boundary as new upstream point
+
+	      out_domain: IF(i_out /= 0) then
+	        r_1= grid_boundintersect(p_mesh(i_time), &
+	             r_ndcoor(:,j_cnt,i_cnt), r_1, i_info=i_stat)
+	      END IF out_domain
+
+!---------- interpolate
+
+              no_intersect: IF(i_stat /= 0) THEN
+                r_tmp= 0.0_GRID_SR
+	      ELSE no_intersect
+	        r_tmp= grid_coordvalue(p_mesh(i_time), r_1, i_interpolorder=GRID_highorder)
+	        IF(abs(r_tmp) < GRID_EPS) THEN
+		  r_tmp= 0.0_GRID_SR
+		END IF
+              END IF no_intersect
+
+!---------- interpolate upstream concentration and calculate integral with quadrature rule
+
+	      r_val= r_val+ r_oarea* r_tmp
+
+	    END DO ptch_loop
+
+!---------- now calculate concentration
+
+	    r_rside(i_cnt)= r_val/r_narea
+
+	  END DO node_loop
+
+	  RETURN
+	  END SUBROUTINE slm_aupstream
+
+!*****************************************************************
+	  SUBROUTINE create_newdualpoints(i_arlen, r_coord, &
+	                                  i_darlen, r_dcoord, i_dedge, r_ndcoor)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  INTEGER, INTENT(in)                                  :: i_darlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in) :: r_dcoord
+	  INTEGER, DIMENSION(2,GRID_patchelements,i_arlen), INTENT(in) :: i_dedge
+	  REAL (KIND = GRID_SR), DIMENSION(:,:,:), POINTER                      :: r_ndcoor
+
+	  REAL (KIND = GRID_SR)                                                 :: r_onethird=1./3.
+	  INTEGER                                              :: i_alct, i_cnt, i_tnc
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,GRID_elementnodes)    :: r_vertx
+
+!---------- allocate array for dual coordinates
+
+	  allocate(r_ndcoor(GRID_dimension,GRID_patchelements,i_arlen), stat=i_alct)
+	  not_allocdual: IF(i_alct /= 0) THEN
+	    CALL grid_error(c_error='[create_newdualpoints]: dual points array not allocated!')
+	  END IF not_allocdual
+
+!---------- main loop over the nodes of the new grid
+
+	  node_loop: DO i_cnt=1,i_arlen
+
+	    r_vertx= 0.0_GRID_SR
+
+!---------- the upstream dual element's center node
+
+	    r_vertx(:,1)= r_coord(:,i_cnt)
+
+!---------- now calculate the interference of the voronoi thing with elements from old mesh
+
+	    ptch_loop: DO i_tnc= 1, GRID_patchelements
+	    IF(i_dedge(1,i_tnc,i_cnt) == 0) THEN
+	      EXIT ptch_loop
+	    ELSE
+
+!---------- the upstream dual element's outer nodes
+
+	      r_vertx(:,2)= r_dcoord(:,i_dedge(1,i_tnc,i_cnt))
+	      r_vertx(:,3)= r_dcoord(:,i_dedge(2,i_tnc,i_cnt))
+
+!---------- calculate dual triangles center point
+
+	      r_ndcoor(:, i_tnc, i_cnt)= r_onethird* &
+	                                (r_vertx(:,1)+ r_vertx(:,2)+ r_vertx(:,3))
+	    END IF
+	    END DO ptch_loop
+	  END DO node_loop
+
+	  RETURN
+	  END SUBROUTINE create_newdualpoints
+
+!*****************************************************************
+	  FUNCTION triang_sph(r_coord1, r_coord2, r_coord3) RESULT (r_area)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord1, r_coord2, r_coord3
+	  REAL (KIND = GRID_SR)                                        :: r_area
+
+	  REAL (KIND = GRID_SR)                                        :: r_sum, r_hav, &
+	    r_a, r_b, r_c, r_s, r_t, r_e
+	  REAL (KIND = GRID_SR)                                        :: r_halfpi
+	  REAL (KIND = GRID_SR), PARAMETER                             :: r_degree=57.295779513082320876798 ! degrees per radian
+	  REAL (KIND = GRID_SR)                                        :: r_cosb1, r_cosb2, r_cosb3
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimspherical)          :: r_lam1, r_lam2, r_lam3
+
+!---------- initialization
+
+	  r_sum= 0.0
+	  r_halfpi=GRID_PI*0.5
+
+!---------- calculate spherical coordinates
+
+	  r_lam1= grid_kartgeo(r_coord1)
+	  r_lam2= grid_kartgeo(r_coord2)
+	  r_lam3= grid_kartgeo(r_coord3)
+
+!---------- calculate cosines
+
+	  r_cosb1= cos(r_lam1(2))
+	  r_cosb2= cos(r_lam2(2))
+	  r_cosb3= cos(r_lam3(2))
+	  
+!---------- for all three pairs do the excess calculation
+
+	  IF(r_lam1(1) /= r_lam2(1)) THEN
+	    r_hav= hav(r_lam2(2)- r_lam1(2))+ r_cosb1*r_cosb2*hav(r_lam2(1)- r_lam1(1))
+	    r_a  = 2.0* asin(sqrt(r_hav))
+	    r_b  = r_halfpi- r_lam2(2)
+	    r_c  = r_halfpi- r_lam1(2)
+	    r_s  = 0.5* (r_a+ r_b+ r_c);
+	    r_t  = tan(r_s* 0.5)* tan((r_s-r_a)*0.5)* tan((r_s-r_b)*0.5)* tan((r_s-r_c)*0.5)
+	    r_e  = abs(4.0* atan(sqrt(abs(r_t))))* r_degree
+	    IF(r_lam1(1) > r_lam2(1)) r_e= -r_e
+	    
+	    r_sum= r_sum+ r_e
+	  END IF
+
+	  IF(r_lam2(1) /= r_lam3(1)) THEN
+	    r_hav= hav(r_lam3(2)- r_lam2(2))+ r_cosb2*r_cosb3*hav(r_lam3(1)- r_lam2(1))
+	    r_a  = 2.0* asin(sqrt(r_hav))
+	    r_b  = r_halfpi- r_lam3(2)
+	    r_c  = r_halfpi- r_lam2(2)
+	    r_s  = 0.5* (r_a+ r_b+ r_c);
+	    r_t  = tan(r_s* 0.5)* tan((r_s-r_a)*0.5)* tan((r_s-r_b)*0.5)* tan((r_s-r_c)*0.5)
+	    r_e  = abs(4.0* atan(sqrt(abs(r_t))))* r_degree
+	    IF(r_lam2(1) > r_lam3(1)) r_e= -r_e
+	    
+	    r_sum= r_sum+ r_e
+	  END IF
+
+	  IF(r_lam3(1) /= r_lam1(1)) THEN
+	    r_hav= hav(r_lam1(2)- r_lam3(2))+ r_cosb3*r_cosb1*hav(r_lam1(1)- r_lam3(1))
+	    r_a  = 2.0* asin(sqrt(r_hav))
+	    r_b  = r_halfpi- r_lam1(2)
+	    r_c  = r_halfpi- r_lam3(2)
+	    r_s  = 0.5* (r_a+ r_b+ r_c);
+	    r_t  = tan(r_s* 0.5)* tan((r_s-r_a)*0.5)* tan((r_s-r_b)*0.5)* tan((r_s-r_c)*0.5)
+	    r_e  = abs(4.0* atan(sqrt(abs(r_t))))* r_degree
+	    IF(r_lam3(1) > r_lam1(1)) r_e= -r_e
+	    
+	    r_sum= r_sum+ r_e
+	  END IF
+
+	  r_area= abs(r_sum)
+
+	  RETURN
+	  END FUNCTION triang_sph
+
+!*****************************************************************
+	  FUNCTION hav(r_in) RESULT (r_out)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_in
+	  REAL (KIND = GRID_SR)                                        :: r_out
+
+!---------- calculate haversine function
+
+	  r_out= (1.0 - cos(r_in))* 0.5
+
+	  RETURN
+	  END FUNCTION hav
+
+	END MODULE SLM_advanced
diff --git a/flash2d/src/options-sphere/SLM_initial.gaia b/flash2d/src/options-sphere/SLM_initial.gaia
new file mode 100644
index 0000000..6065729
--- /dev/null
+++ b/flash2d/src/options-sphere/SLM_initial.gaia
@@ -0,0 +1,344 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_initial
+! FUNCTION:
+!	initialize slotted cylinder for semi-Lagrangian advection
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialvalues
+! FUNCTION:
+!	initialize a grid with values
+! SYNTAX:
+!	CALL slm_initialvalues(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initslot
+! FUNCTION:
+!	initialize a grid with values of slotted cylinder test case
+! SYNTAX:
+!	CALL slm_initslot(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_analyticsolution
+! FUNCTION:
+!	calculates the 'analytic solution' to compare with in diagnostics
+! SYNTAX:
+!	CALL slm_analyticsolution(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initcylndr
+! FUNCTION:
+!	initialize a grid with values of a cylinder test case
+! SYNTAX:
+!	CALL slm_initcylndr(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_centr: coordinates of cyl. centre	REAL
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	in_side
+! FUNCTION:
+!	checks, if a given point (x,y) lies within a given triangle
+! SYNTAX:
+!	logical= in_side(real.arr, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	r_coord: coordinate array		REAL
+!	r_node1: node1 of triangle		REAL
+!	r_node2: node2 of triangle		REAL
+!	r_node3: node3 of triangle		REAL
+! ON OUTPUT:
+!	l_in:    .true. if r_coord \in p_elem	logical
+! CALLS:
+!
+! COMMENTS:
+!	this routine decides whether a point lies in or out of a
+!	triangle. this is done with the following approach:
+!	calculate the area for the given triangle and for the 
+!	three triangles resulting from drawing lines from the given
+!	point to all three triangle nodes.
+!	if the sum of the areas of those three trianlges exceeds
+!	the area of the given trianlge, the the point lies outside
+!	of it.
+!	for calculation of the areas following formula is used:
+!	(Herons formula(?))
+!
+!	A = sqrt(s* (s- a)* (s- b)* (s- c)),
+!
+!	where s= 1/2* (a+ b+ c)
+!	      a, b, c sides.
+!
+!	in order to calculate the sidelengths |x-y|= sqrt(x**2-y**2)
+!	the complex absolute value intrinsic function is used.
+!	hopefully this fuction is faster than using sqrt and
+!	power-of-two instead.
+!
+!	internally double precision is used in this function, because
+!	machine precision is crucial when a coordinate pair appears
+!	near the edge or corner of an element.
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	dc_area
+! FUNCTION:
+!	calculate area of a triangle (in a plain) in double precision
+! SYNTAX:
+!	real= dc_area(real.arr, real.arr, real.arr)
+! ON INPUT:
+!	r_coord1: node1 of triangle			REAL
+!	r_coord2: node2 of triangle			REAL
+!	r_coord3: node3 of triangle			REAL
+! ON OUTPUT:
+!	r_area:   area of triangle			REAL
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_initialvalues, slm_analyticsolution
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	7/97
+!	2. names changed		j. behrens	7/97
+!	3. changed to use GRID_api	j. behrens	11/97
+!	4. changed interfaces		j. behrens	12/97
+!	5. compliant to amatos 1.0	j. behrens	12/2000
+!	6. compliant to amatos 1.2	j. behrens	3/2002
+!       7. compliant to amatos 2.0      f. klaschka     8/2006
+!
+!*****************************************************************
+	MODULE SLM_initial
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC slm_initialvalues, slm_analyticsolution
+! 	  REAL, DIMENSION(GRID_dimension) :: r_cntr=(/ -0.25, 0.0 /)
+! 	  REAL                            :: r_hgt=4.0
+! 	  REAL                            :: r_srd=0.15
+! 	  REAL                            :: r_sln=0.22
+! 	  REAL                            :: r_swd=0.06
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_initialvalues(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  INTEGER                                    :: i_lev= 6
+
+!---------- initialize some constant for the slotted cylinder
+
+	  CALL slm_initcoshill(p_ghand)
+
+	  RETURN
+	  END SUBROUTINE slm_initialvalues
+!*****************************************************************
+	  SUBROUTINE slm_analyticsolution(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)              :: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  INTEGER, INTENT(in)                         :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)       :: r_array
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_centr
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimspherical)          :: r_sentr=(/ 0.0, 0.0 /)
+	  REAL (KIND = GRID_SR)                                        :: r_rds, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_tmp
+	  INTEGER                                                      :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE           :: r_coo
+
+!---------- calculate center ! CAUTION: THIS IS NOT IMPLEMENTED YET !!!
+
+	  r_centr= grid_geokart(r_sentr)
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(55)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- check array length
+
+	  IF(i_arlen < i_num) THEN
+	    IF(GRID_parameters%iolog > 0) THEN
+	      write(GRID_parameters%iolog,*) '[slm_analyticsolution]: Array sizes did not match, adjusting to the smaller size!'
+	    END IF
+	    i_num= i_arlen
+	  END IF
+
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_array(i_count)= coshill(r_coo(:,i_count),r_centr)
+	  END DO node_loop
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsolution
+
+!*****************************************************************
+	  SUBROUTINE slm_initcoshill(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_centr
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimspherical)         :: r_sentr=(/ 0.0, 0.0 /)
+	  REAL (KIND = GRID_SR)                                       :: r_rds, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_tmp
+	  INTEGER                                    :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_coo
+	  INTEGER (KIND = GRID_SI), DIMENSION(1)                      :: i_valind
+
+!---------- get center
+
+	  r_centr= grid_geokart(r_sentr)
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(55)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_aux(1,i_count)= coshill(r_coo(:,i_count),r_centr)
+	  END DO node_loop
+
+!---------- update grid information
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_initcoshill
+
+!*****************************************************************
+	  FUNCTION coshill(r_coor, r_centr) RESULT (r_hill)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)    :: r_coor
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)    :: r_centr
+	  REAL (KIND = GRID_SR)                               :: r_hill
+	  REAL (KIND = GRID_SR)                               :: r_maxheight=1.0
+	  REAL (KIND = GRID_SR)                               :: r_maxrad
+	  REAL (KIND = GRID_SR)                               :: r_minrad
+	  REAL (KIND = GRID_SR)                               :: r_linwid
+	  REAL (KIND = GRID_SR)                               :: r_dist, r_tmp
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)    :: r_xy
+
+!---------- initialize r_hill
+
+	  r_maxrad= GRID_RADIUS/ 6.0
+	  r_minrad= r_maxrad* 0.6
+	  r_linwid= r_maxrad* 0.25
+	  r_hill= 0.0
+
+!---------- calculate distance to center
+
+	  r_xy= r_centr- r_coor
+	  r_dist= DOT_PRODUCT(r_xy,r_xy)
+
+!---------- calculate inner values
+
+	  IF(r_dist < r_maxrad) THEN
+	    r_hill= r_maxheight
+	    IF(r_dist < r_minrad) THEN
+	      r_hill= 0.0
+	      IF((r_xy(3) < r_centr(3)+ r_linwid) .AND. &
+	         (r_xy(3) > r_centr(3)- r_linwid)) THEN
+		r_hill= r_maxheight
+	      END IF
+	    END IF
+	  END IF
+
+	  RETURN
+	  END FUNCTION coshill
+
+!*****************************************************************
+
+	END MODULE SLM_initial
+
diff --git a/flash2d/src/options-sphere/SLM_initial.mvortex b/flash2d/src/options-sphere/SLM_initial.mvortex
new file mode 100644
index 0000000..4d666aa
--- /dev/null
+++ b/flash2d/src/options-sphere/SLM_initial.mvortex
@@ -0,0 +1,515 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_initial
+! FUNCTION:
+!	initialize moving vortex for semi-Lagrangian advection
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialvalues
+! FUNCTION:
+!	initialize a grid with values
+! SYNTAX:
+!	CALL slm_initialvalues(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initslot
+! FUNCTION:
+!	initialize a grid with values of slotted cylinder test case
+! SYNTAX:
+!	CALL slm_initslot(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_analyticsolution
+! FUNCTION:
+!	calculates the 'analytic solution' to compare with in diagnostics
+! SYNTAX:
+!	CALL slm_analyticsolution(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initcylndr
+! FUNCTION:
+!	initialize a grid with values of a cylinder test case
+! SYNTAX:
+!	CALL slm_initcylndr(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_centr: coordinates of cyl. centre	REAL
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	in_side
+! FUNCTION:
+!	checks, if a given point (x,y) lies within a given triangle
+! SYNTAX:
+!	logical= in_side(real.arr, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	r_coord: coordinate array		REAL
+!	r_node1: node1 of triangle		REAL
+!	r_node2: node2 of triangle		REAL
+!	r_node3: node3 of triangle		REAL
+! ON OUTPUT:
+!	l_in:    .true. if r_coord \in p_elem	logical
+! CALLS:
+!
+! COMMENTS:
+!	this routine decides whether a point lies in or out of a
+!	triangle. this is done with the following approach:
+!	calculate the area for the given triangle and for the 
+!	three triangles resulting from drawing lines from the given
+!	point to all three triangle nodes.
+!	if the sum of the areas of those three trianlges exceeds
+!	the area of the given trianlge, the the point lies outside
+!	of it.
+!	for calculation of the areas following formula is used:
+!	(Herons formula(?))
+!
+!	A = sqrt(s* (s- a)* (s- b)* (s- c)),
+!
+!	where s= 1/2* (a+ b+ c)
+!	      a, b, c sides.
+!
+!	in order to calculate the sidelengths |x-y|= sqrt(x**2-y**2)
+!	the complex absolute value intrinsic function is used.
+!	hopefully this fuction is faster than using sqrt and
+!	power-of-two instead.
+!
+!	internally double precision is used in this function, because
+!	machine precision is crucial when a coordinate pair appears
+!	near the edge or corner of an element.
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	dc_area
+! FUNCTION:
+!	calculate area of a triangle (in a plain) in double precision
+! SYNTAX:
+!	real= dc_area(real.arr, real.arr, real.arr)
+! ON INPUT:
+!	r_coord1: node1 of triangle			REAL
+!	r_coord2: node2 of triangle			REAL
+!	r_coord3: node3 of triangle			REAL
+! ON OUTPUT:
+!	r_area:   area of triangle			REAL
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_initialvalues, slm_analyticsolution
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	7/97
+!	2. names changed		j. behrens	7/97
+!	3. changed to use GRID_api	j. behrens	11/97
+!	4. changed interfaces		j. behrens	12/97
+!	5. compliant to amatos 1.0	j. behrens	12/2000
+!	6. compliant to amatos 1.2	j. behrens	3/2002
+! 7. compliant to amatos 2.0      f. klaschka     8/2006
+!
+!*****************************************************************
+	MODULE SLM_initial
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC slm_initialvalues, slm_analyticsolution
+! 	  REAL, DIMENSION(GRID_dimension) :: r_cntr=(/ -0.25, 0.0 /)
+! 	  REAL                            :: r_hgt=4.0
+! 	  REAL                            :: r_srd=0.15
+! 	  REAL                            :: r_sln=0.22
+! 	  REAL                            :: r_swd=0.06
+      REAL (KIND=GRID_SR) 						:: r_beta = 0._GRID_SR * 0.785398163397448279_GRID_SR    ! Check ADV_wind when changing this value!!!
+																																! angle between north pole of unrotated sphere and vortices axis
+																																! in Nair paper: alpha. To get no trouble with trajectory nomenclatura 
+																																! called r_beta here
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_initialvalues(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  INTEGER                                    :: i_lev= 6
+
+!---------- initialize for the moving vortex
+
+    CALL slm_mvortex(p_ghand, r_beta, 0._GRID_SR, 0)
+
+	  RETURN
+	  END SUBROUTINE slm_initialvalues
+!*****************************************************************
+	  SUBROUTINE slm_analyticsolution(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)              :: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  INTEGER, INTENT(in)                         :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)       :: r_array
+	  REAL (KIND = GRID_SR)                                        :: r_rds, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_tmp
+	  INTEGER                                                      :: i_count, i_num, i_alct
+
+!---------- check array length
+
+	  IF(i_arlen < i_num) THEN
+	    IF(GRID_parameters%iolog > 0) THEN
+	      write(GRID_parameters%iolog,*) '[slm_analyticsolution]: Array sizes did not match, adjusting to the smaller size!'
+	    END IF
+	    i_num= i_arlen
+	  END IF
+
+!---------- loop over the node
+
+    CALL slm_mvortex(p_ghand, r_beta, r_time, i_arlen, r_array)
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsolution
+
+!*****************************************************************
+	  SUBROUTINE slm_mvortex(p_ghand, r_beta, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)                              :: p_ghand
+		REAL (KIND = GRID_SR), INTENT(in) 													:: r_beta  ! angle between north pole of the unrotated sphere and vortices axis
+		                                                                       ! in Nair paper: alpha. To get no trouble with trajectory nomenclatura 
+																																           ! called r_beta here
+		REAL (KIND = GRID_SR), INTENT(in) 													:: r_time
+		
+		REAL (KIND = GRID_SR), DIMENSION(i_arlen), OPTIONAL         :: r_array
+		INTEGER (KIND = GRID_SI)                                    :: i_arlen
+		
+		
+	  REAL (KIND = GRID_SR)                                       :: r_rds, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_tmp
+	  INTEGER                                     								:: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_coo
+		REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_scoo ! sperical coordinates
+	  INTEGER (KIND = GRID_SI), DIMENSION(1)                      :: i_valind
+		
+!---------- Nairs variables
+    
+		REAL (KIND = GRID_SR) 																			:: r_scale, r_unot
+		REAL (KIND = GRID_SR) 																			:: r_tow
+		
+		REAL (KIND = GRID_SR) 																			:: r_lm0, r_th0
+		REAL (KIND = GRID_SR) 																			:: r_lmc, r_thc 				! north pole coordinates
+		REAL (KIND = GRID_SR) 																			:: r_pl, r_pt 					! vortex position
+    REAL (KIND = GRID_SR) 																			:: r_ct, r_st
+		REAL (KIND = GRID_SR) 																			:: r_th, r_lm
+		REAL (KIND = GRID_SR) 																			:: r_lam, r_the
+		REAL (KIND = GRID_SR) 																			:: r_rl, r_rt
+		REAL (KIND = GRID_SR) 																			:: r_dd, r_rd, r_vmax
+		REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE						:: r_rthe, r_rlam 			! rotated theta and lambda?
+		REAL (KIND = GRID_SR) 																			:: r_rho								! density
+		REAL (KIND = GRID_SR) 																			:: r_tt, r_tv
+		REAL (KIND = GRID_SR) 																			:: r_omg, r_trm
+
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(55)
+	  END IF
+		
+		ALLOCATE(r_scoo(GRID_dimspherical, i_num), stat= i_alct)
+    IF(i_alct /= 0) THEN
+	    CALL grid_error(55)
+	  END IF
+		
+		ALLOCATE(r_rlam(i_num), r_rthe(i_num), stat=i_alct)
+		IF(i_alct /= 0) THEN
+	    CALL grid_error(55)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+		
+		DO i_count = 1, i_num
+      r_scoo(:,i_count) = grid_kartgeo(r_coo(:,i_count))
+		END DO
+
+!---------- Parameters for a unit sphere (see dynamic_vortex.f, Nair)
+
+		
+    r_scale = 2._GRID_SR*GRID_PI / float(1036800)     !12 days scale
+    r_unot  = 2._GRID_SR*GRID_PI / float(1036800)     !12 dyas rate
+
+    r_tow = r_time * r_scale								 ! r_time = dtt * itn in original code
+
+    r_lm0 = 1.5_GRID_SR * GRID_PI            !intial center position (3pi/2,0)
+    r_th0 = 0.0_GRID_SR
+
+    !Following 2 lines commented out by Nair
+    !r_lmc = r_lm0            !center of the vortex
+    !r_thc = r_th0
+
+    r_pl = r_lm0   
+    r_pt = r_th0 
+    r_ct = cos(r_pt)
+    r_st = sin(r_pt)
+		
+!*--------Note:
+!*      keep the vortex position (pl,pt)  "fixed" and rotate the background 
+!*      away by "unot*dtime*ditn" units from its initial position on
+!*      the latitudes of a rotated sphere. Transform back to the regular coordinates
+!*      and form the vortex with center at the "fixed" position (pl,pt).
+!*
+            
+!---------- Solid-body rotation part (without vortex)
+
+	  node_loop1: DO i_count= 1, i_num
+		  r_lm = r_scoo(1,i_count)  
+      r_th = r_scoo(2,i_count)
+      
+			r_lmc =  GRID_PI                           !vortex center position  
+      r_thc =  0.5_GRID_SR * GRID_PI - r_beta	   !vortex center position  	
+
+      !  Go to the rotated system
+      CALL rotated_sphere(r_lmc,r_thc,r_lm,r_th,r_rl,r_rt)
+      r_lam = r_rl - r_unot*r_time   ! commented out -> no rotation
+      r_the = r_rt
+      
+			!Following 3 lines commented out by Nair
+			!r_lmc =  0.0_GRID_SR  !another option 
+      !r_thc = -0.5_GRID_SR * GRID_PI + r_beta
+      !with r_lam = r_rl  + r_unot*r_time  
+
+      !  Back to unrotated system 
+      CALL rotate_back(r_lmc,r_thc,r_lam,r_the,r_rl,r_rt)
+			r_rlam(i_count) =  r_rl
+      r_rthe(i_count) =  r_rt
+		END DO node_loop1
+
+
+
+!----------- Analytic Vortex field at any given time (iteration)
+!----------- Smooth Vortex making parameters  
+    r_dd = 5.0_GRID_SR
+    r_rd = 3.0_GRID_SR
+    r_vmax = 1.5_GRID_SR *sqrt(3.0_GRID_SR)
+
+!---------- loop over the nodes
+
+	  node_loop2: DO i_count= 1, i_num
+		  r_th = r_rthe(i_count)
+      r_lm = r_rlam(i_count)
+           
+      CALL rotated_sphere(r_pl,r_pt,r_lm,r_th,r_rl,r_rt)
+
+      r_rho = r_rd * cos(r_rt)
+      r_tt = tanh(r_rho)
+      r_tv = (1.0_GRID_SR - r_tt*r_tt) * r_tt * r_vmax
+
+      if (r_rho == 0.0_GRID_SR ) then
+        r_omg = 0.0_GRID_SR
+      else
+        r_omg = r_tv / r_rho				! this is not exactly the same omega as in the paper. the scaling factor misses, but is included in r_tow
+      endif
+		 		 
+		  ! Exact sln.
+		  r_trm =  r_rho* sin(r_rl - r_tow*r_omg) / r_dd
+	    r_aux(1,i_count)= (1.0_GRID_SR - tanh(r_trm) )
+	  END DO node_loop2
+
+!---------- update grid information or give analytical solution back
+
+		IF (.NOT. present(r_array)) THEN
+	    i_valind= (/ GRID_tracer /)
+	    CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+	  ELSE
+		  r_array = r_aux(1,:)
+		END IF
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo, r_scoo, r_rlam, r_rthe)
+
+	  RETURN
+	  END SUBROUTINE slm_mvortex
+
+!*****************************************************************
+	  FUNCTION coshill(r_coor, r_centr) RESULT (r_hill)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)    :: r_coor
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)    :: r_centr
+	  REAL (KIND = GRID_SR)                               :: r_hill
+	  REAL (KIND = GRID_SR)                               :: r_maxheight=1.0
+	  REAL (KIND = GRID_SR)                               :: r_maxrad
+	  REAL (KIND = GRID_SR)                               :: r_dist, r_tmp
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)    :: r_xy
+
+!---------- initialize r_hill
+
+	  r_maxrad= GRID_RADIUS/ 6.0
+	  r_hill= 0.0
+
+!---------- calculate distance to center
+
+	  r_xy= r_centr- r_coor
+	  r_dist= DOT_PRODUCT(r_xy,r_xy)
+
+!---------- calculate inner values
+
+	  IF(r_dist < r_maxrad) THEN
+	    r_tmp = (GRID_PI* r_dist)/r_maxrad
+	    r_hill= r_maxheight *(1.0+ cos(r_tmp))
+	  END IF
+
+	  RETURN
+	  END FUNCTION coshill
+
+!*****************************************************************
+
+!*******************************************************************
+!* Ram Nair (Ncar/SCD) 08/06
+!*  Rotate a sphere  so that its NP is at (lc,tc). The rotated coordinates
+!* (rol,rot) corresponding to (la,th) in the regular Sph.  coordinates
+!*******************************************************************
+    SUBROUTINE Rotated_Sphere(lc,tc,la,th,rol,rot)
+!*
+!      include 'params.h'
+!      include 'const.h'
+!*
+
+
+    IMPLICIT NONE
+    REAL (KIND = GRID_SR), INTENT(in)			:: lc,tc,la,th          !In
+    REAL (KIND = GRID_SR), INTENT(out)    :: rol,rot              !Out
+
+    REAL (KIND = GRID_SR)									:: cost,sint,sinc,cosc
+    REAL (KIND = GRID_SR)									:: trm, trm1,trm2,trm3
+    REAL (KIND = GRID_SR) 					      :: twopi
+		
+		twopi=2._GRID_SR * GRID_PI
+		
+    sinc = sin(tc)
+    cosc = cos(tc)
+    cost = cos(th)
+    sint = sin(th)
+
+    trm  = cost * cos(la- lc)
+    trm1 = cost * sin(la- lc)
+    trm2 = sinc * trm  - cosc * sint
+    trm3 = sinc * sint + cosc * trm
+     
+    rol = atan2(trm1,trm2)
+    if (rol > twopi)        rol = rol - twopi
+    if (rol < 0.0_GRID_SR ) rol = rol + twopi
+    rot = asin(trm3)
+
+    RETURN
+    END SUBROUTINE Rotated_Sphere
+
+
+!*******************************************************************
+!* Ram Nair (Ncar/SCD) 10/06
+!*Rotate a sphere  back to the regular (rla,rth) coordinates from
+!* a  totated sphere whose  NP is at (lmc,thc). The unrotated coordinates
+!*(rla,rth) corresponds to the (lam,the) of the  rotated Sphere
+!*******************************************************************
+    SUBROUTINE Rotate_Back(lmc,thc,lam,the,rla,rth)
+!*
+!      include 'params.h'
+!      include 'const.h'
+!*
+
+	  IMPLICIT NONE
+    REAL (KIND = GRID_SR), INTENT(in)			:: lmc,thc,lam,the      !In
+    REAL (KIND = GRID_SR), INTENT(out)		:: rla,rth              !Out
+
+    REAL (KIND = GRID_SR)									:: cost,sint,cosp,sinp,clam,slam 
+    REAL (KIND = GRID_SR)									:: trm, t1,t2,t3
+    REAL (KIND = GRID_SR) 					      :: twopi
+
+    twopi=2._GRID_SR * GRID_PI 
+		 
+!* Back to unrotated system
+    cost = cos(the)
+    sint = sin(the)
+    clam = cos(lam)
+    slam = sin(lam)
+    cosp = cos(thc)
+    sinp = sin(thc)
+     t1 = slam * cost
+     t2 = sint*cosp + cost*clam*sinp
+     t3 = sint*sinp - cost*clam*cosp
+    rla =  lmc + atan2(t1,t2)
+    if (rla < 0.0 )  rla = rla + twopi
+    if (rla > twopi )  rla = rla - twopi
+    rth =  asin(t3)
+
+    RETURN
+    END SUBROUTINE Rotate_Back
+
+END MODULE SLM_initial
+
+
+
+
diff --git a/flash2d/src/options-sphere/SLM_initial.sharp b/flash2d/src/options-sphere/SLM_initial.sharp
new file mode 100644
index 0000000..548679c
--- /dev/null
+++ b/flash2d/src/options-sphere/SLM_initial.sharp
@@ -0,0 +1,334 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_initial
+! FUNCTION:
+!	initialize slotted cylinder for semi-Lagrangian advection
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialvalues
+! FUNCTION:
+!	initialize a grid with values
+! SYNTAX:
+!	CALL slm_initialvalues(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initslot
+! FUNCTION:
+!	initialize a grid with values of slotted cylinder test case
+! SYNTAX:
+!	CALL slm_initslot(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_analyticsolution
+! FUNCTION:
+!	calculates the 'analytic solution' to compare with in diagnostics
+! SYNTAX:
+!	CALL slm_analyticsolution(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initcylndr
+! FUNCTION:
+!	initialize a grid with values of a cylinder test case
+! SYNTAX:
+!	CALL slm_initcylndr(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_centr: coordinates of cyl. centre	REAL
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	in_side
+! FUNCTION:
+!	checks, if a given point (x,y) lies within a given triangle
+! SYNTAX:
+!	logical= in_side(real.arr, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	r_coord: coordinate array		REAL
+!	r_node1: node1 of triangle		REAL
+!	r_node2: node2 of triangle		REAL
+!	r_node3: node3 of triangle		REAL
+! ON OUTPUT:
+!	l_in:    .true. if r_coord \in p_elem	logical
+! CALLS:
+!
+! COMMENTS:
+!	this routine decides whether a point lies in or out of a
+!	triangle. this is done with the following approach:
+!	calculate the area for the given triangle and for the 
+!	three triangles resulting from drawing lines from the given
+!	point to all three triangle nodes.
+!	if the sum of the areas of those three trianlges exceeds
+!	the area of the given trianlge, the the point lies outside
+!	of it.
+!	for calculation of the areas following formula is used:
+!	(Herons formula(?))
+!
+!	A = sqrt(s* (s- a)* (s- b)* (s- c)),
+!
+!	where s= 1/2* (a+ b+ c)
+!	      a, b, c sides.
+!
+!	in order to calculate the sidelengths |x-y|= sqrt(x**2-y**2)
+!	the complex absolute value intrinsic function is used.
+!	hopefully this fuction is faster than using sqrt and
+!	power-of-two instead.
+!
+!	internally double precision is used in this function, because
+!	machine precision is crucial when a coordinate pair appears
+!	near the edge or corner of an element.
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	dc_area
+! FUNCTION:
+!	calculate area of a triangle (in a plain) in double precision
+! SYNTAX:
+!	real= dc_area(real.arr, real.arr, real.arr)
+! ON INPUT:
+!	r_coord1: node1 of triangle			REAL
+!	r_coord2: node2 of triangle			REAL
+!	r_coord3: node3 of triangle			REAL
+! ON OUTPUT:
+!	r_area:   area of triangle			REAL
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_initialvalues, slm_analyticsolution
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	7/97
+!	2. names changed		j. behrens	7/97
+!	3. changed to use GRID_api	j. behrens	11/97
+!	4. changed interfaces		j. behrens	12/97
+!	5. compliant to amatos 1.0	j. behrens	12/2000
+!	6. compliant to amatos 1.2	j. behrens	3/2002
+!       7. compliant to amatos 2.0      f. klaschka     8/2006
+!
+!*****************************************************************
+	MODULE SLM_initial
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC slm_initialvalues, slm_analyticsolution
+! 	  REAL, DIMENSION(GRID_dimension) :: r_cntr=(/ -0.25, 0.0 /)
+! 	  REAL                            :: r_hgt=4.0
+! 	  REAL                            :: r_srd=0.15
+! 	  REAL                            :: r_sln=0.22
+! 	  REAL                            :: r_swd=0.06
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_initialvalues(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  INTEGER                                    :: i_lev= 6
+
+!---------- initialize some constant for the slotted cylinder
+
+	  CALL slm_initcoshill(p_ghand)
+
+	  RETURN
+	  END SUBROUTINE slm_initialvalues
+!*****************************************************************
+	  SUBROUTINE slm_analyticsolution(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)              :: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  INTEGER, INTENT(in)                         :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)       :: r_array
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_centr
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimspherical)          :: r_sentr=(/ 0.0, 0.0 /)
+	  REAL (KIND = GRID_SR)                                        :: r_rds, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_tmp
+	  INTEGER                                                      :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE           :: r_coo
+
+!---------- calculate center ! CAUTION: THIS IS NOT IMPLEMENTED YET !!!
+
+	  r_centr= grid_geokart(r_sentr)
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(55)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- check array length
+
+	  IF(i_arlen < i_num) THEN
+	    IF(GRID_parameters%iolog > 0) THEN
+	      write(GRID_parameters%iolog,*) '[slm_analyticsolution]: Array sizes did not match, adjusting to the smaller size!'
+	    END IF
+	    i_num= i_arlen
+	  END IF
+
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_array(i_count)= coshill(r_coo(:,i_count),r_centr)
+	  END DO node_loop
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsolution
+
+!*****************************************************************
+	  SUBROUTINE slm_initcoshill(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_centr
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimspherical)         :: r_sentr=(/ 0.0, 0.0 /)
+	  REAL (KIND = GRID_SR)                                       :: r_rds, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_tmp
+	  INTEGER                                    :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_coo
+	  INTEGER (KIND = GRID_SI), DIMENSION(1)                      :: i_valind
+
+!---------- get center
+
+	  r_centr= grid_geokart(r_sentr)
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(55)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_aux(1,i_count)= coshill(r_coo(:,i_count),r_centr)
+	  END DO node_loop
+
+!---------- update grid information
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_initcoshill
+
+!*****************************************************************
+	  FUNCTION coshill(r_coor, r_centr) RESULT (r_hill)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)    :: r_coor
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)    :: r_centr
+	  REAL (KIND = GRID_SR)                               :: r_hill
+	  REAL (KIND = GRID_SR)                               :: r_maxheight=1.0
+	  REAL (KIND = GRID_SR)                               :: r_maxrad
+	  REAL (KIND = GRID_SR)                               :: r_dist, r_tmp
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)    :: r_xy
+
+!---------- initialize r_hill
+
+	  r_maxrad= GRID_RADIUS/ 6.0
+	  r_hill= 0.0
+
+!---------- calculate distance to center
+
+	  r_xy= r_centr- r_coor
+	  r_dist= DOT_PRODUCT(r_xy,r_xy)
+
+!---------- calculate inner values
+
+	  IF(r_dist < r_maxrad) THEN
+! 	    r_tmp = (GRID_PI* r_dist)/r_maxrad
+! 	    r_hill= r_maxheight *(1.0+ cos(r_tmp))
+	    r_hill= r_maxheight
+	  END IF
+
+	  RETURN
+	  END FUNCTION coshill
+
+!*****************************************************************
+
+	END MODULE SLM_initial
diff --git a/flash2d/src/options-sphere/SLM_simple.clip.f90 b/flash2d/src/options-sphere/SLM_simple.clip.f90
new file mode 100644
index 0000000..059499e
--- /dev/null
+++ b/flash2d/src/options-sphere/SLM_simple.clip.f90
@@ -0,0 +1,459 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_simple
+! FUNCTION:
+!	provide advanced semi-Lagrangian routines
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_step
+! FUNCTION:
+!	one step of the basic SLM algorithm
+! SYNTAX:
+!	CALL slm_step(int, real.arr, real.arr)
+! ON INPUT:
+!	...
+! ON OUTPUT:
+!	r_tracer: array with tracer values	real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_displace
+! FUNCTION:
+!	extrapolate the alpha, values for the displacements of the upstream
+!	points from the gridpoints
+! SYNTAX:
+!	CALL slm_displace(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_coord: real array of xy-coordinates		real
+! ON OUTPUT:
+!	r_alpha: displacement vectors to each point	real
+! CALLS:
+!	wind_field
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_update
+! FUNCTION:
+!	calculate the update to the velocity
+! SYNTAX:
+!	CALL slm_update(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_rside: array with right hand side values	real
+! ON OUTPUT:
+!	r_udate: array with new (updated) gid values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is trivial for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_upstream
+! FUNCTION:
+!	calculate right hand side of the equation (upstream values)
+! SYNTAX:
+!	CALL slm_upstream(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_alpha: displacement vectors to each point	real
+! ON OUTPUT:
+!	r_rside: array with right hand side values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is just interpolation for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_interpolate
+! FUNCTION:
+!	do the interpolation
+! SYNTAX:
+!	CALL slm_interpolate(grid, int, real, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	p_ogrid: grid handle to old grid (with data)	TYPE (grid_handle)
+!	r_fac:   factor at which point to interpolate	REAL
+!	i_arlen: array length for the following arrays	INTEGER
+!	r_coord: coordinate array (new grid)		REAL
+!	r_alpha: displacement array (corr. to r_coord)	REAL
+!	r_value: values on the old grid (array)		REAL
+! ON OUTPUT:
+!	r_rside: right hand side (interpolated)		REAL
+! CALLS:
+!
+! COMMENTS:
+!	this one is plain bi-cubic spline interpolation
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_step
+! COMMENTS:
+!
+! USES:
+!	FLASH_parameters, GRID_api, ADV_wind, ADV_rhs
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	4/2002
+!	2. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_simple
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE GRID_api
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_step
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_step(p_ghand, p_param, p_time, r_modtime, i_size, &
+	                       r_coord, r_tracer, i_newsdepth)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                         :: p_param
+	  TYPE (sw_info), INTENT(inout)                             :: p_time
+	  REAL (KIND = GRID_SR), INTENT(in)                                          :: r_modtime
+	  INTEGER, INTENT(in)                                       :: i_size
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size), INTENT(in)        :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_size), INTENT(out)                      :: r_tracer
+	  INTEGER, OPTIONAL, INTENT(in)                             :: i_newsdepth
+	  
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE      :: r_newvl
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_alpha
+	  INTEGER                              :: i_alct
+
+!---------- check size!
+
+	  IF(i_size <= 0) THEN
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'INFO [slm_step]: Zero step size, returning to calling routine'
+	    RETURN
+	  END IF
+
+!---------- allocate auxiliary arrays
+
+	  allocate(r_newvl(i_size), r_alpha(GRID_dimension,i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(38)
+	  END IF not_alloc
+
+!-SLM--------- calculate trajectory pieces (displacements)
+
+	  CALL stop_watch('start',3,p_time)
+	  CALL slm_displace(p_param, i_size, r_coord, r_alpha, r_time=r_modtime)
+	  CALL stop_watch('stop ',3,p_time)
+
+!-SLM--------- calculate right hand side
+
+	  CALL stop_watch('start',4,p_time)
+	  CALL slm_upstream(p_ghand, i_size, r_coord, r_alpha, r_newvl)
+	  CALL stop_watch('stop ',4,p_time)
+
+!-SLM--------- calculate new grid values
+
+	  CALL stop_watch('start',5,p_time)
+	  CALL slm_update(p_param, i_size, r_coord, r_newvl, r_tracer, r_time=r_modtime)
+	  CALL stop_watch('stop ',5,p_time)
+
+!-SLM--------- put alpha values to u and v field entries
+
+	  r_alpha= -r_alpha
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_newsdepth=i_newsdepth, i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  ELSE
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  END IF
+
+!-SLM--------- deallocate work arrays
+
+	  deallocate(r_alpha, r_newvl)
+
+	  RETURN
+	  END SUBROUTINE slm_step
+
+!*****************************************************************
+	  SUBROUTINE slm_displace(p_param, i_arlen, r_coord, r_alpha, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                      :: p_param
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_alpha
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                           :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_fac, r_caf, &
+	    r_axy, r_xyc, r_sxy
+	  REAL (KIND = GRID_SR)                                                 :: r_dt0, r_dt1, &
+	    r_dt2, r_tim
+	  INTEGER                                              :: i_cnt1, i_cnt2
+          
+!---------- set constants
+
+	  r_dt0= p_param%num%r_deltatime
+	  r_dt1= 0.5_GRID_SR* p_param%num%r_deltatime
+	  r_dt2= 1.5_GRID_SR* p_param%num%r_deltatime
+	  r_fac= 0.5_GRID_SR
+	  r_caf= 2.0_GRID_SR
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- calculate in an iteration process the displacements
+
+	  unknown_loop: DO i_cnt1=1,i_arlen
+	    r_axy= 0.0_GRID_SR
+
+	    iter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_coord(:,i_cnt1)- r_fac* r_axy
+	      r_sxy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	      r_axy= sphere_correct(r_coord(:,i_cnt1),r_sxy)
+	    END DO iter_loop
+
+	    r_alpha(:,i_cnt1)= r_axy
+	  END DO unknown_loop
+
+	  RETURN
+	  END SUBROUTINE slm_displace
+
+!*****************************************************************
+	  SUBROUTINE slm_update(p_param, i_arlen, r_coord, r_rside, r_udate, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                   :: p_param
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_udate
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                          :: r_time
+	  INTEGER                                             :: i_cnt
+	  REAL (KIND = GRID_SR)                                                :: r_dt, r_tim
+
+!---------- in the linear advection case and with f90 this is just
+
+!	  r_udate= r_rside
+
+!---------- including a non-zero right hand side, we have
+
+	  r_dt= p_param%num%r_deltatime
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+	  main_loop: DO i_cnt=1, i_arlen
+	    r_udate(i_cnt)= r_rside(i_cnt)+ r_dt* slm_righthand(r_coord(:,i_cnt))
+	  END DO main_loop
+
+	  RETURN
+	  END SUBROUTINE slm_update
+
+!*****************************************************************
+	  SUBROUTINE slm_upstream(p_mesh, i_arlen, r_coord, &
+	                          r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                     :: r_fac
+
+!---------- set factor (at which point of trajectory shall i interpolate)
+
+	  r_fac= 1.0_GRID_SR
+
+!---------- in the linear advection case this is just interpolation
+
+	  CALL slm_interpolate(p_mesh, r_fac, i_arlen, r_coord, &
+	                       r_alpha, r_rside)
+
+	  RETURN
+	  END SUBROUTINE slm_upstream
+!*****************************************************************
+	  SUBROUTINE slm_interpolate(p_mesh, r_fac, i_arlen, &
+	                             r_coord, r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in)         :: r_fac
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE                   :: r_upstr
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_nodevalues)                    :: r_tval
+	  INTEGER, DIMENSION(GRID_elementnodes)               :: i_ttmp
+	  REAL (KIND = GRID_SR)                                                :: r_eps, r_max, r_min, r_tmp
+	  INTEGER                                             :: i_cnt, i_alct, i_val
+	  INTEGER                                             :: i_ind, i_tim, &
+	    j_cnt, i_out, i_stat
+
+!---------- initialize constant
+
+	  i_val= GRID_tracer
+	  r_eps= GRID_EPS
+	  i_tim= p_mesh(i_time)%i_timetag
+
+!---------- allocate work array
+
+	  ALLOCATE(r_upstr(GRID_dimension,i_arlen), stat=i_alct)
+	  not_allocated: IF(i_alct /= 0) THEN
+	    CALL grid_error(60)
+	  END IF not_allocated
+
+!---------- calculate upstream coordinates
+
+	  dim_loop: DO i_cnt=1, GRID_dimension
+	    r_upstr(i_cnt,:) = r_coord(i_cnt,:)- r_fac(i_cnt)* r_alpha(i_cnt,:)
+	  END DO dim_loop
+
+!---------- loop over nodes: find element containing upstream point
+
+	  node_loop: DO i_cnt=1, i_arlen
+
+!---------- check if upstream value is outside of the domain
+
+	    i_out= grid_domaincheck(p_mesh(i_time), r_upstr(:,i_cnt))
+
+!---------- take the intersection of the trajectory with the boundary as new upstream point
+
+	    out_domain: IF(i_out /= 0) then
+	       r_upstr(:,i_cnt)= grid_boundintersect(p_mesh(i_time), &
+	                        r_coord(:,i_cnt), r_upstr(:,i_cnt), i_info=i_stat)
+               no_intersect: IF(i_stat /= 0) THEN
+                  r_rside(i_cnt)= 0.0_GRID_SR
+                  CYCLE node_loop
+               END IF no_intersect
+	    END IF out_domain
+
+!---------- interpolate
+
+	    r_tmp= grid_coordvalue(p_mesh(i_time), r_upstr(:,i_cnt), &
+	           i_interpolorder=GRID_loworder, i_valpoint=i_val, &
+                   l_relative=.FALSE., l_sfcorder=.FALSE., &
+                   i_index=i_ind, i_domaincheck=0)
+
+	    index_valid: IF(i_ind > 0) THEN
+
+!---------- get nodes of element surrounding r_upstr
+
+	       CALL grid_getiteminfo(i_ind, 'elmt', i_arrlen=GRID_elementnodes, i_nodes=i_ttmp)
+
+!---------- get values at nodes of element surrounding r_upstr, and obtain min/max
+
+               r_min= 0.0_GRID_SR; r_max= 0.0_GRID_SR
+               elmt_loop: DO j_cnt=1,GRID_elementnodes
+                  CALL grid_getiteminfo(i_ttmp(j_cnt), 'node', i_arrlen=GRID_nodevalues, &
+                                        r_values= r_tval, i_time=i_tim)
+                  r_min= MIN(r_min, r_tval(i_val))
+                  r_max= MAX(r_max, r_tval(i_val))	      
+               END DO elmt_loop
+
+!---------- clip value
+
+               IF(r_tmp > r_max) THEN
+                  r_tmp= r_max
+               ELSE IF(r_tmp < r_min) THEN
+                  r_tmp= r_min
+               END IF
+	    END IF index_valid
+
+!---------- set interpolation value
+
+	    r_rside(i_cnt)= r_tmp
+	 
+	    small_val: IF(abs(r_rside(i_cnt)) < r_eps) THEN
+               r_rside(i_cnt)= 0.0_GRID_SR
+	    END IF small_val
+
+	  END DO node_loop
+
+!---------- deallocate work array
+
+	  DEALLOCATE(r_upstr)
+
+	  RETURN
+	  END SUBROUTINE slm_interpolate
+
+!*****************************************************************
+	  FUNCTION sphere_correct(r_coord, r_displ) RESULT (r_corct)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_coord, r_displ
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_corct
+
+	  REAL (KIND = GRID_SR)                            :: r_e, r_rat
+	  REAL (KIND = GRID_SR)                            :: r_c
+
+!---------- calculate Euklidean norm
+
+	  r_e  = eukl_norm(r_displ)
+	  r_rat= r_e/ GRID_RADIUS
+
+!---------- calculate correction
+
+	  r_c  = tan(r_rat)/r_rat
+	  r_corct= r_displ* r_c
+
+	  RETURN
+	  END FUNCTION sphere_correct
+
+!*****************************************************************
+	  FUNCTION eukl_norm(r_vec) RESULT(r_rst)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_vec
+	  REAL (KIND = GRID_SR)                            :: r_rst, r_tmp
+
+!---------- calculate vector crossproduct, 3D only
+
+	  r_tmp= dot_product(r_vec, r_vec)
+	  r_rst= sqrt(r_tmp)
+
+	  END FUNCTION eukl_norm
+
+	END MODULE SLM_simple
diff --git a/flash2d/src/options/ADV_rhs.algae.f90 b/flash2d/src/options/ADV_rhs.algae.f90
new file mode 100644
index 0000000..3387f3f
--- /dev/null
+++ b/flash2d/src/options/ADV_rhs.algae.f90
@@ -0,0 +1,94 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	ADV_rhs
+! FUNCTION:
+!	calculate the (nonhomogeneous) right hand side
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_righthand
+! FUNCTION:
+!	calculate the rhs of the advection equation
+! SYNTAX:
+!	real= slm_righthand(real.arr, real)
+! ON INPUT:
+!	r_coord: coordinates of point		real
+!	r_time:  time coordinate (optional)	real
+! ON OUTPUT:
+!	r_rhs:   right hand side value		real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!
+! COMMENTS:
+!	this is the homogeneous case!
+! USES:
+!	MISC_globalparam, MISC_error
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	2/98
+!	2. compliant to amatos 1.0	j. behrens	12/2000
+!	3. compliant to amatos 1.2	j. behrens	3/2002
+!
+!*****************************************************************
+	MODULE ADV_rhs
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC :: slm_righthand
+	  CONTAINS
+!*****************************************************************
+	  FUNCTION slm_righthand(r_coord, r_values, r_time) RESULT (r_rhs)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(2), INTENT(in), OPTIONAL    :: r_values
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                  :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(2)                          :: r_rhs
+	  REAL (KIND = GRID_SR)                                        :: r_tim
+	  REAL (KIND = GRID_SR)                                        :: r_secondsperday
+
+    REAL (KIND = GRID_SR) :: r_mumax, r_Topt, r_Tslope, r_Cmort, r_mu, r_tmp
+
+!---------- set constants
+
+    r_secondsperday = 86400._GRID_SR
+    r_mumax  = 0.5_GRID_SR/r_secondsperday  ! [per day]
+    r_Topt   = 22._GRID_SR   ! [°C]
+    r_Tslope = 5._GRID_SR    ! [°C]
+    r_Cmort  = 0.05_GRID_SR/r_secondsperday ! [per day]
+    
+!---------- set time
+
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0
+	  END IF
+
+!---------- compute growth
+
+    r_tmp= r_values(2)-r_Topt
+    r_mu = r_mumax* exp(-((r_tmp * r_tmp)/(r_Tslope * r_Tslope)))
+    
+!---------- calculate the advection at (x,y) (velocity increasing)
+
+	  r_rhs= 0.0
+	  r_rhs(1)= r_mu* r_values(1)- r_Cmort* r_values(1)
+	
+	  RETURN
+	  END FUNCTION slm_righthand
+
+!*****************************************************************
+	END MODULE ADV_rhs
diff --git a/flash2d/src/options/ADV_rhs.hom.f90 b/flash2d/src/options/ADV_rhs.hom.f90
new file mode 100644
index 0000000..546b4cd
--- /dev/null
+++ b/flash2d/src/options/ADV_rhs.hom.f90
@@ -0,0 +1,76 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	ADV_rhs
+! FUNCTION:
+!	calculate the (nonhomogeneous) right hand side
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_righthand
+! FUNCTION:
+!	calculate the rhs of the advection equation
+! SYNTAX:
+!	real= slm_righthand(real.arr, real)
+! ON INPUT:
+!	r_coord: coordinates of point		real
+!	r_time:  time coordinate (optional)	real
+! ON OUTPUT:
+!	r_rhs:   right hand side value		real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!
+! COMMENTS:
+!	this is the homogeneous case!
+! USES:
+!	MISC_globalparam, MISC_error
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	2/98
+!	2. compliant to amatos 1.0	j. behrens	12/2000
+!	3. compliant to amatos 1.2	j. behrens	3/2002
+!
+!*****************************************************************
+	MODULE ADV_rhs
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC :: slm_righthand
+	  CONTAINS
+!*****************************************************************
+	  FUNCTION slm_righthand(r_coord, r_time) RESULT (r_rhs)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                  :: r_time
+	  REAL (KIND = GRID_SR)                                        :: r_rhs
+	  REAL (KIND = GRID_SR)                                        :: r_tim
+
+!---------- set time
+
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0
+	  END IF
+
+!---------- calculate the advection at (x,y) (velocity increasing)
+
+	  r_rhs= 0.0
+	
+	  RETURN
+	  END FUNCTION slm_righthand
+
+!*****************************************************************
+	END MODULE ADV_rhs
diff --git a/flash2d/src/options/ADV_semilagrange.SW.F90 b/flash2d/src/options/ADV_semilagrange.SW.F90
new file mode 100644
index 0000000..568620c
--- /dev/null
+++ b/flash2d/src/options/ADV_semilagrange.SW.F90
@@ -0,0 +1,904 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!   ADV_semilagrange
+! FUNCTION:
+!   perform semi-Lagrangian for shallow water equations
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!   slm_adapt
+! FUNCTION:
+!   adapt the grid according to an error estimate
+! SYNTAX:
+!   CALL slm_adapt(grid, param, logical)
+! ON INPUT:
+!   p_ghand:   handle for the grid      TYPE (grid_handle)
+!   p_param:   global parameter structure   TYPE (global_param)
+! ON OUTPUT:
+!   l_changed: flag for changed grid    LOGICAL
+! CALLS:
+!
+! COMMENTS: NOT USED OR TESTED
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!   slm_initialize
+! FUNCTION:
+!   initialize the advection problem
+! SYNTAX:
+!   CALL slm_initialize(grid, param)
+! ON INPUT:
+!   p_param: parameter data structure   TYPE (global_param)
+! ON OUTPUT:
+!   p_ghand: grid handling data structure   TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!   slm_finish
+! FUNCTION:
+!   terminate slm (free dynamically alloc. memory, ...)
+! SYNTAX:
+!   CALL slm_finish(grid, param)
+! ON INPUT:
+!   p_ghand: grid handling data structure   TYPE (grid_handle)
+!   p_param: parameter data structure   TYPE (global_param)
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!   slm_timestepping
+! FUNCTION:
+!   perform the timestepping in the slm
+! SYNTAX:
+!   CALL slm_timestepping(grid, param, cmd)
+! ON INPUT:
+!   p_ghand: grid handling data structure   TYPE (grid_handle)
+!   p_param: parameter data structure   TYPE (global_param)
+!   p_cmdln: command line argument struct.  TYPE (cmdline)
+! ON OUTPUT:
+!   p_ghand: grid handling data structure   TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!   slm_displace, slm_update, slm_upstream
+!   slm_initialize, slm_finish, slm_timestepping
+! COMMENTS:
+!
+! USES:
+!   MISC_globalparam, MISC_error, FEM_handle
+!   FEM_errorestimate, FEM_param
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!   1. original version     j. behrens  10/96
+!   2. several improvements/fixes   j. behrens  11/96-1/97
+!   3. nodal values time depend.    j. behrens  1/97
+!   4. stop_watch removed, plot j. behrens  1/97
+!      (position) changed, inner
+!      iteration counter added
+!   5. slm_adapt changed        j. behrens  2/97
+!   6. slm_adapt changed to hide
+!      grid data structures     j. behrens  7/97
+!   7. control data structure   j. behrens  12/97
+!   8. non-homog. rhs added     j. behrens  2/98
+!   9. compliant to amatos 1.0  j. behrens  12/2000
+!   10. compliant to amatos 1.2 j. behrens  3/2002
+!   11. compliant to amatos 2.0 j. behrens  7/2003
+!       12. added visnetplot            f. klaschka     12/200
+!   13. modified for shallow water equations s.paruszewski 10/2014
+!
+!*****************************************************************
+    MODULE ADV_semilagrange
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE IO_vtuplot
+#ifndef NO_NETCDF
+	  USE IO_netcdfplot
+#endif
+	  USE IO_utils
+	  USE GRID_api
+	  USE SLM_errorestimate
+	  USE SLM_initial
+	  USE SLM_simple
+	  USE SLM_advanced
+	  USE ADV_wind
+	  USE ADV_rhs
+      PRIVATE
+      PUBLIC  :: slm_initialize, slm_finish, slm_timestepping
+      CONTAINS
+!*****************************************************************
+      SUBROUTINE slm_adapt(p_ghand, p_param, l_changed, l_water)
+
+
+!---------- local declarations
+
+      IMPLICIT NONE
+      TYPE (grid_handle), INTENT(inout)      :: p_ghand
+      TYPE (control_struct), INTENT(in)      :: p_param
+      LOGICAL, INTENT(out)                   :: l_changed
+      LOGICAL, OPTIONAL, INTENT(in)          :: l_water
+      LOGICAL                                :: l_switch
+      REAL (KIND = GRID_SR)                  :: r_errmx, &
+        r_refcrit, r_crscrit, r_fac
+      INTEGER                                :: i_size, &
+        i_manyc, i_manyr, i_alct, i_cnt
+      REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE        :: r_hAll
+      INTEGER, DIMENSION(:), ALLOCATABLE     :: i_aux1, i_aux2, i_aux3
+      LOGICAL                                :: l_ref, l_crs
+
+!---------- initialize refinement flag
+
+      l_changed= .FALSE.
+
+!---------- handle watermark switch
+
+      wat_present: IF(present(l_water)) THEN
+        l_switch= l_water
+      ELSE wat_present
+        l_switch= .TRUE.
+      END IF wat_present
+
+!---------- allocate work arrays
+
+      i_size= p_ghand%i_enumfine
+      allocate(r_hAll(i_size), i_aux1(i_size), i_aux2(i_size), &
+                   i_aux3(i_size), stat=i_alct)
+      not_alloc: IF(i_alct /= 0) THEN
+        CALL grid_error(35)
+      END IF not_alloc
+
+!---------- estimate the local error
+
+      CALL slm_errorest(p_ghand, i_size, r_hAll)
+
+!---------- set coarsening/refinement criterion
+
+      r_errmx= maxval(r_hAll(1:i_size))
+      r_crscrit= r_errmx* p_param%num%r_crstolerance
+      r_refcrit= r_errmx* p_param%num%r_reftolerance
+
+!---------- get level information and set up flags for refinement/coarsening
+
+      CALL grid_getinfo(p_ghand, l_finelevel= .TRUE., i_elementlevel= i_aux1, &
+                        i_elementstatus= i_aux3)
+      DO i_cnt=1,i_size
+        i_aux2(i_cnt)= 0
+        IF((i_aux1(i_cnt) > p_param%num%i_crslevel) .AND. &
+           (r_hAll(i_cnt) < r_crscrit)) i_aux2(i_cnt)= GRID_pleasecoarse
+        IF((i_aux1(i_cnt) < p_param%num%i_reflevel) .AND. &
+           (r_hAll(i_cnt) > r_refcrit)) i_aux2(i_cnt)= GRID_pleaserefine
+      END DO
+
+!---------- determine if there is enough to be done (this can be
+!           switched off by l_water=.FALSE.)
+
+      IF(l_switch) THEN
+        i_manyr= count(i_aux2 == GRID_pleaserefine)
+        r_fac= real(i_manyr,GRID_SR)/ real(i_size,GRID_SR)
+        enough_ref: IF(r_fac > p_param%num%r_refwatermark) THEN
+          l_ref= .TRUE.
+        ELSE
+          l_ref= .FALSE.
+        END IF enough_ref
+
+        i_manyc= count(i_aux2 == GRID_pleasecoarse)
+        r_fac= real(i_manyc,GRID_SR)/ real(i_size,GRID_SR)
+        enough_crs: IF(r_fac > p_param%num%r_crswatermark) THEN
+          l_crs= .TRUE.
+        ELSE
+          l_crs= .FALSE.
+        END IF enough_crs
+      ELSE
+        l_ref= .TRUE.
+        l_crs= .TRUE.
+      END IF
+
+!---------- update grid flags
+
+      update: IF(l_ref .OR. l_crs) THEN
+        IF(l_ref) i_aux3= merge(i_aux2, i_aux3, i_aux2==GRID_pleaserefine)
+        IF(l_crs) i_aux3= merge(i_aux2, i_aux3, i_aux2==GRID_pleasecoarse)
+        CALL grid_putinfo(p_ghand, l_finelevel= .TRUE., i_elementstatus= i_aux3)
+      END IF update
+
+!---------- deallocate work arrays
+
+      deallocate(r_hAll, i_aux1, i_aux2, i_aux3)
+
+!---------- adapt the grid
+
+      CALL grid_adapt(p_ghand, l_changed)
+
+      RETURN
+      END SUBROUTINE slm_adapt
+
+!*****************************************************************
+      SUBROUTINE slm_diagnostics(p_ghand, p_param, p_tinfo, c_action)
+
+!---------- local declarations
+
+      IMPLICIT NONE
+      TYPE (grid_handle), INTENT(in)           :: p_ghand
+      TYPE (control_struct), INTENT(inout)     :: p_param
+      TYPE (rt_info), INTENT(in)               :: p_tinfo
+      CHARACTER (len=4), INTENT(in), OPTIONAL  :: c_action
+      INTEGER, SAVE                            :: i_iodiag
+      CHARACTER (len=32)                       :: c_file
+      CHARACTER (len=28)                       :: c_tmp
+      REAL (KIND = GRID_SR), PARAMETER                          :: r_1o3= (1./3.)
+      INTEGER                                  :: i_fst, i_tmp, &
+        i_size, i_alct, i_1, i_2, i_4, i_6, i_cnt
+      REAL (KIND = GRID_SR), SAVE                               :: r_rfm0, r_rsm0
+      REAL (KIND = GRID_SR)                                     :: r_dispn, r_rfm, r_rsm, &
+        r_ts, r_calci, r_calcs, r_mxnrm, r_l2nrm, r_max, r_min, r_diffn, &
+        r_medln, r_huglobal, r_hglobal, r_minHu, r_maxHu, r_minHv, r_maxHv
+      REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE          :: r_hAll, r_aux2, &
+        r_aux3, r_aux4, r_aux6
+      REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_auxx,r_huAll, r_momaux, r_veloAux
+      INTEGER, DIMENSION(1)                    :: i_valind
+
+!---------- action init
+
+      present_act: IF(present(c_action)) THEN
+        action_type: IF(c_action == 'init') THEN
+
+!---------- open file for diagnostic output
+
+          i_iodiag= 9
+          i_tmp   = p_param%num%i_experiment
+          write(c_tmp,*) trim(GRID_parameters%program_name), '_diag.'
+          write(c_file,1010) trim(c_tmp), i_tmp
+          c_file= adjustl(c_file)
+          open(i_iodiag, file= c_file, action= 'write', form= 'formatted', &
+               iostat= i_fst)
+          not_opened: IF(i_fst /= 0) THEN
+            CALL grid_error(36)
+          END IF not_opened
+          IF(GRID_parameters%iolog > 0) &
+            write(GRID_parameters%iolog,*) 'INFO: Filename: ', c_file, ' opened on unit: ', i_iodiag
+
+!---------- allocate workspace
+
+          i_size= p_ghand%i_nnumber
+          allocate(r_hAll(i_size), r_aux2(i_size), r_aux3(i_size), &
+                   r_aux4(i_size), r_aux6(i_size), r_huAll(GRID_dimension, i_size),&
+                    r_veloAux(GRID_dimension,i_size),r_momaux(GRID_dimension, i_size),&
+                   r_auxx(1,i_size), stat=i_alct)
+          not_alloc: IF(i_alct /= 0) THEN
+            CALL grid_error(37)
+          END IF not_alloc 
+          r_hAll= 0.0; r_aux2= 0.0; r_aux3= 0.0; r_aux4= 0.0
+
+!---------- get minimum edge length
+
+          CALL grid_edgelength(p_ghand, r_min=r_medln)
+
+!---------- calculate reference values, ... extract actual calculated concentration
+
+!----------  H ------
+          i_valind= (/ GRID_h/)
+          CALL grid_getinfo(p_ghand, i_arraypoint=i_valind, &
+                            r_nodevalues= r_auxx)
+         
+          r_hAll(:)= r_auxx(1,:)
+
+          DEALLOCATE(r_auxx)
+
+!----------  H global r_hAll------            
+      r_hglobal=0.0_GRID_SR
+      
+               
+      DO i_cnt=1,i_size
+         r_hglobal=r_hglobal+r_hAll(i_cnt)
+      END DO
+      r_hglobal=r_hglobal/i_size
+
+
+!----------  HU global    (HU) r_huAll ------       
+       r_huglobal=0.0_GRID_SR    
+      CALL grid_getinfo(p_ghand, i_arraypoint=(/ GRID_hu, GRID_hv /), &
+               r_nodevalues= r_huAll)
+     
+      DO i_cnt=1,i_size
+        r_aux6(i_cnt)=sqrt(r_huAll(1,i_cnt)*r_huAll(1,i_cnt)+r_huAll(2,i_cnt)*r_huAll(2,i_cnt))
+      END DO
+           
+!---------- calculate area pieces for each node
+
+          CALL grid_nodearea(p_ghand, i_size, r_aux2)
+
+!---------- calculate analytical solution  r_aux3 = h
+
+          r_ts= p_param%num%r_deltatime* float(p_tinfo%i_step)
+          CALL slm_analyticsolution(p_ghand, r_ts, i_size, r_aux3, r_momaux, r_veloAux)
+
+
+           r_huglobal= dot_product(r_aux6, r_aux2)
+
+!---------- now the integral of the concentration (mass) is
+
+          r_calci= dot_product(r_hAll, r_aux2)
+          r_rfm0 = r_calci
+
+
+!---------- the integral of the squared concentration ("entropy"(?)) is
+
+          r_aux4 = r_hAll* r_hAll
+          r_calcs= dot_product(r_aux4, r_aux2)
+          r_rsm0 = r_calcs
+
+!---------- the maximum-norm of the error is
+
+          r_aux4 = abs(r_hAll- r_aux3)
+          r_mxnrm= maxval(r_aux4)
+
+!---------- the l2-norm of the error is
+
+          r_aux4 = r_aux4* r_aux4
+          r_l2nrm= dot_product(r_aux4, r_aux2)
+
+!---------- maximum and minimum
+
+          r_max  = maxval(r_hAll)
+          r_min  = minval(r_hAll)
+
+          r_minHu = minval(r_huAll(1,:))
+          r_minHv = minval(r_huAll(2,:))
+
+          r_maxHu = maxval(r_huAll(1,:))
+          r_maxHv = maxval(r_huAll(2,:))
+
+!---------- diffusion and dispersion (not yet implemented)
+
+          r_diffn= 0.0
+          r_dispn= 0.0
+
+!---------- print it
+          i_1= p_tinfo%i_step
+          i_2= p_ghand%i_enumber
+          i_4= p_ghand%i_gnumber
+          i_6= p_ghand%i_nnumber
+          write(i_iodiag,1101) r_medln
+          write(i_iodiag,1102) i_2
+          write(i_iodiag,1103) i_4
+          write(i_iodiag,1104) i_6
+
+          r_rfm= r_calci/r_rfm0
+          r_rsm= r_calcs/r_rsm0
+          write(i_iodiag,1100) GRID_parameters%program_name, GRID_parameters%version, &
+                               GRID_parameters%subversion, GRID_parameters%patchversion
+          write(i_iodiag,1000) i_1, r_min, r_max, r_minHu, r_minHv, r_maxHu,&
+                               r_maxHv, r_rfm, r_rsm,&
+                               r_mxnrm, r_l2nrm, r_hglobal,r_huglobal
+                   
+!---------- deallocate workspace
+
+          deallocate(r_hAll, r_aux2, r_aux3, r_aux4, r_huAll, r_aux6)
+
+!---------- initialization done
+
+          RETURN
+
+!---------- action quit
+
+        ELSE IF(c_action == 'quit') THEN action_type
+
+!---------- close diagnostic output file
+
+          close(i_iodiag)
+          IF(GRID_parameters%iolog > 0) &
+            write(GRID_parameters%iolog,*) 'INFO: Closed file on unit: ', i_iodiag
+
+!---------- action quit done
+
+          RETURN
+        END IF action_type
+      END IF present_act
+
+!---------- action diag (default): allocate workspace
+
+      i_size= p_ghand%i_nnumber
+      allocate(r_hAll(i_size), r_aux2(i_size), r_aux3(i_size), &
+               r_aux4(i_size),r_aux6(i_size), r_auxx(1,i_size), r_huAll(GRID_dimension,i_size),&
+                r_veloAux(GRID_dimension,i_size), r_momaux(GRID_dimension,i_size),&
+                stat=i_alct)
+      not_allc: IF(i_alct /= 0) THEN
+        CALL grid_error(37)
+      END IF not_allc 
+      r_hAll= 0.0; r_aux2= 0.0; r_aux3= 0.0; r_aux4= 0.0; r_huAll=0.0
+
+
+!---------- calculate reference values, ... extract actual calculated concentration
+
+!---------- get the height and calculate the global height (mass)
+      i_valind= (/ GRID_h /)
+      CALL grid_getinfo(p_ghand, i_arraypoint=i_valind, &
+               r_nodevalues= r_auxx)
+      r_hAll(:)= r_auxx(1,:)
+      DEALLOCATE(r_auxx)
+
+         
+      r_hglobal=0.0_GRID_SR
+      r_huglobal=0.0_GRID_SR     
+               
+      DO i_cnt=1,i_size
+         r_hglobal=r_hglobal+r_hAll(i_cnt)
+      END DO
+      r_hglobal=r_hglobal/i_size
+      
+      
+      
+      
+    
+      CALL grid_getinfo(p_ghand, i_arraypoint=(/ GRID_hu, GRID_hv /), &
+               r_nodevalues= r_huAll)
+     
+      DO i_cnt=1,i_size
+        r_aux6(i_cnt)=sqrt(r_huAll(1,i_cnt)*r_huAll(1,i_cnt)+r_huAll(2,i_cnt)*r_huAll(2,i_cnt))
+      END DO
+           
+!---------- calculate area pieces for each node
+
+          CALL grid_nodearea(p_ghand, i_size, r_aux2)
+
+!---------- calculate analytical solution
+
+          r_ts= p_param%num%r_deltatime* float(p_tinfo%i_step)
+          CALL slm_analyticsolution(p_ghand, r_ts, i_size, r_aux3, r_momaux, r_veloAux)
+           r_huglobal= dot_product(r_aux6, r_aux2)
+
+
+!---------- now the integral of the concentration (mass) is
+
+          r_calci= dot_product(r_hAll, r_aux2)
+  !        r_rfm0 = r_calci
+
+
+
+!---------- the integral of the squared concentration ("entropy"(?)) is
+
+      r_aux4 = r_hAll* r_hAll
+      r_calcs= dot_product(r_aux4, r_aux2)
+
+!---------- the maximum-norm of the error is
+
+      r_aux4 = abs(r_hAll- r_aux3)
+      r_mxnrm= maxval(r_aux4)
+
+!---------- the l2-norm of the error is
+
+      r_aux4 = r_aux4* r_aux4
+      r_l2nrm= dot_product(r_aux4, r_aux2)
+
+!---------- maximum and minimum
+
+      r_max  = maxval(r_hAll)
+      r_min  = minval(r_hAll)
+      
+      r_minHu = minval(r_huAll(1,:))
+      r_minHv = minval(r_huAll(2,:))
+
+      r_maxHu = maxval(r_huAll(1,:))
+      r_maxHv = maxval(r_huAll(2,:))
+
+!---------- diffusion and dispersion (not yet implemented)
+
+      r_diffn= 0.0
+      r_dispn= 0.0
+
+!---------- print it
+
+      r_rfm= r_calci/r_rfm0
+      r_rsm= r_calcs/r_rsm0
+      i_1= p_tinfo%i_step
+
+      write(i_iodiag,1000) i_1, r_min, r_max, r_minHu, r_minHv, r_maxHu,&
+                               r_maxHv, r_rfm, r_rsm,&
+                               r_mxnrm, r_l2nrm, r_hglobal,r_huglobal
+
+!---------- deallocate workspace
+
+      deallocate(r_hAll, r_aux2, r_aux3, r_aux4, r_huAll, r_aux6, r_veloAux)
+
+      RETURN
+ 1000     FORMAT(1x, i10, 1x, e15.8, 1x, e15.8 , 1x, e15.8, 1x, e15.8, &
+             1x, e15.8, 1x, e15.8, 1x, e15.8, 1x, e15.8,&
+             1x, e15.8, 1x, e15.8, 1x, e15.8, 1x, e15.8)
+ 1010     FORMAT(a28,i4.4)
+ 1100     FORMAT(1x,'*******************************************', &
+                '*******************************************', &
+                '*******************************************', &
+                '*******************************************', &
+                '*************************************',/ &
+             1x,'***** PROGRAM: ',a15,174x,'*****',/ &
+             1x,'***** VERSION: ',i2.2,'.',i2.2,'.',i2.2,181x,'*****',/ &
+             1x,'***** Diagnostic output ',180x,'*****',/ &
+             1x,'*******************************************', &
+                '*******************************************', &
+                '*******************************************', &
+                '*******************************************', &
+                '*************************************',/&
+             1x,'* timestep       ', '  minimum h  ', &
+                '    maximum h  ','     minimum hu ', '     minimum hv ',&
+                '     maximum hu ','     maximum hv ',&
+                '            RFM ','            RSM ', &
+                '                   max-norm ','        l2-norm ',&
+                '     h_global ','            hu_global*',/ &
+            1x,'*******************************************', &
+                '*******************************************', &
+                '*******************************************', &
+                '******************************************', &
+                '**************************************')
+ 1101      FORMAT('Length Edge of Grid',  e15.8)
+ 1102      FORMAT('Number of elements', i10)
+ 1103      FORMAT('Number of edges', i10)
+ 1104      FORMAT('Number of nodes', i10)
+
+      END SUBROUTINE slm_diagnostics
+
+!*****************************************************************
+      SUBROUTINE slm_initialize(p_ghand, p_param)
+
+!---------- local declarations
+
+      IMPLICIT NONE
+
+      TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(out) :: p_ghand
+      TYPE (control_struct), INTENT(inout)          :: p_param
+
+      INTEGER                                     :: i_steps
+      CHARACTER (len=32)                          :: c_file
+      CHARACTER (len=28)                          :: c_tmp
+      INTEGER                                     :: i_tmp, i_cnt
+      LOGICAL                                     :: l_refined
+      INTEGER                                     :: i_vertnum
+      REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER               :: r_vertinit
+
+!---------- decide whether a new experiment is startet or an old one is continued
+
+      new_experiment: IF(p_param%num%i_experiment <= 0) THEN
+
+!---------- reset timesteps (start with 1 in any case)
+
+        time_one: IF(p_param%num%i_frsttimestep /= 1) THEN
+          IF(GRID_parameters%iolog > 0) &
+            write(GRID_parameters%iolog,*) 'WARNING      : Timestep counters reset due to new experiment'
+          i_steps= p_param%num%i_lasttimestep- p_param%num%i_frsttimestep
+          p_param%num%i_frsttimestep= 1
+          p_param%num%i_lasttimestep= p_param%num%i_frsttimestep+ i_steps
+        END IF time_one
+
+!-----my own problem-specific-variables (those names need to be added in FLASH_parameters.F90)
+
+         CALL add_grid_params()
+
+!---------- initialize grid parameters
+
+        CALL grid_setparameter(p_ghand, i_coarselevel= p_param%num%i_crslevel, &
+                               i_finelevel= p_param%num%i_reflevel)
+
+!---------- define domain, first read data from file (compiled here)
+
+        CALL grid_readdomain(i_vertnum, r_vertinit, c_readfile=p_param%io%c_domainfile)
+        CALL grid_definegeometry(i_vertnum, r_vertexarr= r_vertinit)
+
+!---------- create initial triangulation
+
+        CALL grid_createinitial(p_ghand, c_filename=p_param%io%c_triangfile)
+
+!---------- initialize grid and adapt at steep gradients
+
+        i_cnt= 0
+        l_refined= .TRUE.
+        refine_loop: DO WHILE (l_refined)
+          CALL slm_initialvalues(p_ghand(i_timeplus))
+          CALL slm_adapt(p_ghand(i_timeplus), p_param, l_refined, &
+                         l_water=.FALSE.)
+        END DO refine_loop
+
+!---------- duplicate grid (old time)
+
+        CALL grid_timeduplicate(p_ghand(i_timeplus), p_ghand(i_time))
+
+!---------- initialize wind field calculation
+
+        CALL slm_windinit(p_param)
+
+!---------- if an old experiment is to be continued from stored data:
+
+      ELSE new_experiment
+
+!---------- create grid from saveset, first compile filename
+
+        i_tmp= p_param%num%i_experiment- 1
+        write(c_tmp,*) trim(GRID_parameters%program_name), '_save.'
+        write(c_file,1010) trim(c_tmp), i_tmp
+        c_file= adjustl(c_file)
+
+        CALL grid_readinitial(p_ghand, c_file)
+
+!---------- initialize wind field calculation
+
+        CALL slm_windinit(p_param)
+
+      END IF new_experiment
+
+      RETURN
+ 1010     FORMAT(a28,i4.4)
+      END SUBROUTINE slm_initialize
+
+!*****************************************************************
+      SUBROUTINE slm_finish(p_ghand, p_param)
+
+!---------- local declarations
+
+      IMPLICIT NONE
+
+      TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+      TYPE (control_struct), INTENT(in)                          :: p_param
+      CHARACTER (len=32)                                       :: c_file
+      CHARACTER (len=28)                                       :: c_tmp
+      INTEGER                                                  :: i_tmp
+
+!---------- open and write saveset, if required
+
+      save_req: IF(p_param%io%i_savelast /= 0) THEN
+
+        i_tmp= p_param%num%i_experiment
+        write(c_tmp,*) trim(GRID_parameters%program_name), '_save.'
+        write(c_file,1010) trim(c_tmp), i_tmp
+        c_file= adjustl(c_file)
+        CALL grid_writesaveset(c_file, p_ghand)
+
+!---------- write parameter file for next experiment
+
+        CALL io_putinputfile(p_param)
+      END IF save_req
+
+!---------- gracefully terminate wind field calculations
+
+      CALL slm_windquit
+
+      RETURN
+ 1010     FORMAT(a28,i4.4)
+      END SUBROUTINE slm_finish
+
+!*****************************************************************
+      SUBROUTINE slm_timestepping(p_ghand, p_param)
+
+!---------- local declarations
+
+      IMPLICIT NONE
+
+      INTEGER, PARAMETER                   :: i_innermax=15
+      TYPE (grid_handle), DIMENSION(GRID_timesteps), &
+                          INTENT(inout)    :: p_ghand
+      TYPE (control_struct), INTENT(inout) :: p_param
+      INTEGER                              :: i_timecount
+      TYPE (sw_info)                       :: p_time, p_timeaux
+      LOGICAL                              :: l_refined
+      REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_coord, r_aux
+      CHARACTER (len=32)                   :: c_file, c_matfile
+      CHARACTER (len=28)                   :: c_tmp
+      INTEGER                              :: i_tmp, &
+        i_size, i_alct, i_tst, i_fst
+      INTEGER                              :: i_iomatl=21
+      REAL (KIND = GRID_SR)                :: r_modtime
+          INTEGER                              :: i_loopquit
+      INTEGER                              :: i_newlen
+      INTEGER, DIMENSION(1)                :: i_valind
+        
+        
+!---------- VISNET variable init
+
+        i_loopquit = 0
+
+!---------- initialize timestep info structure
+
+      p_timestepinfo%i_step       = 0
+      p_timestepinfo%i_adapit     = 0
+      p_timestepinfo%l_ploted     = .FALSE.
+      p_timestepinfo%l_saved      = .FALSE.
+      p_timestepinfo%r_modeltime  = 0.0
+
+!---------- initialize timing structure
+
+      p_time%p_tim%r_tim   = 0.0
+      p_time%p_tim%r_lap   = 0.0
+      p_time%p_tim%c_tim   = '                '
+      p_timeaux%p_tim%r_tim= 0.0
+      p_timeaux%p_tim%r_lap= 0.0
+      p_timeaux%p_tim%c_tim= '                '
+
+!---------- initialize stop watches
+
+      CALL stop_watch_init(1,(/'total time      '/),p_timeaux)
+      CALL stop_watch_init(8,(/'plotting        ', 'grid duplication', &
+                               'trajectory calc.', 'right hand side ', &
+                               'grid value updt.', 'grid adaption   ', &
+                               'diagnostics     ', 'whole timestep  '/), p_time)
+                               
+!---------- if diagnostics are demanded, initialize diagnostical output
+
+      IF(p_param%io%l_diagnostics) THEN
+        p_timestepinfo%i_step= 0
+        CALL slm_diagnostics(p_grid(i_timeplus), p_param, p_timestepinfo, c_action='init')
+      END IF
+
+!---------- plot initial data
+
+
+	  i_timecount= 0
+#ifndef NO_NETCDF
+	  IF(p_param%io%l_netcdf) THEN
+	    CALL plot_netcdf(p_ghand(i_timeplus), i_time=i_timecount)
+      END IF
+#endif
+	  IF(p_param%io%l_vtu) THEN
+	    CALL generate_vtu(p_ghand(i_timeplus), i_time=i_timecount)
+	  END IF
+      
+!---------- put out initial information
+
+      CALL io_putruntimeinfo(p_ghand(i_timeplus), p_timestepinfo, p_time)
+
+!---------- timestep loop
+
+      CALL stop_watch('start',1,p_timeaux)
+      CALL stop_watch('start',8,p_time)
+      i_timecount = 0_GRID_SI
+      p_timestepinfo%r_modeltime = p_param%num%r_starttime
+      time_loop: DO WHILE (p_timestepinfo%r_modeltime < p_param%num%r_finaltime - p_param%num%r_deltatime)
+        i_timecount                = i_timecount+ 1_GRID_SI
+        p_timestepinfo%i_step      = i_timecount
+        p_timestepinfo%r_modeltime = p_timestepinfo%r_modeltime + p_param%num%r_deltatime
+        p_timestepinfo%i_adapit    = 0_GRID_SI
+
+!---------- duplicate old grid, use it as first guess for new grid
+
+        CALL stop_watch('start',2,p_time)
+        CALL grid_timeduplicate(p_ghand(i_time), p_ghand(i_timeplus))
+        CALL stop_watch('stop ',2,p_time)
+
+!---------- adaptive (inner) loop
+
+!--------- Adaptivity is not considered!
+        l_refined= .TRUE.
+!       adap_loop: DO WHILE(l_refined .AND. p_timestepinfo%i_adapit < i_innermax)
+!         p_timestepinfo%i_adapit= p_timestepinfo%i_adapit+ 1
+!       END DO adap_loop
+        
+
+        i_size= p_ghand(i_timeplus)%i_nnumber
+        allocate(r_coord(GRID_dimension,i_size), stat=i_alct)
+        not_allocfinal: IF(i_alct /= 0) THEN
+          CALL grid_error(38)
+        END IF not_allocfinal
+
+!-SLM--------- do the following SLM calculations in arrays (grid-point-wise)
+
+        CALL grid_getinfo(p_ghand(i_timeplus), l_sfcorder=.TRUE. ,r_nodecoordinates=r_coord)
+
+
+!-SLM--------- call the SLM step
+
+        r_modtime= p_timestepinfo%r_modeltime- p_param%num%r_deltatime
+        CALL slm_astep(p_ghand, p_param, p_time, r_modtime, i_size, r_coord)
+
+!-SLM--------- update grid data structure and deallocate work arrays
+!-SLM--------- change back from (grid-point)arrays to grid data structure
+          deallocate(r_coord)
+
+!---------- diagnostics, if requested
+
+        IF(p_param%io%l_diagnostics) THEN
+          CALL stop_watch('start',7,p_time)
+          CALL slm_diagnostics(p_grid(i_timeplus), p_param, p_timestepinfo, c_action='diag')
+          CALL stop_watch('stop ',7,p_time)
+        END IF
+
+!---------- plot data (every [i_plotoffset]th timestep)
+
+	    CALL stop_watch('start',1,p_time)
+	    plot_step: IF(mod(i_timecount, p_param%io%i_plotoffset) == 0) THEN
+	      IF((p_param%io%l_netcdf) .OR. (p_param%io%l_vtu)) &
+	        p_timestepinfo%l_ploted= .TRUE.
+
+#ifndef NO_NETCDF
+	      IF(p_param%io%l_netcdf) THEN
+	        CALL plot_netcdf(p_ghand(i_timeplus), i_time=i_timecount)
+	      END IF
+#endif
+	      IF(p_param%io%l_vtu) THEN
+	        CALL generate_vtu(p_ghand(i_timeplus), i_time=i_timecount)
+	      END IF
+	    END IF plot_step
+	    CALL stop_watch('stop ',1,p_time)
+
+!---------- put a saveset to disc every ... timesteps
+
+        save_step: IF((mod(i_timecount, p_param%io%i_saveoffset) == 0) .AND. &
+                      (i_timecount > 1)) THEN
+          i_tmp= p_param%num%i_experiment
+          write(c_tmp,*) trim(GRID_parameters%program_name), '_save.'
+          write(c_file,1010) trim(c_tmp), i_tmp
+          c_file= adjustl(c_file)
+          CALL grid_writesaveset(c_file,p_ghand)
+          p_timestepinfo%l_saved= .TRUE.
+        END IF save_step
+
+!---------- runtime information output
+
+        CALL stop_watch('stop ',8,p_time)
+        CALL io_putruntimeinfo(p_ghand(i_timeplus), p_timestepinfo, p_time)
+        CALL stop_watch_init(8,(/'plotting        ', 'grid duplication', &
+                                 'trajectory calc.', 'right hand side ', &
+                                 'grid value updt.', 'grid adaption   ', &
+                                 'diagnostics     ', 'whole timestep  '/), p_time)
+        CALL stop_watch('start',8,p_time)
+
+!---------- remove obsolecent grid items
+
+        CALL grid_sweep
+
+!---------- toggle time handles for next step if gfx-proces has not exited
+
+        CALL grid_timetoggle
+
+!---------- exit loop if graphics process has been terminated
+
+            IF (i_loopquit /= 0) EXIT time_loop
+
+      END DO time_loop
+      CALL stop_watch('stop ',1,p_timeaux)
+
+!---------- print total time
+
+      write(GRID_parameters%ioout,1005)
+      write(GRID_parameters%ioout,1003) p_timeaux%p_tim(1)%r_tim
+      write(GRID_parameters%ioout,1004)
+      IF(GRID_parameters%iolog > 0) THEN
+        write(GRID_parameters%iolog,1003) p_timeaux%p_tim(1)%r_tim
+      END IF
+
+!---------- terminate diagnostics
+
+      IF(p_param%io%l_diagnostics) THEN
+        CALL slm_diagnostics(p_grid(i_timeplus), p_param, p_timestepinfo, c_action='quit')
+      END IF
+
+      RETURN
+ 1000     FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/ &
+             1x,'*****            Runtime Information Output           *****',/ &
+             1x,'***** ----- ----- ----- ----- ----- ----- ----- ----- *****')
+ 1003     FORMAT(1x,'***** Total time for timesteps ',10x,e12.4,' *****')
+ 1004     FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/)
+ 1005     FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/ &
+             1x,'*****             Final Information Output            *****',/ &
+             1x,'***** ----- ----- ----- ----- ----- ----- ----- ----- *****')
+ 1010     FORMAT(a28,i4.4)
+      END SUBROUTINE slm_timestepping
+
+!*****************************************************************
+   
+
+
+    END MODULE ADV_semilagrange
diff --git a/flash2d/src/options/ADV_semilagrange.adv.F90 b/flash2d/src/options/ADV_semilagrange.adv.F90
new file mode 100644
index 0000000..918bb60
--- /dev/null
+++ b/flash2d/src/options/ADV_semilagrange.adv.F90
@@ -0,0 +1,883 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	ADV_semilagrange
+! FUNCTION:
+!	perform semi-Lagrangian advection
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_adapt
+! FUNCTION:
+!	adapt the grid according to an error estimate
+! SYNTAX:
+!	CALL slm_adapt(grid, param, logical)
+! ON INPUT:
+!	p_ghand:   handle for the grid		TYPE (grid_handle)
+!	p_param:   global parameter structure	TYPE (global_param)
+! ON OUTPUT:
+!	l_changed: flag for changed grid	LOGICAL
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialize
+! FUNCTION:
+!	initialize the advection problem
+! SYNTAX:
+!	CALL slm_initialize(grid, param)
+! ON INPUT:
+!	p_param: parameter data structure	TYPE (global_param)
+! ON OUTPUT:
+!	p_ghand: grid handling data structure	TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_finish
+! FUNCTION:
+!	terminate slm (free dynamically alloc. memory, ...)
+! SYNTAX:
+!	CALL slm_finish(grid, param)
+! ON INPUT:
+!	p_ghand: grid handling data structure	TYPE (grid_handle)
+!	p_param: parameter data structure	TYPE (global_param)
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_timestepping
+! FUNCTION:
+!	perform the timestepping in the slm
+! SYNTAX:
+!	CALL slm_timestepping(grid, param, cmd)
+! ON INPUT:
+!	p_ghand: grid handling data structure	TYPE (grid_handle)
+!	p_param: parameter data structure	TYPE (global_param)
+!	p_cmdln: command line argument struct.	TYPE (cmdline)
+! ON OUTPUT:
+!	p_ghand: grid handling data structure	TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_displace, slm_update, slm_upstream
+!	slm_initialize, slm_finish, slm_timestepping
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, FEM_handle
+!	FEM_errorestimate, FEM_param
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	10/96
+!	2. several improvements/fixes	j. behrens	11/96-1/97
+!	3. nodal values time depend.	j. behrens	1/97
+!	4. stop_watch removed, plot	j. behrens	1/97
+!	   (position) changed, inner
+!	   iteration counter added
+!	5. slm_adapt changed 		j. behrens	2/97
+!	6. slm_adapt changed to hide
+!	   grid data structures		j. behrens	7/97
+!	7. control data structure	j. behrens	12/97
+!	8. non-homog. rhs added		j. behrens	2/98
+!	9. compliant to amatos 1.0	j. behrens	12/2000
+!	10. compliant to amatos 1.2	j. behrens	3/2002
+!	11. compliant to amatos 2.0	j. behrens	7/2003
+!       12. added visnetplot            f. klaschka     12/2003
+!
+!*****************************************************************
+	MODULE ADV_semilagrange
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE IO_vtuplot
+#ifndef NO_NETCDF
+	  USE IO_netcdfplot
+#endif
+	  USE IO_utils
+	  USE GRID_api
+	  USE SLM_errorestimate
+	  USE SLM_initial
+	  USE SLM_simple
+	  USE SLM_advanced
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_initialize, slm_finish, slm_timestepping
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_adapt(p_ghand, p_param, l_changed, l_water)
+
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (grid_handle), INTENT(inout)      :: p_ghand
+	  TYPE (control_struct), INTENT(in)      :: p_param
+	  LOGICAL, INTENT(out)                   :: l_changed
+	  LOGICAL, OPTIONAL, INTENT(in)          :: l_water
+	  LOGICAL                                :: l_switch
+	  REAL (KIND = GRID_SR)                  :: r_errmx, &
+	    r_refcrit, r_crscrit, r_fac
+	  INTEGER                                :: i_size, &
+	    i_manyc, i_manyr, i_alct, i_cnt
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE        :: r_aux1
+	  INTEGER, DIMENSION(:), ALLOCATABLE     :: i_aux1, i_aux2, i_aux3
+	  LOGICAL                                :: l_ref, l_crs
+
+!---------- initialize refinement flag
+
+	  l_changed= .FALSE.
+
+!---------- handle watermark switch
+
+	  wat_present: IF(present(l_water)) THEN
+	    l_switch= l_water
+	  ELSE wat_present
+	    l_switch= .TRUE.
+	  END IF wat_present
+
+!---------- allocate work arrays
+
+	  i_size= p_ghand%i_enumfine
+	  allocate(r_aux1(i_size), i_aux1(i_size), i_aux2(i_size), &
+                   i_aux3(i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(35)
+	  END IF not_alloc
+
+!---------- estimate the local error
+
+	  CALL slm_errorest(p_ghand, i_size, r_aux1)
+
+!---------- set coarsening/refinement criterion
+
+	  r_errmx= maxval(r_aux1(1:i_size))
+	  r_crscrit= r_errmx* p_param%num%r_crstolerance
+	  r_refcrit= r_errmx* p_param%num%r_reftolerance
+
+!---------- get level information and set up flags for refinement/coarsening
+
+	  CALL grid_getinfo(p_ghand, l_finelevel= .TRUE., i_elementlevel= i_aux1, &
+	                    i_elementstatus= i_aux3)
+	  DO i_cnt=1,i_size
+	    i_aux2(i_cnt)= 0
+	    IF((i_aux1(i_cnt) > p_param%num%i_crslevel) .AND. &
+	       (r_aux1(i_cnt) < r_crscrit)) i_aux2(i_cnt)= GRID_pleasecoarse
+	    IF((i_aux1(i_cnt) < p_param%num%i_reflevel) .AND. &
+	       (r_aux1(i_cnt) > r_refcrit)) i_aux2(i_cnt)= GRID_pleaserefine
+	  END DO
+
+!---------- determine if there is enough to be done (this can be
+!           switched off by l_water=.FALSE.)
+
+	  IF(l_switch) THEN
+	    i_manyr= count(i_aux2 == GRID_pleaserefine)
+	    r_fac= real(i_manyr,GRID_SR)/ real(i_size,GRID_SR)
+	    enough_ref: IF(r_fac > p_param%num%r_refwatermark) THEN
+	      l_ref= .TRUE.
+	    ELSE
+	      l_ref= .FALSE.
+	    END IF enough_ref
+
+	    i_manyc= count(i_aux2 == GRID_pleasecoarse)
+	    r_fac= real(i_manyc,GRID_SR)/ real(i_size,GRID_SR)
+	    enough_crs: IF(r_fac > p_param%num%r_crswatermark) THEN
+	      l_crs= .TRUE.
+	    ELSE
+	      l_crs= .FALSE.
+	    END IF enough_crs
+	  ELSE
+	    l_ref= .TRUE.
+	    l_crs= .TRUE.
+	  END IF
+
+!---------- update grid flags
+
+	  update: IF(l_ref .OR. l_crs) THEN
+	    IF(l_ref) i_aux3= merge(i_aux2, i_aux3, i_aux2==GRID_pleaserefine)
+	    IF(l_crs) i_aux3= merge(i_aux2, i_aux3, i_aux2==GRID_pleasecoarse)
+	    CALL grid_putinfo(p_ghand, l_finelevel= .TRUE., i_elementstatus= i_aux3)
+	  END IF update
+
+!---------- deallocate work arrays
+
+	  deallocate(r_aux1, i_aux1, i_aux2, i_aux3)
+
+!---------- adapt the grid
+
+	  CALL grid_adapt(p_ghand, l_changed)
+
+	  RETURN
+	  END SUBROUTINE slm_adapt
+
+!*****************************************************************
+	  SUBROUTINE slm_diagnostics(p_ghand, p_param, p_tinfo, c_action)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (grid_handle), INTENT(in)           :: p_ghand
+	  TYPE (control_struct), INTENT(inout)     :: p_param
+	  TYPE (rt_info), INTENT(in)               :: p_tinfo
+	  CHARACTER (len=4), INTENT(in), OPTIONAL  :: c_action
+	  INTEGER, SAVE                            :: i_iodiag
+	  CHARACTER (len=32)                       :: c_file
+	  CHARACTER (len=28)                       :: c_tmp
+	  REAL (KIND = GRID_SR), PARAMETER                          :: r_1o3= (1./3.)
+	  INTEGER                                  :: i_fst, i_tmp, &
+	    i_size, i_alct, i_1, i_2, i_3, i_4, i_5, i_6
+	  REAL (KIND = GRID_SR), SAVE                               :: r_rfm0, r_rsm0
+	  REAL (KIND = GRID_SR)                                     :: r_dispn, r_rfm, r_rsm, &
+	    r_ts, r_calci, r_calcs, r_mxnrm, r_l2nrm, r_max, r_min, r_diffn, &
+	    r_medln
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE          :: r_aux1, r_aux2, &
+	    r_aux3, r_aux4
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_auxx
+	  INTEGER, DIMENSION(1)                    :: i_valind
+
+!---------- action init
+
+	  present_act: IF(present(c_action)) THEN
+	    action_type: IF(c_action == 'init') THEN
+
+!---------- open file for diagnostic output
+
+	      i_iodiag= 9
+	      i_tmp   = p_param%num%i_experiment
+	      write(c_tmp,*) trim(GRID_parameters%program_name), '_diag.'
+	      write(c_file,1010) trim(c_tmp), i_tmp
+	      c_file= adjustl(c_file)
+	      open(i_iodiag, file= c_file, action= 'write', form= 'formatted', &
+	           iostat= i_fst)
+	      not_opened: IF(i_fst /= 0) THEN
+	        CALL grid_error(36)
+	      END IF not_opened
+	      IF(GRID_parameters%iolog > 0) &
+	        write(GRID_parameters%iolog,*) 'INFO: Filename: ', c_file, ' opened on unit: ', i_iodiag
+
+!---------- allocate workspace
+
+	      i_size= p_ghand%i_nnumber
+	      allocate(r_aux1(i_size), r_aux2(i_size), r_aux3(i_size), &
+	               r_aux4(i_size), r_auxx(1,i_size), stat=i_alct)
+	      not_alloc: IF(i_alct /= 0) THEN
+	        CALL grid_error(37)
+	      END IF not_alloc 
+	      r_aux1= 0.0; r_aux2= 0.0; r_aux3= 0.0; r_aux4= 0.0
+
+!---------- get minimum edge length
+
+	      CALL grid_edgelength(p_ghand, r_min=r_medln)
+
+!---------- calculate reference values, ... extract actual calculated concentration
+
+	      i_valind= (/ GRID_tracer /)
+	      CALL grid_getinfo(p_ghand, i_arraypoint=i_valind, &
+	                        r_nodevalues= r_auxx)
+	      r_aux1(:)= r_auxx(1,:)
+	      DEALLOCATE(r_auxx)
+
+!---------- calculate area pieces for each node
+
+	      CALL grid_nodearea(p_ghand, i_size, r_aux2)
+
+!---------- calculate analytical solution
+
+	      r_ts= p_param%num%r_deltatime* float(p_tinfo%i_step)
+	      CALL slm_analyticsolution(p_ghand, r_ts, i_size, r_aux3)
+
+!---------- now the integral of the concentration (mass) is
+
+	      r_calci= dot_product(r_aux1, r_aux2)
+	      r_rfm0 = r_calci
+
+!---------- the integral of the squared concentration ("entropy"(?)) is
+
+	      r_aux4 = r_aux1* r_aux1
+	      r_calcs= dot_product(r_aux4, r_aux2)
+	      r_rsm0 = r_calcs
+
+!---------- the maximum-norm of the error is
+
+	      r_aux4 = abs(r_aux1- r_aux3)
+	      r_mxnrm= maxval(r_aux4)
+
+!---------- the l2-norm of the error is
+
+	      r_aux4 = r_aux4* r_aux4
+	      r_l2nrm= dot_product(r_aux4, r_aux2)
+
+!---------- maximum and minimum
+
+	      r_max  = maxval(r_aux1)
+	      r_min  = minval(r_aux1)
+
+!---------- diffusion and dispersion (not yet implemented)
+
+	      r_diffn= 0.0
+	      r_dispn= 0.0
+
+!---------- print it
+
+	      r_rfm= r_calci/r_rfm0
+	      r_rsm= r_calcs/r_rsm0
+	      write(i_iodiag,1100) GRID_parameters%program_name, GRID_parameters%version, &
+	                           GRID_parameters%subversion, GRID_parameters%patchversion
+	      i_1= p_tinfo%i_step
+	      i_2= p_ghand%i_enumber
+	      i_3= p_ghand%i_enumfine
+	      i_4= p_ghand%i_gnumber
+	      i_5= p_ghand%i_gnumfine
+	      i_6= p_ghand%i_nnumber
+	      write(i_iodiag,1000) i_1, i_2, i_3, i_4, i_5, i_6, r_min, r_max, &
+	                           r_rfm, r_rsm, r_mxnrm, r_l2nrm, r_diffn, &
+				   r_dispn, r_medln
+
+!---------- deallocate workspace
+
+	      deallocate(r_aux1, r_aux2, r_aux3, r_aux4)
+
+!---------- initialization done
+
+	      RETURN
+
+!---------- action quit
+
+	    ELSE IF(c_action == 'quit') THEN action_type
+
+!---------- close diagnostic output file
+
+	      close(i_iodiag)
+ 	      IF(GRID_parameters%iolog > 0) &
+	        write(GRID_parameters%iolog,*) 'INFO: Closed file on unit: ', i_iodiag
+
+!---------- action quit done
+
+	      RETURN
+	    END IF action_type
+	  END IF present_act
+
+!---------- action diag (default): allocate workspace
+
+	  i_size= p_ghand%i_nnumber
+	  allocate(r_aux1(i_size), r_aux2(i_size), r_aux3(i_size), &
+	           r_aux4(i_size), r_auxx(1,i_size), stat=i_alct)
+	  not_allc: IF(i_alct /= 0) THEN
+	    CALL grid_error(37)
+	  END IF not_allc 
+	  r_aux1= 0.0; r_aux2= 0.0; r_aux3= 0.0; r_aux4= 0.0
+
+!---------- get minimum edge length
+
+	  CALL grid_edgelength(p_ghand, r_min=r_medln)
+
+!---------- calculate reference values, ... extract actual calculated concentration
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_getinfo(p_ghand, i_arraypoint=i_valind, &
+	  		   r_nodevalues= r_auxx)
+	  r_aux1(:)= r_auxx(1,:)
+	  DEALLOCATE(r_auxx)
+
+!---------- calculate area pieces for each node
+
+	  CALL grid_nodearea(p_ghand, i_size, r_aux2)
+
+!---------- calculate analytical solution
+
+	  r_ts= p_param%num%r_deltatime* float(p_tinfo%i_step)
+	  CALL slm_analyticsolution(p_ghand, r_ts, i_size, r_aux3)
+
+!---------- now the integral of the concentration (mass) is
+
+	  r_calci= dot_product(r_aux1, r_aux2)
+
+!---------- the integral of the squared concentration ("entropy"(?)) is
+
+	  r_aux4 = r_aux1* r_aux1
+	  r_calcs= dot_product(r_aux4, r_aux2)
+
+!---------- the maximum-norm of the error is
+
+	  r_aux4 = abs(r_aux1- r_aux3)
+	  r_mxnrm= maxval(r_aux4)
+
+!---------- the l2-norm of the error is
+
+	  r_aux4 = r_aux4* r_aux4
+	  r_l2nrm= dot_product(r_aux4, r_aux2)
+
+!---------- maximum and minimum
+
+	  r_max  = maxval(r_aux1)
+	  r_min  = minval(r_aux1)
+
+!---------- diffusion and dispersion (not yet implemented)
+
+	  r_diffn= 0.0
+	  r_dispn= 0.0
+
+!---------- print it
+
+	  r_rfm= r_calci/r_rfm0
+	  r_rsm= r_calcs/r_rsm0
+	  i_1= p_tinfo%i_step
+	  i_2= p_ghand%i_enumber
+	  i_3= p_ghand%i_enumfine
+	  i_4= p_ghand%i_gnumber
+	  i_5= p_ghand%i_gnumfine
+	  i_6= p_ghand%i_nnumber
+	  write(i_iodiag,1000) i_1, i_2, i_3, i_4, i_5, i_6, r_min, r_max, &
+	                       r_rfm, r_rsm, r_mxnrm, r_l2nrm, r_diffn, &
+	                       r_dispn, r_medln
+
+!---------- deallocate workspace
+
+	  deallocate(r_aux1, r_aux2, r_aux3, r_aux4)
+
+	  RETURN
+ 1000	  FORMAT(1x, i10, 1x, i10, 1x, i10, 1x, i10, 1x, i10, 1x, i10, &
+	         1x, e15.8, 1x, e15.8, 1x, e15.8, 1x, e15.8,&
+	         1x, e15.8, 1x, e15.8, 1x, e15.8, 1x, e15.8,&
+	         1x, e15.8)
+ 1010	  FORMAT(a28,i4.4)
+ 1100	  FORMAT(1x,'*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '*************************************',/ &
+	         1x,'***** PROGRAM: ',a15,174x,'*****',/ &
+	         1x,'***** VERSION: ',i2.2,'.',i2.2,'.',i2.2,181x,'*****',/ &
+	         1x,'***** Diagnostic output ',180x,'*****',/ &
+	         1x,'*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '*************************************',/ &
+	         1x,'* timestep ','  elements ','  fine el. ','     edges ', &
+	            '  fine ed. ','     nodes ','        minimum ', &
+	            '        maximum ','            RFM ','            RSM ', &
+                    '       max-norm ','        l2-norm ','      diffusion ', &
+	            '     dispersion ',' min.edge len.*',/ &
+	         1x,'*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '******************************************', &
+	            '**************************************')
+	  END SUBROUTINE slm_diagnostics
+
+!*****************************************************************
+	  SUBROUTINE slm_initialize(p_ghand, p_param)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(out) :: p_ghand
+	  TYPE (control_struct), INTENT(inout)          :: p_param
+
+	  INTEGER                                     :: i_steps
+	  CHARACTER (len=32)                          :: c_file
+	  CHARACTER (len=28)                          :: c_tmp
+	  INTEGER                                     :: i_tmp, i_cnt
+	  LOGICAL                                     :: l_refined
+	  INTEGER                                     :: i_vertnum
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER               :: r_vertinit
+
+!---------- decide whether a new experiment is startet or an old one is continued
+
+	  new_experiment: IF(p_param%num%i_experiment <= 0) THEN
+
+!---------- reset timesteps (start with 1 in any case)
+
+	    time_one: IF(p_param%num%i_frsttimestep /= 1) THEN
+	      IF(GRID_parameters%iolog > 0) &
+	        write(GRID_parameters%iolog,*) 'WARNING      : Timestep counters reset due to new experiment'
+	      i_steps= p_param%num%i_lasttimestep- p_param%num%i_frsttimestep
+	      p_param%num%i_frsttimestep= 1
+	      p_param%num%i_lasttimestep= p_param%num%i_frsttimestep+ i_steps
+	    END IF time_one
+
+!---------- initialize grid parameters
+
+	    CALL grid_setparameter(p_ghand, i_coarselevel= p_param%num%i_crslevel, &
+	                           i_finelevel= p_param%num%i_reflevel)
+
+!---------- define domain, first read data from file (compiled here)
+
+	    CALL grid_readdomain(i_vertnum, r_vertinit, c_readfile=p_param%io%c_domainfile)
+	    CALL grid_definegeometry(i_vertnum, r_vertexarr= r_vertinit)
+
+!---------- create initial triangulation
+
+	    CALL grid_createinitial(p_ghand, c_filename=p_param%io%c_triangfile)
+
+!---------- initialize grid and adapt at steep gradients
+
+	    i_cnt= 0
+	    l_refined= .TRUE.
+	    refine_loop: DO WHILE (l_refined)
+	      CALL slm_initialvalues(p_ghand(i_timeplus))
+	      CALL slm_adapt(p_ghand(i_timeplus), p_param, l_refined, &
+	                     l_water=.FALSE.)
+	    END DO refine_loop
+
+!---------- duplicate grid (old time)
+
+	    CALL grid_timeduplicate(p_ghand(i_timeplus), p_ghand(i_time))
+
+!---------- initialize wind field calculation
+
+	    CALL slm_windinit(p_param)
+
+!---------- if an old experiment is to be continued from stored data:
+
+	  ELSE new_experiment
+
+!---------- create grid from saveset, first compile filename
+
+	    i_tmp= p_param%num%i_experiment- 1
+	    write(c_tmp,*) trim(GRID_parameters%program_name), '_save.'
+	    write(c_file,1010) trim(c_tmp), i_tmp
+	    c_file= adjustl(c_file)
+
+	    CALL grid_readinitial(p_ghand, c_file)
+
+!---------- initialize wind field calculation
+
+	    CALL slm_windinit(p_param)
+
+	  END IF new_experiment
+
+	  RETURN
+ 1010	  FORMAT(a28,i4.4)
+	  END SUBROUTINE slm_initialize
+
+!*****************************************************************
+	  SUBROUTINE slm_finish(p_ghand, p_param)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                          :: p_param
+	  CHARACTER (len=32)                                       :: c_file
+	  CHARACTER (len=28)                                       :: c_tmp
+	  INTEGER                                                  :: i_tmp
+
+!---------- open and write saveset, if required
+
+	  save_req: IF(p_param%io%i_savelast /= 0) THEN
+
+	    i_tmp= p_param%num%i_experiment
+	    write(c_tmp,*) trim(GRID_parameters%program_name), '_save.'
+	    write(c_file,1010) trim(c_tmp), i_tmp
+	    c_file= adjustl(c_file)
+	    CALL grid_writesaveset(c_file, p_ghand)
+
+!---------- write parameter file for next experiment
+
+	    CALL io_putinputfile(p_param)
+	  END IF save_req
+
+!---------- gracefully terminate wind field calculations
+
+	  CALL slm_windquit
+
+	  RETURN
+ 1010	  FORMAT(a28,i4.4)
+	  END SUBROUTINE slm_finish
+
+!*****************************************************************
+	  SUBROUTINE slm_timestepping(p_ghand, p_param)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  INTEGER, PARAMETER                   :: i_innermax=15
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), &
+	                      INTENT(inout)    :: p_ghand
+	  TYPE (control_struct), INTENT(inout) :: p_param
+	  INTEGER                              :: i_timecount
+	  TYPE (sw_info)                       :: p_time, p_timeaux
+	  LOGICAL                              :: l_refined
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE      :: r_tracer
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_coord, r_aux
+	  CHARACTER (len=32)                   :: c_file, c_matfile
+	  CHARACTER (len=28)                   :: c_tmp
+	  INTEGER                              :: i_tmp, &
+	    i_size, i_alct, i_tst, i_fst
+	  INTEGER                              :: i_iomatl=21
+	  REAL (KIND = GRID_SR)                :: r_modtime
+          INTEGER                              :: i_loopquit
+	  INTEGER                              :: i_newlen
+	  INTEGER, DIMENSION(1)                :: i_valind
+		
+!---------- VISNET variable init
+
+		i_loopquit = 0
+
+!---------- initialize timestep info structure
+
+	  p_timestepinfo%i_step       = 0
+	  p_timestepinfo%i_adapit     = 0
+	  p_timestepinfo%l_ploted     = .FALSE.
+	  p_timestepinfo%l_saved      = .FALSE.
+	  p_timestepinfo%r_modeltime  = 0.0
+
+!---------- initialize timing structure
+
+	  p_time%p_tim%r_tim   = 0.0
+	  p_time%p_tim%r_lap   = 0.0
+	  p_time%p_tim%c_tim   = '                '
+	  p_timeaux%p_tim%r_tim= 0.0
+	  p_timeaux%p_tim%r_lap= 0.0
+	  p_timeaux%p_tim%c_tim= '                '
+
+!---------- initialize stop watches
+
+	  CALL stop_watch_init(1,(/'total time      '/),p_timeaux)
+	  CALL stop_watch_init(8,(/'plotting        ', 'grid duplication', &
+	                           'trajectory calc.', 'right hand side ', &
+	                           'grid value updt.', 'grid adaption   ', &
+	                           'diagnostics     ', 'whole timestep  '/), p_time)
+	                           
+!---------- if diagnostics are demanded, initialize diagnostical output
+
+	  IF(p_param%io%l_diagnostics) THEN
+	    p_timestepinfo%i_step= 0
+	    CALL slm_diagnostics(p_grid(i_timeplus), p_param, p_timestepinfo, c_action='init')
+	  END IF
+
+!---------- plot initial data
+
+	  i_timecount= 0
+#ifndef NO_NETCDF
+	  IF(p_param%io%l_netcdf) THEN
+	    CALL plot_netcdf(p_ghand(i_timeplus), i_time=i_timecount)
+      END IF
+#endif
+	  IF(p_param%io%l_vtu) THEN
+	    CALL generate_vtu(p_ghand(i_timeplus), i_time=i_timecount)
+	  END IF
+
+!---------- put out initial information
+
+	  CALL io_putruntimeinfo(p_ghand(i_timeplus), p_timestepinfo, p_time)
+
+!---------- timestep loop
+
+      CALL stop_watch('start',1,p_timeaux)
+      CALL stop_watch('start',8,p_time)
+      i_timecount = 0_GRID_SI
+      p_timestepinfo%r_modeltime = p_param%num%r_starttime
+      time_loop: DO WHILE (p_timestepinfo%r_modeltime < p_param%num%r_finaltime - p_param%num%r_deltatime)
+        i_timecount                = i_timecount+ 1_GRID_SI
+        p_timestepinfo%i_step      = i_timecount
+        p_timestepinfo%r_modeltime = p_timestepinfo%r_modeltime + p_param%num%r_deltatime
+        p_timestepinfo%i_adapit    = 0_GRID_SI
+
+!---------- duplicate old grid, use it as first guess for new grid
+
+	    CALL stop_watch('start',2,p_time)
+	    CALL grid_timeduplicate(p_ghand(i_time), p_ghand(i_timeplus))
+	    CALL stop_watch('stop ',2,p_time)
+
+!---------- adaptive (inner) loop
+
+	    l_refined= .TRUE.
+	    adap_loop: DO WHILE(l_refined .AND. p_timestepinfo%i_adapit < i_innermax)
+	      p_timestepinfo%i_adapit= p_timestepinfo%i_adapit+ 1
+
+!---------- allocate and extract working arrays
+!---------- use amatos 1.2 functionality to calculate only new nodes
+
+	      i_size= p_ghand(i_timeplus)%i_nnumber
+	      allocate(r_aux(GRID_dimension,i_size), stat=i_alct)
+	      not_alloc: IF(i_alct /= 0) THEN
+	        CALL grid_error(38)
+	      END IF not_alloc
+
+!-SLM--------- do the following SLM calculations in arrays (grid-point-wise)
+
+	      CALL grid_getinfo(p_ghand(i_timeplus), r_nodecoordinates=r_aux, &
+	                        i_newsdepth= 1, i_nlength= i_newlen)
+	      allocate(r_tracer(i_newlen), r_coord(GRID_dimension,i_newlen), stat=i_alct)
+	      not_alloc0: IF(i_alct /= 0) THEN
+	        CALL grid_error(38)
+	      END IF not_alloc0
+	      r_coord(:,1:i_newlen)= r_aux(:,1:i_newlen)
+	      deallocate(r_aux)
+
+!-SLM--------- call the SLM step
+
+	      r_modtime= p_timestepinfo%r_modeltime- p_param%num%r_deltatime
+	      CALL slm_step(p_ghand, p_param, p_time, r_modtime, i_newlen, &
+	                    r_coord, r_tracer, i_newsdepth=1)
+
+!-SLM--------- update grid data structure and deallocate work arrays
+!-SLM--------- change back from (grid-point)arrays to grid data structure
+
+	      allocate(r_aux(1,i_newlen), stat=i_alct)
+	      not_alloc1: IF(i_alct /= 0) THEN
+	        CALL grid_error(38)
+	      END IF not_alloc1
+	      r_aux(1,:)= r_tracer(:)
+	      i_valind= (/ GRID_tracer /)
+	      CALL grid_putinfo(p_ghand(i_timeplus), i_arraypoint= i_valind, &
+	                        i_newsdepth= 1, r_nodevalues= r_aux)
+
+	      deallocate(r_coord, r_tracer, r_aux)
+
+!-SLM--------- adapt the grid corresponding to an error estimate
+
+	      CALL stop_watch('start',6,p_time)
+	      CALL slm_adapt(p_ghand(i_timeplus), p_param, l_refined)
+	      CALL stop_watch('stop ',6,p_time)
+
+	    END DO adap_loop
+
+!-SLM--------- insert a full advanced SLM step here, if required
+!-SLM--------- retrieve coordinates of grid points
+
+	    i_size= p_ghand(i_timeplus)%i_nnumber
+	    allocate(r_tracer(i_size), r_coord(GRID_dimension,i_size), stat=i_alct)
+	    not_allocfinal: IF(i_alct /= 0) THEN
+	      CALL grid_error(38)
+	    END IF not_allocfinal
+
+!-SLM--------- do the following SLM calculations in arrays (grid-point-wise)
+
+	    CALL grid_getinfo(p_ghand(i_timeplus), r_nodecoordinates=r_coord)
+
+!-SLM--------- call the SLM step
+
+	    r_modtime= p_timestepinfo%r_modeltime- p_param%num%r_deltatime
+	    CALL slm_astep(p_ghand, p_param, p_time, r_modtime, i_size, r_coord, r_tracer)
+
+!-SLM--------- update grid data structure and deallocate work arrays
+!-SLM--------- change back from (grid-point)arrays to grid data structure
+
+	      allocate(r_aux(1,i_size), stat=i_alct)
+	      not_allocfinal1: IF(i_alct /= 0) THEN
+	        CALL grid_error(38)
+	      END IF not_allocfinal1
+	      r_aux(1,:)= r_tracer(:)
+	      i_valind= (/ GRID_tracer /)
+	      CALL grid_putinfo(p_ghand(i_timeplus), i_arraypoint= i_valind, &
+	                        r_nodevalues= r_aux)
+
+	      deallocate(r_coord, r_tracer, r_aux)
+
+!---------- diagnostics, if requested
+
+	    IF(p_param%io%l_diagnostics) THEN
+	      CALL stop_watch('start',7,p_time)
+	      CALL slm_diagnostics(p_grid(i_timeplus), p_param, p_timestepinfo, c_action='diag')
+	      CALL stop_watch('stop ',7,p_time)
+	    END IF
+
+!---------- plot data (every [i_plotoffset]th timestep)
+
+	    CALL stop_watch('start',1,p_time)
+	    plot_step: IF(mod(i_timecount, p_param%io%i_plotoffset) == 0) THEN
+	      IF((p_param%io%l_netcdf) .OR. (p_param%io%l_vtu)) &
+	        p_timestepinfo%l_ploted= .TRUE.
+
+#ifndef NO_NETCDF
+	      IF(p_param%io%l_netcdf) THEN
+	        CALL plot_netcdf(p_ghand(i_timeplus), i_time=i_timecount)
+	      END IF
+#endif
+	      IF(p_param%io%l_vtu) THEN
+	        CALL generate_vtu(p_ghand(i_timeplus), i_time=i_timecount)
+	      END IF
+	    END IF plot_step
+	    CALL stop_watch('stop ',1,p_time)
+
+!---------- put a saveset to disc every ... timesteps
+
+	    save_step: IF((mod(i_timecount, p_param%io%i_saveoffset) == 0) .AND. &
+	                  (i_timecount > 1)) THEN
+	      i_tmp= p_param%num%i_experiment
+ 	      write(c_tmp,*) trim(GRID_parameters%program_name), '_save.'
+	      write(c_file,1010) trim(c_tmp), i_tmp
+	      c_file= adjustl(c_file)
+	      CALL grid_writesaveset(c_file,p_ghand)
+	      p_timestepinfo%l_saved= .TRUE.
+	    END IF save_step
+
+!---------- runtime information output
+
+	    CALL stop_watch('stop ',8,p_time)
+	    CALL io_putruntimeinfo(p_ghand(i_timeplus), p_timestepinfo, p_time)
+	    CALL stop_watch_init(8,(/'plotting        ', 'grid duplication', &
+	                             'trajectory calc.', 'right hand side ', &
+	                             'grid value updt.', 'grid adaption   ', &
+	                             'diagnostics     ', 'whole timestep  '/), p_time)
+	    CALL stop_watch('start',8,p_time)
+
+!---------- remove obsolecent grid items
+
+	    CALL grid_sweep
+
+!---------- toggle time handles for next step if gfx-proces has not exited
+
+	    CALL grid_timetoggle
+
+!---------- exit loop if graphics process has been terminated
+
+            IF (i_loopquit /= 0) EXIT time_loop
+
+	  END DO time_loop
+	  CALL stop_watch('stop ',1,p_timeaux)
+
+!---------- print total time
+
+ 	  write(GRID_parameters%ioout,1005)
+	  write(GRID_parameters%ioout,1003) p_timeaux%p_tim(1)%r_tim
+	  write(GRID_parameters%ioout,1004)
+	  IF(GRID_parameters%iolog > 0) THEN
+	    write(GRID_parameters%iolog,1003) p_timeaux%p_tim(1)%r_tim
+	  END IF
+
+!---------- terminate diagnostics
+
+	  IF(p_param%io%l_diagnostics) THEN
+	    CALL slm_diagnostics(p_grid(i_timeplus), p_param, p_timestepinfo, c_action='quit')
+	  END IF
+
+	  RETURN
+ 1000	  FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/ &
+	         1x,'*****            Runtime Information Output           *****',/ &
+	         1x,'***** ----- ----- ----- ----- ----- ----- ----- ----- *****')
+ 1003	  FORMAT(1x,'***** Total time for timesteps ',10x,e12.4,' *****')
+ 1004	  FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/)
+ 1005	  FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/ &
+	         1x,'*****             Final Information Output            *****',/ &
+	         1x,'***** ----- ----- ----- ----- ----- ----- ----- ----- *****')
+ 1010	  FORMAT(a28,i4.4)
+	  END SUBROUTINE slm_timestepping
+
+	END MODULE ADV_semilagrange
diff --git a/flash2d/src/options/ADV_semilagrange.algae.F90 b/flash2d/src/options/ADV_semilagrange.algae.F90
new file mode 100644
index 0000000..4e08df4
--- /dev/null
+++ b/flash2d/src/options/ADV_semilagrange.algae.F90
@@ -0,0 +1,882 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	ADV_semilagrange
+! FUNCTION:
+!	perform semi-Lagrangian advection
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_adapt
+! FUNCTION:
+!	adapt the grid according to an error estimate
+! SYNTAX:
+!	CALL slm_adapt(grid, param, logical)
+! ON INPUT:
+!	p_ghand:   handle for the grid		TYPE (grid_handle)
+!	p_param:   global parameter structure	TYPE (global_param)
+! ON OUTPUT:
+!	l_changed: flag for changed grid	LOGICAL
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialize
+! FUNCTION:
+!	initialize the advection problem
+! SYNTAX:
+!	CALL slm_initialize(grid, param)
+! ON INPUT:
+!	p_param: parameter data structure	TYPE (global_param)
+! ON OUTPUT:
+!	p_ghand: grid handling data structure	TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_finish
+! FUNCTION:
+!	terminate slm (free dynamically alloc. memory, ...)
+! SYNTAX:
+!	CALL slm_finish(grid, param)
+! ON INPUT:
+!	p_ghand: grid handling data structure	TYPE (grid_handle)
+!	p_param: parameter data structure	TYPE (global_param)
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_timestepping
+! FUNCTION:
+!	perform the timestepping in the slm
+! SYNTAX:
+!	CALL slm_timestepping(grid, param, cmd)
+! ON INPUT:
+!	p_ghand: grid handling data structure	TYPE (grid_handle)
+!	p_param: parameter data structure	TYPE (global_param)
+!	p_cmdln: command line argument struct.	TYPE (cmdline)
+! ON OUTPUT:
+!	p_ghand: grid handling data structure	TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_displace, slm_update, slm_upstream
+!	slm_initialize, slm_finish, slm_timestepping
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, FEM_handle
+!	FEM_errorestimate, FEM_param
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	10/96
+!	2. several improvements/fixes	j. behrens	11/96-1/97
+!	3. nodal values time depend.	j. behrens	1/97
+!	4. stop_watch removed, plot	j. behrens	1/97
+!	   (position) changed, inner
+!	   iteration counter added
+!	5. slm_adapt changed 		j. behrens	2/97
+!	6. slm_adapt changed to hide
+!	   grid data structures		j. behrens	7/97
+!	7. control data structure	j. behrens	12/97
+!	8. non-homog. rhs added		j. behrens	2/98
+!	9. compliant to amatos 1.0	j. behrens	12/2000
+!	10. compliant to amatos 1.2	j. behrens	3/2002
+!	11. compliant to amatos 2.0	j. behrens	7/2003
+!       12. added visnetplot            f. klaschka     12/2003
+!
+!*****************************************************************
+	MODULE ADV_semilagrange
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE IO_vtuplot
+#ifndef NO_NETCDF
+	  USE IO_netcdfplot
+#endif
+	  USE IO_utils
+	  USE GRID_api
+	  USE SLM_errorestimate
+	  USE SLM_initial
+	  USE SLM_simple
+	  USE SLM_advanced
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_initialize, slm_finish, slm_timestepping
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_adapt(p_ghand, p_param, l_changed, l_water)
+
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (grid_handle), INTENT(inout)      :: p_ghand
+	  TYPE (control_struct), INTENT(in)      :: p_param
+	  LOGICAL, INTENT(out)                   :: l_changed
+	  LOGICAL, OPTIONAL, INTENT(in)          :: l_water
+	  LOGICAL                                :: l_switch
+	  REAL (KIND = GRID_SR)                                   :: r_errmx, &
+	    r_refcrit, r_crscrit, r_fac
+	  INTEGER                                :: i_size, &
+	    i_manyc, i_manyr, i_alct, i_cnt
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE        :: r_aux1
+	  INTEGER, DIMENSION(:), ALLOCATABLE     :: i_aux1, i_aux2, i_aux3
+	  LOGICAL                                :: l_ref, l_crs
+
+!---------- initialize refinement flag
+
+	  l_changed= .FALSE.
+
+!---------- handle watermark switch
+
+	  wat_present: IF(present(l_water)) THEN
+	    l_switch= l_water
+	  ELSE wat_present
+	    l_switch= .TRUE.
+	  END IF wat_present
+
+!---------- allocate work arrays
+
+	  i_size= p_ghand%i_enumfine
+	  allocate(r_aux1(i_size), i_aux1(i_size), i_aux2(i_size), &
+                   i_aux3(i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(35)
+	  END IF not_alloc
+
+!---------- estimate the local error
+
+	  CALL slm_errorest(p_ghand, i_size, r_aux1)
+
+!---------- set coarsening/refinement criterion
+
+	  r_errmx= maxval(r_aux1(1:i_size))
+	  r_crscrit= r_errmx* p_param%num%r_crstolerance
+	  r_refcrit= r_errmx* p_param%num%r_reftolerance
+
+!---------- get level information and set up flags for refinement/coarsening
+
+	  CALL grid_getinfo(p_ghand, l_finelevel= .TRUE., i_elementlevel= i_aux1, &
+	                    i_elementstatus= i_aux3)
+	  DO i_cnt=1,i_size
+	    i_aux2(i_cnt)= 0
+	    IF((i_aux1(i_cnt) > p_param%num%i_crslevel) .AND. &
+	       (r_aux1(i_cnt) < r_crscrit)) i_aux2(i_cnt)= GRID_pleasecoarse
+	    IF((i_aux1(i_cnt) < p_param%num%i_reflevel) .AND. &
+	       (r_aux1(i_cnt) > r_refcrit)) i_aux2(i_cnt)= GRID_pleaserefine
+	  END DO
+
+!---------- determine if there is enough to be done (this can be
+!           switched off by l_water=.FALSE.)
+
+	  IF(l_switch) THEN
+	    i_manyr= count(i_aux2 == GRID_pleaserefine)
+	    r_fac= real(i_manyr,GRID_SR)/ real(i_size,GRID_SR)
+	    enough_ref: IF(r_fac > p_param%num%r_refwatermark) THEN
+	      l_ref= .TRUE.
+	    ELSE
+	      l_ref= .FALSE.
+	    END IF enough_ref
+
+	    i_manyc= count(i_aux2 == GRID_pleasecoarse)
+	    r_fac= real(i_manyc,GRID_SR)/ real(i_size,GRID_SR)
+	    enough_crs: IF(r_fac > p_param%num%r_crswatermark) THEN
+	      l_crs= .TRUE.
+	    ELSE
+	      l_crs= .FALSE.
+	    END IF enough_crs
+	  ELSE
+	    l_ref= .TRUE.
+	    l_crs= .TRUE.
+	  END IF
+
+!---------- update grid flags
+
+	  update: IF(l_ref .OR. l_crs) THEN
+	    IF(l_ref) i_aux3= merge(i_aux2, i_aux3, i_aux2==GRID_pleaserefine)
+	    IF(l_crs) i_aux3= merge(i_aux2, i_aux3, i_aux2==GRID_pleasecoarse)
+	    CALL grid_putinfo(p_ghand, l_finelevel= .TRUE., i_elementstatus= i_aux3)
+	  END IF update
+
+!---------- deallocate work arrays
+
+	  deallocate(r_aux1, i_aux1, i_aux2, i_aux3)
+
+!---------- adapt the grid
+
+	  CALL grid_adapt(p_ghand, l_changed)
+
+	  RETURN
+	  END SUBROUTINE slm_adapt
+
+!*****************************************************************
+	  SUBROUTINE slm_diagnostics(p_ghand, p_param, p_tinfo, c_action)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (grid_handle), INTENT(in)           :: p_ghand
+	  TYPE (control_struct), INTENT(inout)     :: p_param
+	  TYPE (rt_info), INTENT(in)               :: p_tinfo
+	  CHARACTER (len=4), INTENT(in), OPTIONAL  :: c_action
+	  INTEGER, SAVE                            :: i_iodiag
+	  CHARACTER (len=32)                       :: c_file
+	  CHARACTER (len=28)                       :: c_tmp
+	  REAL (KIND = GRID_SR), PARAMETER                          :: r_1o3= (1./3.)
+	  INTEGER                                  :: i_fst, i_tmp, &
+	    i_size, i_alct, i_1, i_2, i_3, i_4, i_5, i_6
+	  REAL (KIND = GRID_SR), SAVE                               :: r_rfm0, r_rsm0
+	  REAL (KIND = GRID_SR)                                     :: r_dispn, r_rfm, r_rsm, &
+	    r_ts, r_calci, r_calcs, r_mxnrm, r_l2nrm, r_max, r_min, r_diffn, &
+	    r_medln
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE          :: r_aux1, r_aux2, &
+	    r_aux3, r_aux4
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_auxx
+	  INTEGER, DIMENSION(1)                    :: i_valind
+
+!---------- action init
+
+	  present_act: IF(present(c_action)) THEN
+	    action_type: IF(c_action == 'init') THEN
+
+!---------- open file for diagnostic output
+
+	      i_iodiag= 9
+	      i_tmp   = p_param%num%i_experiment
+	      write(c_tmp,*) trim(GRID_parameters%program_name), '_diag.'
+	      write(c_file,1010) trim(c_tmp), i_tmp
+	      c_file= adjustl(c_file)
+	      open(i_iodiag, file= c_file, action= 'write', form= 'formatted', &
+	           iostat= i_fst)
+	      not_opened: IF(i_fst /= 0) THEN
+	        CALL grid_error(36)
+	      END IF not_opened
+	      IF(GRID_parameters%iolog > 0) &
+	        write(GRID_parameters%iolog,*) 'INFO: Filename: ', c_file, ' opened on unit: ', i_iodiag
+
+!---------- allocate workspace
+
+	      i_size= p_ghand%i_nnumber
+	      allocate(r_aux1(i_size), r_aux2(i_size), r_aux3(i_size), &
+	               r_aux4(i_size), r_auxx(1,i_size), stat=i_alct)
+	      not_alloc: IF(i_alct /= 0) THEN
+	        CALL grid_error(37)
+	      END IF not_alloc 
+	      r_aux1= 0.0; r_aux2= 0.0; r_aux3= 0.0; r_aux4= 0.0
+
+!---------- get minimum edge length
+
+	      CALL grid_edgelength(p_ghand, r_min=r_medln)
+
+!---------- calculate reference values, ... extract actual calculated concentration
+
+	      i_valind= (/ GRID_tracer /)
+	      CALL grid_getinfo(p_ghand, i_arraypoint=i_valind, &
+	                        r_nodevalues= r_auxx)
+	      r_aux1(:)= r_auxx(1,:)
+	      DEALLOCATE(r_auxx)
+
+!---------- calculate area pieces for each node
+
+	      CALL grid_nodearea(p_ghand, i_size, r_aux2)
+
+!---------- calculate analytical solution
+
+	      r_ts= p_param%num%r_deltatime* float(p_tinfo%i_step)
+	      CALL slm_analyticsolution(p_ghand, r_ts, i_size, r_aux3)
+
+!---------- now the integral of the concentration (mass) is
+
+	      r_calci= dot_product(r_aux1, r_aux2)
+	      r_rfm0 = r_calci
+
+!---------- the integral of the squared concentration ("entropy"(?)) is
+
+	      r_aux4 = r_aux1* r_aux1
+	      r_calcs= dot_product(r_aux4, r_aux2)
+	      r_rsm0 = r_calcs
+
+!---------- the maximum-norm of the error is
+
+	      r_aux4 = abs(r_aux1- r_aux3)
+	      r_mxnrm= maxval(r_aux4)
+
+!---------- the l2-norm of the error is
+
+	      r_aux4 = r_aux4* r_aux4
+	      r_l2nrm= dot_product(r_aux4, r_aux2)
+
+!---------- maximum and minimum
+
+	      r_max  = maxval(r_aux1)
+	      r_min  = minval(r_aux1)
+
+!---------- diffusion and dispersion (not yet implemented)
+
+	      r_diffn= 0.0
+	      r_dispn= 0.0
+
+!---------- print it
+
+	      r_rfm= r_calci/r_rfm0
+	      r_rsm= r_calcs/r_rsm0
+	      write(i_iodiag,1100) GRID_parameters%program_name, GRID_parameters%version, &
+	                           GRID_parameters%subversion, GRID_parameters%patchversion
+	      i_1= p_tinfo%i_step
+	      i_2= p_ghand%i_enumber
+	      i_3= p_ghand%i_enumfine
+	      i_4= p_ghand%i_gnumber
+	      i_5= p_ghand%i_gnumfine
+	      i_6= p_ghand%i_nnumber
+	      write(i_iodiag,1000) i_1, i_2, i_3, i_4, i_5, i_6, r_min, r_max, &
+	                           r_rfm, r_rsm, r_mxnrm, r_l2nrm, r_diffn, &
+				   r_dispn, r_medln
+
+!---------- deallocate workspace
+
+	      deallocate(r_aux1, r_aux2, r_aux3, r_aux4)
+
+!---------- initialization done
+
+	      RETURN
+
+!---------- action quit
+
+	    ELSE IF(c_action == 'quit') THEN action_type
+
+!---------- close diagnostic output file
+
+	      close(i_iodiag)
+ 	      IF(GRID_parameters%iolog > 0) &
+	        write(GRID_parameters%iolog,*) 'INFO: Closed file on unit: ', i_iodiag
+
+!---------- action quit done
+
+	      RETURN
+	    END IF action_type
+	  END IF present_act
+
+!---------- action diag (default): allocate workspace
+
+	  i_size= p_ghand%i_nnumber
+	  allocate(r_aux1(i_size), r_aux2(i_size), r_aux3(i_size), &
+	           r_aux4(i_size), r_auxx(1,i_size), stat=i_alct)
+	  not_allc: IF(i_alct /= 0) THEN
+	    CALL grid_error(37)
+	  END IF not_allc 
+	  r_aux1= 0.0; r_aux2= 0.0; r_aux3= 0.0; r_aux4= 0.0
+
+!---------- get minimum edge length
+
+	  CALL grid_edgelength(p_ghand, r_min=r_medln)
+
+!---------- calculate reference values, ... extract actual calculated concentration
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_getinfo(p_ghand, i_arraypoint=i_valind, &
+	  		   r_nodevalues= r_auxx)
+	  r_aux1(:)= r_auxx(1,:)
+	  DEALLOCATE(r_auxx)
+
+!---------- calculate area pieces for each node
+
+	  CALL grid_nodearea(p_ghand, i_size, r_aux2)
+
+!---------- calculate analytical solution
+
+	  r_ts= p_param%num%r_deltatime* float(p_tinfo%i_step)
+	  CALL slm_analyticsolution(p_ghand, r_ts, i_size, r_aux3)
+
+!---------- now the integral of the concentration (mass) is
+
+	  r_calci= dot_product(r_aux1, r_aux2)
+
+!---------- the integral of the squared concentration ("entropy"(?)) is
+
+	  r_aux4 = r_aux1* r_aux1
+	  r_calcs= dot_product(r_aux4, r_aux2)
+
+!---------- the maximum-norm of the error is
+
+	  r_aux4 = abs(r_aux1- r_aux3)
+	  r_mxnrm= maxval(r_aux4)
+
+!---------- the l2-norm of the error is
+
+	  r_aux4 = r_aux4* r_aux4
+	  r_l2nrm= dot_product(r_aux4, r_aux2)
+
+!---------- maximum and minimum
+
+	  r_max  = maxval(r_aux1)
+	  r_min  = minval(r_aux1)
+
+!---------- diffusion and dispersion (not yet implemented)
+
+	  r_diffn= 0.0
+	  r_dispn= 0.0
+
+!---------- print it
+
+	  r_rfm= r_calci/r_rfm0
+	  r_rsm= r_calcs/r_rsm0
+	  i_1= p_tinfo%i_step
+	  i_2= p_ghand%i_enumber
+	  i_3= p_ghand%i_enumfine
+	  i_4= p_ghand%i_gnumber
+	  i_5= p_ghand%i_gnumfine
+	  i_6= p_ghand%i_nnumber
+	  write(i_iodiag,1000) i_1, i_2, i_3, i_4, i_5, i_6, r_min, r_max, &
+	                       r_rfm, r_rsm, r_mxnrm, r_l2nrm, r_diffn, &
+	                       r_dispn, r_medln
+
+!---------- deallocate workspace
+
+	  deallocate(r_aux1, r_aux2, r_aux3, r_aux4)
+
+	  RETURN
+ 1000	  FORMAT(1x, i10, 1x, i10, 1x, i10, 1x, i10, 1x, i10, 1x, i10, &
+	         1x, e15.8, 1x, e15.8, 1x, e15.8, 1x, e15.8,&
+	         1x, e15.8, 1x, e15.8, 1x, e15.8, 1x, e15.8,&
+	         1x, e15.8)
+ 1010	  FORMAT(a28,i4.4)
+ 1100	  FORMAT(1x,'*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '*************************************',/ &
+	         1x,'***** PROGRAM: ',a15,174x,'*****',/ &
+	         1x,'***** VERSION: ',i2.2,'.',i2.2,'.',i2.2,181x,'*****',/ &
+	         1x,'***** Diagnostic output ',180x,'*****',/ &
+	         1x,'*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '*************************************',/ &
+	         1x,'* timestep ','  elements ','  fine el. ','     edges ', &
+	            '  fine ed. ','     nodes ','        minimum ', &
+	            '        maximum ','            RFM ','            RSM ', &
+                    '       max-norm ','        l2-norm ','      diffusion ', &
+	            '     dispersion ',' min.edge len.*',/ &
+	         1x,'*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '******************************************', &
+	            '**************************************')
+	  END SUBROUTINE slm_diagnostics
+
+!*****************************************************************
+	  SUBROUTINE slm_initialize(p_ghand, p_param)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(out) :: p_ghand
+	  TYPE (control_struct), INTENT(inout)          :: p_param
+
+	  INTEGER                                     :: i_steps
+	  CHARACTER (len=32)                          :: c_file
+	  CHARACTER (len=28)                          :: c_tmp
+	  INTEGER                                     :: i_tmp, i_cnt
+	  LOGICAL                                     :: l_refined
+	  INTEGER                                     :: i_vertnum
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER               :: r_vertinit
+
+!---------- decide whether a new experiment is startet or an old one is continued
+
+	  new_experiment: IF(p_param%num%i_experiment <= 0) THEN
+
+!---------- reset timesteps (start with 1 in any case)
+
+	    time_one: IF(p_param%num%i_frsttimestep /= 1) THEN
+	      IF(GRID_parameters%iolog > 0) &
+	        write(GRID_parameters%iolog,*) 'WARNING      : Timestep counters reset due to new experiment'
+	      i_steps= p_param%num%i_lasttimestep- p_param%num%i_frsttimestep
+	      p_param%num%i_frsttimestep= 1
+	      p_param%num%i_lasttimestep= p_param%num%i_frsttimestep+ i_steps
+	    END IF time_one
+
+!---------- initialize grid parameters
+
+	    CALL grid_setparameter(p_ghand, i_coarselevel= p_param%num%i_crslevel, &
+	                           i_finelevel= p_param%num%i_reflevel)
+
+!---------- define domain, first read data from file (compiled here)
+
+	    CALL grid_readdomain(i_vertnum, r_vertinit, c_readfile=p_param%io%c_domainfile)
+	    CALL grid_definegeometry(i_vertnum, r_vertexarr= r_vertinit)
+
+!---------- create initial triangulation
+
+	    CALL grid_createinitial(p_ghand, c_filename=p_param%io%c_triangfile)
+
+!---------- initialize wind field calculation
+
+	    CALL slm_windinit(p_param)
+
+!---------- initialize grid and adapt at steep gradients
+
+	    i_cnt= 0
+	    l_refined= .TRUE.
+	    refine_loop: DO WHILE (l_refined)
+	      CALL slm_initialvalues(p_ghand(i_timeplus))
+	      CALL slm_adapt(p_ghand(i_timeplus), p_param, l_refined, &
+	                     l_water=.FALSE.)
+	    END DO refine_loop
+
+!---------- duplicate grid (old time)
+
+	    CALL grid_timeduplicate(p_ghand(i_timeplus), p_ghand(i_time))
+
+!---------- if an old experiment is to be continued from stored data:
+
+	  ELSE new_experiment
+
+!---------- create grid from saveset, first compile filename
+
+	    i_tmp= p_param%num%i_experiment- 1
+	    write(c_tmp,*) trim(GRID_parameters%program_name), '_save.'
+	    write(c_file,1010) trim(c_tmp), i_tmp
+	    c_file= adjustl(c_file)
+
+	    CALL grid_readinitial(p_ghand, c_file)
+
+!---------- initialize wind field calculation
+
+	    CALL slm_windinit(p_param)
+
+	  END IF new_experiment
+
+	  RETURN
+ 1010	  FORMAT(a28,i4.4)
+	  END SUBROUTINE slm_initialize
+
+!*****************************************************************
+	  SUBROUTINE slm_finish(p_ghand, p_param)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                          :: p_param
+	  CHARACTER (len=32)                                       :: c_file
+	  CHARACTER (len=28)                                       :: c_tmp
+	  INTEGER                                                  :: i_tmp
+
+!---------- open and write saveset, if required
+
+	  save_req: IF(p_param%io%i_savelast /= 0) THEN
+
+	    i_tmp= p_param%num%i_experiment
+	    write(c_tmp,*) trim(GRID_parameters%program_name), '_save.'
+	    write(c_file,1010) trim(c_tmp), i_tmp
+	    c_file= adjustl(c_file)
+	    CALL grid_writesaveset(c_file, p_ghand)
+
+!---------- write parameter file for next experiment
+
+	    CALL io_putinputfile(p_param)
+	  END IF save_req
+
+!---------- gracefully terminate wind field calculations
+
+	  CALL slm_windquit
+
+	  RETURN
+ 1010	  FORMAT(a28,i4.4)
+	  END SUBROUTINE slm_finish
+
+!*****************************************************************
+	  SUBROUTINE slm_timestepping(p_ghand, p_param)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  INTEGER, PARAMETER                   :: i_innermax=15
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), &
+	                      INTENT(inout)    :: p_ghand
+	  TYPE (control_struct), INTENT(inout) :: p_param
+	  INTEGER                              :: i_timecount
+	  TYPE (sw_info)                       :: p_time, p_timeaux
+	  LOGICAL                              :: l_refined
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_tracer
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_coord, r_aux
+	  CHARACTER (len=32)                   :: c_file, c_matfile
+	  CHARACTER (len=28)                   :: c_tmp
+	  INTEGER                              :: i_tmp, &
+	    i_size, i_alct, i_tst, i_fst
+	  INTEGER                              :: i_iomatl=21
+	  REAL (KIND = GRID_SR)                :: r_modtime
+          INTEGER                              :: i_loopquit
+	  INTEGER                              :: i_newlen
+	  INTEGER, DIMENSION(2)                :: i_valind
+		
+!---------- VISNET variable init
+
+		i_loopquit = 0
+
+!---------- initialize timestep info structure
+
+	  p_timestepinfo%i_step       = 0
+	  p_timestepinfo%i_adapit     = 0
+	  p_timestepinfo%l_ploted     = .FALSE.
+	  p_timestepinfo%l_saved      = .FALSE.
+	  p_timestepinfo%r_modeltime  = 0.0
+
+!---------- initialize timing structure
+
+	  p_time%p_tim%r_tim   = 0.0
+	  p_time%p_tim%r_lap   = 0.0
+	  p_time%p_tim%c_tim   = '                '
+	  p_timeaux%p_tim%r_tim= 0.0
+	  p_timeaux%p_tim%r_lap= 0.0
+	  p_timeaux%p_tim%c_tim= '                '
+
+!---------- initialize stop watches
+
+	  CALL stop_watch_init(1,(/'total time      '/),p_timeaux)
+	  CALL stop_watch_init(8,(/'plotting        ', 'grid duplication', &
+	                           'trajectory calc.', 'right hand side ', &
+	                           'grid value updt.', 'grid adaption   ', &
+	                           'diagnostics     ', 'whole timestep  '/), p_time)
+	                           
+!---------- if diagnostics are demanded, initialize diagnostical output
+
+	  IF(p_param%io%l_diagnostics) THEN
+	    p_timestepinfo%i_step= 0
+	    CALL slm_diagnostics(p_grid(i_timeplus), p_param, p_timestepinfo, c_action='init')
+	  END IF
+
+!---------- plot initial data
+
+	  i_timecount= 0
+#ifndef NO_NETCDF
+	  IF(p_param%io%l_netcdf) THEN
+	    CALL plot_netcdf(p_ghand(i_timeplus), i_time=i_timecount)
+      END IF
+#endif
+	  IF(p_param%io%l_vtu) THEN
+	    CALL generate_vtu(p_ghand(i_timeplus), i_time=i_timecount)
+	  END IF
+!---------- put out initial information
+
+	  CALL io_putruntimeinfo(p_ghand(i_timeplus), p_timestepinfo, p_time)
+
+!---------- timestep loop
+
+      CALL stop_watch('start',1,p_timeaux)
+      CALL stop_watch('start',8,p_time)
+      i_timecount = 0_GRID_SI
+      p_timestepinfo%r_modeltime = p_param%num%r_starttime
+      time_loop: DO WHILE (p_timestepinfo%r_modeltime < p_param%num%r_finaltime - p_param%num%r_deltatime)
+        i_timecount                = i_timecount+ 1_GRID_SI
+        p_timestepinfo%i_step      = i_timecount
+        p_timestepinfo%r_modeltime = p_timestepinfo%r_modeltime + p_param%num%r_deltatime
+        p_timestepinfo%i_adapit    = 0_GRID_SI
+
+!---------- duplicate old grid, use it as first guess for new grid
+
+	    CALL stop_watch('start',2,p_time)
+	    CALL grid_timeduplicate(p_ghand(i_time), p_ghand(i_timeplus))
+	    CALL stop_watch('stop ',2,p_time)
+
+!---------- adaptive (inner) loop
+
+	    l_refined= .TRUE.
+	    adap_loop: DO WHILE(l_refined .AND. p_timestepinfo%i_adapit < i_innermax)
+	      p_timestepinfo%i_adapit= p_timestepinfo%i_adapit+ 1
+
+!---------- allocate and extract working arrays
+!---------- use amatos 1.2 functionality to calculate only new nodes
+
+	      i_size= p_ghand(i_timeplus)%i_nnumber
+	      allocate(r_aux(GRID_dimension,i_size), stat=i_alct)
+	      not_alloc: IF(i_alct /= 0) THEN
+	        CALL grid_error(38)
+	      END IF not_alloc
+
+!-SLM--------- do the following SLM calculations in arrays (grid-point-wise)
+
+	      CALL grid_getinfo(p_ghand(i_timeplus), r_nodecoordinates=r_aux, &
+	                        i_newsdepth= 1, i_nlength= i_newlen)
+	      allocate(r_tracer(2,i_newlen), r_coord(GRID_dimension,i_newlen), stat=i_alct)
+	      not_alloc0: IF(i_alct /= 0) THEN
+	        CALL grid_error(38)
+	      END IF not_alloc0
+	      r_coord(:,1:i_newlen)= r_aux(:,1:i_newlen)
+	      deallocate(r_aux)
+
+!-SLM--------- call the SLM step
+
+	      r_modtime= p_timestepinfo%r_modeltime- p_param%num%r_deltatime
+	      CALL slm_step(p_ghand, p_param, p_time, r_modtime, i_newlen, &
+	                    r_coord, r_tracer, i_newsdepth=1)
+
+!-SLM--------- update grid data structure and deallocate work arrays
+!-SLM--------- change back from (grid-point)arrays to grid data structure
+
+	      allocate(r_aux(1,i_newlen), stat=i_alct)
+	      not_alloc1: IF(i_alct /= 0) THEN
+	        CALL grid_error(38)
+	      END IF not_alloc1
+
+	      i_valind= (/ GRID_tracer, GRID_phi /)
+	      CALL grid_putinfo(p_ghand(i_timeplus), i_arraypoint= i_valind, &
+	                        i_newsdepth= 1, r_nodevalues= r_tracer)
+
+	      deallocate(r_coord, r_tracer, r_aux)
+
+!-SLM--------- adapt the grid corresponding to an error estimate
+
+	      CALL stop_watch('start',6,p_time)
+	      CALL slm_adapt(p_ghand(i_timeplus), p_param, l_refined)
+	      CALL stop_watch('stop ',6,p_time)
+
+	    END DO adap_loop
+
+!-SLM--------- insert a full advanced SLM step here, if required
+!-SLM--------- retrieve coordinates of grid points
+
+	    i_size= p_ghand(i_timeplus)%i_nnumber
+	    allocate(r_tracer(2,i_size), r_coord(GRID_dimension,i_size), stat=i_alct)
+	    not_allocfinal: IF(i_alct /= 0) THEN
+	      CALL grid_error(38)
+	    END IF not_allocfinal
+
+!-SLM--------- do the following SLM calculations in arrays (grid-point-wise)
+
+	    CALL grid_getinfo(p_ghand(i_timeplus), r_nodecoordinates=r_coord)
+
+!-SLM--------- call the SLM step
+
+	    r_modtime= p_timestepinfo%r_modeltime- p_param%num%r_deltatime
+	    CALL slm_astep(p_ghand, p_param, p_time, r_modtime, i_size, r_coord, r_tracer)
+
+!-SLM--------- update grid data structure and deallocate work arrays
+!-SLM--------- change back from (grid-point)arrays to grid data structure
+
+	      allocate(r_aux(1,i_size), stat=i_alct)
+	      not_allocfinal1: IF(i_alct /= 0) THEN
+	        CALL grid_error(38)
+	      END IF not_allocfinal1
+
+	      i_valind= (/ GRID_tracer, GRID_phi /)
+	      CALL grid_putinfo(p_ghand(i_timeplus), i_arraypoint= i_valind, &
+	                        r_nodevalues= r_tracer)
+
+	      deallocate(r_coord, r_tracer, r_aux)
+
+!---------- diagnostics, if requested
+
+	    IF(p_param%io%l_diagnostics) THEN
+	      CALL stop_watch('start',7,p_time)
+	      CALL slm_diagnostics(p_grid(i_timeplus), p_param, p_timestepinfo, c_action='diag')
+	      CALL stop_watch('stop ',7,p_time)
+	    END IF
+
+!---------- plot data (every [i_plotoffset]th timestep)
+
+	    CALL stop_watch('start',1,p_time)
+	    plot_step: IF(mod(i_timecount, p_param%io%i_plotoffset) == 0) THEN
+	      IF((p_param%io%l_netcdf) .OR. (p_param%io%l_vtu)) &
+	        p_timestepinfo%l_ploted= .TRUE.
+
+#ifndef NO_NETCDF
+	      IF(p_param%io%l_netcdf) THEN
+	        CALL plot_netcdf(p_ghand(i_timeplus), i_time=i_timecount)
+	      END IF
+#endif
+	      IF(p_param%io%l_vtu) THEN
+	        CALL generate_vtu(p_ghand(i_timeplus), i_time=i_timecount)
+	      END IF
+	    END IF plot_step
+	    CALL stop_watch('stop ',1,p_time)
+
+!---------- put a saveset to disc every ... timesteps
+
+	    save_step: IF((mod(i_timecount, p_param%io%i_saveoffset) == 0) .AND. &
+	                  (i_timecount > 1)) THEN
+	      i_tmp= p_param%num%i_experiment
+ 	      write(c_tmp,*) trim(GRID_parameters%program_name), '_save.'
+	      write(c_file,1010) trim(c_tmp), i_tmp
+	      c_file= adjustl(c_file)
+	      CALL grid_writesaveset(c_file,p_ghand)
+	      p_timestepinfo%l_saved= .TRUE.
+	    END IF save_step
+
+!---------- runtime information output
+
+	    CALL stop_watch('stop ',8,p_time)
+	    CALL io_putruntimeinfo(p_ghand(i_timeplus), p_timestepinfo, p_time)
+	    CALL stop_watch_init(8,(/'plotting        ', 'grid duplication', &
+	                             'trajectory calc.', 'right hand side ', &
+	                             'grid value updt.', 'grid adaption   ', &
+	                             'diagnostics     ', 'whole timestep  '/), p_time)
+	    CALL stop_watch('start',8,p_time)
+
+!---------- remove obsolecent grid items
+
+	    CALL grid_sweep
+
+!---------- toggle time handles for next step if gfx-proces has not exited
+
+	    CALL grid_timetoggle
+
+!---------- exit loop if graphics process has been terminated
+
+            IF (i_loopquit /= 0) EXIT time_loop
+
+	  END DO time_loop
+	  CALL stop_watch('stop ',1,p_timeaux)
+
+!---------- print total time
+
+ 	  write(GRID_parameters%ioout,1005)
+	  write(GRID_parameters%ioout,1003) p_timeaux%p_tim(1)%r_tim
+	  write(GRID_parameters%ioout,1004)
+	  IF(GRID_parameters%iolog > 0) THEN
+	    write(GRID_parameters%iolog,1003) p_timeaux%p_tim(1)%r_tim
+	  END IF
+
+!---------- terminate diagnostics
+
+	  IF(p_param%io%l_diagnostics) THEN
+	    CALL slm_diagnostics(p_grid(i_timeplus), p_param, p_timestepinfo, c_action='quit')
+	  END IF
+
+	  RETURN
+ 1000	  FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/ &
+	         1x,'*****            Runtime Information Output           *****',/ &
+	         1x,'***** ----- ----- ----- ----- ----- ----- ----- ----- *****')
+ 1003	  FORMAT(1x,'***** Total time for timesteps ',10x,e12.4,' *****')
+ 1004	  FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/)
+ 1005	  FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/ &
+	         1x,'*****             Final Information Output            *****',/ &
+	         1x,'***** ----- ----- ----- ----- ----- ----- ----- ----- *****')
+ 1010	  FORMAT(a28,i4.4)
+	  END SUBROUTINE slm_timestepping
+
+	END MODULE ADV_semilagrange
diff --git a/flash2d/src/options/ADV_semilagrange.sim.F90 b/flash2d/src/options/ADV_semilagrange.sim.F90
new file mode 100644
index 0000000..b76fed7
--- /dev/null
+++ b/flash2d/src/options/ADV_semilagrange.sim.F90
@@ -0,0 +1,850 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	ADV_semilagrange
+! FUNCTION:
+!	perform semi-Lagrangian advection
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_adapt
+! FUNCTION:
+!	adapt the grid according to an error estimate
+! SYNTAX:
+!	CALL slm_adapt(grid, param, logical)
+! ON INPUT:
+!	p_ghand:   handle for the grid		TYPE (grid_handle)
+!	p_param:   global parameter structure	TYPE (global_param)
+! ON OUTPUT:
+!	l_changed: flag for changed grid	LOGICAL
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialize
+! FUNCTION:
+!	initialize the advection problem
+! SYNTAX:
+!	CALL slm_initialize(grid, param)
+! ON INPUT:
+!	p_param: parameter data structure	TYPE (global_param)
+! ON OUTPUT:
+!	p_ghand: grid handling data structure	TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_finish
+! FUNCTION:
+!	terminate slm (free dynamically alloc. memory, ...)
+! SYNTAX:
+!	CALL slm_finish(grid, param)
+! ON INPUT:
+!	p_ghand: grid handling data structure	TYPE (grid_handle)
+!	p_param: parameter data structure	TYPE (global_param)
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_timestepping
+! FUNCTION:
+!	perform the timestepping in the slm
+! SYNTAX:
+!	CALL slm_timestepping(grid, param, cmd)
+! ON INPUT:
+!	p_ghand: grid handling data structure	TYPE (grid_handle)
+!	p_param: parameter data structure	TYPE (global_param)
+!	p_cmdln: command line argument struct.	TYPE (cmdline)
+! ON OUTPUT:
+!	p_ghand: grid handling data structure	TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_displace, slm_update, slm_upstream
+!	slm_initialize, slm_finish, slm_timestepping
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, FEM_handle
+!	FEM_errorestimate, FEM_param
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	10/96
+!	2. several improvements/fixes	j. behrens	11/96-1/97
+!	3. nodal values time depend.	j. behrens	1/97
+!	4. stop_watch removed, plot	j. behrens	1/97
+!	   (position) changed, inner
+!	   iteration counter added
+!	5. slm_adapt changed 		j. behrens	2/97
+!	6. slm_adapt changed to hide
+!	   grid data structures		j. behrens	7/97
+!	7. control data structure	j. behrens	12/97
+!	8. non-homog. rhs added		j. behrens	2/98
+!	9. compliant to amatos 1.0	j. behrens	12/2000
+!	10. compliant to amatos 1.2	j. behrens	3/2002
+!	11. compliant to amatos 2.0	j. behrens	7/2003
+!       12. added visnetplot            f. klaschka     12/2003
+!
+!*****************************************************************
+	MODULE ADV_semilagrange
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE IO_vtuplot
+#ifndef NO_NETCDF
+	  USE IO_netcdfplot
+#endif
+	  USE IO_utils
+	  USE GRID_api
+	  USE SLM_errorestimate
+	  USE SLM_initial
+	  USE SLM_simple
+	  USE SLM_advanced
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_initialize, slm_finish, slm_timestepping
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_adapt(p_ghand, p_param, l_changed, l_water)
+
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (grid_handle), INTENT(inout)      :: p_ghand
+	  TYPE (control_struct), INTENT(in)      :: p_param
+	  LOGICAL, INTENT(out)                   :: l_changed
+	  LOGICAL, OPTIONAL, INTENT(in)          :: l_water
+	  LOGICAL                                :: l_switch
+	  REAL (KIND = GRID_SR)                                   :: r_errmx, &
+	    r_refcrit, r_crscrit, r_fac
+	  INTEGER                                :: i_size, &
+	    i_manyc, i_manyr, i_alct, i_cnt
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE        :: r_aux1
+	  INTEGER, DIMENSION(:), ALLOCATABLE     :: i_aux1, i_aux2, i_aux3
+	  LOGICAL                                :: l_ref, l_crs
+
+!---------- initialize refinement flag
+
+	  l_changed= .FALSE.
+
+!---------- handle watermark switch
+
+	  wat_present: IF(present(l_water)) THEN
+	    l_switch= l_water
+	  ELSE wat_present
+	    l_switch= .TRUE.
+	  END IF wat_present
+
+!---------- allocate work arrays
+
+	  i_size= p_ghand%i_enumfine
+	  allocate(r_aux1(i_size), i_aux1(i_size), i_aux2(i_size), &
+                   i_aux3(i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(35)
+	  END IF not_alloc
+
+!---------- estimate the local error
+
+	  CALL slm_errorest(p_ghand, i_size, r_aux1)
+
+!---------- set coarsening/refinement criterion
+
+	  r_errmx= maxval(r_aux1(1:i_size))
+	  r_crscrit= r_errmx* p_param%num%r_crstolerance
+	  r_refcrit= r_errmx* p_param%num%r_reftolerance
+
+!---------- get level information and set up flags for refinement/coarsening
+
+	  CALL grid_getinfo(p_ghand, l_finelevel= .TRUE., i_elementlevel= i_aux1, &
+	                    i_elementstatus= i_aux3)
+	  DO i_cnt=1,i_size
+	    i_aux2(i_cnt)= 0
+	    IF((i_aux1(i_cnt) > p_param%num%i_crslevel) .AND. &
+	       (r_aux1(i_cnt) < r_crscrit)) i_aux2(i_cnt)= GRID_pleasecoarse
+	    IF((i_aux1(i_cnt) < p_param%num%i_reflevel) .AND. &
+	       (r_aux1(i_cnt) > r_refcrit)) i_aux2(i_cnt)= GRID_pleaserefine
+	  END DO
+
+!---------- determine if there is enough to be done (this can be
+!           switched off by l_water=.FALSE.)
+
+	  IF(l_switch) THEN
+	    i_manyr= count(i_aux2 == GRID_pleaserefine)
+	    r_fac= real(i_manyr,GRID_SR)/ real(i_size,GRID_SR)
+	    enough_ref: IF(r_fac > p_param%num%r_refwatermark) THEN
+	      l_ref= .TRUE.
+	    ELSE
+	      l_ref= .FALSE.
+	    END IF enough_ref
+
+	    i_manyc= count(i_aux2 == GRID_pleasecoarse)
+	    r_fac= real(i_manyc,GRID_SR)/ real(i_size,GRID_SR)
+	    enough_crs: IF(r_fac > p_param%num%r_crswatermark) THEN
+	      l_crs= .TRUE.
+	    ELSE
+	      l_crs= .FALSE.
+	    END IF enough_crs
+	  ELSE
+	    l_ref= .TRUE.
+	    l_crs= .TRUE.
+	  END IF
+
+!---------- update grid flags
+
+	  update: IF(l_ref .OR. l_crs) THEN
+	    IF(l_ref) i_aux3= merge(i_aux2, i_aux3, i_aux2==GRID_pleaserefine)
+	    IF(l_crs) i_aux3= merge(i_aux2, i_aux3, i_aux2==GRID_pleasecoarse)
+	    CALL grid_putinfo(p_ghand, l_finelevel= .TRUE., i_elementstatus= i_aux3)
+	  END IF update
+
+!---------- deallocate work arrays
+
+	  deallocate(r_aux1, i_aux1, i_aux2, i_aux3)
+
+!---------- adapt the grid
+
+	  CALL grid_adapt(p_ghand, l_changed)
+
+	  RETURN
+	  END SUBROUTINE slm_adapt
+
+!*****************************************************************
+	  SUBROUTINE slm_diagnostics(p_ghand, p_param, p_tinfo, c_action)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (grid_handle), INTENT(in)           :: p_ghand
+	  TYPE (control_struct), INTENT(inout)     :: p_param
+	  TYPE (rt_info), INTENT(in)               :: p_tinfo
+	  CHARACTER (len=4), INTENT(in), OPTIONAL  :: c_action
+	  INTEGER, SAVE                            :: i_iodiag
+	  CHARACTER (len=32)                       :: c_file
+	  CHARACTER (len=28)                       :: c_tmp
+	  REAL (KIND = GRID_SR), PARAMETER                          :: r_1o3= (1./3.)
+	  INTEGER                                  :: i_fst, i_tmp, &
+	    i_size, i_alct, i_1, i_2, i_3, i_4, i_5, i_6
+	  REAL (KIND = GRID_SR), SAVE                               :: r_rfm0, r_rsm0
+	  REAL (KIND = GRID_SR)                                     :: r_dispn, r_rfm, r_rsm, &
+	    r_ts, r_calci, r_calcs, r_mxnrm, r_l2nrm, r_max, r_min, r_diffn, &
+	    r_medln
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE          :: r_aux1, r_aux2, &
+	    r_aux3, r_aux4
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_auxx
+	  INTEGER, DIMENSION(1)                    :: i_valind
+
+!---------- action init
+
+	  present_act: IF(present(c_action)) THEN
+	    action_type: IF(c_action == 'init') THEN
+
+!---------- open file for diagnostic output
+
+	      i_iodiag= 9
+	      i_tmp   = p_param%num%i_experiment
+	      write(c_tmp,*) trim(GRID_parameters%program_name), '_diag.'
+	      write(c_file,1010) trim(c_tmp), i_tmp
+	      c_file= adjustl(c_file)
+	      open(i_iodiag, file= c_file, action= 'write', form= 'formatted', &
+	           iostat= i_fst)
+	      not_opened: IF(i_fst /= 0) THEN
+	        CALL grid_error(36)
+	      END IF not_opened
+	      IF(GRID_parameters%iolog > 0) &
+	        write(GRID_parameters%iolog,*) 'INFO: Filename: ', c_file, ' opened on unit: ', i_iodiag
+
+!---------- allocate workspace
+
+	      i_size= p_ghand%i_nnumber
+	      allocate(r_aux1(i_size), r_aux2(i_size), r_aux3(i_size), &
+	               r_aux4(i_size), r_auxx(1,i_size), stat=i_alct)
+	      not_alloc: IF(i_alct /= 0) THEN
+	        CALL grid_error(37)
+	      END IF not_alloc 
+	      r_aux1= 0.0; r_aux2= 0.0; r_aux3= 0.0; r_aux4= 0.0
+
+!---------- get minimum edge length
+
+	      CALL grid_edgelength(p_ghand, r_min=r_medln)
+
+!---------- calculate reference values, ... extract actual calculated concentration
+
+	      i_valind= (/ GRID_tracer /)
+	      CALL grid_getinfo(p_ghand, i_arraypoint=i_valind, &
+	                        r_nodevalues= r_auxx)
+	      r_aux1(:)= r_auxx(1,:)
+	      DEALLOCATE(r_auxx)
+
+!---------- calculate area pieces for each node
+
+	      CALL grid_nodearea(p_ghand, i_size, r_aux2)
+
+!---------- calculate analytical solution
+
+	      r_ts= p_param%num%r_deltatime* float(p_tinfo%i_step)
+	      CALL slm_analyticsolution(p_ghand, r_ts, i_size, r_aux3)
+
+!---------- now the integral of the concentration (mass) is
+
+	      r_calci= dot_product(r_aux1, r_aux2)
+	      r_rfm0 = r_calci
+
+!---------- the integral of the squared concentration ("entropy"(?)) is
+
+	      r_aux4 = r_aux1* r_aux1
+	      r_calcs= dot_product(r_aux4, r_aux2)
+	      r_rsm0 = r_calcs
+
+!---------- the maximum-norm of the error is
+
+	      r_aux4 = abs(r_aux1- r_aux3)
+	      r_mxnrm= maxval(r_aux4)
+
+!---------- the l2-norm of the error is
+
+	      r_aux4 = r_aux4* r_aux4
+	      r_l2nrm= dot_product(r_aux4, r_aux2)
+
+!---------- maximum and minimum
+
+	      r_max  = maxval(r_aux1)
+	      r_min  = minval(r_aux1)
+
+!---------- diffusion and dispersion (not yet implemented)
+
+	      r_diffn= 0.0
+	      r_dispn= 0.0
+
+!---------- print it
+
+	      r_rfm= r_calci/r_rfm0
+	      r_rsm= r_calcs/r_rsm0
+	      write(i_iodiag,1100) GRID_parameters%program_name, GRID_parameters%version, &
+	                           GRID_parameters%subversion, GRID_parameters%patchversion
+	      i_1= p_tinfo%i_step
+	      i_2= p_ghand%i_enumber
+	      i_3= p_ghand%i_enumfine
+	      i_4= p_ghand%i_gnumber
+	      i_5= p_ghand%i_gnumfine
+	      i_6= p_ghand%i_nnumber
+	      write(i_iodiag,1000) i_1, i_2, i_3, i_4, i_5, i_6, r_min, r_max, &
+	                           r_rfm, r_rsm, r_mxnrm, r_l2nrm, r_diffn, &
+				   r_dispn, r_medln
+
+!---------- deallocate workspace
+
+	      deallocate(r_aux1, r_aux2, r_aux3, r_aux4)
+
+!---------- initialization done
+
+	      RETURN
+
+!---------- action quit
+
+	    ELSE IF(c_action == 'quit') THEN action_type
+
+!---------- close diagnostic output file
+
+	      close(i_iodiag)
+ 	      IF(GRID_parameters%iolog > 0) &
+	        write(GRID_parameters%iolog,*) 'INFO: Closed file on unit: ', i_iodiag
+
+!---------- action quit done
+
+	      RETURN
+	    END IF action_type
+	  END IF present_act
+
+!---------- action diag (default): allocate workspace
+
+	  i_size= p_ghand%i_nnumber
+	  allocate(r_aux1(i_size), r_aux2(i_size), r_aux3(i_size), &
+	           r_aux4(i_size), r_auxx(1,i_size), stat=i_alct)
+	  not_allc: IF(i_alct /= 0) THEN
+	    CALL grid_error(37)
+	  END IF not_allc 
+	  r_aux1= 0.0; r_aux2= 0.0; r_aux3= 0.0; r_aux4= 0.0
+
+!---------- get minimum edge length
+
+	  CALL grid_edgelength(p_ghand, r_min=r_medln)
+
+!---------- calculate reference values, ... extract actual calculated concentration
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_getinfo(p_ghand, i_arraypoint=i_valind, &
+	  		   r_nodevalues= r_auxx)
+	  r_aux1(:)= r_auxx(1,:)
+	  DEALLOCATE(r_auxx)
+
+!---------- calculate area pieces for each node
+
+	  CALL grid_nodearea(p_ghand, i_size, r_aux2)
+
+!---------- calculate analytical solution
+
+	  r_ts= p_param%num%r_deltatime* float(p_tinfo%i_step)
+	  CALL slm_analyticsolution(p_ghand, r_ts, i_size, r_aux3)
+
+!---------- now the integral of the concentration (mass) is
+
+	  r_calci= dot_product(r_aux1, r_aux2)
+
+!---------- the integral of the squared concentration ("entropy"(?)) is
+
+	  r_aux4 = r_aux1* r_aux1
+	  r_calcs= dot_product(r_aux4, r_aux2)
+
+!---------- the maximum-norm of the error is
+
+	  r_aux4 = abs(r_aux1- r_aux3)
+	  r_mxnrm= maxval(r_aux4)
+
+!---------- the l2-norm of the error is
+
+	  r_aux4 = r_aux4* r_aux4
+	  r_l2nrm= dot_product(r_aux4, r_aux2)
+
+!---------- maximum and minimum
+
+	  r_max  = maxval(r_aux1)
+	  r_min  = minval(r_aux1)
+
+!---------- diffusion and dispersion (not yet implemented)
+
+	  r_diffn= 0.0
+	  r_dispn= 0.0
+
+!---------- print it
+
+	  r_rfm= r_calci/r_rfm0
+	  r_rsm= r_calcs/r_rsm0
+	  i_1= p_tinfo%i_step
+	  i_2= p_ghand%i_enumber
+	  i_3= p_ghand%i_enumfine
+	  i_4= p_ghand%i_gnumber
+	  i_5= p_ghand%i_gnumfine
+	  i_6= p_ghand%i_nnumber
+	  write(i_iodiag,1000) i_1, i_2, i_3, i_4, i_5, i_6, r_min, r_max, &
+	                       r_rfm, r_rsm, r_mxnrm, r_l2nrm, r_diffn, &
+	                       r_dispn, r_medln
+
+!---------- deallocate workspace
+
+	  deallocate(r_aux1, r_aux2, r_aux3, r_aux4)
+
+	  RETURN
+ 1000	  FORMAT(1x, i10, 1x, i10, 1x, i10, 1x, i10, 1x, i10, 1x, i10, &
+	         1x, e15.8, 1x, e15.8, 1x, e15.8, 1x, e15.8,&
+	         1x, e15.8, 1x, e15.8, 1x, e15.8, 1x, e15.8,&
+	         1x, e15.8)
+ 1010	  FORMAT(a28,i4.4)
+ 1100	  FORMAT(1x,'*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '*************************************',/ &
+	         1x,'***** PROGRAM: ',a15,174x,'*****',/ &
+	         1x,'***** VERSION: ',i2.2,'.',i2.2,'.',i2.2,181x,'*****',/ &
+	         1x,'***** Diagnostic output ',180x,'*****',/ &
+	         1x,'*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '*************************************',/ &
+	         1x,'* timestep ','  elements ','  fine el. ','     edges ', &
+	            '  fine ed. ','     nodes ','        minimum ', &
+	            '        maximum ','            RFM ','            RSM ', &
+                    '       max-norm ','        l2-norm ','      diffusion ', &
+	            '     dispersion ',' min.edge len.*',/ &
+	         1x,'*******************************************', &
+	            '*******************************************', &
+	            '*******************************************', &
+	            '******************************************', &
+	            '**************************************')
+	  END SUBROUTINE slm_diagnostics
+
+!*****************************************************************
+	  SUBROUTINE slm_initialize(p_ghand, p_param)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(out) :: p_ghand
+	  TYPE (control_struct), INTENT(inout)          :: p_param
+
+	  INTEGER                                     :: i_steps
+	  CHARACTER (len=32)                          :: c_file
+	  CHARACTER (len=28)                          :: c_tmp
+	  INTEGER                                     :: i_tmp, i_cnt
+	  LOGICAL                                     :: l_refined
+	  INTEGER                                     :: i_vertnum
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER               :: r_vertinit
+
+!---------- decide whether a new experiment is startet or an old one is continued
+
+	  new_experiment: IF(p_param%num%i_experiment <= 0) THEN
+
+!---------- reset timesteps (start with 1 in any case)
+
+	    time_one: IF(p_param%num%i_frsttimestep /= 1) THEN
+	      IF(GRID_parameters%iolog > 0) &
+	        write(GRID_parameters%iolog,*) 'WARNING      : Timestep counters reset due to new experiment'
+	      i_steps= p_param%num%i_lasttimestep- p_param%num%i_frsttimestep
+	      p_param%num%i_frsttimestep= 1
+	      p_param%num%i_lasttimestep= p_param%num%i_frsttimestep+ i_steps
+	    END IF time_one
+
+!---------- initialize grid parameters
+
+	    CALL grid_setparameter(p_ghand, i_coarselevel= p_param%num%i_crslevel, &
+	                           i_finelevel= p_param%num%i_reflevel)
+
+!---------- define domain, first read data from file (compiled here)
+
+	    CALL grid_readdomain(i_vertnum, r_vertinit, c_readfile=p_param%io%c_domainfile)
+	    CALL grid_definegeometry(i_vertnum, r_vertexarr= r_vertinit)
+
+!---------- create initial triangulation
+
+	    CALL grid_createinitial(p_ghand, c_filename=p_param%io%c_triangfile)
+
+!---------- initialize grid and adapt at steep gradients
+
+	    i_cnt= 0
+	    l_refined= .TRUE.
+	    refine_loop: DO WHILE (l_refined)
+	      CALL slm_initialvalues(p_ghand(i_timeplus))
+	      CALL slm_adapt(p_ghand(i_timeplus), p_param, l_refined, &
+	                     l_water=.FALSE.)
+	    END DO refine_loop
+
+!---------- duplicate grid (old time)
+
+	    CALL grid_timeduplicate(p_ghand(i_timeplus), p_ghand(i_time))
+
+!---------- initialize wind field calculation
+
+	    CALL slm_windinit(p_param)
+
+!---------- if an old experiment is to be continued from stored data:
+
+	  ELSE new_experiment
+
+!---------- create grid from saveset, first compile filename
+
+	    i_tmp= p_param%num%i_experiment- 1
+	    write(c_tmp,*) trim(GRID_parameters%program_name), '_save.'
+	    write(c_file,1010) trim(c_tmp), i_tmp
+	    c_file= adjustl(c_file)
+
+	    CALL grid_readinitial(p_ghand, c_file)
+
+!---------- initialize wind field calculation
+
+	    CALL slm_windinit(p_param)
+
+	  END IF new_experiment
+
+	  RETURN
+ 1010	  FORMAT(a28,i4.4)
+	  END SUBROUTINE slm_initialize
+
+!*****************************************************************
+	  SUBROUTINE slm_finish(p_ghand, p_param)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                          :: p_param
+	  CHARACTER (len=32)                                       :: c_file
+	  CHARACTER (len=28)                                       :: c_tmp
+	  INTEGER                                                  :: i_tmp
+
+!---------- open and write saveset, if required
+
+	  save_req: IF(p_param%io%i_savelast /= 0) THEN
+
+	    i_tmp= p_param%num%i_experiment
+	    write(c_tmp,*) trim(GRID_parameters%program_name), '_save.'
+	    write(c_file,1010) trim(c_tmp), i_tmp
+	    c_file= adjustl(c_file)
+	    CALL grid_writesaveset(c_file, p_ghand)
+
+!---------- write parameter file for next experiment
+
+	    CALL io_putinputfile(p_param)
+	  END IF save_req
+
+!---------- gracefully terminate wind field calculations
+
+	  CALL slm_windquit
+
+	  RETURN
+ 1010	  FORMAT(a28,i4.4)
+	  END SUBROUTINE slm_finish
+
+!*****************************************************************
+	  SUBROUTINE slm_timestepping(p_ghand, p_param)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  INTEGER, PARAMETER                   :: i_innermax=15
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), &
+	                      INTENT(inout)    :: p_ghand
+	  TYPE (control_struct), INTENT(inout) :: p_param
+	  INTEGER                              :: i_timecount
+	  TYPE (sw_info)                       :: p_time, p_timeaux
+	  LOGICAL                              :: l_refined
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE      :: r_tracer
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_coord, r_aux
+	  CHARACTER (len=32)                   :: c_file, c_matfile
+	  CHARACTER (len=28)                   :: c_tmp
+	  INTEGER                              :: i_tmp, &
+	    i_size, i_alct, i_tst, i_fst
+	  INTEGER                              :: i_iomatl=21
+	  REAL (KIND = GRID_SR)                :: r_modtime
+          INTEGER                              :: i_loopquit
+	  INTEGER                              :: i_newlen
+	  INTEGER, DIMENSION(1)                :: i_valind
+		
+!---------- VISNET variable init
+
+		i_loopquit = 0		
+
+!---------- initialize timestep info structure
+
+	  p_timestepinfo%i_step       = 0
+	  p_timestepinfo%i_adapit     = 0
+	  p_timestepinfo%l_ploted     = .FALSE.
+	  p_timestepinfo%l_saved      = .FALSE.
+	  p_timestepinfo%r_modeltime  = 0.0
+
+!---------- initialize timing structure
+
+	  p_time%p_tim%r_tim   = 0.0
+	  p_time%p_tim%r_lap   = 0.0
+	  p_time%p_tim%c_tim   = '                '
+	  p_timeaux%p_tim%r_tim= 0.0
+	  p_timeaux%p_tim%r_lap= 0.0
+	  p_timeaux%p_tim%c_tim= '                '
+
+!---------- initialize stop watches
+
+	  CALL stop_watch_init(1,(/'total time      '/),p_timeaux)
+	  CALL stop_watch_init(8,(/'plotting        ', 'grid duplication', &
+	                           'trajectory calc.', 'right hand side ', &
+	                           'grid value updt.', 'grid adaption   ', &
+	                           'diagnostics     ', 'whole timestep  '/), p_time)
+	                           
+!---------- if diagnostics are demanded, initialize diagnostical output
+
+	  IF(p_param%io%l_diagnostics) THEN
+	    p_timestepinfo%i_step= 0
+	    CALL slm_diagnostics(p_grid(i_timeplus), p_param, p_timestepinfo, c_action='init')
+	  END IF
+
+!---------- plot initial data
+
+	  i_timecount= 0
+#ifndef NO_NETCDF
+	  IF(p_param%io%l_netcdf) THEN
+	    CALL plot_netcdf(p_ghand(i_timeplus), i_time=i_timecount)
+      END IF
+#endif
+	  IF(p_param%io%l_vtu) THEN
+	    CALL generate_vtu(p_ghand(i_timeplus), i_time=i_timecount)
+	  END IF
+!---------- put out initial information
+
+	  CALL io_putruntimeinfo(p_ghand(i_timeplus), p_timestepinfo, p_time)
+
+!---------- timestep loop
+
+      CALL stop_watch('start',1,p_timeaux)
+      CALL stop_watch('start',8,p_time)
+      i_timecount = 0_GRID_SI
+      p_timestepinfo%r_modeltime = p_param%num%r_starttime
+      time_loop: DO WHILE (p_timestepinfo%r_modeltime < p_param%num%r_finaltime - p_param%num%r_deltatime)
+        i_timecount                = i_timecount+ 1_GRID_SI
+        p_timestepinfo%i_step      = i_timecount
+        p_timestepinfo%r_modeltime = p_timestepinfo%r_modeltime + p_param%num%r_deltatime
+        p_timestepinfo%i_adapit    = 0_GRID_SI
+
+!---------- duplicate old grid, use it as first guess for new grid
+
+	    CALL stop_watch('start',2,p_time)
+	    CALL grid_timeduplicate(p_ghand(i_time), p_ghand(i_timeplus))
+	    CALL stop_watch('stop ',2,p_time)
+
+!---------- adaptive (inner) loop
+
+	    l_refined= .TRUE.
+	    adap_loop: DO WHILE(l_refined .AND. p_timestepinfo%i_adapit < i_innermax)
+	      p_timestepinfo%i_adapit= p_timestepinfo%i_adapit+ 1
+
+!---------- allocate and extract working arrays
+!---------- use amatos 1.2 functionality to calculate only new nodes
+
+	      i_size= p_ghand(i_timeplus)%i_nnumber
+	      allocate(r_aux(GRID_dimension,i_size), stat=i_alct)
+	      not_alloc: IF(i_alct /= 0) THEN
+	        CALL grid_error(38)
+	      END IF not_alloc
+
+!-SLM--------- do the following SLM calculations in arrays (grid-point-wise)
+
+	      CALL grid_getinfo(p_ghand(i_timeplus), r_nodecoordinates=r_aux, &
+	                        i_newsdepth= 1, i_nlength= i_newlen)
+	      allocate(r_tracer(i_newlen), r_coord(GRID_dimension,i_newlen), stat=i_alct)
+	      not_alloc0: IF(i_alct /= 0) THEN
+	        CALL grid_error(38)
+	      END IF not_alloc0
+	      r_coord(:,1:i_newlen)= r_aux(:,1:i_newlen)
+	      deallocate(r_aux)
+
+!-SLM--------- call the SLM step
+
+	      r_modtime= p_timestepinfo%r_modeltime- p_param%num%r_deltatime
+	      CALL slm_step(p_ghand, p_param, p_time, r_modtime, i_newlen, &
+	                    r_coord, r_tracer, i_newsdepth=1)
+
+!-SLM--------- update grid data structure and deallocate work arrays
+!-SLM--------- change back from (grid-point)arrays to grid data structure
+
+	      allocate(r_aux(1,i_newlen), stat=i_alct)
+	      not_alloc1: IF(i_alct /= 0) THEN
+	        CALL grid_error(38)
+	      END IF not_alloc1
+	      r_aux(1,:)= r_tracer(:)
+	      i_valind= (/ GRID_tracer /)
+	      CALL grid_putinfo(p_ghand(i_timeplus), i_arraypoint= i_valind, &
+	                        i_newsdepth= 1, r_nodevalues= r_aux)
+
+	      deallocate(r_coord, r_tracer, r_aux)
+
+!-SLM--------- adapt the grid corresponding to an error estimate
+
+	      CALL stop_watch('start',6,p_time)
+	      CALL slm_adapt(p_ghand(i_timeplus), p_param, l_refined)
+	      CALL stop_watch('stop ',6,p_time)
+
+	    END DO adap_loop
+
+!---------- diagnostics, if requested
+
+	    IF(p_param%io%l_diagnostics) THEN
+	      CALL stop_watch('start',7,p_time)
+	      CALL slm_diagnostics(p_grid(i_timeplus), p_param, p_timestepinfo, c_action='diag')
+	      CALL stop_watch('stop ',7,p_time)
+	    END IF
+
+!---------- plot data (every [i_plotoffset]th timestep)
+
+	    CALL stop_watch('start',1,p_time)
+	    plot_step: IF(mod(i_timecount, p_param%io%i_plotoffset) == 0) THEN
+	      IF((p_param%io%l_netcdf) .OR. (p_param%io%l_vtu)) &
+	        p_timestepinfo%l_ploted= .TRUE.
+
+#ifndef NO_NETCDF
+	      IF(p_param%io%l_netcdf) THEN
+	        CALL plot_netcdf(p_ghand(i_timeplus), i_time=i_timecount)
+	      END IF
+#endif
+	      IF(p_param%io%l_vtu) THEN
+	        CALL generate_vtu(p_ghand(i_timeplus), i_time=i_timecount)
+	      END IF
+	    END IF plot_step
+	    CALL stop_watch('stop ',1,p_time)
+
+!---------- put a saveset to disc every ... timesteps
+
+	    save_step: IF((mod(i_timecount, p_param%io%i_saveoffset) == 0) .AND. &
+	                  (i_timecount > 1)) THEN
+	      i_tmp= p_param%num%i_experiment
+ 	      write(c_tmp,*) trim(GRID_parameters%program_name), '_save.'
+	      write(c_file,1010) trim(c_tmp), i_tmp
+	      c_file= adjustl(c_file)
+	      CALL grid_writesaveset(c_file,p_ghand)
+	      p_timestepinfo%l_saved= .TRUE.
+	    END IF save_step
+
+!---------- runtime information output
+
+	    CALL stop_watch('stop ',8,p_time)
+	    CALL io_putruntimeinfo(p_ghand(i_timeplus), p_timestepinfo, p_time)
+	    CALL stop_watch_init(8,(/'plotting        ', 'grid duplication', &
+	                             'trajectory calc.', 'right hand side ', &
+	                             'grid value updt.', 'grid adaption   ', &
+	                             'diagnostics     ', 'whole timestep  '/), p_time)
+	    CALL stop_watch('start',8,p_time)
+
+!---------- remove obsolecent grid items
+
+	    CALL grid_sweep
+
+!---------- toggle time handles for next step if gfx-proces has not exited
+
+	    CALL grid_timetoggle
+
+!---------- exit loop if graphics process has been terminated
+
+            IF (i_loopquit /= 0) EXIT time_loop
+
+	  END DO time_loop
+	  CALL stop_watch('stop ',1,p_timeaux)
+
+!---------- print total time
+
+ 	  write(GRID_parameters%ioout,1005)
+	  write(GRID_parameters%ioout,1003) p_timeaux%p_tim(1)%r_tim
+	  write(GRID_parameters%ioout,1004)
+	  IF(GRID_parameters%iolog > 0) THEN
+	    write(GRID_parameters%iolog,1003) p_timeaux%p_tim(1)%r_tim
+	  END IF
+
+!---------- terminate diagnostics
+
+	  IF(p_param%io%l_diagnostics) THEN
+	    CALL slm_diagnostics(p_grid(i_timeplus), p_param, p_timestepinfo, c_action='quit')
+	  END IF
+
+	  RETURN
+ 1000	  FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/ &
+	         1x,'*****            Runtime Information Output           *****',/ &
+	         1x,'***** ----- ----- ----- ----- ----- ----- ----- ----- *****')
+ 1003	  FORMAT(1x,'***** Total time for timesteps ',10x,e12.4,' *****')
+ 1004	  FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/)
+ 1005	  FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****',/ &
+	         1x,'*****             Final Information Output            *****',/ &
+	         1x,'***** ----- ----- ----- ----- ----- ----- ----- ----- *****')
+ 1010	  FORMAT(a28,i4.4)
+	  END SUBROUTINE slm_timestepping
+
+	END MODULE ADV_semilagrange
diff --git a/flash2d/src/options/ADV_wind.algae.f90 b/flash2d/src/options/ADV_wind.algae.f90
new file mode 100644
index 0000000..b2bebfa
--- /dev/null
+++ b/flash2d/src/options/ADV_wind.algae.f90
@@ -0,0 +1,808 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	ADV_wind
+! FUNCTION:
+!	calculate the windfield for the advection problem
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_windfield
+! FUNCTION:
+!	calculate the advecting force for simple advection
+! SYNTAX:
+!	real.arr= slm_windfield(real.arr, real)
+! ON INPUT:
+!	r_coord: coordinates of point		real
+!	r_time:  time coordinate (optional)	real
+! ON OUTPUT:
+!	r_field: windfield			real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	12/97
+!	2. bug fix concerning interp.	j. behrens	2/98
+!	3. compliant to amatos 1.0	j. behrens	12/2000
+!	4. compliant to amatos 1.2	j. behrens	3/2002
+!	5. new version for course tracer transport	j. behrens 01/2012
+!
+!*****************************************************************
+	MODULE ADV_wind
+	  USE GRID_api
+	  USE FLASH_parameters
+	  PRIVATE
+	  INTEGER, PARAMETER        :: i_ioerr=0
+	  REAL (KIND = GRID_SR)     :: r_intervallen, r_readlast
+	  REAL (KIND = GRID_SR)     :: r_ncupdatelast, r_secperstep
+	  CHARACTER (LEN=io_fillen)                            :: c_windpath
+	  CHARACTER (LEN=io_fillen), DIMENSION(:), ALLOCATABLE :: c_windfile
+	  CHARACTER (LEN=io_fillen)                            :: c_tempfile
+	  REAL (KIND = GRID_SR), DIMENSION(:,:,:), ALLOCATABLE :: r_flowx
+	  REAL (KIND = GRID_SR), DIMENSION(:,:,:), ALLOCATABLE :: r_flowy
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE   :: r_inittemp
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE     :: r_lat, r_vlat
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE     :: r_lon, r_ulon
+      INTEGER (KIND = GRID_SI)  :: i_lon, i_lat, i_timesteps, i_level, i_numfiles
+	  INTEGER (KIND = GRID_SI)  :: i_pointsx, i_pointsy
+	  INTEGER (KIND = GRID_SI)  :: i_timeinterval, i_intervalnum, i_stepcounter
+	  LOGICAL                   :: l_lonlatread
+	  
+	  PUBLIC                    :: slm_windfield, slm_windinit, slm_windquit
+	  PUBLIC                    :: slm_tempfield
+	  
+	  CONTAINS
+!*****************************************************************
+	  FUNCTION slm_windfield(r_coord, r_time) RESULT (r_field)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_field
+	  REAL (KIND = GRID_SR)                       :: r_tim
+      CHARACTER (LEN=2*io_fillen)                 :: c_ncfile
+	  INTEGER (KIND = GRID_SI)                    :: i_iost, i_cnt, j_cnt
+
+!---------- set time
+
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- decide, if data has to be read
+
+	  data_read: IF(r_readlast <= r_tim) THEN
+
+!---------- update values for next open
+
+	    r_readlast    = r_readlast+ r_intervallen
+	    i_timeinterval= i_timeinterval+ 1
+	    IF(i_timeinterval > i_numfiles) THEN
+	      CALL grid_error(i_error=1,c_error='[slm_windfield]: no more current files in list, fixing last one')
+          i_timeinterval = i_numfiles
+        END IF
+        i_stepcounter = 0_GRID_SI
+
+!---------- create filenames
+
+	    write(c_ncfile,*) trim(c_windpath),c_windfile(i_timeinterval)
+	    c_ncfile= adjustl(c_ncfile)
+
+!---------- read current data from NetCDF file
+
+	    CALL read_netcdf_currents(c_ncfile)
+
+	  END IF data_read
+
+!---------- decide, if counter needs to be updated
+
+      update_nccount: IF(r_ncupdatelast <= r_tim) THEN
+        i_stepcounter= i_stepcounter+1
+        IF(i_stepcounter > i_timesteps) &
+          CALL grid_error(c_error='[slm_windfield]: step counter overflow!')
+        r_ncupdatelast= r_ncupdatelast+ r_secperstep
+      END IF update_nccount
+
+!---------- interpolate to coordinate
+
+	  r_field= wind_interpol(r_coord,i_timeinterval)
+
+	  RETURN
+	  END FUNCTION slm_windfield
+
+!*****************************************************************
+	  FUNCTION slm_tempfield(r_coord) RESULT (r_field)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR)                                        :: r_field
+	  
+	  INTEGER (KIND = GRID_SI)                         :: i_lox, i_hix, i_loy, i_hiy
+	  INTEGER (KIND = GRID_SI)                         :: i_cnt
+	  REAL (KIND = GRID_SR)                            :: r_dx, r_dy, r_dxi, r_dyi
+	  REAL (KIND = GRID_SR)                            :: r_lx, r_hx, r_ly, r_hy
+	  REAL (KIND = GRID_SR)                            :: r_l1, r_h1
+	  REAL (KIND = GRID_SR)                            :: r_scalx, r_scaly
+	  REAL (KIND = GRID_SR)                            :: r_deg, r_radians
+	  REAL (KIND = GRID_SR), PARAMETER                 :: r_earth=6.371e6_GRID_SR ! earth's radius
+
+!---------- initialize radians
+
+	  r_radians= GRID_PI/180._GRID_SR
+	  r_deg= r_radians* r_earth
+
+!---------- find u-component wind box corresponding to coordinate
+
+	  i_lox=1_GRID_SI
+	  i_hix=2_GRID_SI
+	  i_loy=1_GRID_SI
+	  i_hiy=2_GRID_SI
+
+	  determine_lon: DO i_cnt=1, i_lon-1
+	    IF(r_lon(i_cnt) .LT. r_coord(1)) THEN
+	      IF(r_lon(i_cnt +1) .GE. r_coord(1)) THEN
+	        i_lox= i_cnt
+	        i_hix= i_cnt+1
+	        exit determine_lon
+	      END IF
+	    END IF
+	  END DO determine_lon
+	  IF(r_lon(i_lon) .LT. r_coord(1)) THEN
+	    i_lox = i_lon-1
+	    i_hix = i_lon
+	  END IF
+
+	  determine_lat: DO i_cnt=1, i_lat-1
+	    IF(r_lat(i_cnt) .GE. r_coord(2)) THEN
+	      IF(r_lat(i_cnt +1) .LT. r_coord(2)) THEN
+	        i_loy= i_cnt
+	        i_hiy= i_cnt+1
+	        exit determine_lat
+	      END IF
+	    END IF
+	  END DO determine_lat
+	  IF(r_lat(i_lat) .GE. r_coord(2)) THEN
+	    i_loy = i_lat-1
+	    i_hiy = i_lat
+	  END IF
+
+!---------- calculate weights for bilinear interpolation
+
+	  r_dx= r_lon(i_hix)- r_lon(i_lox)
+	  r_dy= r_lat(i_loy)- r_lat(i_hiy) ! note that the coordinate direction is inverted
+	  r_lx= r_coord(1) - r_lon(i_lox)
+	  r_ly= r_coord(2) - r_lat(i_hiy)
+	  r_hx= r_lon(i_hix) - r_coord(1)
+	  r_hy= r_lat(i_loy) - r_coord(2)
+	  r_scalx=1._GRID_SR/(r_deg*cos(r_radians*r_lat(i_hiy))) !r_coord(2)))
+	  r_scaly=1._GRID_SR/(r_deg)
+
+!---------- linear interpolation in x-direction
+
+	  IF(r_dx /= 0.0_GRID_SR) THEN
+	    r_dxi= 1._GRID_SR/r_dx
+	    r_l1= (r_hx* r_inittemp(i_lox, i_loy)+ &
+	           r_lx* r_inittemp(i_hix, i_loy))* r_dxi
+	    r_h1= (r_hx* r_inittemp(i_lox, i_hiy)+ &
+	           r_lx* r_inittemp(i_hix, i_hiy))* r_dxi
+	  ELSE
+	    r_l1= r_inittemp(i_lox, i_loy)
+	    r_h1= r_inittemp(i_lox, i_hiy)
+	  END IF
+
+!---------- linear interpolation in y-direction
+
+	  IF(r_dy /= 0.0_GRID_SR) THEN
+	    r_dyi= 1._GRID_SR/r_dy
+	    r_field= (r_hy* r_l1+ r_ly* r_h1)* r_dyi !* r_scalx
+	  ELSE
+	    r_field= r_l1 !* r_scalx
+	  END IF
+
+	  RETURN
+	  END FUNCTION slm_tempfield
+
+!*****************************************************************
+	  SUBROUTINE read_netcdf_currents(c_filename)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+      INCLUDE "netcdf.inc"
+      
+!---------- input parameters      
+	  CHARACTER (LEN=2*io_fillen), INTENT(in)  :: c_filename
+	  
+!---------- local variables
+	  INTEGER (KIND = GRID_SI)        :: i_alct, i_ncstat
+      INTEGER (KIND = GRID_SI)        :: i_fileuvid
+      INTEGER (KIND = GRID_SI)        :: i_dimid, i_varid
+      INTEGER (KIND = GRID_SI)        :: i_tm, i_ln, i_lt
+      INTEGER (KIND = GRID_SI)        :: i_vlat, i_ulon, i_windlon, i_windlat, &
+                                         i_windlevel
+      INTEGER, DIMENSION(:,:,:,:), ALLOCATABLE :: i_uwind, i_vwind
+
+!---------- initialize diagnostic variable
+
+      i_alct= 0_GRID_SI
+
+!---------- open current file
+
+      IF(GRID_parameters%iolog > 0) &
+        write(GRID_parameters%iolog,*) 'INFO: Opening NetCDF file ',c_filename
+      i_ncstat= nf_open(c_filename,NF_NOWRITE,i_fileuvid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not open currents data file')
+    
+!---------- determine lon/lat/time dimension sizes (grid size of currents field)
+
+      i_ncstat= nf_inq_dimid(i_fileuvid, 'xtno', i_dimid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not identify lon dimension')
+      i_ncstat= nf_inq_dimlen(i_fileuvid, i_dimid, i_windlon)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not read lon dimension')
+      
+      i_ncstat= nf_inq_dimid(i_fileuvid, 'ytno', i_dimid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not identify lat dimension')
+      i_ncstat= nf_inq_dimlen(i_fileuvid, i_dimid, i_windlat)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not read lat dimension')
+
+      i_ncstat= nf_inq_dimid(i_fileuvid, 'time', i_dimid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not identify time dimension')
+      i_ncstat= nf_inq_dimlen(i_fileuvid, i_dimid, i_timesteps)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not read time dimension')
+ 
+      i_ncstat= nf_inq_dimid(i_fileuvid, 'zlevno', i_dimid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not identify level dimension')
+      i_ncstat= nf_inq_dimlen(i_fileuvid, i_dimid, i_windlevel)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not read level dimension')
+
+!---------- check for the staggered dimensions
+
+      lonlatfirstread: IF(l_lonlatread) THEN
+        IF((i_lat /= i_windlat) .OR. (i_lon /= i_windlon) .OR. &
+           (i_level /= i_windlevel)) & 
+	       CALL grid_error(c_error='[read_netcdf_currents]: dimensions incompatible to temperature data')
+      ELSE lonlatfirstread
+        i_lat= i_windlat
+        i_lon= i_windlon
+        i_level= i_windlevel
+    
+!---------- allocate latitude and longitude coordinate arrays
+
+        IF((.NOT. allocated(r_lat)) .AND. (.NOT. allocated(r_lon))) &
+          ALLOCATE(r_lat(i_lat), r_lon(i_lon), stat= i_alct)
+        IF(i_alct /= 0) &
+          CALL grid_error(c_error='[read_netcdf_currents]: could not allocate lat/lon field')
+
+!---------- read latitude and longitude coordinate values
+
+        i_ncstat= nf_inq_varid(i_fileuvid, 'xtno', i_varid)
+	    IF(i_ncstat /= NF_NOERR) &
+	      CALL grid_error(c_error='[read_netcdf_currents]: could not determine lon varid')
+        i_ncstat= nf_get_var_double(i_fileuvid, i_varid, r_lon)
+	    IF(i_ncstat /= NF_NOERR) &
+	      CALL grid_error(c_error='[read_netcdf_currents]: could not read lon data')
+
+        i_ncstat= nf_inq_varid(i_fileuvid, 'ytno', i_varid)
+	    IF(i_ncstat /= NF_NOERR) &
+	      CALL grid_error(c_error='[read_netcdf_currents]: could not determine lat varid')
+        i_ncstat= nf_get_var_double(i_fileuvid, i_varid, r_lat)
+	    IF(i_ncstat /= NF_NOERR) &
+	      CALL grid_error(c_error='[read_netcdf_currents]: could not read lat data')
+	    
+	    l_lonlatread= .TRUE.
+	    
+      END IF lonlatfirstread
+
+!---------- check for the staggered dimensions
+
+      i_ncstat= nf_inq_dimid(i_fileuvid, 'xuno', i_dimid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not identify staggered lon dimension')
+      i_ncstat= nf_inq_dimlen(i_fileuvid, i_dimid, i_ulon)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not read staggered lon dimension')
+      
+      i_ncstat= nf_inq_dimid(i_fileuvid, 'yvno', i_dimid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not identify staggered lat dimension')
+      i_ncstat= nf_inq_dimlen(i_fileuvid, i_dimid, i_vlat)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not read staggered lat dimension')
+
+      IF((i_lat /= i_vlat) .OR. (i_lon /= i_ulon)) & 
+	    CALL grid_error(c_error='[read_netcdf_currents]: staggered dimensions not matching')
+    
+!---------- allocate latitude and longitude coordinate arrays
+
+      IF ((.NOT. allocated(r_vlat)) .AND. (.NOT. allocated(r_ulon))) &
+	    ALLOCATE(r_vlat(i_lat), r_ulon(i_lon), stat= i_alct)
+      IF(i_alct /= 0) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not allocate lat/lon field')
+
+!---------- read staggered latitude and longitude coordinate values
+
+      i_ncstat= nf_inq_varid(i_fileuvid, 'xuno', i_varid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not determine staggered lon varid')
+      i_ncstat= nf_get_var_double(i_fileuvid, i_varid, r_ulon)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not read staggered lon data')
+
+      i_ncstat= nf_inq_varid(i_fileuvid, 'yvno', i_varid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not determine staggered lat varid')
+      i_ncstat= nf_get_var_double(i_fileuvid, i_varid, r_vlat)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not read staggered lat data')
+    
+!---------- allocate current data arrays - take r_flowx as indicator for allocated state of all arrays...
+
+      IF(.NOT. allocated(r_flowx)) &
+	    ALLOCATE(r_flowx(i_lon, i_lat, i_timesteps), r_flowy(i_lon, i_lat, i_timesteps), stat= i_alct)
+      IF(i_alct /= 0) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not allocate currents fields')
+      IF((.NOT. allocated(i_uwind)) .AND. (.NOT. allocated(i_vwind))) &
+	    ALLOCATE(i_uwind(i_lon, i_lat, i_level, i_timesteps), i_vwind(i_lon, i_lat, i_level, i_timesteps), stat= i_alct)
+      IF(i_alct /= 0) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not allocate auxiliary currents fields')
+
+!---------- read x-/y-direction data of currents
+
+      i_ncstat= nf_inq_varid(i_fileuvid, 'uno', i_varid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not determine varid of uno')
+      i_ncstat= nf_get_var_int(i_fileuvid, i_varid, i_uwind)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not read uno data')
+
+      i_ncstat= nf_inq_varid(i_fileuvid, 'vno', i_varid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not determine varid of vno')
+      i_ncstat= nf_get_var_int(i_fileuvid, i_varid, i_vwind)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not read vno data')
+    
+!---------- Convert data and fix mask values
+
+	  DO i_tm=1,i_timesteps
+	  	DO i_lt= 1,i_lat
+	  	  DO i_ln= 1,i_lon
+	  	    r_flowx(i_ln, i_lt, i_tm)= 0.001_GRID_SR* REAL(i_uwind(i_ln, i_lt, 1, i_tm), GRID_SR)
+	  	    IF(i_uwind(i_ln, i_lt, 1, i_tm) <= -11111) r_flowx(i_ln, i_lt, i_tm)= 0._GRID_SR
+	  	    r_flowy(i_ln, i_lt, i_tm)= 0.001_GRID_SR* REAL(i_vwind(i_ln, i_lt, 1, i_tm), GRID_SR)
+	  	    IF(i_vwind(i_ln, i_lt, 1, i_tm) <= -11111) r_flowy(i_ln, i_lt, i_tm)= 0._GRID_SR
+	  	  END DO
+	  	END DO
+	  END DO
+
+!---------- close currents file
+
+	  i_ncstat= nf_close(i_fileuvid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not close currents data file')
+
+!---------- deallocate aux arrays
+
+      DEALLOCATE(i_uwind, i_vwind)
+	    
+	  END SUBROUTINE read_netcdf_currents
+
+!*****************************************************************
+	  SUBROUTINE read_netcdf_temperature(c_filename)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+      INCLUDE "netcdf.inc"
+      
+!---------- input parameters      
+	  CHARACTER (LEN=2*io_fillen), INTENT(in)  :: c_filename
+	  
+!---------- local variables
+	  INTEGER (KIND = GRID_SI)        :: i_alct, i_ncstat
+      INTEGER (KIND = GRID_SI)        :: i_fileuvid
+      INTEGER (KIND = GRID_SI)        :: i_dimid, i_varid
+      INTEGER (KIND = GRID_SI)        :: i_tm, i_ln, i_lt
+      INTEGER (KIND = GRID_SI)        :: i_templat, i_templon, i_templevel, i_temptime
+      INTEGER, DIMENSION(:,:,:,:), ALLOCATABLE :: i_itemp
+
+!---------- open current file
+
+      IF(GRID_parameters%iolog > 0) &
+        write(GRID_parameters%iolog,*) 'INFO: Opening NetCDF file ',c_filename
+      i_ncstat= nf_open(c_filename,NF_NOWRITE,i_fileuvid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_temperature]: could not open temperature data file')
+    
+!---------- determine lon/lat/time dimension sizes (grid size of temperature field)
+
+      i_ncstat= nf_inq_dimid(i_fileuvid, 'xtno', i_dimid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_temperature]: could not identify lon dimension')
+      i_ncstat= nf_inq_dimlen(i_fileuvid, i_dimid, i_templon)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_temperature]: could not read lon dimension')
+      
+      i_ncstat= nf_inq_dimid(i_fileuvid, 'ytno', i_dimid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_temperature]: could not identify lat dimension')
+      i_ncstat= nf_inq_dimlen(i_fileuvid, i_dimid, i_templat)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_temperature]: could not read lat dimension')
+
+      i_ncstat= nf_inq_dimid(i_fileuvid, 'time', i_dimid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_temperature]: could not identify time dimension')
+      i_ncstat= nf_inq_dimlen(i_fileuvid, i_dimid, i_temptime)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_temperature]: could not read time dimension')
+ 
+      i_ncstat= nf_inq_dimid(i_fileuvid, 'zlevno', i_dimid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_temperature]: could not identify level dimension')
+      i_ncstat= nf_inq_dimlen(i_fileuvid, i_dimid, i_templevel)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_temperature]: could not read level dimension')
+   
+!---------- check for consistency with currents file
+
+      lonlatfirstread: IF(l_lonlatread) THEN
+        IF((i_lat /= i_templat) .OR. (i_lon /= i_templon) .OR. &
+           (i_level /= i_templevel)) & 
+	       CALL grid_error(c_error='[read_netcdf_temperature]: dimensions incompatible to currents data')
+      ELSE lonlatfirstread
+        i_lat= i_templat
+        i_lon= i_templon
+        i_level= i_templevel
+    
+!---------- allocate latitude and longitude coordinate arrays
+
+	    ALLOCATE(r_lat(i_lat), r_lon(i_lon), stat= i_alct)
+        IF(i_alct /= 0) &
+	      CALL grid_error(c_error='[read_netcdf_temperature]: could not allocate lat/lon field')
+
+!---------- read latitude and longitude coordinate values
+
+        i_ncstat= nf_inq_varid(i_fileuvid, 'xtno', i_varid)
+	    IF(i_ncstat /= NF_NOERR) &
+	      CALL grid_error(c_error='[read_netcdf_temperature]: could not determine lon varid')
+        i_ncstat= nf_get_var_double(i_fileuvid, i_varid, r_lon)
+	    IF(i_ncstat /= NF_NOERR) &
+	      CALL grid_error(c_error='[read_netcdf_temperature]: could not read lon data')
+
+        i_ncstat= nf_inq_varid(i_fileuvid, 'ytno', i_varid)
+	    IF(i_ncstat /= NF_NOERR) &
+	      CALL grid_error(c_error='[read_netcdf_temperature]: could not determine lat varid')
+        i_ncstat= nf_get_var_double(i_fileuvid, i_varid, r_lat)
+	    IF(i_ncstat /= NF_NOERR) &
+	      CALL grid_error(c_error='[read_netcdf_temperature]: could not read lat data')
+	    
+	    l_lonlatread= .TRUE.
+	    
+      END IF lonlatfirstread
+
+!---------- allocate current data arrays
+
+	  ALLOCATE(r_inittemp(i_lon, i_lat), i_itemp(i_lon, i_lat, i_level, i_temptime), stat= i_alct)
+      IF(i_alct /= 0) &
+	    CALL grid_error(c_error='[read_netcdf_temperature]: could not allocate temperature fields')
+
+!---------- read x-/y-direction data of currents
+
+      i_ncstat= nf_inq_varid(i_fileuvid, 'tno', i_varid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_temperature]: could not determine varid of tno')
+      i_ncstat= nf_get_var_int(i_fileuvid, i_varid, i_itemp)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_temperature]: could not read tno data')
+
+!---------- Convert data and fix mask values
+
+      DO i_lt= 1,i_lat
+        DO i_ln= 1,i_lon
+          r_inittemp(i_ln, i_lt)= 0.01_GRID_SR* REAL(i_itemp(i_ln, i_lt, 1, 1), GRID_SR)
+          IF(i_itemp(i_ln, i_lt, 1, 1) <= -11111) r_inittemp(i_ln, i_lt)= 0._GRID_SR
+        END DO
+      END DO
+
+!---------- close currents file
+
+	  i_ncstat= nf_close(i_fileuvid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_temperature]: could not close currents data file')
+
+!---------- deallocate aux arrays
+
+      DEALLOCATE(i_itemp)
+	    
+	  END SUBROUTINE read_netcdf_temperature
+
+!*****************************************************************
+	  SUBROUTINE slm_windinit(p_control)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct)                  :: p_control
+	  INTEGER                                :: i_iofil= 19
+	  CHARACTER (len=i_charlength+io_fillen) :: c_name
+	  CHARACTER (len=128)                    :: a_filrow
+	  INTEGER                                :: i_iost, i_ioend, i_alct, i_cnt
+	  CHARACTER (LEN=2*io_fillen)            :: c_ncfile
+
+!---------- initialize
+
+	  WRITE(c_name,*) trim(p_control%cmd%c_directory),p_control%tst%tst_char(1)
+	  c_name= adjustl(c_name)
+	  c_windpath= p_control%cmd%c_directory
+      i_numfiles= -1
+
+!---------- open wind parameter file
+
+	  open(unit= i_iofil, file= c_name, status= 'OLD', action= 'READ', iostat= i_iost)
+	  file_notopen: IF(i_iost /= 0) THEN
+	    write(i_ioerr,*) 'ERROR: Filename: ', c_name
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'ERROR: Filename: ', c_name
+	    CALL grid_error(c_error='[slm_windinit]: could not open wind parameters file')
+	  END IF file_notopen
+	  IF(GRID_parameters%iolog > 0) &
+	    write(GRID_parameters%iolog,*) 'INFO: Opened file on unit: ', i_iofil
+
+!---------- read wind parameter file
+
+	  read_loop: DO
+	    read(i_iofil,2000,iostat=i_ioend) a_filrow
+
+!---------- if file ended
+
+	    file_end: IF(i_ioend /= 0) THEN
+	      close(i_iofil)
+	      IF(GRID_parameters%iolog > 0) &
+	        write(GRID_parameters%iolog,*) 'INFO: Closed file on unit: ', i_iofil
+	      EXIT read_loop
+	    ELSE file_end
+
+!---------- decide what to DO with line according to first character
+
+	    comment_line: IF(a_filrow(1:1) == '#' .or. a_filrow(1:1) == '!') THEN
+	      CONTINUE
+	    ELSE IF(a_filrow(1:8) == 'ABS_PATH') THEN comment_line
+	      read(i_iofil,2000) c_windpath
+	    ELSE IF(a_filrow(1:8) == 'SEC_PER_') THEN comment_line
+	      read(i_iofil,*) r_secperstep
+	    ELSE IF(a_filrow(1:8) == 'STEPS_PE') THEN comment_line
+	      read(i_iofil,*) i_timesteps
+	    ELSE IF(a_filrow(1:8) == 'INFILE_N') THEN comment_line
+	      read(i_iofil,*) i_numfiles
+          ALLOCATE(c_windfile(i_numfiles), stat=i_alct)
+          IF(i_alct /= 0) &
+            CALL grid_error(c_error='[slm_windinit]: could not allocate windname array')
+	    ELSE IF(a_filrow(1:8) == 'WIND_FIL') THEN comment_line
+	      IF(i_numfiles < 1) &
+	        CALL grid_error(c_error='[slm_windinit]: number of wind files unknown')
+          DO i_cnt=1,i_numfiles
+            c_windfile(i_cnt)= '                                                                '
+	        read(i_iofil,2010) c_windfile(i_cnt)
+	      END DO
+	    ELSE IF(a_filrow(1:8) == 'TEMP_FIL') THEN comment_line
+	      c_tempfile= '                                                                '
+	      read(i_iofil,2010) c_tempfile
+	    END IF comment_line
+          
+	    END IF file_end
+	  END DO read_loop
+
+!---------- initialize some values
+
+	  r_readlast     = 0.0_GRID_SR
+	  r_ncupdatelast = 0.0_GRID_SR
+	  i_timeinterval = 0_GRID_SI
+	  i_stepcounter  = 0_GRID_SI
+	  r_intervallen  = r_secperstep* i_timesteps
+	  l_lonlatread   = .FALSE.
+
+!---------- read temperature data (wind data are read in slm_windfield)
+
+      write(c_ncfile,*) trim(c_windpath),c_tempfile
+      c_ncfile= adjustl(c_ncfile)
+
+      CALL read_netcdf_temperature(c_ncfile)
+
+	  RETURN
+ 2000 FORMAT(a128)
+ 2010 FORMAT(a64)
+	  END SUBROUTINE slm_windinit
+
+!*****************************************************************
+	  SUBROUTINE slm_windquit
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+!---------- deallocate wind data arrays
+
+	  DEALLOCATE(r_flowx, r_flowy, r_inittemp)
+	  DEALLOCATE(r_lon, r_lat, r_ulon, r_vlat)
+
+	  RETURN
+	  END SUBROUTINE slm_windquit
+
+!*****************************************************************
+	  FUNCTION wind_interpol(r_coord, i_tim) RESULT (r_inter)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_coord
+	  INTEGER (KIND = GRID_SI)                         :: i_tim
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_inter
+	  
+	  INTEGER (KIND = GRID_SI)                         :: i_ulox, i_uhix, i_uloy, i_uhiy
+	  INTEGER (KIND = GRID_SI)                         :: i_vlox, i_vhix, i_vloy, i_vhiy
+	  INTEGER (KIND = GRID_SI)                         :: i_cnt
+	  REAL (KIND = GRID_SR)                            :: r_dx, r_dy, r_dxi, r_dyi
+	  REAL (KIND = GRID_SR)                            :: r_ulx, r_uhx, r_uly, r_uhy
+	  REAL (KIND = GRID_SR)                            :: r_vlx, r_vhx, r_vly, r_vhy
+	  REAL (KIND = GRID_SR)                            :: r_l1, r_h1, r_l2, r_h2
+	  REAL (KIND = GRID_SR)                            :: r_scalx, r_scaly
+	  REAL (KIND = GRID_SR)                            :: r_deg, r_radians
+	  REAL (KIND = GRID_SR), PARAMETER                 :: r_earth=6.371e6_GRID_SR ! earth's radius
+
+!---------- initialize radians
+
+	  r_radians= GRID_PI/180._GRID_SR
+	  r_deg= r_radians* r_earth
+
+!---------- find u-component wind box corresponding to coordinate
+
+	  i_ulox=1_GRID_SI
+	  i_uhix=2_GRID_SI
+	  i_uloy=1_GRID_SI
+	  i_uhiy=2_GRID_SI
+
+	  determine_ulon: DO i_cnt=1, i_lon-1 ! r_lon goes from small to large values...
+	    IF(r_ulon(i_cnt) .LT. r_coord(1)) THEN
+	      IF(r_ulon(i_cnt +1) .GE. r_coord(1)) THEN
+	        i_ulox= i_cnt
+	        i_uhix= i_cnt+1
+	        exit determine_ulon
+	      END IF
+	    END IF
+	  END DO determine_ulon
+	  IF(r_ulon(i_lon) .LT. r_coord(1)) THEN
+	    i_ulox = i_lon-1
+	    i_uhix = i_lon
+	  END IF
+
+	  determine_ulat: DO i_cnt=1, i_lat-1 ! r_lat goes from large to small values... 
+	    IF(r_lat(i_cnt) .GE. r_coord(2)) THEN
+	      IF(r_lat(i_cnt +1) .LT. r_coord(2)) THEN
+	        i_uloy= i_cnt
+	        i_uhiy= i_cnt+1
+	        exit determine_ulat
+	      END IF
+	    END IF
+	  END DO determine_ulat
+	  IF(r_lat(i_lat) .GT. r_coord(2)) THEN
+	    i_uloy = i_lat-1
+	    i_uhiy = i_lat
+	  END IF
+
+!---------- find v-component wind box corresponding to coordinate
+
+	  i_vlox=1_GRID_SI
+	  i_vhix=2_GRID_SI
+	  i_vloy=1_GRID_SI
+	  i_vhiy=2_GRID_SI
+
+	  determine_vlon: DO i_cnt=1, i_lon-1
+	    IF(r_lon(i_cnt) .LT. r_coord(1)) THEN
+	      IF(r_lon(i_cnt +1) .GE. r_coord(1)) THEN
+	        i_vlox= i_cnt
+	        i_vhix= i_cnt+1
+	        exit determine_vlon
+	      END IF
+	    END IF
+	  END DO determine_vlon
+	  IF(r_lon(i_lon) .LT. r_coord(1)) THEN
+	    i_vlox = i_lon-1
+	    i_vhix = i_lon
+	  END IF
+
+	  determine_vlat: DO i_cnt=1, i_lat-1
+	    IF(r_vlat(i_cnt) .GE. r_coord(2)) THEN
+	      IF(r_vlat(i_cnt +1) .LT. r_coord(2)) THEN
+	        i_vloy= i_cnt
+	        i_vhiy= i_cnt+1
+	        exit determine_vlat
+	      END IF
+	    END IF
+	  END DO determine_vlat
+	  IF(r_vlat(i_lat) .GE. r_coord(2)) THEN
+	    i_vloy = i_lat-1
+	    i_vhiy = i_lat
+	  END IF
+    
+!---------- calculate weights for bilinear interpolation
+
+	  r_dx= r_lon(i_vhix)- r_lon(i_vlox)
+	  r_dy= r_lat(i_uhiy)- r_lat(i_uloy)
+	  r_ulx= r_coord(1) - r_ulon(i_ulox)
+	  r_uly= r_coord(2) - r_lat(i_uloy)
+	  r_uhx= r_ulon(i_uhix) - r_coord(1)
+	  r_uhy= r_lat(i_uhiy) - r_coord(2)
+	  r_vlx= r_coord(1) - r_lon(i_vlox)
+	  r_vly= r_coord(2) - r_vlat(i_vloy)
+	  r_vhx= r_lon(i_vhix) - r_coord(1)
+	  r_vhy= r_vlat(i_vhiy) - r_coord(2)
+	  r_scalx=1._GRID_SR/(r_deg*cos(r_radians*r_lat(i_uhiy))) !r_coord(2)))
+	  r_scaly=1._GRID_SR/(r_deg)
+
+!---------- linear interpolation in x-direction
+
+	  IF(r_dx /= 0.0_GRID_SR) THEN
+	    r_dxi= 1._GRID_SR/r_dx
+	    r_l1= (r_uhx* r_flowx(i_ulox, i_uloy, i_tim)+ &
+	           r_ulx* r_flowx(i_uhix, i_uloy, i_tim))* r_dxi
+	    r_h1= (r_uhx* r_flowx(i_ulox, i_uhiy, i_tim)+ &
+	           r_ulx* r_flowx(i_uhix, i_uhiy, i_tim))* r_dxi
+	    r_l2= (r_vhx* r_flowy(i_vlox, i_vloy, i_tim)+ &
+	           r_vlx* r_flowy(i_vhix, i_vloy, i_tim))* r_dxi
+	    r_h2= (r_vhx* r_flowy(i_vlox, i_vhiy, i_tim)+ &
+	           r_vlx* r_flowy(i_vhix, i_vhiy, i_tim))* r_dxi
+	  ELSE
+	    r_l1= r_flowx(i_ulox, i_uloy, i_tim)
+	    r_h1= r_flowx(i_ulox, i_uhiy, i_tim)
+	    r_l2= r_flowy(i_vlox, i_vloy, i_tim)
+	    r_h2= r_flowy(i_vlox, i_vhiy, i_tim)
+	  END IF
+
+!---------- linear interpolation in y-direction
+
+	  IF(r_dy /= 0.0_GRID_SR) THEN
+	    r_dyi= 1._GRID_SR/r_dy
+	    r_inter(1)= (r_uhy* r_l1+ r_uly* r_h1)* r_dyi* r_scalx
+	    r_inter(2)= (r_vhy* r_l2+ r_vly* r_h2)* r_dyi* r_scaly
+	  ELSE
+	    r_inter(1)= r_l1* r_scalx
+	    r_inter(2)= r_l2* r_scaly
+	  END IF
+
+	  RETURN
+	  END FUNCTION wind_interpol
+!*****************************************************************
+	END MODULE ADV_wind
diff --git a/flash2d/src/options/ADV_wind.bar.f90 b/flash2d/src/options/ADV_wind.bar.f90
new file mode 100644
index 0000000..655a61c
--- /dev/null
+++ b/flash2d/src/options/ADV_wind.bar.f90
@@ -0,0 +1,107 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	ADV_wind
+! FUNCTION:
+!	calculate the windfield for the advection problem
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_windfield
+! FUNCTION:
+!	calculate the advecting force for simple advection
+! SYNTAX:
+!	real.arr= slm_windfield(real.arr, real)
+! ON INPUT:
+!	r_coord: coordinates of point		real
+!	r_time:  time coordinate (optional)	real
+! ON OUTPUT:
+!	r_field: windfield			real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	12/97
+!	2. compliant to amatos 1.0	j. behrens	12/2000
+!	3. compliant to amatos 1.2	j. behrens	3/2002
+!
+!*****************************************************************
+	MODULE ADV_wind
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC :: slm_windfield, slm_windinit, slm_windquit
+	  CONTAINS
+!*****************************************************************
+	  FUNCTION slm_windfield(r_coord, r_time) RESULT (r_field)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                  :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_field
+	  REAL (KIND = GRID_SR)                                        :: r_fac=.363610260832151995e-4
+	  REAL (KIND = GRID_SR)                                        :: r_tim
+	  REAL (KIND = GRID_SR)                                        :: r_dis
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_dif
+
+!---------- set time
+
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0
+	  END IF
+
+!---------- calculate distance from center (0,0)
+
+	  r_dif= (/0.5,0.5/)- abs(r_coord)
+	  r_dis= dot_product(r_dif, r_dif)* 4.
+
+!---------- calculate the advection at (x,y) (velocity increasing)
+
+	  r_field(1)= -r_coord(2)* r_dis* r_fac
+	  r_field(2)=  r_coord(1)* r_dis* r_fac
+	
+	  RETURN
+	  END FUNCTION slm_windfield
+
+!*****************************************************************
+	  SUBROUTINE slm_windinit(p_control)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (control_struct)     :: p_control
+
+	  RETURN
+	  END SUBROUTINE slm_windinit
+
+!*****************************************************************
+	  SUBROUTINE slm_windquit
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  RETURN
+	  END SUBROUTINE slm_windquit
+
+!*****************************************************************
+	END MODULE ADV_wind
diff --git a/flash2d/src/options/ADV_wind.circ.f90 b/flash2d/src/options/ADV_wind.circ.f90
new file mode 100644
index 0000000..f37abfd
--- /dev/null
+++ b/flash2d/src/options/ADV_wind.circ.f90
@@ -0,0 +1,109 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	ADV_wind
+! FUNCTION:
+!	calculate the windfield for the advection problem
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_windfield
+! FUNCTION:
+!	calculate the advecting force for simple advection
+! SYNTAX:
+!	real.arr= slm_windfield(real.arr, real)
+! ON INPUT:
+!	r_coord: coordinates of point		real
+!	r_time:  time coordinate (optional)	real
+! ON OUTPUT:
+!	r_field: windfield			real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	12/97
+!	2. compliant to amatos 1.0	j. behrens	12/2000
+!	3. done some work for 2d	l. mentrup	2003
+!
+!*****************************************************************
+	MODULE ADV_wind
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC :: slm_windfield, slm_windinit, slm_windquit
+	  CONTAINS
+!*****************************************************************
+	  FUNCTION slm_windfield(r_coord, r_time) RESULT (r_field)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                  :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_field
+	  REAL (KIND = GRID_SR)                                        :: r_fac=.363610260832151995e-4_GRID_SR
+	  REAL (KIND = GRID_SR)					      :: r_diag= .1e-3_GRID_SR
+	  REAL (KIND = GRID_SR)                                        :: r_tim
+	  REAL (KIND = GRID_SR)					      :: r_dist
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), PARAMETER  :: r_cntr=(/ 0._GRID_SR, 0._GRID_SR /)
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_tmp
+
+!---------- set time
+
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0
+	  END IF
+
+!---------- calculate the advection at (x,y,z) 
+!---------- circulating wind in x,y-plane with increasing velocity 
+!---------- wrt. the distance to r_cntr
+
+	  r_tmp= r_coord- r_cntr
+	  r_field(1)= -r_tmp(2)* r_fac
+	  r_field(2)=  r_tmp(1)* r_fac
+
+
+	
+	  RETURN
+	  END FUNCTION slm_windfield
+
+!*****************************************************************
+	  SUBROUTINE slm_windinit(p_control)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (control_struct)     :: p_control
+
+	  RETURN
+	  END SUBROUTINE slm_windinit
+
+!*****************************************************************
+	  SUBROUTINE slm_windquit
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  RETURN
+	  END SUBROUTINE slm_windquit
+
+!*****************************************************************
+	END MODULE ADV_wind
diff --git a/flash2d/src/options/ADV_wind.conv.f90 b/flash2d/src/options/ADV_wind.conv.f90
new file mode 100644
index 0000000..5c01dcb
--- /dev/null
+++ b/flash2d/src/options/ADV_wind.conv.f90
@@ -0,0 +1,112 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	ADV_wind
+! FUNCTION:
+!	calculate the windfield for the advection problem
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_windfield
+! FUNCTION:
+!	calculate the advecting force for simple advection
+! SYNTAX:
+!	real.arr= slm_windfield(real.arr, real)
+! ON INPUT:
+!	r_coord: coordinates of point		real
+!	r_time:  time coordinate (optional)	real
+! ON OUTPUT:
+!	r_field: windfield			real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	12/97
+!	2. compliant to amatos 1.0	j. behrens	12/2000
+!	3. done some work for 2d	l. mentrup	2003
+!
+!*****************************************************************
+	MODULE ADV_wind
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC :: slm_windfield, slm_windinit, slm_windquit
+	  CONTAINS
+!*****************************************************************
+	  FUNCTION slm_windfield(r_coord, r_time) RESULT (r_field)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                  :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_field
+	  REAL (KIND = GRID_SR)                                        :: r_fac=.363610260832151995e-4_GRID_SR
+	  REAL (KIND = GRID_SR)					      :: r_diag= .1e-3_GRID_SR
+	  REAL (KIND = GRID_SR)                                        :: r_tim
+	  REAL (KIND = GRID_SR)					      :: r_dist
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), PARAMETER  :: r_convpoint=(/ 0.75_GRID_SR, 0._GRID_SR /)
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_tmp
+
+!---------- set time
+
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- calculate the advection at (x,y,z) 
+!---------- point-convergent wind 
+
+	  r_tmp =  r_convpoint - r_coord
+	  r_dist = dot_product(r_tmp, r_tmp)**0.5_GRID_SR
+	  IF (r_dist <= 0.01_GRID_SR) THEN 
+	  	r_field = 0._GRID_SR
+	  ELSE
+	       	r_field = r_tmp * 0.5_GRID_SR*r_fac 
+	  ENDIF
+
+
+	
+	  RETURN
+	  END FUNCTION slm_windfield
+
+!*****************************************************************
+	  SUBROUTINE slm_windinit(p_control)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (control_struct)     :: p_control
+
+	  RETURN
+	  END SUBROUTINE slm_windinit
+
+!*****************************************************************
+	  SUBROUTINE slm_windquit
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  RETURN
+	  END SUBROUTINE slm_windquit
+
+!*****************************************************************
+	END MODULE ADV_wind
diff --git a/flash2d/src/options/ADV_wind.diag.f90 b/flash2d/src/options/ADV_wind.diag.f90
new file mode 100644
index 0000000..02d7b1a
--- /dev/null
+++ b/flash2d/src/options/ADV_wind.diag.f90
@@ -0,0 +1,103 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	ADV_wind
+! FUNCTION:
+!	calculate the windfield for the advection problem
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_windfield
+! FUNCTION:
+!	calculate the advecting force for simple advection
+! SYNTAX:
+!	real.arr= slm_windfield(real.arr, real)
+! ON INPUT:
+!	r_coord: coordinates of point		real
+!	r_time:  time coordinate (optional)	real
+! ON OUTPUT:
+!	r_field: windfield			real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	12/97
+!	2. compliant to amatos 1.0	j. behrens	12/2000
+!	3. done some work for 2d	l. mentrup	2003
+!
+!*****************************************************************
+	MODULE ADV_wind
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC :: slm_windfield, slm_windinit, slm_windquit
+	  CONTAINS
+!*****************************************************************
+	  FUNCTION slm_windfield(r_coord, r_time) RESULT (r_field)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                  :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_field
+	  REAL (KIND = GRID_SR)                                        :: r_fac=.363610260832151995e-4_GRID_SR
+	  REAL (KIND = GRID_SR)					       :: r_diag= .1e-3_GRID_SR
+	  REAL (KIND = GRID_SR)                                        :: r_tim
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_tmp
+
+!---------- set time
+
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- calculate the advection at (x,y) (velocity increasing)
+!---------- diagonal wind without shearing in the x,y-plane
+
+	  r_field(1)= 0.1_GRID_SR*r_fac
+	  r_field(2)= 0.1_GRID_SR*r_fac
+
+	  RETURN
+	  END FUNCTION slm_windfield
+
+!*****************************************************************
+	  SUBROUTINE slm_windinit(p_control)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (control_struct)     :: p_control
+
+	  RETURN
+	  END SUBROUTINE slm_windinit
+
+!*****************************************************************
+	  SUBROUTINE slm_windquit
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  RETURN
+	  END SUBROUTINE slm_windquit
+
+!*****************************************************************
+	END MODULE ADV_wind
diff --git a/flash2d/src/options/ADV_wind.file.f90 b/flash2d/src/options/ADV_wind.file.f90
new file mode 100644
index 0000000..3f3d59c
--- /dev/null
+++ b/flash2d/src/options/ADV_wind.file.f90
@@ -0,0 +1,749 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	ADV_wind
+! FUNCTION:
+!	calculate the windfield for the advection problem
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_windfield
+! FUNCTION:
+!	calculate the advecting force for simple advection
+! SYNTAX:
+!	real.arr= slm_windfield(real.arr, real)
+! ON INPUT:
+!	r_coord: coordinates of point		real
+!	r_time:  time coordinate (optional)	real
+! ON OUTPUT:
+!	r_field: windfield			real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	12/97
+!	2. bug fix concerning interp.	j. behrens	2/98
+!	3. compliant to amatos 1.0	j. behrens	12/2000
+!	4. compliant to amatos 1.2	j. behrens	3/2002
+!
+!*****************************************************************
+	MODULE ADV_wind
+	  USE GRID_api
+	  PRIVATE
+	  INTEGER, PARAMETER    :: i_ioerr=0
+	  REAL (KIND = GRID_SR) :: r_intervalfac, r_scalfacx, r_scalfacy, &
+	                           r_readlast, r_scalinvx, r_scalinvy
+	  CHARACTER (LEN=32)    :: c_prfixx, c_prfixy, c_pofixx, c_pofixy
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_flowx
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_flowy
+	  INTEGER               :: i_pointsx, i_pointsy, i_intervallen, &
+	                           i_intervalups, i_intervalnum
+	  PUBLIC                :: slm_windfield, slm_windinit, slm_windquit
+	  CONTAINS
+!*****************************************************************
+	  FUNCTION slm_windfield(r_coord, r_time) RESULT (r_field)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_field
+	  REAL (KIND = GRID_SR)                       :: r_tim
+	  CHARACTER (LEN=67)                          :: c_xfile, c_yfile
+	  CHARACTER (LEN=35)                          :: c_tmp
+	  CHARACTER (LEN=3)                           :: c_num
+	  INTEGER,PARAMETER                           :: i_iowx=21
+	  INTEGER,PARAMETER                           :: i_iowy=23
+	  INTEGER                                     :: i_iost, i_cnt, j_cnt
+
+!---------- set time
+
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- decide, if data has to be read
+
+	  data_read: IF(r_readlast <= r_tim) THEN
+
+!---------- create filenames
+
+	    write(c_num,1000) i_intervalnum
+	    write(c_tmp,*) trim(c_prfixx),c_num
+	    write(c_xfile,*) trim(c_tmp), c_pofixx
+	    c_xfile= adjustl(c_xfile)
+	    write(c_tmp,*) trim(c_prfixy),c_num
+	    write(c_yfile,*) trim(c_tmp), c_pofixy
+	    c_yfile= adjustl(c_yfile)
+
+!---------- open files
+
+	    open(unit= i_iowx, file= c_xfile, status= 'OLD', action= 'READ', iostat= i_iost)
+	    xfile_notopen: IF(i_iost /= 0) THEN
+	      write(i_ioerr,*) 'ERROR: Filename: ', c_xfile
+	      IF(GRID_parameters%iolog > 0) &
+	        write(GRID_parameters%iolog,*) 'ERROR: Filename: ', c_xfile
+	      CALL grid_error(30)
+	    END IF xfile_notopen
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) '[slm_windfield]: opened Filename: ', c_xfile, ' on unit: ', i_iowx
+
+	    open(unit= i_iowy, file= c_yfile, status= 'OLD', action= 'READ', iostat= i_iost)
+	    yfile_notopen: IF(i_iost /= 0) THEN
+	      write(i_ioerr,*) 'ERROR: Filename: ', c_yfile
+	      IF(GRID_parameters%iolog > 0) &
+	        write(GRID_parameters%iolog,*) 'ERROR: Filename: ', c_yfile
+	      CALL grid_error(30)
+	    END IF yfile_notopen
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) '[slm_windfield]: opened Filename: ', c_yfile, ' on unit: ', i_iowy
+
+!---------- read wind data
+
+	    read(i_iowx,*) ((r_flowx(i_cnt, j_cnt), i_cnt=1,i_pointsx), j_cnt=1,i_pointsy)
+	    read(i_iowy,*) ((r_flowy(i_cnt, j_cnt), i_cnt=1,i_pointsx), j_cnt=1,i_pointsy)
+
+!---------- close files
+
+	    close(i_iowx)
+	    close(i_iowy)
+
+!---------- update values for next open
+
+	    r_readlast   = r_readlast+ r_intervalfac* i_intervallen
+	    i_intervalnum= i_intervalnum+ i_intervallen
+	  END IF data_read
+
+!---------- interpolate to coordinate
+
+	  r_field= data_interpol(r_coord)
+!	  r_field= data_qinterpol(r_coord)
+!	  r_field= data_qlinterpol(r_coord)
+
+	  RETURN
+ 1000	  FORMAT(i3.3)
+	  END FUNCTION slm_windfield
+
+!*****************************************************************
+	  SUBROUTINE slm_windinit(p_control)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct)     :: p_control
+	  INTEGER                   :: i_iofil= 19
+	  CHARACTER (len=io_fillen+i_charlength) :: c_name
+	  CHARACTER (len=80)        :: a_filrow
+	  INTEGER                   :: i_iost, i_ioend, i_alct
+
+!---------- initialize
+
+	  WRITE(c_name,*) trim(p_param%cmd%c_directory),p_control%tst%tst_char(1)
+	  c_name= adjustl(c_name)
+	  c_prfixx= '                                '
+	  c_pofixx= '                                '
+	  c_prfixy= '                                '
+	  c_pofixy= '                                '
+
+!---------- open wind parameter file
+
+	  open(unit= i_iofil, file= c_name, status= 'OLD', action= 'READ', iostat= i_iost)
+	  file_notopen: IF(i_iost /= 0) THEN
+	    write(i_ioerr,*) 'ERROR: Filename: ', c_name
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'ERROR: Filename: ', c_name
+	    CALL grid_error(31)
+	  END IF file_notopen
+	  IF(GRID_parameters%iolog > 0) &
+	    write(GRID_parameters%iolog,*) 'INFO: Opened file on unit: ', i_iofil
+
+!---------- read wind parameter file
+
+	  read_loop: DO
+	    read(i_iofil,2000,iostat=i_ioend) a_filrow
+
+!---------- if file ended
+
+	    file_end: IF(i_ioend /= 0) THEN
+	      close(i_iofil)
+	      IF(GRID_parameters%iolog > 0) &
+	        write(GRID_parameters%iolog,*) 'INFO: Closed file on unit: ', i_iofil
+	      EXIT read_loop
+	    ELSE file_end
+
+!---------- decide what to DO with line according to first character
+
+	    comment_line: IF(a_filrow(1:1) == '#' .or. a_filrow(1:1) == '!') THEN
+	      CONTINUE
+	    ELSE IF(a_filrow(1:8) == 'X_PREFIX') THEN comment_line
+	      read(i_iofil,2010) c_prfixx
+	    ELSE IF(a_filrow(1:8) == 'Y_PREFIX') THEN comment_line
+	      read(i_iofil,2010) c_prfixy
+	    ELSE IF(a_filrow(1:8) == 'X_POSTFI') THEN comment_line
+	      read(i_iofil,2010) c_pofixx
+	    ELSE IF(a_filrow(1:8) == 'Y_POSTFI') THEN comment_line
+	      read(i_iofil,2010) c_pofixy
+	    ELSE IF(a_filrow(1:8) == 'X_NUMBER') THEN comment_line
+	      read(i_iofil,*) i_pointsx
+	    ELSE IF(a_filrow(1:8) == 'Y_NUMBER') THEN comment_line
+	      read(i_iofil,*) i_pointsy
+	    ELSE IF(a_filrow(1:8) == 'X_SCALE_') THEN comment_line
+	      read(i_iofil,*) r_scalfacx
+	    ELSE IF(a_filrow(1:8) == 'Y_SCALE_') THEN comment_line
+	      read(i_iofil,*) r_scalfacy
+	    ELSE IF(a_filrow(1:8) == 'NUMBER_O') THEN comment_line
+	      read(i_iofil,*) i_intervallen
+	    ELSE IF(a_filrow(1:8) == 'UPSET_OF') THEN comment_line
+	      read(i_iofil,*) i_intervalups
+	    ELSE IF(a_filrow(1:8) == 'TIME_FAC') THEN comment_line
+	      read(i_iofil,*) r_intervalfac
+	    END IF comment_line
+
+	    END IF file_end
+	  END DO read_loop
+
+!---------- allocate wind data arrays
+
+	  IF(allocated(r_flowx)) deallocate(r_flowx)
+	  IF(allocated(r_flowy)) deallocate(r_flowy)
+	  allocate(r_flowy(i_pointsx, i_pointsy), &
+	           r_flowx(i_pointsx, i_pointsy), &
+	           stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(32)
+	  END IF
+
+!---------- initialize some values
+
+	  r_readlast= 0.0_GRID_SR
+	  i_intervalnum= i_intervalups
+	  r_scalinvx= 1.0_GRID_SR/ r_scalfacx
+	  r_scalinvy= 1.0_GRID_SR/ r_scalfacy
+
+	  RETURN
+ 2000	  FORMAT(a80)
+ 2010	  FORMAT(a32)
+	  END SUBROUTINE slm_windinit
+
+!*****************************************************************
+	  SUBROUTINE slm_windquit
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+!---------- deallocate wind data arrays
+
+	  DEALLOCATE(r_flowx, r_flowy)
+
+	  RETURN
+	  END SUBROUTINE slm_windquit
+
+!*****************************************************************
+	  FUNCTION data_interpol(r_coord) RESULT (r_inter)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_inter
+	  INTEGER                         :: i_lox, i_hix, i_loy, i_hiy
+	  REAL (KIND = GRID_SR)           :: r_dx, r_dy, r_lx, r_hx, &
+	    r_ly, r_hy, r_l1, r_h1, r_l2, r_h2, r_dxi, r_dyi
+
+!---------- find wind box corresponding to coordinate
+
+	  i_lox= FLOOR(r_coord(1))
+	  i_loy= FLOOR(r_coord(2))
+!-- preliminary bug fix
+	  IF(i_lox < 1) i_lox=1
+	  IF(i_lox >= i_pointsx) i_lox= i_pointsx-1
+	  IF(i_loy < 1) i_loy=1
+	  IF(i_loy >= i_pointsy) i_loy= i_pointsy-1
+!-- end of preliminary bug fix
+	  i_hix= i_lox+ 1
+	  i_hiy= i_loy+ 1
+
+!---------- calculate weights for bilinear interpolation
+
+	  r_dx= REAL(i_hix- i_lox, GRID_SR)
+	  r_dy= REAL(i_hiy- i_loy, GRID_SR)
+	  r_lx= r_coord(1) - REAL(i_lox, GRID_SR)
+	  r_ly= r_coord(2) - REAL(i_loy, GRID_SR)
+	  r_hx= REAL(i_hix, GRID_SR) - r_coord(1)
+	  r_hy= REAL(i_hiy, GRID_SR) - r_coord(2)
+
+!---------- linear interpolation in x-direction
+
+	  IF(r_dx /= 0.0_GRID_SR) THEN
+	    r_dxi= 1._GRID_SR/r_dx
+	    r_l1= (r_hx* r_flowx(i_lox, i_loy)+ &
+	           r_lx* r_flowx(i_hix, i_loy))* r_dxi
+	    r_h1= (r_hx* r_flowx(i_lox, i_hiy)+ &
+	           r_lx* r_flowx(i_hix, i_hiy))* r_dxi
+	    r_l2= (r_hx* r_flowy(i_lox, i_loy)+ &
+	           r_lx* r_flowy(i_hix, i_loy))* r_dxi
+	    r_h2= (r_hx* r_flowy(i_lox, i_hiy)+ &
+	           r_lx* r_flowy(i_hix, i_hiy))* r_dxi
+	  ELSE
+	    r_l1= r_flowx(i_lox, i_loy)
+	    r_h1= r_flowx(i_lox, i_hiy)
+	    r_l2= r_flowy(i_lox, i_loy)
+	    r_h2= r_flowy(i_lox, i_hiy)
+	  END IF
+
+!---------- linear interpolation in y-direction
+
+	  IF(r_dy /= 0.0_GRID_SR) THEN
+	    r_dyi= 1._GRID_SR/r_dy
+	    r_inter(1)= (r_hy* r_l1+ r_ly* r_h1)* r_dyi* r_scalinvx
+	    r_inter(2)= (r_hy* r_l2+ r_ly* r_h2)* r_dyi* r_scalinvy
+	  ELSE
+	    r_inter(1)= r_l1* r_scalinvx
+	    r_inter(2)= r_l2* r_scalinvy
+	  END IF
+
+	  RETURN
+	  END FUNCTION data_interpol
+
+!*****************************************************************
+	  FUNCTION data_qinterpol(r_coord) RESULT (r_inter)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_inter
+	  INTEGER                         :: i_lox, i_hix, i_loy, i_hiy, i_mdx, i_mdy
+	  REAL (KIND = GRID_SR)                            :: r_cx, r_cy
+	  REAL (KIND = GRID_SR), DIMENSION(3)              :: r_u, r_v, r_x, r_y
+	  REAL (KIND = GRID_SR)                            :: r_err
+	  REAL (KIND = GRID_SR)                            :: r_ep, r_eps
+
+!---------- determine machine precision
+
+	  r_ep= 1.0_GRID_SR
+	  r_eps= epsilon(r_ep)
+
+!---------- find wind box corresponding to coordinate
+
+	  i_lox= FLOOR(r_coord(1))
+	  i_loy= FLOOR(r_coord(2))
+!-- preliminary bug fix
+	  IF(i_lox < 1) i_lox=1
+	  IF(i_lox >= i_pointsx) i_lox= i_pointsx-2
+	  IF(i_loy < 1) i_loy=1
+	  IF(i_loy >= i_pointsy) i_loy= i_pointsy-2
+!-- end of preliminary bug fix
+	  i_mdx= i_lox+ 1
+	  i_mdy= i_loy+ 1
+	  i_hix= i_lox+ 2
+	  i_hiy= i_loy+ 2
+
+!---------- near the domain boundary, do a linear interpolation (only for square)
+
+	  IF(i_lox < 2 .OR. i_loy < 2 .OR. i_hix > i_pointsx-1 .OR. i_hiy > i_pointsy-1) THEN
+	    r_inter= data_interpol(r_coord)
+	    RETURN
+	  END IF
+
+!---------- coefficients for quadratic interpolation in x
+
+	  r_cx= r_coord(1)
+	  r_cy= r_coord(2)
+
+	  r_x= (/ REAL(i_lox, GRID_SR), REAL(i_mdx, GRID_SR), REAL(i_hix, GRID_SR) /)
+	  r_y= (/ REAL(i_loy, GRID_SR), REAL(i_mdy, GRID_SR), REAL(i_hiy, GRID_SR) /)
+
+!---------- check for coordinate identity in x
+
+	  IF(abs(r_cx- r_x(1)) < r_eps) THEN
+	    r_u= (/ r_flowx(i_lox, i_loy), r_flowx(i_lox, i_mdy), r_flowx(i_lox, i_hiy) /)
+	    r_v= (/ r_flowy(i_lox, i_loy), r_flowy(i_lox, i_mdy), r_flowy(i_lox, i_hiy) /)
+	  ELSE IF(abs(r_cx- r_x(2)) < r_eps) THEN
+	    r_u= (/ r_flowx(i_mdx, i_loy), r_flowx(i_mdx, i_mdy), r_flowx(i_mdx, i_hiy) /)
+	    r_v= (/ r_flowy(i_mdx, i_loy), r_flowy(i_mdx, i_mdy), r_flowy(i_mdx, i_hiy) /)
+	  ELSE IF(abs(r_cx- r_x(3)) < r_eps) THEN
+	    r_u= (/ r_flowx(i_hix, i_loy), r_flowx(i_hix, i_mdy), r_flowx(i_hix, i_hiy) /)
+	    r_v= (/ r_flowy(i_hix, i_loy), r_flowy(i_hix, i_mdy), r_flowy(i_hix, i_hiy) /)
+	  ELSE
+
+!---------- quadratic interpolation in x
+
+	    r_u(1)= poly_1d(2, r_x, &
+	            (/ r_flowx(i_lox, i_loy), r_flowx(i_mdx, i_loy), r_flowx(i_hix, i_loy) /), &
+	            r_cx, r_err)
+	    r_u(2)= poly_1d(2, r_x, &
+	            (/ r_flowx(i_lox, i_mdy), r_flowx(i_mdx, i_mdy), r_flowx(i_hix, i_mdy) /), &
+	            r_cx, r_err)
+	    r_u(3)= poly_1d(2, r_x, &
+	            (/ r_flowx(i_lox, i_hiy), r_flowx(i_mdx, i_hiy), r_flowx(i_hix, i_hiy) /), &
+	            r_cx, r_err)
+
+	    r_v(1)= poly_1d(2, r_x, &
+	            (/ r_flowy(i_lox, i_loy), r_flowy(i_mdx, i_loy), r_flowy(i_hix, i_loy) /), &
+	            r_cx, r_err)
+	    r_v(2)= poly_1d(2, r_x, &
+	            (/ r_flowy(i_lox, i_mdy), r_flowy(i_mdx, i_mdy), r_flowy(i_hix, i_mdy) /), &
+	            r_cx, r_err)
+	    r_v(3)= poly_1d(2, r_x, &
+	            (/ r_flowy(i_lox, i_hiy), r_flowy(i_mdx, i_hiy), r_flowy(i_hix, i_hiy) /), &
+	            r_cx, r_err)
+	 END IF
+
+!---------- check for coordinate identity in y
+
+	  IF(abs(r_cy- r_y(1)) < r_eps) THEN
+	    r_inter(1)= r_u(1)* r_scalinvx
+	    r_inter(2)= r_v(1)* r_scalinvy
+	  ELSE IF(abs(r_cy- r_y(2)) < r_eps) THEN
+	    r_inter(1)= r_u(2)* r_scalinvx
+	    r_inter(2)= r_v(2)* r_scalinvy
+	  ELSE IF(abs(r_cy- r_y(3)) < r_eps) THEN
+	    r_inter(1)= r_u(3)* r_scalinvx
+	    r_inter(2)= r_v(3)* r_scalinvy
+	  ELSE
+
+!---------- quadratic interpolation in y
+
+	    r_inter(1)= poly_1d(2, r_y, r_u, r_cy, r_err)* r_scalinvx
+	    r_inter(2)= poly_1d(2, r_y, r_v, r_cy, r_err)* r_scalinvy
+	  END IF
+
+	  RETURN
+	  END FUNCTION data_qinterpol
+
+!*****************************************************************
+	  FUNCTION data_qlinterpol(r_coord) RESULT (r_inter)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_inter
+	  INTEGER                         :: i_lox, i_hix, i_loy, i_hiy, i_mdx, i_mdy
+	  REAL (KIND = GRID_SR)                            :: r_x, r_y, r_x1, r_x2, r_x3, &
+	    r_y1, r_y2, r_y3, r_u1, r_u2, r_u3, r_v1, r_v2, r_v3
+	  REAL (KIND = GRID_SR)                            :: r_ep, r_eps
+
+!---------- determine machine precision
+
+	  r_ep= 1.0_GRID_SR
+	  r_eps= epsilon(r_ep)
+
+!---------- find wind box corresponding to coordinate
+
+	  i_lox= FLOOR(r_coord(1))
+	  i_loy= FLOOR(r_coord(2))
+!-- preliminary bug fix
+	  IF(i_lox < 1) i_lox=1
+	  IF(i_lox >= i_pointsx) i_lox= i_pointsx-2
+	  IF(i_loy < 1) i_loy=1
+	  IF(i_loy >= i_pointsy) i_loy= i_pointsy-2
+!-- end of preliminary bug fix
+	  i_mdx= i_lox+ 1
+	  i_mdy= i_loy+ 1
+	  i_hix= i_lox+ 2
+	  i_hiy= i_loy+ 2
+
+!---------- near the domain boundary, do a linear interpolation (only for square)
+
+	  IF(i_lox < 2 .OR. i_loy < 2 .OR. i_hix > i_pointsx-1 .OR. i_hiy > i_pointsy-1) THEN
+	    r_inter= data_interpol(r_coord)
+	    RETURN
+	  END IF
+
+!---------- coefficients for quadratic interpolation in x
+
+	  r_x= r_coord(1)
+	  r_y= r_coord(2)
+
+	  r_x1= REAL(i_lox, GRID_SR)
+	  r_x2= REAL(i_mdx, GRID_SR)
+	  r_x3= REAL(i_hix, GRID_SR)
+
+	  r_y1= REAL(i_loy, GRID_SR)
+	  r_y2= REAL(i_mdy, GRID_SR)
+	  r_y3= REAL(i_hiy, GRID_SR)
+
+!---------- check for coordinate identity in x
+
+	  IF(abs(r_x- r_x1) < r_eps) THEN
+	    r_u1= r_flowx(i_lox, i_loy)
+	    r_u2= r_flowx(i_lox, i_mdy)
+	    r_u3= r_flowx(i_lox, i_hiy)
+	    r_v1= r_flowy(i_lox, i_loy)
+	    r_v2= r_flowy(i_lox, i_mdy)
+	    r_v3= r_flowy(i_lox, i_hiy)
+	  ELSE IF(abs(r_x- r_x2) < r_eps) THEN
+	    r_u1= r_flowx(i_mdx, i_loy)
+	    r_u2= r_flowx(i_mdx, i_mdy)
+	    r_u3= r_flowx(i_mdx, i_hiy)
+	    r_v1= r_flowy(i_mdx, i_loy)
+	    r_v2= r_flowy(i_mdx, i_mdy)
+	    r_v3= r_flowy(i_mdx, i_hiy)
+	  ELSE IF(abs(r_x- r_x3) < r_eps) THEN
+	    r_u1= r_flowx(i_hix, i_loy)
+	    r_u2= r_flowx(i_hix, i_mdy)
+	    r_u3= r_flowx(i_hix, i_hiy)
+	    r_v1= r_flowy(i_hix, i_loy)
+	    r_v2= r_flowy(i_hix, i_mdy)
+	    r_v3= r_flowy(i_hix, i_hiy)
+	  ELSE
+
+!---------- quadratic interpolation in x
+
+	    r_u1= lagrange(r_x, r_x1, r_x2, r_x3, &
+	          r_flowx(i_lox, i_loy), r_flowx(i_mdx, i_loy), r_flowx(i_hix, i_loy))
+	    r_u2= lagrange(r_x, r_x1, r_x2, r_x3, &
+	          r_flowx(i_lox, i_mdy), r_flowx(i_mdx, i_mdy), r_flowx(i_hix, i_mdy))
+	    r_u3= lagrange(r_x, r_x1, r_x2, r_x3, &
+	          r_flowx(i_lox, i_hiy), r_flowx(i_mdx, i_hiy), r_flowx(i_hix, i_hiy))
+
+	    r_v1= lagrange(r_x, r_x1, r_x2, r_x3, &
+	          r_flowy(i_lox, i_loy), r_flowy(i_mdx, i_loy), r_flowy(i_hix, i_loy))
+	    r_v2= lagrange(r_x, r_x1, r_x2, r_x3, &
+	          r_flowy(i_lox, i_mdy), r_flowy(i_mdx, i_mdy), r_flowy(i_hix, i_mdy))
+	    r_v3= lagrange(r_x, r_x1, r_x2, r_x3, &
+	          r_flowy(i_lox, i_hiy), r_flowy(i_mdx, i_hiy), r_flowy(i_hix, i_hiy))
+	  END IF
+
+!---------- check for coordinate identity in y
+
+	  IF(abs(r_y- r_y1) < r_eps) THEN
+	    r_inter(1)= r_u1* r_scalinvx
+	    r_inter(2)= r_v1* r_scalinvy
+	  ELSE IF(abs(r_y- r_y2) < r_eps) THEN
+	    r_inter(1)= r_u2* r_scalinvx
+	    r_inter(2)= r_v2* r_scalinvy
+	  ELSE IF(abs(r_y- r_y3) < r_eps) THEN
+	    r_inter(1)= r_u3* r_scalinvx
+	    r_inter(2)= r_v3* r_scalinvy
+	  ELSE
+
+!---------- quadratic interpolation in y
+
+	    r_inter(1)= lagrange(r_y, r_y1, r_y2, r_y3, r_u1, r_u2, r_u3)* r_scalinvx
+	    r_inter(2)= lagrange(r_y, r_y1, r_y2, r_y3, r_v1, r_v2, r_v3)* r_scalinvy
+	  END IF
+
+	  RETURN
+	  END FUNCTION data_qlinterpol
+
+!*****************************************************************
+	  FUNCTION lagrange(r_x, r_x1, r_x2, r_x3, r_y1, r_y2, r_y3) RESULT (r_y)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  REAL (KIND = GRID_SR) :: r_x, r_x1, r_x2, r_x3, r_y, r_y1, r_y2, r_y3
+	  REAL (KIND = GRID_SR) :: r_d12, r_d23, r_d13, r_dx1, r_dx2, r_dx3
+
+!---------- calculate differences
+
+	  r_d12= r_x1- r_x2
+	  r_d13= r_x1- r_x3
+	  r_d23= r_x2- r_x3
+
+	  r_dx1= r_x- r_x1
+	  r_dx2= r_x- r_x2
+	  r_dx3= r_x- r_x3
+
+!---------- calculate lagrangian
+
+	  r_y= (r_dx2* r_dx3)/( r_d12*  r_d13)* r_y1+ &
+	       (r_dx1* r_dx3)/(-r_d12*  r_d23)* r_y2+ &
+	       (r_dx1* r_dx2)/(-r_d13* (-r_d23))* r_y3
+	  
+	  RETURN
+	  END FUNCTION lagrange
+
+!*****************************************************************
+	  FUNCTION solv_3x3(r_mat, r_rhs, i_err) RESULT (r_sol)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  REAL (KIND = GRID_SR), DIMENSION(3,3) :: r_mat
+	  REAL (KIND = GRID_SR), DIMENSION(3)   :: r_rhs, r_sol
+	  INTEGER              :: i_err
+	  INTEGER              :: i_cnt, j_cnt, l_cnt, i_ind
+	  REAL (KIND = GRID_SR)                 :: r_tmp, r_fac, r_caf
+
+!---------- set error flag
+
+	  i_err= 0
+
+!---------- do the lr decomposition
+
+	  lr_outer: DO i_cnt=1,2
+
+!---------- perform pivoting
+
+	    pivot: IF(r_mat(i_cnt,i_cnt) == 0.0_GRID_SR) THEN
+	      i_ind= i_cnt+ 1
+	      IF(r_mat(i_ind,i_cnt) == 0.0_GRID_SR) i_ind= MIN(i_cnt+2,3)
+	      IF(r_mat(i_ind,i_cnt) == 0.0_GRID_SR) THEN
+	        i_err= -1
+	        r_sol= 0.0_GRID_SR
+	        RETURN
+	      END IF
+	      pivot_inner: DO j_cnt=1,3
+	        r_tmp             = r_mat(i_cnt,j_cnt)
+	        r_mat(i_cnt,j_cnt)= r_mat(i_ind,j_cnt)
+	        r_mat(i_ind,j_cnt)= r_tmp
+	      END DO pivot_inner
+	      r_tmp       = r_rhs(i_cnt)
+	      r_rhs(i_cnt)= r_rhs(i_ind)
+	      r_rhs(i_ind)= r_tmp
+	    END IF pivot
+
+!---------- now the elimination
+
+	    r_fac= 1.0_GRID_SR/ r_mat(i_cnt,i_cnt)
+	    lr_middle: DO j_cnt= i_cnt+1,3
+	      r_caf= r_mat(j_cnt,i_cnt)* r_fac
+	      r_rhs(j_cnt)= r_rhs(j_cnt)- r_rhs(i_cnt)* r_caf
+	      lr_inner: DO l_cnt= i_cnt+1,3
+	        r_mat(j_cnt,l_cnt)= r_mat(j_cnt,l_cnt)- r_mat(i_cnt,l_cnt)* r_caf
+	      END DO lr_inner
+	    END DO lr_middle
+	  END DO lr_outer
+
+!---------- do the backward substitution
+
+	  r_sol(3)= r_sol(3)/ r_mat(3,3)
+	  subst_outer: DO i_cnt=2,1,-1
+	    r_fac= 1.0/ r_mat(i_cnt,i_cnt)
+	    r_sol(i_cnt)= r_rhs(i_cnt)* r_fac
+	    subst_inner: DO j_cnt=i_cnt+1,3
+	      r_sol(i_cnt)= r_sol(i_cnt)- r_sol(j_cnt)* r_mat(i_cnt,j_cnt)* r_fac
+	    END DO subst_inner
+	  END DO subst_outer
+
+	  RETURN
+	  END FUNCTION solv_3x3
+
+!*****************************************************************
+	  FUNCTION qfunc(r_coo, r_coe) RESULT (r_val)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  REAL (KIND = GRID_SR)               :: r_coo, r_val
+	  REAL (KIND = GRID_SR), DIMENSION(3) :: r_coe
+
+!---------- evaluate quadratic function
+
+	  r_val= r_coo* r_coo* r_coe(1)+ r_coo* r_coe(2)+ r_coe(3)
+
+	  RETURN
+	  END FUNCTION qfunc
+!*****************************************************************
+	  FUNCTION poly_1d(i_ord, r_xi, r_yi, r_coo, r_dy) RESULT (r_val)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  INTEGER                  :: i_ord
+	  REAL (KIND = GRID_SR), DIMENSION(:)       :: r_xi, r_yi
+	  REAL (KIND = GRID_SR)                     :: r_coo, r_dy, r_val
+	  REAL (KIND = GRID_SR)                     :: r_dif, r_dift, r_ho, r_hp, r_w, r_den, r_eps, r_ep
+	  INTEGER                  :: i_ns, i_cnt, j_cnt
+	  INTEGER, PARAMETER       :: i_mxord=5
+	  REAL (KIND = GRID_SR), DIMENSION(i_mxord) :: r_c, r_d
+
+!---------- 
+
+	  IF(i_ord >= i_mxord) THEN
+	    CALL grid_error(33)
+	  END IF
+
+!	  r_ep= 1.0
+!	  r_eps= epsilon(r_ep)
+
+	  i_ns= 1
+	  r_dif= abs(r_coo- r_xi(1))
+
+	  DO i_cnt= 1, i_ord+ 1
+	    r_dift= abs(r_coo- r_xi(i_cnt))
+	    IF(r_dift < r_eps) THEN
+	      r_val= r_yi(i_cnt)
+	      RETURN
+	    END IF
+	    IF(r_dift < r_dif) THEN
+	      i_ns= i_cnt
+	      r_dif= r_dift
+	    END IF
+	    r_c(i_cnt)= r_yi(i_cnt)
+	    r_d(i_cnt)= r_yi(i_cnt)
+	  END DO
+
+	  r_val= r_yi(i_ns)
+	  i_ns= i_ns- 1
+
+	  DO j_cnt= 1, i_ord
+	    DO i_cnt= 1, i_ord+1-j_cnt
+	      r_ho= r_xi(i_cnt)- r_coo
+	      r_hp= r_xi(i_cnt+j_cnt)- r_coo
+	      r_w= r_c(i_cnt+1)- r_d(i_cnt)
+	      r_den= r_ho- r_hp
+	      IF(r_den == 0.0) THEN
+	        CALL grid_error(34)
+	      END IF
+	      r_den= r_w/ r_den
+	      r_d(i_cnt)= r_hp* r_den
+	      r_c(i_cnt)= r_ho* r_den
+	    END DO
+
+	    IF(2*i_ns < i_ord+1-j_cnt) THEN
+	      r_dy= r_c(i_ns+1)
+	    ELSE
+	      r_dy= r_d(i_ns)
+	      i_ns= i_ns- 1
+	    END IF
+	    r_val= r_val+ r_dy
+	  END DO
+
+	  RETURN
+	  END FUNCTION poly_1d
+!*****************************************************************
+!	  FUNCTION dist(r_coo1, r_coo2) RESULT (r_dist)
+
+!---------- local declarations
+
+!	  IMPLICIT NONE
+!	  REAL, DIMENSION(2) :: r_coo1, r_coo2
+!	  REAL               :: r_dist
+!	  REAL               :: r_d1, r_d2
+
+!---------- calculate distance between the two
+
+!	  r_d1= (r_coo1(1)- r_coo2(1))
+!	  r_d2= (r_coo1(2)- r_coo2(2))
+!	  r_dist= sqrt((r_d1*r_d1+ r_d2*r_d2))
+
+!	  RETURN
+!	  END FUNCTION dist
+
+!*****************************************************************
+	END MODULE ADV_wind
diff --git a/flash2d/src/options/ADV_wind.kaeser.f90 b/flash2d/src/options/ADV_wind.kaeser.f90
new file mode 100644
index 0000000..d7cb8f7
--- /dev/null
+++ b/flash2d/src/options/ADV_wind.kaeser.f90
@@ -0,0 +1,128 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	ADV_wind
+! FUNCTION:
+!	calculate the windfield for the advection problem
+!	according to kaeser test case (cf. phd thesis of M. Kaeser)
+!	but with modified coefficients (l. mentrup)
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_windfield
+! FUNCTION:
+!	calculate the advecting force for simple advection
+! SYNTAX:
+!	real.arr= slm_windfield(real.arr, real)
+! ON INPUT:
+!	r_coord: coordinates of point		real
+!	r_time:  time coordinate (optional)	real
+! ON OUTPUT:
+!	r_field: windfield			real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	12/97
+!	2. compliant to amatos 1.0	j. behrens	12/2000
+!	3. kaeser test case implemented	l. mentrup	12/2003
+!
+!*****************************************************************
+	MODULE ADV_wind
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC :: slm_windfield, slm_windinit, slm_windquit
+	  CONTAINS
+!*****************************************************************
+	  FUNCTION slm_windfield(r_coord, r_time) RESULT (r_field)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                  :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_field
+	  REAL (KIND = GRID_SR)                                        :: r_fac=.363610260832151995e-4_GRID_SR
+	  REAL (KIND = GRID_SR)                                        :: r_tim
+	  REAL (KIND = GRID_SR)					      :: r_dist
+	  REAL (KIND = GRID_SR)					      :: r_phi, r_sin
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), PARAMETER  :: r_cntr=(/ 0._GRID_SR, 0._GRID_SR /)
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_tmp
+
+!---------- set time
+
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- calculate the advection at (x,y) 
+!---------- circulating wind in x,y-plane with increasing velocity 
+!---------- wrt. the distance to r_cntr
+!---------- this test case corresponds to the kaeser test case with slightly other 
+!---------- wind data, so that the tracer is circulated in 0,75 days
+
+	  r_tmp= r_coord- r_cntr
+	  IF (r_tmp(1) > 0._GRID_SR) THEN
+	    IF (r_tmp(2) >= 0._GRID_SR) THEN
+	      r_phi = ATAN(r_tmp(2)/r_tmp(1))
+	      r_sin = 1.5_GRID_SR*COS(2_GRID_SR*r_phi) + 2.5_GRID_SR
+	      
+	      r_field(1) = -r_tmp(2)* r_sin * r_fac
+	      r_field(2) =  r_tmp(1)* r_sin * r_fac
+	    ELSE 
+	      r_phi = ATAN(-1*r_tmp(2)/r_tmp(1))
+	      r_sin = 1.5_GRID_SR*COS(2_GRID_SR*r_phi) + 2.5_GRID_SR
+	      
+	      r_field(1) = -r_tmp(2)* r_sin * r_fac
+	      r_field(2) =  r_tmp(1)* r_sin * r_fac
+	    END IF
+	  ELSE 
+	    r_field(1)= -r_tmp(2)* r_fac
+	    r_field(2)=  r_tmp(1)* r_fac
+	  END IF
+
+	
+	  RETURN
+	  END FUNCTION slm_windfield
+
+!*****************************************************************
+	  SUBROUTINE slm_windinit(p_control)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (control_struct)     :: p_control
+
+	  RETURN
+	  END SUBROUTINE slm_windinit
+
+!*****************************************************************
+	  SUBROUTINE slm_windquit
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  RETURN
+	  END SUBROUTINE slm_windquit
+
+!*****************************************************************
+	END MODULE ADV_wind
diff --git a/flash2d/src/options/ADV_wind.leveque.f90 b/flash2d/src/options/ADV_wind.leveque.f90
new file mode 100644
index 0000000..52af12a
--- /dev/null
+++ b/flash2d/src/options/ADV_wind.leveque.f90
@@ -0,0 +1,115 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	ADV_wind
+! FUNCTION:
+!	calculate the windfield for the advection problem
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_windfield
+! FUNCTION:
+!	calculate the advecting force for simple advection
+! SYNTAX:
+!	real.arr= slm_windfield(real.arr, real)
+! ON INPUT:
+!	r_coord: coordinates of point		real
+!	r_time:  time coordinate (optional)	real
+! ON OUTPUT:
+!	r_field: windfield			real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	12/97
+!	2. compliant to amatos 1.0	j. behrens	12/2000
+!	3. done some work for 2d	l. mentrup	2003
+!
+!*****************************************************************
+	MODULE ADV_wind
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC :: slm_windfield, slm_windinit, slm_windquit
+	  CONTAINS
+!*****************************************************************
+	  FUNCTION slm_windfield(r_coord, r_time) RESULT (r_field)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                  :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_field
+	  REAL (KIND = GRID_SR)                                        :: r_fac=.363610260832151995e-4_GRID_SR
+	  REAL (KIND = GRID_SR)                                        :: r_end=1.5_GRID_SR
+	  REAL (KIND = GRID_SR)					      :: r_diag= .1e-3_GRID_SR
+	  REAL (KIND = GRID_SR)                                        :: r_tim
+	  REAL (KIND = GRID_SR)					      :: r_tmp
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), PARAMETER  :: r_cntr=(/ 0._GRID_SR, 0._GRID_SR /)
+	  REAL (KIND = GRID_SR)                                        :: r_px, r_py, r_pt, &
+	    r_2px, r_2py
+
+!---------- set time
+
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0
+	  END IF
+
+!---------- calculate the advection at (x,y,z) 
+!---------- circulating wind in x,y-plane with increasing velocity 
+!---------- wrt. the distance to r_cntr
+
+	  r_px= GRID_PI* r_coord(1)
+	  r_py= GRID_PI* r_coord(2)
+	  r_2px= 2_GRID_SR* GRID_PI* r_coord(1)
+	  r_2py= 2_GRID_SR* GRID_PI* r_coord(2)
+	  r_pt= (GRID_PI* r_tim)/ r_end
+      r_tmp= sin(r_px)* sin(r_px)* sin(r_2py)* cos(r_pt)
+	  r_field(1)= r_tmp
+	  r_tmp= -(sin(r_py)* sin(r_py))* sin(r_2px)* cos(r_pt)
+	  r_field(2)= r_tmp
+
+	  RETURN
+	  END FUNCTION slm_windfield
+
+!*****************************************************************
+	  SUBROUTINE slm_windinit(p_control)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (control_struct)     :: p_control
+
+	  RETURN
+	  END SUBROUTINE slm_windinit
+
+!*****************************************************************
+	  SUBROUTINE slm_windquit
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  RETURN
+	  END SUBROUTINE slm_windquit
+
+!*****************************************************************
+	END MODULE ADV_wind
diff --git a/flash2d/src/options/ADV_wind.nowind.f90 b/flash2d/src/options/ADV_wind.nowind.f90
new file mode 100644
index 0000000..c3ea6c1
--- /dev/null
+++ b/flash2d/src/options/ADV_wind.nowind.f90
@@ -0,0 +1,91 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	ADV_wind
+! FUNCTION:
+!	calculate the windfield for the advection problem
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_windfield
+! FUNCTION:
+!	calculate the advecting force for simple advection
+! SYNTAX:
+!	real.arr= slm_windfield(real.arr, real)
+! ON INPUT:
+!	r_coord: coordinates of point		real
+!	r_time:  time coordinate (optional)	real
+! ON OUTPUT:
+!	r_field: windfield			real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	12/97
+!	2. compliant to amatos 1.0	j. behrens	12/2000
+!	3. done some work for 2d	l. mentrup	2003
+!
+!*****************************************************************
+	MODULE ADV_wind
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC :: slm_windfield, slm_windinit, slm_windquit
+	  CONTAINS
+!*****************************************************************
+	  FUNCTION slm_windfield(r_coord, r_time) RESULT (r_field)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                  :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_field
+
+!---------- no wind!
+
+
+	  r_field(:)=  0.
+
+	
+	  RETURN
+	  END FUNCTION slm_windfield
+
+!*****************************************************************
+	  SUBROUTINE slm_windinit(p_control)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (control_struct)     :: p_control
+
+	  RETURN
+	  END SUBROUTINE slm_windinit
+
+!*****************************************************************
+	  SUBROUTINE slm_windquit
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  RETURN
+	  END SUBROUTINE slm_windquit
+
+!*****************************************************************
+	END MODULE ADV_wind
diff --git a/flash2d/src/options/ADV_wind.vortex.f90 b/flash2d/src/options/ADV_wind.vortex.f90
new file mode 100644
index 0000000..04adb4e
--- /dev/null
+++ b/flash2d/src/options/ADV_wind.vortex.f90
@@ -0,0 +1,139 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	ADV_wind
+! FUNCTION:
+!	calculate the windfield for the advection problem
+!	according to vortex test case (cf. Nair 2006)
+!	but with modified coefficients (l. mentrup)
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_windfield
+! FUNCTION:
+!	calculate the advecting force field for simple advection
+! SYNTAX:
+!	real.arr= slm_windfield(real.arr, real)
+! ON INPUT:
+!	r_coord: coordinates of point		    real
+!	r_time:  time coordinate (optional)	real
+! ON OUTPUT:
+!	r_field: windfield			real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		l. mentrup	12/2006
+!
+!*****************************************************************
+	MODULE ADV_wind
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC :: slm_windfield, slm_windinit, slm_windquit
+	  CONTAINS
+!*****************************************************************
+	  FUNCTION slm_windfield(r_coo, r_time) RESULT (r_field)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coo
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                  :: r_time
+		
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_rvec, r_vvec, r_field
+		
+		REAL (KIND = GRID_SR)                                        :: r_dlt   = 0.05_GRID_SR			! controls the width of the decay from value 2 to value 0
+		REAL (KIND = GRID_SR)                                        :: r_vnot  = 2.598_GRID_SR 		! tangential velocity such that omega < 1.
+		REAL (KIND = GRID_SR)                                        :: r_scale = 86400._GRID_SR		! scale on one day	
+		REAL (KIND = GRID_SR)                                        :: r_eps   = 1.E-6_GRID_SR
+
+	  REAL (KIND = GRID_SR)                                        :: r_t
+ 	  REAL (KIND = GRID_SR)                                        :: r_r
+	
+		REAL (KIND = GRID_SR)                                        :: r_vt, r_tanh
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), PARAMETER  :: r_ctr=(/ 0._GRID_SR, 0._GRID_SR /)
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_tmp
+
+!---------- initialize
+
+!---------- set time
+
+	  IF(present(r_time)) THEN
+	    r_t= r_time
+	  ELSE
+	    r_t= 0.0_GRID_SR
+	  END IF
+
+!---------- compute the windfield at (x,y) 
+!---------- vortex wind in x,y-plane
+
+	  r_rvec = (r_coo - r_ctr) 
+		r_r    = twonorm(r_rvec) * GRID_PI * 2._GRID_SR					! scale the domain from [-0.5,0,5]to [-Pi, Pi]
+		
+		IF (r_r <= r_eps) THEN
+		  r_field = 0._GRID_SR
+		ELSE
+		  r_tanh = tanh(r_r) 
+		  r_vt   = (1._GRID_SR - r_tanh*r_tanh) * r_tanh * r_vnot * GRID_PI / r_scale
+		  r_vvec  = (/ -r_rvec(2), r_rvec(1) /) / r_r
+			r_field = r_vt * r_vvec
+		END IF 
+		 
+	
+	  RETURN
+	  END FUNCTION slm_windfield
+
+!*****************************************************************
+	  SUBROUTINE slm_windinit(p_control)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (control_struct)     :: p_control
+
+	  RETURN
+	  END SUBROUTINE slm_windinit
+
+!*****************************************************************
+	  SUBROUTINE slm_windquit
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  RETURN
+	  END SUBROUTINE slm_windquit
+
+!*****************************************************************
+    FUNCTION twonorm(r_vector) RESULT(r_nrm)
+		
+		IMPLICIT NONE
+
+		REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)           :: r_vector
+		REAL (KIND = GRID_SR)                                      :: r_nrm
+		
+		INTEGER                                                    :: i_cnt
+		
+		r_nrm = 0._GRID_SR
+		r_nrm = dot_product(r_vector, r_vector)
+		r_nrm = sqrt(r_nrm)
+		
+		END FUNCTION twonorm
+
+	END MODULE ADV_wind
diff --git a/flash2d/src/options/ADV_wind.zonal.f90 b/flash2d/src/options/ADV_wind.zonal.f90
new file mode 100644
index 0000000..529ca48
--- /dev/null
+++ b/flash2d/src/options/ADV_wind.zonal.f90
@@ -0,0 +1,104 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	ADV_wind
+! FUNCTION:
+!	calculate the windfield for the advection problem
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_windfield
+! FUNCTION:
+!	calculate the advecting force for simple advection
+! SYNTAX:
+!	real.arr= slm_windfield(real.arr, real)
+! ON INPUT:
+!	r_coord: coordinates of point		real
+!	r_time:  time coordinate (optional)	real
+! ON OUTPUT:
+!	r_field: windfield			real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	12/97
+!	2. compliant to amatos 1.0	j. behrens	12/2000
+!	3. compliant to amatos 1.2	j. behrens	3/2002
+!
+!*****************************************************************
+	MODULE ADV_wind
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC :: slm_windfield, slm_windinit, slm_windquit
+	  REAL (KIND = GRID_SR), SAVE :: r_fac
+	  CONTAINS
+!*****************************************************************
+	  FUNCTION slm_windfield(r_coord, r_time) RESULT (r_field)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                  :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_field
+	  REAL (KIND = GRID_SR)                                        :: r_tim
+
+!---------- set time
+
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- calculate the advection at (x,y) (velocity increasing)
+!           this is for the shifted unit sqare!
+
+	  r_field(1)= r_fac
+	  r_field(2)= 0._GRID_SR
+	
+	  RETURN
+	  END FUNCTION slm_windfield
+
+!*****************************************************************
+	  SUBROUTINE slm_windinit(p_control)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  TYPE (control_struct)     :: p_control
+
+	  r_fac=1._GRID_SR/(p_control%num%r_deltatime*20._GRID_SR)
+	  p_control%tst%tst_real(1,2)= r_fac
+
+	  RETURN
+	  END SUBROUTINE slm_windinit
+
+!*****************************************************************
+	  SUBROUTINE slm_windquit
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  RETURN
+	  END SUBROUTINE slm_windquit
+
+!*****************************************************************
+	END MODULE ADV_wind
diff --git a/flash2d/src/options/ADV_wind_aviso.file.f90 b/flash2d/src/options/ADV_wind_aviso.file.f90
new file mode 100644
index 0000000..47bc0e5
--- /dev/null
+++ b/flash2d/src/options/ADV_wind_aviso.file.f90
@@ -0,0 +1,469 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	ADV_wind
+! FUNCTION:
+!	calculate the windfield for the advection problem
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_windfield
+! FUNCTION:
+!	calculate the advecting force for simple advection
+! SYNTAX:
+!	real.arr= slm_windfield(real.arr, real)
+! ON INPUT:
+!	r_coord: coordinates of point		real
+!	r_time:  time coordinate (optional)	real
+! ON OUTPUT:
+!	r_field: windfield			real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	12/97
+!	2. bug fix concerning interp.	j. behrens	2/98
+!	3. compliant to amatos 1.0	j. behrens	12/2000
+!	4. compliant to amatos 1.2	j. behrens	3/2002
+!	5. new version for course tracer transport	j. behrens 01/2012
+!
+!*****************************************************************
+	MODULE ADV_wind
+	  USE GRID_api
+	  USE FLASH_parameters
+	  PRIVATE
+	  INTEGER, PARAMETER    :: i_ioerr=0
+	  REAL (KIND = GRID_SR) :: r_intervallen, r_readlast
+	  REAL (KIND = GRID_SR) :: r_ncupdatelast, r_secperstep
+	  CHARACTER (LEN=128)   :: c_windpath
+	  CHARACTER (LEN=64), DIMENSION(:), ALLOCATABLE        :: c_windfile
+	  REAL (KIND = GRID_SR), DIMENSION(:,:,:), ALLOCATABLE :: r_flowx
+	  REAL (KIND = GRID_SR), DIMENSION(:,:,:), ALLOCATABLE :: r_flowy
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE     :: r_lat
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE     :: r_lon
+      INTEGER (KIND = GRID_SI)  :: i_lon, i_lat, i_timesteps, i_numfiles
+	  INTEGER (KIND = GRID_SI)  :: i_pointsx, i_pointsy
+	  INTEGER (KIND = GRID_SI)  :: i_timeinterval, i_intervalnum, i_stepcounter
+	  
+	  PUBLIC                    :: slm_windfield, slm_windinit, slm_windquit
+	  
+	  CONTAINS
+!*****************************************************************
+	  FUNCTION slm_windfield(r_coord, r_time) RESULT (r_field)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_field
+	  REAL (KIND = GRID_SR)                       :: r_tim
+	  CHARACTER (LEN=192)                         :: c_ncfile
+	  INTEGER (KIND = GRID_SI)                    :: i_iost, i_cnt, j_cnt
+
+!---------- set time
+
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- decide, if data has to be read
+
+	  data_read: IF(r_readlast <= r_tim) THEN
+
+!---------- update values for next open
+
+	    r_readlast    = r_readlast+ r_intervallen
+	    i_timeinterval= i_timeinterval+ 1
+	    IF(i_timeinterval > i_numfiles) THEN
+	      CALL grid_error(i_error=1,c_error='[slm_windfield]: no more current files in list, fixing last one')
+          i_timeinterval = i_numfiles
+        END IF
+        i_stepcounter = 0_GRID_SI
+
+!---------- create filenames
+
+	    write(c_ncfile,*) trim(c_windpath),c_windfile(i_timeinterval)
+	    c_ncfile= adjustl(c_ncfile)
+
+!---------- read current data from NetCDF file
+
+	    CALL read_netcdf_currents(c_ncfile)
+
+	  END IF data_read
+
+!---------- decide, if counter needs to be updated
+
+      update_nccount: IF(r_ncupdatelast <= r_tim) THEN
+        i_stepcounter= i_stepcounter+1
+        IF(i_stepcounter > i_timesteps) &
+          CALL grid_error(c_error='[slm_windfield]: step counter overflow!')
+        r_ncupdatelast= r_ncupdatelast+ r_secperstep
+      END IF update_nccount
+
+!---------- interpolate to coordinate
+
+	  r_field= data_interpol(r_coord,i_stepcounter)
+
+	  RETURN
+ 1000	  FORMAT(i3.3)
+	  END FUNCTION slm_windfield
+
+!*****************************************************************
+	  SUBROUTINE read_netcdf_currents(c_filename)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+      INCLUDE "netcdf.inc"
+      
+!---------- input parameters      
+	  CHARACTER (LEN=192), INTENT(in)       :: c_filename
+	  
+!---------- local variables
+	  INTEGER (KIND = GRID_SI)              :: i_alct, i_ncstat
+      INTEGER (KIND = GRID_SI)              :: i_fileid
+      INTEGER (KIND = GRID_SI)              :: i_dimid, i_varid
+      INTEGER (KIND = GRID_SI)              :: i_tm, i_ln, i_lt, i_tmaux
+      INTEGER*4, DIMENSION(:,:,:), ALLOCATABLE :: i_u, i_v
+	  REAL, DIMENSION(:), ALLOCATABLE       :: r_auxlat
+	  REAL, DIMENSION(:), ALLOCATABLE       :: r_auxlon
+
+!---------- open current file
+
+      i_ncstat= nf_open(trim(c_filename),NF_NOWRITE,i_fileid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not open currents data file')
+    
+!---------- determine lon/lat/time dimension sizes (grid size of currents field)
+
+      i_ncstat= nf_inq_dimid(i_fileid, 'lon', i_dimid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not identify lon dimension')
+      i_ncstat= nf_inq_dimlen(i_fileid, i_dimid, i_lon)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not read lon dimension')
+      
+      i_ncstat= nf_inq_dimid(i_fileid, 'lat', i_dimid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not identify lat dimension')
+      i_ncstat= nf_inq_dimlen(i_fileid, i_dimid, i_lat)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not read lat dimension')
+
+      i_ncstat= nf_inq_dimid(i_fileid, 'time', i_dimid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not identify time dimension')
+      i_ncstat= nf_inq_dimlen(i_fileid, i_dimid, i_tmaux)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not read time dimension')
+      IF(i_tmaux .NE. i_timesteps) &
+        CALL grid_error(c_error='[read_netcdf_currents]: incompatible time step count')
+
+!---------- allocate latitude and longitude coordinate arrays
+!           NOTE: if lat or lon are allocated, we do not need to read
+!                 them again, since we expect to have same sized data files!
+
+	  latlon: IF((.NOT. ALLOCATED(r_lat)) .OR. (.NOT. ALLOCATED(r_lon))) THEN
+	  ALLOCATE(r_lat(i_lat), r_lon(i_lon), r_auxlat(i_lat), r_auxlon(i_lon), stat= i_alct)
+      IF(i_alct /= 0) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not allocate lat/lon field')
+
+!---------- read latitude and longitude coordinate values
+
+      i_ncstat= nf_inq_varid(i_fileid, 'lon', i_varid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not determine lon varid')
+      i_ncstat= nf_get_var_real(i_fileid, i_varid, r_auxlon)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not read lon data')
+      r_lon= REAL(r_auxlon, GRID_SR)
+
+      i_ncstat= nf_inq_varid(i_fileid, 'lat', i_varid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not determine lat varid')
+      i_ncstat= nf_get_var_real(i_fileid, i_varid, r_auxlat)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not read lat data')
+      r_lat= REAL(r_auxlat, GRID_SR)
+      DEALLOCATE(r_auxlat, r_auxlon)
+      END IF latlon
+
+!---------- allocate current data arrays
+	  IF((.NOT. ALLOCATED(r_flowx)) .OR. (.NOT. ALLOCATED(r_flowy))) THEN
+        ALLOCATE(r_flowx(i_lon, i_lat, i_timesteps), r_flowy(i_lon, i_lat, i_timesteps), stat= i_alct)
+        IF(i_alct /= 0) &
+	      CALL grid_error(c_error='[read_netcdf_currents]: could not allocate currents fields')
+      END IF
+	  ALLOCATE(i_u(i_lon, i_lat, i_timesteps), i_v(i_lon, i_lat, i_timesteps), stat= i_alct)
+      IF(i_alct /= 0) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not allocate local currents fields')
+
+!---------- read x-/y-direction data of currents
+
+      i_ncstat= nf_inq_varid(i_fileid, 'u', i_varid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not determine varid of var49')
+      i_ncstat= nf_get_var_int(i_fileid, i_varid, i_u)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not read var49 data')
+
+      i_ncstat= nf_inq_varid(i_fileid, 'v', i_varid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not determine varid of var50')
+      i_ncstat= nf_get_var_int(i_fileid, i_varid, i_v)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not read var50 data')
+
+!---------- Fix mask values
+
+	  DO i_tm=1,i_timesteps
+	  	DO i_lt= 1,i_lat
+	  	  DO i_ln= 1,i_lon
+	  	    IF(i_u(i_ln,i_lt,i_tm) == -2147483647) THEN
+	  	      r_flowx(i_ln,i_lt,i_tm)= 0._GRID_SR
+	  	    ELSE
+	  	      r_flowx(i_ln,i_lt,i_tm)= REAL(i_u(i_ln,i_lt,i_tm),GRID_SR)* 0.0001_GRID_SR
+	  	    END IF
+	  	    IF(i_v(i_ln,i_lt,i_tm) == -2147483647) THEN
+	  	      r_flowy(i_ln,i_lt,i_tm)= 0._GRID_SR
+	  	    ELSE
+	  	      r_flowy(i_ln,i_lt,i_tm)= REAL(i_v(i_ln,i_lt,i_tm),GRID_SR)* 0.0001_GRID_SR
+	  	    END IF
+	  	  END DO
+	  	END DO
+	  END DO
+	  
+!---------- deallocate local arrays
+
+      DEALLOCATE(i_u,i_v)
+
+!---------- close currents file
+
+	  i_ncstat= nf_close(i_fileid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not close currents data file')
+
+	  END SUBROUTINE read_netcdf_currents
+
+!*****************************************************************
+	  SUBROUTINE slm_windinit(p_control)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct)     :: p_control
+	  INTEGER                   :: i_iofil= 19
+	  CHARACTER (len=io_fillen+i_charlength) :: c_name
+	  CHARACTER (len=128)       :: a_filrow
+	  INTEGER                   :: i_iost, i_ioend, i_alct, i_cnt
+
+!---------- initialize
+
+	  WRITE(c_name,*) trim(p_param%cmd%c_directory),p_control%tst%tst_char(1)
+	  c_name= adjustl(c_name)
+	  c_windpath= p_param%cmd%c_directory
+      i_numfiles= -1
+
+!---------- open wind parameter file
+
+	  open(unit= i_iofil, file= c_name, status= 'OLD', action= 'READ', iostat= i_iost)
+	  file_notopen: IF(i_iost /= 0) THEN
+	    write(i_ioerr,*) 'ERROR: Filename: ', c_name
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'ERROR: Filename: ', c_name
+	    CALL grid_error(c_error='[slm_windinit]: could not open wind parameters file')
+	  END IF file_notopen
+	  IF(GRID_parameters%iolog > 0) &
+	    write(GRID_parameters%iolog,*) 'INFO: Opened file on unit: ', i_iofil
+
+!---------- read wind parameter file
+
+	  read_loop: DO
+	    read(i_iofil,2000,iostat=i_ioend) a_filrow
+
+!---------- if file ended
+
+	    file_end: IF(i_ioend /= 0) THEN
+	      close(i_iofil)
+	      IF(GRID_parameters%iolog > 0) &
+	        write(GRID_parameters%iolog,*) 'INFO: Closed file on unit: ', i_iofil
+	      EXIT read_loop
+	    ELSE file_end
+
+!---------- decide what to DO with line according to first character
+
+	    comment_line: IF(a_filrow(1:1) == '#' .or. a_filrow(1:1) == '!') THEN
+	      CONTINUE
+	    ELSE IF(a_filrow(1:8) == 'ABS_PATH') THEN comment_line
+	      read(i_iofil,2000) c_windpath
+	    ELSE IF(a_filrow(1:8) == 'SEC_PER_') THEN comment_line
+	      read(i_iofil,*) r_secperstep
+	    ELSE IF(a_filrow(1:8) == 'STEPS_PE') THEN comment_line
+	      read(i_iofil,*) i_timesteps
+	    ELSE IF(a_filrow(1:8) == 'INFILE_N') THEN comment_line
+	      read(i_iofil,*) i_numfiles
+          ALLOCATE(c_windfile(i_numfiles), stat=i_alct)
+          IF(i_alct /= 0) &
+            CALL grid_error(c_error='[slm_windinit]: could not allocate windname array')
+	    ELSE IF(a_filrow(1:8) == 'FILE_LIS') THEN comment_line
+	      IF(i_numfiles < 1) &
+	        CALL grid_error(c_error='[slm_windinit]: number of wind files unknown')
+          DO i_cnt=1,i_numfiles
+            c_windfile(i_cnt)= '                                                                '
+	        read(i_iofil,2010) c_windfile(i_cnt)
+	      END DO
+	    END IF comment_line
+
+	    END IF file_end
+	  END DO read_loop
+
+!---------- initialize some values
+
+	  r_readlast     = 0.0_GRID_SR
+	  r_ncupdatelast = 0.0_GRID_SR
+	  i_timeinterval = 0_GRID_SI
+	  i_stepcounter  = 0_GRID_SI
+	  r_intervallen  = r_secperstep* i_timesteps
+
+	  RETURN
+ 2000 FORMAT(a128)
+ 2010 FORMAT(a64)
+	  END SUBROUTINE slm_windinit
+
+!*****************************************************************
+	  SUBROUTINE slm_windquit
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+!---------- deallocate wind data arrays
+
+	  DEALLOCATE(r_flowx, r_flowy)
+	  DEALLOCATE(r_lon, r_lat)
+
+	  RETURN
+	  END SUBROUTINE slm_windquit
+
+!*****************************************************************
+	  FUNCTION data_interpol(r_coord, i_tim) RESULT (r_inter)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_coord
+	  INTEGER (KIND = GRID_SI)                         :: i_tim
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_inter
+	  INTEGER (KIND = GRID_SI)                         :: i_lox, i_hix, i_loy, i_hiy, i_cnt
+	  REAL (KIND = GRID_SR)                            :: r_dx, r_dy, r_lx, r_hx, &
+	    r_ly, r_hy, r_l1, r_h1, r_l2, r_h2, r_dxi, r_dyi
+	  REAL (KIND = GRID_SR)                            :: r_scalx, r_scaly
+	  REAL (KIND = GRID_SR)                            :: r_deg, r_radians
+	  REAL (KIND = GRID_SR), PARAMETER                 :: r_earth=6.371e6_GRID_SR ! earth's radius
+
+!---------- initialize radians
+
+	  r_radians= GRID_PI/180._GRID_SR
+	  r_deg= r_radians* r_earth
+
+!---------- find wind box corresponding to coordinate
+
+	  i_lox=1_GRID_SI
+	  i_hix=2_GRID_SI
+	  i_loy=1_GRID_SI
+	  i_hiy=2_GRID_SI
+
+	  determine_lon: DO i_cnt=1, i_lon-1
+	    IF(r_lon(i_cnt) .LT. r_coord(1)) THEN
+	      IF(r_lon(i_cnt +1) .GE. r_coord(1)) THEN
+	        i_lox= i_cnt
+	        i_hix= i_cnt+1
+	        exit determine_lon
+	      END IF
+	    END IF
+	  END DO determine_lon
+	  IF(r_lon(i_lon) .LT. r_coord(1)) THEN
+	    i_lox = i_lon-1
+	    i_hix = i_lon
+	  END IF
+
+	  determine_lat: DO i_cnt=1, i_lat-1
+	    IF(r_lat(i_cnt) .LT. r_coord(2)) THEN
+	      IF(r_lat(i_cnt +1) .GE. r_coord(2)) THEN
+	        i_loy= i_cnt
+	        i_hiy= i_cnt+1
+	        exit determine_lat
+	      END IF
+	    END IF
+	  END DO determine_lat
+	  IF(r_lat(i_lat) .LT. r_coord(2)) THEN
+	    i_loy = i_lat-1
+	    i_hiy = i_lat
+	  END IF
+	  
+
+!---------- calculate weights for bilinear interpolation
+
+	  r_dx= r_lon(i_hix)- r_lon(i_lox)
+	  r_dy= r_lat(i_hiy)- r_lat(i_loy)
+	  r_lx= r_coord(1) - r_lon(i_lox)
+	  r_ly= r_coord(2) - r_lat(i_loy)
+	  r_hx= r_lon(i_hix) - r_coord(1)
+	  r_hy= r_lat(i_hiy) - r_coord(2)
+	  r_scalx=1._GRID_SR/(r_deg*cos(r_radians*r_lat(i_hiy))) !r_coord(2)))
+	  r_scaly=1._GRID_SR/(r_deg)
+
+!---------- linear interpolation in x-direction
+
+	  IF(r_dx /= 0.0_GRID_SR) THEN
+	    r_dxi= 1._GRID_SR/r_dx
+	    r_l1= (r_hx* r_flowx(i_lox, i_loy, i_tim)+ &
+	           r_lx* r_flowx(i_hix, i_loy, i_tim))* r_dxi
+	    r_h1= (r_hx* r_flowx(i_lox, i_hiy, i_tim)+ &
+	           r_lx* r_flowx(i_hix, i_hiy, i_tim))* r_dxi
+	    r_l2= (r_hx* r_flowy(i_lox, i_loy, i_tim)+ &
+	           r_lx* r_flowy(i_hix, i_loy, i_tim))* r_dxi
+	    r_h2= (r_hx* r_flowy(i_lox, i_hiy, i_tim)+ &
+	           r_lx* r_flowy(i_hix, i_hiy, i_tim))* r_dxi
+	  ELSE
+	    r_l1= r_flowx(i_lox, i_loy, i_tim)
+	    r_h1= r_flowx(i_lox, i_hiy, i_tim)
+	    r_l2= r_flowy(i_lox, i_loy, i_tim)
+	    r_h2= r_flowy(i_lox, i_hiy, i_tim)
+	  END IF
+
+!---------- linear interpolation in y-direction
+
+	  IF(r_dy /= 0.0_GRID_SR) THEN
+	    r_dyi= 1._GRID_SR/r_dy
+	    r_inter(1)= (r_hy* r_l1+ r_ly* r_h1)* r_dyi* r_scalx
+	    r_inter(2)= (r_hy* r_l2+ r_ly* r_h2)* r_dyi* r_scaly
+	  ELSE
+	    r_inter(1)= r_l1* r_scalx
+	    r_inter(2)= r_l2* r_scaly
+	  END IF
+
+	  RETURN
+	  END FUNCTION data_interpol
+
+!*****************************************************************
+	END MODULE ADV_wind
diff --git a/flash2d/src/options/ADV_wind_netcdf.file.f90 b/flash2d/src/options/ADV_wind_netcdf.file.f90
new file mode 100644
index 0000000..5110adf
--- /dev/null
+++ b/flash2d/src/options/ADV_wind_netcdf.file.f90
@@ -0,0 +1,363 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	ADV_wind
+! FUNCTION:
+!	calculate the windfield for the advection problem
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_windfield
+! FUNCTION:
+!	calculate the advecting force for simple advection
+! SYNTAX:
+!	real.arr= slm_windfield(real.arr, real)
+! ON INPUT:
+!	r_coord: coordinates of point		real
+!	r_time:  time coordinate (optional)	real
+! ON OUTPUT:
+!	r_field: windfield			real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	12/97
+!	2. bug fix concerning interp.	j. behrens	2/98
+!	3. compliant to amatos 1.0	j. behrens	12/2000
+!	4. compliant to amatos 1.2	j. behrens	3/2002
+!	5. new version for course tracer transport	j. behrens 01/2012
+!
+!*****************************************************************
+	MODULE ADV_wind
+	  USE GRID_api
+	  USE FLASH_parameters
+	  PRIVATE
+	  INTEGER, PARAMETER    :: i_ioerr=0
+	  REAL (KIND = GRID_SR) :: r_intervallen, r_scalfacx, r_scalfacy, &
+	                           r_readlast, r_scalinvx, r_scalinvy
+	  CHARACTER (LEN=32)    :: c_prfixx, c_prfixy, c_pofixx, c_pofixy
+	  REAL (KIND = GRID_SR), DIMENSION(:,:,:), ALLOCATABLE :: r_flowx
+	  REAL (KIND = GRID_SR), DIMENSION(:,:,:), ALLOCATABLE :: r_flowy
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE     :: r_lat
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE     :: r_lon
+      INTEGER (KIND = GRID_SI)  :: i_lon, i_lat, i_timesteps
+	  INTEGER (KIND = GRID_SI)  :: i_pointsx, i_pointsy, i_timeinterval, i_intervalnum
+	  
+	  PUBLIC                    :: slm_windfield, slm_windinit, slm_windquit
+	  
+	  CONTAINS
+!*****************************************************************
+	  FUNCTION slm_windfield(r_coord, r_time) RESULT (r_field)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_field
+	  REAL (KIND = GRID_SR)                       :: r_tim
+	  CHARACTER (LEN=67)                          :: c_xfile, c_yfile
+	  CHARACTER (LEN=35)                          :: c_tmp
+	  CHARACTER (LEN=3)                           :: c_num
+	  INTEGER (KIND = GRID_SI)                    :: i_iost, i_cnt, j_cnt
+
+!---------- set time
+
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- decide, if data has to be read
+
+	  data_read: IF(r_readlast <= r_tim) THEN
+
+!---------- update values for next open
+
+	    r_readlast    = r_readlast+ r_intervallen
+	    i_timeinterval= i_timeinterval+ 1
+	  END IF data_read
+
+!---------- interpolate to coordinate
+
+	  r_field= data_interpol(r_coord,i_timeinterval)
+
+	  RETURN
+ 1000	  FORMAT(i3.3)
+	  END FUNCTION slm_windfield
+
+!*****************************************************************
+	  SUBROUTINE read_netcdf_currents(c_filename)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+      INCLUDE "netcdf.inc"
+      
+!---------- input parameters      
+	  CHARACTER (LEN=i_charlength+io_fillen), INTENT(in)  :: c_filename
+	  
+!---------- local variables
+	  INTEGER (KIND = GRID_SI)        :: i_alct, i_ncstat
+      INTEGER (KIND = GRID_SI)        :: i_fileid
+      INTEGER (KIND = GRID_SI)        :: i_dimid, i_varid
+      INTEGER (KIND = GRID_SI)        :: i_tm, i_ln, i_lt
+
+!---------- open current file
+
+      i_ncstat= nf_open(c_filename,NF_NOWRITE,i_fileid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not open currents data file')
+    
+!---------- determine lon/lat/time dimension sizes (grid size of currents field)
+
+      i_ncstat= nf_inq_dimid(i_fileid, 'lon', i_dimid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not identify lon dimension')
+      i_ncstat= nf_inq_dimlen(i_fileid, i_dimid, i_lon)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not read lon dimension')
+      
+      i_ncstat= nf_inq_dimid(i_fileid, 'lat', i_dimid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not identify lat dimension')
+      i_ncstat= nf_inq_dimlen(i_fileid, i_dimid, i_lat)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not read lat dimension')
+
+      i_ncstat= nf_inq_dimid(i_fileid, 'time', i_dimid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not identify time dimension')
+      i_ncstat= nf_inq_dimlen(i_fileid, i_dimid, i_timesteps)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not read time dimension')
+    
+!---------- allocate latitude and longitude coordinate arrays
+
+	  ALLOCATE(r_lat(i_lat), r_lon(i_lon), stat= i_alct)
+      IF(i_alct /= 0) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not allocate lat/lon field')
+
+!---------- read latitude and longitude coordinate values
+
+      i_ncstat= nf_inq_varid(i_fileid, 'lon', i_varid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not determine lon varid')
+      i_ncstat= nf_get_var_real(i_fileid, i_varid, r_lon)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not read lon data')
+
+      i_ncstat= nf_inq_varid(i_fileid, 'lat', i_varid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not determine lat varid')
+      i_ncstat= nf_get_var_real(i_fileid, i_varid, r_lat)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not read lat data')
+    
+!---------- allocate current data arrays
+
+	  ALLOCATE(r_flowx(i_lon, i_lat, i_timesteps), r_flowy(i_lon, i_lat, i_timesteps), stat= i_alct)
+      IF(i_alct /= 0) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not allocate currents fields')
+
+!---------- read x-/y-direction data of currents
+
+      i_ncstat= nf_inq_varid(i_fileid, 'var49', i_varid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not determine varid of var49')
+      i_ncstat= nf_get_var_real(i_fileid, i_varid, r_flowx)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not read var49 data')
+
+      i_ncstat= nf_inq_varid(i_fileid, 'var50', i_varid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not determine varid of var50')
+      i_ncstat= nf_get_var_real(i_fileid, i_varid, r_flowy)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not read var50 data')
+
+!---------- Fix mask values
+
+	  DO i_tm=1,i_timesteps
+	  	DO i_lt= 1,i_lat
+	  	  DO i_ln= 1,i_lon
+	  	    IF(r_flowx(i_ln,i_lt,i_tm) <= -8.99E+33) r_flowx(i_ln,i_lt,i_tm)= 0._GRID_SR
+	  	    IF(r_flowy(i_ln,i_lt,i_tm) <= -8.99E+33) r_flowy(i_ln,i_lt,i_tm)= 0._GRID_SR
+	  	  END DO
+	  	END DO
+	  END DO
+
+!---------- close currents file
+
+	  i_ncstat= nf_close(i_fileid)
+	  IF(i_ncstat /= NF_NOERR) &
+	    CALL grid_error(c_error='[read_netcdf_currents]: could not close currents data file')
+
+	  END SUBROUTINE read_netcdf_currents
+
+!*****************************************************************
+	  SUBROUTINE slm_windinit(p_control)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct)     :: p_control
+	  INTEGER                   :: i_iofil= 19
+	  CHARACTER (len=i_charlength+io_fillen) :: c_name
+	  CHARACTER (len=80)        :: a_filrow
+	  INTEGER                   :: i_iost, i_ioend, i_alct
+
+!---------- initialize
+
+	  WRITE(c_name,*) trim(p_param%cmd%c_directory),p_control%tst%tst_char(1)
+	  c_name= adjustl(c_name)
+
+!---------- read current data from NetCDF file
+
+	  CALL read_netcdf_currents(c_name)
+
+!---------- initialize some values
+
+	  r_readlast= 0.0_GRID_SR
+	  i_timeinterval= 0_GRID_SI
+	  r_intervallen= 3600._GRID_SR
+
+	  RETURN
+ 2000	  FORMAT(a80)
+ 2010	  FORMAT(a32)
+	  END SUBROUTINE slm_windinit
+
+!*****************************************************************
+	  SUBROUTINE slm_windquit
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+!---------- deallocate wind data arrays
+
+	  DEALLOCATE(r_flowx, r_flowy)
+	  DEALLOCATE(r_lon, r_lat)
+
+	  RETURN
+	  END SUBROUTINE slm_windquit
+
+!*****************************************************************
+	  FUNCTION data_interpol(r_coord, i_tim) RESULT (r_inter)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_coord
+	  INTEGER (KIND = GRID_SI)                         :: i_tim
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_inter
+	  INTEGER (KIND = GRID_SI)                         :: i_lox, i_hix, i_loy, i_hiy, i_cnt
+	  REAL (KIND = GRID_SR)                            :: r_dx, r_dy, r_lx, r_hx, &
+	    r_ly, r_hy, r_l1, r_h1, r_l2, r_h2, r_dxi, r_dyi
+	  REAL (KIND = GRID_SR)                            :: r_scalx, r_scaly
+	  REAL (KIND = GRID_SR)                            :: r_deg
+	  REAL (KIND = GRID_SR), PARAMETER                 :: r_earth=4011436.8_GRID_SR ! earth circumference
+ 	
+!---------- initialize radians
+
+	  r_deg= 360._GRID_SR/r_earth
+
+!---------- find wind box corresponding to coordinate
+
+	  i_lox=1_GRID_SI
+	  i_hix=2_GRID_SI
+	  i_loy=1_GRID_SI
+	  i_hiy=2_GRID_SI
+
+	  determine_lon: DO i_cnt=1, i_lon-1
+	    IF(r_lon(i_cnt) .LT. r_coord(1)) THEN
+	      IF(r_lon(i_cnt +1) .GE. r_coord(1)) THEN
+	        i_lox= i_cnt
+	        i_hix= i_cnt+1
+	        exit determine_lon
+	      END IF
+	    END IF
+	  END DO determine_lon
+	  IF(r_lon(i_lon) .LT. r_coord(1)) THEN
+	    i_lox = i_lon-1
+	    i_hix = i_lon
+	  END IF
+
+	  determine_lat: DO i_cnt=1, i_lat-1
+	    IF(r_lat(i_cnt) .LT. r_coord(2)) THEN
+	      IF(r_lat(i_cnt +1) .GE. r_coord(2)) THEN
+	        i_loy= i_cnt
+	        i_hiy= i_cnt+1
+	        exit determine_lat
+	      END IF
+	    END IF
+	  END DO determine_lat
+	  IF(r_lat(i_lat) .LT. r_coord(2)) THEN
+	    i_loy = i_lat-1
+	    i_hiy = i_lat
+	  END IF
+	  
+
+!---------- calculate weights for bilinear interpolation
+
+	  r_dx= r_lon(i_hix)- r_lon(i_lox)
+	  r_dy= r_lat(i_hiy)- r_lat(i_loy)
+	  r_lx= r_coord(1) - r_lon(i_lox)
+	  r_ly= r_coord(2) - r_lat(i_loy)
+	  r_hx= r_lon(i_hix) - r_coord(1)
+	  r_hy= r_lat(i_hiy) - r_coord(2)
+	  r_scalx=r_deg
+	  r_scaly=r_deg*cos(r_coord(2))
+
+!---------- linear interpolation in x-direction
+
+	  IF(r_dx /= 0.0_GRID_SR) THEN
+	    r_dxi= 1._GRID_SR/r_dx
+	    r_l1= (r_hx* r_flowx(i_lox, i_loy, i_tim)+ &
+	           r_lx* r_flowx(i_hix, i_loy, i_tim))* r_dxi
+	    r_h1= (r_hx* r_flowx(i_lox, i_hiy, i_tim)+ &
+	           r_lx* r_flowx(i_hix, i_hiy, i_tim))* r_dxi
+	    r_l2= (r_hx* r_flowy(i_lox, i_loy, i_tim)+ &
+	           r_lx* r_flowy(i_hix, i_loy, i_tim))* r_dxi
+	    r_h2= (r_hx* r_flowy(i_lox, i_hiy, i_tim)+ &
+	           r_lx* r_flowy(i_hix, i_hiy, i_tim))* r_dxi
+	  ELSE
+	    r_l1= r_flowx(i_lox, i_loy, i_tim)
+	    r_h1= r_flowx(i_lox, i_hiy, i_tim)
+	    r_l2= r_flowy(i_lox, i_loy, i_tim)
+	    r_h2= r_flowy(i_lox, i_hiy, i_tim)
+	  END IF
+
+!---------- linear interpolation in y-direction
+
+	  IF(r_dy /= 0.0_GRID_SR) THEN
+	    r_dyi= 1._GRID_SR/r_dy
+	    r_inter(1)= (r_hy* r_l1+ r_ly* r_h1)* r_dyi* r_scalx
+	    r_inter(2)= (r_hy* r_l2+ r_ly* r_h2)* r_dyi* r_scaly
+	  ELSE
+	    r_inter(1)= r_l1* r_scalx
+	    r_inter(2)= r_l2* r_scaly
+	  END IF
+
+	  RETURN
+	  END FUNCTION data_interpol
+
+!*****************************************************************
+	END MODULE ADV_wind
diff --git a/flash2d/src/options/FLASH_parameters.SW.f90 b/flash2d/src/options/FLASH_parameters.SW.f90
new file mode 100644
index 0000000..fb41820
--- /dev/null
+++ b/flash2d/src/options/FLASH_parameters.SW.f90
@@ -0,0 +1,117 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	FLASH_parameters
+! FUNCTION:
+!	defines global control structure
+! CONTAINS:
+!
+! PUBLIC:
+!	all
+! COMMENTS:
+!
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	12/2000
+!
+!*****************************************************************
+	MODULE FLASH_parameters
+
+    USE GRID_api
+	IMPLICIT NONE
+	INTEGER, PARAMETER :: io_fillen=128
+	INTEGER, PARAMETER :: i_redirout=8
+	INTEGER, PARAMETER :: i_redirlog=7
+    INTEGER, PARAMETER :: i_comparlen=14 
+
+!----additional grid variables
+
+    INTEGER    (KIND = GRID_SI)  :: GRID_hu, GRID_hv, GRID_h
+
+!---------- structure for the command line
+
+	TYPE cmdline_param
+      SEQUENCE
+      CHARACTER (len=io_fillen) :: c_infile       ! input file name
+      CHARACTER (len=io_fillen) :: c_directory    ! input file name
+	  LOGICAL                   :: l_output       ! redirect std output
+	  LOGICAL                   :: l_logging      ! enable logging (verbose)
+	END TYPE cmdline_param
+
+!---------- structure for the i/o behaviour
+
+	TYPE io_param
+	  SEQUENCE
+      LOGICAL                   :: l_diagnostics  ! switch on diagnostics
+      LOGICAL                   :: l_vtu          ! switch on vtu output
+      LOGICAL                   :: l_netcdf       ! switch on NetCDF output
+      INTEGER                   :: i_plotoffset   ! timesteps between plots
+      INTEGER                   :: i_saveoffset   ! timesteps between savesets
+      INTEGER                   :: i_savelast     ! indicator for last step saving
+      CHARACTER (len=io_fillen) :: c_domainfile   ! file with definitions for domain
+      CHARACTER (len=io_fillen) :: c_triangfile   ! file with initial triangulation
+	END TYPE io_param
+
+!---------- structure for global physical and steering parameters
+
+    TYPE num_param
+      SEQUENCE
+      REAL               :: r_deltatime     ! timestep length [s]
+      REAL               :: r_reftolerance  ! tolerance for refinement
+      REAL               :: r_crstolerance  ! tolerance for coarsening
+      REAL               :: r_refwatermark  ! watermark for refinement
+      REAL               :: r_crswatermark  ! watermark for coarsening
+      REAL               :: r_starttime     ! first time (overwrites i_frsttimestep)
+      REAL               :: r_finaltime     ! last time (overwrites i_lasttimestep)
+      INTEGER            :: i_experiment    ! current experiment identification
+      INTEGER            :: i_crslevel      ! coarsest requested level
+      INTEGER            :: i_reflevel      ! finest requested level
+      INTEGER            :: i_frsttimestep  ! first timestep of experiment
+      INTEGER            :: i_lasttimestep  ! last timestep of experiment
+      INTEGER            :: i_adviterations ! iterations in trajectory estimation
+    END TYPE num_param
+
+!---------- structure for global physical and steering parameters
+
+    TYPE test_param
+      INTEGER                                             :: i_lognum
+      INTEGER                                             :: i_intnum
+      INTEGER                                             :: i_realnum
+      INTEGER                                             :: i_charnum
+      INTEGER, DIMENSION(:), POINTER                      :: i_intsizes
+      INTEGER, DIMENSION(:), POINTER                      :: i_realsizes
+      CHARACTER (len=i_comparlen), DIMENSION(:), POINTER  :: c_logkeywds
+      CHARACTER (len=i_comparlen), DIMENSION(:), POINTER  :: c_intkeywds
+      CHARACTER (len=i_comparlen), DIMENSION(:), POINTER  :: c_realkeywds
+      CHARACTER (len=i_comparlen), DIMENSION(:), POINTER  :: c_charkeywds
+      LOGICAL, DIMENSION(:), POINTER                      :: tst_log
+      CHARACTER (len=io_fillen), DIMENSION(:), POINTER    :: tst_char
+      INTEGER, DIMENSION(:,:), POINTER                    :: tst_int
+      REAL, DIMENSION(:,:), POINTER                       :: tst_real
+    END TYPE test_param
+
+!---------- global control structure
+
+	TYPE control_struct
+	  TYPE (num_param)          :: num
+	  TYPE (cmdline_param)      :: cmd
+	  TYPE (io_param)           :: io
+	  TYPE (test_param)         :: tst
+	END TYPE control_struct
+	TYPE (control_struct)       :: p_contr
+
+!---------- structure for runtime information
+
+	TYPE rt_info
+	  REAL               :: r_modeltime
+	  INTEGER            :: i_step
+	  INTEGER            :: i_adapit
+	  LOGICAL            :: l_saved
+	  LOGICAL            :: l_ploted
+	END TYPE rt_info
+	TYPE (rt_info)       :: p_timestepinfo
+
+	END MODULE FLASH_parameters
diff --git a/flash2d/src/options/IO_vtuplot.SW.F90 b/flash2d/src/options/IO_vtuplot.SW.F90
new file mode 100644
index 0000000..4162203
--- /dev/null
+++ b/flash2d/src/options/IO_vtuplot.SW.F90
@@ -0,0 +1,177 @@
+!*****************************************************************
+!
+!> @file IO_vtuplot.F90
+!> @brief includes module IO_vtuplot
+!
+!*****************************************************************
+!
+! VERSION(S):
+!  1. original version                        j. behrens    04/2000
+!  2. amatos-1.0 and 2D compliant             j. behrens    11/2000
+!  3. adapted to flash2d                      j. behrens    12/2014
+!
+!*****************************************************************
+! MODULE DESCRIPTION:
+!> prints data in VTU compatible file format
+!
+MODULE IO_vtuplot
+  USE FLASH_parameters
+  USE MISC_outputdata
+  USE GRID_api
+  USE IO_vtu
+  PRIVATE
+  INTEGER, SAVE :: i_timecounter= 0
+  PUBLIC :: generate_vtu
+  CONTAINS
+
+!*****************************************************************
+! DESCRIPTION of [SUBROUTINE generate_vtu]:
+!> @brief creates output in GMV compatible file format
+!>
+!> @param[in]       p_handle      grid handle for the linked lists
+!> @param[in]       i_time        time step number
+!> @param[in]       i_newslevel   the time level
+!>
+!> @note ON OUTPUT: a number of VTU compatible ascii files for each plotted time step
+!
+  SUBROUTINE generate_vtu(p_handle, i_time, i_newslevel)
+
+    IMPLICIT NONE
+
+!---------- local declarations
+
+    TYPE (grid_handle), INTENT(in)                        :: p_handle
+    INTEGER (KIND = GRID_SI), OPTIONAL, INTENT(in)        :: i_time
+    INTEGER (KIND = GRID_SI), OPTIONAL, INTENT(in)        :: i_newslevel
+    INTEGER (KIND = GRID_SI)                              :: i_alct, i_nnum, i_tnum
+    INTEGER (KIND = GRID_SI)                              :: i_nwl, i_elen, i_tcnt
+    REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER    :: r_val
+    REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER    :: r_velo
+    REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER    :: r_moment
+    REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER    :: r_sta, r_lvl
+    INTEGER (KIND = GRID_SI), DIMENSION(:), ALLOCATABLE   :: i_ids, i_sta
+    CHARACTER (len=32)                                    :: c_mfile
+    CHARACTER (len=26)                                    :: c_tmp
+    LOGICAL                                               :: l_news
+    INTEGER, PARAMETER                                    :: i_vallen=8
+    INTEGER, DIMENSION(i_vallen)                          :: i_valind
+
+    TYPE(t_vtu_data), DIMENSION(2)                        :: celldata
+    TYPE(t_vtu_data), DIMENSION(6)                        :: nodedata
+    
+!---------- file handling (open)
+
+    IF(present(i_time)) THEN
+      i_tcnt= i_time
+      i_timecounter= i_timecounter+1
+    ELSE
+      i_tcnt= i_timecounter
+      i_timecounter= i_timecounter+1
+    END IF
+    write(c_tmp,*) trim(GRID_parameters%program_name(1:20))
+    write(c_mfile,10101) trim(c_tmp), '_', i_tcnt
+    c_tmp = adjustl(c_mfile)
+    write(c_mfile,*) TRIM(c_tmp), '.vtu'
+    c_mfile= adjustl(c_mfile)
+
+!---------- handle news level
+
+    IF(present(i_newslevel)) THEN
+      l_news=.TRUE.
+      i_nwl= i_newslevel
+    ELSE
+      l_news=.FALSE.
+    END IF
+
+!---------- the nodes
+
+    i_nnum = p_handle%i_nnumber
+
+!---------- extract nodal grid data and nodal values
+
+	ALLOCATE(r_val(i_vallen, i_nnum), stat=i_alct)
+	IF(i_alct /= 0) THEN
+	  CALL grid_error(c_error='[generate_vtu]: could not allocate values array')
+	END IF
+	i_valind= (/GRID_ucomp, GRID_vcomp, GRID_hu, GRID_hv, GRID_h, GRID_phi, GRID_zeta, GRID_tracer/)
+	CALL grid_getinfo(p_handle, r_nodevalues= r_val, i_arraypoint=i_valind)
+
+!---------- assign nodal values, but before allocate aux. arrays
+
+    ALLOCATE(r_velo(GRID_dimension,i_nnum), r_moment(GRID_dimension,i_nnum), stat=i_alct)
+	IF(i_alct /= 0) THEN
+	  CALL grid_error(c_error='[generate_vtu]: could not allocate aux. velo arrays')
+	END IF
+
+!---------- generate 2D velocity field
+
+    r_velo(1:2,:)= r_val(1:2,:)
+
+    nodedata(1)%c_name = 'velocity'
+    nodedata(1)%i_size = 2
+    nodedata(1)%p_vdata => r_velo
+
+    r_moment(1:2,:)= r_val(3:4,:)
+
+    nodedata(2)%c_name = 'momentum'
+    nodedata(2)%i_size = 2
+    nodedata(2)%p_vdata => r_moment
+
+    nodedata(3)%c_name = 'height'
+    nodedata(3)%i_size = 1
+    nodedata(3)%p_vdata => r_val(5:5,:)
+
+    nodedata(4)%c_name = 'pot. height'
+    nodedata(4)%i_size = 1
+    nodedata(4)%p_vdata => r_val(6:6,:)
+
+    nodedata(5)%c_name = 'vorticity'
+    nodedata(5)%i_size = 1
+    nodedata(5)%p_vdata => r_val(7:7,:)
+
+    nodedata(6)%c_name = 'tracer'
+    nodedata(6)%i_size = 1
+    nodedata(6)%p_vdata => r_val(8:8,:)
+
+!---------- extract cells grid data
+
+	i_tnum= p_handle%i_enumfine
+	ALLOCATE(i_ids(i_tnum), i_sta(i_tnum), r_sta(1,i_tnum), r_lvl(1,i_tnum), stat=i_alct)
+	IF(i_alct /= 0) THEN
+	  CALL grid_error(c_error='[generate_vtu]: could not allocate cell value arrays')
+	END IF
+	IF(l_news) THEN
+	  CALL grid_getinfo(p_handle, i_newsdepth= i_nwl, i_elength= i_elen, &
+	    i_elementlevel= i_ids, i_elementstatus= i_sta)
+	  i_tnum= i_elen
+	ELSE
+	  CALL grid_getinfo(p_handle, i_elementlevel= i_ids, i_elementstatus= i_sta)
+	END IF
+
+    r_sta(1, :) = REAL(i_sta, GRID_SR)
+    r_lvl(1, :) = REAL(i_ids, GRID_SR)
+
+    ! Assign all values to driver
+    celldata(1)%c_name = 'status'
+    celldata(1)%i_size = 1
+    celldata(1)%p_vdata => r_sta
+
+    celldata(2)%c_name = 'level'
+    celldata(2)%i_size = 1
+    celldata(2)%p_vdata => r_lvl
+    
+    ! plot the vtu data
+    CALL plot_vtu(p_handle, c_mfile, i_nodedata = 6, p_nodedata = nodedata, &
+                  i_celldata = 2, p_celldata = celldata, i_zcoordinate = 4)
+
+    DEALLOCATE(i_ids, i_sta, r_sta, r_lvl, &
+               r_val, r_velo)
+
+    RETURN
+
+!---------- FORMAT
+ 10101    FORMAT(a19,a1,i6.6)
+
+  END SUBROUTINE generate_vtu
+
+END MODULE IO_vtuplot
diff --git a/flash2d/src/options/SLM_advanced.algae.f90 b/flash2d/src/options/SLM_advanced.algae.f90
new file mode 100644
index 0000000..4c4bfda
--- /dev/null
+++ b/flash2d/src/options/SLM_advanced.algae.f90
@@ -0,0 +1,551 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_advanced
+! FUNCTION:
+!	provide advanced semi-Lagrangian routines
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_step
+! FUNCTION:
+!	one step of the basic SLM algorithm
+! SYNTAX:
+!	CALL slm_step(int, real.arr, real.arr)
+! ON INPUT:
+!	...
+! ON OUTPUT:
+!	r_tracer: array with tracer values	real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_displace
+! FUNCTION:
+!	extrapolate the alpha, values for the displacements of the upstream
+!	points from the gridpoints
+! SYNTAX:
+!	CALL slm_displace(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_coord: real array of xy-coordinates		real
+! ON OUTPUT:
+!	r_alpha: displacement vectors to each point	real
+! CALLS:
+!	wind_field
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_update
+! FUNCTION:
+!	calculate the update to the velocity
+! SYNTAX:
+!	CALL slm_update(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_rside: array with right hand side values	real
+! ON OUTPUT:
+!	r_udate: array with new (updated) gid values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is trivial for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_upstream
+! FUNCTION:
+!	calculate right hand side of the equation (upstream values)
+! SYNTAX:
+!	CALL slm_upstream(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_alpha: displacement vectors to each point	real
+! ON OUTPUT:
+!	r_rside: array with right hand side values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is just interpolation for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	triang_area
+! FUNCTION:
+!	calculate triangle area given by three coordinates
+! SYNTAX:
+!
+! ON INPUT:
+!
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_displace, slm_update, slm_upstream
+! COMMENTS:
+!
+! USES:
+!	FLASH_parameters, GRID_api, ADV_wind, ADV_rhs
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	4/2002
+!	2. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_advanced
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE GRID_api
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_astep
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_astep(p_ghand, p_param, p_time, r_modtime, i_size, &
+	                       r_coord, r_tracer, i_newsdepth)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                         :: p_param
+	  TYPE (sw_info), INTENT(inout)                             :: p_time
+	  REAL (KIND = GRID_SR), INTENT(in)                                          :: r_modtime
+	  INTEGER, INTENT(in)                                       :: i_size
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size), INTENT(in)        :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(2,i_size), INTENT(out)                    :: r_tracer
+	  INTEGER, OPTIONAL, INTENT(in)                             :: i_newsdepth
+	  
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_newvl
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_alpha
+	  INTEGER                              :: i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER        :: r_dualcoordinates
+	  INTEGER, DIMENSION(:,:,:), POINTER   :: i_dualedges
+	  INTEGER                              :: i_dual
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_dualalpha
+
+!---------- check size!
+
+	  IF(i_size <= 0) THEN
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'INFO [slm_step]: Zero step size, returning to calling routine'
+	    RETURN
+	  END IF
+
+!---------- allocate auxiliary arrays
+
+	  allocate(r_newvl(2,i_size), r_alpha(GRID_dimension,i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(38)
+	  END IF not_alloc
+
+!---------- create dual mesh
+
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_createdual(p_ghand(i_timeplus), i_dual, i_dualedges, &
+	                         r_dualcoordinates, i_newsdepth= i_newsdepth, i_newlength=i_size)
+	    IF(i_alct /= i_size) CALL grid_error(c_error='[slm_step]: incompatible new lengths...')
+	  ELSE
+	    CALL grid_createdual(p_ghand(i_timeplus), i_dual, i_dualedges, &
+	                         r_dualcoordinates)
+	  END IF
+
+!---------- allocate array for dual displacements
+
+	  allocate(r_dualalpha(GRID_dimension,i_dual), stat=i_alct)
+	  not_allocdual: IF(i_alct /= 0) THEN
+	    CALL grid_error(40)
+	  END IF not_allocdual
+
+!-SLM--------- calculate trajectory pieces (displacements)
+
+	  CALL stop_watch('start',3,p_time)
+	  CALL slm_adisplace(p_param, i_size, r_coord, r_alpha, &
+	  		    i_dual, r_dualcoordinates, r_dualalpha, r_time=r_modtime)
+	  CALL stop_watch('stop ',3,p_time)
+
+!-SLM--------- calculate right hand side
+
+	  CALL stop_watch('start',4,p_time)
+	  CALL slm_aupstream(p_ghand, i_size, r_coord, r_alpha, &
+	  		    i_dual, r_dualcoordinates, r_dualalpha, &
+	  		    i_dualedges, r_newvl)
+	  CALL stop_watch('stop ',4,p_time)
+
+!-SLM--------- calculate new grid values
+
+	  CALL stop_watch('start',5,p_time)
+	  CALL slm_aupdate(p_param, i_size, r_coord, r_newvl, r_tracer, r_time=r_modtime)
+	  CALL stop_watch('stop ',5,p_time)
+
+!---------- destroy dual mesh
+
+	  CALL grid_destroydual(i_dual, i_dualedges, r_dualcoordinates)
+
+!-SLM--------- put alpha values to u and v field entries
+
+	  r_alpha= -r_alpha
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_newsdepth=i_newsdepth, i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  ELSE
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  END IF
+
+!-SLM--------- deallocate work arrays
+
+	  deallocate(r_dualalpha, r_alpha, r_newvl)
+
+	  RETURN
+	  END SUBROUTINE slm_astep
+
+!*****************************************************************
+	  SUBROUTINE slm_adisplace(p_param, i_arlen, r_coord, r_alpha, &
+	                          i_darlen, r_dcoord, r_dalpha, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                      :: p_param
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_alpha
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                           :: r_time
+	  INTEGER, INTENT(in)                                  :: i_darlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in)  :: r_dcoord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(out) :: r_dalpha
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_fac, r_caf, &
+	    r_axy, r_xyc
+	  REAL (KIND = GRID_SR)                                                 :: r_dt0, r_dt1, &
+	    r_dt2, r_tim
+	  INTEGER                                              :: i_cnt1, i_cnt2
+
+!---------- set constants
+
+	  r_dt0= p_param%num%r_deltatime
+	  r_dt1= 0.5_GRID_SR* p_param%num%r_deltatime
+	  r_dt2= 1.5_GRID_SR* p_param%num%r_deltatime
+	  r_fac= 0.5_GRID_SR
+	  r_caf= 2.0_GRID_SR
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- calculate in an iteration process the displacements
+
+	  unknown_loop: DO i_cnt1=1,i_arlen
+	    r_axy= 0.0_GRID_SR
+
+	    iter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_coord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO iter_loop
+
+	    r_alpha(:,i_cnt1)= r_axy
+	  END DO unknown_loop
+
+!---------- the same for the dual grid
+
+	  dual_loop: DO i_cnt1=1,i_darlen
+	    r_axy= 0.0_GRID_SR
+
+	    diter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_dcoord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO diter_loop
+
+	    r_dalpha(:,i_cnt1)= r_axy
+	  END DO dual_loop
+
+	  RETURN
+	  END SUBROUTINE slm_adisplace
+
+!*****************************************************************
+	  SUBROUTINE slm_aupdate(p_param, i_arlen, r_coord, r_rside, r_udate, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                   :: p_param
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(2,i_arlen), INTENT(in)                :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(2,i_arlen), INTENT(out)               :: r_udate
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                          :: r_time
+	  INTEGER                                             :: i_cnt
+	  REAL (KIND = GRID_SR)                                                :: r_dt, r_tim
+
+!---------- in the linear advection case and with f90 this is just
+
+!	  r_udate= r_rside
+
+!---------- including a non-zero right hand side, we have
+
+	  r_dt= p_param%num%r_deltatime
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+	  main_loop: DO i_cnt=1, i_arlen
+	    r_udate(:,i_cnt)= r_rside(:,i_cnt)+ &
+	        r_dt* slm_righthand(r_coord(:,i_cnt),r_rside(:,i_cnt))
+	  END DO main_loop
+
+	  RETURN
+	  END SUBROUTINE slm_aupdate
+
+!*****************************************************************
+	  SUBROUTINE slm_aupstream(p_mesh, i_arlen, r_coord, r_alpha, &
+	                          i_darlen, r_dcoord, r_dalpha, &
+	                          i_dedge, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  INTEGER, INTENT(in)                                          :: i_darlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in)         :: r_dcoord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in)         :: r_dalpha
+	  INTEGER, DIMENSION(2,GRID_patchelements,i_arlen), INTENT(in) :: i_dedge
+	  REAL (KIND = GRID_SR), DIMENSION(2,i_arlen), INTENT(out)             :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                     :: r_fac
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE                   :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE                     :: r_uparea, r_dwarea
+	  INTEGER                                             :: i_alct, i_cnt, j_cnt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                     :: r_1, r_2, r_3
+	  REAL (KIND = GRID_SR)                                                :: r_oarea, r_narea
+
+!---------- set factor (at which point of trajectory shall i interpolate)
+
+	  r_fac= 1.0_GRID_SR
+
+!---------- allocate auxilliary arrays
+
+	  allocate(r_aux(2,i_arlen), &
+	           r_uparea(i_arlen), r_dwarea(i_arlen), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(39)
+	  END IF not_alloc
+
+!---------- interpolation of node values
+
+	  CALL slm_ainterpolate(p_mesh, r_fac, i_arlen, r_coord, &
+	                        r_alpha, r_aux)
+
+!---------- loop over nodes
+
+	  node_loop: DO i_cnt= 1, i_arlen
+	    r_oarea= 0.
+	    r_narea= 0.
+	    ptch_loop: DO j_cnt= 1, GRID_patchelements
+	      IF(i_dedge(1,j_cnt,i_cnt) == 0) THEN
+	        EXIT ptch_loop
+	      ELSE
+
+!---------- the upstream dual element
+
+	        r_1= r_coord(:,i_cnt)- r_alpha(:,i_cnt)
+	        r_2= r_dcoord(:,i_dedge(1,j_cnt,i_cnt))- r_dalpha(:,i_dedge(1,j_cnt,i_cnt))
+	        r_3= r_dcoord(:,i_dedge(2,j_cnt,i_cnt))- r_dalpha(:,i_dedge(2,j_cnt,i_cnt))
+	        r_oarea= r_oarea+ triang_area(r_1, r_2, r_3)
+
+!---------- the downstream dual element
+
+	        r_1= r_coord(:,i_cnt)
+	        r_2= r_dcoord(:,i_dedge(1,j_cnt,i_cnt))
+	        r_3= r_dcoord(:,i_dedge(2,j_cnt,i_cnt))
+	        r_narea= r_narea+ triang_area(r_1, r_2, r_3)
+	      END IF
+	    END DO ptch_loop
+	    r_uparea(i_cnt)= r_oarea
+	    IF(r_narea /= 0._GRID_SR) THEN
+	      r_dwarea(i_cnt)= 1._GRID_SR/ r_narea
+	    ELSE
+	      r_dwarea(i_cnt)= 0._GRID_SR
+	    END IF
+	  END DO node_loop
+
+!---------- now calculate new values using a (nonexact) interpolation formula
+
+	  r_rside(1,:)= r_aux(1,:)* r_uparea* r_dwarea
+	  r_rside(2,:)= r_aux(2,:)* r_uparea* r_dwarea
+
+!---------- deallocate auxilliary arrays
+
+	  deallocate(r_aux, r_uparea, r_dwarea)
+
+	  RETURN
+	  END SUBROUTINE slm_aupstream
+!*****************************************************************
+	  SUBROUTINE slm_ainterpolate(p_mesh, r_fac, i_arlen, &
+	                             r_coord, r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in)         :: r_fac
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(2,i_arlen), INTENT(out)             :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE                   :: r_upstr
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_nodevalues)                    :: r_tval
+	  INTEGER, DIMENSION(GRID_elementnodes)               :: i_ttmp
+	  REAL (KIND = GRID_SR)                               :: r_eps, r_max, r_min
+	  REAL (KIND = GRID_SR), DIMENSION(2)                 :: r_tmp
+	  INTEGER                                             :: i_cnt, i_alct
+	  INTEGER, DIMENSION(2)                               :: i_val
+	  INTEGER                                             :: i_ind, i_tim, &
+	    j_cnt, i_out, i_stat, i_trc
+
+!---------- initialize constant
+
+	  i_val(1)= GRID_tracer
+	  i_val(2)= GRID_phi
+	  r_eps   = GRID_EPS
+	  i_tim   = p_mesh(i_time)%i_timetag
+
+!---------- allocate work array
+
+	  ALLOCATE(r_upstr(GRID_dimension,i_arlen), stat=i_alct)
+	  not_allocated: IF(i_alct /= 0) THEN
+	    CALL grid_error(60)
+	  END IF not_allocated
+
+!---------- calculate upstream coordinates
+
+	  dim_loop: DO i_cnt=1, GRID_dimension
+	    r_upstr(i_cnt,:) = r_coord(i_cnt,:)- r_fac(i_cnt)* r_alpha(i_cnt,:)
+	  END DO dim_loop
+
+!---------- loop over nodes: find element containing upstream point
+
+	  node_loop: DO i_cnt=1, i_arlen
+
+!---------- check if upstream value is outside of the domain
+
+	    i_out= grid_domaincheck(p_mesh(i_time), r_upstr(:,i_cnt))
+
+!---------- take the intersection of the trajectory with the boundary as new upstream point
+
+	    out_domain: IF(i_out /= 0) then
+	       r_upstr(:,i_cnt)= grid_boundintersect(p_mesh(i_time), &
+	                        r_coord(:,i_cnt), r_upstr(:,i_cnt), i_info=i_stat)
+               no_intersect: IF(i_stat /= 0) THEN
+                  r_rside(:,i_cnt)= 0.0
+                  CYCLE node_loop
+               END IF no_intersect
+	    END IF out_domain
+
+!---------- interpolate
+
+        tracer_loop: DO i_trc=1,2
+	        r_tmp(i_trc)= grid_coordvalue(p_mesh(i_time), r_upstr(:,i_cnt), &
+	           i_interpolorder=GRID_highorder, i_valpoint=i_val(i_trc), &
+                i_index=i_ind, i_domaincheck=0, l_relative=.FALSE., l_sfcorder=.FALSE.)
+
+
+	        index_valid: IF(i_ind > 0) THEN
+
+!---------- get nodes of element surrounding r_upstr
+
+	            CALL grid_getiteminfo(i_ind, 'elmt', i_arrlen=GRID_elementnodes, i_nodes=i_ttmp)
+
+!---------- get values at nodes of element surrounding r_upstr, and obtain min/max
+
+                    r_min= 0.0_GRID_SR; r_max= 0.0_GRID_SR
+                    elmt_loop: DO j_cnt=1,GRID_elementnodes
+                        CALL grid_getiteminfo(i_ttmp(j_cnt), 'node', i_arrlen=GRID_nodevalues, &
+                                        r_values= r_tval, i_time=i_tim)
+                        r_min= MIN(r_min, r_tval(i_val(i_trc)))
+                        r_max= MAX(r_max, r_tval(i_val(i_trc)))	      
+                    END DO elmt_loop
+
+!---------- clip value
+
+                    IF(r_tmp(i_trc) > r_max) THEN
+                         r_tmp(i_trc)= r_max
+                    ELSE IF(r_tmp(i_trc) < r_min) THEN
+                         r_tmp(i_trc)= r_min
+                    END IF
+	            END IF index_valid
+
+!---------- set interpolation value
+
+	        r_rside(i_trc,i_cnt)= r_tmp(i_trc)
+	 
+	        small_val: IF((abs(r_rside(i_trc,i_cnt)) < r_eps) .OR. (r_rside(i_trc,i_cnt) < 0.0_GRID_SR)) THEN
+               r_rside(i_trc,i_cnt)= 0.0_GRID_SR
+	        END IF small_val
+	        
+	    END DO tracer_loop
+
+	  END DO node_loop
+
+!---------- deallocate work array
+
+	  DEALLOCATE(r_upstr)
+
+	  RETURN
+	  END SUBROUTINE slm_ainterpolate
+
+!*****************************************************************
+	  FUNCTION triang_area(r_coord1, r_coord2, r_coord3) RESULT (r_area)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord1, r_coord2, r_coord3
+	  REAL (KIND = GRID_SR)                                        :: r_area
+	  REAL (KIND = GRID_SR)                                        :: r_c
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_a, r_b
+
+!---------- calculate vector components
+
+	  r_a= r_coord2- r_coord1
+	  r_b= r_coord3- r_coord1
+
+!---------- calculate components (a,b,c) of cross product vector
+
+	  r_c= (r_a(1)* r_b(2)- r_a(2)* r_b(1))
+
+!---------- calculate area
+
+	  r_area= abs(r_c)* 0.5_GRID_SR
+
+	  RETURN
+	  END FUNCTION triang_area
+
+	END MODULE SLM_advanced
diff --git a/flash2d/src/options/SLM_advanced.analytic.f90 b/flash2d/src/options/SLM_advanced.analytic.f90
new file mode 100644
index 0000000..9d8fcb2
--- /dev/null
+++ b/flash2d/src/options/SLM_advanced.analytic.f90
@@ -0,0 +1,341 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_advanced
+! FUNCTION:
+!	provide advanced semi-Lagrangian routines
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_step
+! FUNCTION:
+!	one step of the basic SLM algorithm
+! SYNTAX:
+!	CALL slm_step(int, real.arr, real.arr)
+! ON INPUT:
+!	...
+! ON OUTPUT:
+!	r_tracer: array with tracer values	real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_displace
+! FUNCTION:
+!	extrapolate the alpha, values for the displacements of the upstream
+!	points from the gridpoints
+! SYNTAX:
+!	CALL slm_displace(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_coord: real array of xy-coordinates		real
+! ON OUTPUT:
+!	r_alpha: displacement vectors to each point	real
+! CALLS:
+!	wind_field
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_update
+! FUNCTION:
+!	calculate the update to the velocity
+! SYNTAX:
+!	CALL slm_update(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_rside: array with right hand side values	real
+! ON OUTPUT:
+!	r_udate: array with new (updated) gid values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is trivial for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_upstream
+! FUNCTION:
+!	calculate right hand side of the equation (upstream values)
+! SYNTAX:
+!	CALL slm_upstream(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_alpha: displacement vectors to each point	real
+! ON OUTPUT:
+!	r_rside: array with right hand side values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is just interpolation for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_interpolate
+! FUNCTION:
+!	do the interpolation
+! SYNTAX:
+!	CALL slm_interpolate(grid, int, real, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	p_ogrid: grid handle to old grid (with data)	TYPE (grid_handle)
+!	r_fac:   factor at which point to interpolate	REAL
+!	i_arlen: array length for the following arrays	INTEGER
+!	r_coord: coordinate array (new grid)		REAL
+!	r_alpha: displacement array (corr. to r_coord)	REAL
+!	r_value: values on the old grid (array)		REAL
+! ON OUTPUT:
+!	r_rside: right hand side (interpolated)		REAL
+! CALLS:
+!
+! COMMENTS:
+!	this one is plain bi-cubic spline interpolation
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_astep
+! COMMENTS:
+!
+! USES:
+!	FLASH_parameters, GRID_api, ADV_wind, ADV_rhs
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	4/2002
+!	2. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_advanced
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE GRID_api
+	  USE ADV_wind
+	  USE ADV_rhs
+	  USE SLM_initial
+	  PRIVATE
+	  PUBLIC  :: slm_astep
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_astep(p_ghand, p_param, p_time, r_modtime, i_size, &
+	                       r_coord, r_tracer, i_newsdepth)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                         :: p_param
+	  TYPE (sw_info), INTENT(inout)                             :: p_time
+	  REAL (KIND = GRID_SR), INTENT(in)                         :: r_modtime
+	  INTEGER, INTENT(in)                                       :: i_size
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_size), INTENT(out)     :: r_tracer
+	  INTEGER, OPTIONAL, INTENT(in)                             :: i_newsdepth
+	  
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE          :: r_newvl
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_alpha
+	  INTEGER                                                   :: i_alct
+
+!---------- check size!
+
+	  IF(i_size <= 0) THEN
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'INFO [slm_astep]: Zero step size, returning to calling routine'
+	    RETURN
+	  END IF
+
+!---------- allocate auxiliary arrays
+
+	  allocate(r_newvl(i_size), r_alpha(GRID_dimension,i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(38)
+	  END IF not_alloc
+
+!-SLM--------- calculate trajectory pieces (displacements)
+
+	  CALL stop_watch('start',3,p_time)
+	  CALL slm_adisplace(p_param, i_size, r_coord, r_alpha, r_time=r_modtime)
+	  CALL stop_watch('stop ',3,p_time)
+
+!-SLM--------- calculate right hand side
+
+	  CALL stop_watch('start',4,p_time)
+	  CALL slm_aupstream(p_ghand, i_size, r_coord, r_alpha, r_newvl)
+	  CALL stop_watch('stop ',4,p_time)
+
+!-SLM--------- calculate new grid values
+
+	  CALL stop_watch('start',5,p_time)
+	  CALL slm_aupdate(p_param, i_size, r_coord, r_newvl, r_tracer, r_time=r_modtime)
+	  CALL stop_watch('stop ',5,p_time)
+
+!-SLM--------- put alpha values to u and v field entries
+
+	  r_alpha= -r_alpha
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_newsdepth=i_newsdepth, i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  ELSE
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  END IF
+
+!-SLM--------- deallocate work arrays
+
+	  deallocate(r_alpha, r_newvl)
+
+	  RETURN
+	  END SUBROUTINE slm_astep
+
+!*****************************************************************
+	  SUBROUTINE slm_adisplace(p_param, i_arlen, r_coord, r_alpha, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                      :: p_param
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_alpha
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                           :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_fac, r_caf, &
+	    r_axy, r_xyc
+	  REAL (KIND = GRID_SR)                                                 :: r_dt0, r_dt1, &
+	    r_dt2, r_tim
+	  INTEGER                                              :: i_cnt1, i_cnt2
+          
+!---------- set constants
+
+	  r_dt0= p_param%num%r_deltatime
+	  r_dt1= 0.5* p_param%num%r_deltatime
+	  r_dt2= 1.5* p_param%num%r_deltatime
+	  r_fac= 0.5
+	  r_caf= 2.0
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0
+	  END IF
+
+!---------- calculate in an iteration process the displacements
+
+	  unknown_loop: DO i_cnt1=1,i_arlen
+	    r_axy= 0.0
+
+	    iter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_coord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO iter_loop
+
+	    r_alpha(:,i_cnt1)= r_axy
+	  END DO unknown_loop
+
+	  RETURN
+	  END SUBROUTINE slm_adisplace
+
+!*****************************************************************
+	  SUBROUTINE slm_aupdate(p_param, i_arlen, r_coord, r_rside, r_udate, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                   :: p_param
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_udate
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                          :: r_time
+	  INTEGER                                             :: i_cnt
+	  REAL (KIND = GRID_SR)                                                :: r_dt, r_tim
+
+!---------- in the linear advection case and with f90 this is just
+
+!	  r_udate= r_rside
+
+!---------- including a non-zero right hand side, we have
+
+	  r_dt= p_param%num%r_deltatime
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0
+	  END IF
+
+	  main_loop: DO i_cnt=1, i_arlen
+	    r_udate(i_cnt)= r_rside(i_cnt)+ r_dt* slm_righthand(r_coord(:,i_cnt))
+	  END DO main_loop
+
+	  RETURN
+	  END SUBROUTINE slm_aupdate
+
+!*****************************************************************
+	  SUBROUTINE slm_aupstream(p_mesh, i_arlen, r_coord, &
+	                          r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                     :: r_fac
+
+!---------- set factor (at which point of trajectory shall i interpolate)
+
+	  r_fac= 1.0
+
+!---------- in the linear advection case this is just interpolation
+
+	  CALL slm_ainterpolate(p_mesh, r_fac, i_arlen, r_coord, &
+	                       r_alpha, r_rside)
+
+	  RETURN
+	  END SUBROUTINE slm_aupstream
+!*****************************************************************
+	  SUBROUTINE slm_ainterpolate(p_mesh, r_fac, i_arlen, &
+	                             r_coord, r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)                        :: p_mesh
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in)         :: r_fac
+	  INTEGER, INTENT(in)                                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  
+	  REAL (KIND = GRID_SR)                                                :: r_ts, r_deltatime
+	  INTEGER                                             		       :: i_step
+
+!---------- initialize constant
+
+	  i_step = p_timestepinfo%i_step
+	  r_deltatime = p_contr%num%r_deltatime
+	  r_ts  =  REAL(i_step)*r_deltatime
+
+!---------- get analytic solution
+
+	  CALL slm_analyticsolution(p_mesh(i_timeplus), r_ts, i_arlen, r_rside)
+
+
+	  RETURN
+	  END SUBROUTINE slm_ainterpolate
+
+
+	END MODULE SLM_advanced
diff --git a/flash2d/src/options/SLM_advanced.cellint.algae.f90 b/flash2d/src/options/SLM_advanced.cellint.algae.f90
new file mode 100644
index 0000000..97a51cf
--- /dev/null
+++ b/flash2d/src/options/SLM_advanced.cellint.algae.f90
@@ -0,0 +1,489 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_advanced
+! FUNCTION:
+!	provide advanced semi-Lagrangian routines
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_step
+! FUNCTION:
+!	one step of the basic SLM algorithm
+! SYNTAX:
+!	CALL slm_step(int, real.arr, real.arr)
+! ON INPUT:
+!	...
+! ON OUTPUT:
+!	r_tracer: array with tracer values	real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_displace
+! FUNCTION:
+!	extrapolate the alpha, values for the displacements of the upstream
+!	points from the gridpoints
+! SYNTAX:
+!	CALL slm_displace(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_coord: real array of xy-coordinates		real
+! ON OUTPUT:
+!	r_alpha: displacement vectors to each point	real
+! CALLS:
+!	wind_field
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_update
+! FUNCTION:
+!	calculate the update to the velocity
+! SYNTAX:
+!	CALL slm_update(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_rside: array with right hand side values	real
+! ON OUTPUT:
+!	r_udate: array with new (updated) gid values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is trivial for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_upstream
+! FUNCTION:
+!	calculate right hand side of the equation (upstream values)
+! SYNTAX:
+!	CALL slm_upstream(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_alpha: displacement vectors to each point	real
+! ON OUTPUT:
+!	r_rside: array with right hand side values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is just interpolation for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	triang_ar
+! FUNCTION:
+!	calculate triangle area given by three coordinates
+! SYNTAX:
+!
+! ON INPUT:
+!
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_displace, slm_update, slm_upstream
+! COMMENTS:
+!
+! USES:
+!	FLASH_parameters, GRID_api, SLM_interpolation, ADV_wind, ADV_rhs
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	4/2002
+!	2. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_advanced
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE GRID_api
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_astep
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_astep(p_ghand, p_param, p_time, r_modtime, i_size, &
+	                       r_coord, r_tracer, i_newsdepth)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                         :: p_param
+	  TYPE (sw_info), INTENT(inout)                             :: p_time
+	  REAL (KIND = GRID_SR), INTENT(in)                         :: r_modtime
+	  INTEGER, INTENT(in)                                       :: i_size
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(2,i_size), INTENT(out)             :: r_tracer
+	  INTEGER, OPTIONAL, INTENT(in)                             :: i_newsdepth
+	  
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_newvl
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_alpha
+	  INTEGER                                                   :: i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER            :: r_dualcoordinates
+	  INTEGER, DIMENSION(:,:,:), POINTER                        :: i_dualedges
+	  INTEGER                                                   :: i_dual
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_dualalpha
+
+!---------- check size!
+
+	  IF(i_size <= 0) THEN
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'INFO [slm_astep]: Zero step size, returning to calling routine'
+	    RETURN
+	  END IF
+
+!---------- check newslevel (Not supported for Cell-integrated scheme due to dual)
+
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_error(c_error='[slm_step]: no newslevel in Cell-Integrated Scheme supported')
+	  END IF
+	  IF(i_size /= p_ghand(i_timeplus)%i_nnumber) THEN
+	    CALL grid_error(c_error='[slm_step]: incompatible array size')
+	  END IF	  
+
+!---------- allocate auxiliary arrays
+
+	  allocate(r_newvl(2,i_size), r_alpha(GRID_dimension,i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(38)
+	  END IF not_alloc
+
+!---------- create dual mesh
+
+	  CALL grid_createdual_donald(p_ghand(i_timeplus), i_dual, i_dualedges, &
+	                       r_dualcoordinates)
+
+!---------- allocate array for dual displacements
+
+	  allocate(r_dualalpha(GRID_dimension,i_dual), stat=i_alct)
+	  not_allocdual: IF(i_alct /= 0) THEN
+	    CALL grid_error(40)
+	  END IF not_allocdual
+
+!-SLM--------- calculate trajectory pieces (displacements)
+
+	  CALL stop_watch('start',3,p_time)
+	  CALL slm_adisplace(p_param, i_size, r_coord, r_alpha, &
+	  		    i_dual, r_dualcoordinates, r_dualalpha, r_time=r_modtime)
+	  CALL stop_watch('stop ',3,p_time)
+
+!-SLM--------- calculate right hand side
+
+	  CALL stop_watch('start',4,p_time)
+	  CALL slm_aupstream(p_ghand, i_size, r_coord, r_alpha, &
+	  		    i_dual, r_dualcoordinates, r_dualalpha, &
+	  		    i_dualedges, r_newvl)
+	  CALL stop_watch('stop ',4,p_time)
+
+!-SLM--------- calculate new grid values
+
+	  CALL stop_watch('start',5,p_time)
+	  CALL slm_aupdate(p_param, i_size, r_coord, r_newvl, r_tracer, r_time=r_modtime)
+	  CALL stop_watch('stop ',5,p_time)
+
+!---------- destroy dual mesh
+
+	  CALL grid_destroydual(i_dual, i_dualedges, r_dualcoordinates)
+
+!-SLM--------- put alpha values to u and v field entries
+
+	  r_alpha= -r_alpha
+	  CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	                    i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+
+!-SLM--------- deallocate work arrays
+
+	  deallocate(r_dualalpha, r_alpha, r_newvl)
+
+	  RETURN
+	  END SUBROUTINE slm_astep
+
+!*****************************************************************
+	  SUBROUTINE slm_adisplace(p_param, i_arlen, r_coord, r_alpha, &
+	                          i_darlen, r_dcoord, r_dalpha, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                      :: p_param
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_alpha
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                           :: r_time
+	  INTEGER, INTENT(in)                                  :: i_darlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in)  :: r_dcoord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(out) :: r_dalpha
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_fac, r_caf, &
+	    r_axy, r_xyc
+	  REAL (KIND = GRID_SR)                                                 :: r_dt0, r_dt1, &
+	    r_dt2, r_tim
+	  INTEGER                                              :: i_cnt1, i_cnt2
+
+!---------- set constants
+
+	  r_dt0= p_param%num%r_deltatime
+	  r_dt1= 0.5_GRID_SR* p_param%num%r_deltatime
+	  r_dt2= 1.5_GRID_SR* p_param%num%r_deltatime
+	  r_fac= 0.5_GRID_SR
+	  r_caf= 2.0_GRID_SR
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- calculate in an iteration process the displacements
+
+	  unknown_loop: DO i_cnt1=1,i_arlen
+	    r_axy= 0.0_GRID_SR
+
+	    iter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_coord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO iter_loop
+
+	    r_alpha(:,i_cnt1)= r_axy
+	  END DO unknown_loop
+
+!---------- the same for the dual grid
+
+	  dual_loop: DO i_cnt1=1,i_darlen
+	    r_axy= 0.0_GRID_SR
+
+	    diter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_dcoord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO diter_loop
+
+	    r_dalpha(:,i_cnt1)= r_axy
+	  END DO dual_loop
+
+	  RETURN
+	  END SUBROUTINE slm_adisplace
+
+!*****************************************************************
+	  SUBROUTINE slm_aupdate(p_param, i_arlen, r_coord, r_rside, r_udate, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                   :: p_param
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(2,i_arlen), INTENT(in)                :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(2,i_arlen), INTENT(out)               :: r_udate
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                          :: r_time
+	  INTEGER                                             :: i_cnt
+	  REAL (KIND = GRID_SR)                                                :: r_dt, r_tim
+
+!---------- in the linear advection case and with f90 this is just
+
+!	  r_udate= r_rside
+
+!---------- including a non-zero right hand side, we have
+
+	  r_dt= p_param%num%r_deltatime
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+	  main_loop: DO i_cnt=1, i_arlen
+	    r_udate(:,i_cnt)= r_rside(:,i_cnt)+ &
+	        r_dt* slm_righthand(r_coord(:,i_cnt),r_rside(:,i_cnt))
+	  END DO main_loop
+
+	  RETURN
+	  END SUBROUTINE slm_aupdate
+
+!*****************************************************************
+	  SUBROUTINE slm_aupstream(p_mesh, i_arlen, r_coord, r_alpha, &
+	                          i_darlen, r_dcoord, r_dalpha, &
+	                          i_dedge, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)                         :: p_mesh
+	  INTEGER, INTENT(in)                                                   :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_alpha
+	  INTEGER, INTENT(in)                                                   :: i_darlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in) :: r_dcoord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in) :: r_dalpha
+	  INTEGER, DIMENSION(2,2*GRID_patchelements,i_arlen), INTENT(in)        :: i_dedge
+	  REAL (KIND = GRID_SR), DIMENSION(2,i_arlen), INTENT(out)                :: r_rside
+	  INTEGER                                                               :: i_alct, i_cnt, &
+	    	j_cnt, i_tnc, i_oarlen, i_fill, i_len, i_tmp, i_trc
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_1, r_2, r_3
+	  REAL (KIND = GRID_SR)                                                 :: r_oarea, r_narea
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE                    :: r_aux1
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE                    :: r_aux2
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE                      :: r_conc
+	  REAL (KIND = GRID_SR)                                                 :: r_onethird= 1._GRID_SR/3._GRID_SR
+	  INTEGER, DIMENSION(:,:), ALLOCATABLE                                  :: i_enods
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,GRID_elementnodes)    :: r_vertx
+	  REAL (KIND = GRID_SR)                                                 :: r_part, r_isarea
+	  REAL (KIND = GRID_SR), EXTERNAL                                       :: triatria_isectar
+	  REAL (KIND = GRID_SR)                                                 :: r_xmax, r_ymax, r_xmin, r_ymin
+	  REAL (KIND = GRID_SR)                                                 :: r_maxx, r_maxy, r_minx, r_miny
+	  REAL (KIND = GRID_SR), DIMENSION(2)                                   :: r_mass
+	  INTEGER, DIMENSION(:), POINTER                                        :: i_triang
+	  REAL (KIND = GRID_SR), DIMENSION(:), POINTER                          :: r_area
+	  INTEGER, DIMENSION(2)                                                 :: i_valind
+	  
+	  	  
+!---------- allocate auxilliary arrays
+
+	  i_oarlen= p_mesh(i_time)%i_enumfine
+	  allocate(r_aux1(GRID_dimension,i_oarlen), &
+               r_aux2(2,i_oarlen), i_enods(GRID_elementnodes,i_oarlen), &
+               r_conc(2,i_oarlen), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(39)
+	  END IF not_alloc
+	  i_valind= (/ GRID_tracer, GRID_phi /)
+
+!---------- get info from old grid to calculate mass elements
+
+	  CALL grid_getinfo(p_mesh(i_time), r_nodecoordinates= r_aux1, &
+	                    i_elementnodes=i_enods, i_arraypoint=i_valind, &
+	                    r_nodevalues= r_aux2, l_finelevel=.TRUE.)
+
+!---------- calculate concentration in elements
+
+	  conc_calc: DO i_cnt=1,i_oarlen
+	    r_conc(:,i_cnt)= r_onethird* (r_aux2(:,i_enods(1,i_cnt))+ &
+	                   r_aux2(:,i_enods(2,i_cnt))+ r_aux2(:,i_enods(3,i_cnt)))				   		
+	  END DO conc_calc
+	  
+!---------- now the main loop over the nodes of the new grid
+
+	  node_loop: DO i_cnt=1,i_arlen
+
+	    r_mass= 0.0
+	    r_narea= 0.0
+	    r_vertx= 0.0
+
+!---------- the upstream dual element's center node
+
+	    r_vertx(1,1)= r_coord(1,i_cnt)- r_alpha(1,i_cnt)
+	    r_vertx(2,1)= r_coord(2,i_cnt)- r_alpha(2,i_cnt)
+
+!---------- now calculate the interference of the voronoi thing with elements from old mesh
+
+	    dual_ptch_loop: DO i_tnc= 1, 2*GRID_patchelements
+	    IF(i_dedge(1,i_tnc,i_cnt) == 0) THEN
+	      EXIT dual_ptch_loop
+	    ELSE
+
+!---------- nullify pointer arrays
+
+	      NULLIFY(i_triang,r_area)
+
+!---------- the upstream dual element's outer nodes
+
+	      r_vertx(1,2)= r_dcoord(1,i_dedge(1,i_tnc,i_cnt))- r_dalpha(1,i_dedge(1,i_tnc,i_cnt))
+	      r_vertx(2,2)= r_dcoord(2,i_dedge(1,i_tnc,i_cnt))- r_dalpha(2,i_dedge(1,i_tnc,i_cnt))
+	      r_vertx(1,3)= r_dcoord(1,i_dedge(2,i_tnc,i_cnt))- r_dalpha(1,i_dedge(2,i_tnc,i_cnt))
+	      r_vertx(2,3)= r_dcoord(2,i_dedge(2,i_tnc,i_cnt))- r_dalpha(2,i_dedge(2,i_tnc,i_cnt))
+
+!---------- calculate downstream area around primal node
+
+	      r_narea= r_narea+ triang_area(r_coord(:,i_cnt), &
+	                                    r_dcoord(:,i_dedge(1,i_tnc,i_cnt)), &
+	                                    r_dcoord(:,i_dedge(2,i_tnc,i_cnt)))
+
+!---------- calculate intersection
+
+	      CALL grid_polygridintersect(p_mesh(i_time),GRID_elementnodes,r_vertx,&
+	                                  i_len, i_triang, r_area, .TRUE.)
+									  
+	      DO j_cnt=1,i_len
+	        i_tmp= i_triang(j_cnt)
+	        r_mass(:)= r_mass(:) + r_area(j_cnt)* r_conc(:,i_tmp)
+	      END DO
+
+	      IF(ASSOCIATED(i_triang)) THEN
+	        DEALLOCATE(i_triang)
+	        NULLIFY(i_triang)
+	      END IF
+	      IF(ASSOCIATED(r_area)) THEN
+	        DEALLOCATE(r_area)
+	        NULLIFY(r_area)
+	      END IF
+	    END IF
+	    END DO dual_ptch_loop
+
+!---------- now calculate concentration
+        
+	    r_rside(:,i_cnt)= r_mass(:)/r_narea
+
+!---------- check for negative or too small values and clip them
+
+        tracer_loop: DO i_trc=1,2
+	        small_val: IF((abs(r_rside(i_trc,i_cnt)) < GRID_EPS) .OR. (r_rside(i_trc,i_cnt) < 0.0_GRID_SR)) THEN
+               r_rside(i_trc,i_cnt)= 0.0_GRID_SR
+	        END IF small_val
+        END DO tracer_loop
+		
+	  END DO node_loop
+
+!---------- deallocate auxilliary arrays
+
+	  deallocate(r_aux1, r_aux2, r_conc, i_enods)
+
+	  RETURN
+	  END SUBROUTINE slm_aupstream
+
+!*****************************************************************
+	  FUNCTION triang_area(r_coord1, r_coord2, r_coord3) RESULT (r_area)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord1, r_coord2, r_coord3
+	  REAL (KIND = GRID_SR)                                        :: r_area
+	  REAL (KIND = GRID_SR)                                        :: r_c
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_a, r_b
+
+!---------- calculate vector components
+
+	  r_a= r_coord2- r_coord1
+	  r_b= r_coord3- r_coord1
+
+!---------- calculate components (a,b,c) of cross product vector
+
+	  r_c= (r_a(1)* r_b(2)- r_a(2)* r_b(1))
+
+!---------- calculate area
+
+	  r_area= abs(r_c)* 0.5_GRID_SR
+
+	  RETURN
+	  END FUNCTION triang_area
+
+	END MODULE SLM_advanced
diff --git a/flash2d/src/options/SLM_advanced.cellint.f90 b/flash2d/src/options/SLM_advanced.cellint.f90
new file mode 100644
index 0000000..2087da3
--- /dev/null
+++ b/flash2d/src/options/SLM_advanced.cellint.f90
@@ -0,0 +1,480 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_advanced
+! FUNCTION:
+!	provide advanced semi-Lagrangian routines
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_step
+! FUNCTION:
+!	one step of the basic SLM algorithm
+! SYNTAX:
+!	CALL slm_step(int, real.arr, real.arr)
+! ON INPUT:
+!	...
+! ON OUTPUT:
+!	r_tracer: array with tracer values	real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_displace
+! FUNCTION:
+!	extrapolate the alpha, values for the displacements of the upstream
+!	points from the gridpoints
+! SYNTAX:
+!	CALL slm_displace(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_coord: real array of xy-coordinates		real
+! ON OUTPUT:
+!	r_alpha: displacement vectors to each point	real
+! CALLS:
+!	wind_field
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_update
+! FUNCTION:
+!	calculate the update to the velocity
+! SYNTAX:
+!	CALL slm_update(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_rside: array with right hand side values	real
+! ON OUTPUT:
+!	r_udate: array with new (updated) gid values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is trivial for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_upstream
+! FUNCTION:
+!	calculate right hand side of the equation (upstream values)
+! SYNTAX:
+!	CALL slm_upstream(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_alpha: displacement vectors to each point	real
+! ON OUTPUT:
+!	r_rside: array with right hand side values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is just interpolation for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	triang_ar
+! FUNCTION:
+!	calculate triangle area given by three coordinates
+! SYNTAX:
+!
+! ON INPUT:
+!
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_displace, slm_update, slm_upstream
+! COMMENTS:
+!
+! USES:
+!	FLASH_parameters, GRID_api, SLM_interpolation, ADV_wind, ADV_rhs
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	4/2002
+!	2. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_advanced
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE GRID_api
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_astep
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_astep(p_ghand, p_param, p_time, r_modtime, i_size, &
+	                       r_coord, r_tracer, i_newsdepth)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                         :: p_param
+	  TYPE (sw_info), INTENT(inout)                             :: p_time
+	  REAL (KIND = GRID_SR), INTENT(in)                         :: r_modtime
+	  INTEGER, INTENT(in)                                       :: i_size
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_size), INTENT(out)     :: r_tracer
+	  INTEGER, OPTIONAL, INTENT(in)                             :: i_newsdepth
+	  
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE          :: r_newvl
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_alpha
+	  INTEGER                                                   :: i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER            :: r_dualcoordinates
+	  INTEGER, DIMENSION(:,:,:), POINTER                        :: i_dualedges
+	  INTEGER                                                   :: i_dual
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_dualalpha
+
+!---------- check size!
+
+	  IF(i_size <= 0) THEN
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'INFO [slm_astep]: Zero step size, returning to calling routine'
+	    RETURN
+	  END IF
+
+!---------- check newslevel (Not supported for Cell-integrated scheme due to dual)
+
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_error(c_error='[slm_astep]: no newslevel in Cell-Integrated Scheme supported')
+	  END IF
+	  IF(i_size /= p_ghand(i_timeplus)%i_nnumber) THEN
+	    CALL grid_error(c_error='[slm_astep]: incompatible array size')
+	  END IF	  
+
+!---------- allocate auxiliary arrays
+
+	  allocate(r_newvl(i_size), r_alpha(GRID_dimension,i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(38)
+	  END IF not_alloc
+
+!---------- create dual mesh
+
+	  CALL grid_createdual_donald(p_ghand(i_timeplus), i_dual, i_dualedges, &
+	                       r_dualcoordinates)
+
+!---------- allocate array for dual displacements
+
+	  allocate(r_dualalpha(GRID_dimension,i_dual), stat=i_alct)
+	  not_allocdual: IF(i_alct /= 0) THEN
+	    CALL grid_error(40)
+	  END IF not_allocdual
+
+!-SLM--------- calculate trajectory pieces (displacements)
+
+	  CALL stop_watch('start',3,p_time)
+	  CALL slm_adisplace(p_param, i_size, r_coord, r_alpha, &
+	  		    i_dual, r_dualcoordinates, r_dualalpha, r_time=r_modtime)
+	  CALL stop_watch('stop ',3,p_time)
+
+!-SLM--------- calculate right hand side
+
+	  CALL stop_watch('start',4,p_time)
+	  CALL slm_aupstream(p_ghand, i_size, r_coord, r_alpha, &
+	  		    i_dual, r_dualcoordinates, r_dualalpha, &
+	  		    i_dualedges, r_newvl)
+	  CALL stop_watch('stop ',4,p_time)
+
+!-SLM--------- calculate new grid values
+
+	  CALL stop_watch('start',5,p_time)
+	  CALL slm_aupdate(p_param, i_size, r_coord, r_newvl, r_tracer, r_time=r_modtime)
+	  CALL stop_watch('stop ',5,p_time)
+
+!---------- destroy dual mesh
+
+	  CALL grid_destroydual(i_dual, i_dualedges, r_dualcoordinates)
+
+!-SLM--------- put alpha values to u and v field entries
+
+	  r_alpha= -r_alpha
+	  CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	                    i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+
+!-SLM--------- deallocate work arrays
+
+	  deallocate(r_dualalpha, r_alpha, r_newvl)
+
+	  RETURN
+	  END SUBROUTINE slm_astep
+
+!*****************************************************************
+	  SUBROUTINE slm_adisplace(p_param, i_arlen, r_coord, r_alpha, &
+	                          i_darlen, r_dcoord, r_dalpha, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                      :: p_param
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_alpha
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                           :: r_time
+	  INTEGER, INTENT(in)                                  :: i_darlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in)  :: r_dcoord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(out) :: r_dalpha
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_fac, r_caf, &
+	    r_axy, r_xyc
+	  REAL (KIND = GRID_SR)                                                 :: r_dt0, r_dt1, &
+	    r_dt2, r_tim
+	  INTEGER                                              :: i_cnt1, i_cnt2
+
+!---------- set constants
+
+	  r_dt0= p_param%num%r_deltatime
+	  r_dt1= 0.5_GRID_SR* p_param%num%r_deltatime
+	  r_dt2= 1.5_GRID_SR* p_param%num%r_deltatime
+	  r_fac= 0.5_GRID_SR
+	  r_caf= 2.0_GRID_SR
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- calculate in an iteration process the displacements
+
+	  unknown_loop: DO i_cnt1=1,i_arlen
+	    r_axy= 0.0_GRID_SR
+
+	    iter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_coord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO iter_loop
+
+	    r_alpha(:,i_cnt1)= r_axy
+	  END DO unknown_loop
+
+!---------- the same for the dual grid
+
+	  dual_loop: DO i_cnt1=1,i_darlen
+	    r_axy= 0.0_GRID_SR
+
+	    diter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_dcoord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO diter_loop
+
+	    r_dalpha(:,i_cnt1)= r_axy
+	  END DO dual_loop
+
+	  RETURN
+	  END SUBROUTINE slm_adisplace
+
+!*****************************************************************
+	  SUBROUTINE slm_aupdate(p_param, i_arlen, r_coord, r_rside, r_udate, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                   :: p_param
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_udate
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                          :: r_time
+	  INTEGER                                             :: i_cnt
+	  REAL (KIND = GRID_SR)                                                :: r_dt, r_tim
+
+!---------- in the linear advection case and with f90 this is just
+
+!	  r_udate= r_rside
+
+!---------- including a non-zero right hand side, we have
+
+	  r_dt= p_param%num%r_deltatime
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+	  main_loop: DO i_cnt=1, i_arlen
+	    r_udate(i_cnt)= r_rside(i_cnt)+ r_dt* slm_righthand(r_coord(:,i_cnt))
+	  END DO main_loop
+
+	  RETURN
+	  END SUBROUTINE slm_aupdate
+
+!*****************************************************************
+	  SUBROUTINE slm_aupstream(p_mesh, i_arlen, r_coord, r_alpha, &
+	                          i_darlen, r_dcoord, r_dalpha, &
+	                          i_dedge, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)                         :: p_mesh
+	  INTEGER, INTENT(in)                                                   :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_alpha
+	  INTEGER, INTENT(in)                                                   :: i_darlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in) :: r_dcoord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in) :: r_dalpha
+	  INTEGER, DIMENSION(2,2*GRID_patchelements,i_arlen), INTENT(in)        :: i_dedge
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)                :: r_rside
+	  INTEGER                                                               :: i_alct, i_cnt, &
+	    	j_cnt, i_tnc, i_oarlen, i_fill, i_len, i_tmp
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_1, r_2, r_3
+	  REAL (KIND = GRID_SR)                                                 :: r_oarea, r_narea
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE                    :: r_aux1
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE                    :: r_aux2
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE                      :: r_conc
+	  REAL (KIND = GRID_SR)                                                 :: r_onethird= 1._GRID_SR/3._GRID_SR
+	  INTEGER, DIMENSION(:,:), ALLOCATABLE                                  :: i_enods
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,GRID_elementnodes)    :: r_vertx
+	  REAL (KIND = GRID_SR)                                                 :: r_part, r_isarea
+	  REAL (KIND = GRID_SR), EXTERNAL                                       :: triatria_isectar
+	  REAL (KIND = GRID_SR)                                                 :: r_xmax, r_ymax, r_xmin, r_ymin
+	  REAL (KIND = GRID_SR)                                                 :: r_maxx, r_maxy, r_minx, r_miny
+	  REAL (KIND = GRID_SR)                                                 :: r_mass
+	  INTEGER, DIMENSION(:), POINTER                                        :: i_triang
+	  REAL (KIND = GRID_SR), DIMENSION(:), POINTER                          :: r_area
+	  INTEGER, DIMENSION(1)                                                 :: i_valind
+	  
+	  	  
+!---------- allocate auxilliary arrays
+
+	  i_oarlen= p_mesh(i_time)%i_enumfine
+	  allocate(r_aux1(GRID_dimension,i_oarlen), &
+               r_aux2(1,i_oarlen), i_enods(GRID_elementnodes,i_oarlen), &
+               r_conc(i_oarlen), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(39)
+	  END IF not_alloc
+	  i_valind= (/ GRID_tracer /)
+
+!---------- get info from old grid to calculate mass elements
+
+	  CALL grid_getinfo(p_mesh(i_time), r_nodecoordinates= r_aux1, &
+	                    i_elementnodes=i_enods, i_arraypoint=i_valind, &
+	                    r_nodevalues= r_aux2, l_finelevel=.TRUE.)
+
+!---------- calculate concentration in elements
+
+	  conc_calc: DO i_cnt=1,i_oarlen
+	    r_conc(i_cnt)= r_onethird* (r_aux2(1,i_enods(1,i_cnt))+ &
+	                   r_aux2(1,i_enods(2,i_cnt))+ r_aux2(1,i_enods(3,i_cnt)))				   		
+	  END DO conc_calc
+	  
+!---------- now the main loop over the nodes of the new grid
+
+	  node_loop: DO i_cnt=1,i_arlen
+
+	    r_mass= 0.0
+	    r_narea= 0.0
+	    r_vertx= 0.0
+
+!---------- the upstream dual element's center node
+
+	    r_vertx(1,1)= r_coord(1,i_cnt)- r_alpha(1,i_cnt)
+	    r_vertx(2,1)= r_coord(2,i_cnt)- r_alpha(2,i_cnt)
+
+!---------- now calculate the interference of the voronoi thing with elements from old mesh
+
+	    dual_ptch_loop: DO i_tnc= 1, 2*GRID_patchelements
+	    IF(i_dedge(1,i_tnc,i_cnt) == 0) THEN
+	      EXIT dual_ptch_loop
+	    ELSE
+
+!---------- nullify pointer arrays
+
+	      NULLIFY(i_triang,r_area)
+
+!---------- the upstream dual element's outer nodes
+
+	      r_vertx(1,2)= r_dcoord(1,i_dedge(1,i_tnc,i_cnt))- r_dalpha(1,i_dedge(1,i_tnc,i_cnt))
+	      r_vertx(2,2)= r_dcoord(2,i_dedge(1,i_tnc,i_cnt))- r_dalpha(2,i_dedge(1,i_tnc,i_cnt))
+	      r_vertx(1,3)= r_dcoord(1,i_dedge(2,i_tnc,i_cnt))- r_dalpha(1,i_dedge(2,i_tnc,i_cnt))
+	      r_vertx(2,3)= r_dcoord(2,i_dedge(2,i_tnc,i_cnt))- r_dalpha(2,i_dedge(2,i_tnc,i_cnt))
+
+!---------- calculate downstream area around primal node
+
+	      r_narea= r_narea+ triang_area(r_coord(:,i_cnt), &
+	                                    r_dcoord(:,i_dedge(1,i_tnc,i_cnt)), &
+	                                    r_dcoord(:,i_dedge(2,i_tnc,i_cnt)))
+
+!---------- calculate intersection
+
+	      CALL grid_polygridintersect(p_mesh(i_time),GRID_elementnodes,r_vertx,&
+	                                  i_len, i_triang, r_area, .TRUE.)
+									  
+	      DO j_cnt=1,i_len
+	        i_tmp= i_triang(j_cnt)
+	        r_mass= r_mass + r_area(j_cnt)* r_conc(i_tmp)
+	      END DO
+
+	      IF(ASSOCIATED(i_triang)) THEN
+	        DEALLOCATE(i_triang)
+	        NULLIFY(i_triang)
+	      END IF
+	      IF(ASSOCIATED(r_area)) THEN
+	        DEALLOCATE(r_area)
+	        NULLIFY(r_area)
+	      END IF
+	    END IF
+	    END DO dual_ptch_loop
+
+!---------- now calculate concentration
+        
+	    r_rside(i_cnt)= r_mass/r_narea
+		
+	  END DO node_loop
+
+!---------- deallocate auxilliary arrays
+
+	  deallocate(r_aux1, r_aux2, r_conc, i_enods)
+
+	  RETURN
+	  END SUBROUTINE slm_aupstream
+
+!*****************************************************************
+	  FUNCTION triang_area(r_coord1, r_coord2, r_coord3) RESULT (r_area)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord1, r_coord2, r_coord3
+	  REAL (KIND = GRID_SR)                                        :: r_area
+	  REAL (KIND = GRID_SR)                                        :: r_c
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_a, r_b
+
+!---------- calculate vector components
+
+	  r_a= r_coord2- r_coord1
+	  r_b= r_coord3- r_coord1
+
+!---------- calculate components (a,b,c) of cross product vector
+
+	  r_c= (r_a(1)* r_b(2)- r_a(2)* r_b(1))
+
+!---------- calculate area
+
+	  r_area= abs(r_c)* 0.5_GRID_SR
+
+	  RETURN
+	  END FUNCTION triang_area
+
+	END MODULE SLM_advanced
diff --git a/flash2d/src/options/SLM_advanced.clip.f90 b/flash2d/src/options/SLM_advanced.clip.f90
new file mode 100644
index 0000000..d88b9fc
--- /dev/null
+++ b/flash2d/src/options/SLM_advanced.clip.f90
@@ -0,0 +1,416 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_advanced
+! FUNCTION:
+!	provide advanced semi-Lagrangian routines
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_step
+! FUNCTION:
+!	one step of the basic SLM algorithm
+! SYNTAX:
+!	CALL slm_step(int, real.arr, real.arr)
+! ON INPUT:
+!	...
+! ON OUTPUT:
+!	r_tracer: array with tracer values	real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_displace
+! FUNCTION:
+!	extrapolate the alpha, values for the displacements of the upstream
+!	points from the gridpoints
+! SYNTAX:
+!	CALL slm_displace(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_coord: real array of xy-coordinates		real
+! ON OUTPUT:
+!	r_alpha: displacement vectors to each point	real
+! CALLS:
+!	wind_field
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_update
+! FUNCTION:
+!	calculate the update to the velocity
+! SYNTAX:
+!	CALL slm_update(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_rside: array with right hand side values	real
+! ON OUTPUT:
+!	r_udate: array with new (updated) gid values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is trivial for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_upstream
+! FUNCTION:
+!	calculate right hand side of the equation (upstream values)
+! SYNTAX:
+!	CALL slm_upstream(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_alpha: displacement vectors to each point	real
+! ON OUTPUT:
+!	r_rside: array with right hand side values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is just interpolation for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_interpolate
+! FUNCTION:
+!	do the interpolation
+! SYNTAX:
+!	CALL slm_interpolate(grid, int, real, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	p_ogrid: grid handle to old grid (with data)	TYPE (grid_handle)
+!	r_fac:   factor at which point to interpolate	REAL
+!	i_arlen: array length for the following arrays	INTEGER
+!	r_coord: coordinate array (new grid)		REAL
+!	r_alpha: displacement array (corr. to r_coord)	REAL
+!	r_value: values on the old grid (array)		REAL
+! ON OUTPUT:
+!	r_rside: right hand side (interpolated)		REAL
+! CALLS:
+!
+! COMMENTS:
+!	this one is plain bi-cubic spline interpolation
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_astep
+! COMMENTS:
+!
+! USES:
+!	FLASH_parameters, GRID_api, ADV_wind, ADV_rhs
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	4/2002
+!	2. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_advanced
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE GRID_api
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_astep
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_astep(p_ghand, p_param, p_time, r_modtime, i_size, &
+	                       r_coord, r_tracer, i_newsdepth)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                         :: p_param
+	  TYPE (sw_info), INTENT(inout)                             :: p_time
+	  REAL (KIND = GRID_SR), INTENT(in)                                          :: r_modtime
+	  INTEGER, INTENT(in)                                       :: i_size
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size), INTENT(in)        :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_size), INTENT(out)                      :: r_tracer
+	  INTEGER, OPTIONAL, INTENT(in)                             :: i_newsdepth
+	  
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE      :: r_newvl
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_alpha
+	  INTEGER                              :: i_alct
+
+!---------- check size!
+
+	  IF(i_size <= 0) THEN
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'INFO [slm_astep]: Zero step size, returning to calling routine'
+	    RETURN
+	  END IF
+
+!---------- allocate auxiliary arrays
+
+	  allocate(r_newvl(i_size), r_alpha(GRID_dimension,i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(38)
+	  END IF not_alloc
+
+!-SLM--------- calculate trajectory pieces (displacements)
+
+	  CALL stop_watch('start',3,p_time)
+	  CALL slm_adisplace(p_param, i_size, r_coord, r_alpha, r_time=r_modtime)
+	  CALL stop_watch('stop ',3,p_time)
+
+!-SLM--------- calculate right hand side
+
+	  CALL stop_watch('start',4,p_time)
+	  CALL slm_aupstream(p_ghand, i_size, r_coord, r_alpha, r_newvl)
+	  CALL stop_watch('stop ',4,p_time)
+
+!-SLM--------- calculate new grid values
+
+	  CALL stop_watch('start',5,p_time)
+	  CALL slm_aupdate(p_param, i_size, r_coord, r_newvl, r_tracer, r_time=r_modtime)
+	  CALL stop_watch('stop ',5,p_time)
+
+!-SLM--------- put alpha values to u and v field entries
+
+	  r_alpha= -r_alpha
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_newsdepth=i_newsdepth, i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  ELSE
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  END IF
+
+!-SLM--------- deallocate work arrays
+
+	  deallocate(r_alpha, r_newvl)
+
+	  RETURN
+	  END SUBROUTINE slm_astep
+
+!*****************************************************************
+	  SUBROUTINE slm_adisplace(p_param, i_arlen, r_coord, r_alpha, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                      :: p_param
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_alpha
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                           :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_fac, r_caf, &
+	    r_axy, r_xyc
+	  REAL (KIND = GRID_SR)                                                 :: r_dt0, r_dt1, &
+	    r_dt2, r_tim
+	  INTEGER                                              :: i_cnt1, i_cnt2
+          
+!---------- set constants
+
+	  r_dt0= p_param%num%r_deltatime
+	  r_dt1= 0.5_GRID_SR* p_param%num%r_deltatime
+	  r_dt2= 1.5_GRID_SR* p_param%num%r_deltatime
+	  r_fac= 0.5_GRID_SR
+	  r_caf= 2.0_GRID_SR
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- calculate in an iteration process the displacements
+
+	  unknown_loop: DO i_cnt1=1,i_arlen
+	    r_axy= 0.0_GRID_SR
+
+	    iter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_coord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO iter_loop
+
+	    r_alpha(:,i_cnt1)= r_axy
+	  END DO unknown_loop
+
+	  RETURN
+	  END SUBROUTINE slm_adisplace
+
+!*****************************************************************
+	  SUBROUTINE slm_aupdate(p_param, i_arlen, r_coord, r_rside, r_udate, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                   :: p_param
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_udate
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                          :: r_time
+	  INTEGER                                             :: i_cnt
+	  REAL (KIND = GRID_SR)                                                :: r_dt, r_tim
+
+!---------- in the linear advection case and with f90 this is just
+
+!	  r_udate= r_rside
+
+!---------- including a non-zero right hand side, we have
+
+	  r_dt= p_param%num%r_deltatime
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+	  main_loop: DO i_cnt=1, i_arlen
+	    r_udate(i_cnt)= r_rside(i_cnt)+ r_dt* slm_righthand(r_coord(:,i_cnt))
+	  END DO main_loop
+
+	  RETURN
+	  END SUBROUTINE slm_aupdate
+
+!*****************************************************************
+	  SUBROUTINE slm_aupstream(p_mesh, i_arlen, r_coord, &
+	                          r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                     :: r_fac
+
+!---------- set factor (at which point of trajectory shall i interpolate)
+
+	  r_fac= 1.0_GRID_SR
+
+!---------- in the linear advection case this is just interpolation
+
+	  CALL slm_ainterpolate(p_mesh, r_fac, i_arlen, r_coord, &
+	                       r_alpha, r_rside)
+
+	  RETURN
+	  END SUBROUTINE slm_aupstream
+!*****************************************************************
+	  SUBROUTINE slm_ainterpolate(p_mesh, r_fac, i_arlen, &
+	                             r_coord, r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in)         :: r_fac
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE                   :: r_upstr
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_nodevalues)                    :: r_tval
+	  INTEGER, DIMENSION(GRID_elementnodes)               :: i_ttmp
+	  REAL (KIND = GRID_SR)                                                :: r_eps, r_max, r_min, r_tmp
+	  INTEGER                                             :: i_cnt, i_alct, i_val
+	  INTEGER                                             :: i_ind, i_tim, &
+	    j_cnt, i_out, i_stat
+
+!---------- initialize constant
+
+	  i_val= GRID_tracer
+	  r_eps= GRID_EPS
+	  i_tim= p_mesh(i_time)%i_timetag
+
+!---------- allocate work array
+
+	  ALLOCATE(r_upstr(GRID_dimension,i_arlen), stat=i_alct)
+	  not_allocated: IF(i_alct /= 0) THEN
+	    CALL grid_error(60)
+	  END IF not_allocated
+
+!---------- calculate upstream coordinates
+
+	  dim_loop: DO i_cnt=1, GRID_dimension
+	    r_upstr(i_cnt,:) = r_coord(i_cnt,:)- r_fac(i_cnt)* r_alpha(i_cnt,:)
+	  END DO dim_loop
+
+!---------- loop over nodes: find element containing upstream point
+
+	  node_loop: DO i_cnt=1, i_arlen
+
+!---------- check if upstream value is outside of the domain
+
+	    i_out= grid_domaincheck(p_mesh(i_time), r_upstr(:,i_cnt))
+
+!---------- take the intersection of the trajectory with the boundary as new upstream point
+
+	    out_domain: IF(i_out /= 0) then
+	       r_upstr(:,i_cnt)= grid_boundintersect(p_mesh(i_time), &
+	                        r_coord(:,i_cnt), r_upstr(:,i_cnt), i_info=i_stat)
+               no_intersect: IF(i_stat /= 0) THEN
+                  r_rside(i_cnt)= 0.0_GRID_SR
+                  CYCLE node_loop
+               END IF no_intersect
+	    END IF out_domain
+
+!---------- interpolate
+
+	    r_tmp= grid_coordvalue(p_mesh(i_time), r_upstr(:,i_cnt), &
+	           i_interpolorder=GRID_highorder, i_valpoint=i_val, &
+                   i_index=i_ind, i_domaincheck=0, l_relative=.FALSE., l_sfcorder=.FALSE.)
+
+
+	    index_valid: IF(i_ind > 0) THEN
+
+!---------- get nodes of element surrounding r_upstr
+
+	       CALL grid_getiteminfo(i_ind, 'elmt', i_arrlen=GRID_elementnodes, i_nodes=i_ttmp)
+
+!---------- get values at nodes of element surrounding r_upstr, and obtain min/max
+
+               r_min= 0.0; r_max= 0.0_GRID_SR
+               elmt_loop: DO j_cnt=1,GRID_elementnodes
+                  CALL grid_getiteminfo(i_ttmp(j_cnt), 'node', i_arrlen=GRID_nodevalues, &
+                                        r_values= r_tval, i_time=i_tim)
+                  r_min= MIN(r_min, r_tval(i_val))
+                  r_max= MAX(r_max, r_tval(i_val))	      
+               END DO elmt_loop
+
+!---------- clip value
+
+               IF(r_tmp > r_max) THEN
+                  r_tmp= r_max
+               ELSE IF(r_tmp < r_min) THEN
+                  r_tmp= r_min
+               END IF
+	    END IF index_valid
+
+!---------- set interpolation value
+
+	    r_rside(i_cnt)= r_tmp
+	 
+	    small_val: IF(abs(r_rside(i_cnt)) < r_eps) THEN
+               r_rside(i_cnt)= 0.0_GRID_SR
+	    END IF small_val
+
+	  END DO node_loop
+
+!---------- deallocate work array
+
+	  DEALLOCATE(r_upstr)
+
+	  RETURN
+	  END SUBROUTINE slm_ainterpolate
+
+	END MODULE SLM_advanced
diff --git a/flash2d/src/options/SLM_advanced.cons.f90 b/flash2d/src/options/SLM_advanced.cons.f90
new file mode 100644
index 0000000..705edfc
--- /dev/null
+++ b/flash2d/src/options/SLM_advanced.cons.f90
@@ -0,0 +1,592 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_advanced
+! FUNCTION:
+!	provide advanced semi-Lagrangian routines
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_step
+! FUNCTION:
+!	one step of the basic SLM algorithm
+! SYNTAX:
+!	CALL slm_step(int, real.arr, real.arr)
+! ON INPUT:
+!	...
+! ON OUTPUT:
+!	r_tracer: array with tracer values	real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_displace
+! FUNCTION:
+!	extrapolate the alpha, values for the displacements of the upstream
+!	points from the gridpoints
+! SYNTAX:
+!	CALL slm_displace(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_coord: real array of xy-coordinates		real
+! ON OUTPUT:
+!	r_alpha: displacement vectors to each point	real
+! CALLS:
+!	wind_field
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_update
+! FUNCTION:
+!	calculate the update to the velocity
+! SYNTAX:
+!	CALL slm_update(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_rside: array with right hand side values	real
+! ON OUTPUT:
+!	r_udate: array with new (updated) gid values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is trivial for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_upstream
+! FUNCTION:
+!	calculate right hand side of the equation (upstream values)
+! SYNTAX:
+!	CALL slm_upstream(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_alpha: displacement vectors to each point	real
+! ON OUTPUT:
+!	r_rside: array with right hand side values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is just interpolation for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_interpolate
+! FUNCTION:
+!	do the interpolation
+! SYNTAX:
+!	CALL slm_interpolate(grid, int, real, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	p_ogrid: grid handle to old grid (with data)	TYPE (grid_handle)
+!	r_fac:   factor at which point to interpolate	REAL
+!	i_arlen: array length for the following arrays	INTEGER
+!	r_coord: coordinate array (new grid)		REAL
+!	r_alpha: displacement array (corr. to r_coord)	REAL
+!	r_value: values on the old grid (array)		REAL
+! ON OUTPUT:
+!	r_rside: right hand side (interpolated)		REAL
+! CALLS:
+!
+! COMMENTS:
+!	this one is plain bi-cubic spline interpolation
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_astep
+! COMMENTS:
+!
+! USES:
+!	FLASH_parameters, GRID_api, ADV_wind, ADV_rhs
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	4/2002
+!	2. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_advanced
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE GRID_api
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  REAL    :: r_conservation
+	  LOGICAL :: l_interpolinitialized=.FALSE.
+	  PUBLIC  :: slm_astep
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_astep(p_ghand, p_param, p_time, r_modtime, i_size, &
+	                       r_coord, r_tracer, i_newsdepth)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                         :: p_param
+	  TYPE (sw_info), INTENT(inout)                             :: p_time
+	  REAL (KIND = GRID_SR), INTENT(in)                         :: r_modtime
+	  INTEGER, INTENT(in)                                       :: i_size
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_size), INTENT(out)     :: r_tracer
+	  INTEGER, OPTIONAL, INTENT(in)                             :: i_newsdepth
+	  
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE          :: r_newvl
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_alpha
+	  INTEGER                                                   :: i_alct
+
+!---------- check size!
+
+	  IF(i_size <= 0) THEN
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'INFO [slm_astep]: Zero step size, returning to calling routine'
+	    RETURN
+	  END IF
+
+!---------- Initialize, if not yet done
+
+	  IF(.NOT. l_interpolinitialized) THEN
+	    CALL slm_interpolinit(p_ghand(i_time))
+	    l_interpolinitialized= .TRUE.
+	  END IF
+
+!---------- allocate auxiliary arrays
+
+	  allocate(r_newvl(i_size), r_alpha(GRID_dimension,i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(38)
+	  END IF not_alloc
+
+!-SLM--------- calculate trajectory pieces (displacements)
+
+	  CALL stop_watch('start',3,p_time)
+	  CALL slm_adisplace(p_param, i_size, r_coord, r_alpha, r_time=r_modtime)
+	  CALL stop_watch('stop ',3,p_time)
+
+!-SLM--------- calculate right hand side
+
+	  CALL stop_watch('start',4,p_time)
+	  CALL slm_aupstream(p_ghand, i_size, r_coord, r_alpha, r_newvl)
+	  CALL stop_watch('stop ',4,p_time)
+
+!-SLM--------- calculate new grid values
+
+	  CALL stop_watch('start',5,p_time)
+	  CALL slm_aupdate(p_param, i_size, r_coord, r_newvl, r_tracer, r_time=r_modtime)
+	  CALL stop_watch('stop ',5,p_time)
+
+!-SLM--------- put alpha values to u and v field entries
+
+	  r_alpha= -r_alpha
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_newsdepth=i_newsdepth, i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  ELSE
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  END IF
+
+!-SLM--------- deallocate work arrays
+
+	  deallocate(r_alpha, r_newvl)
+
+	  RETURN
+	  END SUBROUTINE slm_astep
+
+!*****************************************************************
+	  SUBROUTINE slm_adisplace(p_param, i_arlen, r_coord, r_alpha, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                      :: p_param
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_alpha
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                           :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_fac, r_caf, &
+	    r_axy, r_xyc
+	  REAL (KIND = GRID_SR)                                                 :: r_dt0, r_dt1, &
+	    r_dt2, r_tim
+	  INTEGER                                              :: i_cnt1, i_cnt2
+          
+!---------- set constants
+
+	  r_dt0= p_param%num%r_deltatime
+	  r_dt1= 0.5_GRID_SR* p_param%num%r_deltatime
+	  r_dt2= 1.5_GRID_SR* p_param%num%r_deltatime
+	  r_fac= 0.5_GRID_SR
+	  r_caf= 2.0_GRID_SR
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- calculate in an iteration process the displacements
+
+	  unknown_loop: DO i_cnt1=1,i_arlen
+	    r_axy= 0.0_GRID_SR
+
+	    iter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_coord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO iter_loop
+
+	    r_alpha(:,i_cnt1)= r_axy
+	  END DO unknown_loop
+
+	  RETURN
+	  END SUBROUTINE slm_adisplace
+
+!*****************************************************************
+	  SUBROUTINE slm_aupdate(p_param, i_arlen, r_coord, r_rside, r_udate, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                   :: p_param
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_udate
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                          :: r_time
+	  INTEGER                                             :: i_cnt
+	  REAL (KIND = GRID_SR)                                                :: r_dt, r_tim
+
+!---------- in the linear advection case and with f90 this is just
+
+!	  r_udate= r_rside
+
+!---------- including a non-zero right hand side, we have
+
+	  r_dt= p_param%num%r_deltatime
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+	  main_loop: DO i_cnt=1, i_arlen
+	    r_udate(i_cnt)= r_rside(i_cnt)+ r_dt* slm_righthand(r_coord(:,i_cnt))
+	  END DO main_loop
+
+	  RETURN
+	  END SUBROUTINE slm_aupdate
+
+!*****************************************************************
+	  SUBROUTINE slm_aupstream(p_mesh, i_arlen, r_coord, &
+	                          r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                     :: r_fac
+
+!---------- set factor (at which point of trajectory shall i interpolate)
+
+	  r_fac= 1.0_GRID_SR
+
+!---------- in the linear advection case this is just interpolation
+
+	  CALL slm_ainterpolate(p_mesh, r_fac, i_arlen, r_coord, &
+	                       r_alpha, r_rside)
+
+	  RETURN
+	  END SUBROUTINE slm_aupstream
+!*****************************************************************
+	  SUBROUTINE slm_ainterpolate(p_mesh, r_fac, i_arlen, &
+	                             r_coord, r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in)         :: r_fac
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE                   :: r_upstr
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_nodevalues)                    :: r_tval
+	  INTEGER, DIMENSION(GRID_elementnodes)               :: i_ttmp
+	  REAL (KIND = GRID_SR)                                                :: r_eps, r_max, r_min, &
+	    r_tmp, r_avg, r_sp, r_sp1, r_sb, r_plus, r_minus, r_cs, r_sm, r_ccs
+	  INTEGER                                             :: i_cnt, i_alct, i_val, &
+	    i_ind, i_tim, j_cnt, i_points, i_out, i_stat, i_tmp
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE                     :: r_low, r_hig, &
+	    r_nar, r_bfc, r_mfc, r_cfc
+	  INTEGER, DIMENSION(:), ALLOCATABLE                  :: i_fil
+	  LOGICAL                                             :: l_changed
+	  INTEGER                                             :: i_newlen
+!	  INTEGER, DIMENSION(:), POINTER                      :: i_newind
+
+!---------- initialize pointer
+
+!	  NULLIFY(i_newind)
+
+!---------- initialize constant
+
+	  i_val= GRID_tracer
+	  r_eps= GRID_EPS
+	  i_tim= p_mesh(i_timeplus)%i_timetag
+!	  i_points= p_mesh(i_timeplus)%i_nnumber
+	  i_points= i_arlen
+
+!---------- allocate work array
+
+	  ALLOCATE(r_upstr(GRID_dimension,i_points), stat=i_alct)
+	  not_alloc1: IF(i_alct /= 0) THEN
+	    CALL grid_error(60)
+	  END IF not_alloc1
+
+	  ALLOCATE(r_low(i_points), r_hig(i_points), &
+	           r_bfc(i_points), r_mfc(i_points), &
+	           r_nar(i_points), r_cfc(i_points), &
+	           i_fil(i_points), stat= i_alct)
+	  not_alloc2: IF(i_alct /= 0) THEN
+	    CALL grid_error(60)
+	  END IF not_alloc2
+	  r_low=0.0_GRID_SR
+	  r_hig=0.0_GRID_SR
+
+!---------- calculate upstream coordinates
+
+	  dim_loop: DO i_cnt=1, GRID_dimension
+	    r_upstr(i_cnt,:) = r_coord(i_cnt,:)- r_fac(i_cnt)* r_alpha(i_cnt,:)
+	  END DO dim_loop
+
+!---------- loop over nodes: find element containing upstream point
+
+	  node_loop: DO i_cnt=1, i_points
+
+!---------- check if upstream value is outside of the domain
+
+	    i_out= grid_domaincheck(p_mesh(i_time), r_upstr(:,i_cnt))
+
+!---------- take the intersection of the trajectory with the boundary as new upstream point
+
+	    out_domain: IF(i_out /= 0) then
+	      r_upstr(:,i_cnt)= grid_boundintersect(p_mesh(i_time), &
+	                        r_coord(:,i_cnt), r_upstr(:,i_cnt), i_info=i_stat)
+	      no_intersect: IF(i_stat /= 0) THEN
+	        r_bfc(i_cnt)= 0.0_GRID_SR
+	        CYCLE node_loop
+	      END IF no_intersect
+	    END IF out_domain
+
+!---------- interpolate
+
+	    r_low(i_cnt)= grid_coordvalue(p_mesh(i_time), r_upstr(:,i_cnt), &
+	           i_interpolorder=GRID_loworder, i_valpoint=i_val, i_index=i_ind, l_relative=.FALSE., l_sfcorder=.FALSE.)
+	    r_hig(i_cnt)= grid_coordvalue(p_mesh(i_time), r_upstr(:,i_cnt), &
+	           i_interpolorder=GRID_highorder, i_valpoint=i_val, l_relative=.FALSE., l_sfcorder=.FALSE.)
+
+	    index_valid: IF(i_ind > 0) THEN
+
+!---------- get nodes of element surrounding r_upstr
+
+	      CALL grid_getiteminfo(i_ind, 'elmt', i_arrlen=GRID_elementnodes, i_nodes=i_ttmp)
+
+!---------- get values at nodes of element surrounding r_upstr, and obtain min/max
+
+	      r_min= 0.0_GRID_SR; r_max= 0.0_GRID_SR
+	      elmt_loop: DO j_cnt=1,GRID_elementnodes
+	        CALL grid_getiteminfo(i_ttmp(j_cnt), 'node', i_arrlen=GRID_nodevalues, &
+	                              r_values= r_tval, i_time=p_mesh(i_time)%i_timetag)
+	        IF(j_cnt == 1) THEN
+	          r_min= r_tval(i_val)
+	          r_max= r_tval(i_val)
+	        ELSE
+	          r_min= MIN(r_min, r_tval(i_val))
+	          r_max= MAX(r_max, r_tval(i_val))	      
+	        END IF
+	      END DO elmt_loop
+
+!---------- factor for the low and high order blending
+
+	      r_tmp  = r_hig(i_cnt)- r_low(i_cnt)
+	      r_plus = r_max- r_low(i_cnt)
+	      r_minus= r_min- r_low(i_cnt)
+
+	      IF(r_tmp > 0.0_GRID_SR) THEN
+	        r_bfc(i_cnt)= MIN(1.0_GRID_SR, r_plus/r_tmp)
+	      ELSE IF(r_tmp < 0.0_GRID_SR) THEN
+	        r_bfc(i_cnt)= MIN(1.0_GRID_SR, r_minus/r_tmp)
+	      ELSE
+	        r_bfc(i_cnt)= 0.0_GRID_SR
+	      END IF
+	    ELSE index_valid
+	      r_bfc(i_cnt)= 0.0_GRID_SR
+	    END IF index_valid
+	  END DO node_loop
+
+!---------- get nodal area for integration
+
+! 	  CALL grid_newitems(p_mesh(i_timeplus), i_newnodes=i_newlen, &
+! 	                     i_newnodeindex=i_newind)
+! 	  IF(i_newlen > i_points) THEN
+! 	    CALL grid_error(i_error=2,c_error='[slm_interpolate]: index array length mismatch encountered')
+! 	  END IF
+! 	  CALL grid_nodearea(p_mesh(i_timeplus), i_tmp, r_nar, &
+! 	                     i_selectlength=i_newlen, i_selectindex=i_newind)
+	  CALL grid_nodearea(p_mesh(i_timeplus), i_tmp, r_nar)
+
+!---------- calculate an auxiliary weighted factor for convenience
+
+	  r_cfc= (r_hig- r_low)* r_nar
+
+!---------- check for conservation
+
+	  r_cs= DOT_PRODUCT(r_low, r_nar)
+	  r_sm= DOT_PRODUCT(r_bfc, r_cfc)
+	  r_ccs= r_conservation- r_cs
+	  IF(r_sm < r_ccs) THEN
+	    r_ccs= -r_ccs
+	    r_cfc= -r_cfc
+	  END IF
+
+!---------- check local underestimation
+
+	  DO i_cnt=1,i_points
+	    IF(r_cfc(i_cnt) <= 0.0_GRID_SR) THEN
+	      r_mfc(i_cnt)= r_bfc(i_cnt)
+	      i_fil(i_cnt)= 1
+	    ELSE
+	      r_mfc(i_cnt)= 0.0_GRID_SR
+	      i_fil(i_cnt)= 0
+	    END IF
+	  END DO
+
+!---------- the modification loop
+
+	  l_changed= .TRUE.
+	  mod_loop: DO WHILE(l_changed)
+	    l_changed= .FALSE.
+
+!---------- calculate surplus and average alpha
+
+	    r_sp1= 0.0_GRID_SR
+	    r_sb = 0.0_GRID_SR
+	    DO i_cnt= 1, i_points
+	      IF(i_fil(i_cnt) == 1) THEN
+	        r_sp1= r_sp1+ r_mfc(i_cnt)* r_cfc(i_cnt)
+	      ELSE
+	        r_sb= r_sb+ r_cfc(i_cnt)
+	      END IF
+	    END DO
+	    r_sp= r_ccs- r_sp1
+
+!---------- if surplus is negative, use the quasi-monotone factors
+
+	    IF(r_sp <= 0.0_GRID_SR) THEN
+	      r_mfc= r_bfc
+	      EXIT mod_loop
+	    END IF
+
+!---------- if surplus is zero, we're done
+
+	    IF(r_sb == 0.0_GRID_SR) EXIT mod_loop
+
+!---------- calculate an average weight
+
+	    r_avg= r_sp/ r_sb
+
+!---------- else put average weights to the factors
+
+	    DO i_cnt=1, i_points
+	      IF(i_fil(i_cnt) == 0) THEN
+	        IF(r_avg <= r_bfc(i_cnt)) THEN
+	          r_mfc(i_cnt)= r_avg
+	        ELSE 
+	          r_mfc(i_cnt)= r_bfc(i_cnt)
+	          i_fil(i_cnt)= 1
+	          l_changed= .TRUE.
+	        END IF
+	      END IF
+	    END DO
+
+	  END DO mod_loop
+
+!---------- blend the final values of the interpolation
+
+	  r_rside= r_mfc* r_hig+ (1.-r_mfc)* r_low
+
+!---------- remove small oscillations
+
+	  r_rside= MERGE(r_rside, 0.0_GRID_SR, ABS(r_rside)>=r_eps)
+
+!---------- deallocate work arrays
+
+	  DEALLOCATE(r_upstr, r_low, r_hig, r_bfc, r_mfc, &
+	             r_nar, r_cfc, i_fil) !, i_newind)
+!	  NULLIFY(i_newind)
+
+	  RETURN
+	  END SUBROUTINE slm_ainterpolate
+!*****************************************************************
+	  SUBROUTINE slm_interpolinit(p_ogrid)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle)              :: p_ogrid
+	  INTEGER                         :: i_points, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE   :: r_area
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_values
+	  INTEGER, DIMENSION(1)           :: i_valind
+
+!---------- initialize constants
+
+	  i_valind= (/ GRID_tracer /)
+	  i_points= p_ogrid%i_nnumber
+
+!---------- allocate work arrays
+
+	  ALLOCATE(r_area(i_points), r_values(1,i_points), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(61)
+	  END IF not_alloc
+
+!---------- get values
+
+	  CALL grid_getinfo(p_ogrid, i_arraypoint=i_valind, &
+	                    r_nodevalues= r_values)
+
+!---------- calculate area pieces for each node
+
+	  CALL grid_nodearea(p_ogrid, i_points, r_area)
+
+!---------- calculate integral
+
+	  r_conservation= dot_product(r_area, r_values(1,:))
+
+!---------- deallocate work arrays
+
+	  DEALLOCATE(r_area, r_values)
+
+	  RETURN
+	  END SUBROUTINE slm_interpolinit
+
+	END MODULE SLM_advanced
diff --git a/flash2d/src/options/SLM_advanced.dual.f90 b/flash2d/src/options/SLM_advanced.dual.f90
new file mode 100644
index 0000000..a74c242
--- /dev/null
+++ b/flash2d/src/options/SLM_advanced.dual.f90
@@ -0,0 +1,544 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_advanced
+! FUNCTION:
+!	provide advanced semi-Lagrangian routines
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_step
+! FUNCTION:
+!	one step of the basic SLM algorithm
+! SYNTAX:
+!	CALL slm_step(int, real.arr, real.arr)
+! ON INPUT:
+!	...
+! ON OUTPUT:
+!	r_tracer: array with tracer values	real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_displace
+! FUNCTION:
+!	extrapolate the alpha, values for the displacements of the upstream
+!	points from the gridpoints
+! SYNTAX:
+!	CALL slm_displace(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_coord: real array of xy-coordinates		real
+! ON OUTPUT:
+!	r_alpha: displacement vectors to each point	real
+! CALLS:
+!	wind_field
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_update
+! FUNCTION:
+!	calculate the update to the velocity
+! SYNTAX:
+!	CALL slm_update(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_rside: array with right hand side values	real
+! ON OUTPUT:
+!	r_udate: array with new (updated) gid values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is trivial for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_upstream
+! FUNCTION:
+!	calculate right hand side of the equation (upstream values)
+! SYNTAX:
+!	CALL slm_upstream(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_alpha: displacement vectors to each point	real
+! ON OUTPUT:
+!	r_rside: array with right hand side values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is just interpolation for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	triang_area
+! FUNCTION:
+!	calculate triangle area given by three coordinates
+! SYNTAX:
+!
+! ON INPUT:
+!
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_displace, slm_update, slm_upstream
+! COMMENTS:
+!
+! USES:
+!	FLASH_parameters, GRID_api, ADV_wind, ADV_rhs
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	4/2002
+!	2. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_advanced
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE GRID_api
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_astep
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_astep(p_ghand, p_param, p_time, r_modtime, i_size, &
+	                       r_coord, r_tracer, i_newsdepth)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                         :: p_param
+	  TYPE (sw_info), INTENT(inout)                             :: p_time
+	  REAL (KIND = GRID_SR), INTENT(in)                                          :: r_modtime
+	  INTEGER, INTENT(in)                                       :: i_size
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size), INTENT(in)        :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_size), INTENT(out)                      :: r_tracer
+	  INTEGER, OPTIONAL, INTENT(in)                             :: i_newsdepth
+	  
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE      :: r_newvl
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_alpha
+	  INTEGER                              :: i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER        :: r_dualcoordinates
+	  INTEGER, DIMENSION(:,:,:), POINTER   :: i_dualedges
+	  INTEGER                              :: i_dual
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_dualalpha
+
+!---------- check size!
+
+	  IF(i_size <= 0) THEN
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'INFO [slm_astep]: Zero step size, returning to calling routine'
+	    RETURN
+	  END IF
+
+!---------- allocate auxiliary arrays
+
+	  allocate(r_newvl(i_size), r_alpha(GRID_dimension,i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(38)
+	  END IF not_alloc
+
+!---------- create dual mesh
+
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_createdual(p_ghand(i_timeplus), i_dual, i_dualedges, &
+	                         r_dualcoordinates, i_newsdepth= i_newsdepth, i_newlength=i_size)
+	    IF(i_alct /= i_size) CALL grid_error(c_error='[slm_astep]: incompatible new lengths...')
+	  ELSE
+	    CALL grid_createdual(p_ghand(i_timeplus), i_dual, i_dualedges, &
+	                         r_dualcoordinates)
+	  END IF
+
+!---------- allocate array for dual displacements
+
+	  allocate(r_dualalpha(GRID_dimension,i_dual), stat=i_alct)
+	  not_allocdual: IF(i_alct /= 0) THEN
+	    CALL grid_error(40)
+	  END IF not_allocdual
+
+!-SLM--------- calculate trajectory pieces (displacements)
+
+	  CALL stop_watch('start',3,p_time)
+	  CALL slm_adisplace(p_param, i_size, r_coord, r_alpha, &
+	  		    i_dual, r_dualcoordinates, r_dualalpha, r_time=r_modtime)
+	  CALL stop_watch('stop ',3,p_time)
+
+!-SLM--------- calculate right hand side
+
+	  CALL stop_watch('start',4,p_time)
+	  CALL slm_aupstream(p_ghand, i_size, r_coord, r_alpha, &
+	  		    i_dual, r_dualcoordinates, r_dualalpha, &
+	  		    i_dualedges, r_newvl)
+	  CALL stop_watch('stop ',4,p_time)
+
+!-SLM--------- calculate new grid values
+
+	  CALL stop_watch('start',5,p_time)
+	  CALL slm_aupdate(p_param, i_size, r_coord, r_newvl, r_tracer, r_time=r_modtime)
+	  CALL stop_watch('stop ',5,p_time)
+
+!---------- destroy dual mesh
+
+	  CALL grid_destroydual(i_dual, i_dualedges, r_dualcoordinates)
+
+!-SLM--------- put alpha values to u and v field entries
+
+	  r_alpha= -r_alpha
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_newsdepth=i_newsdepth, i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  ELSE
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  END IF
+
+!-SLM--------- deallocate work arrays
+
+	  deallocate(r_dualalpha, r_alpha, r_newvl)
+
+	  RETURN
+	  END SUBROUTINE slm_astep
+
+!*****************************************************************
+	  SUBROUTINE slm_adisplace(p_param, i_arlen, r_coord, r_alpha, &
+	                          i_darlen, r_dcoord, r_dalpha, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                      :: p_param
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_alpha
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                           :: r_time
+	  INTEGER, INTENT(in)                                  :: i_darlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in)  :: r_dcoord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(out) :: r_dalpha
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_fac, r_caf, &
+	    r_axy, r_xyc
+	  REAL (KIND = GRID_SR)                                                 :: r_dt0, r_dt1, &
+	    r_dt2, r_tim
+	  INTEGER                                              :: i_cnt1, i_cnt2
+
+!---------- set constants
+
+	  r_dt0= p_param%num%r_deltatime
+	  r_dt1= 0.5_GRID_SR* p_param%num%r_deltatime
+	  r_dt2= 1.5_GRID_SR* p_param%num%r_deltatime
+	  r_fac= 0.5_GRID_SR
+	  r_caf= 2.0_GRID_SR
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- calculate in an iteration process the displacements
+
+	  unknown_loop: DO i_cnt1=1,i_arlen
+	    r_axy= 0.0_GRID_SR
+
+	    iter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_coord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO iter_loop
+
+	    r_alpha(:,i_cnt1)= r_axy
+	  END DO unknown_loop
+
+!---------- the same for the dual grid
+
+	  dual_loop: DO i_cnt1=1,i_darlen
+	    r_axy= 0.0_GRID_SR
+
+	    diter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_dcoord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO diter_loop
+
+	    r_dalpha(:,i_cnt1)= r_axy
+	  END DO dual_loop
+
+	  RETURN
+	  END SUBROUTINE slm_adisplace
+
+!*****************************************************************
+	  SUBROUTINE slm_aupdate(p_param, i_arlen, r_coord, r_rside, r_udate, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                   :: p_param
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_udate
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                          :: r_time
+	  INTEGER                                             :: i_cnt
+	  REAL (KIND = GRID_SR)                                                :: r_dt, r_tim
+
+!---------- in the linear advection case and with f90 this is just
+
+!	  r_udate= r_rside
+
+!---------- including a non-zero right hand side, we have
+
+	  r_dt= p_param%num%r_deltatime
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+	  main_loop: DO i_cnt=1, i_arlen
+	    r_udate(i_cnt)= r_rside(i_cnt)+ r_dt* slm_righthand(r_coord(:,i_cnt))
+	  END DO main_loop
+
+	  RETURN
+	  END SUBROUTINE slm_aupdate
+
+!*****************************************************************
+	  SUBROUTINE slm_aupstream(p_mesh, i_arlen, r_coord, r_alpha, &
+	                          i_darlen, r_dcoord, r_dalpha, &
+	                          i_dedge, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  INTEGER, INTENT(in)                                          :: i_darlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in)         :: r_dcoord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in)         :: r_dalpha
+	  INTEGER, DIMENSION(2,GRID_patchelements,i_arlen), INTENT(in) :: i_dedge
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                     :: r_fac
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE                     :: r_aux, &
+	    r_uparea, r_dwarea
+	  INTEGER                                             :: i_alct, i_cnt, j_cnt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                     :: r_1, r_2, r_3
+	  REAL (KIND = GRID_SR)                                                :: r_oarea, r_narea
+
+!---------- set factor (at which point of trajectory shall i interpolate)
+
+	  r_fac= 1.0_GRID_SR
+
+!---------- allocate auxilliary arrays
+
+	  allocate(r_aux(i_arlen), &
+	           r_uparea(i_arlen), r_dwarea(i_arlen), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(39)
+	  END IF not_alloc
+
+!---------- interpolation of node values
+
+	  CALL slm_ainterpolate(p_mesh, r_fac, i_arlen, r_coord, &
+	                        r_alpha, r_aux)
+
+!---------- loop over nodes
+
+	  node_loop: DO i_cnt= 1, i_arlen
+	    r_oarea= 0.
+	    r_narea= 0.
+	    ptch_loop: DO j_cnt= 1, GRID_patchelements
+	      IF(i_dedge(1,j_cnt,i_cnt) == 0) THEN
+	        EXIT ptch_loop
+	      ELSE
+
+!---------- the upstream dual element
+
+	        r_1= r_coord(:,i_cnt)- r_alpha(:,i_cnt)
+	        r_2= r_dcoord(:,i_dedge(1,j_cnt,i_cnt))- r_dalpha(:,i_dedge(1,j_cnt,i_cnt))
+	        r_3= r_dcoord(:,i_dedge(2,j_cnt,i_cnt))- r_dalpha(:,i_dedge(2,j_cnt,i_cnt))
+	        r_oarea= r_oarea+ triang_area(r_1, r_2, r_3)
+
+!---------- the downstream dual element
+
+	        r_1= r_coord(:,i_cnt)
+	        r_2= r_dcoord(:,i_dedge(1,j_cnt,i_cnt))
+	        r_3= r_dcoord(:,i_dedge(2,j_cnt,i_cnt))
+	        r_narea= r_narea+ triang_area(r_1, r_2, r_3)
+	      END IF
+	    END DO ptch_loop
+	    r_uparea(i_cnt)= r_oarea
+	    IF(r_narea /= 0._GRID_SR) THEN
+	      r_dwarea(i_cnt)= 1._GRID_SR/ r_narea
+	    ELSE
+	      r_dwarea(i_cnt)= 0._GRID_SR
+	    END IF
+	  END DO node_loop
+
+!---------- now calculate new values using a (nonexact) interpolation formula
+
+	  r_rside= r_aux* r_uparea* r_dwarea
+
+!---------- deallocate auxilliary arrays
+
+	  deallocate(r_aux, r_uparea, r_dwarea)
+
+	  RETURN
+	  END SUBROUTINE slm_aupstream
+
+!*****************************************************************
+	  SUBROUTINE slm_ainterpolate(p_mesh, r_fac, i_arlen, &
+	                             r_coord, r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in)         :: r_fac
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE                   :: r_upstr
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_nodevalues)                    :: r_tval
+	  INTEGER, DIMENSION(GRID_elementnodes)               :: i_ttmp
+	  REAL (KIND = GRID_SR)                                                :: r_eps, r_max, r_min, r_tmp
+	  INTEGER                                             :: i_cnt, i_alct, i_val
+	  INTEGER                                             :: i_ind, i_tim, &
+	    j_cnt, i_out, i_stat
+
+!---------- initialize constant
+
+	  i_val= GRID_tracer
+	  r_eps= GRID_EPS
+	  i_tim= p_mesh(i_time)%i_timetag
+
+!---------- allocate work array
+
+	  ALLOCATE(r_upstr(GRID_dimension,i_arlen), stat=i_alct)
+	  not_allocated: IF(i_alct /= 0) THEN
+	    CALL grid_error(60)
+	  END IF not_allocated
+
+!---------- calculate upstream coordinates
+
+	  dim_loop: DO i_cnt=1, GRID_dimension
+	    r_upstr(i_cnt,:) = r_coord(i_cnt,:)- r_fac(i_cnt)* r_alpha(i_cnt,:)
+	  END DO dim_loop
+
+!---------- loop over nodes: find element containing upstream point
+
+	  node_loop: DO i_cnt=1, i_arlen
+
+!---------- check if upstream value is outside of the domain
+
+	    i_out= grid_domaincheck(p_mesh(i_time), r_upstr(:,i_cnt))
+
+!---------- take the intersection of the trajectory with the boundary as new upstream point
+
+	    out_domain: IF(i_out /= 0) then
+	       r_upstr(:,i_cnt)= grid_boundintersect(p_mesh(i_time), &
+	                        r_coord(:,i_cnt), r_upstr(:,i_cnt), i_info=i_stat)
+               no_intersect: IF(i_stat /= 0) THEN
+                  r_rside(i_cnt)= 0.0
+                  CYCLE node_loop
+               END IF no_intersect
+	    END IF out_domain
+
+!---------- interpolate
+
+	    r_tmp= grid_coordvalue(p_mesh(i_time), r_upstr(:,i_cnt), &
+	           i_interpolorder=GRID_highorder, i_valpoint=i_val, &
+                i_index=i_ind, i_domaincheck=0, l_relative=.FALSE., l_sfcorder=.FALSE.)
+
+
+	    index_valid: IF(i_ind > 0) THEN
+
+!---------- get nodes of element surrounding r_upstr
+
+	       CALL grid_getiteminfo(i_ind, 'elmt', i_arrlen=GRID_elementnodes, i_nodes=i_ttmp)
+
+!---------- get values at nodes of element surrounding r_upstr, and obtain min/max
+
+               r_min= 0.0_GRID_SR; r_max= 0.0_GRID_SR
+               elmt_loop: DO j_cnt=1,GRID_elementnodes
+                  CALL grid_getiteminfo(i_ttmp(j_cnt), 'node', i_arrlen=GRID_nodevalues, &
+                                        r_values= r_tval, i_time=i_tim)
+                  r_min= MIN(r_min, r_tval(i_val))
+                  r_max= MAX(r_max, r_tval(i_val))	      
+               END DO elmt_loop
+
+!---------- clip value
+
+               IF(r_tmp > r_max) THEN
+                  r_tmp= r_max
+               ELSE IF(r_tmp < r_min) THEN
+                  r_tmp= r_min
+               END IF
+	    END IF index_valid
+
+!---------- set interpolation value
+
+	    r_rside(i_cnt)= r_tmp
+	 
+	    small_val: IF(abs(r_rside(i_cnt)) < r_eps) THEN
+               r_rside(i_cnt)= 0.0_GRID_SR
+	    END IF small_val
+
+	  END DO node_loop
+
+!---------- deallocate work array
+
+	  DEALLOCATE(r_upstr)
+
+	  RETURN
+	  END SUBROUTINE slm_ainterpolate
+
+!*****************************************************************
+	  FUNCTION triang_area(r_coord1, r_coord2, r_coord3) RESULT (r_area)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord1, r_coord2, r_coord3
+	  REAL (KIND = GRID_SR)                                        :: r_area
+	  REAL (KIND = GRID_SR)                                        :: r_c
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_a, r_b
+
+!---------- calculate vector components
+
+	  r_a= r_coord2- r_coord1
+	  r_b= r_coord3- r_coord1
+
+!---------- calculate components (a,b,c) of cross product vector
+
+	  r_c= (r_a(1)* r_b(2)- r_a(2)* r_b(1))
+
+!---------- calculate area
+
+	  r_area= abs(r_c)* 0.5_GRID_SR
+
+	  RETURN
+	  END FUNCTION triang_area
+
+	END MODULE SLM_advanced
diff --git a/flash2d/src/options/SLM_advanced.dual1.f90 b/flash2d/src/options/SLM_advanced.dual1.f90
new file mode 100644
index 0000000..935ec3d
--- /dev/null
+++ b/flash2d/src/options/SLM_advanced.dual1.f90
@@ -0,0 +1,518 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_advanced
+! FUNCTION:
+!	provide advanced semi-Lagrangian routines
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_step
+! FUNCTION:
+!	one step of the basic SLM algorithm
+! SYNTAX:
+!	CALL slm_step(int, real.arr, real.arr)
+! ON INPUT:
+!	...
+! ON OUTPUT:
+!	r_tracer: array with tracer values	real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_displace
+! FUNCTION:
+!	extrapolate the alpha, values for the displacements of the upstream
+!	points from the gridpoints
+! SYNTAX:
+!	CALL slm_displace(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_coord: real array of xy-coordinates		real
+! ON OUTPUT:
+!	r_alpha: displacement vectors to each point	real
+! CALLS:
+!	wind_field
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_update
+! FUNCTION:
+!	calculate the update to the velocity
+! SYNTAX:
+!	CALL slm_update(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_rside: array with right hand side values	real
+! ON OUTPUT:
+!	r_udate: array with new (updated) gid values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is trivial for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_upstream
+! FUNCTION:
+!	calculate right hand side of the equation (upstream values)
+! SYNTAX:
+!	CALL slm_upstream(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_alpha: displacement vectors to each point	real
+! ON OUTPUT:
+!	r_rside: array with right hand side values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is just interpolation for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	triang_area
+! FUNCTION:
+!	calculate triangle area given by three coordinates
+! SYNTAX:
+!
+! ON INPUT:
+!
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_displace, slm_update, slm_upstream
+! COMMENTS:
+!
+! USES:
+!	FLASH_parameters, GRID_api, ADV_wind, ADV_rhs
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	4/2002
+!	2. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_advanced
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE GRID_api
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_astep
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_astep(p_ghand, p_param, p_time, r_modtime, i_size, &
+	                       r_coord, r_tracer, i_newsdepth)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                         :: p_param
+	  TYPE (sw_info), INTENT(inout)                             :: p_time
+	  REAL (KIND = GRID_SR), INTENT(in)                                          :: r_modtime
+	  INTEGER, INTENT(in)                                       :: i_size
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size), INTENT(in)        :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_size), INTENT(out)                      :: r_tracer
+	  INTEGER, OPTIONAL, INTENT(in)                             :: i_newsdepth
+	  
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE      :: r_newvl
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_alpha
+	  INTEGER                              :: i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER        :: r_dualcoordinates
+	  INTEGER, DIMENSION(:,:,:), POINTER   :: i_dualedges
+	  INTEGER                              :: i_dual
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_dualalpha
+
+!---------- check size!
+
+	  IF(i_size <= 0) THEN
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'INFO [slm_astep]: Zero step size, returning to calling routine'
+	    RETURN
+	  END IF
+
+!---------- allocate auxiliary arrays
+
+	  allocate(r_newvl(i_size), r_alpha(GRID_dimension,i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(38)
+	  END IF not_alloc
+
+!---------- create dual mesh
+
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_createdual(p_ghand(i_timeplus), i_dual, i_dualedges, &
+	                         r_dualcoordinates, i_newsdepth= i_newsdepth, i_newlength=i_size)
+	    IF(i_alct /= i_size) CALL grid_error(c_error='[slm_step]: incompatible new lengths...')
+	  ELSE
+	    CALL grid_createdual(p_ghand(i_timeplus), i_dual, i_dualedges, &
+	                         r_dualcoordinates)
+	  END IF
+
+!---------- allocate array for dual displacements
+
+	  allocate(r_dualalpha(GRID_dimension,i_dual), stat=i_alct)
+	  not_allocdual: IF(i_alct /= 0) THEN
+	    CALL grid_error(40)
+	  END IF not_allocdual
+
+!-SLM--------- calculate trajectory pieces (displacements)
+
+	  CALL stop_watch('start',3,p_time)
+	  CALL slm_adisplace(p_param, i_size, r_coord, r_alpha, &
+	  		    i_dual, r_dualcoordinates, r_dualalpha, r_time=r_modtime)
+	  CALL stop_watch('stop ',3,p_time)
+
+!-SLM--------- calculate right hand side
+
+	  CALL stop_watch('start',4,p_time)
+	  CALL slm_aupstream(p_ghand, i_size, r_coord, r_alpha, &
+	  		    i_dual, r_dualcoordinates, r_dualalpha, &
+	  		    i_dualedges, r_newvl)
+	  CALL stop_watch('stop ',4,p_time)
+
+!-SLM--------- calculate new grid values
+
+	  CALL stop_watch('start',5,p_time)
+	  CALL slm_aupdate(p_param, i_size, r_coord, r_newvl, r_tracer, r_time=r_modtime)
+	  CALL stop_watch('stop ',5,p_time)
+
+!---------- destroy dual mesh
+
+	  CALL grid_destroydual(i_dual, i_dualedges, r_dualcoordinates)
+
+!-SLM--------- put alpha values to u and v field entries
+
+	  r_alpha= -r_alpha
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_newsdepth=i_newsdepth, i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  ELSE
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  END IF
+
+!-SLM--------- deallocate work arrays
+
+	  deallocate(r_dualalpha, r_alpha, r_newvl)
+
+	  RETURN
+	  END SUBROUTINE slm_astep
+
+!*****************************************************************
+	  SUBROUTINE slm_adisplace(p_param, i_arlen, r_coord, r_alpha, &
+	                          i_darlen, r_dcoord, r_dalpha, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                      :: p_param
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_alpha
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                           :: r_time
+	  INTEGER, INTENT(in)                                  :: i_darlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in)  :: r_dcoord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(out) :: r_dalpha
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_fac, r_caf, &
+	    r_axy, r_xyc
+	  REAL (KIND = GRID_SR)                                                 :: r_dt0, r_dt1, &
+	    r_dt2, r_tim
+	  INTEGER                                              :: i_cnt1, i_cnt2
+
+!---------- set constants
+
+	  r_dt0= p_param%num%r_deltatime
+	  r_dt1= 0.5_GRID_SR* p_param%num%r_deltatime
+	  r_dt2= 1.5_GRID_SR* p_param%num%r_deltatime
+	  r_fac= 0.5_GRID_SR
+	  r_caf= 2.0_GRID_SR
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- calculate in an iteration process the displacements
+
+	  unknown_loop: DO i_cnt1=1,i_arlen
+	    r_axy= 0.0_GRID_SR
+
+	    iter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_coord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO iter_loop
+
+	    r_alpha(:,i_cnt1)= r_axy
+	  END DO unknown_loop
+
+!---------- the same for the dual grid
+
+	  dual_loop: DO i_cnt1=1,i_darlen
+	    r_axy= 0.0_GRID_SR
+
+	    diter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_dcoord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO diter_loop
+
+	    r_dalpha(:,i_cnt1)= r_axy
+	  END DO dual_loop
+
+	  RETURN
+	  END SUBROUTINE slm_adisplace
+
+!*****************************************************************
+	  SUBROUTINE slm_aupdate(p_param, i_arlen, r_coord, r_rside, r_udate, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                   :: p_param
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_udate
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                          :: r_time
+	  INTEGER                                             :: i_cnt
+	  REAL (KIND = GRID_SR)                                                :: r_dt, r_tim
+
+!---------- in the linear advection case and with f90 this is just
+
+!	  r_udate= r_rside
+
+!---------- including a non-zero right hand side, we have
+
+	  r_dt= p_param%num%r_deltatime
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+	  main_loop: DO i_cnt=1, i_arlen
+	    r_udate(i_cnt)= r_rside(i_cnt)+ r_dt* slm_righthand(r_coord(:,i_cnt))
+	  END DO main_loop
+
+	  RETURN
+	  END SUBROUTINE slm_aupdate
+
+!*****************************************************************
+	  SUBROUTINE slm_aupstream(p_mesh, i_arlen, r_coord, r_alpha, &
+	                          i_darlen, r_dcoord, r_dalpha, &
+	                          i_dedge, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  INTEGER, INTENT(in)                                          :: i_darlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in)         :: r_dcoord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in)         :: r_dalpha
+	  INTEGER, DIMENSION(2,GRID_patchelements,i_arlen), INTENT(in) :: i_dedge
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                     :: r_fac
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE                     :: r_aux, r_daux, &
+	    r_uparea, r_dwarea
+	  INTEGER                                             :: i_alct, i_cnt, j_cnt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                     :: r_1, r_2, r_3
+	  REAL (KIND = GRID_SR)                                                :: r_oarea, r_narea
+
+!---------- set factor (at which point of trajectory shall i interpolate)
+
+	  r_fac= 1.0_GRID_SR
+
+!---------- allocate auxilliary arrays
+
+	  allocate(r_aux(i_arlen), r_daux(i_darlen), &
+	           r_uparea(i_arlen), r_dwarea(i_arlen), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(39)
+	  END IF not_alloc
+
+!---------- interpolation of node values
+
+	  CALL slm_ainterpolate(p_mesh, r_fac, i_arlen, r_coord, &
+	                       r_alpha, r_aux)
+
+!---------- loop over nodes
+
+	  node_loop: DO i_cnt= 1, i_arlen
+	    r_oarea= 0.
+	    r_narea= 0.
+	    ptch_loop: DO j_cnt= 1, GRID_patchelements
+	      IF(i_dedge(1,j_cnt,i_cnt) == 0) THEN
+	        EXIT ptch_loop
+	      ELSE
+
+!---------- the upstream dual element
+
+	        r_1= r_coord(:,i_cnt)- r_alpha(:,i_cnt)
+	        r_2= r_dcoord(:,i_dedge(1,j_cnt,i_cnt))- r_dalpha(:,i_dedge(1,j_cnt,i_cnt))
+	        r_3= r_dcoord(:,i_dedge(2,j_cnt,i_cnt))- r_dalpha(:,i_dedge(2,j_cnt,i_cnt))
+	        r_oarea= r_oarea+ triang_area(r_1, r_2, r_3)
+
+!---------- the downstream dual element
+
+	        r_1= r_coord(:,i_cnt)
+	        r_2= r_dcoord(:,i_dedge(1,j_cnt,i_cnt))
+	        r_3= r_dcoord(:,i_dedge(2,j_cnt,i_cnt))
+	        r_narea= r_narea+ triang_area(r_1, r_2, r_3)
+	      END IF
+	    END DO ptch_loop
+	    r_uparea(i_cnt)= r_oarea
+	    IF(r_narea /= 0._GRID_SR) THEN
+	      r_dwarea(i_cnt)= 1._GRID_SR/ r_narea
+	    ELSE
+	      r_dwarea(i_cnt)= 0._GRID_SR
+	    END IF
+	  END DO node_loop
+
+!---------- now calculate new values using a (nonexact) interpolation formula
+
+	  r_rside= r_aux* r_uparea* r_dwarea
+
+!---------- deallocate auxilliary arrays
+
+	  deallocate(r_aux, r_daux, r_uparea, r_dwarea)
+
+	  RETURN
+	  END SUBROUTINE slm_aupstream
+
+!*****************************************************************
+	  SUBROUTINE slm_ainterpolate(p_mesh, r_fac, i_arlen, &
+	                             r_coord, r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in)         :: r_fac
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE                   :: r_upstr
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_nodevalues)                    :: r_tval
+	  INTEGER, DIMENSION(GRID_elementnodes)               :: i_ttmp
+	  REAL (KIND = GRID_SR)                                                :: r_eps, r_max, r_min, r_tmp
+	  INTEGER                                             :: i_cnt, i_alct, i_val
+	  INTEGER                                             :: i_ind, i_tim, &
+	    j_cnt, i_out, i_stat
+
+!---------- initialize constant
+
+	  i_val= GRID_tracer
+	  r_eps= GRID_EPS
+	  i_tim= p_mesh(i_time)%i_timetag
+
+!---------- allocate work array
+
+	  ALLOCATE(r_upstr(GRID_dimension,i_arlen), stat=i_alct)
+	  not_allocated: IF(i_alct /= 0) THEN
+	    CALL grid_error(60)
+	  END IF not_allocated
+
+!---------- calculate upstream coordinates
+
+	  dim_loop: DO i_cnt=1, GRID_dimension
+	    r_upstr(i_cnt,:) = r_coord(i_cnt,:)- r_fac(i_cnt)* r_alpha(i_cnt,:)
+	  END DO dim_loop
+
+!---------- loop over nodes: find element containing upstream point
+
+	  node_loop: DO i_cnt=1, i_arlen
+
+!---------- check if upstream value is outside of the domain
+
+	    i_out= grid_domaincheck(p_mesh(i_time), r_upstr(:,i_cnt))
+
+!---------- take the intersection of the trajectory with the boundary as new upstream point
+
+	    out_domain: IF(i_out /= 0) then
+	       r_upstr(:,i_cnt)= grid_boundintersect(p_mesh(i_time), &
+	                        r_coord(:,i_cnt), r_upstr(:,i_cnt), i_info=i_stat)
+               no_intersect: IF(i_stat /= 0) THEN
+                  r_rside(i_cnt)= 0.0
+                  CYCLE node_loop
+               END IF no_intersect
+	    END IF out_domain
+
+!---------- interpolate
+
+	    r_tmp= grid_coordvalue(p_mesh(i_time), r_upstr(:,i_cnt), &
+	           i_interpolorder=GRID_highorder, i_valpoint=i_val, &
+                   i_index=i_ind, i_domaincheck=0)
+
+!---------- set interpolation value
+
+	    r_rside(i_cnt)= r_tmp
+	 
+	    small_val: IF(abs(r_rside(i_cnt)) < r_eps) THEN
+               r_rside(i_cnt)= 0.0_GRID_SR
+	    END IF small_val
+
+	  END DO node_loop
+
+!---------- deallocate work array
+
+	  DEALLOCATE(r_upstr)
+
+	  RETURN
+	  END SUBROUTINE slm_ainterpolate
+
+!*****************************************************************
+	  FUNCTION triang_area(r_coord1, r_coord2, r_coord3) RESULT (r_area)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord1, r_coord2, r_coord3
+	  REAL (KIND = GRID_SR)                                        :: r_area
+	  REAL (KIND = GRID_SR)                                        :: r_c
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_a, r_b
+
+!---------- calculate vector components
+
+	  r_a= r_coord2- r_coord1
+	  r_b= r_coord3- r_coord1
+
+!---------- calculate components (a,b,c) of cross product vector
+
+	  r_c= (r_a(1)* r_b(2)- r_a(2)* r_b(1))
+
+!---------- calculate area
+
+	  r_area= abs(r_c)* 0.5_GRID_SR
+
+	  RETURN
+	  END FUNCTION triang_area
+
+	END MODULE SLM_advanced
diff --git a/flash2d/src/options/SLM_advanced.dual2.f90 b/flash2d/src/options/SLM_advanced.dual2.f90
new file mode 100644
index 0000000..8edc728
--- /dev/null
+++ b/flash2d/src/options/SLM_advanced.dual2.f90
@@ -0,0 +1,580 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_advanced
+! FUNCTION:
+!	provide advanced semi-Lagrangian routines
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_step
+! FUNCTION:
+!	one step of the basic SLM algorithm
+! SYNTAX:
+!	CALL slm_step(int, real.arr, real.arr)
+! ON INPUT:
+!	...
+! ON OUTPUT:
+!	r_tracer: array with tracer values	real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_displace
+! FUNCTION:
+!	extrapolate the alpha, values for the displacements of the upstream
+!	points from the gridpoints
+! SYNTAX:
+!	CALL slm_displace(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_coord: real array of xy-coordinates		real
+! ON OUTPUT:
+!	r_alpha: displacement vectors to each point	real
+! CALLS:
+!	wind_field
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_update
+! FUNCTION:
+!	calculate the update to the velocity
+! SYNTAX:
+!	CALL slm_update(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_rside: array with right hand side values	real
+! ON OUTPUT:
+!	r_udate: array with new (updated) gid values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is trivial for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_upstream
+! FUNCTION:
+!	calculate right hand side of the equation (upstream values)
+! SYNTAX:
+!	CALL slm_upstream(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_alpha: displacement vectors to each point	real
+! ON OUTPUT:
+!	r_rside: array with right hand side values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is just interpolation for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_interpolate
+! FUNCTION:
+!	do the interpolation
+! SYNTAX:
+!	CALL slm_interpolate(grid, int, real, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	p_ogrid: grid handle to old grid (with data)	TYPE (grid_handle)
+!	r_fac:   factor at which point to interpolate	REAL
+!	i_arlen: array length for the following arrays	INTEGER
+!	r_coord: coordinate array (new grid)		REAL
+!	r_alpha: displacement array (corr. to r_coord)	REAL
+!	r_value: values on the old grid (array)		REAL
+! ON OUTPUT:
+!	r_rside: right hand side (interpolated)		REAL
+! CALLS:
+!
+! COMMENTS:
+!	this one is plain bi-cubic spline interpolation
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_interpolinit
+! FUNCTION:
+!	initialize the interpolation (conservative interpolation)
+! SYNTAX:
+!	CALL slm_interpolate(grid)
+! ON INPUT:
+!	p_ogrid: grid handle to old grid (with data)	TYPE (grid_handle)
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!	we set a global value present in this module:
+!	r_conservation: conservation value		REAL
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	triang_ar
+! FUNCTION:
+!	calculate triangle area given by three coordinates
+! SYNTAX:
+!
+! ON INPUT:
+!
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_displace, slm_update, slm_upstream
+! COMMENTS:
+!
+! USES:
+!	FLASH_parameters, GRID_api, SLM_interpolation, ADV_wind, ADV_rhs
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	4/2002
+!	2. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_advanced
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE GRID_api
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_astep
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_astep(p_ghand, p_param, p_time, r_modtime, i_size, &
+	                       r_coord, r_tracer, i_newsdepth)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                         :: p_param
+	  TYPE (sw_info), INTENT(inout)                             :: p_time
+	  REAL (KIND = GRID_SR), INTENT(in)                                          :: r_modtime
+	  INTEGER, INTENT(in)                                       :: i_size
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size), INTENT(in)        :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_size), INTENT(out)                      :: r_tracer
+	  INTEGER, OPTIONAL, INTENT(in)                             :: i_newsdepth
+	  
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE      :: r_newvl
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_alpha
+	  INTEGER                              :: i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER        :: r_dualcoordinates
+	  INTEGER, DIMENSION(:,:,:), POINTER   :: i_dualedges
+	  INTEGER                              :: i_dual
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_dualalpha
+	  REAL (KIND = GRID_SR), DIMENSION(:,:,:), ALLOCATABLE  :: r_newdualalpha
+	  REAL (KIND = GRID_SR), DIMENSION(:,:,:), POINTER      :: r_newdualcoor
+
+!---------- check size!
+
+	  IF(i_size <= 0) THEN
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'INFO [slm_astep]: Zero step size, returning to calling routine'
+	    RETURN
+	  END IF
+
+!---------- allocate auxiliary arrays
+
+	  nullify(r_newdualcoor)
+	  allocate(r_newvl(i_size), r_alpha(GRID_dimension,i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(38)
+	  END IF not_alloc
+
+!---------- create dual mesh
+
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_createdual(p_ghand(i_timeplus), i_dual, i_dualedges, &
+	                         r_dualcoordinates, i_newsdepth= i_newsdepth, i_newlength=i_size)
+	    IF(i_alct /= i_size) CALL grid_error(c_error='[slm_step]: incompatible new lengths...')
+	  ELSE
+	    CALL grid_createdual(p_ghand(i_timeplus), i_dual, i_dualedges, &
+	                         r_dualcoordinates)
+	  END IF
+
+!---------- calculate dual triangle positions
+
+	  CALL create_newdualpoints(i_size, r_coord, &
+	                            i_dual, r_dualcoordinates, i_dualedges, &
+	                            r_newdualcoor)
+
+!---------- allocate arrays for dual displacements
+
+	  allocate(r_newdualalpha(GRID_dimension,GRID_patchelements,i_size), &
+	           r_dualalpha(GRID_dimension,i_dual), stat=i_alct)
+	  not_allocdual: IF(i_alct /= 0) THEN
+	    CALL grid_error(40)
+	  END IF not_allocdual
+
+!-SLM--------- calculate trajectory pieces (displacements)
+
+	  CALL stop_watch('start',3,p_time)
+	  CALL slm_adisplace(p_param, i_size, r_coord, r_alpha, &
+	                     i_dual, r_dualcoordinates, r_dualalpha, &
+	                     r_newdualcoor, r_newdualalpha, r_time=r_modtime)
+	  CALL stop_watch('stop ',3,p_time)
+
+!-SLM--------- calculate right hand side
+
+	  CALL stop_watch('start',4,p_time)
+	  CALL slm_aupstream(p_ghand, i_size, r_coord, r_alpha, &
+	  		    i_dual, r_dualcoordinates, r_dualalpha, &
+	  		    i_dualedges, r_newdualcoor, r_newdualalpha, &
+	  		    r_newvl)
+	  CALL stop_watch('stop ',4,p_time)
+
+!-SLM--------- calculate new grid values
+
+	  CALL stop_watch('start',5,p_time)
+	  CALL slm_aupdate(p_param, i_size, r_coord, r_newvl, r_tracer, r_time=r_modtime)
+	  CALL stop_watch('stop ',5,p_time)
+
+!---------- destroy dual mesh
+
+	  CALL grid_destroydual(i_dual, i_dualedges, r_dualcoordinates)
+
+!-SLM--------- put alpha values to u and v field entries
+
+	  r_alpha= -r_alpha
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_newsdepth=i_newsdepth, i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  ELSE
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  END IF
+
+!-SLM--------- deallocate work arrays
+
+	  deallocate(r_dualalpha, r_alpha, r_newvl, r_newdualcoor, r_newdualalpha)
+	  nullify(r_newdualcoor)
+
+	  RETURN
+	  END SUBROUTINE slm_astep
+
+!*****************************************************************
+	  SUBROUTINE slm_adisplace(p_param, i_arlen, r_coord, r_alpha, &
+	                          i_darlen, r_dcoord, r_dalpha, &
+				  r_ndcoord, r_ndalpha, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                      :: p_param
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_alpha
+	  INTEGER, INTENT(in)                                  :: i_darlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in)  :: r_dcoord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(out) :: r_dalpha
+	  REAL (KIND = GRID_SR), DIMENSION(:,:,:), POINTER                      :: r_ndcoord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,GRID_patchelements,i_arlen), INTENT(out) :: r_ndalpha
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                           :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_fac, r_caf, &
+	    r_axy, r_xyc
+	  REAL (KIND = GRID_SR)                                                 :: r_dt0, r_dt1, &
+	    r_dt2, r_tim
+	  INTEGER                                              :: i_cnt1, i_cnt2, i_cnt3
+
+!---------- set constants
+
+	  r_dt0= p_param%num%r_deltatime
+	  r_dt1= 0.5_GRID_SR* p_param%num%r_deltatime
+	  r_dt2= 1.5_GRID_SR* p_param%num%r_deltatime
+	  r_fac= 0.5_GRID_SR
+	  r_caf= 2.0_GRID_SR
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- calculate in an iteration process the displacements
+
+	  unknown_loop: DO i_cnt1=1,i_arlen
+	    r_axy= 0.0_GRID_SR
+
+	    iter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_coord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO iter_loop
+
+	    r_alpha(:,i_cnt1)= r_axy
+
+!---------- the same for the dual triangle positions
+
+	    ndual_loop: DO i_cnt3=1,GRID_patchelements
+	      r_axy= 0.0_GRID_SR
+
+	      nditer_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	        r_xyc= r_ndcoord(:,i_cnt3,i_cnt1)- r_fac* r_axy
+	        r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	      END DO nditer_loop
+
+	      r_ndalpha(:,i_cnt3,i_cnt1)= r_axy
+	    END DO ndual_loop
+	  END DO unknown_loop
+
+!---------- the same for the dual nodes
+
+	  dual_loop: DO i_cnt1=1,i_darlen
+	    r_axy= 0.0_GRID_SR
+
+	    diter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_dcoord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO diter_loop
+
+	    r_dalpha(:,i_cnt1)= r_axy
+	  END DO dual_loop
+
+	  RETURN
+	  END SUBROUTINE slm_adisplace
+
+!*****************************************************************
+	  SUBROUTINE slm_aupdate(p_param, i_arlen, r_coord, r_rside, r_udate, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                   :: p_param
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_udate
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                          :: r_time
+	  INTEGER                                             :: i_cnt
+	  REAL (KIND = GRID_SR)                                                :: r_dt, r_tim
+
+!---------- in the linear advection case and with f90 this is just
+
+!	  r_udate= r_rside
+
+!---------- including a non-zero right hand side, we have
+
+	  r_dt= p_param%num%r_deltatime
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+	  main_loop: DO i_cnt=1, i_arlen
+	    r_udate(i_cnt)= r_rside(i_cnt)+ r_dt* slm_righthand(r_coord(:,i_cnt))
+	  END DO main_loop
+
+	  RETURN
+	  END SUBROUTINE slm_aupdate
+
+!*****************************************************************
+	  SUBROUTINE slm_aupstream(p_mesh, i_arlen, r_coord, r_alpha, &
+	                             i_darlen, r_dcoord, r_dalpha, &
+	                             i_dedge, r_ndcoor, r_ndalpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)        :: p_mesh
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_alpha
+	  INTEGER, INTENT(in)                                  :: i_darlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in) :: r_dcoord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in) :: r_dalpha
+	  INTEGER, DIMENSION(2,GRID_patchelements,i_arlen), INTENT(in) :: i_dedge
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,GRID_patchelements,i_arlen), INTENT(in) :: r_ndcoor
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,GRID_patchelements,i_arlen), INTENT(in) :: r_ndalpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)                :: r_rside
+	  INTEGER                                              :: i_cnt, i_tnc, i_out, i_stat
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_1
+	  REAL (KIND = GRID_SR)                                                 :: r_oarea, r_narea
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,GRID_elementnodes)    :: r_vertx
+	  REAL (KIND = GRID_SR)                                                 :: r_val, r_tmp
+
+	  i_stat= 0
+
+!---------- main loop over the nodes of the new grid
+
+	  node_loop: DO i_cnt=1,i_arlen
+
+	    r_val= 0.0_GRID_SR
+	    r_narea= 0.0_GRID_SR
+	    r_vertx= 0.0_GRID_SR
+
+!---------- the upstream dual element's center node
+
+	    r_vertx(1,1)= r_coord(1,i_cnt)- r_alpha(1,i_cnt)
+	    r_vertx(2,1)= r_coord(2,i_cnt)- r_alpha(2,i_cnt)
+
+!---------- now calculate the interference of the voronoi thing with elements from old mesh
+
+	    ptch_loop: DO i_tnc= 1, GRID_patchelements
+	    IF(i_dedge(1,i_tnc,i_cnt) == 0) THEN
+	      EXIT ptch_loop
+	    ELSE
+
+!---------- calculate area
+
+	      r_narea= r_narea+ triang_ar(r_coord(:,i_cnt), &
+	                                    r_dcoord(:,i_dedge(1,i_tnc,i_cnt)), &
+	                                    r_dcoord(:,i_dedge(2,i_tnc,i_cnt)))
+
+!---------- the upstream dual element's outer nodes
+
+	      r_vertx(1,2)= r_dcoord(1,i_dedge(1,i_tnc,i_cnt))- r_dalpha(1,i_dedge(1,i_tnc,i_cnt))
+	      r_vertx(2,2)= r_dcoord(2,i_dedge(1,i_tnc,i_cnt))- r_dalpha(2,i_dedge(1,i_tnc,i_cnt))
+	      r_vertx(1,3)= r_dcoord(1,i_dedge(2,i_tnc,i_cnt))- r_dalpha(1,i_dedge(2,i_tnc,i_cnt))
+	      r_vertx(2,3)= r_dcoord(2,i_dedge(2,i_tnc,i_cnt))- r_dalpha(2,i_dedge(2,i_tnc,i_cnt))
+
+!---------- calculate area of upstream dual triangle
+
+	      r_oarea= triang_ar(r_vertx(:,1),r_vertx(:,2),r_vertx(:,3))
+
+!---------- check if upstream value is outside of the domain
+
+	      r_1= r_ndcoor(:,i_tnc,i_cnt)- r_ndalpha(:,i_tnc,i_cnt)
+	      i_out= grid_domaincheck(p_mesh(i_time), r_1)
+
+!---------- take the intersection of the trajectory with the boundary as new upstream point
+
+	      out_domain: IF(i_out /= 0) then
+	        r_1= grid_boundintersect(p_mesh(i_time), &
+	             r_ndcoor(:,i_tnc,i_cnt), r_1, i_info=i_stat)
+	      END IF out_domain
+
+!---------- interpolate
+
+              no_intersect: IF(i_stat /= 0) THEN
+                r_tmp= 0.0_GRID_SR
+	      ELSE no_intersect
+	        r_tmp= grid_coordvalue(p_mesh(i_time), r_1, i_interpolorder=GRID_highorder)
+	        IF(abs(r_tmp) < GRID_EPS) THEN
+		  r_tmp= 0.0_GRID_SR
+		END IF
+              END IF no_intersect
+
+!---------- interpolate upstream concentration and calculate integral with quadrature rule
+
+	      r_val= r_val+ r_oarea* r_tmp
+
+	    END IF
+	    END DO ptch_loop
+
+!---------- now calculate concentration
+
+	    r_rside(i_cnt)= r_val/r_narea
+
+	  END DO node_loop
+
+	  RETURN
+	  END SUBROUTINE slm_aupstream
+!*****************************************************************
+	  FUNCTION triang_ar(r_coord1, r_coord2, r_coord3) RESULT (r_area)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord1, r_coord2, r_coord3
+	  REAL (KIND = GRID_SR)                                        :: r_area
+	  REAL (KIND = GRID_SR)                                        :: r_c
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_a, r_b
+
+!---------- calculate vector components
+
+	  r_a= r_coord2- r_coord1
+	  r_b= r_coord3- r_coord1
+
+!---------- calculate components (a,b,c) of cross product vector
+
+	  r_c= (r_a(1)* r_b(2)- r_a(2)* r_b(1))
+
+!---------- calculate area
+
+	  r_area= abs(r_c)* 0.5_GRID_SR
+
+	  RETURN
+	  END FUNCTION triang_ar
+
+!*****************************************************************
+	  SUBROUTINE create_newdualpoints(i_arlen, r_coord, &
+	                                  i_darlen, r_dcoord, i_dedge, r_ndcoor)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  INTEGER, INTENT(in)                                  :: i_darlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in) :: r_dcoord
+	  INTEGER, DIMENSION(2,GRID_patchelements,i_arlen), INTENT(in) :: i_dedge
+	  REAL (KIND = GRID_SR), DIMENSION(:,:,:), POINTER                      :: r_ndcoor
+
+	  REAL (KIND = GRID_SR)                                                 :: r_onethird=1./3.
+	  INTEGER                                              :: i_alct, i_cnt, i_tnc
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,GRID_elementnodes)    :: r_vertx
+
+!---------- allocate array for dual coordinates
+
+	  allocate(r_ndcoor(GRID_dimension,GRID_patchelements,i_arlen), stat=i_alct)
+	  not_allocdual: IF(i_alct /= 0) THEN
+	    CALL grid_error(c_error='[create_newdualpoints]: dual points array not allocated!')
+	  END IF not_allocdual
+
+!---------- main loop over the nodes of the new grid
+
+	  node_loop: DO i_cnt=1,i_arlen
+
+	    r_vertx= 0.0_GRID_SR
+
+!---------- the upstream dual element's center node
+
+	    r_vertx(:,1)= r_coord(:,i_cnt)
+
+!---------- now calculate the interference of the voronoi thing with elements from old mesh
+
+	    ptch_loop: DO i_tnc= 1, GRID_patchelements
+	    IF(i_dedge(1,i_tnc,i_cnt) == 0) THEN
+	      EXIT ptch_loop
+	    ELSE
+
+!---------- the upstream dual element's outer nodes
+
+	      r_vertx(:,2)= r_dcoord(:,i_dedge(1,i_tnc,i_cnt))
+	      r_vertx(:,3)= r_dcoord(:,i_dedge(2,i_tnc,i_cnt))
+
+!---------- calculate dual triangles center point
+
+	      r_ndcoor(:, i_tnc, i_cnt)= r_onethird* &
+	                                (r_vertx(:,1)+ r_vertx(:,2)+ r_vertx(:,3))
+	    END IF
+	    END DO ptch_loop
+	  END DO node_loop
+
+	  RETURN
+	  END SUBROUTINE create_newdualpoints
+
+	END MODULE SLM_advanced
diff --git a/flash2d/src/options/SLM_advanced.dualSWCosine.f90 b/flash2d/src/options/SLM_advanced.dualSWCosine.f90
new file mode 100644
index 0000000..88758c0
--- /dev/null
+++ b/flash2d/src/options/SLM_advanced.dualSWCosine.f90
@@ -0,0 +1,1227 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!   SLM_advanced
+! FUNCTION:
+!   provide advanced semi-Lagrangian routines
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!   slm_astep
+! FUNCTION:
+!   one step of the cell-integrated SLM algorithm
+! SYNTAX:
+!   CALL slm_step(int, real.arr, real.arr)
+! ON INPUT:
+!   ...
+! ON OUTPUT:
+! 
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!   slm_displace
+! FUNCTION:
+!   extrapolate the alpha, values for the displacements of the upstream
+!   points from the gridpoints
+! SYNTAX:
+!   CALL slm_displace(int, real.arr, real.arr)
+! ON INPUT:
+!   i_arlen: array length for the real arrays   integer
+!   r_coord: real array of xy-coordinates       real
+! ON OUTPUT:
+!   r_alpha: displacement vectors to each point real
+! CALLS:
+!   wind_field
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!   slm_update
+! FUNCTION:
+!   calculate the update to the velocity
+! SYNTAX:
+!   CALL slm_update(int, real.arr, real.arr)
+! ON INPUT:
+!   i_arlen: array length for the real arrays   integer
+!   r_rside: array with right hand side values  real
+! ON OUTPUT:
+!   r_udate: array with new (updated) gid values    real
+! CALLS:
+!
+! COMMENTS:
+!   this routine is trivial for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!   slm_upstream
+! FUNCTION:
+!   calculate right hand side of the equation (upstream values)
+! SYNTAX:
+!   CALL slm_upstream(int, real.arr, real.arr)
+! ON INPUT:
+!   i_arlen: array length for the real arrays   integer
+!   r_alpha: displacement vectors to each point real
+! ON OUTPUT:
+!   r_rside: array with right hand side values  real
+! CALLS:
+!
+! COMMENTS:
+!   this routine is just interpolation for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!   slm_interpolate
+! FUNCTION:
+!   do the interpolation
+! SYNTAX:
+!   CALL slm_interpolate(grid, int, real, real.arr, real.arr, real.arr)
+! ON INPUT:
+!   p_ogrid: grid handle to old grid (with data)    TYPE (grid_handle)
+!   r_fac:   factor at which point to interpolate   REAL
+!   i_arlen: array length for the following arrays  INTEGER
+!   r_coord: coordinate array (new grid)        REAL
+!   r_alpha: displacement array (corr. to r_coord)  REAL
+!   r_value: values on the old grid (array)     REAL
+! ON OUTPUT:
+!   r_rside: right hand side (interpolated)     REAL
+! CALLS:
+!
+! COMMENTS:
+!   this one is plain bi-cubic spline interpolation
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!   slm_interpolinit
+! FUNCTION:
+!   initialize the interpolation (conservative interpolation)
+! SYNTAX:
+!   CALL slm_interpolate(grid)
+! ON INPUT:
+!   p_ogrid: grid handle to old grid (with data)    TYPE (grid_handle)
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!   we set a global value present in this module:
+!   r_conservation: conservation value      REAL
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!   triang_ar
+! FUNCTION:
+!   calculate triangle area given by three coordinates
+! SYNTAX:
+!
+! ON INPUT:
+!
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!   slm_displace, slm_update, slm_upstream
+! COMMENTS:
+!
+! USES:
+!   FLASH_parameters, GRID_api, SLM_interpolation, ADV_wind, ADV_rhs
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!   1. original version     j. behrens  4/2002
+!   2. compliant to amatos 2.0  j. behrens  7/2003
+!   3. adapted to quasi-conservative SL  s.paruszewski 03/2015
+!
+!*****************************************************************
+    MODULE SLM_advanced
+      USE FLASH_parameters
+      USE MISC_timing
+      USE GRID_api
+      USE ADV_wind
+      USE ADV_rhs
+      USE SLM_initial
+!      USE IO_plot_vtu
+!      USE F95_LAPACK, ONLY:la_gels
+      PRIVATE
+      PUBLIC  :: slm_astep
+      !---------- Which type of boundary condition?
+!---------- 0 - dirichlet   1 - periodic   2 - reflecting
+
+      INTEGER ::i_boundMod = 2
+      CONTAINS
+!*****************************************************************
+      SUBROUTINE slm_astep(p_ghand, p_param, p_time, r_modtime, i_size, &
+                           r_coord, i_newsdepth)
+
+!---------- local declarations
+
+      IMPLICIT NONE
+
+      TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+      TYPE (control_struct), INTENT(in)                         :: p_param
+      TYPE (sw_info), INTENT(inout)                             :: p_time
+      REAL (KIND = GRID_SR), INTENT(in)                                          :: r_modtime
+      INTEGER, INTENT(in)                                       :: i_size
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size), INTENT(in)        :: r_coord
+      INTEGER, OPTIONAL, INTENT(in)                             :: i_newsdepth
+      
+      
+      INTEGER                                              ::  i_alct, i_dual 
+      REAL (KIND = GRID_SR), DIMENSION(i_size)              :: r_newArea, r_oldArea, r_upHeight, r_height, r_iniHeight
+      REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    ::  r_dualalpha, r_dualvelocity, r_dualhtmp
+      REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE    ::  r_dualalph, r_dualh
+      REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER        :: r_dualcoordinates
+      INTEGER, DIMENSION(:,:,:), POINTER   :: i_dualedges
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size)   :: r_upMomentum,   r_putHeight, r_alpha, r_iniGrad, r_oldHeight
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size)   :: r_momentum, r_updatedvl, r_newdHeight
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size)   :: r_velocity,  r_iniVelo, r_iniMom, r_upHeightTemp
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)           :: r_fac
+      INTEGER (KIND = GRID_SI)                                 :: i_valPoint, i_count, i_timecnt=0, i_cnt, j_cnt
+      INTEGER (KIND = GRID_SI), DIMENSION(GRID_patchelements, i_size) :: i_nodepatch
+      REAL (KIND = GRID_SR) ::     r_deltaT
+
+!---------- check size!
+
+      IF(i_size <= 0) THEN
+        IF(GRID_parameters%iolog > 0) &
+          write(GRID_parameters%iolog,*) 'INFO [slm_step]: Zero step size, returning to calling routine'
+        RETURN
+      END IF
+
+      
+        r_deltaT=p_param%num%r_deltatime
+        r_fac = 1.0_GRID_SR
+  
+!---------- create dual mesh
+
+      IF(present(i_newsdepth)) THEN
+        CALL grid_createdual(p_ghand(i_timeplus), i_dual, i_dualedges, &
+                             r_dualcoordinates, i_newsdepth= i_newsdepth, i_newlength=i_size)
+        IF(i_alct /= i_size) CALL grid_error(c_error='[slm_step]: incompatible new lengths...')
+      ELSE
+        CALL grid_createdual(p_ghand(i_timeplus), i_dual, i_dualedges, &
+                             r_dualcoordinates)
+      END IF
+
+
+!---------- allocate arrays for dual displacements
+      allocate(r_dualalpha(GRID_dimension,i_dual),r_dualhtmp(GRID_dimension,i_dual),&
+               r_dualh(i_dual), r_dualvelocity(GRID_dimension,i_dual), stat=i_alct)
+      not_allocdual: IF(i_alct /= 0) THEN
+        CALL grid_error(40)
+      END IF not_allocdual
+
+!---------- get old velocities of grid points
+     CALL grid_getinfo(p_ghand(i_timeplus), r_nodevalues = r_velocity,&
+        i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+
+
+!--- just for debugging
+ !    CALL grid_getinfo(p_ghand(i_timeplus), i_nodepatch = i_nodepatch)
+ !   DO i_cnt= 1, i_size 
+ !       DO j_cnt=1, GRID_patchelements
+ !     WRITE(*,*) r_coord(:,i_cnt), 'Patchelement', i_nodepatch(j_cnt, i_cnt)
+ !       END DO
+ !   END DO
+
+!-SLM--------- calculate (interpolate) old (->OLD TIME) velocities of dual points      
+!---TODO--- Check for a better way to test if it is initial time
+    IF(r_modtime/=0.0_GRID_SR) THEN
+          CALL  slm_ainterpolate(p_ghand, r_fac, i_time, i_dual, i_size, GRID_ucomp, &
+                                r_coord, r_dualcoordinates, r_dualvelocity(1,:))
+          CALL  slm_ainterpolate(p_ghand, r_fac, i_time, i_dual, i_size, GRID_vcomp, &
+                                r_coord, r_dualcoordinates, r_dualvelocity(2,:))        
+                                                                      
+    ELSE
+          CALL  slm_initvelo(r_dualcoordinates, i_dual, r_dualvelocity)
+    END IF
+              
+  
+!-SLM--------- calculate trajectory pieces (displacements) alphas
+      CALL slm_adisplace(p_param, i_size, r_coord, r_velocity, r_alpha, &
+                         i_dual, r_dualcoordinates,r_dualvelocity, r_dualalpha, &
+                         r_time=r_modtime)
+
+!-SLM--------- calculate upstream values for velocity, momentum and height (also area calculations)  
+      CALL slm_aupstream(p_ghand, i_time, i_size, r_coord, r_alpha, &
+                                  i_dual, r_dualcoordinates, r_dualalpha, &
+                i_dualedges, r_upHeight, r_upMomentum, r_oldArea, r_newArea)
+     
+
+!-SLM--------Solving the 2D shallow water equations in conservativ form
+
+!-SLM--------- calculate new grid values for h 
+ 
+   ! Classic version
+   CALL slm_calculateH(i_size, r_oldArea, r_newArea, r_upHeight, r_height)
+         
+!-SLM--------- interpolate h values in the dual cell (for derivative calculations)
+      CALL  slm_ainterpolate(p_ghand, r_fac, i_time, i_dual, i_size, GRID_h, &
+                                r_coord, r_dualcoordinates, r_dualhtmp(1,:))
+       r_dualh=r_dualhtmp(1,:)
+ 
+!-SLM--------- calculate derivative in space of h (needed in the momentum eq)   
+     CALL calcDrvtMeanPatch(i_size, r_coord, i_dual, r_dualcoordinates,  i_dualedges,r_height, &
+                              r_dualh, r_newdHeight)
+
+    
+      ! For debugging using the initial analytical gradient
+   !    CALL slm_initGrad(r_coord,i_size, r_iniGrad)              
+    !     r_newdHeight=r_iniGrad     
+                               
+      
+!-SLM--------- calculate new grid values for momentum
+    ! Classic version
+    CALL slm_calculateMom(i_size, r_oldArea, r_newArea, r_upMomentum, r_upHeight, r_deltaT, r_height,&
+        r_newdHeight, r_momentum)
+
+!-SLM--------- recalculate velocity with hu/h     
+     CALL slm_recalculateVelocity(i_size, r_height, r_momentum, r_updatedvl)
+
+
+      r_putHeight(1,:)=r_height        
+   
+        
+!---------- destroy dual mesh
+      CALL grid_destroydual(i_dual, i_dualedges, r_dualcoordinates)
+
+!-SLM--------- write new values for velocity, momentum and height in grid-variables
+
+      CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_updatedvl, &
+                     i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+      CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_momentum, &
+                     i_arraypoint=(/ GRID_hu, GRID_hv /))
+      CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_putHeight, &
+                     i_arraypoint=(/ GRID_h /))
+
+
+!-SLM--------- deallocate work arrays
+
+      deallocate(r_dualalpha, r_dualhtmp, r_dualh, r_dualvelocity)
+      
+        i_timecnt=i_timecnt+1
+    
+      END SUBROUTINE slm_astep
+
+!*****************************************************************
+      SUBROUTINE slm_adisplace(p_param, i_arlen, r_coord, r_velocity, r_alpha, &
+                              i_darlen, r_dcoord,r_dvelocity, r_dalpha, r_time)
+
+!---------- local declarations
+
+      IMPLICIT NONE
+
+      TYPE (control_struct), INTENT(in)                                       :: p_param
+      INTEGER, INTENT(in)                                                     :: i_arlen
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)    :: r_coord, r_velocity
+      INTEGER, INTENT(in)                                                     :: i_darlen
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in)   :: r_dcoord, r_dvelocity
+      REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                             :: r_time
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(out)  :: r_dalpha
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out)   :: r_alpha
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                        :: r_axy
+      REAL (KIND = GRID_SR)                                                   :: r_dt0
+      INTEGER                                                                 :: i_cnt1
+
+!---------- set constants
+
+      r_dt0= p_param%num%r_deltatime
+
+!---------- calculate in an iteration process the displacements
+
+      unknown_loop: DO i_cnt1=1,i_arlen
+        r_axy= 0.0_GRID_SR
+
+!---------- instead windfield, we use the updated velocities by hv/v
+          r_axy= r_dt0* r_velocity(:, i_cnt1)
+           r_alpha(:,i_cnt1)= r_axy
+      END DO unknown_loop
+       
+
+!---------- calculate the displacements for the dual nodes
+
+      dual_loop: DO i_cnt1=1,i_darlen
+        r_axy= 0.0_GRID_SR
+
+           r_axy= r_dt0* r_dvelocity(:, i_cnt1)
+
+        r_dalpha(:,i_cnt1)= r_axy
+      END DO dual_loop
+
+      RETURN
+      END SUBROUTINE slm_adisplace
+
+!*****************************************************************
+      SUBROUTINE slm_aupdate(p_param, i_arlen, r_coord, r_rside, r_udate, r_time)
+
+!---------- local declarations
+
+      IMPLICIT NONE
+
+      TYPE (control_struct), INTENT(in)                   :: p_param
+      INTEGER, INTENT(in)                                 :: i_arlen
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+      REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                :: r_rside
+      REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_udate
+      REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                          :: r_time
+      INTEGER                                             :: i_cnt
+      REAL (KIND = GRID_SR)                                                :: r_dt
+
+!---------- including a non-zero right hand side, we have
+
+      r_dt= p_param%num%r_deltatime
+
+      main_loop: DO i_cnt=1, i_arlen
+        r_udate(i_cnt)= r_rside(i_cnt)+ r_dt* slm_righthand(r_coord(:,i_cnt))
+      END DO main_loop
+
+      RETURN
+      END SUBROUTINE slm_aupdate
+
+!*****************************************************************
+      SUBROUTINE slm_aupstream(p_mesh, i_time, i_arlen, r_coord, r_alpha, &
+                                 i_darlen, r_dcoord, r_dalpha, &
+                                 i_dedge, r_upHeight, r_upMomentum, r_uparea, r_dwarea)
+
+!---------- local declarations
+
+      IMPLICIT NONE
+
+      INTEGER, INTENT(in)                                                   :: i_arlen, i_time
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_alpha
+      INTEGER, INTENT(in)                                                   :: i_darlen
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in) :: r_dcoord
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in) :: r_dalpha
+      INTEGER, DIMENSION(2,GRID_patchelements,i_arlen), INTENT(in)          :: i_dedge
+      REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)                :: r_uparea, r_dwarea
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_upMomentum
+      REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)                :: r_upHeight
+      TYPE (grid_handle), DIMENSION(GRID_timesteps)                         :: p_mesh
+      INTEGER                                                               :: i_cnt, j_cnt, i_tnc, i_out
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_1, r_2, r_3, r_fac
+      REAL (KIND = GRID_SR)                                                 :: r_oarea, r_narea
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,GRID_elementnodes)    :: r_vertx
+      REAL (KIND = GRID_SR)                                                 :: r_val, r_tmp
+
+!---------- set factor (at which point of trajectory shall i interpolate)
+
+      r_fac= 1.0_GRID_SR
+ 
+!---------- interpolation of node values on upstream position
+
+      CALL slm_ainterpolateUpstrm(p_mesh, r_fac, i_time, i_arlen, GRID_hu, r_coord, &
+                            r_alpha, r_upMomentum(1,:))
+      CALL slm_ainterpolateUpstrm(p_mesh, r_fac, i_time, i_arlen, GRID_hv, r_coord, &
+                            r_alpha, r_upMomentum(2,:))
+      CALL slm_ainterpolateUpstrm(p_mesh, r_fac, i_time, i_arlen, GRID_h, r_coord, &
+                            r_alpha, r_upHeight)
+
+!---------- loop over nodes
+
+       node_loop: DO i_cnt= 1, i_arlen
+        r_oarea= 0.
+        r_narea= 0.
+        ptch_loop: DO j_cnt= 1, GRID_patchelements
+          IF(i_dedge(1,j_cnt,i_cnt) == 0) THEN
+            EXIT ptch_loop
+          ELSE
+
+!---------- the upstream dual element
+
+            r_1= r_coord(:,i_cnt)- r_alpha(:,i_cnt)
+            r_2= r_dcoord(:,i_dedge(1,j_cnt,i_cnt))- r_dalpha(:,i_dedge(1,j_cnt,i_cnt))
+            r_3= r_dcoord(:,i_dedge(2,j_cnt,i_cnt))- r_dalpha(:,i_dedge(2,j_cnt,i_cnt))
+            r_oarea= r_oarea+ triang_ar(r_1, r_2, r_3)
+
+  !  WRITE(*,*) i_cnt, r_1(1), r_1(2), r_2(1), r_2(2), r_3(1), r_3(2), r_oarea
+!---------- the downstream dual element
+
+            r_1= r_coord(:,i_cnt)
+            r_2= r_dcoord(:,i_dedge(1,j_cnt,i_cnt))
+            r_3= r_dcoord(:,i_dedge(2,j_cnt,i_cnt))
+            r_narea= r_narea+ triang_ar(r_1, r_2, r_3)
+            
+  !  WRITE(*,*) 'Downstream: ', r_narea , 'Upstream:', r_oarea, 'Verhältnis', (r_narea/r_oarea)
+           
+           
+            
+          END IF
+        END DO ptch_loop
+        
+        IF(abs((r_narea/r_oarea)-1.0)>0.1) THEN
+       ! WRITE(*,*) 'kritisches Flächenverhältnis: ', (r_narea/r_oarea), 'zu Knoten Nummer: ' , i_cnt
+        END IF
+!--------- sum up the total area for each dualcell        
+        r_uparea(i_cnt)= r_oarea
+        r_dwarea(i_cnt)= r_narea
+      END DO node_loop
+
+      RETURN
+      END SUBROUTINE slm_aupstream
+
+!*****************************************************************
+      SUBROUTINE slm_ainterpolateUpstrm(p_mesh, r_fac, i_timept, i_arlen, i_val, &
+                                 r_coord, r_alpha, r_rside)
+
+!---------- local declarations
+
+      IMPLICIT NONE
+
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in)         :: r_fac
+      INTEGER (KIND = GRID_SI), INTENT(in)                                 :: i_timept
+      INTEGER (KIND = GRID_SI), INTENT(in)                                 :: i_arlen
+      INTEGER (KIND = GRID_SI), INTENT(in)                                 :: i_val
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+      REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+      REAL (KIND = GRID_SR), DIMENSION(i_arlen)                            :: r_reflectHackX, r_reflectHackY
+      TYPE (grid_handle), DIMENSION(GRID_timesteps)                        :: p_mesh
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen)             :: r_upstr
+      REAL (KIND = GRID_SR), DIMENSION(GRID_nodevalues)                    :: r_tval
+      INTEGER, DIMENSION(GRID_elementnodes)                                :: i_ttmp
+      REAL (KIND = GRID_SR)                                                :: r_eps, r_max, r_min, r_tmp, &
+      r_areaHeight, r_areaWidth, r_boundCoordRight, r_boundCoordLeft, r_boundCoordTop, r_boundCoordBottom
+      INTEGER                                                              :: i_cnt, i_alct
+      INTEGER                                                              :: i_ind, i_tim, &
+        j_cnt, i_out, i_stat
+        
+!---------- initialize constant
+
+      r_eps= GRID_EPS
+      i_tim= p_mesh(i_timept)%i_timetag
+
+
+    
+
+!---------- calculate upstream coordinates
+
+      dim_loop: DO i_cnt=1, GRID_dimension
+        r_upstr(i_cnt,:) = r_coord(i_cnt,:)- r_fac(i_cnt)* r_alpha(i_cnt,:)
+      END DO dim_loop
+
+    IF( i_boundMod > 0) THEN
+!-------- calculation area is an envelope rectangular 
+      r_boundCoordRight = 25000.0_GRID_SR
+       r_boundCoordTop = r_boundCoordRight
+       r_boundCoordLeft= 0000000.0_GRID_SR
+       r_boundCoordBottom = r_boundCoordLeft
+       r_areaHeight = r_boundCoordTop - r_boundCoordBottom
+       r_areaWidth = r_boundCoordRight - r_boundCoordLeft
+    END IF
+    
+    IF(i_boundMod == 1) THEN  
+!----------  P E R I O D I C  B O U N D A R I E S !!! THIS IS A DIRTY HACK!    
+     DO i_cnt=1, i_arlen    
+             
+        IF(r_upstr(1,i_cnt) >= r_boundCoordRight) THEN
+          r_upstr(1,i_cnt)= r_upstr(1,i_cnt)- r_areaWidth
+        END IF
+        IF(r_upstr(1,i_cnt) < r_boundCoordLeft) THEN
+        r_upstr(1,i_cnt)= r_upstr(1,i_cnt)+ r_areaWidth
+        END IF
+        IF(r_upstr(2,i_cnt) >= r_boundCoordTop) THEN
+        r_upstr(2,i_cnt)= r_upstr(2,i_cnt)- r_areaHeight
+        END IF
+        IF(r_upstr(2,i_cnt) < r_boundCoordBottom) THEN
+        r_upstr(2,i_cnt)= r_upstr(2,i_cnt)+ r_areaHeight
+        END IF
+     END DO
+     
+    ELSE IF (i_boundMod == 2) THEN
+!----------  R E F L E C T I N G  B O U N D A R I E S !!! THIS IS A DIRTY HACK!    
+     DO i_cnt=1, i_arlen
+     
+        r_reflectHackX(i_cnt)=1.0
+        r_reflectHackY(i_cnt)=1.0
+        IF(r_upstr(1,i_cnt) > r_boundCoordRight) THEN
+        r_upstr(1,i_cnt)= r_boundCoordRight-abs(r_upstr(1,i_cnt)-r_boundCoordRight)
+        r_reflectHackX(i_cnt)=-1.0
+        END IF
+        IF(r_upstr(1,i_cnt) < r_boundCoordLeft) THEN
+        r_upstr(1,i_cnt)= r_boundCoordLeft+abs(r_boundCoordLeft-r_upstr(1,i_cnt)) 
+        r_reflectHackX(i_cnt)=-1.0
+        END IF
+        IF(r_upstr(2,i_cnt) > r_boundCoordRight) THEN
+        r_upstr(2,i_cnt)=r_boundCoordRight-abs(r_upstr(2,i_cnt)-r_boundCoordRight) 
+        r_reflectHackY(i_cnt)=-1.0 
+        END IF
+        IF(r_upstr(2,i_cnt) < r_boundCoordLeft) THEN
+        r_upstr(2,i_cnt)= r_boundCoordLeft+abs(r_boundCoordLeft-r_upstr(2,i_cnt)) 
+        r_reflectHackY(i_cnt)=-1.0
+        END IF
+     END DO
+    
+    END IF
+
+!---------- loop over nodes: find element containing upstream point
+
+      node_loop: DO i_cnt=1, i_arlen
+
+  
+  
+   IF(i_boundMod == 0) THEN
+   
+!---------- check if upstream value is outside of the domain (-1) or inside (0)
+
+        i_out= grid_domaincheck(p_mesh(i_timept), r_upstr(:,i_cnt))
+
+!---------- take the intersection of the trajectory with the boundary as new upstream point
+
+        out_domain: IF(i_out /= 0) then
+           r_upstr(:,i_cnt)= grid_boundintersect(p_mesh(i_timept), &
+                            r_coord(:,i_cnt), r_upstr(:,i_cnt), i_info=i_stat)
+               no_intersect: IF(i_stat /= 0) THEN
+                  r_rside(i_cnt)= 0.0
+                  CYCLE node_loop
+               END IF no_intersect
+        END IF out_domain
+  
+!   ELSE 
+ !       r_rside(i_cnt)= 0.0
+   END IF
+
+
+!---------- interpolate
+        r_tmp= grid_coordvalue(p_mesh(i_timept), r_upstr(:,i_cnt), &
+               i_interpolorder=GRID_highorder, i_valpoint=i_val, &
+                i_index=i_ind, i_domaincheck=0, l_relative=.FALSE., l_sfcorder=.FALSE.)
+
+
+        index_valid: IF(i_ind > 0) THEN
+
+!---------- get nodes of element surrounding r_upstr
+
+           CALL grid_getiteminfo(i_ind, 'elmt', i_arrlen=GRID_elementnodes, i_nodes=i_ttmp)
+
+!---------- get values at nodes of element surrounding r_upstr, and obtain min/max
+
+               r_min= 0.0_GRID_SR; r_max= 0.0_GRID_SR
+               elmt_loop: DO j_cnt=1,GRID_elementnodes
+                  CALL grid_getiteminfo(i_ttmp(j_cnt), 'node', i_arrlen=GRID_nodevalues, &
+                                        r_values= r_tval, i_time=i_tim)
+                 
+                 
+                  r_min= MIN(r_min, r_tval(i_val))
+                  r_max= MAX(r_max, r_tval(i_val))        
+               END DO elmt_loop
+
+!---------- clip value
+
+               IF(r_tmp > r_max) THEN
+                  r_tmp= r_max
+               ELSE IF(r_tmp < r_min) THEN
+                  r_tmp= r_min
+               END IF
+        END IF index_valid
+
+!---------- set interpolation value
+
+        r_rside(i_cnt)= r_tmp
+     
+        small_val: IF(abs(r_rside(i_cnt)) < r_eps) THEN
+               r_rside(i_cnt)= 0.0_GRID_SR
+        END IF small_val
+
+      END DO node_loop
+
+!--- Tausche Vorzeichen bei der Geschwindigkeit und dem Impuls
+    IF(i_boundMod == 2)THEN
+    
+         IF (i_val.EQ.GRID_hv) THEN 
+           r_rside(:)=r_reflectHackY(:)*r_rside(:)
+           END IF
+ 
+         IF (i_val.EQ.GRID_hu )THEN 
+             r_rside(:)=r_reflectHackX(:)*r_rside(:)
+         END IF
+ 
+    END IF
+    
+      RETURN
+      END SUBROUTINE slm_ainterpolateUpstrm
+
+
+
+!*****************************************************************
+
+
+SUBROUTINE slm_ainterpolate(p_mesh, r_fac, i_timept, i_arlen, i_length, i_val, &
+                                r_coord, r_nodeOriginal, r_rside)
+
+!---------- local declarations
+
+      IMPLICIT NONE
+
+      TYPE (grid_handle), DIMENSION(GRID_timesteps)                        :: p_mesh
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in)         :: r_fac
+      INTEGER (KIND = GRID_SI), INTENT(in)                                 :: i_timept
+      INTEGER (KIND = GRID_SI), INTENT(in)                                 :: i_arlen, i_length
+      INTEGER (KIND = GRID_SI), INTENT(in)         :: i_val
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_nodeOriginal
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_length), INTENT(in) :: r_coord
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen)             :: r_node
+      REAL (KIND = GRID_SR), DIMENSION(i_arlen)                            :: r_reflectHackX, r_reflectHackY
+      REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+      REAL (KIND = GRID_SR), DIMENSION(GRID_nodevalues)                    :: r_tval
+      INTEGER, DIMENSION(GRID_elementnodes)               :: i_ttmp
+      REAL (KIND = GRID_SR)                                                :: r_eps, r_max, r_min, r_tmp, &
+        r_boundCoordRight, r_boundCoordLeft, r_areaHeight, r_areaWidth, r_boundCoordBottom, r_boundCoordTop
+      INTEGER                                             :: i_cnt, i_alct
+      INTEGER                                             :: i_ind, i_tim, &
+        j_cnt, i_out, i_stat
+
+!---------- initialize constant
+
+      r_eps= GRID_EPS
+      i_tim= p_mesh(i_timept)%i_timetag
+
+!---------- loop over nodes: find element containing point
+    
+
+    IF(i_boundMod > 0) THEN
+       !-------- calculation area is an envelope rectangular 
+  !     r_boundCoordRight = 2000000.0_GRID_SR
+  !     r_boundCoordRight = 6.283185_GRID_SR
+        r_boundCoordRight = 25000.0_GRID_SR
+       r_boundCoordTop = r_boundCoordRight
+       r_boundCoordLeft= 0000000.0_GRID_SR
+       r_boundCoordBottom = r_boundCoordLeft
+       r_areaHeight = r_boundCoordTop - r_boundCoordBottom
+       r_areaWidth = r_boundCoordRight - r_boundCoordLeft
+    END IF       
+
+      node_loop: DO i_cnt=1, i_arlen
+
+            r_node(:,i_cnt)=r_nodeOriginal(:,i_cnt)
+
+    IF(i_boundMod == 1) THEN
+    
+    !----------  P E R I O D I C  B O U N D A R I E S !!! THIS IS A DIRTY HACK!         
+        IF(r_node(1,i_cnt) >= r_boundCoordRight) THEN
+          r_node(1,i_cnt)= r_node(1,i_cnt)- r_areaWidth
+         !WRITE(*,*) r_node(1,i_cnt)
+        END IF
+        IF(r_node(1,i_cnt) < r_boundCoordLeft) THEN
+        r_node(1,i_cnt)= r_node(1,i_cnt)+ r_areaWidth
+         !WRITE(*,*) r_node(1,i_cnt)
+        END IF
+        IF(r_node(2,i_cnt) >= r_boundCoordTop) THEN
+        r_node(2,i_cnt)= r_node(2,i_cnt)- r_areaHeight
+        END IF
+        IF(r_node(2,i_cnt) < r_boundCoordBottom) THEN
+        r_node(2,i_cnt)= r_node(2,i_cnt)+ r_areaHeight
+        END IF
+    
+   END IF
+
+    IF(i_boundMod == 2) THEN
+!----------  R E F L E C T I N G  B O U N D A R I E S !!! THIS IS A DIRTY HACK!   
+        r_reflectHackX(i_cnt)=1.0
+        r_reflectHackY(i_cnt)=1.0
+        IF(r_node(1,i_cnt) > r_boundCoordRight) THEN
+        r_node(1,i_cnt)= r_boundCoordRight-abs(r_node(1,i_cnt)-r_boundCoordRight)
+        r_reflectHackX(i_cnt)=-1.0
+        END IF
+        IF(r_node(1,i_cnt) < r_boundCoordLeft) THEN
+        r_node(1,i_cnt)= r_boundCoordLeft+abs(r_boundCoordLeft-r_node(1,i_cnt)) 
+        r_reflectHackX(i_cnt)=-1.0
+        END IF
+        IF(r_node(2,i_cnt) > r_boundCoordRight) THEN
+        r_node(2,i_cnt)=r_boundCoordRight-abs(r_node(2,i_cnt)-r_boundCoordRight)
+        r_reflectHackY(i_cnt)=-1.0 
+        END IF
+        IF(r_node(2,i_cnt) < r_boundCoordLeft) THEN 
+        r_node(2,i_cnt)= r_boundCoordLeft+abs(r_boundCoordLeft-r_node(2,i_cnt)) 
+        r_reflectHackY(i_cnt)=-1.0
+        END IF
+     END IF
+        
+    
+
+    IF(i_boundMod == 0) THEN
+!---------- check if upstream value is outside of the domain
+        i_out= grid_domaincheck(p_mesh(i_timept), r_node(:,i_cnt))
+
+!---------- take the intersection of the trajectory with the boundary as new upstream point
+
+        out_domain: IF(i_out /= 0) then
+           r_node(:,i_cnt)= grid_boundintersect(p_mesh(i_timept), &
+                            r_coord(:,i_cnt), r_node(:,i_cnt), i_info=i_stat)
+               no_intersect: IF(i_stat /= 0) THEN
+                  r_rside(i_cnt)= 0.0_GRID_SR
+                  CYCLE node_loop
+               END IF no_intersect
+        END IF out_domain
+ !   ELSE 
+    
+ !        r_rside(i_cnt)= 0.0_GRID_SR
+    
+    END IF
+
+!---------- interpolate
+
+
+
+        r_tmp= grid_coordvalue(p_mesh(i_timept), r_node(:,i_cnt), &
+               i_interpolorder=GRID_highorder, i_valpoint=i_val, &
+                i_index=i_ind, i_domaincheck=0, l_relative=.FALSE., l_sfcorder=.FALSE.)
+
+
+        index_valid: IF(i_ind > 0) THEN
+
+!---------- get nodes of element surrounding r_node
+
+           CALL grid_getiteminfo(i_ind, 'elmt', i_arrlen=GRID_elementnodes, i_nodes=i_ttmp)
+
+!---------- get values at nodes of element surrounding r_node, and obtain min/max
+
+               r_min= 0.0_GRID_SR; r_max= 0.0_GRID_SR
+               elmt_loop: DO j_cnt=1,GRID_elementnodes
+                  CALL grid_getiteminfo(i_ttmp(j_cnt), 'node', i_arrlen=GRID_nodevalues, &
+                                        r_values= r_tval, i_time=i_tim)
+                  r_min= MIN(r_min, r_tval(i_val))
+                  r_max= MAX(r_max, r_tval(i_val))        
+               END DO elmt_loop
+
+!---------- clip value
+
+               IF(r_tmp > r_max) THEN
+                  r_tmp= r_max
+               ELSE IF(r_tmp < r_min) THEN
+                  r_tmp= r_min
+               END IF
+        END IF index_valid
+
+!---------- set interpolation value
+
+        r_rside(i_cnt)= r_tmp
+     
+        small_val: IF(abs(r_rside(i_cnt)) < r_eps) THEN
+               r_rside(i_cnt)= 0.0_GRID_SR
+        END IF small_val
+
+      END DO node_loop
+
+   IF((i_boundMod == 2))THEN
+      IF (i_val.EQ.GRID_vcomp ) THEN 
+       r_rside(:)=r_reflectHackY(:)*r_rside(:)
+       END IF
+ 
+         IF (i_val.EQ.GRID_ucomp )THEN 
+             r_rside(:)=r_reflectHackX(:)*r_rside(:)
+         END IF
+ 
+       END IF
+
+      RETURN
+      END SUBROUTINE slm_ainterpolate
+      
+    
+      
+     
+!*****************************************************************
+      
+      
+      FUNCTION triang_ar(r_coord1, r_coord2, r_coord3) RESULT (r_area)
+
+!---------- local declarations
+
+      IMPLICIT NONE
+
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord1, r_coord2, r_coord3
+      REAL (KIND = GRID_SR)                                        :: r_area
+      REAL (KIND = GRID_SR)                                        :: r_c
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_a, r_b
+
+!---------- calculate vector components
+
+      r_a= r_coord2- r_coord1
+      r_b= r_coord3- r_coord1
+
+!---------- calculate components (a,b,c) of cross product vector
+
+      r_c= (r_a(1)* r_b(2)- r_a(2)* r_b(1))
+
+!---------- calculate area
+
+      r_area= abs(r_c)* 0.5_GRID_SR
+
+      RETURN
+      END FUNCTION triang_ar
+
+
+!*****************************************************************
+     SUBROUTINE slm_recalculateVelocity(i_arlen, r_height, r_momentum, r_updatedvl)
+
+
+!---------- local declarations
+
+      IMPLICIT NONE
+
+      INTEGER, INTENT(in)                                                    :: i_arlen
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)   :: r_momentum
+      REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                  :: r_height
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out)  :: r_updatedvl
+      INTEGER                                                                :: i_count, i_countDim
+      REAL (KIND = GRID_SR), DIMENSION(i_arlen)                             :: r_corrHeight
+          
+    DO i_count=1, i_arlen
+        DO i_countDim=1, GRID_dimension
+        
+            IF(abs(r_height(i_count))< GRID_eps) THEN
+              WRITE(*,*) 'Warning in slm_recalculateVelocity: Height goes to zero for element'
+              WRITE(*,*) i_count
+              r_updatedvl(i_countDim,i_count)=0.0_GRID_SR
+            ELSE
+             r_corrHeight(i_count)=r_height(i_count)
+             r_updatedvl(i_countDim,i_count)=r_momentum(i_countDim,i_count)/r_corrHeight(i_count)
+            END IF
+
+
+            IF(abs(r_updatedvl(i_countDim,i_count))<GRID_eps) THEN
+            r_updatedvl(i_countDim,i_count)=0.0_GRID_SR
+            END IF
+
+
+        END DO
+    END DO
+
+    END SUBROUTINE slm_recalculateVelocity
+
+!*****************************************************************
+     SUBROUTINE slm_calculateH(i_arlen, r_oldArea, r_newArea, r_upHeight, r_newHeight)
+
+
+!---------- local declarations
+
+      IMPLICIT NONE
+
+      INTEGER, INTENT(in)                                                    :: i_arlen
+      REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                  :: r_upHeight, r_oldArea, r_newArea
+      REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)                 :: r_newHeight
+      INTEGER                                                                :: i_count
+
+    DO i_count=1, i_arlen
+    
+        IF(abs(r_newArea(i_count)).lt.GRID_eps)THEN
+          !  WRITE(*,*) (r_newArea(i_count))
+            WRITE(*,*) 'Warning your initial mesh is too fine for the machine precision'
+        END IF
+
+
+          r_newHeight(i_count)= abs(r_oldArea(i_count))/abs(r_newArea(i_count)) * r_upHeight(i_count)
+  
+            IF(abs(r_newHeight(i_count))<GRID_eps) THEN
+                 r_newHeight(i_count)=0.0_GRID_SR
+            END IF
+
+    END DO
+
+    END SUBROUTINE slm_calculateH
+
+
+!*****************************************************************
+    SUBROUTINE slm_calculateMom(i_arlen, r_oldArea, r_newArea, r_upMomentum, r_upHeight, &
+         r_deltaT, r_newHeight, r_newHeightDvt, r_momentum)
+
+
+!---------- local declarations
+
+    IMPLICIT NONE
+
+      INTEGER, INTENT(in)                                                    :: i_arlen
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)   :: r_newHeightDvt, r_upMomentum
+      REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                  :: r_upHeight, r_newHeight
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out)  :: r_momentum
+       REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)                :: r_oldArea, r_newArea
+      INTEGER                                                                :: i_count, i_countDim
+      REAL (KIND= GRID_SR), INTENT(in) ::   r_deltaT
+    
+
+    DO i_count=1, i_arlen
+        Do i_countDim=1, GRID_dimension
+
+            IF(abs(r_newArea(i_count)).lt.GRID_eps)THEN
+             WRITE(*,*) 'Warning your initial mesh is to fine for the machine precision'
+            END IF
+
+            
+             r_momentum(i_countDim,i_count) = abs(r_oldArea(i_count))/abs(r_newArea(i_count)) * &
+                  r_upMomentum(i_countDim,i_count)- r_deltaT*GRID_grav*r_newHeight(i_count)*&
+                   r_newHeightDvt(i_countDim, i_count)
+                   
+
+             IF(abs(r_momentum(i_countDim,i_count))<GRID_eps) THEN
+                r_momentum(i_countDim,i_count)=0.0_GRID_SR
+             END IF
+        END DO
+    END DO
+
+
+    END SUBROUTINE slm_calculateMom
+    
+    
+!***************************************************************** 
+!2 try mit der Methode der kleinsten Quadrate LAPACK95 needed
+!   SUBROUTINE  calculateDerivative(i_arlen, r_coord, i_darlen, r_dcoord, i_dedge, r_dwnHeight, &
+!                                 r_dHeight, r_newHeightDvt)
+!---------- local declarations
+! 
+!      IMPLICIT NONE
+!     INTEGER, INTENT(in)                                                     ::  i_arlen, i_darlen                      
+!     REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out)   ::  r_newHeightDvt  
+!     REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                   ::  r_dwnHeight 
+!      REAL (KIND = GRID_SR), DIMENSION(i_darlen), INTENT(in)                  :: r_dHeight
+!     REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)    :: r_coord
+!     REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in)   :: r_dcoord
+!     REAL (KIND = GRID_SR)                                                   :: r_hxtmp, r_hytmp, r_leftH, r_rightH,  &
+!                                                                               r_area, r_globalarea
+!     REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                       :: r_1, r_2, r_3 , r_centr
+!     REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,2*GRID_patchelements) :: r_dualnod
+!     REAL (KIND = GRID_SR), DIMENSION(2*GRID_patchelements) :: r_vals
+!     INTEGER, DIMENSION(:,:,:), POINTER, INTENT(in)                                  :: i_dedge
+!     INTEGER, DIMENSION(2*GRID_patchelements)                                  :: i_dualnodNe
+!     INTEGER                                                                :: i_cnt, j_cnt, i_cntt, i_nneigb                
+!     LOGICAL                                                                :: l_inside1, l_inside2
+!    
+!        
+!---------- loop over nodes (and their dual cells)
+!      node_loop: DO i_cnt= 1, i_arlen
+!          i_nneigb=0
+!          r_dualnod=0.0
+!          r_vals=0.0
+!          i_dualnodNe=0
+!          r_centr=0.0
+!          l_inside1=.false.
+!          l_inside2=.false.
+!          r_area=0.0
+!          r_globalarea=0.0
+!         
+!---------- loop over ther patches of the node's dual cell   
+!       ptch_loop: DO j_cnt= 1, GRID_patchelements
+!---------- if there is no edge entry, there is no further patch for that dualcell         
+!         IF(i_dedge(1,j_cnt,i_cnt) == 0) THEN
+!           EXIT ptch_loop
+!         ELSE
+!---------- the coordinates of the points that form the dual cell (+ r_coord(i_cnt))
+!           r_1= r_dcoord(:,i_dedge(1,j_cnt,i_cnt))
+!           r_2= r_dcoord(:,i_dedge(2,j_cnt,i_cnt))
+!           r_3= r_coord(:,i_cnt)
+!           r_area= triang_ar(r_3, r_1, r_2)
+!           r_globalarea=r_globalarea+r_area
+!    
+!---------- have a look if the node is already known and if not, put it into the list of neighbnodes
+!     
+!         IF(i_nneigb==0)THEN
+!            i_nneigb  =  i_nneigb + 1_GRID_SI
+!            i_dualnodNe(i_nneigb) = i_dedge(1,j_cnt,i_cnt)
+!            r_dualnod(:,i_nneigb) = r_1   
+!            i_nneigb  =  i_nneigb + 1_GRID_SI
+!            i_dualnodNe(i_nneigb) = i_dedge(1,j_cnt,i_cnt)
+!            r_dualnod(:,i_nneigb) = r_2 
+!         ELSE
+!       
+!       
+!           knownneigb: DO i_cntt=1, i_nneigb
+!              IF (.NOT. l_inside1) THEN
+!                IF (.NOT.(( r_dualnod(1,i_cntt).eq.r_1(1)).AND.( r_dualnod(2,i_cntt).eq.r_1(2)) ))THEN
+!                  i_nneigb  =  i_nneigb + 1_GRID_SI
+!                  i_dualnodNe(i_nneigb) = i_dedge(1,j_cnt,i_cnt)
+!                  r_dualnod(:,i_nneigb) = r_1   
+!                  l_inside1=.true.
+!                END IF
+!              END IF
+!              IF(.NOT.l_inside2)THEN  
+!                IF(.NOT.(( r_dualnod(1,i_cntt).eq.r_2(1)).AND.( r_dualnod(2,i_cntt).eq.r_2(2)) ))THEN
+!                   i_nneigb  =  i_nneigb + 1_GRID_SI
+!                   i_dualnodNe(i_nneigb) = i_dedge(1,j_cnt,i_cnt)
+!                   r_dualnod(:,i_nneigb) = r_2   
+!                   l_inside2=.true.
+!                END IF
+!              END IF
+!           END DO knownneigb
+!         END IF
+!     
+!          
+!        END IF     
+!       END DO ptch_loop
+!       
+! 
+!       r_centr = SUM(r_dualnod,DIM=2)/i_nneigb
+!       DO i_cntt=1,i_nneigb
+!          r_dualnod(:,i_cntt)= r_dualnod(:,i_cntt) - r_centr(:)
+!          r_vals(i_cntt)      = r_dHeight(i_dualnodNe(i_cntt))
+!       END DO
+!       
+!       
+!     !  r_newHeightDvt(:,i_cnt)= solve_lsq_problem(i_nneigb, r_dualnod, r_vals)
+!       
+!       r_newHeightDvt(1,i_cnt)= r_newHeightDvt(1,i_cnt)/r_globalarea
+!       r_newHeightDvt(2,i_cnt)= r_newHeightDvt(2,i_cnt)/r_globalarea
+!       IF(abs(r_newHeightDvt(1,i_cnt))<GRID_eps) THEN
+!               r_newHeightDvt(1,i_cnt)=0.0_GRID_SR
+!       END IF
+!       IF(abs(r_newHeightDvt(2,i_cnt))<GRID_eps) THEN
+!               r_newHeightDvt(2,i_cnt)=0.0_GRID_SR
+!       END IF
+!       
+!       
+!     END DO node_loop
+!  
+!  
+!      
+!                                 
+!   END SUBROUTINE calculateDerivative
+
+
+!***************************************************************** 
+!  hx der einzelnen patches bilden und mitteln
+    SUBROUTINE  calcDrvtMeanPatch(i_arlen, r_coord, i_darlen, r_dcoord, i_dedge, r_dwnHeight, &
+                                  r_dHeight, r_newHeightDvt)
+
+!---------- local declarations
+  
+       IMPLICIT NONE
+
+      INTEGER, INTENT(in)                                                     ::  i_arlen, i_darlen                      
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out)   ::  r_newHeightDvt  
+      REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                   ::  r_dwnHeight 
+       REAL (KIND = GRID_SR), DIMENSION(i_darlen), INTENT(in)                  :: r_dHeight
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)    :: r_coord
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in)   :: r_dcoord
+      REAL (KIND = GRID_SR)                                                   :: r_hxtmp, r_hytmp, r_leftH, r_rightH,  &
+                                                                                   r_h1,  r_h2,  r_h3, r_area, r_globalarea
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                       :: r_1, r_2, r_3 , r_centr, r_a, r_b, r_c, &
+                                                                                r_tmpGradSingle
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,2*GRID_patchelements) :: r_dualnod
+      REAL (KIND = GRID_SR), DIMENSION(2*GRID_patchelements) :: r_vals
+      INTEGER, DIMENSION(:,:,:), POINTER, INTENT(in)                                  :: i_dedge
+      INTEGER, DIMENSION(2*GRID_patchelements)                                  :: i_dualnodNe
+      INTEGER                                                                :: i_cnt, j_cnt, i_cntt, i_nneigb                
+      LOGICAl                                                               :: l_isOnBound
+     
+!--- Strategie: Benutze die Dualen Koordinaten und suche dort (rechtsoben rechtsunten) (linksoebn linksunten)-(  
+  
+    
+   !---------- loop over nodes (und somit dualen Elementen
+
+       node_loop: DO i_cnt= 1, i_arlen
+           i_nneigb=0
+           r_dualnod=0.0
+           r_vals=0.0
+           i_dualnodNe=0
+           r_centr=0.0
+           r_area=0.0
+           r_hxtmp=0.0
+           r_hytmp=0.0
+           r_globalarea=0.0
+
+   !---- HACK  Setze an den Raendern die initialen Gradienten
+   
+    CALL isOnBoundary(r_coord(:,i_cnt),l_isOnBound)
+    
+!    IF(l_isOnBound) THEN
+!    CALL slm_getGradForCoordinate(r_coord(:,i_cnt),r_tmpGradSingle)
+!    r_newHeightDvt(:,i_cnt) = r_tmpGradSingle(:)
+!    ELSE
+
+        ptch_loop: DO j_cnt= 1, GRID_patchelements
+         
+         
+          IF(i_dedge(1,j_cnt,i_cnt) == 0) THEN
+       ! WRITE(*,*) 'Node: ', r_coord(:,i_cnt), 'Number of Neighbours', j_cnt
+            EXIT ptch_loop
+          ELSE
+
+!---------- the downstream dual element
+            r_1= r_coord(:,i_cnt)
+            r_2= r_dcoord(:,i_dedge(1,j_cnt,i_cnt))
+            r_3= r_dcoord(:,i_dedge(2,j_cnt,i_cnt))
+            r_area= triang_ar(r_1, r_2, r_3)
+            r_globalarea=r_globalarea+r_area
+!---------- calculate the hx at echt triangle of the patch element of dual element
+            
+            
+            r_a= r_2- r_1
+            r_b= r_3- r_1
+
+!---------- calculate components (a,b,c) of cross product vector
+
+             r_c= r_a(1)* r_b(2)- r_a(2)* r_b(1)
+            r_h1=r_dwnHeight(i_cnt)
+            r_h3=r_dHeight(i_dedge(2,j_cnt,i_cnt))
+            r_h2=r_dHeight(i_dedge(1,j_cnt,i_cnt))
+!---------- calculate area
+
+         
+
+            r_hxtmp= r_hxtmp + r_area* &
+                (   ( (r_h2-r_h3) *(r_1(2)-r_3(2)) - (r_h1-r_h3)*(r_2(2)-r_3(2))  )  /&
+                    ( (r_2(1)-r_3(1))*(r_1(2)-r_3(2)) - (r_1(1)-r_3(1))*(r_2(2)-r_3(2)))   )
+      
+      
+      
+            r_hytmp=r_hytmp+r_area* ( ( (r_h2-r_h3)*(r_1(1)-r_3(1)) - (r_h1-r_h3)*(r_2(1)-r_3(1))  )  /&
+                    ((r_2(2)-r_3(2))*(r_1(1)-r_3(1)) - (r_1(2)-r_3(2))*(r_2(1)-r_3(1)))) 
+!--------- mean values of the patch elements to build the 
+      
+    
+
+             END IF
+            END DO ptch_loop
+           r_newHeightDvt(1,i_cnt)= r_hxtmp/r_globalarea
+
+           r_newHeightDvt(2,i_cnt)= r_hytmp/r_globalarea
+  ! END IF
+
+
+            IF(abs(r_newHeightDvt(1,i_cnt))<GRID_eps) THEN
+                    r_newHeightDvt(1,i_cnt)=0.0_GRID_SR
+            END IF
+            IF(abs(r_newHeightDvt(2,i_cnt))<GRID_eps) THEN
+                    r_newHeightDvt(2,i_cnt)=0.0_GRID_SR
+            END IF
+
+        
+      END DO node_loop
+                                  
+    END SUBROUTINE calcDrvtMeanPatch
+   
+ !***************************************************************** 
+
+    SUBROUTINE  isOnBoundary(r_coordSingle, l_isOnBoundary)
+
+    LOGICAL,   INTENT(out)                                              :: l_isOnBoundary
+    REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) , INTENT(in)       :: r_coordSingle
+  
+    
+    l_isOnBoundary = .FALSE.
+    
+    IF ((r_coordSingle(1) == 0.0_GRID_SR ).OR.(r_coordSingle(2) == 0.0_GRID_SR ).OR.&
+    (r_coordSingle(1) == 25000.0_GRID_SR ).OR.(r_coordSingle(2) == 25000.0_GRID_SR )) THEN
+    
+    l_isOnBoundary = .TRUE.
+    
+    END IF
+    
+    
+    END SUBROUTINE
+    
+    END MODULE SLM_advanced
diff --git a/flash2d/src/options/SLM_advanced.dualdiffusion.F90 b/flash2d/src/options/SLM_advanced.dualdiffusion.F90
new file mode 100644
index 0000000..d7fbcbf
--- /dev/null
+++ b/flash2d/src/options/SLM_advanced.dualdiffusion.F90
@@ -0,0 +1,971 @@
+!*******************************************************************************
+!
+!> @file SLM_advanced.dualdiffusion
+!> @brief includes module SLM_advanced
+!
+!*******************************************************************************
+!
+! VERSION(S):
+!	1. original version		j. behrens	4/2002
+!	2. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*******************************************************************************
+! MODULE DESCRIPTION:
+!> contains the essential time stepping for a semi-Lagrangian scheme.
+!> The main routine slm_step/slm_astep provides the propagation of a
+!> constituent from time t --> t+Dt.
+!
+	MODULE SLM_advanced
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE GRID_api
+	  USE ADV_wind
+	  USE ADV_rhs
+  USE lapack95, only:gels
+	  PRIVATE
+      INTEGER (KIND = GRID_SI), PARAMETER :: i_locpatchlen=32_GRID_SI
+	  PUBLIC  :: slm_astep
+	  CONTAINS
+!*****************************************************************
+! DESCRIPTION of [SUBROUTINE slm_astep]:
+!> @brief compute semi-Lagrangian time step
+!
+!> @description This version uses a dual mesh (dual cells corresponding to
+!> each grid point) in order to come up with a quasi-conservative scheme.
+!> A proper description is given in Behrens (2006): Adaptive Atmospheric Modeling, Springer.
+!
+!> @param[in]   p_ghand     grid handling data structure
+!> @param[in]   p_param     parameter data structure
+!> @param[in]   p_time      timing data structure
+!> @param[in]   r_modtime   model time point
+!> @param[in]   i_size      length of array with grid points
+!> @param[in]   r_coord     the coordinate array (grid points)
+!> @param[out]  r_tracer    the computed new grid values
+!> @param[in]   i_newsdepth otional indicator for a subset of values to be computed
+	  SUBROUTINE slm_astep(p_ghand, p_param, p_time, r_modtime, i_size, &
+	                       r_coord, r_tracer, i_newsdepth)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                         :: p_param
+	  TYPE (sw_info), INTENT(inout)                             :: p_time
+	  REAL (KIND = GRID_SR), INTENT(in)                                          :: r_modtime
+	  INTEGER, INTENT(in)                                       :: i_size
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size), INTENT(in)        :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_size), INTENT(out)                      :: r_tracer
+	  INTEGER, OPTIONAL, INTENT(in)                             :: i_newsdepth
+	  
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE      :: r_newvl
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_alpha
+	  INTEGER                              :: i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER        :: r_dualcoordinates
+	  INTEGER, DIMENSION(:,:,:), POINTER   :: i_dualedges
+	  INTEGER                              :: i_dual
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_dualalpha
+
+!---------- check size!
+
+	  IF(i_size <= 0) THEN
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'INFO [slm_astep]: Zero step size, returning to calling routine'
+	    RETURN
+	  END IF
+
+!---------- allocate auxiliary arrays
+
+	  allocate(r_newvl(i_size), r_alpha(GRID_dimension,i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(38)
+	  END IF not_alloc
+
+!---------- create dual mesh
+
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_createdual(p_ghand(i_timeplus), i_dual, i_dualedges, &
+	                         r_dualcoordinates, i_newsdepth= i_newsdepth, i_newlength=i_size)
+	    IF(i_alct /= i_size) CALL grid_error(c_error='[slm_step]: incompatible new lengths...')
+	  ELSE
+	    CALL grid_createdual(p_ghand(i_timeplus), i_dual, i_dualedges, &
+	                         r_dualcoordinates)
+	  END IF
+
+!---------- allocate array for dual displacements
+
+	  allocate(r_dualalpha(GRID_dimension,i_dual), stat=i_alct)
+	  not_allocdual: IF(i_alct /= 0) THEN
+	    CALL grid_error(40)
+	  END IF not_allocdual
+
+!-SLM--------- calculate trajectory pieces (displacements)
+
+	  CALL stop_watch('start',3,p_time)
+	  CALL slm_adisplace(p_param, i_size, r_coord, r_alpha, &
+	  		    i_dual, r_dualcoordinates, r_dualalpha, r_time=r_modtime)
+	  CALL stop_watch('stop ',3,p_time)
+
+!-SLM--------- calculate right hand side
+
+	  CALL stop_watch('start',4,p_time)
+	  CALL slm_aupstream(p_ghand, p_param, i_size, r_coord, r_alpha, &
+	  		    i_dual, r_dualcoordinates, r_dualalpha, &
+	  		    i_dualedges, r_newvl)
+	  CALL stop_watch('stop ',4,p_time)
+
+!-SLM--------- calculate new grid values
+
+	  CALL stop_watch('start',5,p_time)
+	  CALL slm_aupdate(p_param, i_size, r_coord, r_newvl, r_tracer, r_time=r_modtime)
+	  CALL stop_watch('stop ',5,p_time)
+
+!---------- destroy dual mesh
+
+	  CALL grid_destroydual(i_dual, i_dualedges, r_dualcoordinates)
+
+!-SLM--------- put alpha values to u and v field entries
+
+	  r_alpha= -r_alpha
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_newsdepth=i_newsdepth, i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  ELSE
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  END IF
+
+!-SLM--------- deallocate work arrays
+
+	  deallocate(r_dualalpha, r_alpha, r_newvl)
+
+	  RETURN
+	  END SUBROUTINE slm_astep
+
+!*****************************************************************
+! DESCRIPTION of [SUBROUTINE slm_adisplace]:
+!> @brief compute displacements (trajectories) for each grid point (and dual points)
+!>
+!> @param[in]   p_param     parameter data structure
+!> @param[in]   i_arlen     length of array with grid points
+!> @param[in]   r_coord     the coordinate array (grid points)
+!> @param[out]  r_alpha     upstream deviation for grid points
+!> @param[in]   r_rside     interpolated upstream values (RHS in SLM)
+!> @param[in]   i_darlen    length of array with dual points
+!> @param[in]   r_dcoord    the coordinate array (dual grid points)
+!> @param[out]  r_dalpha    upstream deviation for dual points
+!> @param[in]   r_time      a time value, in case wind field needs it (optional)
+	  SUBROUTINE slm_adisplace(p_param, i_arlen, r_coord, r_alpha, &
+	                          i_darlen, r_dcoord, r_dalpha, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                      :: p_param
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_alpha
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                           :: r_time
+	  INTEGER, INTENT(in)                                  :: i_darlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in)  :: r_dcoord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(out) :: r_dalpha
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_fac, r_caf, &
+	    r_axy, r_xyc
+	  REAL (KIND = GRID_SR)                                                 :: r_dt0, r_dt1, &
+	    r_dt2, r_tim
+	  INTEGER                                              :: i_cnt1, i_cnt2
+
+!---------- set constants
+
+	  r_dt0= p_param%num%r_deltatime
+	  r_dt1= 0.5_GRID_SR* p_param%num%r_deltatime
+	  r_dt2= 1.5_GRID_SR* p_param%num%r_deltatime
+	  r_fac= 0.5_GRID_SR
+	  r_caf= 2.0_GRID_SR
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- calculate in an iteration process the displacements
+
+	  unknown_loop: DO i_cnt1=1,i_arlen
+	    r_axy= 0.0_GRID_SR
+
+	    iter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_coord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO iter_loop
+
+	    r_alpha(:,i_cnt1)= r_axy
+	  END DO unknown_loop
+
+!---------- the same for the dual grid
+
+	  dual_loop: DO i_cnt1=1,i_darlen
+	    r_axy= 0.0_GRID_SR
+
+	    diter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_dcoord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO diter_loop
+
+	    r_dalpha(:,i_cnt1)= r_axy
+	  END DO dual_loop
+
+	  RETURN
+	  END SUBROUTINE slm_adisplace
+
+!*****************************************************************
+! DESCRIPTION of [SUBROUTINE slm_aupdate]:
+!> @brief compute upstream values in the semi-Lagrangian method
+!>
+!> @param[in]   p_param     parameter data structure
+!> @param[in]   i_arlen     length of array with grid points
+!> @param[in]   r_coord     the coordinate array (grid points)
+!> @param[in]   r_rside     interpolated upstream values
+!> @param[out]  r_update    updated values (new time step)
+!> @param[in]   r_time      a time value, in case source function needs it (optional)
+	  SUBROUTINE slm_aupdate(p_param, i_arlen, r_coord, r_rside, r_udate, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                   :: p_param
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_udate
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                          :: r_time
+	  INTEGER                                             :: i_cnt
+	  REAL (KIND = GRID_SR)                                                :: r_dt, r_tim
+
+!---------- in the linear advection case and with f90 this is just
+
+!	  r_udate= r_rside
+
+!---------- including a non-zero right hand side, we have
+
+	  r_dt= p_param%num%r_deltatime
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+	  main_loop: DO i_cnt=1, i_arlen
+	    r_udate(i_cnt)= r_rside(i_cnt)+ r_dt* slm_righthand(r_coord(:,i_cnt))
+	  END DO main_loop
+
+	  RETURN
+	  END SUBROUTINE slm_aupdate
+
+!*****************************************************************
+! DESCRIPTION of [SUBROUTINE slm_aupstream]:
+!> @brief compute upstream values in the semi-Lagrangian method
+!>
+!> @param[in]   p_mesh      grid handling data structure
+!> @param[in]   p_param     parameter data structure
+!> @param[in]   i_arlen     length of array with grid points
+!> @param[in]   r_coord     the coordinate array (grid points)
+!> @param[in]   r_alpha     upstream deviation for grid points
+!> @param[in]   r_rside     interpolated upstream values (RHS in SLM)
+!> @param[in]   i_darlen    length of array with dual points
+!> @param[in]   r_dcoord    the coordinate array (dual grid points)
+!> @param[in]   r_dalpha    upstream deviation for dual points
+!> @param[in]   i_dedge     list of indices for dual edges
+!> @param[out]  r_rside     interpolated upstream values (RHS in SLM)
+	  SUBROUTINE slm_aupstream(p_mesh, p_param, i_arlen, r_coord, r_alpha, &
+	                          i_darlen, r_dcoord, r_dalpha, i_dedge, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  TYPE (control_struct), INTENT(in)                   :: p_param
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_alpha
+	  INTEGER, INTENT(in)                                 :: i_darlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in) :: r_dcoord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in) :: r_dalpha
+	  INTEGER, DIMENSION(2,GRID_patchelements,i_arlen), INTENT(in)          :: i_dedge
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)                :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)    :: r_fac
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE    :: r_aux, &
+	    r_uparea, r_dwarea, r_dwdiff, r_updiff
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE  :: r_intermed
+	  INTEGER                                             :: i_alct, i_cnt, j_cnt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)    :: r_1, r_2, r_3
+	  REAL (KIND = GRID_SR)                               :: r_oarea, r_narea
+	  INTEGER, DIMENSION(1)                               :: i_valind
+	  REAL (KIND = GRID_SR)                               :: r_dt
+
+!---------- set factor (at which point of trajectory shall i interpolate)
+
+	  r_fac= 1.0_GRID_SR
+	  r_dt= p_param%num%r_deltatime
+
+!---------- allocate auxilliary arrays
+
+	  allocate(r_aux(i_arlen), r_intermed(1,i_arlen), &
+	           r_uparea(i_arlen), r_dwarea(i_arlen), &
+	           r_dwdiff(i_arlen), r_updiff(i_arlen),  stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(39)
+	  END IF not_alloc
+
+!---------- interpolation of node values
+
+	  CALL slm_ainterpolate(p_mesh, r_fac, i_time, i_arlen, GRID_tracer, r_coord, &
+	                        r_alpha, r_aux)
+
+!---------- loop over nodes
+
+	  node_loop: DO i_cnt= 1, i_arlen
+	    r_oarea= 0.
+	    r_narea= 0.
+	    ptch_loop: DO j_cnt= 1, GRID_patchelements
+	      IF(i_dedge(1,j_cnt,i_cnt) == 0) THEN
+	        EXIT ptch_loop
+	      ELSE
+
+!---------- the upstream dual element
+
+	        r_1= r_coord(:,i_cnt)- r_alpha(:,i_cnt)
+	        r_2= r_dcoord(:,i_dedge(1,j_cnt,i_cnt))- r_dalpha(:,i_dedge(1,j_cnt,i_cnt))
+	        r_3= r_dcoord(:,i_dedge(2,j_cnt,i_cnt))- r_dalpha(:,i_dedge(2,j_cnt,i_cnt))
+	        r_oarea= r_oarea+ triang_area(r_1, r_2, r_3)
+
+!---------- the downstream dual element
+
+	        r_1= r_coord(:,i_cnt)
+	        r_2= r_dcoord(:,i_dedge(1,j_cnt,i_cnt))
+	        r_3= r_dcoord(:,i_dedge(2,j_cnt,i_cnt))
+	        r_narea= r_narea+ triang_area(r_1, r_2, r_3)
+	      END IF
+	    END DO ptch_loop
+	    r_uparea(i_cnt)= r_oarea
+	    IF(r_narea /= 0._GRID_SR) THEN
+	      r_dwarea(i_cnt)= 1._GRID_SR/ r_narea
+	    ELSE
+	      r_dwarea(i_cnt)= 0._GRID_SR
+	    END IF
+	  END DO node_loop
+
+!---------- now calculate new values using a (nonexact) interpolation formula
+
+	  r_rside= r_aux* r_uparea* r_dwarea
+
+
+!---------- we store this (being the advected new value provided no sources nor sinks)
+!           in an intermediate storage in amatos, to benefit from amatos' interpolation
+
+	  r_intermed(1,:) = r_rside(:)
+	  i_valind= (/ GRID_zeta /)
+	  CALL grid_putinfo(p_mesh(i_timeplus), i_arraypoint= i_valind, &
+	                    i_newsdepth= 1, r_nodevalues= r_intermed)
+
+!---------- we will now compute a diffusion operator
+!           first: compute the downstream values
+
+      CALL compute_diffop(p_mesh, i_timeplus, GRID_zeta, i_arlen, i_darlen, &
+                          r_dwdiff, i_dedge, r_coord, r_dcoord)
+
+!---------- second: the upstream diffusion values
+
+      CALL compute_diffop(p_mesh, i_time, GRID_tracer, i_arlen, i_darlen, &
+                          r_updiff, i_dedge, r_coord, r_dcoord, &
+                          r_upstream=r_alpha, r_dupstream=r_dalpha)
+
+!---------- now we can compose the advection diffusion result:
+
+      r_rside= r_rside+ (r_dt* r_dt)/2._GRID_SR* &
+               (r_dwdiff + r_uparea* r_dwarea* r_updiff)
+
+!---------- deallocate auxilliary arrays
+
+	  deallocate(r_aux, r_intermed, r_uparea, r_dwarea, r_dwdiff, r_updiff)
+
+	  RETURN
+	  END SUBROUTINE slm_aupstream
+!*****************************************************************
+! DESCRIPTION of [SUBROUTINE slm_ainterpolate]:
+!> @brief interpolate upstream values at positions coord - fac* alpha.
+!>
+!> @param[in]   p_mesh      grid handling data structure
+!> @param[in]   r_fac       factor for controlling upstream deviation length
+!> @param[in]   i_arlen     length of array with grid points
+!> @param[in]   r_coord     the coordinate array (grid points)
+!> @param[in]   r_alpha     upstream deviation for grid points
+!> @param[out]  r_rside     interpolated upstream values (RHS in SLM)
+	  SUBROUTINE slm_ainterpolate(p_mesh, r_fac, i_timept, i_arlen, i_val, &
+	                             r_coord, r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)                        :: p_mesh
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in)         :: r_fac
+	  INTEGER (KIND = GRID_SI), INTENT(in)                                 :: i_timept
+	  INTEGER (KIND = GRID_SI), INTENT(in)                                 :: i_arlen
+	  INTEGER (KIND = GRID_SI), INTENT(in)                                 :: i_val
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE                   :: r_upstr
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_nodevalues)                    :: r_tval
+	  INTEGER, DIMENSION(GRID_elementnodes)               :: i_ttmp
+	  REAL (KIND = GRID_SR)                                                :: r_eps, r_max, r_min, r_tmp
+	  INTEGER                                             :: i_cnt, i_alct
+	  INTEGER                                             :: i_ind, i_tim, &
+	    j_cnt, i_out, i_stat
+
+!---------- initialize constant
+
+	  r_eps= GRID_EPS
+	  i_tim= p_mesh(i_timept)%i_timetag
+
+!---------- allocate work array
+
+	  ALLOCATE(r_upstr(GRID_dimension,i_arlen), stat=i_alct)
+	  not_allocated: IF(i_alct /= 0) THEN
+	    CALL grid_error(60)
+	  END IF not_allocated
+
+!---------- calculate upstream coordinates
+
+	  dim_loop: DO i_cnt=1, GRID_dimension
+	    r_upstr(i_cnt,:) = r_coord(i_cnt,:)- r_fac(i_cnt)* r_alpha(i_cnt,:)
+	  END DO dim_loop
+
+!---------- loop over nodes: find element containing upstream point
+
+	  node_loop: DO i_cnt=1, i_arlen
+
+!---------- check if upstream value is outside of the domain
+
+	    i_out= grid_domaincheck(p_mesh(i_timept), r_upstr(:,i_cnt))
+
+!---------- take the intersection of the trajectory with the boundary as new upstream point
+
+	    out_domain: IF(i_out /= 0) then
+	       r_upstr(:,i_cnt)= grid_boundintersect(p_mesh(i_timept), &
+	                        r_coord(:,i_cnt), r_upstr(:,i_cnt), i_info=i_stat)
+               no_intersect: IF(i_stat /= 0) THEN
+                  r_rside(i_cnt)= 0.0
+                  CYCLE node_loop
+               END IF no_intersect
+	    END IF out_domain
+
+!---------- interpolate
+
+	    r_tmp= grid_coordvalue(p_mesh(i_timept), r_upstr(:,i_cnt), &
+	           i_interpolorder=GRID_loworder, i_valpoint=i_val, &
+                i_index=i_ind, i_domaincheck=0, l_relative=.FALSE., l_sfcorder=.FALSE.)
+
+
+	    index_valid: IF(i_ind > 0) THEN
+
+!---------- get nodes of element surrounding r_upstr
+
+	       CALL grid_getiteminfo(i_ind, 'elmt', i_arrlen=GRID_elementnodes, i_nodes=i_ttmp)
+
+!---------- get values at nodes of element surrounding r_upstr, and obtain min/max
+
+               r_min= 0.0_GRID_SR; r_max= 0.0_GRID_SR
+               elmt_loop: DO j_cnt=1,GRID_elementnodes
+                  CALL grid_getiteminfo(i_ttmp(j_cnt), 'node', i_arrlen=GRID_nodevalues, &
+                                        r_values= r_tval, i_time=i_tim)
+                  r_min= MIN(r_min, r_tval(i_val))
+                  r_max= MAX(r_max, r_tval(i_val))	      
+               END DO elmt_loop
+
+!---------- clip value
+
+               IF(r_tmp > r_max) THEN
+                  r_tmp= r_max
+               ELSE IF(r_tmp < r_min) THEN
+                  r_tmp= r_min
+               END IF
+	    END IF index_valid
+
+!---------- set interpolation value
+
+	    r_rside(i_cnt)= r_tmp
+	 
+	    small_val: IF(abs(r_rside(i_cnt)) < r_eps) THEN
+               r_rside(i_cnt)= 0.0_GRID_SR
+	    END IF small_val
+
+	  END DO node_loop
+
+!---------- deallocate work array
+
+	  DEALLOCATE(r_upstr)
+
+	  RETURN
+	  END SUBROUTINE slm_ainterpolate
+
+!*****************************************************************
+! DESCRIPTION of [SUBROUTINE compute_diffop]:
+!> @brief compute the diffusion operator for a cell (either upstream or downstream)
+!
+!> @description we compute the diffusion operator by a least squares approximation
+!> with a quadratic polynomial function. Then we differentiate the quadratic polynomial
+!> analytically to obtain the Laplace operator (aka diffusion operator). We need the 
+!> specification of the diffusion coefficient. If it is space-dependent, we also need 
+!> the gradient of the diffusion coefficient.
+!
+!> @param[in]   p_mesh      grid handling data structure
+!> @param[in]   i_tim       time point (corresponding to mesh)
+!> @param[in]   i_valuepointer the value for which the diffusion is to applied
+!> @param[in]   i_arlen     length of array with grid points
+!> @param[in]   i_darlen    length of array with dual points
+!> @param[out]  r_diffop    diffusion operator array (for each grid point)
+!> @param[in]   i_dedge     list of indices for dual edges
+!> @param[in]   r_coord     the coordinate array (grid points)
+!> @param[in]   r_dcoord    the coordinate array (dual grid points)
+!> @param[in]   r_alpha     upstream deviation for grid points
+!> @param[in]   r_dalpha    upstream deviation for dual points
+!
+	  SUBROUTINE compute_diffop(p_mesh, i_tim, i_valuepointer, i_arlen, i_darlen, &
+	                            r_diffop, i_dedge, r_coord, r_dcoord, r_upstream, &
+	                            r_dupstream)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)          :: p_mesh
+	  INTEGER (KIND = GRID_SI), INTENT(in)                   :: i_tim
+	  INTEGER (KIND = GRID_SI), INTENT(in)                   :: i_valuepointer
+	  INTEGER (KIND = GRID_SI), INTENT(in)                   :: i_arlen
+	  INTEGER (KIND = GRID_SI), INTENT(in)                   :: i_darlen
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out) :: r_diffop
+	  INTEGER (KIND = GRID_SI), DIMENSION(2,GRID_patchelements,i_arlen), INTENT(in) :: i_dedge
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_dcoord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), OPTIONAL   :: r_upstream
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), OPTIONAL   :: r_dupstream
+
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_locpatchlen)       :: r_loccoord
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_locpatchlen)       :: r_glocoord
+      REAL (KIND = GRID_SR), DIMENSION(i_locpatchlen)        :: r_locvals
+
+      INTEGER (KIND = GRID_SI)                               :: i_cnt, j_cnt, i_ptc, i_cnt2
+      LOGICAL                                                :: l_upstream, l_exist2, l_exist3
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)       :: r_1, r_2, r_3, r_4, r_fac, r_1alt
+	  REAL (KIND = GRID_SR)                                  :: r_stencrad
+
+!---------- initializations
+
+      l_upstream = .FALSE.
+
+!---------- check input
+
+      upstr_present: IF(PRESENT(r_upstream)) THEN
+        IF(.NOT. PRESENT(r_dupstream)) &
+          CALL grid_error(c_error='[compute_diffop]: incompatible dual upstream values...')
+        IF(i_tim /= i_time) &
+          CALL grid_error(c_error='[compute_diffop]: upstream values at t/=i_time?')
+        l_upstream =.TRUE.
+      END IF upstr_present
+
+!---------- loop over nodes to set up local coordinates and values
+
+      node_loop: DO i_cnt=1, i_arlen
+
+        IF(l_upstream) THEN ! this is the center point at which diffop is evaluated
+	      r_1= r_coord(:,i_cnt)- r_upstream(:,i_cnt)
+	    ELSE
+	      r_1= r_coord(:,i_cnt)
+	    END IF
+
+!---------- walk through the patch of the node
+!
+!        i_ptc      = 0_GRID_SI
+!        r_loccoord = 0._GRID_SR
+!	    ptch_loop: DO j_cnt= 1, GRID_patchelements
+!	      ptch_exist: IF(i_dedge(1,j_cnt,i_cnt) == 0) THEN
+!	        EXIT ptch_loop
+!	      ELSE ptch_exist
+!
+!---------- distinguish between the upstream and downstream computations
+!
+!            upstream: IF(l_upstream) THEN
+!	          r_2= r_dcoord(:,i_dedge(1,j_cnt,i_cnt))- r_dupstream(:,i_dedge(1,j_cnt,i_cnt))
+!	          r_3= r_dcoord(:,i_dedge(2,j_cnt,i_cnt))- r_dupstream(:,i_dedge(2,j_cnt,i_cnt))
+!              r_4= (1._GRID_SR/3._GRID_SR)* (r_1+ r_2+ r_3)
+!            ELSE upstream
+!	          r_2= r_dcoord(:,i_dedge(1,j_cnt,i_cnt))       ! this is dual edge point 1
+!	          r_3= r_dcoord(:,i_dedge(2,j_cnt,i_cnt))       ! this is dual edge point 2
+!              r_4= (1._GRID_SR/3._GRID_SR)* (r_1+ r_2+ r_3) ! this is the dual triangle center
+!            END IF upstream
+!
+!---------- collect unique coordinates, we omit the coordinate of the point at which
+!           we evaluate the diffusion operator! I'm not sure if this is useful...
+!
+!            IF(i_ptc == 0_GRID_SI) THEN
+!              i_ptc= i_ptc+ 1_GRID_SI
+!              r_loccoord(:,i_ptc) = r_1 - r_2 ! we set up a local coordinate system
+!              r_glocoord(:,i_ptc) = r_2       ! for the interpolation we need the true coord.
+!            ELSE
+!              l_exist2 = .FALSE.
+!              l_exist3 = .FALSE.
+!
+!---------- check if coordinate has already been registered
+!              DO i_cnt2 = 1, i_ptc
+!               IF (coord_dist(r_2,r_loccoord(:,i_cnt2))<GRID_EPS) l_exist2= .TRUE.
+!               IF (coord_dist(r_3,r_loccoord(:,i_cnt2))<GRID_EPS) l_exist3= .TRUE.
+!              END DO
+!              IF(.NOT. l_exist2) THEN
+!                IF(i_ptc >= i_locpatchlen) EXIT ptch_loop
+!                i_ptc = i_ptc+ 1_GRID_SI
+!                r_loccoord(:,i_ptc) = r_1 -  r_2
+!                r_glocoord(:,i_ptc) = r_2
+!              END IF
+!              IF(.NOT. l_exist3) THEN
+!                IF(i_ptc >= i_locpatchlen) EXIT ptch_loop
+!                i_ptc = i_ptc+ 1_GRID_SI
+!                r_loccoord(:,i_ptc) = r_1 -  r_3
+!                r_glocoord(:,i_ptc) = r_3
+!              END IF
+!              IF(i_ptc >= i_locpatchlen) EXIT ptch_loop
+!              i_ptc = i_ptc+ 1_GRID_SI
+!              r_loccoord(:,i_ptc) = r_1 -  r_4
+!              r_glocoord(:,i_ptc) = r_4
+!            END IF
+!	      
+!	      END IF ptch_exist
+!        END DO ptch_loop
+
+!---------- create stencil
+
+        i_ptc = 10_GRID_SI
+        r_glocoord = 0._GRID_SI
+        CALL grid_edgelength(p_mesh(i_tim), r_min= r_stencrad)
+        r_stencrad = r_stencrad* 0.5_GRID_SR
+
+!---------- make sure whole stencil lies within domain!
+
+        r_2= r_1
+        r_1alt=r_1
+        r_1alt(1)= r_1alt(1)+r_stencrad
+        IF(grid_domaincheck(p_mesh(i_tim), r_1alt) /= 0) THEN
+          r_2(1)= r_2(1)- r_stencrad
+        END IF
+        r_1alt=r_1
+        r_1alt(1)= r_1alt(1)-r_stencrad
+        IF(grid_domaincheck(p_mesh(i_tim), r_1alt) /= 0) THEN
+          r_2(1)= r_2(1)+ r_stencrad
+        END IF
+        r_1alt=r_1
+        r_1alt(2)= r_1alt(2)+r_stencrad
+        IF(grid_domaincheck(p_mesh(i_tim), r_1alt) /= 0) THEN
+          r_2(2)= r_2(2)- r_stencrad
+        END IF
+        r_1alt=r_1
+        r_1alt(2)= r_1alt(2)-r_stencrad
+        IF(grid_domaincheck(p_mesh(i_tim), r_1alt) /= 0) THEN
+          r_2(2)= r_2(2)+ r_stencrad
+        END IF
+        r_1= r_2
+
+!---------- now really create stencil
+
+        CALL createstencil(i_ptc, r_1, r_stencrad, r_glocoord)
+
+!---------- check if we have enough points, otherwise we set diffusion operator to zero
+!           i.e. we compute pure advection...
+
+        sys_underdetmd: IF(i_ptc < 7_GRID_SI) THEN
+        WRITE(*,*) 'DEBUG: [compute_diffop] underdetermined system at grid point: ',i_cnt
+          r_diffop(i_cnt) = 0._GRID_SR
+        ELSE sys_underdetmd
+
+!---------- interpolate values at points - we use an existing upstream interpolation
+!           function and tweak the input (setting the factor with which to include the 
+!           upstream position to zero (thus we only interpolate at r_loccoord positions)
+
+          r_fac     = 0._GRID_SR
+          r_locvals = 0._GRID_SR
+          CALL slm_ainterpolate(p_mesh, r_fac, i_tim, i_ptc, i_valuepointer, r_glocoord, &
+                                  r_glocoord, r_locvals)
+
+!---------- now set up LSQ problem
+
+!          r_1= 0._GRID_SR ! this is the center of the local coordinate system!
+          r_diffop(i_cnt) = solve_lsq_problem(i_ptc, r_1, r_glocoord, r_locvals)
+        END IF sys_underdetmd
+      END DO node_loop
+
+	  RETURN
+	  END SUBROUTINE compute_diffop
+
+!*****************************************************************
+! DESCRIPTION of [SUBROUTINE solve_lsq_problem]:
+!> @brief solve a least squared problem for fitting a quadratic polynomial to 
+!> given values in order to derive the Laplacian (diffusion operator), requires LAPACK95!
+!>
+!> @param[in]       i_numnodes  number of nodes in coordinate array (array length)
+!> @param[in]       r_cntrcoo   center coordinate at which to evaluate diffusion coeff.
+!> @param[in]       r_nodecoo   coordinates
+!> @param[in]       r_vals      function values at coordinates
+!> @param[out]      r_laplace   computed diffusion operator
+!
+  FUNCTION solve_lsq_problem(i_numnodes, r_cntrcoo, r_nodecoo, r_vals) RESULT(r_laplace)
+
+    IMPLICIT NONE
+
+!---------- local declarations
+
+    INTEGER (KIND = GRID_SI), INTENT(in)               :: i_numnodes
+    REAL (KIND = GRID_SR), DIMENSION(GRID_DIMENSION)   :: r_cntrcoo
+    REAL (KIND = GRID_SR), DIMENSION(GRID_DIMENSION,i_numnodes)    :: r_nodecoo
+    REAL (KIND = GRID_SR), DIMENSION(i_numnodes)       :: r_vals
+
+    REAL (KIND = GRID_SR)                              :: r_laplace
+
+!    REAL (KIND = GRID_SR), DIMENSION(GRID_DIMENSION,i_locpatchlen) :: r_matrix
+!    REAL (KIND = GRID_SR), DIMENSION(i_locpatchlen)  :: r_rhs
+    REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_matrix
+    REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE   :: r_rhs
+    INTEGER (KIND = GRID_SI)                           :: i_cn0, i_alct, i_info
+    REAL (KIND = GRID_SR), DIMENSION(GRID_DIMENSION)   :: r_diffcoeffgrad
+    REAL (KIND = GRID_SR)                              :: r_diffcoeff, r_lplx, r_lply
+
+!---------- allocate working matrix
+
+    ALLOCATE(r_matrix(i_numnodes,6), r_rhs(i_numnodes), STAT=i_alct)
+    IF(i_alct /= 0) CALL grid_error(c_error='[solve_lsq_problem]: could not allocate matrix')
+
+!---------- initialize
+
+    r_matrix= 0.0
+    r_rhs= 0.0
+
+!---------- set up coefficients in (Vandermonde) matrix and rhs
+
+    DO i_cn0=1,i_numnodes
+      r_matrix(i_cn0, 1)= r_nodecoo(1,i_cn0)* r_nodecoo(1,i_cn0)
+      r_matrix(i_cn0, 2)= r_nodecoo(2,i_cn0)* r_nodecoo(2,i_cn0)
+      r_matrix(i_cn0, 3)= r_nodecoo(1,i_cn0)* r_nodecoo(2,i_cn0)
+      r_matrix(i_cn0, 4)= r_nodecoo(1,i_cn0)
+      r_matrix(i_cn0, 5)= r_nodecoo(2,i_cn0)
+      r_matrix(i_cn0, 6)= 1.0_GRID_SR
+      r_rhs(i_cn0)      = r_vals(i_cn0)
+    END DO
+
+!---------- LAPACK 95 least squares solution
+
+#ifdef USE_MKL
+    CALL gels(r_matrix, r_rhs, 'N', i_info);
+#else
+    CALL la_gels(r_matrix, r_rhs, 'N', i_info);
+#endif
+    IF (i_info < 0) THEN
+      CALL grid_error(c_error='[solve_lsq_problem]: could not complete LAPACK routine gels successfully')
+    END IF
+
+!---------- evaluate diffusion coefficient (function, if dependent)
+
+    CALL diffcoeff(r_cntrcoo, r_diffcoeff, r_diffcoeffgrad)
+
+!---------- result the first dim parameters are just the gradient values!
+
+    r_lplx = r_diffcoeffgrad(1)* &
+             (2._GRID_SR* r_rhs(1)* r_cntrcoo(1)+ r_rhs(3)* r_cntrcoo(2) + r_rhs(4)) + &
+             r_diffcoeff* 2._GRID_SR* r_rhs(1)
+    r_lply = r_diffcoeffgrad(2)* &
+             (2._GRID_SR* r_rhs(2)* r_cntrcoo(2)+ r_rhs(3)* r_cntrcoo(1) + r_rhs(5)) + &
+             r_diffcoeff* 2._GRID_SR* r_rhs(2)
+    r_laplace= r_lplx+ r_lply
+
+!---------- deallocate temporary arrays
+
+    DEALLOCATE(r_matrix, r_rhs)
+
+    RETURN
+  END FUNCTION solve_lsq_problem
+
+!*****************************************************************
+! DESCRIPTION of [FUNCTION triang_area]:
+!> @brief compute area of a triangle given by three coordinates
+!>
+!> @param[in] r_coord1 first coordinate of triangle
+!> @param[in] r_coord2 2nd coordinate of triangle
+!> @param[in] r_coord3 3rd coordinate of triangle
+!> @param[out] r_area   area of triangle
+!
+	  FUNCTION triang_area(r_coord1, r_coord2, r_coord3) RESULT (r_area)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord1, r_coord2, r_coord3
+	  REAL (KIND = GRID_SR)                                        :: r_area
+	  REAL (KIND = GRID_SR)                                        :: r_c
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_a, r_b
+
+!---------- calculate vector components
+
+	  r_a= r_coord2- r_coord1
+	  r_b= r_coord3- r_coord1
+
+!---------- calculate components (a,b,c) of cross product vector
+
+	  r_c= (r_a(1)* r_b(2)- r_a(2)* r_b(1))
+
+!---------- calculate area
+
+	  r_area= abs(r_c)* 0.5_GRID_SR
+
+	  RETURN
+	  END FUNCTION triang_area
+!*****************************************************************
+! DESCRIPTION of [FUNCTION coord_dist]:
+!> @brief compute distance (Eukledian) between two coordinates
+!>
+!> @param[in]  r_coord1 first coordinate of triangle
+!> @param[in]  r_coord2 2nd coordinate of triangle
+!> @param[out] r_dist   area of triangle
+	  FUNCTION coord_dist(r_coord1, r_coord2) RESULT (r_dist)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord1, r_coord2
+	  REAL (KIND = GRID_SR)                                        :: r_dist
+	  REAL (KIND = GRID_SR)                                        :: r_c
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_a, r_b
+
+!---------- calculate Eulkidean distance of two coordinates
+
+	  r_a= r_coord2- r_coord1
+	  r_dist= sqrt(dot_product(r_a,r_a))
+
+	  RETURN
+	  END FUNCTION coord_dist
+
+!*****************************************************************
+! DESCRIPTION of [SUBROUTINE diffcoeff]:
+!> @brief compute the diffusion operator (can be selected)
+!>
+!> @param[in]   r_coo       coordinate at which to evaluate diffusion coefficient
+!> @param[out]  r_coef      diffusion coefficient, evaluated at r_coo
+!> @param[out]  r_coefgrad  gradient of diffusion coefficient, evaluated at r_coo
+	  SUBROUTINE diffcoeff(r_coo, r_coef, r_coefgrad)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+      REAL (KIND = GRID_SR), DIMENSION(GRID_DIMENSION), INTENT(in)  :: r_coo
+      REAL (KIND = GRID_SR), DIMENSION(GRID_DIMENSION), INTENT(out) :: r_coefgrad
+      REAL (KIND = GRID_SR), INTENT(out)                            :: r_coef
+
+!---------- compute diffusion coefficient and its gradient, depending on coordinate
+!           this is very simple, with a constant, time-independent coefficient (thus
+!           gradient = 0)
+
+      r_coef= p_contr%tst%tst_real(1,1) !-0.005_GRID_SR ! should (or must?) be negative - otherwise anti-diffusion...
+!      r_coef= 0._GRID_SR ! should (or must?) be negative - otherwise anti-diffusion...
+      r_coefgrad= 0._GRID_SR
+
+	  RETURN
+	  END SUBROUTINE diffcoeff
+
+!*****************************************************************
+! DESCRIPTION of [SUBROUTINE createstencil]:
+!> @brief create a stencil of points for Least Squares approx.
+!>
+!> @param[in]   i_size       number of stencil coordinates
+!> @param[in]   r_coo        center coordinate of the stencil
+!> @param[out]  r_radius     radius of the stencil
+!> @param[out]  r_stencilcoo coordinate of the stencil
+	  SUBROUTINE createstencil(i_size, r_coo, r_radius, r_stencilcoo)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+      INTEGER (KIND = GRID_SI), INTENT(in)                                 :: i_size
+      REAL (KIND = GRID_SR), DIMENSION(GRID_DIMENSION), INTENT(in)         :: r_coo
+      REAL (KIND = GRID_SR), INTENT(in)                                    :: r_radius
+      REAL (KIND = GRID_SR), DIMENSION(GRID_DIMENSION,i_size), INTENT(out) :: r_stencilcoo
+
+      REAL (KIND = GRID_SR) :: r_dx, r_tmp, r_half
+      INTEGER (KIND = GRID_SI) :: i_cnt, i_half
+
+!---------- check for minimum size
+
+      IF(i_size < 1_GRID_SI) CALL grid_error(c_error='[createstencil]: illegal size < 1!')
+
+!---------- if size small: only one ring
+
+      small_stencil: IF (i_size < 4_GRID_SI) THEN
+
+!---------- compute step size
+
+        r_dx = (GRID_PI* 2._GRID_SR)/REAL(i_size,GRID_SR)
+
+        DO i_cnt=1,i_size
+          r_tmp= r_dx* (i_cnt-1)
+          r_stencilcoo(1,i_cnt)= r_coo(1)+ (cos(r_tmp)* r_radius)
+          r_stencilcoo(2,i_cnt)= r_coo(2)+ (sin(r_tmp)* r_radius)
+        END DO
+      ELSE small_stencil
+        r_half= REAL(i_size/2,GRID_SR)
+        i_half= floor(r_half)
+
+!---------- compute step size
+
+        r_dx = (GRID_PI* 2._GRID_SR)/REAL(ceiling(r_half),GRID_SR)
+
+        DO i_cnt=1,i_half
+          r_tmp= r_dx* (i_cnt-1)
+          r_stencilcoo(1,i_cnt)= r_coo(1)+ (cos(r_tmp)* r_radius)
+          r_stencilcoo(2,i_cnt)= r_coo(2)+ (sin(r_tmp)* r_radius)
+        END DO
+        DO i_cnt=i_half+1,i_size
+          r_tmp= r_dx* (2*(i_cnt-1)+1)/2
+          r_stencilcoo(1,i_cnt)= r_coo(1)+ (cos(r_tmp)* 0.5* r_radius)
+          r_stencilcoo(2,i_cnt)= r_coo(2)+ (sin(r_tmp)* 0.5* r_radius)
+        END DO
+      END IF small_stencil
+
+	  RETURN
+	  END SUBROUTINE createstencil
+
+!*****************************************************************
+! DESCRIPTION of [SUBROUTINE fillstencil]:
+!> @brief Takes a number of coordinates in a stencil previously defined
+!> and looks up/interpolates corresponding values for the Least Squares
+!> approximation.
+!>
+!> @param[in]   i_size       number of stencil coordinates
+!> @param[in]   r_stencilcoo coordinates of the stencil
+!> @param[out]  r_stencilval values at stencil coordinates
+!	  SUBROUTINE fillstencil(i_size, r_stencilcoo, r_stencilval)
+!
+!!---------- local declarations
+!
+!	  IMPLICIT NONE
+!
+!      INTEGER (KIND = GRID_SI), INTENT(in)                                :: i_size
+!      REAL (KIND = GRID_SR), DIMENSION(GRID_DIMENSION,i_size), INTENT(in) :: r_stencilcoo
+!      REAL (KIND = GRID_SR), DIMENSION(i_size), INTENT(out)               :: r_stencilval
+!
+!
+!	  RETURN
+!	  END SUBROUTINE fillstencil
+
+	END MODULE SLM_advanced
diff --git a/flash2d/src/options/SLM_advanced.mpslm.f90 b/flash2d/src/options/SLM_advanced.mpslm.f90
new file mode 100644
index 0000000..b7e1bbc
--- /dev/null
+++ b/flash2d/src/options/SLM_advanced.mpslm.f90
@@ -0,0 +1,2235 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_advanced
+! FUNCTION:
+!	
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_astep
+! FUNCTION:
+!	one step of the advanced SLM algorithm
+! SYNTAX:
+!	CALL slm_step(int, real.arr, real.arr)
+! ON INPUT:
+!	...
+! ON OUTPUT:
+!	r_tracer: array with tracer values	real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_adisplace
+! FUNCTION:
+!	extrapolate the alpha, values for the displacements of the upstream
+!	points from the gridpoints
+! SYNTAX:
+!	CALL slm_adisplace(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_coord: real array of xy-coordinates		real
+! ON OUTPUT:
+!	r_alpha: displacement vectors to each point	real
+! CALLS:
+!	wind_field
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_aupdate
+! FUNCTION:
+!	calculate the update to the velocity
+! SYNTAX:
+!	CALL slm_aupdate(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_rside: array with right hand side values	real
+! ON OUTPUT:
+!	r_udate: array with new (updated) gid values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is trivial for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_aupstream
+! FUNCTION:
+!	calculate right hand side of the equation (upstream values)
+! SYNTAX:
+!	CALL slm_aupstream(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_alpha: displacement vectors to each point	real
+! ON OUTPUT:
+!	r_rside: array with right hand side values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is just interpolation for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_ainterpolate
+! FUNCTION:
+!	do the MPSLM scheme (no interpolation is done!)
+! SYNTAX:
+!	CALL slm_MPscheme(grid, int, real, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	p_ogrid: grid handle to old grid (with data)	TYPE (grid_handle)
+!	r_fac:   factor at which point to interpolate	REAL
+!	i_arlen: array length for the following arrays	INTEGER
+!	r_coord: coordinate array (new grid)		REAL
+!	r_alpha: displacement array (corr. to r_coord)	REAL
+!	r_value: values on the old grid (array)		REAL
+! ON OUTPUT:
+!	r_rside: right hand side (interpolated)		REAL
+! CALLS:
+!
+! COMMENTS:
+!	this is the 2D implementation of Mass Packet SLM
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!   generate_MP_coeff
+! FUNCTION:
+!   generate mass packet coefficients to divide a single 
+!   triangle in parts
+! SYNTAX:
+!   CALL generate_MP_coeff()
+! ON INPUT:
+!   
+! ON OUTPUT:
+!   
+! CALLS:
+!
+! COMMENTS:
+!   
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!   remove_MP_coeff
+! FUNCTION:
+!   remove the MP_coeff from memory
+! SYNTAX:
+!   CALL generate_MP_coeff()
+! ON INPUT:
+!   
+! ON OUTPUT:
+!   
+! CALLS:
+!
+! COMMENTS:
+!   
+!
+!-----------------------------------------------------------------
+!
+! 
+! COMMENTS:
+!
+! USES:
+!   MISC_globalparam, MISC_error, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!
+!
+!*****************************************************************
+! PUBLIC:
+!	slm_step
+! COMMENTS:
+!
+! USES:
+!	FLASH_parameters, GRID_api, ADV_wind, ADV_rhs
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	04/2002
+!	2. original MPSLM version     	l. mentrup  	02/2003
+!	3. compliant to amatos 2.0	j. behrens	07/2003
+!   	4. adapted 2D version   	l. mentrup  	11/2003
+!	5. bugs fixed			j. behrens	12/2003
+!
+!*****************************************************************
+	MODULE SLM_advanced
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE GRID_api
+	  USE ADV_wind
+	  USE ADV_rhs
+	  
+
+!*****************************************************************
+
+	IMPLICIT NONE
+
+	INTEGER, SAVE                   	:: MAX_REFLVL
+
+!---------- Begin Triangle table
+
+	TYPE conservation_entry
+	  INTEGER                 		:: i_MPperTri
+	  INTEGER, POINTER			:: i_MPindex(:)            	! index array of the MP evoked by a triangle
+	  INTEGER            			:: i_refinelvl          	! refinement level
+	  LOGICAL       	      		:: l_massassigned
+	  LOGICAL   	          		:: l_searchtri
+	  LOGICAL             			:: l_refine
+	  REAL (KIND = GRID_SR)                			:: r_area
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_elementnodes)    :: r_mass          		! mass per corner point of the triangle
+	END TYPE conservation_entry
+
+
+	TYPE conservation_entry_ptr
+	  TYPE(conservation_entry), POINTER   	:: cp
+	END TYPE conservation_entry_ptr
+
+
+	TYPE (conservation_entry_ptr), DIMENSION(:,:), ALLOCATABLE, SAVE :: p_ttable  
+	
+!---------- End Triangle table
+
+
+!---------- Begin Mass Packet Coefficient table
+
+	!------ coefficient container to generate one mass packet
+	TYPE MP_coeff                   
+	  INTEGER               		:: i_origin 	! index of the originating triangle node
+	  INTEGER, DIMENSION(GRID_dimension)  	:: i_prvdir 	! prev direction of the tree
+	  INTEGER               		:: i_celltype   ! 1: @corner, 2: @edge, 3: in triangle
+	  REAL (KIND = GRID_SR)                  		:: r_area 	! ratio of the mass packets area to the area of the triangle
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_elementnodes)  	:: r_coeff  	! coefficients to compute the coordinates of the mass packet (dimensionless)
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_elementnodes)  	:: r_mass   	! defines how much mass per node will be assigned (ratio)
+	  LOGICAL               		:: l_end    	! end of tree? if TRUE, then create new branches in next refinement level
+	END TYPE MP_coeff
+
+
+	! array of MassPacket coefficients, to generate Mass Packets of a triangle for a certain reflvl
+	TYPE MP_coeff_arr                   
+	  TYPE (MP_coeff), POINTER      	:: mpc(:)   	!
+	END TYPE MP_coeff_arr
+
+
+	TYPE MP_coeff_arr_ptr
+	  INTEGER               		:: i_cnum   	! number of cells/mass packets, each cell is a mass packet
+	  TYPE (MP_coeff_arr), POINTER      	:: p_mpc    	! pointer to the mass packet coefficient array
+	END TYPE MP_coeff_arr_ptr
+
+
+	TYPE (MP_coeff_arr_ptr), DIMENSION(:), ALLOCATABLE, SAVE    :: p_MPCtable   ! pointer to the coefficient array of each reflvl
+	 
+	   
+!----------
+      
+      
+      
+!---------- Begin Mass packet table  
+   
+	TYPE MP_entry
+	  INTEGER                       	:: i_MPinTri
+	  INTEGER                       	:: i_MPbyTri
+	  REAL (KIND = GRID_SR)                          	:: r_mass
+	  REAL (KIND = GRID_SR)                              	:: r_area
+	  REAL (KIND = GRID_SR), DIMENSION (GRID_dimension)	:: r_coord
+	  LOGICAL                       	:: l_searchMP
+ 	  LOGICAL                       	:: l_assignmass
+	END TYPE MP_entry
+
+
+	TYPE MP_entry_ptr
+	  TYPE (MP_entry), POINTER         	:: MP
+	END TYPE MP_entry_ptr 
+	  
+!---------- End Mass packet table  
+
+
+!*****************************************************************
+
+	  PRIVATE
+	  PUBLIC  :: slm_astep, slm_interpolinit, slm_interpolquit
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_astep(p_ghand, p_param, p_time, r_modtime, i_size, &
+	                       r_coord, r_tracer, i_newsdepth)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                         :: p_param
+	  TYPE (sw_info), INTENT(inout)                             :: p_time
+	  REAL (KIND = GRID_SR), INTENT(in)                                          :: r_modtime
+	  INTEGER, INTENT(in)                                       :: i_size
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size), INTENT(in)        :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_size), INTENT(out)                      :: r_tracer
+	  INTEGER, OPTIONAL, INTENT(in)                             :: i_newsdepth
+	  
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE      :: r_newvl
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_alpha
+	  INTEGER                              :: i_alct
+
+!---------- check size!
+
+	  IF(i_size <= 0) THEN
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'INFO [slm_astep]: Zero step size, returning to calling routine'
+	    RETURN
+	  END IF
+
+!---------- allocate auxiliary arrays
+
+	  allocate(r_newvl(i_size), r_alpha(GRID_dimension,i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(38)
+	  END IF not_alloc
+
+!-SLM--------- calculate trajectory pieces (displacements)
+
+	  CALL stop_watch('start',3,p_time)
+	  CALL slm_adisplace(p_param, i_size, r_coord, r_alpha, r_time=r_modtime)
+	  CALL stop_watch('stop ',3,p_time)
+
+!-SLM--------- calculate right hand side
+
+	  CALL stop_watch('start',4,p_time)
+	  CALL slm_aupstream(p_ghand, i_size, r_coord, r_alpha, r_newvl)
+	  CALL stop_watch('stop ',4,p_time)
+
+!-SLM--------- calculate new grid values
+
+	  CALL stop_watch('start',5,p_time)
+	  CALL slm_aupdate(p_param, i_size, r_coord, r_newvl, r_tracer, r_time=r_modtime)
+	  CALL stop_watch('stop ',5,p_time)
+
+!-SLM--------- put alpha values to u and v field entries
+
+	  r_alpha= -r_alpha
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_newsdepth=i_newsdepth, i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  ELSE
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  END IF
+
+!-SLM--------- deallocate work arrays
+
+	  deallocate(r_alpha, r_newvl)
+
+	  RETURN
+	  END SUBROUTINE slm_astep
+
+!*****************************************************************
+	  SUBROUTINE slm_adisplace(p_param, i_arlen, r_coord, r_alpha, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                      :: p_param
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_alpha
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL				:: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)			:: r_fac, r_caf, &
+	    r_axy, r_xyc
+	  REAL (KIND = GRID_SR)                                                 :: r_dt0, r_dt1, &
+	    r_dt2, r_tim
+	  INTEGER                                              :: i_cnt1, i_cnt2
+          
+!---------- set constants
+
+	  r_dt0= p_param%num%r_deltatime
+	  r_dt1= 0.5_GRID_SR* p_param%num%r_deltatime
+	  r_dt2= 1.5_GRID_SR* p_param%num%r_deltatime
+	  r_fac= 0.5_GRID_SR
+	  r_caf= 2.0_GRID_SR
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- calculate in an iteration process the displacements
+
+	  unknown_loop: DO i_cnt1=1,i_arlen
+	    r_axy= 0.0_GRID_SR
+
+	    iter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_coord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO iter_loop
+
+	    r_alpha(:,i_cnt1)= r_axy
+	  END DO unknown_loop
+
+	  RETURN
+	  END SUBROUTINE slm_adisplace
+
+!*****************************************************************
+	  SUBROUTINE slm_aupdate(p_param, i_arlen, r_coord, r_rside, r_udate, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                   :: p_param
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_udate
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                          :: r_time
+	  INTEGER                                             :: i_cnt
+	  REAL (KIND = GRID_SR)                                                :: r_dt, r_tim
+
+!---------- in the linear advection case and with f90 this is just
+
+!	  r_udate= r_rside
+
+!---------- including a non-zero right hand side, we have
+
+	  r_dt= p_param%num%r_deltatime
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+	  main_loop: DO i_cnt=1, i_arlen
+	    r_udate(i_cnt)= r_rside(i_cnt)+ r_dt* slm_righthand(r_coord(:,i_cnt))
+	  END DO main_loop
+
+	  RETURN
+	  END SUBROUTINE slm_aupdate
+
+!*****************************************************************
+	  SUBROUTINE slm_aupstream(p_mesh, i_arlen, r_coord, &
+	                          r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)	       :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)		       :: r_fac
+
+!---------- set factor (at which point of trajectory shall i interpolate)
+
+	  r_fac= 1.0_GRID_SR
+
+!---------- in the linear advection case this is just interpolation
+
+	  CALL slm_ainterpolate(p_mesh, r_fac, i_arlen, r_coord, &
+	                       r_alpha, r_rside)
+
+	  RETURN
+	  END SUBROUTINE slm_aupstream
+	  
+!*****************************************************************
+
+      SUBROUTINE slm_ainterpolate(p_mesh, r_fac, i_arlen, &
+                                 r_coord, r_alpha, r_rside)
+
+!---------- local declarations
+
+	IMPLICIT NONE
+
+	TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_mesh
+	REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in)         	:: r_fac
+	INTEGER, INTENT(in)                                 	:: i_arlen
+	REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) 	:: r_coord
+	REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) 	:: r_alpha
+	REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               	:: r_rside
+     
+      
+	REAL (KIND = GRID_SR), DIMENSION(GRID_dimension, GRID_edgenodes) 	:: r_gn_coor
+	REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE           		:: r_en_coor_old
+	REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             		:: r_ref 
+      
+	REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE              		:: r_upstr
+	REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE             		:: r_elmtarea_up
+      
+	REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE             		:: r_totalarea
+          
+	REAL (KIND = GRID_SR), DIMENSION(i_arlen)                    		:: r_nmass, r_narea
+
+	REAL (KIND = GRID_SR), DIMENSION(GRID_elementnodes)            		:: r_mass_tmp
+	REAL (KIND = GRID_SR), DIMENSION(GRID_dimension, GRID_elementnodes)  	:: r_en_coor				! elementnodes coordinates
+	
+	!------- vars. for a priori determination of inner refinement level
+	REAL (KIND = GRID_SR)							:: r_beta				! see info below
+	REAL (KIND = GRID_SR)							:: r_elmtmass				! current tetra mass
+	REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE				:: r_elmtconc				! triangle (elmt) concentration array
+	REAL (KIND = GRID_SR)							:: r_elmtconc_max, r_elmtconc_min	! extrema of concentration in triangle (elmt)
+	REAL (KIND = GRID_SR)							:: r_relconc, r_relreflvl		! relative conc w.r.t. extrema (0..1)				
+
+	!------- control mass conservation
+	REAL (KIND = GRID_SR)                            			:: r_mass_before, r_mass_inside, r_mass_outside
+
+	!------- control inner adaptivity
+	INTEGER				 			:: MAX_LOOPS
+	REAL (KIND = GRID_SR)				    			:: r_gamma, r_eps
+	REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE				:: r_arearatio
+	REAL (KIND = GRID_SR)							:: r_arearatio_max, r_arearatio_min, r_arearatio_mean
+      
+	INTEGER				 			:: i_loopnum
+
+	
+	INTEGER, DIMENSION(:), ALLOCATABLE		  	:: i_mps_in_tri
+	INTEGER				 			:: i_mpInTri
+	INTEGER				 			:: i_MPidx
+!	INTEGER				 			:: i_elmtindex
+	INTEGER, DIMENSION(:,:), ALLOCATABLE			:: i_gnodes 
+	INTEGER, DIMENSION(:,:), ALLOCATABLE			:: i_elmtedges   
+	INTEGER, DIMENSION(:,:), ALLOCATABLE			:: i_enodes, i_enodes_old
+	INTEGER, DIMENSION(:,:), ALLOCATABLE			:: i_eneighbours
+	INTEGER, DIMENSION(:), ALLOCATABLE		  	:: i_elmtlevel	 	! level of refinement for each	triangle (finite element of triangular form)
+	INTEGER, DIMENSION(:), ALLOCATABLE			:: i_maxlvl
+	INTEGER				 			:: i_alct, i_siz
+	INTEGER							:: i_enum_f, i_enum_f_old, i_gnum,  i_nnum, i_nnum_old, i_MPnum, i_enum_mass
+	INTEGER				 			:: i_elmt_cnt, i_node_cnt, j_cnt, i_triangle_cnt, i_MP_cnt, i_cnt, i_dim
+	INTEGER				 			:: i_tim, i_timplus
+	INTEGER				 			:: i_massassigned, i_areaoverload, i_savedMP, i_totalMP
+	
+	INTEGER							:: i_reflvl_startincr, i_reflvl_incr, i_clvlbnd, i_rlvlbnd
+	
+	
+
+	TYPE (MP_entry_ptr), DIMENSION(:), ALLOCATABLE   	:: p_MPtable		! Mass	packet table
+	TYPE (MP_entry_ptr), DIMENSION(:), ALLOCATABLE   	:: p_MPtable_tmp	! temp. mass packet table, for initialization and reallocation purposes
+	TYPE (MP_entry), POINTER		    		:: p_MP			! temp. single mass packet entry
+	
+	TYPE (conservation_entry_ptr), DIMENSION(:), ALLOCATABLE  :: p_ttable_tmp	! temp. triangle table, for initialization and reallocation purposes
+	TYPE (conservation_entry), POINTER		 	:: p_ce			! temp. single conservation entry 
+	INTEGER, POINTER					:: i_MPidx_tmp(:)	! temp. mass packet index array to reallocate mass packets per triangle dynamically
+!-----------	
+	
+	
+	
+!----------- initialize
+	i_enum_f		= p_mesh(i_timeplus)%i_enumfine
+	i_enum_f_old  		= p_mesh(i_time)%i_enumfine
+	i_gnum	  		= p_mesh(i_timeplus)%i_gnumber
+	i_nnum_old		= p_mesh(i_time)%i_nnumber
+	i_nnum			= p_mesh(i_timeplus)%i_nnumber     
+	i_tim     		= p_mesh(i_time)%i_timetag
+	i_timplus 		= p_mesh(i_timeplus)%i_timetag
+	i_clvlbnd		= p_mesh(i_tim)%i_crslvlbnd	! coarsest refinement level
+	i_rlvlbnd		= p_mesh(i_tim)%i_reflvlbnd	! finest refinement level
+
+
+!----------- a priori refinement control
+   	r_beta			= 0.5   	! this controls how much the concentration is weighted against the reflvl of the triangle for 
+						! the a priori choice of refinement level
+
+!----------- a posteriori controls for inner adaptivity
+	MAX_LOOPS 		= 1		! set maximum inner iterations
+	i_reflvl_startincr	= 5		! starting increment for inner refinement
+	i_reflvl_incr 		= 3 		! increment for inner refinement
+
+	r_gamma 		= 1.1
+!----------- r_gamma controls the mass assignment
+!----------- if the total volume of all triangle which, via the barycenter, assigned mass to a triangle in the new mesh is greater than r_gamma*area(triangle), 
+!----------- the old mesh is coarse (w.r.t. volume) to be downstreamed without refining locally. Danger of mass concentration!	
+						
+	r_eps			= 1.e-5		! epsilon greather than zero...
+!-----------	
+
+  
+!---------- allocate work array
+!-------------- 'old mesh' arrays
+	
+	ALLOCATE(i_elmtlevel(i_enum_f_old), stat=i_alct)
+	IF(i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:slm_interpolate] Allocation error.')
+
+	ALLOCATE(i_maxlvl(i_enum_f_old), stat=i_alct)
+	IF(i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:slm_interpolate] Allocation error.')
+	    
+	ALLOCATE(i_enodes_old(GRID_elementnodes,i_enum_f_old), stat=i_alct)
+	IF(i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:slm_interpolate] Allocation error.')
+	
+	ALLOCATE(r_en_coor_old(GRID_dimension, i_nnum_old), stat=i_alct)
+	IF(i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:slm_interpolate] Allocation error.')
+	
+	ALLOCATE(r_elmtconc(i_enum_f_old), stat=i_alct)
+	IF(i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:slm_interpolate] Allocation error.')
+
+!-------------- 'new mesh' arrays     
+	
+	ALLOCATE(r_upstr(GRID_dimension, i_nnum), stat=i_alct)
+	IF(i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:slm_interpolate] Allocation error.')
+     
+	ALLOCATE(r_elmtarea_up(i_enum_f), stat=i_alct)
+	IF(i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:slm_interpolate] Allocation error.')
+	
+	ALLOCATE(r_totalarea(i_enum_f), stat=i_alct)
+	IF(i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:slm_interpolate] Allocation error.')
+	
+	ALLOCATE(r_arearatio(i_enum_f), stat=i_alct)
+	IF(i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:slm_interpolate] Allocation error.')
+	
+	ALLOCATE(i_mps_in_tri(i_enum_f), stat=i_alct)
+	IF(i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:slm_interpolate] Allocation error.')    
+	
+	ALLOCATE(i_gnodes(GRID_edgenodes,i_gnum), stat=i_alct)
+	IF(i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:slm_interpolate] Allocation error.')
+	
+	ALLOCATE(i_enodes(GRID_elementnodes,i_enum_f), stat=i_alct)
+	IF(i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:slm_interpolate] Allocation error.')
+	
+	ALLOCATE(i_elmtedges(GRID_elementedges,i_enum_f), stat=i_alct)
+	IF(i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:slm_interpolate] Allocation error.')
+	
+	ALLOCATE(i_eneighbours(GRID_elementedges, i_enum_f), stat=i_alct)
+	IF(i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:slm_interpolate] Allocation error.')
+
+!----------
+
+	
+!---------- preinitialize
+	
+	i_elmtlevel= 0.
+	i_enodes_old= 0
+	r_en_coor_old= 0.
+	r_elmtconc=0.
+	
+	r_upstr= 0.
+	r_elmtarea_up= 0.
+	r_totalarea= 0.
+	i_mps_in_tri= 0
+	i_gnodes= 0
+	i_enodes= 0
+	i_elmtedges= 0
+	i_eneighbours= 0
+	
+	r_nmass= 0.
+	r_narea= 0.
+	r_rside= 0.
+	
+!----------
+	
+
+!---------- initialize Tetra table	
+!---------- ATTENTION> values of i_timeplus and i_time are alternating after each timestep. thus i_timeplus(new_timestep) == i_time(old_timestep) etc.
+!---------- Did the length of the conservation table grow due to more nodes/tetrahedra in the new mesh? Then re-initialize the conservation table
+
+	IF (.NOT. ALLOCATED(p_ttable)) THEN
+	  CALL slm_interpolinit(p_mesh)
+	END IF
+
+	IF (size(p_ttable(i_timplus,:)) < i_enum_f) THEN
+	  ALLOCATE(p_ttable_tmp(i_enum_f_old), stat=i_alct)
+	  IF(i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:slm_interpolate] Allocation error.')
+	  
+	  DO i_cnt=1, i_enum_f_old
+	    p_ttable_tmp(i_cnt)%cp => p_ttable(i_tim, i_cnt)%cp
+	    DEALLOCATE(p_ttable(i_timplus, i_cnt)%cp)
+	  END DO
+	  
+	  DO i_cnt= i_enum_f_old+1, size(p_ttable(i_tim,:))
+	    DEALLOCATE(p_ttable(i_tim, i_cnt)%cp)
+	    DEALLOCATE(p_ttable(i_timplus, i_cnt)%cp)
+	  END DO
+	  		
+	  DEALLOCATE(p_ttable)
+	  
+	  ALLOCATE(p_ttable(GRID_timesteps, i_enum_f), stat=i_alct)    
+	  IF(i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:slm_interpolate] Allocation error.')
+			 
+	  DO i_cnt=1, i_enum_f_old
+	    p_ttable(i_tim, i_cnt)%cp => p_ttable_tmp(i_cnt)%cp
+	  END DO
+	  
+	  DEALLOCATE(p_ttable_tmp)
+	  
+	  DO i_cnt=i_enum_f_old+1, i_enum_f
+	    ALLOCATE(p_ce, stat=i_alct)
+	    IF (i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:slm_interpolate] Allocation error.')
+	    p_ce%i_MPperTri     	= 3
+	    p_ce%i_refinelvl		= 1
+	    p_ce%r_mass		= 0.
+	    p_ce%r_area     		= 0.
+	    p_ce%l_massassigned  	= .FALSE.
+	    p_ce%l_searchtri    	= .FALSE.
+	    p_ce%l_refine     		= .FALSE.
+	    p_ttable(i_tim, i_cnt)%cp 	=> p_ce
+	  END DO
+	  
+	  DO i_cnt=1, i_enum_f
+	    ALLOCATE(p_ce, stat=i_alct)
+	    IF (i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:slm_interpolate] Allocation error.')   
+	    p_ce%i_MPperTri     	= 3
+	    p_ce%i_refinelvl		= 1
+	    p_ce%r_mass			= 0.
+	    p_ce%r_area     		= 0.
+	    p_ce%l_massassigned 	= .FALSE.
+	    p_ce%l_searchtri    	= .FALSE.
+	    p_ce%l_refine     		= .FALSE.
+	    p_ttable(i_timplus, i_cnt)%cp => p_ce
+	  END DO
+	  
+	ELSE ! no array size adjustment necessary, reset i_timplus array to zero
+
+	  DO i_cnt=1, i_enum_f
+	    p_ttable(i_timplus, i_cnt)%cp%i_MPperTri    	= 3
+	    p_ttable(i_timplus, i_cnt)%cp%i_refinelvl     	= 1
+	    p_ttable(i_timplus, i_cnt)%cp%r_mass	   	= 0.
+	    p_ttable(i_timplus, i_cnt)%cp%r_area	  	= 0.	    
+	    p_ttable(i_timplus, i_cnt)%cp%l_massassigned 	= .FALSE.
+	    p_ttable(i_timplus, i_cnt)%cp%l_searchtri   	= .FALSE.
+	    p_ttable(i_timplus, i_cnt)%cp%l_refine	  	= .FALSE.   
+	  END DO  
+		     
+	END IF
+	
+!----------	   
+
+
+!---------- calculate upstream coordinates of the new mesh
+
+	dim_loop: DO i_cnt=1, GRID_dimension
+	  r_upstr(i_cnt,:) = r_coord(i_cnt,:)- r_fac(i_cnt)* r_alpha(i_cnt,:)
+	END DO dim_loop
+	
+!----------   
+
+
+!---------- collect necessary infos of the new mesh to assign the later generated mass points to the tetrahedra in the new mesh
+
+	CALL grid_getinfo(p_mesh(i_timeplus), l_finelevel=.TRUE., l_relative=.TRUE., i_elementnodes= i_enodes)
+	CALL grid_getinfo(p_mesh(i_timeplus), l_finelevel=.TRUE., l_relative=.TRUE., i_elementedges= i_elmtedges)
+	CALL grid_getinfo(p_mesh(i_timeplus), l_finelevel=.TRUE., l_relative=.TRUE., i_edgenodes= i_gnodes)
+	CALL grid_getinfo(p_mesh(i_timeplus), l_finelevel=.TRUE., l_relative=.TRUE., i_elementneighbors= i_eneighbours)
+
+	
+!----------
+
+
+!----------- calculate area of upstreamed elements (trisngles) to control assignment of mass to the new mesh later	
+
+	DO i_cnt= 1, i_enum_f
+	  r_elmtarea_up(i_cnt) = calc_triangarea(r_upstr(:, i_enodes(1, i_cnt)), r_upstr(:, i_enodes(2, i_cnt)),&
+					 r_upstr(:, i_enodes(3, i_cnt)))
+	END DO 
+	
+!----------
+
+
+!---------- collect necessary infos of the old mesh to generate mass packets
+
+	CALL grid_getinfo(p_mesh(i_time), r_nodecoordinates = r_en_coor_old)
+	CALL grid_getinfo(p_mesh(i_time), l_finelevel=.TRUE., l_relative=.TRUE., i_elementnodes= i_enodes_old)
+	CALL grid_getinfo(p_mesh(i_time), l_finelevel=.TRUE., i_elementlevel= i_elmtlevel)
+	
+!----------
+
+
+!---------- determine concentration max/min to compute refinement level of triangle later 
+!---------- (only non zero min/max since there are only mass packets for triangles with nonzero mass)
+
+	r_elmtconc_max = 0.
+	
+	!------ fill triangle concentration table
+	DO i_triangle_cnt= 1, i_enum_f_old
+	  r_elmtmass = SUM(p_ttable(i_tim, i_triangle_cnt)%cp%r_mass)
+	  IF (r_elmtmass > 0.) THEN
+	    r_elmtconc(i_triangle_cnt) = r_elmtmass / p_ttable(i_tim, i_triangle_cnt)%cp%r_area		! r_area > 0 for all triangles 
+	    r_elmtconc_min = r_elmtconc(i_triangle_cnt)	!choose any non-zero start for minimum search
+	  ELSE
+	    r_elmtconc(i_triangle_cnt) = 0.
+	  END IF
+	END DO
+        
+	!------ get the max/min
+	DO i_cnt=1,i_enum_f_old
+	  IF (r_elmtconc(i_cnt) > 0.) THEN
+	    IF (r_elmtconc(i_cnt) < r_elmtconc_min) THEN
+	      r_elmtconc_min = r_elmtconc(i_cnt)
+	    END IF
+	    IF (r_elmtconc(i_cnt) > r_elmtconc_max) THEN
+	      r_elmtconc_max = r_elmtconc(i_cnt)
+	    END IF
+	  END IF
+	END DO 
+	
+!----------       
+
+!---------- initialize all triangles with mass to be searched (a priori refinement level determination)
+
+	i_enum_mass = 0  
+	
+	DO i_triangle_cnt= 1, i_enum_f_old
+	  IF (p_ttable(i_tim, i_triangle_cnt)%cp%l_massassigned) THEN
+	    i_enum_mass = i_enum_mass + 1
+	    p_ttable(i_tim, i_triangle_cnt)%cp%l_searchtri = .TRUE.
+
+	    r_relconc 	= (r_elmtconc(i_triangle_cnt) - r_elmtconc_min + r_eps) / &		! beware of zero-valued terms --> r_eps
+			  (r_elmtconc_max - r_elmtconc_min + r_eps)
+	    r_relreflvl	= (REAL((i_elmtlevel(i_triangle_cnt) - i_clvlbnd),GRID_SR) + r_eps) / &		
+			  (REAL((i_rlvlbnd - i_clvlbnd),GRID_SR) + r_eps)
+	       
+            p_ttable(i_tim, i_triangle_cnt)%cp%i_refinelvl = CEILING(r_relconc * r_relreflvl * REAL(MAX_REFLVL,GRID_SR)) ! - i_reflvl_incr))
+
+	    IF (p_ttable(i_tim, i_triangle_cnt)%cp%i_refinelvl > MAX_REFLVL) THEN
+             p_ttable(i_tim, i_triangle_cnt)%cp%i_refinelvl = MAX_REFLVL
+	    ELSE
+	      IF (p_ttable(i_tim, i_triangle_cnt)%cp%i_refinelvl < 7) THEN
+	        p_ttable(i_tim, i_triangle_cnt)%cp%i_refinelvl = 7
+              END IF
+	    END IF  
+
+	    p_ttable(i_tim, i_triangle_cnt)%cp%i_MPperTri = p_MPCtable(p_ttable(i_tim, i_triangle_cnt)%cp%i_refinelvl)%i_cnum	    
+	  ELSE 
+	    p_ttable(i_tim, i_triangle_cnt)%cp%l_searchtri = .FALSE.
+	    p_ttable(i_tim, i_triangle_cnt)%cp%i_refinelvl = 1
+	    p_ttable(i_tim, i_triangle_cnt)%cp%i_MPperTri  = 3
+	  END IF
+	  
+	  ALLOCATE(i_MPidx_tmp(p_ttable(i_tim, i_triangle_cnt)%cp%i_MPperTri), stat=i_alct)
+	  IF (i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:slm_interpolate] Allocation error.')	  
+	  i_MPidx_tmp = 0
+	  p_ttable(i_tim,i_triangle_cnt)%cp%i_MPindex => i_MPidx_tmp
+	  NULLIFY(i_MPidx_tmp)
+	  	  
+	END DO
+	
+!-----------
+
+
+!----------- initialize Mass Point table
+
+	i_MPnum = 0
+	
+	!------ determine total number of Mass points
+	DO i_triangle_cnt= 1, i_enum_f_old
+	  IF (p_ttable(i_tim, i_triangle_cnt)%cp%l_massassigned) THEN
+	    i_MPnum = i_MPnum + p_ttable(i_tim, i_triangle_cnt)%cp%i_MPperTri
+	  END IF
+	END DO
+	!------
+     	
+	!------ Allocate and initialize new mass point table
+	ALLOCATE(p_MPtable(i_MPnum), stat=i_alct)
+	IF (i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:slm_interpolate] Allocation error.')
+    
+	DO i_cnt = 1, i_MPnum
+	  ALLOCATE(p_MP, stat=i_alct)
+	  IF (i_alct/=0) CALL grid_error(c_error='[SLM_simple.mpslm:slm_interpolate] Allocation error.')
+	  p_MP%i_MPinTri = 0
+	  p_MP%i_MPbyTri = 0
+	  p_MP%r_mass = 0.
+	  p_MP%r_area = 0.
+	  p_MP%r_coord = 0.
+	  p_MP%l_searchMP = .FALSE.
+	  p_MP%l_assignmass = .FALSE.
+	  p_MPtable(i_cnt)%MP => p_MP
+	  NULLIFY(p_MP)
+	END DO
+	!------
+	
+!----------
+         
+
+!---------- start iterating loop here--------------------
+
+	i_loopnum = 0
+	i_savedMP = 0
+	i_totalMP = 0
+	
+	iterating_loop:DO 
+	  i_loopnum = i_loopnum + 1
+    
+  	!------ create mass point table from triangle table      
+      	  
+	  !------ determine total number of Mass packets
+	  i_MPnum = 0
+	  
+	  DO i_triangle_cnt= 1, i_enum_f_old
+	    IF (p_ttable(i_tim, i_triangle_cnt)%cp%l_massassigned) THEN
+	      i_MPnum = i_MPnum + p_ttable(i_tim, i_triangle_cnt)%cp%i_MPperTri
+	    END IF
+	  END DO
+       	  !------		
+		
+	  !------ Create new mass points which still have to be searched (save old already found ones, if existent)
+	  !------ temporary array is not nice, but necessary here, no dynamic memory allocation on p_MPtable in other module possible	  
+	  ALLOCATE(p_MPtable_tmp(i_MPnum), stat=i_alct)
+	  IF (i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:slm_interpolate] Allocation error.')
+          
+	  CALL createMPs(p_MPtable,p_MPtable_tmp,i_MPnum, i_tim, r_en_coor_old, i_nnum, i_enodes_old, i_enum_f_old)
+            
+	  i_siz = size(p_MPtable)
+	  DO i_cnt=1,i_siz
+	    DEALLOCATE(p_MPtable(i_cnt)%MP)
+	  END DO      
+	  DEALLOCATE(p_MPtable)    
+	  ALLOCATE(p_MPtable(i_MPnum), stat=i_alct)
+	  IF (i_alct/=0) CALL grid_error(c_error='[SLM_simple.mpslm:slm_interpolate] Allocation error.')
+        
+	  DO i_cnt = 1, i_MPnum
+	    p_MPtable(i_cnt)%MP => p_MPtable_tmp(i_cnt)%MP
+	  END DO
+      
+	  i_siz = size(p_MPtable_tmp)
+	  DO i_cnt = i_MPnum+1, i_siz
+	    DEALLOCATE(p_MPtable_tmp(i_cnt)%MP)
+	  END DO     
+	  DEALLOCATE(p_MPtable_tmp)
+	  !------
+	  
+	!------
+
+	  
+	!------ Now we have the coordinates of the barycenter and the mass of the mass packetsts. Lets look, in which 'new mesh' triangle they lie	  
+	!------ find triangle of the upstreamed mesh in which each mass packet lies
+ 
+	  masspacket_loop: DO i_cnt=1, i_MPnum
+	  
+	    IF (p_MPtable(i_cnt)%MP%l_searchMP) THEN				! if the position of MP is already known, why search again?
+	      i_totalMP = i_totalMP + 1 
+	      CALL searchMP(p_MPtable, i_MPnum, i_cnt, i_enum_f, i_gnum, &		! this subroutine is very time consuming!
+			  i_nnum, i_gnodes, i_enodes, i_elmtedges, i_eneighbours, r_upstr)  	
+	    END IF
+	     
+	  END DO masspacket_loop
+	  
+	!------
+
+	
+	!------------ What about mass packets lying outside the mesh? masses will NOT be assigned to any nodes
+
+
+	!------ generate area stats: How much area does the triangles of the new get of the old mesh; for a posteriori adaption control mechanism
+	
+      	  r_totalarea(:) 	= 0.
+	  i_mps_in_tri(:)  	= 0
+	  
+	  DO i_cnt=1, i_MPnum
+	    IF (p_MPtable(i_cnt)%MP%l_assignmass) THEN
+	      i_mpInTri = p_MPtable(i_cnt)%MP%i_MPinTri
+	      r_totalarea(i_mpInTri) = r_totalarea(i_mpInTri) + p_MPtable(i_cnt)%MP%r_area
+	      i_mps_in_tri(i_mpInTri) = i_mps_in_tri(i_mpInTri) + 1
+	    END IF
+	  END DO
+	  
+	!-------
+	
+
+	!------ generate stats how many tetras in the new mesh will get mass assigned
+	
+	  i_massassigned = 0
+	  
+	  DO i_cnt=1,i_enum_f
+	    IF (i_mps_in_tri(i_cnt) > 0) THEN
+	      i_massassigned = i_massassigned +1
+	    END IF
+	  END DO
+	  
+	  IF (i_massassigned == 0) THEN
+	    CALL grid_error(c_error='[SLM_interpolation] No mass to assign.')
+	  END IF
+	  
+	!------
+	
+	
+	!------- calculate ratio of assigned area w.r.t. upstream area of triangle; get min, max and mean value
+	  
+	  r_arearatio_max 	= 1.0
+	  r_arearatio_min 	= 1.0
+	  r_arearatio_mean	= 1.0
+	  j_cnt			= 0
+	  
+	  DO i_cnt=1, i_enum_f
+	    IF (r_totalarea(i_cnt) > 0. .AND. r_elmtarea_up(i_cnt) > 0.) THEN
+	      r_arearatio(i_cnt) = r_totalarea(i_cnt) / r_elmtarea_up(i_cnt)
+	      IF (r_arearatio(i_cnt) > r_arearatio_max) THEN
+		r_arearatio_max = r_arearatio(i_cnt)
+	      END IF
+	      IF (r_arearatio(i_cnt) < r_arearatio_min) THEN   
+	        r_arearatio_min = r_arearatio(i_cnt)
+	      END IF
+	      j_cnt = j_cnt +1
+	      r_arearatio_mean = r_arearatio_mean + r_arearatio(i_cnt)
+	    END IF
+	  END DO
+	  
+	  r_arearatio_mean = r_arearatio_mean / REAL(j_cnt,GRID_SR)		!without zero-valued tetras
+
+	!-------
+	
+	
+	!------- check the volume condition and refine in case of "area overload"
+	
+	  i_areaoverload = 0
+	  
+	  mp_loop: DO i_cnt=1, i_MPnum
+	    i_mpInTri = p_MPtable(i_cnt)%MP%i_MPinTri
+	    
+	    !------ 
+	    IF ((.NOT. p_MPtable(i_cnt)%MP%l_assignmass)  .OR. &
+	  	(i_MPinTri == 0) 			  .OR. &
+            	(p_MPtable(i_cnt)%MP%r_mass == 0.)) 	  THEN
+		
+              CYCLE mp_loop
+            END IF
+	    !------
+        
+            !------ if the total volume of mass packets landed in the upstreamed triangle is greater than r_gamma*area(upstreamed triangle), refine!       
+            IF (r_gamma < r_arearatio(i_MPinTri)) THEN
+               
+              !------ dont assign mass of this tetra to the nodes of the new mesh; refine first         
+              p_ttable(i_tim, p_MPtable(i_cnt)%MP%i_MPbyTri)%cp%l_refine = .TRUE.         
+
+              !------ for the stats: note the number of tetra in new mesh with too much volume assigned
+              IF (i_mps_in_tri(i_MPinTri) > 0) THEN
+		i_areaoverload = i_areaoverload + 1
+		i_mps_in_tri(i_MPinTri) = 0
+	      END IF
+         
+	    END IF
+	    !------
+	         
+	  END DO mp_loop
+	  
+	!----------
+	
+     	!---------- leave refinement loop if MAX_LOOPS is arrived   ! or no area overload is determined
+	
+	  IF ((i_loopnum == MAX_LOOPS) ) THEN	!.OR. (i_areaoverload == 0)
+	    EXIT
+	  ELSE    
+            !------ rise refinement_lvl and mark triangles for re-search 
+	    DO i_cnt= 1, i_enum_f_old
+	    
+	      IF ((p_ttable(i_tim, i_cnt)%cp%l_refine) .AND. (p_ttable(i_tim, i_cnt)%cp%i_refinelvl < MAX_REFLVL)) THEN
+	      
+	        !------ all MPs by one triangle must be recalculated, reset all MPs of the concerned triangle
+	        DO j_cnt=1, p_ttable(i_tim, i_cnt)%cp%i_MPperTri
+        	  i_MPidx = p_ttable(i_tim, i_cnt)%cp%i_MPindex(j_cnt)      
+        	  p_MPtable(i_MPidx)%MP%l_assignmass = .FALSE.
+		END DO
+		!------
+		
+	      	!------ set new inner refinement level of triangle
+		p_ttable(i_tim, i_cnt)%cp%i_refinelvl = p_ttable(i_tim, i_cnt)%cp%i_refinelvl + i_reflvl_incr
+		IF (p_ttable(i_tim, i_cnt)%cp%i_refinelvl > MAX_REFLVL) p_ttable(i_tim, i_cnt)%cp%i_refinelvl = MAX_REFLVL
+		p_ttable(i_tim, i_cnt)%cp%i_MPperTri = p_MPCtable(p_ttable(i_tim, i_cnt)%cp%i_refinelvl)%i_cnum
+		!------
+		
+	      	!------ prolongue the dynamically administered Mass packet index array
+		DEALLOCATE(p_ttable(i_tim, i_cnt)%cp%i_MPindex)
+		ALLOCATE(i_MPidx_tmp(p_ttable(i_tim, i_cnt)%cp%i_MPperTri), stat=i_alct)
+		IF (i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:slm_interpolate] Allocation error.')
+		i_MPidx_tmp = 0
+		p_ttable(i_tim, i_cnt)%cp%i_MPindex => i_MPidx_tmp
+		NULLIFY(i_MPidx_tmp)
+		!------
+		
+	      	!------ set logical values for re-search	
+		p_ttable(i_tim, i_cnt)%cp%l_refine = .FALSE.
+		p_ttable(i_tim, i_cnt)%cp%l_searchtri = .TRUE.
+		!------
+		
+	      ELSE ! triangle not to be refined or already on maximum refinement level	      
+		p_ttable(i_tim, i_cnt)%cp%l_searchtri = .FALSE.
+	      END IF
+	      
+	    END DO
+	    !------
+	    
+	  END IF
+	  
+	!----------
+
+	
+	END DO iterating_loop  
+	
+!---------- end iterating loop here--------------------   
+
+
+!---------- assign mass of the mass packets to the nodes of the triangle in which the mass packet landed; save mass and volume for next step
+
+    mass_assignment_mp_loop: DO i_cnt=1, i_MPnum        
+        
+	  IF (.NOT. p_MPtable(i_cnt)%MP%l_assignmass 	.OR. &
+	      p_MPtable(i_cnt)%MP%i_MPinTri == 0 	.OR. &
+	      p_MPtable(i_cnt)%MP%r_mass == 0.) THEN
+	    
+	    CYCLE mass_assignment_mp_loop
+	  
+	  END IF
+        
+	  r_mass_tmp = 0
+	  i_mpInTri = p_MPtable(i_cnt)%MP%i_MPinTri
+        
+	  DO i_node_cnt=1, GRID_elementnodes
+	    r_en_coor(:,i_node_cnt) = r_upstr(:,i_enodes(i_node_cnt, i_mpInTri))
+	  END DO  
+        
+	  r_mass_tmp = assign_mass(r_en_coor, p_MPtable(i_cnt)%MP%r_coord, p_MPtable(i_cnt)%MP%r_mass)
+        
+	  r_nmass(i_enodes(1,i_mpInTri)) = r_nmass(i_enodes(1,i_mpInTri)) + r_mass_tmp(1)
+	  r_nmass(i_enodes(2,i_mpInTri)) = r_nmass(i_enodes(2,i_mpInTri)) + r_mass_tmp(2)
+	  r_nmass(i_enodes(3,i_mpInTri)) = r_nmass(i_enodes(3,i_mpInTri)) + r_mass_tmp(3)
+        
+	  p_ttable(i_timplus,i_mpInTri)%cp%r_mass    =  p_ttable(i_timplus,i_mpInTri)%cp%r_mass + r_mass_tmp
+	  p_ttable(i_timplus,i_mpInTri)%cp%l_massassigned = .TRUE.
+	  p_ttable(i_timplus,i_mpInTri)%cp%l_searchtri   = .TRUE.
+            
+	END DO mass_assignment_mp_loop
+      
+!----------
+
+     
+!---------- calculate area of triangles of the new mesh to assign to the mass packets 
+   
+	DO i_cnt= 1, i_enum_f
+	  IF (p_ttable(i_timplus,i_mpInTri)%cp%l_massassigned) THEN
+	    p_ttable(i_timplus, i_cnt)%cp%r_area = &
+	    	calc_triangarea(r_coord(:, i_enodes(1, i_cnt)), r_coord(:, i_enodes(2, i_cnt)), &
+                            r_coord(:, i_enodes(3, i_cnt)))
+          END IF
+        END DO 
+	
+!----------  
+
+  
+!---------- write assignment stats
+
+	write(GRID_parameters%ioout, 1000)
+	write(GRID_parameters%ioout, 1400) i_enum_f
+	write(GRID_parameters%ioout, 1401) i_massassigned
+	write(GRID_parameters%ioout, 1402) i_areaoverload
+	write(GRID_parameters%ioout, 1403) r_arearatio_max, r_arearatio_min, r_arearatio_mean
+	write(GRID_parameters%ioout, 1404) i_totalMP - i_savedMP, i_loopnum
+	
+!----------
+
+
+!---------- generate and write mass statistics
+
+	r_mass_before  = 0.
+	r_mass_outside = 0.
+	r_mass_inside  = 0.
+      
+	DO i_cnt=1, i_enum_f_old
+	  r_mass_before = r_mass_before + SUM(p_ttable(i_tim, i_cnt)%cp%r_mass)      
+	END DO
+      
+	DO i_cnt= 1, i_MPnum
+ 	  IF (p_MPtable(i_cnt)%MP%i_MPinTri == 0) THEN
+	    r_mass_outside = r_mass_outside + p_MPtable(i_cnt)%MP%r_mass
+	  END IF
+	END DO
+            
+	DO i_cnt=1,i_enum_f
+	  r_mass_inside = r_mass_inside + SUM(p_ttable(i_timplus, i_cnt)%cp%r_mass)
+	END DO
+      
+	write(GRID_parameters%ioout, 1000)
+	write(GRID_parameters%ioout, 1001) r_mass_before 
+	write(GRID_parameters%ioout, 1002) r_mass_inside
+	write(GRID_parameters%ioout, 1003) r_mass_outside
+	write(GRID_parameters%ioout, 1004) r_mass_inside+r_mass_outside
+      
+!----------
+
+
+!---------- calculate the "influenced" area ( grid_nodearea() ) of each node and, by knowing the summarized mass, the concentration at the upstream node of the mesh
+
+	CALL grid_nodearea(p_mesh(i_timeplus), i_nnum, r_narea)    
+	
+	r_rside =  r_nmass / r_narea
+
+!----------	
+
+
+!---------- generate and write concentration stats
+
+	write(GRID_parameters%ioout, 1000)
+	write(GRID_parameters%ioout, 1300) MAXVAL(r_rside), MINVAL(r_rside)
+	write(GRID_parameters%ioout, 1000)
+      
+!----------
+      
+      
+!---------- this is it! deallocate all temporal variables
+
+	DEALLOCATE(i_elmtlevel)
+	DEALLOCATE(i_maxlvl)
+	DEALLOCATE(i_enodes_old)
+	DEALLOCATE(r_en_coor_old)
+	DEALLOCATE(r_elmtconc)
+      
+	DEALLOCATE(r_upstr)
+	DEALLOCATE(r_elmtarea_up)
+	DEALLOCATE(r_totalarea)
+	DEALLOCATE(r_arearatio)
+	DEALLOCATE(i_mps_in_tri)
+	DEALLOCATE(i_gnodes)
+	DEALLOCATE(i_enodes)
+	DEALLOCATE(i_elmtedges)
+	DEALLOCATE(i_eneighbours)
+      
+      	DO i_cnt=1, i_enum_f_old
+	  DEALLOCATE(p_ttable(i_tim, i_cnt)%cp%i_MPindex)
+	END DO
+      
+	DO i_cnt=1, i_MPnum
+	  DEALLOCATE(p_MPtable(i_cnt)%MP)
+	END DO
+	DEALLOCATE(p_MPtable)
+      
+!---------     
+      
+
+      RETURN
+      
+      1000	FORMAT(1x,'***** ***** ***** ***** ***** ***** ***** ***** ***** *****')
+      1001	FORMAT(1x,'***** Total mass in last step:',11x,e12.4,' *****')
+      1002	FORMAT(1x,'***** Total mass in new mesh :',11x,e12.4,' *****')
+      1003	FORMAT(1x,'***** Total mass outside new mesh (lost):',e12.4,' *****')
+      1004	FORMAT(1x,'***** Total mass in this step:',11x,e12.4,' *****')
+      
+      1100	FORMAT(1x,'----- Warning, windless field! more than one barycenter in: ',i12,' -----')
+      1200	FORMAT(1x,'----- Warning, mass assignment critical in: ',i12,' -----')
+      1300	FORMAT(1x,'***** Max conc.:',1x,e12.4,' Min conc.:',1x,e12.4,' *****')
+      1400	FORMAT(1x,'***** Total triang in new mesh:',10x,i12,' *****')
+      1401	FORMAT(1x,'***** --- with mass:',21x,i12,' *****')
+      1402	FORMAT(1x,'***** --- with too much area assigned:',3x,i12,' *****')
+      1403	FORMAT(1x,'***** Max vol.:',1x,e10.4,' Min vol.:',1x,e10.4,' Mean vol.:',1x,e10.4,' *****')
+      1404	FORMAT(1x,'***** No. of mass points:',1x,i9,' in loops ',i8,' *****')
+      
+      
+      
+      END SUBROUTINE slm_ainterpolate
+      
+!*****************************************************************
+
+      SUBROUTINE slm_interpolinit(p_mesh)
+
+!---------- local declarations
+
+	IMPLICIT NONE
+
+	TYPE (grid_handle), DIMENSION(GRID_timesteps)       	:: p_mesh
+	
+	
+	INTEGER, DIMENSION(:,:), ALLOCATABLE			:: i_enodes
+	REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE             		:: r_nval
+	REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE             		:: r_elmtarea
+	REAL (KIND = GRID_SR), DIMENSION(GRID_elementnodes)            		:: r_nmass_tmp
+        
+	TYPE (conservation_entry), POINTER              	:: p_ce1, p_ce2
+      
+	INTEGER                         			:: i_alct, i_cnt, i_enode_cnt, i_MP_cnt, i_ecnt
+	INTEGER                         			:: i_enum_f_old, i_nnum_old, i_tim, i_timplus
+      
+!---------- preinitialize
+      
+	i_enum_f_old  	= p_mesh(i_time)%i_enumfine
+	i_nnum_old	= p_mesh(i_time)%i_nnumber 
+	i_tim         	= p_mesh(i_time)%i_timetag        
+	i_timplus     	= p_mesh(i_timeplus)%i_timetag 
+      
+
+!---------- allocate work array
+!-------------- 'old mesh' arrays
+
+	ALLOCATE(i_enodes(GRID_elementnodes, i_enum_f_old), stat=i_alct)
+	IF(i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:slm_interpolinit] Allocation error.')
+	
+	ALLOCATE(r_nval(1,i_nnum_old), stat=i_alct)
+	IF(i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:slm_interpolinit] Allocation error.')
+      
+	ALLOCATE(r_elmtarea(i_enum_f_old), stat=i_alct)
+	IF(i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:slm_interpolinit] Allocation error.')
+      
+!--------------- allocate the table, which saves the mass to be conserved throughout all computation steps
+	ALLOCATE(p_ttable(GRID_timesteps, i_enum_f_old), stat=i_alct) 
+	IF(i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:slm_interpolinit] Allocation error.')
+
+
+!--------------- preinitialize
+	i_enodes	= 0.
+	r_nval		= 0.
+	r_elmtarea	= 0.
+          
+!---------- initialize conservation table with the values to be conserved
+	CALL grid_getinfo(p_mesh(i_time), l_finelevel=.TRUE., l_relative=.TRUE., i_elementnodes = i_enodes)
+	CALL grid_getinfo(p_mesh(i_time), i_arraypoint= (/ GRID_tracer /), r_nodevalues = r_nval)
+	CALL calc_alltriarea(p_mesh(i_time), i_enum_f_old, r_elmtarea)
+      
+!---------- initialize coefficient table
+	CALL generate_MP_coeff(p_mesh)
+
+!---------- initialize p_ttable with values where mass is present
+	elmt_loop: DO i_ecnt= 1, i_enum_f_old       
+	  ALLOCATE (p_ce1, p_ce2, stat=i_alct)        
+	  IF (i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:slm_interpolinit] Allocation error.')
+        
+	  IF(r_nval(1,i_enodes(1,i_ecnt))/=0. .OR. r_nval(1,i_enodes(2,i_ecnt))/=0. .OR. &
+             r_nval(1,i_enodes(3,i_ecnt))/=0.) THEN
+          !---- create new triangle entry with mass
+	    p_ce1%i_MPperTri		= 3
+	    p_ce1%l_massassigned	= .TRUE.
+	    p_ce1%l_searchtri		= .TRUE.
+	    p_ce1%l_refine		= .FALSE.
+	    p_ce1%i_refinelvl		= 1
+	    p_ce1%r_area		= r_elmtarea(i_ecnt)
+	    DO i_enode_cnt= 1, GRID_elementnodes
+	      p_ce1%r_mass(i_enode_cnt) = r_nval(1,i_enodes(i_enode_cnt, i_ecnt)) * (1./3.*p_ce1%r_area)
+	    END DO
+	    p_ttable(i_tim, i_ecnt)%cp => p_ce1
+	    NULLIFY(p_ce1)
+	  ELSE
+	    p_ce1%i_MPperTri		= 3
+	    p_ce1%l_massassigned	= .FALSE.
+	    p_ce1%l_searchtri		= .FALSE.
+	    p_ce1%l_refine		= .FALSE.
+	    p_ce1%i_refinelvl		= 1
+	    p_ce1%r_area		= 0.
+	    p_ce1%r_mass		= 0. 
+	    p_ttable(i_tim, i_ecnt)%cp => p_ce1
+	    NULLIFY(p_ce1)
+	  END IF
+	  
+	  p_ce2%i_MPperTri		= 3
+	  p_ce2%l_massassigned		= .FALSE.
+	  p_ce2%l_searchtri		= .FALSE.
+	  p_ce2%l_refine		= .FALSE.
+	  p_ce2%i_refinelvl		= 1
+	  p_ce2%r_area			= 0.
+	  p_ce2%r_mass			= 0.
+	  p_ttable(i_timplus, i_ecnt)%cp => p_ce2
+	  NULLIFY(p_ce2)                 
+	END DO elmt_loop
+
+!--------- deallocation      
+      
+	DEALLOCATE(r_nval)
+	DEALLOCATE(i_enodes)
+	DEALLOCATE(r_elmtarea)   
+      
+	RETURN
+	
+      END SUBROUTINE slm_interpolinit
+      
+!*****************************************************************
+
+      SUBROUTINE slm_interpolquit
+      
+!---------- local declarations
+
+	IMPLICIT NONE
+      
+	INTEGER				:: i_cnt, i_siz
+      
+      
+	CALL remove_MP_coeff
+      
+	i_siz = size(p_ttable(1,:))
+	DO i_cnt= 1, i_siz
+	  DEALLOCATE(p_ttable(1,i_cnt)%cp)
+	  DEALLOCATE(p_ttable(2,i_cnt)%cp)
+	END DO
+      
+
+	DEALLOCATE(p_ttable)
+
+	RETURN
+	
+      END SUBROUTINE slm_interpolquit
+      
+!*****************************************************************
+
+      SUBROUTINE searchMP(p_MPtable, i_MPnum, i_MPcnt, i_enum_f, i_gnum, &
+      			  i_nnum, i_gnodes, i_enodes, i_elmtedges, i_eneighbours, r_upstr)
+      
+!---------- local declarations
+
+	IMPLICIT NONE
+      
+	TYPE (MP_entry_ptr), DIMENSION(i_MPnum)   		:: p_MPtable
+	INTEGER							:: i_MPnum
+	INTEGER							:: i_MPcnt
+      
+      
+	INTEGER, DIMENSION(GRID_edgenodes, i_gnum)		:: i_gnodes
+	INTEGER, DIMENSION(GRID_elementnodes, i_enum_f)		:: i_enodes
+	INTEGER, DIMENSION(GRID_elementedges, i_enum_f)		:: i_elmtedges
+	INTEGER, DIMENSION(3, i_enum_f)				:: i_eneighbours
+	REAL (KIND = GRID_SR), DIMENSION(GRID_dimension, i_nnum)			:: r_upstr
+      
+      
+      
+	INTEGER							:: i_enum_f, i_gnum, i_nnum, i_enum_f_old, i_enum
+	
+	INTEGER							:: i_cnt, j_cnt, i_node_cnt, i_gcnt, i_elmt_cnt, i_loopcnt
+	INTEGER							:: i_elmtindex
+	INTEGER							:: i_gnode_loc, i_elmtnode_loc, i_elmtedge_loc
+      
+	REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)				:: r_ref
+	REAL (KIND = GRID_SR), DIMENSION(GRID_dimension, GRID_edgenodes)		:: r_gn_coor
+      
+	LOGICAL							:: l_elmtfound, l_sameside, l_circled
+      
+
+
+   
+!	i_elmtindex = 1
+	i_loopcnt=0
+        
+	!------ set starting triangle
+	IF (p_MPtable(i_MPcnt)%MP%i_MPbyTri < i_enum_f) THEN
+          i_elmtindex = p_MPtable(i_MPcnt)%MP%i_MPbyTri            
+        ELSE
+          i_elmtindex = i_enum_f
+        END IF
+        !------
+	 
+	 
+                
+        !------ in which triangle of the new upstreamed mesh does the mass packet of the old mesh lie?
+        search_loop: DO 
+          l_elmtfound = .TRUE.
+	  i_loopcnt = i_loopcnt +1
+          !------ check whether mass packet is in triangle
+          edge_loop: DO i_gcnt=1, GRID_elementedges
+	    i_elmtedge_loc = i_elmtedges(i_gcnt,i_elmtindex)
+        
+	    !------ get the upstream coords for the two edge nodes
+	    node_loop: DO i_node_cnt=1, GRID_edgenodes
+	      i_gnode_loc = i_gnodes(i_node_cnt,i_elmtedge_loc)
+              r_gn_coor(:,i_node_cnt) = r_upstr(:,i_gnode_loc)
+            END DO node_loop
+	    !------
+	    
+            !------ each edge has two nodes, get the upstrean coordinates of the third trianglenode (called r_ref)
+            trianglenode_loop: DO i_node_cnt=1,GRID_elementnodes
+	      i_elmtnode_loc = i_enodes(i_node_cnt,i_elmtindex)
+              IF (i_gnodes(1,i_elmtedge_loc) /= i_elmtnode_loc) THEN
+	        IF (i_gnodes(2,i_elmtedge_loc) /= i_elmtnode_loc) THEN
+        	  r_ref = r_upstr(:,i_elmtnode_loc)
+        	  EXIT
+		END IF
+              END IF 
+            END DO trianglenode_loop
+	    !------ 
+	    	    
+	    !------ is the barycenter of the mass packet on the same side of the triangle edge as the reference point?
+            l_sameside= sameside_2d(r_gn_coor(:,1), r_gn_coor(:,2), r_ref, p_MPtable(i_MPcnt)%MP%r_coord)
+
+            !------ if not, mass packet is not in the currently observed triangle, get triangle next to the current triangle via edge which resulted "packet outside"
+            IF (.NOT. l_sameside) THEN
+              i_elmtindex = i_eneighbours(i_gcnt, i_elmtindex)
+              l_elmtfound = .FALSE.
+            END IF
+	    !------
+	       
+          END DO edge_loop
+          !------
+          
+          !------ neighbour triangle does not exist, mass packet outside the mesh, mass lost; check next mass packet
+          IF (i_elmtindex==0) THEN
+            p_MPtable(i_MPcnt)%MP%i_MPinTri = 0
+            p_MPtable(i_MPcnt)%MP%l_searchMP = .FALSE.
+            p_MPtable(i_MPcnt)%MP%l_assignmass = .FALSE.
+            EXIT
+          END IF
+          !------
+          
+          !------ triangle found! remember triangle for assigning the mass packet's mass to the triangle nodes later, check next mass packet
+          IF (l_elmtfound) THEN 
+            p_MPtable(i_MPcnt)%MP%i_MPinTri = i_elmtindex
+            p_MPtable(i_MPcnt)%MP%l_searchMP = .FALSE.
+            p_MPtable(i_MPcnt)%MP%l_assignmass = .TRUE. 
+            EXIT
+          END IF
+          !------
+                  
+          !------ triangle not found: stay in search_loop and search on with next triangle (no EXIT command)
+        END DO search_loop
+
+	RETURN
+	
+      END SUBROUTINE searchMP
+      
+!*****************************************************************
+
+      FUNCTION assign_mass(r_en_coor, r_mp_coor, r_mp_mass) RESULT(r_nmass_tmp)
+
+
+!---------- compute partial mass of mass packet which will be assigned to the nodes of the triangle 
+!---------- the mass packet landed in.
+
+    
+!---------- local declarations
+
+        IMPLICIT NONE   
+	REAL (KIND = GRID_SR), DIMENSION(GRID_dimension, GRID_elementnodes), INTENT(in)	:: r_en_coor
+	REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in)         		:: r_mp_coor
+	REAL (KIND = GRID_SR), INTENT(in)                        			:: r_mp_mass
+    
+	REAL (KIND = GRID_SR), DIMENSION(GRID_elementnodes)              		:: r_nmass_tmp
+
+	REAL (KIND = GRID_SR), DIMENSION(GRID_dimension, GRID_elementnodes-1)     	:: r_A
+	REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                 		:: r_b
+	REAL (KIND = GRID_SR), DIMENSION(GRID_elementnodes)                		:: r_x, r_y
+	REAL (KIND = GRID_SR)                                				:: r_det, r_det1, r_det2
+    
+	INTEGER                             				:: i_node_cnt
+    
+
+!--------- assign coordinates to local variables  
+    
+	DO i_node_cnt=1, GRID_elementnodes
+	  r_x(i_node_cnt) = r_en_coor(1,i_node_cnt)
+	  r_y(i_node_cnt) = r_en_coor(2,i_node_cnt)
+	END DO
+
+!--------- normalize triangle and mass packet coordinates   
+	r_A(1,1) = r_x(2) - r_x(1)
+	r_A(1,2) = r_x(3) - r_x(1)
+	r_A(2,1) = r_y(2) - r_y(1)
+	r_A(2,2) = r_y(3) - r_y(1)
+        
+	r_b(1) = r_mp_coor(1) - r_x(1)
+	r_b(2) = r_mp_coor(2) - r_y(1)
+
+!--------- solve linear equation system (dim2x2)(dim2)=(dim2)        
+	r_det  =   r_A(1,1)*r_A(2,2) - r_A(2,1)*r_A(1,2)
+	IF (r_det == 0.) CALL grid_error(c_error='SLM: assign_mass(): Determinant zero. Triangle is degenerated.')
+		
+	r_det1 =   r_A(1,1)*r_b(2) - r_A(2,1)*r_b(1)
+	r_det2 =   r_b(1)*r_A(2,2) - r_b(2)*r_A(1,2)
+        
+	r_nmass_tmp(3) = r_det1 / r_det *r_mp_mass
+	r_nmass_tmp(2) = r_det2 / r_det *r_mp_mass
+	r_nmass_tmp(1) = r_mp_mass - r_nmass_tmp(3) - r_nmass_tmp(2)
+        
+	RETURN
+	
+      END FUNCTION assign_mass
+
+!*****************************************************************************
+
+      FUNCTION sameside_2d(r_vtx_a, r_vtx_b, r_vtx_ref, r_vtx_check) RESULT (l_same)
+
+
+!---------- Check if a given 2d-point r_vtx_check is on the same side of a line (defined by two points r_vtx_a, r_vtx_b) 
+!---------- as a known reference point r_vtx_ref (the third point of the triangle
+
+
+!---------- local declarations
+
+	IMPLICIT NONE
+
+	REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in)	:: r_vtx_a, r_vtx_b, r_vtx_ref, r_vtx_check
+	LOGICAL 					:: l_same
+
+	REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)			:: r_a, r_b, r_tmp1, r_tmp2, r_tmp3
+	REAL (KIND = GRID_SR)						:: r_sign, r_dot1, r_dot2
+    
+
+!---------- initialize
+    
+	l_same = .FALSE.
+
+	  
+!---------- r_tmp1 is the direction vector which one edge of the triangle has. It cuts the plane in two halfs
+
+	r_tmp1 = r_vtx_b - r_vtx_a
+    
+!---------- r_tmp2 and r_tmp3 are the vectors to the reference point and to the point to be checked respectively
+	r_tmp2 	= 1.e+6*(r_vtx_check - r_vtx_a)
+	r_tmp3 	= 1.e+6*(r_vtx_ref   - r_vtx_a)
+
+!---------- if the dot product (projection onto the normal of r_tmp1) has the same sign for both r_tmp2 and r_tmp3
+!---------- then the points are on the same side
+	r_dot1 	= (r_tmp1(1)*r_tmp2(2) - r_tmp1(2)*r_tmp2(1))
+	r_dot2	= (r_tmp1(1)*r_tmp3(2) - r_tmp1(2)*r_tmp3(1))
+	
+	r_sign	= (r_dot1*r_dot2)
+
+	IF (r_sign >= 0.) l_same = .TRUE.
+
+	RETURN
+	
+      END FUNCTION sameside_2d
+      
+!*****************************************************************
+
+      FUNCTION calc_triangarea(r_coord1, r_coord2, r_coord3) RESULT (r_area)
+ 
+!---------- local declarations
+ 
+	IMPLICIT NONE
+ 
+	REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) 	:: r_coord1, r_coord2, r_coord3
+
+	REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)			:: r_a, r_b, r_tmp
+	REAL (KIND = GRID_SR)                                        	:: r_area
+ 
+
+ 
+!---------- calculate triangle vectors
+ 
+	r_a= r_coord2- r_coord1
+	r_b= r_coord3- r_coord1
+ 
+ 
+!---------- calculate area of a triangle (point c in the origin) 
+ 
+	r_area = 0.5 * ABS( r_b(2)*r_a(1) - r_a(2)*r_b(1) )
+ 
+	RETURN
+	
+      END FUNCTION calc_triangarea
+      
+!*****************************************************************
+
+      SUBROUTINE generate_MP_coeff(p_ghand)
+
+!---------- local declarations
+
+	IMPLICIT NONE
+    
+	TYPE (grid_handle), DIMENSION(GRID_timesteps)	:: p_ghand
+    
+	INTEGER                     			:: i_reflvl_max     		! maximum refinement level
+	INTEGER                     			:: i_celltot        		! total number of mass packets in triangle; 
+											! reflvl 1: 3MPs, 2: 6MPs, 3: 10 MPs, 4: 15MPs, etc.
+    
+	INTEGER                     			:: i_cnt, j_cnt, k_cnt, i_loop	! loop counter
+	INTEGER                     			:: i_mpcnt    			! mass packet counter
+	INTEGER                     			:: i_cindex     		! coefficient index
+	INTEGER                     			:: i_alct       		! allocated flag, error if nonzero
+    
+	INTEGER                     			:: i_origin     		! local 
+	INTEGER, DIMENSION(GRID_dimension)		:: i_prvdir     		! local
+    
+	REAL (KIND = GRID_SR)                        			:: r_projfac       		! projection factor
+	REAL (KIND = GRID_SR)                        			:: r_fac        		! factor
+    
+	REAL (KIND = GRID_SR), DIMENSION(GRID_elementnodes)		:: r_mpc_sum        		! checksum; check if the mass coefficients sum up to 1
+    
+	REAL (KIND = GRID_SR)                        			:: r_vol_sum        		! checksum; check if the volume coefficient sums up to 1
+    
+	REAL (KIND = GRID_SR)                        			:: r_eps        		! epsilon; very small number greater than 0
+    
+	TYPE (MP_coeff), POINTER           		:: p_MPC_tmp(:)
+	TYPE (MP_coeff_arr), POINTER      		:: p_MPCarray_tmp
+
+    
+!---------- initializations
+!	i_reflvl_max = p_ghand(i_timeplus)%i_reflvlbnd - p_ghand(i_timeplus)%i_crslvlbnd + 5
+!	IF (i_reflvl_max > 27) THEN
+	  i_reflvl_max = 7
+!	END IF 
+    
+	MAX_REFLVL = i_reflvl_max
+    
+	r_eps   = 1.E-5
+    
+    
+!---------- allocate arrays
+	ALLOCATE (p_MPCtable(i_reflvl_max), stat = i_alct)
+	IF (i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:generate_MP_coeff] Allocation error.')
+ 
+
+	i_celltot = 1 
+	DO i_cnt = 1, i_reflvl_max  
+	  i_celltot = i_celltot + (i_cnt+1)
+      
+	  ALLOCATE (p_MPC_tmp(i_celltot), stat = i_alct)
+	  IF (i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:generate_MP_coeff] Allocation error.')
+      
+	  ALLOCATE (p_MPCarray_tmp, stat = i_alct)
+ 	  IF (i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:generate_MP_coeff] Allocation error.')
+
+	  p_MPCarray_tmp%mpc => p_MPC_tmp
+            
+	  p_MPCtable(i_cnt)%i_cnum = i_celltot      
+	  p_MPCtable(i_cnt)%p_mpc => p_MPCarray_tmp
+      
+	END DO
+	NULLIFY(p_MPC_tmp)
+	NULLIFY(p_MPCarray_tmp)
+!----------
+
+    
+!---------- set refinement level 1; 3 MPs
+	DO i_mpcnt= 1, 3
+	  
+	  p_MPCtable(1)%p_mpc%mpc(i_mpcnt)%i_origin 	= i_mpcnt
+	  p_MPCtable(1)%p_mpc%mpc(i_mpcnt)%i_prvdir   	= i_mpcnt         
+	  p_MPCtable(1)%p_mpc%mpc(i_mpcnt)%i_celltype   = 1
+	  p_MPCtable(1)%p_mpc%mpc(i_mpcnt)%r_area	= 1./3.
+      
+	  DO j_cnt=1,3
+	    IF (j_cnt == i_mpcnt) THEN
+	      p_MPCtable(1)%p_mpc%mpc(i_mpcnt)%r_coeff(j_cnt)   = 1.
+	      p_MPCtable(1)%p_mpc%mpc(i_mpcnt)%r_mass(j_cnt)    = 1.
+	    ELSE
+	      p_MPCtable(1)%p_mpc%mpc(i_mpcnt)%r_coeff(j_cnt)   = 0.
+	      p_MPCtable(1)%p_mpc%mpc(i_mpcnt)%r_mass(j_cnt)    = 0.
+	    END IF
+	  END DO
+	       
+	  p_MPCtable(1)%p_mpc%mpc(i_mpcnt)%l_end        = .FALSE.
+	  
+	END DO
+!-----------
+
+
+!----------- generate mass packets of higher refinement levels   
+	DO i_cnt = 2, i_reflvl_max
+	  i_mpcnt = 0
+	  r_projfac = REAL((i_cnt-1),GRID_SR) / REAL(i_cnt,GRID_SR)
+	  
+	  DO j_cnt=1 , p_MPCtable(i_cnt-1)%i_cnum
+            ! project old mass packet in direction of his origin (only if MP is not generator of new packets (l_end==.TRUE.)); set l_end = .FALSE.
+	    i_mpcnt = i_mpcnt + 1
+	    p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt) = p_MPCtable(i_cnt-1)%p_mpc%mpc(j_cnt)
+            
+     
+            !projection here (area, coeff, mass changes)
+
+            !area proj.
+	    p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_area = r_projfac*r_projfac *&
+		p_MPCtable(i_cnt-1)%p_mpc%mpc(j_cnt)%r_area
+
+            !projection in direction of the origin
+	    i_origin = p_MPCtable(i_cnt-1)%p_mpc%mpc(j_cnt)%i_origin
+	    p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_coeff(i_origin) = &
+		(1.-r_projfac) + r_projfac* p_MPCtable(i_cnt-1)%p_mpc%mpc(j_cnt)%r_coeff(i_origin)
+	    DO i_loop = 1, 2
+	      i_cindex = MODULO((i_origin+i_loop-1),3) + 1
+	      p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_coeff(i_cindex) = &
+		r_projfac* p_MPCtable(i_cnt-1)%p_mpc%mpc(j_cnt)%r_coeff(i_cindex)
+	    END DO
+
+	    p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%l_end = .FALSE.
+                
+	    IF (p_MPCtable(i_cnt-1)%p_mpc%mpc(j_cnt)%l_end) THEN
+            ! create new mass packets via projecting the old packets which are at the end of the tree
+        
+	      SELECT CASE(p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%i_celltype)
+		CASE(1) ! corner packets are not to be reproduced
+		  CALL grid_error(c_error='[SLM_advanced.mpslm:generate_MP_coeff] This should never happen. L. Mentrup')
+		  
+		CASE(2) ! edge packets are to be projected versus the origin and additionally one packet to the other edgecorner
+		  i_mpcnt = i_mpcnt +1
+		  !area
+		  p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_area = r_projfac*r_projfac *&
+			p_MPCtable(i_cnt-1)%p_mpc%mpc(j_cnt)%r_area
+
+		  !projection in direction of the other edge corner
+		  i_prvdir = p_MPCtable(i_cnt-1)%p_mpc%mpc(j_cnt)%i_prvdir
+		  p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_coeff(i_prvdir(1)) = &
+			(1.-r_projfac) + r_projfac* p_MPCtable(i_cnt-1)%p_mpc%mpc(j_cnt)%r_coeff(i_prvdir(1))
+		  DO i_loop = 1, 2
+		    i_cindex = MODULO((i_prvdir(1)+i_loop-1),3)+1
+		    p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_coeff(i_cindex) = &
+			r_projfac* p_MPCtable(i_cnt-1)%p_mpc%mpc(j_cnt)%r_coeff(i_cindex)
+		  END DO    
+          
+		  p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%i_origin     = p_MPCtable(i_cnt-1)%p_mpc%mpc(j_cnt)%i_origin
+		  p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%i_prvdir(1)  = p_MPCtable(i_cnt-1)%p_mpc%mpc(j_cnt)%i_prvdir(1)
+		  p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%i_prvdir(2)  = p_MPCtable(i_cnt-1)%p_mpc%mpc(j_cnt)%i_prvdir(1)
+		  p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%i_celltype   = p_MPCtable(i_cnt-1)%p_mpc%mpc(j_cnt)%i_celltype
+	 	  p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%l_end        = .TRUE.
+          
+		CASE(3) ! area packets are to be projected versus the origin and additionally one or two packet to the other areacorners
+		  i_mpcnt = i_mpcnt +1
+
+		  !projection in direction of the other area corner
+		  i_prvdir = p_MPCtable(i_cnt-1)%p_mpc%mpc(j_cnt)%i_prvdir
+		  p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_coeff(i_prvdir(1)) = &
+			(1.-r_projfac) + r_projfac* p_MPCtable(i_cnt-1)%p_mpc%mpc(j_cnt)%r_coeff(i_prvdir(1))
+		  DO i_loop = 1, 2
+		    i_cindex = MODULO((i_prvdir(1)+i_loop-1),3)+1
+		    p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_coeff(i_cindex) = &
+		  	r_projfac* p_MPCtable(i_cnt-1)%p_mpc%mpc(j_cnt)%r_coeff(i_cindex)
+		  END DO
+          
+		  p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%i_origin     = p_MPCtable(i_cnt-1)%p_mpc%mpc(j_cnt)%i_origin
+		  p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%i_prvdir(1)  = p_MPCtable(i_cnt-1)%p_mpc%mpc(j_cnt)%i_prvdir(1)
+		  p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%i_prvdir(2)  = p_MPCtable(i_cnt-1)%p_mpc%mpc(j_cnt)%i_prvdir(1)
+		  p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%i_celltype   = p_MPCtable(i_cnt-1)%p_mpc%mpc(j_cnt)%i_celltype
+		  p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%l_end        = .TRUE.
+          
+		  IF (p_MPCtable(i_cnt-1)%p_mpc%mpc(j_cnt)%i_prvdir(1) /= p_MPCtable(i_cnt-1)%p_mpc%mpc(j_cnt)%i_prvdir(2)) THEN
+		    i_mpcnt = i_mpcnt +1
+            
+		    !projection in direction of the other area corner
+		    p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_coeff(i_prvdir(2)) = &
+			(1.-r_projfac) + r_projfac* p_MPCtable(i_cnt-1)%p_mpc%mpc(j_cnt)%r_coeff(i_prvdir(2))
+		    DO i_loop = 1, 2
+		      i_cindex = MODULO((i_prvdir(2)+i_loop-1),3)+1
+		      p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_coeff(i_cindex) = &
+			r_projfac* p_MPCtable(i_cnt-1)%p_mpc%mpc(j_cnt)%r_coeff(i_cindex)
+		    END DO
+
+		    p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%i_origin	= p_MPCtable(i_cnt-1)%p_mpc%mpc(j_cnt)%i_origin
+		    p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%i_prvdir(1)	= p_MPCtable(i_cnt-1)%p_mpc%mpc(j_cnt)%i_prvdir(2)
+		    p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%i_prvdir(2)	= p_MPCtable(i_cnt-1)%p_mpc%mpc(j_cnt)%i_prvdir(1)
+		    p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%i_celltype	= p_MPCtable(i_cnt-1)%p_mpc%mpc(j_cnt)%i_celltype
+		    p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%l_end		= .TRUE.
+		  END IF
+		  
+	      END SELECT
+            END IF
+	  END DO  
+    
+        
+	  !---------- generate new MPs of refinement level 2; 3 additional MPs
+	  IF (i_cnt == 2) THEN
+            !new packet nr. 1
+            i_mpcnt = i_mpcnt +1
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_coeff(1)   = 0.5 
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_coeff(2)   = 0.5
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_coeff(3)   = 0.
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%i_origin = 1
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%i_prvdir(1)  = 2
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%i_prvdir(2)  = 2
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%i_celltype   = 2
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%l_end    = .TRUE.
+
+           !new packet nr. 2
+            i_mpcnt = i_mpcnt +1
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_coeff(1)   = 0.5 
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_coeff(2)   = 0.
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_coeff(3)   = 0.5
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%i_origin = 1
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%i_prvdir(1)  = 3
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%i_prvdir(2)  = 3 
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%i_celltype   = 2
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%l_end    = .TRUE.
+
+           !new packet nr. 3
+            i_mpcnt = i_mpcnt +1
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_coeff(1)   = 0. 
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_coeff(2)   = 0.5
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_coeff(3)   = 0.5
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%i_origin = 2
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%i_prvdir(1)  = 3
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%i_prvdir(2)  = 3
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%i_celltype   = 2
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%l_end    = .TRUE.
+	    
+          END IF
+          !-----------
+
+          !---------- generate new MPs of refinement level 3; 1 additional MPs
+          IF (i_cnt == 3) THEN
+            !new packet nr. 1
+            i_mpcnt = i_mpcnt +1
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_coeff(1)   = 1./3.
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_coeff(2)   = 1./3.
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_coeff(3)   = 1./3.
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%i_origin = 3
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%i_prvdir(1)  = 2
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%i_prvdir(2)  = 1
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%i_celltype   = 3
+            p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%l_end    = .TRUE.
+
+          END IF
+          !-----------
+
+
+          !assign area coefficients
+          r_fac = REAL(i_cnt,GRID_SR)*REAL(i_cnt,GRID_SR)
+          DO i_mpcnt=1, p_MPCtable(i_cnt)%i_cnum
+            SELECT CASE(p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%i_celltype)
+            CASE(1)
+              p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_area = 1./3. / r_fac
+            CASE(2)
+              p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_area = 1. / r_fac
+            CASE(3)
+              p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_area = 2. / r_fac
+            END SELECT    
+          END DO
+        
+	  ! assign mass coefficients; 
+	  r_mpc_sum = 0
+	  DO i_mpcnt=1, p_MPCtable(i_cnt)%i_cnum
+	    p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_mass = &
+		p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_coeff * &
+		p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_area
+	    r_mpc_sum = r_mpc_sum + p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_mass
+	  END DO
+        
+	  DO i_mpcnt=1, p_MPCtable(i_cnt)%i_cnum
+	    p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_mass = p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_mass / r_mpc_sum     
+	  END DO
+        
+!----------- check if mass/volume coefficients sum up to 1 
+	  r_mpc_sum = 0
+	  r_vol_sum = 0
+	  DO i_mpcnt=1, p_MPCtable(i_cnt)%i_cnum
+	    r_mpc_sum = r_mpc_sum + p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_mass
+	    r_vol_sum = r_vol_sum + p_MPCtable(i_cnt)%p_mpc%mpc(i_mpcnt)%r_area
+	  END DO
+             
+	  IF ((r_mpc_sum(1) < (1.-r_eps)) .OR. (r_mpc_sum(1) > (1.+r_eps))) THEN
+	    CALL grid_error(c_error='[SLM_advanced.mpslm:generate_MP_coeff] Mass packet coefficient r_mass(1) doesnt sum up to 1.')
+	  END IF
+	  IF ((r_mpc_sum(2) < (1.-r_eps)) .OR. (r_mpc_sum(2) > (1.+r_eps))) THEN
+ 	    CALL grid_error(c_error='[SLM_advanced.mpslm:generate_MP_coeff] Mass packet coefficient r_mass(2) doesnt sum up to 1.')
+	  END IF
+	  IF ((r_mpc_sum(3) < (1.-r_eps)) .OR. (r_mpc_sum(3) > (1.+r_eps))) THEN
+	    CALL grid_error(c_error='[SLM_advanced.mpslm:generate_MP_coeff] Mass packet coefficient r_mass(3) doesnt sum up to 1.')
+	  END IF
+	  IF ((r_vol_sum < (1.-r_eps)) .OR. (r_vol_sum > (1.+r_eps))) THEN
+	    CALL grid_error(c_error='[SLM_advanced.mpslm:generate_MP_coeff] Mass packet coefficient r_area doesnt sum up to 1.')
+	  END IF
+!-----------   
+      
+	END DO
+      
+	CALL io_MP_coeff(p_MPCtable)
+   
+	RETURN
+    
+      END SUBROUTINE generate_MP_coeff
+
+!*****************************************************************
+
+      SUBROUTINE createMPs(p_MPtable,p_MPtable_tmp,i_MPnum, i_tim, r_coor, i_nnum_old, i_enodes_old, i_enum_f_old)
+      
+!---------- local declarations
+
+	IMPLICIT NONE
+      
+	TYPE (MP_entry_ptr), DIMENSION(i_MPnum), INTENT(in)			:: p_MPtable
+	TYPE (MP_entry_ptr), DIMENSION(i_MPnum), INTENT(inout)			:: p_MPtable_tmp
+	INTEGER, INTENT(inout)                    				:: i_MPnum      	! Number of mass packets
+	INTEGER, INTENT(in)                       				:: i_tim
+      
+	REAL (KIND = GRID_SR), DIMENSION(GRID_dimension, i_nnum_old), INTENT(in)			:: r_coor       	! coordinates array of triangle nodes (old mesh)
+	INTEGER, INTENT(in)                       				:: i_nnum_old   	! number of nodes in mesh (old mesh)
+      
+	INTEGER, DIMENSION(GRID_elementnodes, i_enum_f_old), INTENT(in) 	:: i_enodes_old     	! index array of triangles nodes (old mesh)
+	INTEGER, INTENT(in)                       				:: i_enum_f_old     	! Number of triangles (finite elements e) in this step
+	INTEGER                           					:: i_treflvl        	! refinement level of a triangle
+
+	REAL (KIND = GRID_SR), DIMENSION(GRID_elementnodes)              			:: r_nmass_tmp      	! mass at the nodes of the triangle
+	REAL (KIND = GRID_SR)                              					:: r_mass_tot, r_mass_in_tri
+      
+	INTEGER                           					:: i_MPnum_new
+	INTEGER                           					:: i_MPidx        
+	INTEGER                           					:: i_cnt, i_triangle_cnt, i_MP_cnt, i_node_cnt, i_dim  ! loop counter
+	INTEGER                               					:: i_alct
+      
+      
+	TYPE (MP_entry), POINTER                  				:: p_MP
+
+
+
+!----------- preinitialize
+
+	i_MPnum_new = 0
+
+
+!----------- allocate memory for new mass packets       
+	DO i_MP_cnt=1, i_MPnum
+          ALLOCATE(p_MP, stat=i_alct)
+          IF (i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:create_MPs] Allocation error.')
+          p_MP%i_MPbyTri 	= 0
+          p_MP%i_MPinTri 	= 0
+          p_MP%r_mass 		= 0.
+          p_MP%r_area 		= 0.
+          p_MP%r_coord 		= 0.
+          p_MP%l_searchMP 	= .FALSE.
+          p_MP%l_assignmass 	= .FALSE.
+          p_MPtable_tmp(i_MP_cnt)%MP => p_MP
+	  NULLIFY(p_MP)
+	END DO
+
+        
+!----------- if already searched for mass packets, save mass packets which are already found and that can be assigned to the nodes later
+	DO i_triangle_cnt=1, i_enum_f_old
+          IF ((.NOT. p_ttable(i_tim, i_triangle_cnt)%cp%l_searchtri) &
+	  	.AND. (p_ttable(i_tim, i_triangle_cnt)%cp%i_MPindex(1) /= 0)) THEN
+            DO i_MP_cnt = 1, p_ttable(i_tim, i_triangle_cnt)%cp%i_MPperTri
+              i_MPidx = p_ttable(i_tim, i_triangle_cnt)%cp%i_MPindex(i_MP_cnt)
+              i_MPnum_new = i_MPnum_new + 1
+
+              p_MPtable_tmp(i_MPnum_new)%MP%i_MPinTri 		= p_MPtable(i_MPidx)%MP%i_MPinTri
+              p_MPtable_tmp(i_MPnum_new)%MP%i_MPbyTri 		= p_MPtable(i_MPidx)%MP%i_MPbyTri
+              p_MPtable_tmp(i_MPnum_new)%MP%r_mass  		= p_MPtable(i_MPidx)%MP%r_mass
+              p_MPtable_tmp(i_MPnum_new)%MP%r_coord 		= p_MPtable(i_MPidx)%MP%r_coord
+              p_MPtable_tmp(i_MPnum_new)%MP%r_area		= p_MPtable(i_MPidx)%MP%r_area
+              p_MPtable_tmp(i_MPnum_new)%MP%l_searchMP 		= p_MPtable(i_MPidx)%MP%l_searchMP
+              p_MPtable_tmp(i_MPnum_new)%MP%l_assignmass	= p_MPtable(i_MPidx)%MP%l_assignmass
+
+              p_ttable(i_tim, i_triangle_cnt)%cp%i_MPindex(i_MP_cnt) = i_MPnum_new
+            END DO
+          END IF
+	END DO
+      
+
+!----------- set values for mass packets;               
+	DO i_triangle_cnt= 1, i_enum_f_old
+          IF (p_ttable(i_tim, i_triangle_cnt)%cp%l_searchtri) THEN
+            r_nmass_tmp = p_ttable(i_tim, i_triangle_cnt)%cp%r_mass
+            r_mass_in_tri = SUM(r_nmass_tmp)
+            i_treflvl = p_ttable(i_tim, i_triangle_cnt)%cp%i_refinelvl
+
+            IF (r_mass_in_tri > 0.) THEN   
+              DO i_MP_cnt = 1, p_MPCtable(i_treflvl)%i_cnum 
+        	i_MPnum_new = i_MPnum_new + 1
+        	p_MPtable_tmp(i_MPnum_new)%MP%i_MPbyTri = i_triangle_cnt 
+!------------------ stepfct assignment
+        	DO i_node_cnt= 1, GRID_elementnodes
+                  p_MPtable_tmp(i_MPnum_new)%MP%r_coord = p_MPtable_tmp(i_MPnum_new)%MP%r_coord + &
+                           (p_MPCtable(i_treflvl)%p_mpc%mpc(i_MP_cnt)%r_coeff(i_node_cnt)&
+                      	   *r_coor(:,i_enodes_old(i_node_cnt, i_triangle_cnt)))
+        	END DO
+        	p_MPtable_tmp(i_MPnum_new)%MP%r_mass = &
+                  SUM(p_MPCtable(i_treflvl)%p_mpc%mpc(i_MP_cnt)%r_mass * r_nmass_tmp)
+!------------------
+        	p_MPtable_tmp(i_MPnum_new)%MP%r_area = &
+                      p_MPCtable(i_treflvl)%p_mpc%mpc(i_MP_cnt)%r_area * &
+                      p_ttable(i_tim, i_triangle_cnt)%cp%r_area
+        	p_MPtable_tmp(i_MPnum_new)%MP%l_searchMP = .TRUE.
+        	p_MPtable_tmp(i_MPnum_new)%MP%l_assignmass = .FALSE.
+
+        	p_ttable(i_tim, i_triangle_cnt)%cp%i_MPindex(i_MP_cnt) = i_MPnum_new
+              END DO
+            END IF            
+          END IF
+	END DO 
+      
+	i_MPnum = i_MPnum_new    
+
+	RETURN
+      
+      END SUBROUTINE createMPs
+    
+!*****************************************************************
+
+      SUBROUTINE remove_MP_coeff
+
+!---------- local declarations
+	IMPLICIT NONE
+    
+	TYPE(grid_handle), DIMENSION(GRID_timesteps)    :: p_ghand   
+	INTEGER                     			:: i_reflvl_max     ! maximum refinement level
+	INTEGER                     			:: i_cnt
+    
+!---------- initializations
+	i_reflvl_max = size(p_MPCtable)
+    
+!----------
+	DO i_cnt = 1, i_reflvl_max
+      	  DEALLOCATE(p_MPCtable(i_cnt)%p_mpc%mpc)
+      	  DEALLOCATE(p_MPCtable(i_cnt)%p_mpc)
+	END DO 
+    
+	DEALLOCATE(p_MPCtable)
+    
+	RETURN
+    
+      END SUBROUTINE remove_MP_coeff
+      
+!*****************************************************************
+
+      SUBROUTINE io_MP_coeff(p_MPCtable)
+
+!---------- local declarations
+	IMPLICIT NONE
+    
+	TYPE (MP_coeff_arr_ptr), DIMENSION(MAX_REFLVL)  :: p_MPCtable
+    
+	INTEGER                     		:: i_reflvl_max     ! maximum refinement level
+    
+	INTEGER                              	:: i_io1, i_io2, i_fst
+	INTEGER                              	:: i_cnt, j_cnt, i_tcnt, i_mpcnt, i_filecnt
+	INTEGER					:: i_alct, i_nnum, i_tnum, i_dim
+      	INTEGER                  		:: i_timecounter
+      	REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    	:: r_cox
+      	CHARACTER (len=11)                   	:: c_mfile
+	CHARACTER (len=32)			:: c_matfile
+      	CHARACTER (len=8)                    	:: c_tmp
+      
+      	REAL (KIND = GRID_SR), DIMENSION(3)            		:: r_a = (/0.,0.,0./)
+      	REAL (KIND = GRID_SR), DIMENSION(3)            		:: r_b = (/1.,0.,0./)
+      	REAL (KIND = GRID_SR), DIMENSION(3)            		:: r_c = (/0.,1.,0./)
+
+    
+!---------- initializations
+    	i_reflvl_max = MAX_REFLVL
+    	i_timecounter = 0
+
+
+    	DO i_filecnt=1, i_reflvl_max
+!---------- file handling (open)
+     
+      	  i_tcnt= i_timecounter
+      	  i_timecounter= i_timecounter+1
+      	  write(c_mfile,10101) 'MP_gmv.', i_tcnt
+	  write(c_matfile,10102) 'MP_matlab.', i_tcnt
+      	  c_mfile= adjustl(c_mfile)
+	  c_matfile= adjustl(c_matfile)
+      	  i_io1= 15
+      	  OPEN(i_io1, file= c_mfile, form= 'formatted', iostat= i_fst)
+      	  IF(i_fst /= 0) THEN
+            RETURN
+      	  END IF
+	  
+	  i_io2 = 16
+	  OPEN(i_io2, file= c_matfile, form= 'formatted', iostat= i_fst)
+	  IF (i_fst/=0) THEN
+	    RETURN
+	  END IF
+
+!---------- write header
+
+      	  WRITE(i_io1,1000)
+      	  WRITE(i_io1,1001)
+      	  WRITE(i_io1,1002) c_mfile
+      	  WRITE(i_io1,1003) GRID_parameters%program_name, GRID_parameters%version, GRID_parameters%subversion, &
+            GRID_parameters%patchversion
+      	  WRITE(i_io1,1004) GRID_parameters%author_name, GRID_parameters%author_email
+      	  WRITE(i_io1,1005)
+
+!---------- the nodes
+
+      	  i_nnum = p_MPCtable(i_filecnt)%i_cnum
+      	  WRITE(i_io1,1010) i_nnum+3
+
+!---------- extract nodal grid data
+
+      	  ALLOCATE(r_cox(3, i_nnum+3), stat=i_alct)
+      	  IF(i_alct /= 0) CALL grid_error(c_error='[SLM_simple.mpslm:io_MP_coeff] Allocation error.')
+      
+      	  r_cox(:,1) = r_a
+      	  r_cox(:,2) = r_b
+      	  r_cox(:,3) = r_c
+
+      	  DO i_mpcnt = 1, i_nnum
+            r_cox(:,i_mpcnt+3) = p_MPCtable(i_filecnt)%p_mpc%mpc(i_mpcnt)%r_coeff(1)*r_a + &
+                      		 p_MPCtable(i_filecnt)%p_mpc%mpc(i_mpcnt)%r_coeff(2)*r_b + &
+                     		 p_MPCtable(i_filecnt)%p_mpc%mpc(i_mpcnt)%r_coeff(3)*r_c 
+      	  END DO
+        
+      	  DO i_dim=1,GRID_dimension
+            WRITE(i_io1,1011) (r_cox(i_dim,i_cnt), i_cnt=1,i_nnum+3)
+      	  END DO
+	  
+	  DO i_cnt = 1, i_nnum+3
+	    WRITE(i_io2,1012) r_cox(1, i_cnt), r_cox(2, i_cnt)
+	  END DO
+	  
+      	  DEALLOCATE(r_cox)
+
+!---------- the elements
+
+      	  i_tnum = 1
+      	  WRITE(i_io1,1020) i_tnum
+      	  WRITE(i_io1,1021)
+      	  WRITE(i_io1, *) '1 2 3'
+      
+
+!---------- close file
+
+      	  WRITE(i_io1,1100)
+      	  CLOSE(i_io1)
+	  
+	  CLOSE(i_io2)
+      
+	END DO  
+
+	RETURN
+	
+	1000	FORMAT('gmvinput ascii')
+	1001	FORMAT('comments')
+	1002    FORMAT(' File: ',a48)
+	1003    FORMAT(' Written by: ',a15,' Version ',i1,'.',i1,'.',i1)
+	1004    FORMAT(' Author: ',a48,' <',a48,'>')
+	1005    FORMAT('endcomm')
+	1010    FORMAT('nodes ',i8)
+	1011    FORMAT(10f15.5)
+	1012	FORMAT(3f15.5)
+	1020    FORMAT('cells ',i8)
+	1021    FORMAT('tri 3')
+	1022    FORMAT(10i8)
+	1031    FORMAT('cellids')
+	1040    FORMAT('variable')
+	1041    FORMAT('level 0')
+	1043    FORMAT('status 0')
+	1042    FORMAT('tracr 1')
+	1049    FORMAT('endvars')
+	1100    FORMAT('endgmv')
+	10101	FORMAT(a7,i4.4)
+    	10102	FORMAT(a10,i4.4)
+	
+      END SUBROUTINE io_MP_coeff
+      
+!*****************************************************************
+
+      SUBROUTINE calc_alltriarea(p_handle, i_len, r_elmtarea)
+
+!---------- local declarations
+
+	IMPLICIT NONE
+
+	TYPE (grid_handle)                                      :: p_handle
+	INTEGER, INTENT(in)                                     :: i_len
+	REAL (KIND = GRID_SR), DIMENSION(:)                                      :: r_elmtarea
+	
+	REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE                       :: r_xy
+	INTEGER, DIMENSION(:,:), ALLOCATABLE                    :: i_enods
+	INTEGER :: i_enum, i_alct, i_nnum, i_cnt
+	REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                         :: r_1, r_2, r_3
+	
+!---------- check array sizes
+
+	i_enum= p_handle%i_enumfine
+	i_nnum= p_handle%i_nnumber
+	IF(i_len /= i_enum) CALL grid_error(c_error='[calc_alltriarea]: array sizes do not match!')
+	
+!---------- get coordinates for each element
+
+	allocate(r_xy(GRID_dimension,i_nnum), i_enods(GRID_elementnodes,i_enum), stat=i_alct)
+	IF(i_alct /= 0) THEN
+	  CALL grid_error(c_error='[calc_alltriarea]: could not allocate aux. arrays r_xy...')
+	END IF
+	CALL grid_getinfo(p_handle, r_nodecoordinates= r_xy, i_elementnodes=i_enods)
+	
+!---------- now calculate element's areas
+
+	DO i_cnt=1,i_enum
+	  r_1(:)= r_xy(:,i_enods(1,i_cnt))
+	  r_2(:)= r_xy(:,i_enods(2,i_cnt))
+	  r_3(:)= r_xy(:,i_enods(3,i_cnt))
+	  r_elmtarea(i_cnt)= calc_triangarea(r_1, r_2, r_3)
+	END DO
+
+	DEALLOCATE(r_xy, i_enods)
+	RETURN
+	
+      END SUBROUTINE calc_alltriarea
+
+!*****************************************************************
+
+	END MODULE SLM_advanced
diff --git a/flash2d/src/options/SLM_advanced.plain.f90 b/flash2d/src/options/SLM_advanced.plain.f90
new file mode 100644
index 0000000..ca6dfec
--- /dev/null
+++ b/flash2d/src/options/SLM_advanced.plain.f90
@@ -0,0 +1,381 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_advanced
+! FUNCTION:
+!	provide advanced semi-Lagrangian routines
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_step
+! FUNCTION:
+!	one step of the basic SLM algorithm
+! SYNTAX:
+!	CALL slm_step(int, real.arr, real.arr)
+! ON INPUT:
+!	...
+! ON OUTPUT:
+!	r_tracer: array with tracer values	real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_displace
+! FUNCTION:
+!	extrapolate the alpha, values for the displacements of the upstream
+!	points from the gridpoints
+! SYNTAX:
+!	CALL slm_displace(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_coord: real array of xy-coordinates		real
+! ON OUTPUT:
+!	r_alpha: displacement vectors to each point	real
+! CALLS:
+!	wind_field
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_update
+! FUNCTION:
+!	calculate the update to the velocity
+! SYNTAX:
+!	CALL slm_update(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_rside: array with right hand side values	real
+! ON OUTPUT:
+!	r_udate: array with new (updated) gid values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is trivial for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_upstream
+! FUNCTION:
+!	calculate right hand side of the equation (upstream values)
+! SYNTAX:
+!	CALL slm_upstream(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_alpha: displacement vectors to each point	real
+! ON OUTPUT:
+!	r_rside: array with right hand side values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is just interpolation for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_interpolate
+! FUNCTION:
+!	do the interpolation
+! SYNTAX:
+!	CALL slm_interpolate(grid, int, real, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	p_ogrid: grid handle to old grid (with data)	TYPE (grid_handle)
+!	r_fac:   factor at which point to interpolate	REAL
+!	i_arlen: array length for the following arrays	INTEGER
+!	r_coord: coordinate array (new grid)		REAL
+!	r_alpha: displacement array (corr. to r_coord)	REAL
+!	r_value: values on the old grid (array)		REAL
+! ON OUTPUT:
+!	r_rside: right hand side (interpolated)		REAL
+! CALLS:
+!
+! COMMENTS:
+!	this one is plain bi-cubic spline interpolation
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_astep
+! COMMENTS:
+!
+! USES:
+!	FLASH_parameters, GRID_api, ADV_wind, ADV_rhs
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	4/2002
+!	2. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_advanced
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE GRID_api
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_astep
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_astep(p_ghand, p_param, p_time, r_modtime, i_size, &
+	                       r_coord, r_tracer, i_newsdepth)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                         :: p_param
+	  TYPE (sw_info), INTENT(inout)                             :: p_time
+	  REAL (KIND = GRID_SR), INTENT(in)                         :: r_modtime
+	  INTEGER, INTENT(in)                                       :: i_size
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_size), INTENT(out)     :: r_tracer
+	  INTEGER, OPTIONAL, INTENT(in)                             :: i_newsdepth
+	  
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE          :: r_newvl
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_alpha
+	  INTEGER                                                   :: i_alct
+
+!---------- check size!
+
+	  IF(i_size <= 0) THEN
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'INFO [slm_astep]: Zero step size, returning to calling routine'
+	    RETURN
+	  END IF
+
+!---------- allocate auxiliary arrays
+
+	  allocate(r_newvl(i_size), r_alpha(GRID_dimension,i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(38)
+	  END IF not_alloc
+
+!-SLM--------- calculate trajectory pieces (displacements)
+
+	  CALL stop_watch('start',3,p_time)
+	  CALL slm_adisplace(p_param, i_size, r_coord, r_alpha, r_time=r_modtime)
+	  CALL stop_watch('stop ',3,p_time)
+
+!-SLM--------- calculate right hand side
+
+	  CALL stop_watch('start',4,p_time)
+	  CALL slm_aupstream(p_ghand, i_size, r_coord, r_alpha, r_newvl)
+	  CALL stop_watch('stop ',4,p_time)
+
+!-SLM--------- calculate new grid values
+
+	  CALL stop_watch('start',5,p_time)
+	  CALL slm_aupdate(p_param, i_size, r_coord, r_newvl, r_tracer, r_time=r_modtime)
+	  CALL stop_watch('stop ',5,p_time)
+
+!-SLM--------- put alpha values to u and v field entries
+
+	  r_alpha= -r_alpha
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_newsdepth=i_newsdepth, i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  ELSE
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  END IF
+
+!-SLM--------- deallocate work arrays
+
+	  deallocate(r_alpha, r_newvl)
+
+	  RETURN
+	  END SUBROUTINE slm_astep
+
+!*****************************************************************
+	  SUBROUTINE slm_adisplace(p_param, i_arlen, r_coord, r_alpha, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                      :: p_param
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_alpha
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                           :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_fac, r_caf, &
+	    r_axy, r_xyc
+	  REAL (KIND = GRID_SR)                                                 :: r_dt0, r_dt1, &
+	    r_dt2, r_tim
+	  INTEGER                                              :: i_cnt1, i_cnt2
+          
+!---------- set constants
+
+	  r_dt0= p_param%num%r_deltatime
+	  r_dt1= 0.5_GRID_SR* p_param%num%r_deltatime
+	  r_dt2= 1.5_GRID_SR* p_param%num%r_deltatime
+	  r_fac= 0.5_GRID_SR
+	  r_caf= 2.0_GRID_SR
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- calculate in an iteration process the displacements
+
+	  unknown_loop: DO i_cnt1=1,i_arlen
+	    r_axy= 0.0_GRID_SR
+
+	    iter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_coord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO iter_loop
+
+	    r_alpha(:,i_cnt1)= r_axy
+	  END DO unknown_loop
+
+	  RETURN
+	  END SUBROUTINE slm_adisplace
+
+!*****************************************************************
+	  SUBROUTINE slm_aupdate(p_param, i_arlen, r_coord, r_rside, r_udate, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                   :: p_param
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_udate
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                          :: r_time
+	  INTEGER                                             :: i_cnt
+	  REAL (KIND = GRID_SR)                                                :: r_dt, r_tim
+
+!---------- in the linear advection case and with f90 this is just
+
+!	  r_udate= r_rside
+
+!---------- including a non-zero right hand side, we have
+
+	  r_dt= p_param%num%r_deltatime
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+	  main_loop: DO i_cnt=1, i_arlen
+	    r_udate(i_cnt)= r_rside(i_cnt)+ r_dt* slm_righthand(r_coord(:,i_cnt))
+	  END DO main_loop
+
+	  RETURN
+	  END SUBROUTINE slm_aupdate
+
+!*****************************************************************
+	  SUBROUTINE slm_aupstream(p_mesh, i_arlen, r_coord, &
+	                          r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                     :: r_fac
+
+!---------- set factor (at which point of trajectory shall i interpolate)
+
+	  r_fac= 1.0_GRID_SR
+
+!---------- in the linear advection case this is just interpolation
+
+	  CALL slm_ainterpolate(p_mesh, r_fac, i_arlen, r_coord, &
+	                       r_alpha, r_rside)
+
+	  RETURN
+	  END SUBROUTINE slm_aupstream
+!*****************************************************************
+	  SUBROUTINE slm_ainterpolate(p_mesh, r_fac, i_arlen, &
+	                             r_coord, r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in)         :: r_fac
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE                   :: r_upstr
+	  REAL (KIND = GRID_SR)                                                :: r_eps
+	  INTEGER                                             :: i_cnt, i_alct, &
+	    i_val, i_out, i_stat
+
+!---------- initialize constant
+
+	  i_val= GRID_tracer
+	  r_eps= GRID_EPS
+
+!---------- allocate work array
+
+	  ALLOCATE(r_upstr(GRID_dimension,i_arlen), stat=i_alct)
+	  not_allocated: IF(i_alct /= 0) THEN
+	    CALL grid_error(60)
+	  END IF not_allocated
+
+!---------- calculate upstream coordinates
+
+	  dim_loop: DO i_cnt=1, GRID_dimension
+	    r_upstr(i_cnt,:) = r_coord(i_cnt,:)- r_fac(i_cnt)* r_alpha(i_cnt,:)
+	  END DO dim_loop
+
+!---------- loop over nodes: find element containing upstream point
+
+	  node_loop: DO i_cnt=1, i_arlen
+
+!---------- check if upstream value is outside of the domain
+
+	    i_out= grid_domaincheck(p_mesh(i_time), r_upstr(:,i_cnt))
+
+!---------- take the intersection of the trajectory with the boundary as new upstream point
+
+	    out_domain: IF(i_out /= 0) then
+	      r_upstr(:,i_cnt)= grid_boundintersect(p_mesh(i_time), &
+	                        r_coord(:,i_cnt), r_upstr(:,i_cnt), i_info=i_stat)
+	      no_intersect: IF(i_stat /= 0) THEN
+	        r_rside(i_cnt)= 0.0_GRID_SR
+	        CYCLE node_loop
+	      END IF no_intersect
+	    END IF out_domain
+
+!---------- interpolate
+
+	    r_rside(i_cnt)= grid_coordvalue(p_mesh(i_time), r_upstr(:,i_cnt), &
+	                    i_interpolorder=GRID_highorder, i_valpoint=i_val)
+	    small_val: IF(abs(r_rside(i_cnt)) < r_eps) THEN
+	      r_rside(i_cnt)= 0.0_GRID_SR
+	    END IF small_val
+
+	  END DO node_loop
+
+!---------- deallocate work array
+
+	  DEALLOCATE(r_upstr)
+
+	  RETURN
+	  END SUBROUTINE slm_ainterpolate
+
+
+	END MODULE SLM_advanced
diff --git a/flash2d/src/options/SLM_advanced.quadrature.f90 b/flash2d/src/options/SLM_advanced.quadrature.f90
new file mode 100644
index 0000000..42ad5a0
--- /dev/null
+++ b/flash2d/src/options/SLM_advanced.quadrature.f90
@@ -0,0 +1,522 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_advanced
+! FUNCTION:
+!	provide advanced semi-Lagrangian routines
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_step
+! FUNCTION:
+!	one step of the basic SLM algorithm
+! SYNTAX:
+!	CALL slm_step(int, real.arr, real.arr)
+! ON INPUT:
+!	...
+! ON OUTPUT:
+!	r_tracer: array with tracer values	real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_displace
+! FUNCTION:
+!	extrapolate the alpha, values for the displacements of the upstream
+!	points from the gridpoints
+! SYNTAX:
+!	CALL slm_displace(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_coord: real array of xy-coordinates		real
+! ON OUTPUT:
+!	r_alpha: displacement vectors to each point	real
+! CALLS:
+!	wind_field
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_update
+! FUNCTION:
+!	calculate the update to the velocity
+! SYNTAX:
+!	CALL slm_update(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_rside: array with right hand side values	real
+! ON OUTPUT:
+!	r_udate: array with new (updated) gid values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is trivial for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_upstream
+! FUNCTION:
+!	calculate right hand side of the equation (upstream values)
+! SYNTAX:
+!	CALL slm_upstream(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_alpha: displacement vectors to each point	real
+! ON OUTPUT:
+!	r_rside: array with right hand side values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is just interpolation for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_interpolate
+! FUNCTION:
+!	do the interpolation
+! SYNTAX:
+!	CALL slm_interpolate(grid, int, real, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	p_ogrid: grid handle to old grid (with data)	TYPE (grid_handle)
+!	r_fac:   factor at which point to interpolate	REAL
+!	i_arlen: array length for the following arrays	INTEGER
+!	r_coord: coordinate array (new grid)		REAL
+!	r_alpha: displacement array (corr. to r_coord)	REAL
+!	r_value: values on the old grid (array)		REAL
+! ON OUTPUT:
+!	r_rside: right hand side (interpolated)		REAL
+! CALLS:
+!
+! COMMENTS:
+!	this one is plain bi-cubic spline interpolation
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_interpolinit
+! FUNCTION:
+!	initialize the interpolation (conservative interpolation)
+! SYNTAX:
+!	CALL slm_interpolate(grid)
+! ON INPUT:
+!	p_ogrid: grid handle to old grid (with data)	TYPE (grid_handle)
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!	we set a global value present in this module:
+!	r_conservation: conservation value		REAL
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	triang_ar
+! FUNCTION:
+!	calculate triangle area given by three coordinates
+! SYNTAX:
+!
+! ON INPUT:
+!
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_displace, slm_update, slm_upstream
+! COMMENTS:
+!
+! USES:
+!	FLASH_parameters, GRID_api, SLM_interpolation, ADV_wind, ADV_rhs
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	4/2002
+!	2. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_advanced
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE GRID_api
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_astep
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_astep(p_ghand, p_param, p_time, r_modtime, i_size, &
+	                       r_coord, r_tracer, i_newsdepth)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                         :: p_param
+	  TYPE (sw_info), INTENT(inout)                             :: p_time
+	  REAL (KIND = GRID_SR), INTENT(in)                                          :: r_modtime
+	  INTEGER, INTENT(in)                                       :: i_size
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size), INTENT(in)        :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_size), INTENT(out)                      :: r_tracer
+	  INTEGER, OPTIONAL, INTENT(in)                             :: i_newsdepth
+
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE      :: r_newvl
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_alpha
+	  INTEGER                              :: i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER        :: r_dualcoordinates
+	  INTEGER, DIMENSION(:,:,:), POINTER   :: i_dualedges
+	  INTEGER                              :: i_dual
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_dualalpha
+
+!---------- check size!
+
+	  IF(i_size <= 0) THEN
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'INFO [slm_astep]: Zero step size, returning to calling routine'
+	    RETURN
+	  END IF
+
+!---------- allocate auxiliary arrays
+
+	  allocate(r_newvl(i_size), r_alpha(GRID_dimension,i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(38)
+	  END IF not_alloc
+
+!---------- create dual mesh
+
+	  IF(present(i_newsdepth)) THEN
+!	    CALL grid_createdual(p_ghand(i_timeplus), i_dual, i_dualedges, &
+!	                         r_dualcoordinates, i_selectlength=i_size, i_selectindex=i_index)
+	  ELSE
+	    CALL grid_createdual(p_ghand(i_timeplus), i_dual, i_dualedges, &
+	                         r_dualcoordinates)
+	  END IF
+
+!---------- allocate array for dual displacements
+
+	  allocate(r_dualalpha(GRID_dimension,i_dual), stat=i_alct)
+	  not_allocdual: IF(i_alct /= 0) THEN
+	    CALL grid_error(40)
+	  END IF not_allocdual
+
+!-SLM--------- calculate trajectory pieces (displacements)
+
+	  CALL stop_watch('start',3,p_time)
+	  CALL slm_adisplace(p_param, i_size, r_coord, r_alpha, &
+	  		    i_dual, r_dualcoordinates, r_dualalpha, r_time=r_modtime)
+	  CALL stop_watch('stop ',3,p_time)
+
+!-SLM--------- calculate right hand side
+
+	  CALL stop_watch('start',4,p_time)
+	  CALL slm_aupstream(p_ghand, i_size, r_coord, r_alpha, &
+	  		    i_dual, r_dualcoordinates, r_dualalpha, &
+	  		    i_dualedges, r_newvl)
+	  CALL stop_watch('stop ',4,p_time)
+
+!-SLM--------- calculate new grid values
+
+	  CALL stop_watch('start',5,p_time)
+	  CALL slm_aupdate(p_param, i_size, r_coord, r_newvl, r_tracer, r_time=r_modtime)
+	  CALL stop_watch('stop ',5,p_time)
+
+!---------- destroy dual mesh
+
+	  CALL grid_destroydual(i_dual, i_dualedges, r_dualcoordinates)
+
+!-SLM--------- put alpha values to u and v field entries
+
+	  r_alpha= -r_alpha
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_newsdepth=i_newsdepth, i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  ELSE
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  END IF
+
+!-SLM--------- deallocate work arrays
+
+	  deallocate(r_dualalpha, r_alpha, r_newvl)
+
+	  RETURN
+	  END SUBROUTINE slm_astep
+
+!*****************************************************************
+	  SUBROUTINE slm_adisplace(p_param, i_arlen, r_coord, r_alpha, &
+	                          i_darlen, r_dcoord, r_dalpha, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                      :: p_param
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_alpha
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                           :: r_time
+	  INTEGER, INTENT(in)                                  :: i_darlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in)  :: r_dcoord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(out) :: r_dalpha
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_fac, r_caf, &
+	    r_axy, r_xyc
+	  REAL (KIND = GRID_SR)                                                 :: r_dt0, r_dt1, &
+	    r_dt2, r_tim
+	  INTEGER                                              :: i_cnt1, i_cnt2
+
+!---------- set constants
+
+	  r_dt0= p_param%num%r_deltatime
+	  r_dt1= 0.5_GRID_SR* p_param%num%r_deltatime
+	  r_dt2= 1.5_GRID_SR* p_param%num%r_deltatime
+	  r_fac= 0.5_GRID_SR
+	  r_caf= 2.0_GRID_SR
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- calculate in an iteration process the displacements
+
+	  unknown_loop: DO i_cnt1=1,i_arlen
+	    r_axy= 0.0_GRID_SR
+
+	    iter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_coord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO iter_loop
+
+	    r_alpha(:,i_cnt1)= r_axy
+	  END DO unknown_loop
+
+!---------- the same for the dual grid
+
+	  dual_loop: DO i_cnt1=1,i_darlen
+	    r_axy= 0.0_GRID_SR
+
+	    diter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_dcoord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO diter_loop
+
+	    r_dalpha(:,i_cnt1)= r_axy
+	  END DO dual_loop
+
+	  RETURN
+	  END SUBROUTINE slm_adisplace
+
+!*****************************************************************
+	  SUBROUTINE slm_aupdate(p_param, i_arlen, r_coord, r_rside, r_udate, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                   :: p_param
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_udate
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                          :: r_time
+	  INTEGER                                             :: i_cnt
+	  REAL (KIND = GRID_SR)                                                :: r_dt, r_tim
+
+!---------- in the linear advection case and with f90 this is just
+
+!	  r_udate= r_rside
+
+!---------- including a non-zero right hand side, we have
+
+	  r_dt= p_param%num%r_deltatime
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+	  main_loop: DO i_cnt=1, i_arlen
+	    r_udate(i_cnt)= r_rside(i_cnt)+ r_dt* slm_righthand(r_coord(:,i_cnt))
+	  END DO main_loop
+
+	  RETURN
+	  END SUBROUTINE slm_aupdate
+
+!*****************************************************************
+	  SUBROUTINE slm_aupstream(p_mesh, i_arlen, r_coord, r_alpha, &
+	                           i_darlen, r_dcoord, r_dalpha, &
+	                           i_dedge, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)        :: p_mesh
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_alpha
+	  INTEGER, INTENT(in)                                  :: i_darlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in) :: r_dcoord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in) :: r_dalpha
+	  INTEGER, DIMENSION(2,GRID_patchelements,i_arlen), INTENT(in) :: i_dedge
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)                :: r_rside
+	  INTEGER                                              :: i_alct, i_cnt, &
+	    j_cnt, i_tnc, i_oarlen, i_fill, i_len, i_tmp
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_1, r_2, r_3
+	  REAL (KIND = GRID_SR)                                                 :: r_oarea, r_narea
+	  REAL (KIND = GRID_SR), DIMENSION(:,:,:), ALLOCATABLE                  :: r_aux1
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE                    :: r_aux2
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE                      :: r_mass
+	  REAL (KIND = GRID_SR)                                                 :: r_onethird=1._GRID_SR/3._GRID_SR
+	  INTEGER, DIMENSION(GRID_patchelements)               :: i_polynod
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,GRID_elementnodes)    :: r_vertx
+	  REAL (KIND = GRID_SR)                                                 :: r_part, r_isarea
+	  REAL (KIND = GRID_SR), EXTERNAL                                       :: triatria_isectar
+	  REAL (KIND = GRID_SR)                                                 :: r_xmax, r_ymax, r_xmin, r_ymin
+	  REAL (KIND = GRID_SR)                                                 :: r_maxx, r_maxy, r_minx, r_miny
+	  REAL (KIND = GRID_SR)                                                 :: r_val, r_intgrl
+	  INTEGER, DIMENSION(:), POINTER                       :: i_triang
+	  REAL (KIND = GRID_SR), DIMENSION(:), POINTER                          :: r_area
+
+
+!---------- main loop over the nodes of the new grid
+
+	  node_loop: DO i_cnt=1,i_arlen
+
+	    r_val= 0.0_GRID_SR
+	    r_narea= 0.0_GRID_SR
+	    r_vertx= 0.0_GRID_SR
+
+!---------- the upstream dual element's center node
+
+	    r_vertx(1,1)= r_coord(1,i_cnt)- r_alpha(1,i_cnt)
+	    r_vertx(2,1)= r_coord(2,i_cnt)- r_alpha(2,i_cnt)
+
+!---------- now calculate the interference of the voronoi thing with elements from old mesh
+
+	    ptch_loop: DO i_tnc= 1, GRID_patchelements
+	    IF(i_dedge(1,i_tnc,i_cnt) == 0) THEN
+	      EXIT ptch_loop
+	    ELSE
+
+!---------- calculate area
+
+	      r_narea= r_narea+ triang_ar(r_coord(:,i_cnt), &
+	                                    r_dcoord(:,i_dedge(1,i_tnc,i_cnt)), &
+	                                    r_dcoord(:,i_dedge(2,i_tnc,i_cnt)))
+
+!---------- the upstream dual element's outer nodes
+
+	      r_vertx(1,2)= r_dcoord(1,i_dedge(1,i_tnc,i_cnt))- r_dalpha(1,i_dedge(1,i_tnc,i_cnt))
+	      r_vertx(2,2)= r_dcoord(2,i_dedge(1,i_tnc,i_cnt))- r_dalpha(2,i_dedge(1,i_tnc,i_cnt))
+	      r_vertx(1,3)= r_dcoord(1,i_dedge(2,i_tnc,i_cnt))- r_dalpha(1,i_dedge(2,i_tnc,i_cnt))
+	      r_vertx(2,3)= r_dcoord(2,i_dedge(2,i_tnc,i_cnt))- r_dalpha(2,i_dedge(2,i_tnc,i_cnt))
+
+!---------- calculate integral with quadrature rule
+
+	      CALL triang_quadrature(p_mesh(i_time), r_vertx, r_intgrl)
+	      r_val= r_val+ r_intgrl
+
+	    END IF
+	    END DO ptch_loop
+
+!---------- now calculate concentration
+
+	    IF(ABS(r_narea) > GRID_EPS) THEN
+	      IF(ABS(r_val) > GRID_EPS) THEN
+	        r_rside(i_cnt)= r_val/r_narea
+	      ELSE
+	        r_rside(i_cnt)= 0.0_GRID_SR
+	      END IF
+	    ELSE
+	      r_rside(i_cnt)= 0.0_GRID_SR
+	    END IF
+
+	  END DO node_loop
+
+	  RETURN
+	  END SUBROUTINE slm_aupstream
+!*****************************************************************
+	  FUNCTION triang_ar(r_coord1, r_coord2, r_coord3) RESULT (r_area)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord1, r_coord2, r_coord3
+	  REAL (KIND = GRID_SR)                                        :: r_area
+	  REAL (KIND = GRID_SR)                                        :: r_c
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_a, r_b
+
+!---------- calculate vector components
+
+	  r_a= r_coord2- r_coord1
+	  r_b= r_coord3- r_coord1
+
+!---------- calculate components (a,b,c) of cross product vector
+
+	  r_c= (r_a(1)* r_b(2)- r_a(2)* r_b(1))
+
+!---------- calculate area
+
+	  r_area= abs(r_c)* 0.5_GRID_SR
+
+	  RETURN
+	  END FUNCTION triang_ar
+
+!*****************************************************************
+	  SUBROUTINE triang_quadrature(p_mesh, r_vertcoo, r_intgrl)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle)                            :: p_mesh
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,3), INTENT(in) :: r_vertcoo
+	  REAL (KIND = GRID_SR), INTENT(out)                             :: r_intgrl
+
+	  REAL (KIND = GRID_SR)                                          :: r_onethird=1._GRID_SR/3._GRID_SR
+	  REAL (KIND = GRID_SR)                                          :: r_narea
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)               :: r_quadpoint
+	  REAL (KIND = GRID_SR), DIMENSION(3)                            :: r_vals
+
+!---------- calculate area
+
+	  r_narea= triang_ar(r_vertcoo(:,1), r_vertcoo(:,2), r_vertcoo(:,3))
+
+!---------- calculate interpolation values at quadpoints
+
+	  r_quadpoint=(r_vertcoo(:,1)+ r_vertcoo(:,2))* 0.5_GRID_SR
+	  r_vals(1)= grid_coordvalue(p_mesh, r_quadpoint, &
+	                             i_interpolorder=GRID_highorder)
+	  r_quadpoint=(r_vertcoo(:,2)+ r_vertcoo(:,3))* 0.5_GRID_SR
+	  r_vals(2)= grid_coordvalue(p_mesh, r_quadpoint, &
+	                             i_interpolorder=GRID_highorder)
+	  r_quadpoint=(r_vertcoo(:,3)+ r_vertcoo(:,1))* 0.5_GRID_SR
+	  r_vals(3)= grid_coordvalue(p_mesh, r_quadpoint, &
+	                             i_interpolorder=GRID_highorder)
+
+!---------- calculate integral
+
+	  r_intgrl= SUM(r_vals)* r_onethird * r_narea
+	  IF(ABS(r_intgrl) < GRID_EPS) r_intgrl= 0.0_GRID_SR
+
+	  RETURN
+	  END SUBROUTINE triang_quadrature
+
+	END MODULE SLM_advanced
diff --git a/flash2d/src/options/SLM_advanced.quadrature7.f90 b/flash2d/src/options/SLM_advanced.quadrature7.f90
new file mode 100644
index 0000000..68d351f
--- /dev/null
+++ b/flash2d/src/options/SLM_advanced.quadrature7.f90
@@ -0,0 +1,537 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_advanced
+! FUNCTION:
+!	provide advanced semi-Lagrangian routines
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_step
+! FUNCTION:
+!	one step of the basic SLM algorithm
+! SYNTAX:
+!	CALL slm_step(int, real.arr, real.arr)
+! ON INPUT:
+!	...
+! ON OUTPUT:
+!	r_tracer: array with tracer values	real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_displace
+! FUNCTION:
+!	extrapolate the alpha, values for the displacements of the upstream
+!	points from the gridpoints
+! SYNTAX:
+!	CALL slm_displace(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_coord: real array of xy-coordinates		real
+! ON OUTPUT:
+!	r_alpha: displacement vectors to each point	real
+! CALLS:
+!	wind_field
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_update
+! FUNCTION:
+!	calculate the update to the velocity
+! SYNTAX:
+!	CALL slm_update(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_rside: array with right hand side values	real
+! ON OUTPUT:
+!	r_udate: array with new (updated) gid values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is trivial for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_upstream
+! FUNCTION:
+!	calculate right hand side of the equation (upstream values)
+! SYNTAX:
+!	CALL slm_upstream(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_alpha: displacement vectors to each point	real
+! ON OUTPUT:
+!	r_rside: array with right hand side values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is just interpolation for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_interpolate
+! FUNCTION:
+!	do the interpolation
+! SYNTAX:
+!	CALL slm_interpolate(grid, int, real, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	p_ogrid: grid handle to old grid (with data)	TYPE (grid_handle)
+!	r_fac:   factor at which point to interpolate	REAL
+!	i_arlen: array length for the following arrays	INTEGER
+!	r_coord: coordinate array (new grid)		REAL
+!	r_alpha: displacement array (corr. to r_coord)	REAL
+!	r_value: values on the old grid (array)		REAL
+! ON OUTPUT:
+!	r_rside: right hand side (interpolated)		REAL
+! CALLS:
+!
+! COMMENTS:
+!	this one is plain bi-cubic spline interpolation
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_interpolinit
+! FUNCTION:
+!	initialize the interpolation (conservative interpolation)
+! SYNTAX:
+!	CALL slm_interpolate(grid)
+! ON INPUT:
+!	p_ogrid: grid handle to old grid (with data)	TYPE (grid_handle)
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!	we set a global value present in this module:
+!	r_conservation: conservation value		REAL
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	triang_ar
+! FUNCTION:
+!	calculate triangle area given by three coordinates
+! SYNTAX:
+!
+! ON INPUT:
+!
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_displace, slm_update, slm_upstream
+! COMMENTS:
+!
+! USES:
+!	FLASH_parameters, GRID_api, SLM_interpolation, ADV_wind, ADV_rhs
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	4/2002
+!	2. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_advanced
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE GRID_api
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_astep
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_astep(p_ghand, p_param, p_time, r_modtime, i_size, &
+	                       r_coord, r_tracer, i_newsdepth)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                         :: p_param
+	  TYPE (sw_info), INTENT(inout)                             :: p_time
+	  REAL (KIND = GRID_SR), INTENT(in)                                          :: r_modtime
+	  INTEGER, INTENT(in)                                       :: i_size
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size), INTENT(in)        :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_size), INTENT(out)                      :: r_tracer
+	  INTEGER, OPTIONAL, INTENT(in)                             :: i_newsdepth
+
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE      :: r_newvl
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_alpha
+	  INTEGER                              :: i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), POINTER        :: r_dualcoordinates
+	  INTEGER, DIMENSION(:,:,:), POINTER   :: i_dualedges
+	  INTEGER                              :: i_dual
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_dualalpha
+
+!---------- check size!
+
+	  IF(i_size <= 0) THEN
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'INFO [slm_astep]: Zero step size, returning to calling routine'
+	    RETURN
+	  END IF
+
+!---------- allocate auxiliary arrays
+
+	  allocate(r_newvl(i_size), r_alpha(GRID_dimension,i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(38)
+	  END IF not_alloc
+
+!---------- create dual mesh
+
+	  IF(present(i_newsdepth)) THEN
+!	    CALL grid_createdual(p_ghand(i_timeplus), i_dual, i_dualedges, &
+!	                         r_dualcoordinates, i_selectlength=i_size, i_selectindex=i_index)
+	  ELSE
+	    CALL grid_createdual(p_ghand(i_timeplus), i_dual, i_dualedges, &
+	                         r_dualcoordinates)
+	  END IF
+
+!---------- allocate array for dual displacements
+
+	  allocate(r_dualalpha(GRID_dimension,i_dual), stat=i_alct)
+	  not_allocdual: IF(i_alct /= 0) THEN
+	    CALL grid_error(40)
+	  END IF not_allocdual
+
+!-SLM--------- calculate trajectory pieces (displacements)
+
+	  CALL stop_watch('start',3,p_time)
+	  CALL slm_adisplace(p_param, i_size, r_coord, r_alpha, &
+	  		    i_dual, r_dualcoordinates, r_dualalpha, r_time=r_modtime)
+	  CALL stop_watch('stop ',3,p_time)
+
+!-SLM--------- calculate right hand side
+
+	  CALL stop_watch('start',4,p_time)
+	  CALL slm_aupstream(p_ghand, i_size, r_coord, r_alpha, &
+	  		    i_dual, r_dualcoordinates, r_dualalpha, &
+	  		    i_dualedges, r_newvl)
+	  CALL stop_watch('stop ',4,p_time)
+
+!-SLM--------- calculate new grid values
+
+	  CALL stop_watch('start',5,p_time)
+	  CALL slm_aupdate(p_param, i_size, r_coord, r_newvl, r_tracer, r_time=r_modtime)
+	  CALL stop_watch('stop ',5,p_time)
+
+!---------- destroy dual mesh
+
+	  CALL grid_destroydual(i_dual, i_dualedges, r_dualcoordinates)
+
+!-SLM--------- put alpha values to u and v field entries
+
+	  r_alpha= -r_alpha
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_newsdepth=i_newsdepth, i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  ELSE
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  END IF
+
+!-SLM--------- deallocate work arrays
+
+	  deallocate(r_dualalpha, r_alpha, r_newvl)
+
+	  RETURN
+	  END SUBROUTINE slm_astep
+
+!*****************************************************************
+	  SUBROUTINE slm_adisplace(p_param, i_arlen, r_coord, r_alpha, &
+	                          i_darlen, r_dcoord, r_dalpha, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                      :: p_param
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_alpha
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                           :: r_time
+	  INTEGER, INTENT(in)                                  :: i_darlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in)  :: r_dcoord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(out) :: r_dalpha
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_fac, r_caf, &
+	    r_axy, r_xyc
+	  REAL (KIND = GRID_SR)                                                 :: r_dt0, r_dt1, &
+	    r_dt2, r_tim
+	  INTEGER                                              :: i_cnt1, i_cnt2
+
+!---------- set constants
+
+	  r_dt0= p_param%num%r_deltatime
+	  r_dt1= 0.5_GRID_SR* p_param%num%r_deltatime
+	  r_dt2= 1.5_GRID_SR* p_param%num%r_deltatime
+	  r_fac= 0.5_GRID_SR
+	  r_caf= 2.0_GRID_SR
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- calculate in an iteration process the displacements
+
+	  unknown_loop: DO i_cnt1=1,i_arlen
+	    r_axy= 0.0_GRID_SR
+
+	    iter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_coord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO iter_loop
+
+	    r_alpha(:,i_cnt1)= r_axy
+	  END DO unknown_loop
+
+!---------- the same for the dual grid
+
+	  dual_loop: DO i_cnt1=1,i_darlen
+	    r_axy= 0.0_GRID_SR
+
+	    diter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_dcoord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO diter_loop
+
+	    r_dalpha(:,i_cnt1)= r_axy
+	  END DO dual_loop
+
+	  RETURN
+	  END SUBROUTINE slm_adisplace
+
+!*****************************************************************
+	  SUBROUTINE slm_aupdate(p_param, i_arlen, r_coord, r_rside, r_udate, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                   :: p_param
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_udate
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                          :: r_time
+	  INTEGER                                             :: i_cnt
+	  REAL (KIND = GRID_SR)                                                :: r_dt, r_tim
+
+!---------- in the linear advection case and with f90 this is just
+
+!	  r_udate= r_rside
+
+!---------- including a non-zero right hand side, we have
+
+	  r_dt= p_param%num%r_deltatime
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+	  main_loop: DO i_cnt=1, i_arlen
+	    r_udate(i_cnt)= r_rside(i_cnt)+ r_dt* slm_righthand(r_coord(:,i_cnt))
+	  END DO main_loop
+
+	  RETURN
+	  END SUBROUTINE slm_aupdate
+
+!*****************************************************************
+	  SUBROUTINE slm_aupstream(p_mesh, i_arlen, r_coord, r_alpha, &
+	                           i_darlen, r_dcoord, r_dalpha, &
+	                           i_dedge, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)        :: p_mesh
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_alpha
+	  INTEGER, INTENT(in)                                  :: i_darlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in) :: r_dcoord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_darlen), INTENT(in) :: r_dalpha
+	  INTEGER, DIMENSION(2,GRID_patchelements,i_arlen), INTENT(in) :: i_dedge
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)                :: r_rside
+	  INTEGER                                              :: i_alct, i_cnt, &
+	    j_cnt, i_tnc, i_oarlen, i_fill, i_len, i_tmp
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_1, r_2, r_3
+	  REAL (KIND = GRID_SR)                                                 :: r_oarea, r_narea
+	  REAL (KIND = GRID_SR), DIMENSION(:,:,:), ALLOCATABLE                  :: r_aux1
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE                    :: r_aux2
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE                      :: r_mass
+	  REAL (KIND = GRID_SR)                                                 :: r_onethird=1._GRID_SR/3._GRID_SR
+	  INTEGER, DIMENSION(GRID_patchelements)               :: i_polynod
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,GRID_elementnodes)    :: r_vertx
+	  REAL (KIND = GRID_SR)                                                 :: r_part, r_isarea
+	  REAL (KIND = GRID_SR), EXTERNAL                                       :: triatria_isectar
+	  REAL (KIND = GRID_SR)                                                 :: r_xmax, r_ymax, r_xmin, r_ymin
+	  REAL (KIND = GRID_SR)                                                 :: r_maxx, r_maxy, r_minx, r_miny
+	  REAL (KIND = GRID_SR)                                                 :: r_val, r_intgrl
+	  INTEGER, DIMENSION(:), POINTER                       :: i_triang
+	  REAL (KIND = GRID_SR), DIMENSION(:), POINTER                          :: r_area
+
+
+!---------- main loop over the nodes of the new grid
+
+	  node_loop: DO i_cnt=1,i_arlen
+
+	    r_val= 0.0_GRID_SR
+	    r_narea= 0.0_GRID_SR
+	    r_vertx= 0.0_GRID_SR
+
+!---------- the upstream dual element's center node
+
+	    r_vertx(1,1)= r_coord(1,i_cnt)- r_alpha(1,i_cnt)
+	    r_vertx(2,1)= r_coord(2,i_cnt)- r_alpha(2,i_cnt)
+
+!---------- now calculate the interference of the voronoi thing with elements from old mesh
+
+	    ptch_loop: DO i_tnc= 1, GRID_patchelements
+	    IF(i_dedge(1,i_tnc,i_cnt) == 0) THEN
+	      EXIT ptch_loop
+	    ELSE
+
+!---------- calculate area
+
+	      r_narea= r_narea+ triang_ar(r_coord(:,i_cnt), &
+	                                    r_dcoord(:,i_dedge(1,i_tnc,i_cnt)), &
+	                                    r_dcoord(:,i_dedge(2,i_tnc,i_cnt)))
+
+!---------- the upstream dual element's outer nodes
+
+	      r_vertx(1,2)= r_dcoord(1,i_dedge(1,i_tnc,i_cnt))- r_dalpha(1,i_dedge(1,i_tnc,i_cnt))
+	      r_vertx(2,2)= r_dcoord(2,i_dedge(1,i_tnc,i_cnt))- r_dalpha(2,i_dedge(1,i_tnc,i_cnt))
+	      r_vertx(1,3)= r_dcoord(1,i_dedge(2,i_tnc,i_cnt))- r_dalpha(1,i_dedge(2,i_tnc,i_cnt))
+	      r_vertx(2,3)= r_dcoord(2,i_dedge(2,i_tnc,i_cnt))- r_dalpha(2,i_dedge(2,i_tnc,i_cnt))
+
+!---------- calculate integral with quadrature rule
+
+	      CALL triang_quadrature(p_mesh(i_time), r_vertx, r_intgrl)
+	      r_val= r_val+ r_intgrl
+
+	    END IF
+	    END DO ptch_loop
+
+!---------- now calculate concentration
+
+	    r_rside(i_cnt)= r_val/r_narea
+
+	  END DO node_loop
+
+	  RETURN
+	  END SUBROUTINE slm_aupstream
+!*****************************************************************
+	  FUNCTION triang_ar(r_coord1, r_coord2, r_coord3) RESULT (r_area)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord1, r_coord2, r_coord3
+	  REAL (KIND = GRID_SR)                                        :: r_area
+	  REAL (KIND = GRID_SR)                                        :: r_c
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_a, r_b
+
+!---------- calculate vector components
+
+	  r_a= r_coord2- r_coord1
+	  r_b= r_coord3- r_coord1
+
+!---------- calculate components (a,b,c) of cross product vector
+
+	  r_c= (r_a(1)* r_b(2)- r_a(2)* r_b(1))
+
+!---------- calculate area
+
+	  r_area= abs(r_c)* 0.5_GRID_SR
+
+	  RETURN
+	  END FUNCTION triang_ar
+
+!*****************************************************************
+	  SUBROUTINE triang_quadrature(p_mesh, r_vertcoo, r_intgrl)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle)                            :: p_mesh
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,3), INTENT(in) :: r_vertcoo
+	  REAL (KIND = GRID_SR), INTENT(out)                             :: r_intgrl
+
+	  REAL (KIND = GRID_SR), PARAMETER                               :: r_onethird=1._GRID_SR/3._GRID_SR
+	  REAL (KIND = GRID_SR), PARAMETER                               :: r_one20=1._GRID_SR/20._GRID_SR
+	  REAL (KIND = GRID_SR), PARAMETER                               :: r_two15=2._GRID_SR/15._GRID_SR
+	  REAL (KIND = GRID_SR), PARAMETER                               :: r_nine20=9._GRID_SR/20._GRID_SR
+	  REAL (KIND = GRID_SR)                                          :: r_narea
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)               :: r_quadpoint
+	  REAL (KIND = GRID_SR), DIMENSION(7)                            :: r_vals
+	  REAL (KIND = GRID_SR), DIMENSION(3)                            :: r_weight
+
+!---------- calculate area and weights
+
+	  r_narea= triang_ar(r_vertcoo(:,1), r_vertcoo(:,2), r_vertcoo(:,3))
+	  r_weight(1)= r_narea* r_one20
+	  r_weight(2)= r_narea* r_two15
+	  r_weight(3)= r_narea* r_nine20
+	  
+
+!---------- calculate interpolation values at quadpoints
+
+	  r_quadpoint=r_vertcoo(:,1)
+	  r_vals(1)= grid_coordvalue(p_mesh, r_quadpoint, &
+	                             i_interpolorder=GRID_highorder)
+	  r_quadpoint=r_vertcoo(:,2)
+	  r_vals(2)= grid_coordvalue(p_mesh, r_quadpoint, &
+	                             i_interpolorder=GRID_highorder)
+	  r_quadpoint=r_vertcoo(:,3)
+	  r_vals(3)= grid_coordvalue(p_mesh, r_quadpoint, &
+	                             i_interpolorder=GRID_highorder)
+
+	  r_quadpoint=(r_vertcoo(:,1)+ r_vertcoo(:,2))* 0.5_GRID_SR
+	  r_vals(4)= grid_coordvalue(p_mesh, r_quadpoint, &
+	                             i_interpolorder=GRID_highorder)
+	  r_quadpoint=(r_vertcoo(:,2)+ r_vertcoo(:,3))* 0.5_GRID_SR
+	  r_vals(5)= grid_coordvalue(p_mesh, r_quadpoint, &
+	                             i_interpolorder=GRID_highorder)
+	  r_quadpoint=(r_vertcoo(:,3)+ r_vertcoo(:,1))* 0.5_GRID_SR
+	  r_vals(6)= grid_coordvalue(p_mesh, r_quadpoint, &
+	                             i_interpolorder=GRID_highorder)
+
+	  r_quadpoint=(r_vertcoo(:,1)+ r_vertcoo(:,2)+ r_vertcoo(:,3))* r_onethird
+	  r_vals(7)= grid_coordvalue(p_mesh, r_quadpoint, &
+	                             i_interpolorder=GRID_highorder)
+
+!---------- calculate integral
+
+	  r_intgrl= SUM(r_vals(1:3))* r_weight(1)+ &
+	            SUM(r_vals(4:6))* r_weight(2)+ &
+		    r_vals(7)* r_weight(3)
+
+	  RETURN
+	  END SUBROUTINE triang_quadrature
+
+	END MODULE SLM_advanced
diff --git a/flash2d/src/options/SLM_advanced.tps.f90 b/flash2d/src/options/SLM_advanced.tps.f90
new file mode 100644
index 0000000..ac0889b
--- /dev/null
+++ b/flash2d/src/options/SLM_advanced.tps.f90
@@ -0,0 +1,381 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_advanced
+! FUNCTION:
+!	provide advanced semi-Lagrangian routines
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_step
+! FUNCTION:
+!	one step of the basic SLM algorithm
+! SYNTAX:
+!	CALL slm_step(int, real.arr, real.arr)
+! ON INPUT:
+!	...
+! ON OUTPUT:
+!	r_tracer: array with tracer values	real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_displace
+! FUNCTION:
+!	extrapolate the alpha, values for the displacements of the upstream
+!	points from the gridpoints
+! SYNTAX:
+!	CALL slm_displace(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_coord: real array of xy-coordinates		real
+! ON OUTPUT:
+!	r_alpha: displacement vectors to each point	real
+! CALLS:
+!	wind_field
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_update
+! FUNCTION:
+!	calculate the update to the velocity
+! SYNTAX:
+!	CALL slm_update(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_rside: array with right hand side values	real
+! ON OUTPUT:
+!	r_udate: array with new (updated) gid values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is trivial for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_upstream
+! FUNCTION:
+!	calculate right hand side of the equation (upstream values)
+! SYNTAX:
+!	CALL slm_upstream(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_alpha: displacement vectors to each point	real
+! ON OUTPUT:
+!	r_rside: array with right hand side values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is just interpolation for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_interpolate
+! FUNCTION:
+!	do the interpolation
+! SYNTAX:
+!	CALL slm_interpolate(grid, int, real, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	p_ogrid: grid handle to old grid (with data)	TYPE (grid_handle)
+!	r_fac:   factor at which point to interpolate	REAL
+!	i_arlen: array length for the following arrays	INTEGER
+!	r_coord: coordinate array (new grid)		REAL
+!	r_alpha: displacement array (corr. to r_coord)	REAL
+!	r_value: values on the old grid (array)		REAL
+! ON OUTPUT:
+!	r_rside: right hand side (interpolated)		REAL
+! CALLS:
+!
+! COMMENTS:
+!	this one is plain bi-cubic spline interpolation
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_astep
+! COMMENTS:
+!
+! USES:
+!	FLASH_parameters, GRID_api, ADV_wind, ADV_rhs
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	4/2002
+!	2. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_advanced
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE GRID_api
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_astep
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_astep(p_ghand, p_param, p_time, r_modtime, i_size, &
+	                       r_coord, r_tracer, i_newsdepth)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                         :: p_param
+	  TYPE (sw_info), INTENT(inout)                             :: p_time
+	  REAL (KIND = GRID_SR), INTENT(in)                         :: r_modtime
+	  INTEGER, INTENT(in)                                       :: i_size
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_size), INTENT(out)     :: r_tracer
+	  INTEGER, OPTIONAL, INTENT(in)                             :: i_newsdepth
+	  
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE          :: r_newvl
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_alpha
+	  INTEGER                                                   :: i_alct
+
+!---------- check size!
+
+	  IF(i_size <= 0) THEN
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'INFO [slm_astep]: Zero step size, returning to calling routine'
+	    RETURN
+	  END IF
+
+!---------- allocate auxiliary arrays
+
+	  allocate(r_newvl(i_size), r_alpha(GRID_dimension,i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(38)
+	  END IF not_alloc
+
+!-SLM--------- calculate trajectory pieces (displacements)
+
+	  CALL stop_watch('start',3,p_time)
+	  CALL slm_adisplace(p_param, i_size, r_coord, r_alpha, r_time=r_modtime)
+	  CALL stop_watch('stop ',3,p_time)
+
+!-SLM--------- calculate right hand side
+
+	  CALL stop_watch('start',4,p_time)
+	  CALL slm_aupstream(p_ghand, i_size, r_coord, r_alpha, r_newvl)
+	  CALL stop_watch('stop ',4,p_time)
+
+!-SLM--------- calculate new grid values
+
+	  CALL stop_watch('start',5,p_time)
+	  CALL slm_aupdate(p_param, i_size, r_coord, r_newvl, r_tracer, r_time=r_modtime)
+	  CALL stop_watch('stop ',5,p_time)
+
+!-SLM--------- put alpha values to u and v field entries
+
+	  r_alpha= -r_alpha
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_newsdepth=i_newsdepth, i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  ELSE
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  END IF
+
+!-SLM--------- deallocate work arrays
+
+	  deallocate(r_alpha, r_newvl)
+
+	  RETURN
+	  END SUBROUTINE slm_astep
+
+!*****************************************************************
+	  SUBROUTINE slm_adisplace(p_param, i_arlen, r_coord, r_alpha, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                      :: p_param
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_alpha
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                           :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_fac, r_caf, &
+	    r_axy, r_xyc
+	  REAL (KIND = GRID_SR)                                                 :: r_dt0, r_dt1, &
+	    r_dt2, r_tim
+	  INTEGER                                              :: i_cnt1, i_cnt2
+          
+!---------- set constants
+
+	  r_dt0= p_param%num%r_deltatime
+	  r_dt1= 0.5_GRID_SR* p_param%num%r_deltatime
+	  r_dt2= 1.5_GRID_SR* p_param%num%r_deltatime
+	  r_fac= 0.5_GRID_SR
+	  r_caf= 2.0_GRID_SR
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- calculate in an iteration process the displacements
+
+	  unknown_loop: DO i_cnt1=1,i_arlen
+	    r_axy= 0.0_GRID_SR
+
+	    iter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_coord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO iter_loop
+
+	    r_alpha(:,i_cnt1)= r_axy
+	  END DO unknown_loop
+
+	  RETURN
+	  END SUBROUTINE slm_adisplace
+
+!*****************************************************************
+	  SUBROUTINE slm_aupdate(p_param, i_arlen, r_coord, r_rside, r_udate, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                   :: p_param
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_udate
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                          :: r_time
+	  INTEGER                                             :: i_cnt
+	  REAL (KIND = GRID_SR)                                                :: r_dt, r_tim
+
+!---------- in the linear advection case and with f90 this is just
+
+!	  r_udate= r_rside
+
+!---------- including a non-zero right hand side, we have
+
+	  r_dt= p_param%num%r_deltatime
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+	  main_loop: DO i_cnt=1, i_arlen
+	    r_udate(i_cnt)= r_rside(i_cnt)+ r_dt* slm_righthand(r_coord(:,i_cnt))
+	  END DO main_loop
+
+	  RETURN
+	  END SUBROUTINE slm_aupdate
+
+!*****************************************************************
+	  SUBROUTINE slm_aupstream(p_mesh, i_arlen, r_coord, &
+	                          r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                     :: r_fac
+
+!---------- set factor (at which point of trajectory shall i interpolate)
+
+	  r_fac= 1.0_GRID_SR
+
+!---------- in the linear advection case this is just interpolation
+
+	  CALL slm_ainterpolate(p_mesh, r_fac, i_arlen, r_coord, &
+	                       r_alpha, r_rside)
+
+	  RETURN
+	  END SUBROUTINE slm_aupstream
+!*****************************************************************
+	  SUBROUTINE slm_ainterpolate(p_mesh, r_fac, i_arlen, &
+	                             r_coord, r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in)         :: r_fac
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE                   :: r_upstr
+	  REAL (KIND = GRID_SR)                                                :: r_eps
+	  INTEGER                                             :: i_cnt, i_alct, &
+	    i_val, i_out, i_stat
+
+!---------- initialize constant
+
+	  i_val= GRID_tracer
+	  r_eps= GRID_EPS
+
+!---------- allocate work array
+
+	  ALLOCATE(r_upstr(GRID_dimension,i_arlen), stat=i_alct)
+	  not_allocated: IF(i_alct /= 0) THEN
+	    CALL grid_error(60)
+	  END IF not_allocated
+
+!---------- calculate upstream coordinates
+
+	  dim_loop: DO i_cnt=1, GRID_dimension
+	    r_upstr(i_cnt,:) = r_coord(i_cnt,:)- r_fac(i_cnt)* r_alpha(i_cnt,:)
+	  END DO dim_loop
+
+!---------- loop over nodes: find element containing upstream point
+
+	  node_loop: DO i_cnt=1, i_arlen
+
+!---------- check if upstream value is outside of the domain
+
+	    i_out= grid_domaincheck(p_mesh(i_time), r_upstr(:,i_cnt))
+
+!---------- take the intersection of the trajectory with the boundary as new upstream point
+
+	    out_domain: IF(i_out /= 0) then
+	      r_upstr(:,i_cnt)= grid_boundintersect(p_mesh(i_time), &
+	                        r_coord(:,i_cnt), r_upstr(:,i_cnt), i_info=i_stat)
+	      no_intersect: IF(i_stat /= 0) THEN
+	        r_rside(i_cnt)= 0.0_GRID_SR
+	        CYCLE node_loop
+	      END IF no_intersect
+	    END IF out_domain
+
+!---------- interpolate
+
+	    r_rside(i_cnt)= grid_coordvalue(p_mesh(i_time), r_upstr(:,i_cnt), &
+	                    i_interpolorder=GRID_thinplate, i_valpoint=i_val)
+	    small_val: IF(abs(r_rside(i_cnt)) < r_eps) THEN
+	      r_rside(i_cnt)= 0.0_GRID_SR
+	    END IF small_val
+
+	  END DO node_loop
+
+!---------- deallocate work array
+
+	  DEALLOCATE(r_upstr)
+
+	  RETURN
+	  END SUBROUTINE slm_ainterpolate
+
+
+	END MODULE SLM_advanced
diff --git a/flash2d/src/options/SLM_initial.3humps.f90 b/flash2d/src/options/SLM_initial.3humps.f90
new file mode 100644
index 0000000..37206e1
--- /dev/null
+++ b/flash2d/src/options/SLM_initial.3humps.f90
@@ -0,0 +1,407 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_initial
+! FUNCTION:
+!	initialize slotted cylinder for semi-Lagrangian advection
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialvalues
+! FUNCTION:
+!	initialize a grid with values
+! SYNTAX:
+!	CALL slm_initialvalues(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initslot
+! FUNCTION:
+!	initialize a grid with values of slotted cylinder test case
+! SYNTAX:
+!	CALL slm_initslot(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_analyticsolution
+! FUNCTION:
+!	calculates the 'analytic solution' to compare with in diagnostics
+! SYNTAX:
+!	CALL slm_analyticsolution(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initcylndr
+! FUNCTION:
+!	initialize a grid with values of a cylinder test case
+! SYNTAX:
+!	CALL slm_initcylndr(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_centr: coordinates of cyl. centre	REAL
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	in_side
+! FUNCTION:
+!	checks, if a given point (x,y) lies within a given triangle
+! SYNTAX:
+!	logical= in_side(real.arr, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	r_coord: coordinate array		REAL
+!	r_node1: node1 of triangle		REAL
+!	r_node2: node2 of triangle		REAL
+!	r_node3: node3 of triangle		REAL
+! ON OUTPUT:
+!	l_in:    .true. if r_coord \in p_elem	logical
+! CALLS:
+!
+! COMMENTS:
+!	this routine decides whether a point lies in or out of a
+!	triangle. this is done with the following approach:
+!	calculate the area for the given triangle and for the 
+!	three triangles resulting from drawing lines from the given
+!	point to all three triangle nodes.
+!	if the sum of the areas of those three trianlges exceeds
+!	the area of the given trianlge, the the point lies outside
+!	of it.
+!	for calculation of the areas following formula is used:
+!	(Herons formula(?))
+!
+!	A = sqrt(s* (s- a)* (s- b)* (s- c)),
+!
+!	where s= 1/2* (a+ b+ c)
+!	      a, b, c sides.
+!
+!	in order to calculate the sidelengths |x-y|= sqrt(x**2-y**2)
+!	the complex absolute value intrinsic function is used.
+!	hopefully this fuction is faster than using sqrt and
+!	power-of-two instead.
+!
+!	internally double precision is used in this function, because
+!	machine precision is crucial when a coordinate pair appears
+!	near the edge or corner of an element.
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	dc_area
+! FUNCTION:
+!	calculate area of a triangle (in a plain) in double precision
+! SYNTAX:
+!	real= dc_area(real.arr, real.arr, real.arr)
+! ON INPUT:
+!	r_coord1: node1 of triangle			REAL
+!	r_coord2: node2 of triangle			REAL
+!	r_coord3: node3 of triangle			REAL
+! ON OUTPUT:
+!	r_area:   area of triangle			REAL
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_initialvalues, slm_analyticsolution
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	7/97
+!	2. names changed		j. behrens	7/97
+!	3. changed to use GRID_api	j. behrens	11/97
+!	4. changed interfaces		j. behrens	12/97
+!	5. compliant to amatos 1.0	j. behrens	12/2000
+!	6. compliant to amatos 1.2	j. behrens	3/2002
+!	7. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_initial
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC slm_initialvalues, slm_analyticsolution
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_cntr=(/ 0.5, 0.75 /)
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_hcntr=(/ 0.25, 0.5 /)
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_ccntr=(/ 0.5, 0.25 /)
+	  REAL (KIND = GRID_SR)                            :: r_hgt=1.0
+	  REAL (KIND = GRID_SR)                            :: r_srd=0.15
+	  REAL (KIND = GRID_SR)                            :: r_sln=0.22
+	  REAL (KIND = GRID_SR)                            :: r_swd=0.06
+	  REAL (KIND = GRID_SR)                            :: r_onethird=1./3.
+	  REAL (KIND = GRID_SR)                            :: r_twothird=2./3.
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_initialvalues(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  INTEGER                                    :: i_lev= 6
+
+!---------- initialize some constant for the slotted cylinder
+
+	  cyl_slot: IF(p_ghand%i_maxlvl < i_lev) THEN
+	    CALL slm_inithump(p_ghand)
+	  ELSE cyl_slot
+	    CALL slm_inithump(p_ghand)
+	  END IF cyl_slot
+
+	  RETURN
+	  END SUBROUTINE slm_initialvalues
+!*****************************************************************
+	  SUBROUTINE slm_analyticsolution(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)              :: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  INTEGER, INTENT(in)                         :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(inout)     :: r_array
+	  REAL (KIND = GRID_SR)                                        :: r_fac=.363610260832151995e-4
+	  REAL (KIND = GRID_SR)                                        :: r_rds, r_ras, r_rad, &
+	    r_ads, r_bds, r_cds, r_f1, r_f2, r_xya, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_fc, r_p1, r_p2, &
+	    r_pa, r_pb, r_pc, r_pd, r_tmp, r_centr
+	  INTEGER                                     :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE           :: r_coo
+	  LOGICAL                                     :: l_aux
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  IF(i_arlen /= i_num) THEN
+	    CALL grid_error(52)
+	  END IF
+
+	  ALLOCATE(r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(53)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- compute values for Gaussian hump
+
+      CALL compute_hump(i_num, r_coo, r_array)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsolution
+
+!*****************************************************************
+	  FUNCTION dc_area(r_coord1, r_coord2, r_coord3) RESULT (r_area)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord1, r_coord2, r_coord3
+	  REAL (KIND = GRID_DR)                            :: r_area
+	  REAL (KIND = GRID_DR)                            :: r_c
+	  REAL (KIND = GRID_DR), DIMENSION(GRID_dimension) :: r_a, r_b
+	  INTEGER                                     :: i_cnt
+
+!---------- calculate vector components
+
+	  dim_loop: DO i_cnt=1, GRID_dimension
+	    r_a(i_cnt)= REAL((r_coord2(i_cnt)- r_coord1(i_cnt)),GRID_DR)
+	    r_b(i_cnt)= REAL((r_coord3(i_cnt)- r_coord1(i_cnt)),GRID_DR)
+	  END DO dim_loop
+
+!---------- calculate components (a,b,c) of cross product vector
+
+	  r_c= (r_a(1)* r_b(2)- r_a(2)* r_b(1))
+
+!---------- calculate area
+
+	  r_area= abs(r_c)* 0.5_GRID_DR
+
+	  RETURN
+	  END FUNCTION dc_area
+
+!*****************************************************************
+	  FUNCTION in_side(r_coord, r_node1, r_node2, r_node3) RESULT (l_in)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_node1, r_node2, r_node3
+	  LOGICAL                                     :: l_in
+	  REAL (KIND = GRID_DR)                            :: r_sum, r_f, r_f1, r_f2, r_f3
+	  REAL (KIND = GRID_DR)                            :: r_eps
+
+!---------- set in_side value to out
+
+ 	  l_in= .FALSE.
+
+!---------- set epsilon (machine precision)
+
+	  r_eps= GRID_eps
+
+!---------- calculate areas (f, f1, f2, f3)
+
+	  r_f = dc_area(r_node1, r_node2, r_node3)
+	  r_f1= dc_area(r_coord, r_node2, r_node3)
+	  r_f2= dc_area(r_coord, r_node1, r_node2)
+	  r_f3= dc_area(r_coord, r_node1, r_node3)
+
+!---------- check if summed area is bigger than triangle area
+
+	  r_sum= r_f1+ r_f2+ r_f3
+	  if((r_sum- r_f) < r_eps) l_in= .TRUE.
+
+	  RETURN
+	  END FUNCTION in_side
+
+!*****************************************************************
+	  SUBROUTINE slm_inithump(p_ghand, l_initialize)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)                     :: p_ghand
+	  LOGICAL, OPTIONAL                                  :: l_initialize
+
+	  INTEGER                                            :: i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_coo
+	  INTEGER, DIMENSION(1)                              :: i_valind
+
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(55)
+	  END IF
+
+!---------- get information
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_getinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux, &
+	    r_nodecoordinates= r_coo)
+
+!---------- initialize values to zero if requested
+
+	  IF(present(l_initialize) .AND. l_initialize) r_aux= 0._GRID_SR
+
+!---------- compute values for Gaussian humps
+
+      CALL compute_hump(i_num, r_coo, r_aux(1,:), r_center=r_hcntr)
+      CALL compute_hump(i_num, r_coo, r_aux(1,:), r_center=r_cntr, r_radius=(r_srd*1.5))
+      CALL compute_hump(i_num, r_coo, r_aux(1,:), r_center=r_ccntr, r_radius=(r_srd*.8))
+
+!---------- update grid information
+
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_inithump
+!*****************************************************************
+	  SUBROUTINE compute_hump(i_num, r_coo, r_aux, r_center, r_radius)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  INTEGER                                          :: i_num
+	  REAL (KIND = GRID_SR), DIMENSION(:)              :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:)            :: r_coo
+	  REAL (KIND = GRID_SR), DIMENSION(:), OPTIONAL    :: r_center
+	  REAL (KIND = GRID_SR), OPTIONAL                  :: r_radius
+
+	  INTEGER                                          :: i_count
+	  REAL (KIND = GRID_SR)                            :: r_rds, r_dpt, r_rad, r_pr, r_lsrd
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_centr, r_tmp
+
+!---------- initialize some constant for the slotted cylinder
+
+	  IF (PRESENT(r_center)) THEN
+	    r_centr= r_center
+	  ELSE
+	    r_centr= r_hcntr
+	  END IF
+	  IF (PRESENT(r_radius)) THEN
+	    r_lsrd = r_radius
+	  ELSE
+	    r_lsrd= r_srd
+	  END IF
+	  r_rds= r_lsrd* r_lsrd
+	
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_tmp(:)      = r_coo(:,i_count)- r_centr(:)
+	    r_dpt= dot_product(r_tmp, r_tmp)
+	    inside: IF(r_dpt < r_rds) THEN
+	      r_rad= min(sqrt(r_dpt),r_lsrd)/r_lsrd
+	      r_pr= GRID_PI* r_rad
+	      r_aux(i_count)= 0.25_GRID_SR* (1+ cos(r_pr))
+	    END IF inside
+	  END DO node_loop
+
+	  RETURN
+	  END SUBROUTINE compute_hump
+
+	END MODULE SLM_initial
diff --git a/flash2d/src/options/SLM_initial.SWCosine.f90 b/flash2d/src/options/SLM_initial.SWCosine.f90
new file mode 100644
index 0000000..4024df1
--- /dev/null
+++ b/flash2d/src/options/SLM_initial.SWCosine.f90
@@ -0,0 +1,379 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!   SLM_initial
+! FUNCTION:
+!   initialize a cosinus hill with zero base velocity in the center of the area
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!   slm_initialvalues
+! FUNCTION:
+!   initialize a grid with values
+! SYNTAX:
+!   CALL slm_initialvalues(grid)
+! ON INPUT:
+!   p_ghand: grid handle            TYPE (grid_handle)
+! ON OUTPUT:
+!   p_ghand: grid handle            TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!   the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!   slm_initwaves
+! FUNCTION:
+!   initialize the gridpoint values with the initial values for
+!    (u,v),  h  and (hu, hv)
+! SYNTAX:
+!   CALL slm_initbar(grid)
+! ON INPUT:
+!   p_ghand: grid handle            TYPE (grid_handle)
+! ON OUTPUT:
+!   p_ghand: grid handle            TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!   the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!   slm_analyticsolution
+! FUNCTION:
+!   calculates the 'analytic solution' to compare with in diagnostics
+! SYNTAX:
+!   CALL slm_analyticsolution(grid, real, int, real.arr)
+! ON INPUT:
+!   p_ghand: grid handle            TYPE (grid_handle)
+!   r_time:  model time         REAL
+!   i_arlen: array length for values array  INTEGER
+! ON OUTPUT:
+!   r_array: values at gridpoints       REAL
+! CALLS:
+!
+! COMMENTS:
+!   the routine is made for two dimensions only. It calculates the analytical solution for h and u
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!   slm_initvelo
+! FUNCTION:
+!   calculates the initival velocity
+! SYNTAX:
+!   CALL slm_initvelo(real.arr, int, real.arr)
+! ON INPUT:
+!   r_coord: coordinates of gridpoints   REAL
+!   i_arlen: array length for values array  INTEGER
+! ON OUTPUT:
+!  r_initialV: values at gridpoints       REAL
+! CALLS:
+!
+! COMMENTS:
+!   the routine is made for two dimensions only. It calculates just the u at the moment
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!   slm_initheight
+! FUNCTION:
+!   calculates the initival height
+! SYNTAX:
+!   CALL slm_initvelo(real.arr, int, real.arr)
+! ON INPUT:
+!   r_coord: coordinates of gridpoints   REAL
+!   i_arlen: array length for values array  INTEGER
+! ON OUTPUT:
+!  r_initialH: values at gridpoints       REAL
+! CALLS:
+!
+! COMMENTS:
+!   the routine is made for two dimensions only. It calculates the initial height
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!   slm_initialvalues, slm_analyticsolution, slm_initvelo
+! COMMENTS:
+!
+! USES:
+!   MISC_globalparam, MISC_error, GRID_api, FLASH_Parameters
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!   1. original version     j. behrens  7/97
+!   2. names changed        j. behrens  7/97
+!   3. changed to use GRID_api  j. behrens  11/97
+!   4. changed interfaces       j. behrens  12/97
+!   5. compliant to amatos 1.0  j. behrens  12/2000
+!   6. compliant to amatos 1.2  j. behrens  3/2002
+!   7. compliant to amatos 2.0  j. behrens  7/2003
+!   8. adjusted to Cosinus Hill s.paruszewski 1/2015
+!
+!*****************************************************************
+    MODULE SLM_initial
+      USE FLASH_parameters
+!      USE IO_plot_vtu
+      USE GRID_api
+      PRIVATE
+      PUBLIC slm_initialvalues, slm_analyticsolution, slm_initvelo, slm_initGrad, add_grid_params, getAvrgH
+      REAL (KIND = GRID_SR)                            :: r_avrgH=8.0
+      REAL (KIND = GRID_SR)                            :: r_varH=8.0
+      REAL (KIND = GRID_SR)                            :: r_centerPoint=12500.0
+      REAL (KIND = GRID_SR)                            :: r_radius=6000.0
+                                                              
+      CONTAINS
+!*****************************************************************
+      
+      SUBROUTINE getAvrgH(r_Height)
+
+!---------- local declarations
+
+      IMPLICIT NONE
+
+      REAL (KIND = GRID_SR), INTENT(out)              :: r_Height
+   
+      r_Height= r_avrgH
+
+      RETURN
+      END SUBROUTINE getAvrgH
+
+!*****************************************************************
+      SUBROUTINE slm_initialvalues(p_ghand)
+
+!---------- local declarations
+
+      IMPLICIT NONE
+
+      TYPE (grid_handle), INTENT(in)             :: p_ghand
+
+    
+      CALL slm_initwaves(p_ghand)
+
+      RETURN
+      END SUBROUTINE slm_initialvalues
+!*****************************************************************
+      SUBROUTINE slm_analyticsolution(p_ghand, r_time, i_num, r_iniOutHeight, r_iniMom, r_iniVelo)
+!----  A T T E N T I O N     T H I S   I S   N O T   A N   A N A L Y T I C A L    S O L U T I O N !!!!!!!!!!!!!
+!----  THAT MEANS ALSO:  NOT EVERY VALUE IN THE DIAGNOSTIC FILE IS USEFUL
+!---------- local declarations
+
+      IMPLICIT NONE
+
+      TYPE (grid_handle), INTENT(in)                         :: p_ghand
+      REAL (KIND = GRID_SR), INTENT(in)                      :: r_time
+      INTEGER, INTENT(in)                                    :: i_num
+      REAL (KIND = GRID_SR), DIMENSION(i_num), INTENT(out) :: r_iniOutHeight
+      INTEGER                                                :: i_count , i_alct
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_num), INTENT(out) :: r_iniVelo, r_iniMom
+      REAL (KIND = GRID_SR), DIMENSION(1,i_num)::    r_iniHeight
+      REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_coo
+      REAL (KIND = GRID_SR)                              :: r_x, r_y
+!---------- allocate workspace
+
+      ALLOCATE( r_coo(GRID_dimension,i_num), stat= i_alct)
+      IF(i_alct /= 0) THEN
+        CALL grid_error(51)
+      END IF
+
+!---------- get coordinate information
+
+      CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- calculate initial velocity
+      CALL slm_initVelo(r_coo, i_num, r_iniVelo)  
+!---------- calculate initial height
+      CALL slm_initHeight(r_coo, i_num, r_iniHeight)
+       r_iniOutHeight=r_iniHeight(1,:)
+!---------- loop over the nodes
+
+      node_loop: DO i_count= 1, i_num
+
+!----------- Calculate momentum (hu)  by using h*u
+          
+          r_iniMom(1,i_count)= r_iniVelo(1,i_count)*r_iniHeight(1,i_count)
+          r_iniMom(2,i_count)= r_iniVelo(2,i_count)*r_iniHeight(1,i_count)
+
+          IF(abs(r_iniMom(1,i_count))<GRID_eps) THEN
+            r_iniMom(1,i_count)=0.0_GRID_SR
+          END IF
+          IF(abs(r_iniMom(2,i_count))<GRID_eps) THEN
+            r_iniMom(2,i_count)=0.0_GRID_SR
+          END IF
+
+  
+       END DO node_loop
+       
+       DEALLOCATE( r_coo)
+
+      
+      RETURN
+      END SUBROUTINE slm_analyticsolution
+
+!*****************************************************************
+      SUBROUTINE slm_initwaves(p_ghand)
+
+!---------- local declarations
+
+      IMPLICIT NONE
+
+      TYPE (grid_handle), INTENT(in)                     :: p_ghand
+      INTEGER                                            :: i_count, i_num, i_alct
+      REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_iniVelo, r_iniMom, r_iniHeight
+      REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_coo
+
+!---------- allocate workspace
+
+      i_num= p_ghand%i_nnumber
+
+      ALLOCATE(r_iniHeight(1,i_num),r_iniMom(GRID_dimension,i_num),r_iniVelo(GRID_dimension,i_num), &
+                r_coo(GRID_dimension,i_num), stat= i_alct)
+      IF(i_alct /= 0) THEN
+        CALL grid_error(51)
+      END IF
+
+!---------- get coordinate information
+
+      CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- calculate initial velocity
+      CALL slm_initVelo(r_coo, i_num, r_iniVelo)  
+!---------- calculate initial height
+      CALL slm_initHeight(r_coo, i_num, r_iniHeight)
+
+!---------- loop over the nodes
+
+      node_loop: DO i_count= 1, i_num
+
+!----------- Calculate momentum (hu)  by using h*u
+          
+          r_iniMom(1,i_count)=r_iniVelo(1,i_count)*r_iniHeight(1,i_count)
+          r_iniMom(2,i_count)=r_iniVelo(2,i_count)*r_iniHeight(1,i_count)
+
+          IF(abs(r_iniMom(1,i_count))<GRID_eps) THEN
+            r_iniMom(1,i_count)=0.0_GRID_SR
+          END IF
+          IF(abs(r_iniMom(2,i_count))<GRID_eps) THEN
+            r_iniMom(2,i_count)=0.0_GRID_SR
+          END IF
+
+
+       END DO node_loop
+
+    CALL grid_putinfo(p_ghand, i_arraypoint=(/ GRID_ucomp, GRID_vcomp /), r_nodevalues= r_iniVelo)
+    CALL grid_putinfo(p_ghand, i_arraypoint=(/ GRID_h /), r_nodevalues= r_iniHeight)
+    CALL grid_putinfo(p_ghand, i_arraypoint=(/ GRID_hu, GRID_hv /), r_nodevalues= r_iniMom)
+   
+
+!---------- deallocate workspace
+
+      DEALLOCATE(r_iniHeight,r_iniMom,r_iniVelo, r_coo)
+
+      RETURN
+      END SUBROUTINE slm_initwaves
+      
+!*****************************************************************
+      SUBROUTINE slm_initvelo(r_coord, i_arlen, r_initialV)
+
+!---------- local declarations
+
+      IMPLICIT NONE
+
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+      INTEGER, INTENT(in)                                                   :: i_arlen
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_initialV
+      INTEGER                                                               :: i_count
+      LOGICAL                                                               :: l_isOutside
+
+      node_loop: DO i_count= 1, i_arlen
+      
+      CALL isOutsideCalculationArea(r_coord(:, i_count), l_isOutside)
+     
+        IF(l_isOutside) THEN
+        
+        r_initialV(1,i_count)=0.0_GRID_SR
+        r_initialV(2,i_count)=0.0_GRID_SR
+        
+        ELSE
+      
+        r_initialV(1,i_count)=0.0_GRID_SR
+        r_initialV(2,i_count)=0.0_GRID_SR
+        
+        END IF
+      END DO node_loop
+
+      RETURN
+      END SUBROUTINE slm_initvelo
+!*****************************************************************    
+      SUBROUTINE slm_initHeight(r_coord,i_arlen, r_iniH)
+
+      !---------- local declarations
+
+      IMPLICIT NONE
+
+      REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+      INTEGER, INTENT(in)                                                   :: i_arlen
+      REAL (KIND = GRID_SR), DIMENSION(1,i_arlen), INTENT(out)              :: r_iniH
+      INTEGER                                                               :: i_cnt
+      LOGICAL                                                               :: l_isOutside
+
+       DO i_cnt=1, i_arlen
+       
+       CALL isOutsideCalculationArea(r_coord(:, i_cnt), l_isOutside)
+     
+        IF(l_isOutside) THEN 
+          r_iniH(1,i_cnt)=r_avrgH 
+        ELSE
+       
+          r_iniH(1,i_cnt)= r_avrgH+r_varH/r_radius*sqrt(r_radius*r_radius-(r_coord(1,i_cnt)- r_centerPoint)*(r_coord(1,i_cnt)&
+                 - r_centerPoint)-(r_coord(2,i_cnt)- r_centerPoint)*(r_coord(2,i_cnt)- r_centerPoint))
+
+          IF(abs(r_iniH(1,i_cnt))<GRID_eps) THEN
+            r_iniH(1,i_cnt)=0.0_GRID_SR
+          END IF
+        END IF
+       END DO
+
+
+      END SUBROUTINE slm_initHeight
+      
+      
+!*****************************************************************    
+
+    SUBROUTINE isOutsideCalculationArea(r_coordPoint ,l_isOutside)
+    
+    LOGICAL, INTENT(out)                                                :: l_isOutside
+    REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,1), INTENT(in)      :: r_coordPoint
+    REAL (KIND = GRID_SR)                                               :: r_distToCenterPoint
+    
+    
+    r_distToCenterPoint =sqrt( (r_centerPoint-r_coordPoint(1,1))*(r_centerPoint-r_coordPoint(1,1)) + &
+    (r_centerPoint-r_coordPoint(2,1))*(r_centerPoint-r_coordPoint(2,1)))
+   
+    IF( r_distToCenterPoint >= r_radius) THEN
+       l_isOutside= .true.
+    ELSE
+        l_isOutside= .false.
+    END IF
+     
+    
+    END SUBROUTINE
+
+!*******************************************************************
+      
+     SUBROUTINE add_grid_params()
+
+
+       GRID_h= grid_registerfemvar(1)
+       GRID_hu= grid_registerfemvar(1,i_length=2)
+       GRID_hv= GRID_hu+1
+
+     END SUBROUTINE add_grid_params
+    END MODULE SLM_initial
diff --git a/flash2d/src/options/SLM_initial.UoR.f90 b/flash2d/src/options/SLM_initial.UoR.f90
new file mode 100644
index 0000000..2f1218a
--- /dev/null
+++ b/flash2d/src/options/SLM_initial.UoR.f90
@@ -0,0 +1,436 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_initial
+! FUNCTION:
+!	initialize slotted cylinder for semi-Lagrangian advection
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialvalues
+! FUNCTION:
+!	initialize a grid with values
+! SYNTAX:
+!	CALL slm_initialvalues(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initslot
+! FUNCTION:
+!	initialize a grid with values of slotted cylinder test case
+! SYNTAX:
+!	CALL slm_initslot(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_analyticsolution
+! FUNCTION:
+!	calculates the 'analytic solution' to compare with in diagnostics
+! SYNTAX:
+!	CALL slm_analyticsolution(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initcylndr
+! FUNCTION:
+!	initialize a grid with values of a cylinder test case
+! SYNTAX:
+!	CALL slm_initcylndr(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_centr: coordinates of cyl. centre	REAL
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	in_side
+! FUNCTION:
+!	checks, if a given point (x,y) lies within a given triangle
+! SYNTAX:
+!	logical= in_side(real.arr, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	r_coord: coordinate array		REAL
+!	r_node1: node1 of triangle		REAL
+!	r_node2: node2 of triangle		REAL
+!	r_node3: node3 of triangle		REAL
+! ON OUTPUT:
+!	l_in:    .true. if r_coord \in p_elem	logical
+! CALLS:
+!
+! COMMENTS:
+!	this routine decides whether a point lies in or out of a
+!	triangle. this is done with the following approach:
+!	calculate the area for the given triangle and for the 
+!	three triangles resulting from drawing lines from the given
+!	point to all three triangle nodes.
+!	if the sum of the areas of those three trianlges exceeds
+!	the area of the given trianlge, the the point lies outside
+!	of it.
+!	for calculation of the areas following formula is used:
+!	(Herons formula(?))
+!
+!	A = sqrt(s* (s- a)* (s- b)* (s- c)),
+!
+!	where s= 1/2* (a+ b+ c)
+!	      a, b, c sides.
+!
+!	in order to calculate the sidelengths |x-y|= sqrt(x**2-y**2)
+!	the complex absolute value intrinsic function is used.
+!	hopefully this fuction is faster than using sqrt and
+!	power-of-two instead.
+!
+!	internally double precision is used in this function, because
+!	machine precision is crucial when a coordinate pair appears
+!	near the edge or corner of an element.
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	dc_area
+! FUNCTION:
+!	calculate area of a triangle (in a plain) in double precision
+! SYNTAX:
+!	real= dc_area(real.arr, real.arr, real.arr)
+! ON INPUT:
+!	r_coord1: node1 of triangle			REAL
+!	r_coord2: node2 of triangle			REAL
+!	r_coord3: node3 of triangle			REAL
+! ON OUTPUT:
+!	r_area:   area of triangle			REAL
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_initialvalues, slm_analyticsolution
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	7/97
+!	2. names changed		j. behrens	7/97
+!	3. changed to use GRID_api	j. behrens	11/97
+!	4. changed interfaces		j. behrens	12/97
+!	5. compliant to amatos 1.0	j. behrens	12/2000
+!	6. compliant to amatos 1.2	j. behrens	3/2002
+!	7. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_initial
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC slm_initialvalues, slm_analyticsolution
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_cntr=(/ 0.5, 0.75 /)
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_hcntr=(/ 0.25, 0.5 /)
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_ccntr=(/ 0.5, 0.25 /)
+	  REAL (KIND = GRID_SR)                            :: r_hgt=0.70
+	  REAL (KIND = GRID_SR)                            :: r_hgt2=0.68
+	  REAL (KIND = GRID_SR)                            :: r_srd=0.027
+	  REAL (KIND = GRID_SR)                            :: r_sln=0.22
+	  REAL (KIND = GRID_SR)                            :: r_swd=0.06
+	  REAL (KIND = GRID_SR)                            :: r_onethird=1./3.
+	  REAL (KIND = GRID_SR)                            :: r_twothird=2./3.
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_initialvalues(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  INTEGER                                    :: i_lev= 6
+
+!---------- initialize some constant for the slotted cylinder
+
+	  CALL slm_inituor(p_ghand)
+
+	  RETURN
+	  END SUBROUTINE slm_initialvalues
+!*****************************************************************
+	  SUBROUTINE slm_analyticsolution(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)              :: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  INTEGER, INTENT(in)                         :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(inout)     :: r_array
+	  REAL (KIND = GRID_SR)                                        :: r_fac=.363610260832151995e-4
+	  REAL (KIND = GRID_SR)                                        :: r_rds, r_ras, r_rad, &
+	    r_ads, r_bds, r_cds, r_f1, r_f2, r_xya, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_fc, r_p1, r_p2, &
+	    r_pa, r_pb, r_pc, r_pd, r_tmp, r_centr
+	  INTEGER                                     :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE           :: r_coo
+	  LOGICAL                                     :: l_aux
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  IF(i_arlen /= i_num) THEN
+	    CALL grid_error(52)
+	  END IF
+
+	  ALLOCATE(r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(53)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+
+!---------- compute initial values for a christmas tree
+
+      CALL compute_uor(i_num, r_coo, r_array)
+
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsolution
+
+!*****************************************************************
+	  FUNCTION dc_area(r_coord1, r_coord2, r_coord3) RESULT (r_area)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord1, r_coord2, r_coord3
+	  REAL (KIND = GRID_DR)                            :: r_area
+	  REAL (KIND = GRID_DR)                            :: r_c
+	  REAL (KIND = GRID_DR), DIMENSION(GRID_dimension) :: r_a, r_b
+	  INTEGER                                     :: i_cnt
+
+!---------- calculate vector components
+
+	  dim_loop: DO i_cnt=1, GRID_dimension
+	    r_a(i_cnt)= REAL((r_coord2(i_cnt)- r_coord1(i_cnt)),GRID_DR)
+	    r_b(i_cnt)= REAL((r_coord3(i_cnt)- r_coord1(i_cnt)),GRID_DR)
+	  END DO dim_loop
+
+!---------- calculate components (a,b,c) of cross product vector
+
+	  r_c= (r_a(1)* r_b(2)- r_a(2)* r_b(1))
+
+!---------- calculate area
+
+	  r_area= abs(r_c)* 0.5_GRID_DR
+
+	  RETURN
+	  END FUNCTION dc_area
+
+!*****************************************************************
+	  FUNCTION in_side(r_coord, r_node1, r_node2, r_node3) RESULT (l_in)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_node1, r_node2, r_node3
+	  LOGICAL                                     :: l_in
+	  REAL (KIND = GRID_DR)                            :: r_sum, r_f, r_f1, r_f2, r_f3
+	  REAL (KIND = GRID_DR)                            :: r_eps
+
+!---------- set in_side value to out
+
+ 	  l_in= .FALSE.
+
+!---------- set epsilon (machine precision)
+
+	  r_eps= GRID_eps
+
+!---------- calculate areas (f, f1, f2, f3)
+
+	  r_f = dc_area(r_node1, r_node2, r_node3)
+	  r_f1= dc_area(r_coord, r_node2, r_node3)
+	  r_f2= dc_area(r_coord, r_node1, r_node2)
+	  r_f3= dc_area(r_coord, r_node1, r_node3)
+
+!---------- check if summed area is bigger than triangle area
+
+	  r_sum= r_f1+ r_f2+ r_f3
+	  if((r_sum- r_f) < r_eps) l_in= .TRUE.
+
+	  RETURN
+	  END FUNCTION in_side
+
+!*****************************************************************
+	  SUBROUTINE slm_inituor(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)                     :: p_ghand
+
+	  INTEGER                                            :: i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_coo
+	  INTEGER, DIMENSION(1)                              :: i_valind
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(54)
+	  END IF
+
+!---------- initialize values to zero 
+	  
+	  r_aux= 0._GRID_SR
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- compute values for slotted cylinder
+
+      CALL compute_uor(i_num, r_coo, r_aux(1,:))
+
+!---------- update grid information
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_inituor
+
+!*****************************************************************
+	  SUBROUTINE compute_uor(i_num, r_coo, r_aux)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  INTEGER                                          :: i_num
+	  REAL (KIND = GRID_SR), DIMENSION(:)              :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:)            :: r_coo
+
+	  INTEGER                                          :: i_count, j_count
+	  REAL (KIND = GRID_SR)                            :: r_rds, r_ras, r_rad, &
+	    r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_tmp, &
+	    r_nw, r_sw, r_ne, r_se, r_centr
+	  LOGICAL                                          :: l_aux
+	  REAL (KIND = GRID_SR), &
+	    DIMENSION(GRID_dimension, 3, 40)                :: r_uor
+
+!---------- initialize coordinates of xmas tree triangles
+
+      r_uor(:,:,1) = RESHAPE( (/-0.425, -0.05, -0.375, -0.25, -0.375, -0.05 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,2) = RESHAPE( (/-0.425, -0.05, -0.425, -0.275, -0.375, -0.25 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,3) = RESHAPE( (/-0.435, -0.275, -0.35, -0.35, -0.375, -0.25 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,4) = RESHAPE( (/-0.35, -0.35, -0.325, -0.3, -0.375, -0.25 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,5) = RESHAPE( (/-0.35, -0.35, -0.3, -0.35, -0.325, -0.3 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,6) = RESHAPE( (/-0.3, -0.35, -0.275, -0.25, -0.325, -0.3 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,7) = RESHAPE( (/-0.3, -0.35, -0.225, -0.275, -0.275, -0.25 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,8) = RESHAPE( (/-0.225, -0.275, -0.225, -0.05, -0.275, -0.25 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,9) = RESHAPE( (/-0.275, -0.25, -0.225, -0.05, -0.275, -0.05 /), (/GRID_dimension, 3 /))
+
+      r_uor(:,:,10) = RESHAPE( (/-0.125, -0.125, -0.2, -0.2, -0.1, -0.175 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,11) = RESHAPE( (/-0.1, -0.175, -0.2, -0.2, -0.15, -0.225 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,12) = RESHAPE( (/-0.2, -0.2, -0.2, -0.275, -0.15, -0.225 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,13) = RESHAPE( (/-0.15, -0.225, -0.2, -0.275, -0.15, -0.25 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,14) = RESHAPE( (/-0.15, -0.25, -0.2, -0.275, -0.125, -0.35 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,15) = RESHAPE( (/-0.15, -0.25, -0.125, -0.35, -0.1, -0.3 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,16) = RESHAPE( (/-0.1, -0.3, -0.125, -0.35, -0.05, -0.35 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,17) = RESHAPE( (/-0.1, -0.3, -0.05, -0.35, -0.075, -0.3 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,18) = RESHAPE( (/-0.075, -0.3, -0.05, -0.35, 0.025, -0.275 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,19) = RESHAPE( (/-0.025, -0.25, -0.075, -0.3, 0.025, -0.275 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,20) = RESHAPE( (/0.025, -0.2, -0.025, -0.25, 0.025, -0.275 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,21) = RESHAPE( (/-0.025, -0.225, -0.025, -0.25, 0.025, -0.2 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,22) = RESHAPE( (/-0.05, -0.125, -0.025, -0.225, 0.025, -0.2 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,23) = RESHAPE( (/-0.05, -0.125, -0.075, -0.175, -0.025, -0.225 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,24) = RESHAPE( (/-0.125, -0.125, -0.075, -0.175, -0.05, -0.125 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,25) = RESHAPE( (/-0.125, -0.125, -0.1, -0.175, -0.075, -0.175 /), (/GRID_dimension, 3 /))
+
+      r_uor(:,:,26) = RESHAPE( (/0.05, -0.05, 0.05, -0.1, 0.15, -0.05 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,27) = RESHAPE( (/0.15, -0.05, 0.05, -0.1, 0.125, -0.1 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,28) = RESHAPE( (/0.05, -0.1, 0.05, -0.2, 0.1, -0.1 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,29) = RESHAPE( (/0.1, -0.1, 0.05, -0.2, 0.1, -0.2 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,30) = RESHAPE( (/0.05, -0.2, 0.05, -0.25, 0.15, -0.2 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,31) = RESHAPE( (/0.05, -0.25, 0.15, -0.25, 0.15, -0.2 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,32) = RESHAPE( (/0.05, -0.25, 0.1, -0.35, 0.1, -0.25 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,33) = RESHAPE( (/0.05, -0.25, 0.05, -0.35, 0.1, -0.35 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,34) = RESHAPE( (/0.1, -0.25, 0.2, -0.35, 0.15, -0.25 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,35) = RESHAPE( (/0.15, -0.25, 0.2, -0.35, 0.25, -0.35 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,36) = RESHAPE( (/0.15, -0.2, 0.15, -0.25, 0.225, -0.175 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,37) = RESHAPE( (/0.175, -0.15, 0.15, -0.2, 0.225, -0.175 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,38) = RESHAPE( (/0.225, -0.125, 0.175, -0.15, 0.225, -0.175 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,39) = RESHAPE( (/0.125, -0.1, 0.175, -0.15, 0.225, -0.125 /), (/GRID_dimension, 3 /))
+      r_uor(:,:,40) = RESHAPE( (/0.15, -0.05, 0.125, -0.1, 0.225, -0.125 /), (/GRID_dimension, 3 /))
+      
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_aux(i_count)= 0.0_GRID_SR
+	    DO j_count= 1, 40
+	      inside: IF(in_side(r_coo(:,i_count), r_uor(:,1,j_count), &
+	        r_uor(:,2,j_count), r_uor(:,3,j_count))) THEN
+	        r_aux(i_count)= r_hgt2
+	      END IF inside
+	    END DO
+	  END DO node_loop
+
+	  RETURN
+	  END SUBROUTINE compute_uor
+
+	END MODULE SLM_initial
diff --git a/flash2d/src/options/SLM_initial.advdiff.f90 b/flash2d/src/options/SLM_initial.advdiff.f90
new file mode 100644
index 0000000..49e41fe
--- /dev/null
+++ b/flash2d/src/options/SLM_initial.advdiff.f90
@@ -0,0 +1,350 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_initial
+! FUNCTION:
+!	initialize slotted cylinder for semi-Lagrangian advection
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialvalues
+! FUNCTION:
+!	initialize a grid with values
+! SYNTAX:
+!	CALL slm_initialvalues(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initslot
+! FUNCTION:
+!	initialize a grid with values of slotted cylinder test case
+! SYNTAX:
+!	CALL slm_initslot(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_analyticsolution
+! FUNCTION:
+!	calculates the 'analytic solution' to compare with in diagnostics
+! SYNTAX:
+!	CALL slm_analyticsolution(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initcylndr
+! FUNCTION:
+!	initialize a grid with values of a cylinder test case
+! SYNTAX:
+!	CALL slm_initcylndr(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_centr: coordinates of cyl. centre	REAL
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	in_side
+! FUNCTION:
+!	checks, if a given point (x,y) lies within a given triangle
+! SYNTAX:
+!	logical= in_side(real.arr, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	r_coord: coordinate array		REAL
+!	r_node1: node1 of triangle		REAL
+!	r_node2: node2 of triangle		REAL
+!	r_node3: node3 of triangle		REAL
+! ON OUTPUT:
+!	l_in:    .true. if r_coord \in p_elem	logical
+! CALLS:
+!
+! COMMENTS:
+!	this routine decides whether a point lies in or out of a
+!	triangle. this is done with the following approach:
+!	calculate the area for the given triangle and for the 
+!	three triangles resulting from drawing lines from the given
+!	point to all three triangle nodes.
+!	if the sum of the areas of those three trianlges exceeds
+!	the area of the given trianlge, the the point lies outside
+!	of it.
+!	for calculation of the areas following formula is used:
+!	(Herons formula(?))
+!
+!	A = sqrt(s* (s- a)* (s- b)* (s- c)),
+!
+!	where s= 1/2* (a+ b+ c)
+!	      a, b, c sides.
+!
+!	in order to calculate the sidelengths |x-y|= sqrt(x**2-y**2)
+!	the complex absolute value intrinsic function is used.
+!	hopefully this fuction is faster than using sqrt and
+!	power-of-two instead.
+!
+!	internally double precision is used in this function, because
+!	machine precision is crucial when a coordinate pair appears
+!	near the edge or corner of an element.
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	dc_area
+! FUNCTION:
+!	calculate area of a triangle (in a plain) in double precision
+! SYNTAX:
+!	real= dc_area(real.arr, real.arr, real.arr)
+! ON INPUT:
+!	r_coord1: node1 of triangle			REAL
+!	r_coord2: node2 of triangle			REAL
+!	r_coord3: node3 of triangle			REAL
+! ON OUTPUT:
+!	r_area:   area of triangle			REAL
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_initialvalues, slm_analyticsolution
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	7/97
+!	2. names changed		j. behrens	7/97
+!	3. changed to use GRID_api	j. behrens	11/97
+!	4. changed interfaces		j. behrens	12/97
+!	5. compliant to amatos 1.0	j. behrens	12/2000
+!	6. compliant to amatos 1.2	j. behrens	3/2002
+!	7. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_initial
+	  USE FLASH_parameters
+	  USE GRID_api
+!	  USE mkl_vml
+      include "mkl_vml.f90"
+
+!#ifdef USE_MKL
+!      INTERFACE erf ! define universal interface for error function
+!        MODULE PROCEDURE vserf, vderf
+!      END INTERFACE
+!#endif
+	  PRIVATE
+	  PUBLIC slm_initialvalues, slm_analyticsolution
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_cntr=(/ 4., 1. /)
+	  REAL (KIND = GRID_SR)                            :: r_onethird=1./3.
+	  REAL (KIND = GRID_SR)                            :: r_twothird=2./3.
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_initialvalues(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  INTEGER                                    :: i_lev= 6
+
+!---------- initialize diffusion coefficient
+
+      p_contr%tst%tst_real(1,1)= 0.01_GRID_SR
+
+      CALL initerf(p_ghand)
+
+	  RETURN
+	  END SUBROUTINE slm_initialvalues
+!*****************************************************************
+	  SUBROUTINE slm_analyticsolution(p_ghand, r_time, i_arlen, r_array, l_advective)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)              :: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  INTEGER, INTENT(in)                         :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(inout)     :: r_array
+	  LOGICAL, OPTIONAL                                            :: l_advective
+	  REAL (KIND = GRID_SR)                                        :: r_fac=.363610260832151995e-4
+	  REAL (KIND = GRID_SR)                                        :: r_rds, r_ras, r_rad, &
+	    r_ads, r_bds, r_cds, r_f1, r_f2, r_xya, r_dpt, r_diffuse
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_fc, r_p1, r_p2, &
+	    r_pa, r_pb, r_pc, r_pd, r_tmp, r_centr
+	  INTEGER                                     :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE           :: r_coo
+	  LOGICAL                                     :: l_aux
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  IF(i_arlen /= i_num) THEN
+	    CALL grid_error(52)
+	  END IF
+
+	  ALLOCATE(r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(53)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- if advective part is included then we need to correct the position
+
+      advect_true: IF(present(l_advective)) THEN
+        l_aux= l_advective
+      ELSE advect_true
+        l_aux= .TRUE.
+      END IF advect_true
+      IF (l_aux) &
+        r_coo(1,:)= r_coo(1,:)-p_contr%tst%tst_real(1,2)*(r_time) !-3._GRID_SR)
+
+!---------- compute values for for error function
+
+      r_diffuse= p_contr%tst%tst_real(1,1)
+      CALL compute_erf(i_num, r_time, r_diffuse, r_coo, r_array)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsolution
+
+!*****************************************************************
+	  SUBROUTINE initerf(p_ghand, l_initialize)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)                     :: p_ghand
+	  LOGICAL, OPTIONAL                                  :: l_initialize
+
+	  INTEGER                                            :: i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_coo
+	  REAL (KIND = GRID_SR)                              :: r_time, r_diffuse
+	  INTEGER, DIMENSION(1)                              :: i_valind
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(54)
+	  END IF
+
+!---------- initialize values to zero if requested
+	  
+	  IF(present(l_initialize) .AND. l_initialize) r_aux= 0._GRID_SR
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- compute values for slotted cylinder
+
+      r_time    = 0._GRID_SR
+      r_diffuse = p_contr%tst%tst_real(1,1)
+      CALL compute_erf(i_num, r_time, r_diffuse, r_coo, r_aux(1,:))
+
+!---------- update grid information
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE initerf
+
+!*****************************************************************
+      SUBROUTINE compute_erf(i_num, r_time, r_diff, r_coo, r_aux)
+
+!---------- local declarations
+
+      IMPLICIT NONE
+
+      INTEGER                                          :: i_num
+      REAL (KIND = GRID_SR)                            :: r_time
+      REAL (KIND = GRID_SR)                            :: r_diff
+      REAL (KIND = GRID_SR), DIMENSION(:)              :: r_aux
+      REAL (KIND = GRID_SR), DIMENSION(:,:)            :: r_coo
+
+      DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE      :: r_aux1, r_aux2
+	  INTEGER                                          :: i_alct
+	  REAL (KIND = GRID_SR)                            :: r_denom
+
+!---------- allocate additional memory
+
+      ALLOCATE(r_aux1(i_num), r_aux2(i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(c_error='[compute_erf] could not allocate aux mem.')
+	  END IF
+
+!---------- compute auxiliary values...
+
+      r_denom= 1._GRID_SR/SQRT(4._GRID_SR*r_diff* (1._GRID_SR+ r_time))
+
+!---------- compute a hump from error function
+
+      r_aux1(1:i_num)= DBLE((.75_GRID_SR- ABS(r_cntr(1)-r_coo(1,1:i_num)))* r_denom)
+      CALL vderf(i_num, r_aux1, r_aux2)
+      r_aux= REAL(r_aux2,GRID_SR)
+      r_aux1(1:i_num)= DBLE((.75_GRID_SR+ ABS(r_cntr(1)-r_coo(1,1:i_num)))* r_denom)
+      CALL vderf(i_num, r_aux1, r_aux2)
+      r_aux= (r_aux+ REAL(r_aux2,GRID_SR))* 0.5_GRID_SR
+	
+!---------- deallocate auxiliary arrays
+
+      DEALLOCATE(r_aux1, r_aux2)
+
+	  RETURN
+	  END SUBROUTINE compute_erf
+
+	END MODULE SLM_initial
diff --git a/flash2d/src/options/SLM_initial.algae.f90 b/flash2d/src/options/SLM_initial.algae.f90
new file mode 100644
index 0000000..3108355
--- /dev/null
+++ b/flash2d/src/options/SLM_initial.algae.f90
@@ -0,0 +1,355 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_initial
+! FUNCTION:
+!	initialize algae test case for semi-Lagrangian advection
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialvalues
+! FUNCTION:
+!	initialize a grid with values
+! SYNTAX:
+!	CALL slm_initialvalues(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initalgae
+! FUNCTION:
+!	initialize a grid with values of a algae concentration
+! SYNTAX:
+!	CALL slm_initalgae(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initaltemp
+! FUNCTION:
+!	initialize a grid with values of a temperature distribution
+! SYNTAX:
+!	CALL slm_initaltemp(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_analyticsolution
+! FUNCTION:
+!	calculates the 'analytic solution' to compare with in diagnostics
+! SYNTAX:
+!	CALL slm_analyticsolution(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_initialvalues, slm_analyticsolution
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	7/97
+!	2. names changed		j. behrens	7/97
+!	3. changed to use GRID_api	j. behrens	11/97
+!	4. changed interfaces		j. behrens	12/97
+!	5. compliant to amatos 1.0	j. behrens	12/2000
+!	6. compliant to amatos 1.2	j. behrens	3/2002
+!	7. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_initial
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC slm_initialvalues, slm_analyticsolution
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_cntr=(/ -0.25, 0.0 /)
+	  REAL (KIND = GRID_SR)                            :: r_hgt=0.1
+	  REAL (KIND = GRID_SR)                            :: r_srd=0.15
+	  REAL (KIND = GRID_SR)                            :: r_sln=0.22
+	  REAL (KIND = GRID_SR)                            :: r_swd=0.06
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_initialvalues(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+
+!---------- initialize some constant for the slotted cylinder
+
+	  CALL slm_initalgae(p_ghand)
+	  CALL slm_inittemp(p_ghand)
+
+	  RETURN
+	  END SUBROUTINE slm_initialvalues
+!*****************************************************************
+	  SUBROUTINE slm_analyticsolution(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)                         :: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)                      :: r_time
+	  INTEGER, INTENT(in)                                    :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out) :: r_array
+
+!---------- dummy routine
+
+	  r_array= 0.0_GRID_SR
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsolution
+
+!*****************************************************************
+	  SUBROUTINE slm_initalgae(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)                     :: p_ghand
+	  INTEGER                                            :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_coo
+	  INTEGER, DIMENSION(1)                              :: i_valind
+
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(51)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- initial values
+
+!	  CALL compute_hump(i_num, r_coo, r_aux(1,:))
+	  CALL compute_cylndr(i_num, r_coo, r_aux(1,:))
+
+!---------- update grid information
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_initalgae
+
+!*****************************************************************
+    SUBROUTINE compute_hump(i_num, r_coo, r_aux)
+
+!---------- local declarations
+
+    IMPLICIT NONE
+
+    INTEGER                                          :: i_num
+    REAL (KIND = GRID_SR), DIMENSION(:)              :: r_aux
+    REAL (KIND = GRID_SR), DIMENSION(:,:)            :: r_coo
+
+    INTEGER                                          :: i_count
+    REAL (KIND = GRID_SR)                            :: r_rds, r_dpt, r_rad, r_pr
+    REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_centr, r_tmp
+
+!---------- initialize some constant for the slotted cylinder
+
+    r_srd= 0.25_GRID_SR
+    r_rds= r_srd*r_srd
+    r_centr= (/ 0.0_GRID_SR, 0.0_GRID_SR /)
+        
+!---------- loop over the nodes
+
+    node_loop: DO i_count= 1, i_num
+        r_tmp(:)      = r_coo(:,i_count)- r_centr(:)
+        r_dpt= dot_product(r_tmp, r_tmp)
+        r_aux(i_count)= 0.0_GRID_SR
+        inside: IF(r_dpt < r_rds) THEN
+            r_rad= min(sqrt(r_dpt),r_srd)/r_srd
+            r_pr= GRID_PI* r_rad
+            r_aux(i_count)= 0.25_GRID_SR* (1+ cos(r_pr))
+        END IF inside
+    END DO node_loop
+
+    RETURN
+    END SUBROUTINE compute_hump
+
+!*****************************************************************
+	  SUBROUTINE compute_cylndr(i_num, r_coo, r_aux)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  INTEGER                                          :: i_num
+	  REAL (KIND = GRID_SR), DIMENSION(:)              :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:)            :: r_coo
+
+	  INTEGER                                          :: i_count
+	  REAL (KIND = GRID_SR)                            :: r_rds, r_ras, r_rad, &
+	    r_dpt, r_a, r_fac
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_tmp, &
+	    r_nw, r_sw, r_ne, r_se, r_centr
+	  LOGICAL                                          :: l_aux
+
+!---------- initialize some constants for the slotted cylinder
+
+    r_srd= 0.25_GRID_SR
+    r_rds= r_srd*r_srd
+    r_centr= (/ 0.0_GRID_SR, 0.0_GRID_SR /)
+    r_a= r_srd
+    r_fac= 2._GRID_SR
+	  
+	
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_aux(i_count)= 0.0_GRID_SR
+	    r_tmp(:)      = r_coo(:,i_count)- r_centr(:)
+	    r_dpt= dot_product(r_tmp, r_tmp)
+	    inside: IF(r_dpt < r_rds) THEN
+	      r_aux(i_count)= (r_hgt-0.025_GRID_SR) + ((r_coo(1,i_count)- r_a)*r_fac)* (0.05_GRID_SR)
+!	      r_aux(i_count)= r_hgt
+	    END IF inside
+	  END DO node_loop
+
+	  RETURN
+	  END SUBROUTINE compute_cylndr
+
+
+!*****************************************************************
+	  SUBROUTINE slm_inittemp(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)                     :: p_ghand
+	  REAL (KIND = GRID_SR)                              :: r_meantemp, r_deltatemp, r_maxtemp, r_mintemp
+	  INTEGER                                            :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_coo
+	  INTEGER, DIMENSION(1)                              :: i_valind
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_diff, r_centr
+
+    REAL (KIND = GRID_SR) :: r_mumax, r_Topt, r_Tslope, r_Cmort, r_mu, r_tmp, r_T2, r_a, r_b, r_fac, r_dpt
+
+!---------- set constants CAUTION: Make sure that these are consistent with ADV_rhs!
+
+ !   r_mumax  = 0.5_GRID_SR  ! [per day]
+    r_mumax  = 0.5_GRID_SR/86400._GRID_SR  ! [per s]
+    r_Topt   = 22.0_GRID_SR ! [°C]
+    r_Tslope = 5.0_GRID_SR  ! [°C]
+!    r_Cmort  = 0.05_GRID_SR ! [per day]
+    r_Cmort  = 0.05_GRID_SR/86400._GRID_SR ! [per s]
+
+!---------- initialize some constants for the circular algae distribution
+
+    r_T2       = r_Tslope*r_Tslope
+    r_meantemp = r_Topt - sqrt((r_T2* (log(r_mumax)-log(r_Cmort))))
+    r_deltatemp= 0.002_GRID_SR
+    r_maxtemp  = r_meantemp+ r_deltatemp
+    r_mintemp  = r_meantemp- r_deltatemp
+
+    r_a= 0.5_GRID_SR*0.5_GRID_SR
+    r_centr= (/ 0.0_GRID_SR, 0.0_GRID_SR /)
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(51)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- determine min/max x-coordinates
+
+!    r_a= minval(r_coo(1,:))
+!    r_b= maxval(r_coo(1,:))
+!    r_fac= 1._GRID_SR/(r_b-r_a)
+
+!---------- initial values
+
+	  node_loop: DO i_count= 1, i_num
+	    r_aux(1,i_count)= 0.0_GRID_SR
+	    r_diff(:)      = r_coo(:,i_count)- r_centr(:)
+	    r_dpt= dot_product(r_diff, r_diff)
+	    inside: IF(r_dpt < r_a) THEN
+!	      r_aux(1,i_count)= (r_hgt-0.025_GRID_SR) + ((r_coo(1,i_count)- r_a)*r_fac)* (0.05_GRID_SR)
+	      r_aux(1,i_count)= r_meantemp
+	    END IF inside
+	  END DO node_loop
+
+!    node_loop: DO i_count= 1, i_num
+!        r_aux(1,i_count)= r_mintemp + ((r_coo(1,i_count)- r_a)*r_fac)* (r_maxtemp-r_mintemp)
+!    END DO node_loop
+!    r_aux= r_meantemp
+
+!---------- update grid information
+
+	  i_valind= (/ GRID_phi /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_inittemp
+
+	END MODULE SLM_initial
diff --git a/flash2d/src/options/SLM_initial.algaeBaltic.f90 b/flash2d/src/options/SLM_initial.algaeBaltic.f90
new file mode 100644
index 0000000..f268923
--- /dev/null
+++ b/flash2d/src/options/SLM_initial.algaeBaltic.f90
@@ -0,0 +1,344 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_initial
+! FUNCTION:
+!	initialize algae test case for semi-Lagrangian advection
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialvalues
+! FUNCTION:
+!	initialize a grid with values
+! SYNTAX:
+!	CALL slm_initialvalues(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initalgae
+! FUNCTION:
+!	initialize a grid with values of a algae concentration
+! SYNTAX:
+!	CALL slm_initalgae(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initaltemp
+! FUNCTION:
+!	initialize a grid with values of a temperature distribution
+! SYNTAX:
+!	CALL slm_initaltemp(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_analyticsolution
+! FUNCTION:
+!	calculates the 'analytic solution' to compare with in diagnostics
+! SYNTAX:
+!	CALL slm_analyticsolution(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_initialvalues, slm_analyticsolution
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	7/97
+!	2. names changed		j. behrens	7/97
+!	3. changed to use GRID_api	j. behrens	11/97
+!	4. changed interfaces		j. behrens	12/97
+!	5. compliant to amatos 1.0	j. behrens	12/2000
+!	6. compliant to amatos 1.2	j. behrens	3/2002
+!	7. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_initial
+	  USE FLASH_parameters
+	  USE GRID_api
+	  USE ADV_wind
+	  PRIVATE
+	  PUBLIC slm_initialvalues, slm_analyticsolution
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_cntr=(/ -0.25, 0.0 /)
+	  REAL (KIND = GRID_SR)                            :: r_hgt=0.1
+	  REAL (KIND = GRID_SR)                            :: r_srd=0.15
+	  REAL (KIND = GRID_SR)                            :: r_sln=0.22
+	  REAL (KIND = GRID_SR)                            :: r_swd=0.06
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_initialvalues(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+
+!---------- initialize some constant for the slotted cylinder
+
+	  CALL slm_initalgae(p_ghand)
+	  CALL slm_inittemp(p_ghand)
+
+	  RETURN
+	  END SUBROUTINE slm_initialvalues
+!*****************************************************************
+	  SUBROUTINE slm_analyticsolution(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)                         :: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)                      :: r_time
+	  INTEGER, INTENT(in)                                    :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out) :: r_array
+
+!---------- dummy routine
+
+	  r_array= 0.0_GRID_SR
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsolution
+
+!*****************************************************************
+	  SUBROUTINE slm_initalgae(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)                     :: p_ghand
+	  INTEGER                                            :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_coo
+	  INTEGER, DIMENSION(1)                              :: i_valind
+
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(51)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- initial values
+
+!	  CALL compute_hump(i_num, r_coo, r_aux(1,:))
+	  CALL compute_cylndr(i_num, r_coo, r_aux(1,:))
+
+!---------- update grid information
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_initalgae
+
+!*****************************************************************
+    SUBROUTINE compute_hump(i_num, r_coo, r_aux)
+
+!---------- local declarations
+
+    IMPLICIT NONE
+
+    INTEGER                                          :: i_num
+    REAL (KIND = GRID_SR), DIMENSION(:)              :: r_aux
+    REAL (KIND = GRID_SR), DIMENSION(:,:)            :: r_coo
+
+    INTEGER                                          :: i_count
+    REAL (KIND = GRID_SR)                            :: r_rds, r_dpt, r_rad, r_pr
+    REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_centr, r_tmp
+
+!---------- initialize some constant for the slotted cylinder
+
+    r_srd= 0.25_GRID_SR
+    r_rds= r_srd*r_srd
+    r_centr= (/ 0.0_GRID_SR, 0.0_GRID_SR /)
+        
+!---------- loop over the nodes
+
+    node_loop: DO i_count= 1, i_num
+        r_tmp(:)      = r_coo(:,i_count)- r_centr(:)
+        r_dpt= dot_product(r_tmp, r_tmp)
+        r_aux(i_count)= 0.0_GRID_SR
+        inside: IF(r_dpt < r_rds) THEN
+            r_rad= min(sqrt(r_dpt),r_srd)/r_srd
+            r_pr= GRID_PI* r_rad
+            r_aux(i_count)= 0.25_GRID_SR* (1+ cos(r_pr))
+        END IF inside
+    END DO node_loop
+
+    RETURN
+    END SUBROUTINE compute_hump
+
+!*****************************************************************
+	  SUBROUTINE compute_cylndr(i_num, r_coo, r_aux)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  INTEGER                                          :: i_num
+	  REAL (KIND = GRID_SR), DIMENSION(:)              :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:)            :: r_coo
+
+	  INTEGER                                          :: i_count
+	  REAL (KIND = GRID_SR)                            :: r_rds, r_ras, r_rad, &
+	    r_dpt, r_a, r_fac
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_tmp, &
+	    r_nw, r_sw, r_ne, r_se, r_centr
+	  LOGICAL                                          :: l_aux
+
+!---------- initialize some constants for the slotted cylinder
+
+    r_srd= 0.5_GRID_SR
+    r_rds= r_srd*r_srd
+    r_centr= (/ 20.3_GRID_SR, 58.8_GRID_SR /)
+    r_a= r_srd
+    r_fac= 2._GRID_SR
+	  
+	
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_aux(i_count)= 0.0_GRID_SR
+	    r_tmp(:)      = r_coo(:,i_count)- r_centr(:)
+	    r_dpt= dot_product(r_tmp, r_tmp)
+	    inside1: IF(r_dpt < r_rds) THEN
+!	      r_aux(i_count)= (r_hgt-0.025_GRID_SR) + ((r_coo(1,i_count)- r_a)*r_fac)* (0.05_GRID_SR)
+	      r_aux(i_count)= r_hgt
+	    END IF inside1
+	    r_tmp(:)      = r_coo(:,i_count)- (/ 7.5_GRID_SR, 57.3_GRID_SR /)
+	    r_dpt= dot_product(r_tmp, r_tmp)
+	    inside2: IF(r_dpt < r_rds) THEN
+	      r_aux(i_count)= r_hgt
+	    END IF inside2
+	  END DO node_loop
+
+	  RETURN
+	  END SUBROUTINE compute_cylndr
+
+
+!*****************************************************************
+	  SUBROUTINE slm_inittemp(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)                     :: p_ghand
+	  REAL (KIND = GRID_SR)                              :: r_meantemp, r_deltatemp, r_maxtemp, r_mintemp
+	  INTEGER                                            :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_coo
+	  INTEGER, DIMENSION(1)                              :: i_valind
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_diff, r_centr
+
+    REAL (KIND = GRID_SR) :: r_mumax, r_Topt, r_Tslope, r_Cmort, r_mu, r_tmp, r_T2, r_a, r_b, r_fac, r_dpt
+
+!---------- set constants CAUTION: Make sure that these are consistent with ADV_rhs!
+
+ !   r_mumax  = 0.5_GRID_SR  ! [per day]
+    r_mumax  = 0.5_GRID_SR/86400._GRID_SR  ! [per s]
+    r_Topt   = 22.0_GRID_SR ! [°C]
+    r_Tslope = 5.0_GRID_SR  ! [°C]
+!    r_Cmort  = 0.05_GRID_SR ! [per day]
+    r_Cmort  = 0.05_GRID_SR/86400._GRID_SR ! [per s]
+
+!---------- initialize some constants for the circular algae distribution
+
+    r_T2       = r_Tslope*r_Tslope
+    r_meantemp = r_Topt - sqrt((r_T2* (log(r_mumax)-log(r_Cmort))))
+    r_deltatemp= 0.002_GRID_SR
+    r_maxtemp  = r_meantemp+ r_deltatemp
+    r_mintemp  = r_meantemp- r_deltatemp
+
+    r_a= 0.5_GRID_SR*0.5_GRID_SR
+    r_centr= (/ 0.0_GRID_SR, 0.0_GRID_SR /)
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(51)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- initial values
+
+	  node_loop: DO i_count= 1, i_num
+	    r_aux(1,i_count)= slm_tempfield(r_coo(:,i_count))
+	  END DO node_loop
+
+!---------- update grid information
+
+	  i_valind= (/ GRID_phi /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_inittemp
+
+	END MODULE SLM_initial
diff --git a/flash2d/src/options/SLM_initial.aviso.f90 b/flash2d/src/options/SLM_initial.aviso.f90
new file mode 100644
index 0000000..941521f
--- /dev/null
+++ b/flash2d/src/options/SLM_initial.aviso.f90
@@ -0,0 +1,551 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_initial
+! FUNCTION:
+!	initialize values for semi-Lagrangian advection
+!	provides slm_analyticsolution to evaluate error and mass 
+!	conservation
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialvalues
+! FUNCTION:
+!	initialize a grid with values
+! SYNTAX:
+!	CALL slm_initialvalues(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initslottedcylinder
+! FUNCTION:
+!	initialize a grid with values of sliced sphere test case
+! SYNTAX:
+!	CALL slm_initslottedcylinder(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initcosinebell
+! FUNCTION:
+!	initialize a grid with values of a cosine bell 
+!	(convergence test case)
+! SYNTAX:
+!	CALL slm_initcosinebell(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+! NAME:
+!	slm_analyticsolution
+! FUNCTION:
+!	calculates the 'analytic solution' to compare with in diagnostics
+! SYNTAX:
+!	CALL slm_analyticsolution(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for three dimensions only
+!
+!-----------------------------------------------------------------
+! NAME:
+!	slm_analyticsol_slottedcylinder
+! FUNCTION:
+!	calculates the 'analytic solution' for the slotted cylinder with
+!	a circular windfield 1 revolution/day
+! SYNTAX:
+!	CALL slm_analyticsol_slottedcylinder(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+! NAME:
+!	slm_analyticsol_cosinebell
+! FUNCTION:
+!	calculates the 'analytic solution' for a cosine bell with
+!	circular windfield 1 revolution/day
+! SYNTAX:
+!	CALL slm_analyticsol_cosinebell(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+! PUBLIC:
+!	slm_initialvalues, slm_analyticsolution
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	7/97
+!	2. names changed		j. behrens	7/97
+!	3. changed to use GRID_api	j. behrens	11/97
+!	4. changed interfaces		j. behrens	12/97
+!	5. compliant to amatos 1.0	j. behrens	12/2000
+!	6. slotted cylinder test case	l. mentrup	12/2003 
+!
+!*****************************************************************
+	MODULE SLM_initial
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC slm_initialvalues, slm_analyticsolution
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_cntr=&
+	  				(/ 142.0_GRID_SR, 38.0_GRID_SR /)
+	  REAL (KIND = GRID_SR)                            :: r_hgt=1.0_GRID_SR
+	  REAL (KIND = GRID_SR)                            :: r_srd=1.5_GRID_SR
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_initialvalues(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  INTEGER                                    :: i_lev= 6
+
+!---------- initialize some constant for the slotted cylinder
+
+!	  CALL slm_initslottedcylinder(p_ghand)
+	  
+!---------- initialize some constant for the cosine bell test case
+
+	  CALL slm_initcosinebell(p_ghand)
+
+!---------- initialize concentration one everywhere
+
+!	  CALL slm_initoneforall(p_ghand)
+
+	  RETURN
+	  END SUBROUTINE slm_initialvalues
+!*****************************************************************
+	  SUBROUTINE slm_analyticsolution(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)              :: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  INTEGER, INTENT(in)                         :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)       :: r_array
+
+!---------- this is a dummy
+	  r_array= 0.0_GRID_SR
+	  
+!---------- analyticsolution: cosinebell
+!	  CALL slm_analyticsol_cosinebell(p_ghand, r_time, i_arlen, r_array)
+
+!---------- analyticsolution: ball
+!	  CALL slm_analyticsol_slottedcylinder(p_ghand, r_time, i_arlen, r_array)
+
+!---------- analyticsolution: concentration one everywhere
+!	  CALL slm_analyticsol_oneforall(p_ghand, r_time, i_arlen, r_array)
+	  
+	  
+	  RETURN
+	  END SUBROUTINE slm_analyticsolution
+	  
+!*****************************************************************
+	  SUBROUTINE slm_analyticsol_slottedcylinder(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)              :: p_ghand
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_centr
+	  REAL (KIND = GRID_SR)                                        :: r_rds, r_dpt
+	  REAL (KIND = GRID_SR)					      :: r_rds_kreisbahn
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_tmp
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  REAL (KIND = GRID_SR)					      :: r_tim, r_time_one_turn
+	  REAL (KIND = GRID_SR)					      :: r_PI, r_phi	
+	  INTEGER, INTENT(in)                         :: i_arlen
+	  INTEGER                                     :: i_count, i_num, i_alct, i_step
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)       :: r_array
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE           :: r_coo
+	  
+
+
+!---------- initialize some constant for the tracer ball
+
+	  r_rds = 0.15_GRID_SR
+
+!---------- here is the crux: where is the center of the ball at time r_time
+
+	  
+	  r_tim 		= r_time
+	  r_time_one_turn 	= 1800._GRID_SR * 96_GRID_SR		! Time which the ball needs for one turn around the center
+	  r_PI 			= GRID_PI
+	  r_phi			= r_PI			! Phasenwinkel um die Anfangskonstellation zu beruecksichtigen
+	  r_centr		= r_cntr
+	  r_rds_kreisbahn	= 0.25_GRID_SR
+
+	  r_centr(1) 		= r_rds_kreisbahn * COS(2_GRID_SR*r_PI * r_tim/r_time_one_turn + r_phi)	!Beschreibung der Kreisbahn um den Ursprung
+	  r_centr(2) 		= r_rds_kreisbahn * SIN(2_GRID_SR*r_PI * r_tim/r_time_one_turn + r_phi) !Beschreibung der Kreisbahn um den Ursprung
+ 
+!	  r_centr(1)		= r_centr(1) + 0.5_GRID_SR	! Ins richtige Koordinatensystem
+!	  r_centr(2)		= r_centr(2) + 0.5_GRID_SR	! Ins richtige Koordsys verschieben
+
+	  IF (r_tim == 0.0_GRID_SR) THEN
+	    r_centr= r_cntr
+	  ENDIF
+
+
+!---------- allocate workspace
+	  
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_coo(GRID_dimension,i_num), stat=i_alct)
+          IF(i_alct /= 0) THEN
+		CALL grid_error(55)
+	  END IF	
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+	
+
+!---------- for every quarter revolt: test if is node in or out of the sliced sphere and set r_array	  		
+	  r_array = 0.0
+	  node_loop: DO i_count= 1, i_num
+	    r_tmp(:) = r_coo(:,i_count) - r_centr(:)
+	    r_dpt    = dot_product(r_tmp, r_tmp)**0.5_GRID_SR
+	    r_array(i_count) = 0.
+	    i_step=INT(r_tim) / 1800 
+	    i_step=MODULO(i_step,96)
+	    SELECT CASE (i_step)
+	      CASE(0) 
+	      	start_pos:IF(r_dpt <= r_rds .AND. &
+				.NOT.(r_tmp(2) <= 0.07_GRID_SR .AND. (r_tmp(1)<=0.03_GRID_SR .AND. r_tmp(1)>=-0.03_GRID_SR))) THEN
+	          r_array(i_count)= r_hgt
+	      	END IF start_pos
+	      CASE(24)
+	      	quarter_pos:IF(r_dpt <= r_rds .AND. &
+				.NOT.(r_tmp(1) >= -0.07_GRID_SR .AND. (r_tmp(2)<=0.03_GRID_SR .AND. r_tmp(2)>=-0.03_GRID_SR))) THEN
+	          r_array(i_count)= r_hgt
+	      	END IF quarter_pos
+	      CASE(48)
+	      	half_pos:IF(r_dpt <= r_rds .AND. &
+				.NOT.(r_tmp(2) >= -0.07_GRID_SR .AND. (r_tmp(1)<=0.03_GRID_SR .AND. r_tmp(1)>=-0.03_GRID_SR))) THEN
+	          r_array(i_count)= r_hgt
+	      	END IF half_pos
+	      CASE(72)
+	      	third_quarter_pos:IF(r_dpt <= r_rds .AND. &
+				.NOT.(r_tmp(1) <= 0.07_GRID_SR .AND. (r_tmp(2)<=0.03_GRID_SR .AND. r_tmp(2)>=-0.03_GRID_SR))) THEN
+	          r_array(i_count)= r_hgt
+	      	END IF third_quarter_pos
+	     END SELECT
+	  END DO node_loop
+
+	
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_coo)
+
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsol_slottedcylinder
+
+!*****************************************************************
+	  SUBROUTINE slm_initslottedcylinder(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_centr
+	  REAL (KIND = GRID_SR)                                       :: r_rds, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_tmp
+	  INTEGER                                    :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE            :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_coo
+	  INTEGER, DIMENSION(1)                      :: i_valind
+
+!---------- initialize some constant for the sliced sphere
+
+	  r_rds= 0.15_GRID_SR
+	  r_centr= r_cntr
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(55)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_aux(1,i_count)= 0.0_GRID_SR
+	    r_tmp(:)      = r_coo(:,i_count)- r_centr(:)
+	    r_dpt= dot_product(r_tmp, r_tmp)**0.5
+	    inside: IF(r_dpt <= r_rds .AND. &
+	    		.NOT.(r_tmp(2) <= 0.07_GRID_SR .AND. (r_tmp(1)>=-0.03_GRID_SR .AND. r_tmp(1)<=0.03_GRID_SR))) THEN
+	      r_aux(1,i_count)= r_hgt
+	    END IF inside
+	  END DO node_loop
+
+!---------- update grid information
+	  
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_initslottedcylinder
+!*****************************************************************
+	  SUBROUTINE slm_analyticsol_cosinebell(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)              :: p_ghand
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_centr
+	  REAL (KIND = GRID_SR)                                        :: r_rds, r_dpt
+	  REAL (KIND = GRID_SR)					      :: r_rds_kreisbahn
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_tmp
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  REAL (KIND = GRID_SR)					      :: r_tim, r_time_one_turn
+	  REAL (KIND = GRID_SR)					      :: r_PI, r_phi	
+	  INTEGER, INTENT(in)                         :: i_arlen
+	  INTEGER                                     :: i_count, i_num, i_alct, i_step
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)       :: r_array
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE           :: r_coo
+	  
+
+
+!---------- initialize some constant for the tracer ball
+
+	  r_rds = 0.15_GRID_SR
+
+!---------- here is the crux: where is the center of the ball at time r_time
+
+	  
+	  r_tim 		= r_time
+	  r_time_one_turn 	= 1800._GRID_SR * 96_GRID_SR		! Time which the ball needs for one turn around the center
+	  r_PI 			= GRID_PI
+	  r_phi			= r_PI			! Phasenwinkel um die Anfangskonstellation zu beruecksichtigen
+	  r_centr		= r_cntr
+	  r_rds_kreisbahn	= 0.25_GRID_SR
+
+	  r_centr(1) 		= r_rds_kreisbahn * COS(2_GRID_SR*r_PI * r_tim/r_time_one_turn + r_phi)	!Beschreibung der Kreisbahn um den Ursprung
+	  r_centr(2) 		= r_rds_kreisbahn * SIN(2_GRID_SR*r_PI * r_tim/r_time_one_turn + r_phi) !Beschreibung der Kreisbahn um den Ursprung
+ 
+!	  r_centr(1)		= r_centr(1) + 0.5_GRID_SR	! Ins richtige Koordinatensystem
+!	  r_centr(2)		= r_centr(2) + 0.5_GRID_SR	! Ins richtige Koordsys verschieben
+
+	  IF (r_tim == 0.0_GRID_SR) THEN
+	    r_centr= r_cntr
+	  ENDIF
+
+
+!---------- allocate workspace
+	  
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_coo(GRID_dimension,i_num), stat=i_alct)
+          IF(i_alct /= 0) THEN
+		CALL grid_error(55)
+	  END IF	
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+	
+
+!---------- for every quarter revolt: test if is node in or out of the sliced sphere and set r_array	  		
+	  r_array = 0.0
+	  node_loop: DO i_count= 1, i_num
+	    r_tmp(:) = r_coo(:,i_count) - r_centr(:)
+	    r_dpt    = dot_product(r_tmp, r_tmp)**0.5_GRID_SR
+	    r_array(i_count) = 0.
+	    IF (r_dpt <= r_srd) THEN
+	      r_array(i_count) = r_hgt* cos(r_dpt*(r_PI/(2*r_srd)))
+	    END IF
+	  END DO node_loop
+
+	
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_coo)
+
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsol_cosinebell
+
+!*****************************************************************
+	  SUBROUTINE slm_initcosinebell(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_centr
+	  REAL (KIND = GRID_SR)                                       :: r_rds, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_tmp
+	  INTEGER                                    :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE            :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_coo
+	  INTEGER, DIMENSION(1)                      :: i_valind
+
+!---------- initialize some constant for the sliced sphere
+
+	  r_rds= r_srd
+	  r_centr= r_cntr
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(55)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_aux(1,i_count)= 0.0_GRID_SR
+	    r_tmp(:)      = r_coo(:,i_count)- r_centr(:)
+	    r_dpt= dot_product(r_tmp, r_tmp)**0.5
+	    inside: IF(r_dpt <= r_rds) THEN
+	      r_aux(1,i_count)= r_hgt * cos(r_dpt*(GRID_PI/(2*r_rds)))
+	    END IF inside
+	  END DO node_loop
+
+!---------- update grid information
+	  
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_initcosinebell	  
+!*****************************************************************
+	  SUBROUTINE slm_analyticsol_oneforall(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)				:: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)				:: r_time
+	  INTEGER, INTENT(in)						:: i_arlen
+	  INTEGER							:: i_count, i_num, i_alct, i_step
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)	:: r_array
+
+	
+
+!---------- for every quarter revolt: test if is node in or out of the sliced sphere and set r_array	  		
+	  r_array = 1.0
+	  
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsol_oneforall
+      
+!*****************************************************************
+	  SUBROUTINE slm_initoneforall(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             			:: p_ghand
+	  INTEGER                                    			:: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE		:: r_aux
+	  INTEGER, DIMENSION(1)                      			:: i_valind
+
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_aux(1,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(55)
+	  END IF
+
+!----------
+
+	  r_aux= 1.0_GRID_SR
+	 
+
+!---------- update grid information
+	  
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux)
+
+	  RETURN
+	  END SUBROUTINE slm_initoneforall
+	END MODULE SLM_initial
diff --git a/flash2d/src/options/SLM_initial.bar.f90 b/flash2d/src/options/SLM_initial.bar.f90
new file mode 100644
index 0000000..eb16af9
--- /dev/null
+++ b/flash2d/src/options/SLM_initial.bar.f90
@@ -0,0 +1,184 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_initial
+! FUNCTION:
+!	initialize slotted cylinder for semi-Lagrangian advection
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialvalues
+! FUNCTION:
+!	initialize a grid with values
+! SYNTAX:
+!	CALL slm_initialvalues(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initbar
+! FUNCTION:
+!	initialize a grid with values of a bar
+! SYNTAX:
+!	CALL slm_initbar(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_analyticsolution
+! FUNCTION:
+!	calculates the 'analytic solution' to compare with in diagnostics
+! SYNTAX:
+!	CALL slm_analyticsolution(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_initialvalues, slm_analyticsolution
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	7/97
+!	2. names changed		j. behrens	7/97
+!	3. changed to use GRID_api	j. behrens	11/97
+!	4. changed interfaces		j. behrens	12/97
+!	5. compliant to amatos 1.0	j. behrens	12/2000
+!	6. compliant to amatos 1.2	j. behrens	3/2002
+!	7. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_initial
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC slm_initialvalues, slm_analyticsolution
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_cntr=(/ -0.25, 0.0 /)
+	  REAL (KIND = GRID_SR)                            :: r_hgt=4.0
+	  REAL (KIND = GRID_SR)                            :: r_srd=0.15
+	  REAL (KIND = GRID_SR)                            :: r_sln=0.22
+	  REAL (KIND = GRID_SR)                            :: r_swd=0.06
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_initialvalues(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+
+!---------- initialize some constant for the slotted cylinder
+
+	  CALL slm_initbar(p_ghand)
+
+	  RETURN
+	  END SUBROUTINE slm_initialvalues
+!*****************************************************************
+	  SUBROUTINE slm_analyticsolution(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)                         :: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)                      :: r_time
+	  INTEGER, INTENT(in)                                    :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out) :: r_array
+
+!---------- dummy routine
+
+	  r_array= 0.0_GRID_SR
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsolution
+
+!*****************************************************************
+	  SUBROUTINE slm_initbar(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)                     :: p_ghand
+	  REAL (KIND = GRID_SR)                              :: r_xsw, r_ysw, r_xne, r_yne
+	  INTEGER                                            :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_coo
+	  INTEGER, DIMENSION(1)                              :: i_valind
+
+!---------- initialize some constants for the bar
+
+	  r_xsw= -0.375_GRID_SR
+	  r_xne= -0.125_GRID_SR
+	  r_ysw= -0.05_GRID_SR
+	  r_yne= 0.05_GRID_SR
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(51)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_aux(1,i_count)= 0.0_GRID_SR
+	    inside: IF((r_coo(1,i_count)>r_xsw .AND. r_coo(1,i_count)<r_xne) .AND. &
+	               (r_coo(2,i_count)>r_ysw .AND. r_coo(2,i_count)<r_yne)) THEN
+	      r_aux(1,i_count)= r_hgt
+	    END IF inside
+	  END DO node_loop
+
+!---------- update grid information
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_initbar
+
+	END MODULE SLM_initial
diff --git a/flash2d/src/options/SLM_initial.circ.f90 b/flash2d/src/options/SLM_initial.circ.f90
new file mode 100644
index 0000000..6ce7741
--- /dev/null
+++ b/flash2d/src/options/SLM_initial.circ.f90
@@ -0,0 +1,551 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_initial
+! FUNCTION:
+!	initialize values for semi-Lagrangian advection
+!	provides slm_analyticsolution to evaluate error and mass 
+!	conservation
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialvalues
+! FUNCTION:
+!	initialize a grid with values
+! SYNTAX:
+!	CALL slm_initialvalues(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initslottedcylinder
+! FUNCTION:
+!	initialize a grid with values of sliced sphere test case
+! SYNTAX:
+!	CALL slm_initslottedcylinder(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initcosinebell
+! FUNCTION:
+!	initialize a grid with values of a cosine bell 
+!	(convergence test case)
+! SYNTAX:
+!	CALL slm_initcosinebell(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+! NAME:
+!	slm_analyticsolution
+! FUNCTION:
+!	calculates the 'analytic solution' to compare with in diagnostics
+! SYNTAX:
+!	CALL slm_analyticsolution(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for three dimensions only
+!
+!-----------------------------------------------------------------
+! NAME:
+!	slm_analyticsol_slottedcylinder
+! FUNCTION:
+!	calculates the 'analytic solution' for the slotted cylinder with
+!	a circular windfield 1 revolution/day
+! SYNTAX:
+!	CALL slm_analyticsol_slottedcylinder(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+! NAME:
+!	slm_analyticsol_cosinebell
+! FUNCTION:
+!	calculates the 'analytic solution' for a cosine bell with
+!	circular windfield 1 revolution/day
+! SYNTAX:
+!	CALL slm_analyticsol_cosinebell(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+! PUBLIC:
+!	slm_initialvalues, slm_analyticsolution
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	7/97
+!	2. names changed		j. behrens	7/97
+!	3. changed to use GRID_api	j. behrens	11/97
+!	4. changed interfaces		j. behrens	12/97
+!	5. compliant to amatos 1.0	j. behrens	12/2000
+!	6. slotted cylinder test case	l. mentrup	12/2003 
+!
+!*****************************************************************
+	MODULE SLM_initial
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC slm_initialvalues, slm_analyticsolution
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_cntr=&
+	  				(/ -0.25_GRID_SR, 0._GRID_SR /)
+	  REAL (KIND = GRID_SR)                            :: r_hgt=4.0_GRID_SR
+	  REAL (KIND = GRID_SR)                            :: r_srd=0.15_GRID_SR
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_initialvalues(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  INTEGER                                    :: i_lev= 6
+
+!---------- initialize some constant for the slotted cylinder
+
+	  CALL slm_initslottedcylinder(p_ghand)
+	  
+!---------- initialize some constant for the cosine bell test case
+
+!	  CALL slm_initcosinebell(p_ghand)
+
+!---------- initialize concentration one everywhere
+
+!	  CALL slm_initoneforall(p_ghand)
+
+	  RETURN
+	  END SUBROUTINE slm_initialvalues
+!*****************************************************************
+	  SUBROUTINE slm_analyticsolution(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)              :: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  INTEGER, INTENT(in)                         :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)       :: r_array
+
+!---------- this is a dummy
+!	  r_array= 0.0_GRID_SR
+	  
+!---------- analyticsolution: cosinebell
+!	  CALL slm_analyticsol_cosinebell(p_ghand, r_time, i_arlen, r_array)
+
+!---------- analyticsolution: ball
+!	  CALL slm_analyticsol_slottedcylinder(p_ghand, r_time, i_arlen, r_array)
+
+!---------- analyticsolution: concentration one everywhere
+	  CALL slm_analyticsol_oneforall(p_ghand, r_time, i_arlen, r_array)
+	  
+	  
+	  RETURN
+	  END SUBROUTINE slm_analyticsolution
+	  
+!*****************************************************************
+	  SUBROUTINE slm_analyticsol_slottedcylinder(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)              :: p_ghand
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_centr
+	  REAL (KIND = GRID_SR)                                        :: r_rds, r_dpt
+	  REAL (KIND = GRID_SR)					      :: r_rds_kreisbahn
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_tmp
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  REAL (KIND = GRID_SR)					      :: r_tim, r_time_one_turn
+	  REAL (KIND = GRID_SR)					      :: r_PI, r_phi	
+	  INTEGER, INTENT(in)                         :: i_arlen
+	  INTEGER                                     :: i_count, i_num, i_alct, i_step
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)       :: r_array
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE           :: r_coo
+	  
+
+
+!---------- initialize some constant for the tracer ball
+
+	  r_rds = 0.15_GRID_SR
+
+!---------- here is the crux: where is the center of the ball at time r_time
+
+	  
+	  r_tim 		= r_time
+	  r_time_one_turn 	= 1800._GRID_SR * 96_GRID_SR		! Time which the ball needs for one turn around the center
+	  r_PI 			= GRID_PI
+	  r_phi			= r_PI			! Phasenwinkel um die Anfangskonstellation zu beruecksichtigen
+	  r_centr		= r_cntr
+	  r_rds_kreisbahn	= 0.25_GRID_SR
+
+	  r_centr(1) 		= r_rds_kreisbahn * COS(2_GRID_SR*r_PI * r_tim/r_time_one_turn + r_phi)	!Beschreibung der Kreisbahn um den Ursprung
+	  r_centr(2) 		= r_rds_kreisbahn * SIN(2_GRID_SR*r_PI * r_tim/r_time_one_turn + r_phi) !Beschreibung der Kreisbahn um den Ursprung
+ 
+!	  r_centr(1)		= r_centr(1) + 0.5_GRID_SR	! Ins richtige Koordinatensystem
+!	  r_centr(2)		= r_centr(2) + 0.5_GRID_SR	! Ins richtige Koordsys verschieben
+
+	  IF (r_tim == 0.0_GRID_SR) THEN
+	    r_centr= r_cntr
+	  ENDIF
+
+
+!---------- allocate workspace
+	  
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_coo(GRID_dimension,i_num), stat=i_alct)
+          IF(i_alct /= 0) THEN
+		CALL grid_error(55)
+	  END IF	
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+	
+
+!---------- for every quarter revolt: test if is node in or out of the sliced sphere and set r_array	  		
+	  r_array = 0.0
+	  node_loop: DO i_count= 1, i_num
+	    r_tmp(:) = r_coo(:,i_count) - r_centr(:)
+	    r_dpt    = dot_product(r_tmp, r_tmp)**0.5_GRID_SR
+	    r_array(i_count) = 0.
+	    i_step=INT(r_tim) / 1800 
+	    i_step=MODULO(i_step,96)
+	    SELECT CASE (i_step)
+	      CASE(0) 
+	      	start_pos:IF(r_dpt <= r_rds .AND. &
+				.NOT.(r_tmp(2) <= 0.07_GRID_SR .AND. (r_tmp(1)<=0.03_GRID_SR .AND. r_tmp(1)>=-0.03_GRID_SR))) THEN
+	          r_array(i_count)= r_hgt
+	      	END IF start_pos
+	      CASE(24)
+	      	quarter_pos:IF(r_dpt <= r_rds .AND. &
+				.NOT.(r_tmp(1) >= -0.07_GRID_SR .AND. (r_tmp(2)<=0.03_GRID_SR .AND. r_tmp(2)>=-0.03_GRID_SR))) THEN
+	          r_array(i_count)= r_hgt
+	      	END IF quarter_pos
+	      CASE(48)
+	      	half_pos:IF(r_dpt <= r_rds .AND. &
+				.NOT.(r_tmp(2) >= -0.07_GRID_SR .AND. (r_tmp(1)<=0.03_GRID_SR .AND. r_tmp(1)>=-0.03_GRID_SR))) THEN
+	          r_array(i_count)= r_hgt
+	      	END IF half_pos
+	      CASE(72)
+	      	third_quarter_pos:IF(r_dpt <= r_rds .AND. &
+				.NOT.(r_tmp(1) <= 0.07_GRID_SR .AND. (r_tmp(2)<=0.03_GRID_SR .AND. r_tmp(2)>=-0.03_GRID_SR))) THEN
+	          r_array(i_count)= r_hgt
+	      	END IF third_quarter_pos
+	     END SELECT
+	  END DO node_loop
+
+	
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_coo)
+
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsol_slottedcylinder
+
+!*****************************************************************
+	  SUBROUTINE slm_initslottedcylinder(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_centr
+	  REAL (KIND = GRID_SR)                                       :: r_rds, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_tmp
+	  INTEGER                                    :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE            :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_coo
+	  INTEGER, DIMENSION(1)                      :: i_valind
+
+!---------- initialize some constant for the sliced sphere
+
+	  r_rds= 0.15_GRID_SR
+	  r_centr= r_cntr
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(55)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_aux(1,i_count)= 0.0_GRID_SR
+	    r_tmp(:)      = r_coo(:,i_count)- r_centr(:)
+	    r_dpt= dot_product(r_tmp, r_tmp)**0.5
+	    inside: IF(r_dpt <= r_rds .AND. &
+	    		.NOT.(r_tmp(2) <= 0.07_GRID_SR .AND. (r_tmp(1)>=-0.03_GRID_SR .AND. r_tmp(1)<=0.03_GRID_SR))) THEN
+	      r_aux(1,i_count)= r_hgt
+	    END IF inside
+	  END DO node_loop
+
+!---------- update grid information
+	  
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_initslottedcylinder
+!*****************************************************************
+	  SUBROUTINE slm_analyticsol_cosinebell(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)              :: p_ghand
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_centr
+	  REAL (KIND = GRID_SR)                                        :: r_rds, r_dpt
+	  REAL (KIND = GRID_SR)					      :: r_rds_kreisbahn
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_tmp
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  REAL (KIND = GRID_SR)					      :: r_tim, r_time_one_turn
+	  REAL (KIND = GRID_SR)					      :: r_PI, r_phi	
+	  INTEGER, INTENT(in)                         :: i_arlen
+	  INTEGER                                     :: i_count, i_num, i_alct, i_step
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)       :: r_array
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE           :: r_coo
+	  
+
+
+!---------- initialize some constant for the tracer ball
+
+	  r_rds = 0.15_GRID_SR
+
+!---------- here is the crux: where is the center of the ball at time r_time
+
+	  
+	  r_tim 		= r_time
+	  r_time_one_turn 	= 1800._GRID_SR * 96_GRID_SR		! Time which the ball needs for one turn around the center
+	  r_PI 			= GRID_PI
+	  r_phi			= r_PI			! Phasenwinkel um die Anfangskonstellation zu beruecksichtigen
+	  r_centr		= r_cntr
+	  r_rds_kreisbahn	= 0.25_GRID_SR
+
+	  r_centr(1) 		= r_rds_kreisbahn * COS(2_GRID_SR*r_PI * r_tim/r_time_one_turn + r_phi)	!Beschreibung der Kreisbahn um den Ursprung
+	  r_centr(2) 		= r_rds_kreisbahn * SIN(2_GRID_SR*r_PI * r_tim/r_time_one_turn + r_phi) !Beschreibung der Kreisbahn um den Ursprung
+ 
+!	  r_centr(1)		= r_centr(1) + 0.5_GRID_SR	! Ins richtige Koordinatensystem
+!	  r_centr(2)		= r_centr(2) + 0.5_GRID_SR	! Ins richtige Koordsys verschieben
+
+	  IF (r_tim == 0.0_GRID_SR) THEN
+	    r_centr= r_cntr
+	  ENDIF
+
+
+!---------- allocate workspace
+	  
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_coo(GRID_dimension,i_num), stat=i_alct)
+          IF(i_alct /= 0) THEN
+		CALL grid_error(55)
+	  END IF	
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+	
+
+!---------- for every quarter revolt: test if is node in or out of the sliced sphere and set r_array	  		
+	  r_array = 0.0
+	  node_loop: DO i_count= 1, i_num
+	    r_tmp(:) = r_coo(:,i_count) - r_centr(:)
+	    r_dpt    = dot_product(r_tmp, r_tmp)**0.5_GRID_SR
+	    r_array(i_count) = 0.
+	    IF (r_dpt <= r_srd) THEN
+	      r_array(i_count) = r_hgt* cos(r_dpt*(r_PI/(2*r_srd)))
+	    END IF
+	  END DO node_loop
+
+	
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_coo)
+
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsol_cosinebell
+
+!*****************************************************************
+	  SUBROUTINE slm_initcosinebell(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_centr
+	  REAL (KIND = GRID_SR)                                       :: r_rds, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_tmp
+	  INTEGER                                    :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE            :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_coo
+	  INTEGER, DIMENSION(1)                      :: i_valind
+
+!---------- initialize some constant for the sliced sphere
+
+	  r_rds= 0.15_GRID_SR
+	  r_centr= r_cntr
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(55)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_aux(1,i_count)= 0.0_GRID_SR
+	    r_tmp(:)      = r_coo(:,i_count)- r_centr(:)
+	    r_dpt= dot_product(r_tmp, r_tmp)**0.5
+	    inside: IF(r_dpt <= r_rds) THEN
+	      r_aux(1,i_count)= r_hgt * cos(r_dpt*(GRID_PI/(2*r_rds)))
+	    END IF inside
+	  END DO node_loop
+
+!---------- update grid information
+	  
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_initcosinebell	  
+!*****************************************************************
+	  SUBROUTINE slm_analyticsol_oneforall(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)				:: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)				:: r_time
+	  INTEGER, INTENT(in)						:: i_arlen
+	  INTEGER							:: i_count, i_num, i_alct, i_step
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)	:: r_array
+
+	
+
+!---------- for every quarter revolt: test if is node in or out of the sliced sphere and set r_array	  		
+	  r_array = 1.0
+	  
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsol_oneforall
+      
+!*****************************************************************
+	  SUBROUTINE slm_initoneforall(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             			:: p_ghand
+	  INTEGER                                    			:: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE		:: r_aux
+	  INTEGER, DIMENSION(1)                      			:: i_valind
+
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_aux(1,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(55)
+	  END IF
+
+!----------
+
+	  r_aux= 1.0_GRID_SR
+	 
+
+!---------- update grid information
+	  
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux)
+
+	  RETURN
+	  END SUBROUTINE slm_initoneforall
+	END MODULE SLM_initial
diff --git a/flash2d/src/options/SLM_initial.conv.f90 b/flash2d/src/options/SLM_initial.conv.f90
new file mode 100644
index 0000000..1655da9
--- /dev/null
+++ b/flash2d/src/options/SLM_initial.conv.f90
@@ -0,0 +1,299 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_initial
+! FUNCTION:
+!	initialize values for semi-Lagrangian advection
+!	provides slm_analyticsolution to evaluate error and mass 
+!	conservation
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialvalues
+! FUNCTION:
+!	initialize a grid with values
+! SYNTAX:
+!	CALL slm_initialvalues(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initcylinder
+! FUNCTION:
+!	initialize a grid with values of cylinder test case with
+!	convergent windfield
+! SYNTAX:
+!	CALL slm_initcylinder(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_analyticsolution
+! FUNCTION:
+!	calculates the 'analytic solution' to compare with in diagnostics
+! SYNTAX:
+!	CALL slm_analyticsolution(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_analyticsol_cylinder
+! FUNCTION:
+!	calculates the 'analytic solution' to compare with in diagnostics
+!	for cylinder and convergent windfield
+! SYNTAX:
+!	CALL slm_analyticsolution(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_initialvalues, slm_analyticsolution
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	7/97
+!	2. names changed		j. behrens	7/97
+!	3. changed to use GRID_api	j. behrens	11/97
+!	4. changed interfaces		j. behrens	12/97
+!	5. compliant to amatos 1.0	j. behrens	12/2000
+!	6. done some work for 2D	l. mentrup	2003
+!
+!*****************************************************************
+	MODULE SLM_initial
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC slm_initialvalues, slm_analyticsolution
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_cntr=(/ -0.25_GRID_SR, 0._GRID_SR/)
+	  REAL (KIND = GRID_SR)                            :: r_hgt=1.0_GRID_SR
+	  REAL (KIND = GRID_SR)                            :: r_srd=0.15_GRID_SR
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_initialvalues(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  INTEGER                                    :: i_lev= 6
+
+!---------- initialize some constant for the slotted cylinder
+
+	  CALL slm_initcylinder(p_ghand)
+
+	  RETURN
+	  END SUBROUTINE slm_initialvalues
+!*****************************************************************
+	  SUBROUTINE slm_analyticsolution(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)              :: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  INTEGER, INTENT(in)                         :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)       :: r_array
+
+!---------- this is a dummy
+!	  r_array= 0.0_GRID_SR
+	  
+!---------- analyticsolution: cylinder
+	  CALL slm_analyticsol_cylinder(p_ghand, r_time, i_arlen, r_array)
+
+
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsolution
+	  
+!*****************************************************************
+
+	  SUBROUTINE slm_analyticsol_cylinder(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)		:: p_ghand
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), SAVE		:: r_centr
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)		:: r_convpoint
+	  REAL (KIND = GRID_SR), SAVE					:: r_rds
+	  REAL (KIND = GRID_SR)						:: r_dpt, r_rds_start
+	  REAL (KIND = GRID_SR), SAVE					:: r_conc
+	  REAL (KIND = GRID_SR)						:: r_dist_new, r_dist_old
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)		:: r_tmp
+	  REAL (KIND = GRID_SR), INTENT(in)				:: r_time
+	  REAL (KIND = GRID_SR)						:: r_tim
+	  REAL (KIND = GRID_SR)					       	:: r_fac
+	  INTEGER, INTENT(in)				:: i_arlen
+	  INTEGER					:: i_count, i_num, i_alct, i_step
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)		:: r_array
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE		:: r_coo
+	  
+
+
+!---------- get the variables for the tracer ball
+
+	  r_tim 		= r_time
+	  i_step		= p_timestepinfo%i_step
+	  r_convpoint		= (/ 0.75_GRID_SR, 0._GRID_SR /)
+	  r_fac			= 0.5_GRID_SR*0.363610260832151995e-4_GRID_SR
+	  r_rds_start		= 0.15_GRID_SR
+	  
+	  
+	  IF (i_step == 0) THEN	      
+	      r_centr = r_cntr
+	      r_rds   = r_rds_start
+	      r_conc  = r_hgt
+	  END IF
+	      
+	  r_conc 	= r_conc *(r_rds**2)
+	    
+	  r_tmp		= r_convpoint - r_centr
+	  r_dist_old	= dot_product(r_tmp, r_tmp)**0.5_GRID_SR
+	   
+	  r_centr(1)	= r_convpoint(1) - exp(-1*r_fac*(r_tim))
+	  r_centr(2)	= 0.
+	    
+	  r_tmp		= r_convpoint - r_centr
+	  r_dist_new  	= dot_product(r_tmp, r_tmp)**0.5_GRID_SR
+	  r_rds		= r_rds * r_dist_new/r_dist_old
+	
+	  r_conc	= r_conc / (r_rds**2)
+	    
+	  	  
+ 
+
+!---------- allocate workspace
+	  
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_coo(GRID_dimension,i_num), stat=i_alct)
+          IF(i_alct /= 0) THEN
+		CALL grid_error(55)
+	  END IF	
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+	
+
+!---------- test if is node is in or out of the ball and set r_array	  		
+	  r_array = 0.0
+	  
+	  node_loop: DO i_count= 1, i_num
+	    r_tmp(:) = r_coo(:,i_count) - r_centr(:)
+	    r_dpt    = dot_product(r_tmp, r_tmp)**0.5_GRID_SR
+	    inside: IF(r_dpt <= r_rds) THEN
+	      r_array(i_count)= r_conc
+	    END IF inside
+	  END DO node_loop
+
+	
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_coo)
+
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsol_cylinder
+
+!*****************************************************************
+	  SUBROUTINE slm_initcylinder(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_centr
+	  REAL                                       :: r_rds, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_tmp
+	  INTEGER                                    :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE            :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_coo
+	  INTEGER, DIMENSION(1)                       :: i_valind
+	  
+!---------- initialize some constant for the slotted cylinder
+
+	  r_rds= 0.15_GRID_SR
+	  r_centr= r_cntr
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(55)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_aux(1,i_count)= 0.0_GRID_SR
+	    r_tmp(:)      = r_coo(:,i_count)- r_centr(:)
+	    r_dpt= dot_product(r_tmp, r_tmp)**0.5_GRID_SR
+	    inside: IF(r_dpt <= r_rds) THEN
+	      r_aux(1,i_count)= r_hgt
+	    END IF inside
+	  END DO node_loop
+
+!---------- update grid information
+
+	  i_valind = (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_initcylinder
+
+	END MODULE SLM_initial
diff --git a/flash2d/src/options/SLM_initial.diag.f90 b/flash2d/src/options/SLM_initial.diag.f90
new file mode 100644
index 0000000..e35eca4
--- /dev/null
+++ b/flash2d/src/options/SLM_initial.diag.f90
@@ -0,0 +1,327 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_initial
+! FUNCTION:
+!	initialize ball for semi-Lagrangian advection
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialvalues
+! FUNCTION:
+!	initialize a grid with values
+! SYNTAX:
+!	CALL slm_initialvalues(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initball
+! FUNCTION:
+!	initialize a grid with values of ball test case
+! SYNTAX:
+!	CALL slm_initslot(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_analyticsolution
+! FUNCTION:
+!	calculates the 'analytic solution' to compare with in diagnostics
+! SYNTAX:
+!	CALL slm_analyticsolution(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_initialvalues, slm_analyticsolution
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	7/97
+!	2. names changed		j. behrens	7/97
+!	3. changed to use GRID_api	j. behrens	11/97
+!	4. changed interfaces		j. behrens	12/97
+!	5. compliant to amatos 1.0	j. behrens	12/2000
+!	6. done some work for 2D	l. mentrup	2003
+!
+!*****************************************************************
+	MODULE SLM_initial
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC slm_initialvalues, slm_analyticsolution
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_cntr=&
+	  					(/ -0.25_GRID_SR, -0.25_GRID_SR /)
+	  REAL (KIND = GRID_SR)                            :: r_hgt=1.0_GRID_SR
+	  REAL (KIND = GRID_SR)                            :: r_srd=0.15_GRID_SR
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_initialvalues(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  INTEGER                                    :: i_lev= 6
+
+!---------- initialize some constant for the slotted cylinder
+
+	  CALL slm_initball(p_ghand)
+	  
+!---------- initialize concentration one everywhere
+
+!	  CALL slm_initoneforall(p_ghand)
+
+	  RETURN
+	  END SUBROUTINE slm_initialvalues
+!*****************************************************************
+	  SUBROUTINE slm_analyticsolution(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)              :: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  INTEGER, INTENT(in)                         :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)       :: r_array
+
+!---------- this is a dummy
+!	  r_array= 0.0
+	  
+!---------- analyticsolution: ball
+	  CALL slm_analyticsolution_BALL_diag(p_ghand, r_time, i_arlen, r_array)
+
+!---------- analyticsolution: concentration one everywhere
+!	  CALL slm_analyticsol_oneforall(p_ghand, r_time, i_arlen, r_array)
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsolution
+	  
+!*******************************************************************************
+
+	  SUBROUTINE slm_analyticsolution_BALL_diag(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)		:: p_ghand
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)		:: r_centr
+	  REAL (KIND = GRID_SR)						:: r_rds, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)		:: r_tmp
+	  REAL (KIND = GRID_SR), INTENT(in)				:: r_time
+	  REAL (KIND = GRID_SR)						:: r_tim
+	  REAL (KIND = GRID_SR)					       	:: r_fac
+	  INTEGER, INTENT(in)				:: i_arlen
+	  INTEGER					:: i_count, i_nnum, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)		:: r_array
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE		:: r_coo
+	  
+
+
+!---------- initialize some constant for the tracer ball
+
+	  r_rds = 0.15_GRID_SR
+
+!---------- here is the crux: where is the center of the ball at time r_time
+
+	  
+	  r_tim 		= r_time
+	  r_fac			= .363610260832151995e-4_GRID_SR
+	  r_centr		= r_cntr
+
+	  r_centr(1) 		=  r_centr(1) + (0.1_GRID_SR*r_fac * r_time)	
+	  r_centr(2) 		=  r_centr(2) + (0.1_GRID_SR*r_fac * r_time) 
+
+	  IF (r_tim == 0.0_GRID_SR) THEN
+	    r_centr= r_cntr
+	  ENDIF
+
+
+!---------- allocate workspace
+	  
+	  i_nnum= p_ghand%i_nnumber
+	  ALLOCATE(r_coo(GRID_dimension,i_nnum), stat=i_alct)
+          IF(i_alct /= 0) THEN
+		CALL grid_error(55)
+	  END IF	
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+	
+
+!---------- test if is node is in or out of the ball and set r_array	  		
+	  r_array = 0.0_GRID_SR
+	  node_loop: DO i_count= 1, i_nnum
+	    r_tmp(:) = r_coo(:,i_count) - r_centr(:)
+	    r_dpt    = dot_product(r_tmp, r_tmp)**0.5_GRID_SR
+	    inside: IF(r_dpt <= r_rds) THEN
+	      r_array(i_count)= r_hgt
+	    END IF inside
+	  END DO node_loop
+
+	
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_coo)
+
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsolution_BALL_diag
+	  
+!*****************************************************************
+
+	  SUBROUTINE slm_initball(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_centr
+	  REAL (KIND = GRID_SR)                                       :: r_rds, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_tmp
+	  INTEGER                                    :: i_count, i_nnum, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE            :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_coo
+	  INTEGER, DIMENSION(1)                      :: i_valind
+
+!---------- initialize some constant for the slotted cylinder
+
+	  r_rds= 0.15_GRID_SR
+	  r_centr= r_cntr
+
+!---------- allocate workspace
+
+	  i_nnum= p_ghand%i_nnumber
+	  ALLOCATE(r_aux(1,i_nnum), r_coo(GRID_dimension,i_nnum), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(55)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_nnum
+	    r_aux(1,i_count)= 0.0_GRID_SR
+	    r_tmp(:)      = r_coo(:,i_count)- r_centr(:)
+	    r_dpt= dot_product(r_tmp, r_tmp)**0.5_GRID_SR
+	    inside: IF(r_dpt <= r_rds) THEN
+	      r_aux(1,i_count)= r_hgt
+	    END IF inside
+	  END DO node_loop
+
+!---------- update grid information
+	   
+	  i_valind = (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint= i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_initball
+	  
+!*****************************************************************
+	  SUBROUTINE slm_analyticsol_oneforall(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)				:: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)				:: r_time
+	  INTEGER, INTENT(in)						:: i_arlen
+	  INTEGER							:: i_count, i_num, i_alct, i_step
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)	:: r_array
+
+	
+
+!---------- for every quarter revolt: test if is node in or out of the sliced sphere and set r_array	  		
+	  r_array = 1.0
+	  
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsol_oneforall
+      
+!*****************************************************************
+	  SUBROUTINE slm_initoneforall(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             			:: p_ghand
+	  INTEGER                                    			:: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE		:: r_aux
+	  INTEGER, DIMENSION(1)                      			:: i_valind
+
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_aux(1,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(55)
+	  END IF
+
+!----------
+
+	  r_aux= 1.0_GRID_SR
+	 
+
+!---------- update grid information
+	  
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux)
+
+	  RETURN
+	  END SUBROUTINE slm_initoneforall
+
+
+	END MODULE SLM_initial
diff --git a/flash2d/src/options/SLM_initial.file.f90 b/flash2d/src/options/SLM_initial.file.f90
new file mode 100644
index 0000000..bcb20d8
--- /dev/null
+++ b/flash2d/src/options/SLM_initial.file.f90
@@ -0,0 +1,507 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_initial
+! FUNCTION:
+!	initialize slotted cylinder for semi-Lagrangian advection
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialvalues
+! FUNCTION:
+!	initialize a grid with values
+! SYNTAX:
+!	CALL slm_initialvalues(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initslot
+! FUNCTION:
+!	initialize a grid with values of slotted cylinder test case
+! SYNTAX:
+!	CALL slm_initslot(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_analyticsolution
+! FUNCTION:
+!	calculates the 'analytic solution' to compare with in diagnostics
+! SYNTAX:
+!	CALL slm_analyticsolution(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initcylndr
+! FUNCTION:
+!	initialize a grid with values of a cylinder test case
+! SYNTAX:
+!	CALL slm_initcylndr(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_centr: coordinates of cyl. centre	REAL
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	in_side
+! FUNCTION:
+!	checks, if a given point (x,y) lies within a given triangle
+! SYNTAX:
+!	logical= in_side(real.arr, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	r_coord: coordinate array		REAL
+!	r_node1: node1 of triangle		REAL
+!	r_node2: node2 of triangle		REAL
+!	r_node3: node3 of triangle		REAL
+! ON OUTPUT:
+!	l_in:    .true. if r_coord \in p_elem	logical
+! CALLS:
+!
+! COMMENTS:
+!	this routine decides whether a point lies in or out of a
+!	triangle. this is done with the following approach:
+!	calculate the area for the given triangle and for the 
+!	three triangles resulting from drawing lines from the given
+!	point to all three triangle nodes.
+!	if the sum of the areas of those three trianlges exceeds
+!	the area of the given trianlge, the the point lies outside
+!	of it.
+!	for calculation of the areas following formula is used:
+!	(Herons formula(?))
+!
+!	A = sqrt(s* (s- a)* (s- b)* (s- c)),
+!
+!	where s= 1/2* (a+ b+ c)
+!	      a, b, c sides.
+!
+!	in order to calculate the sidelengths |x-y|= sqrt(x**2-y**2)
+!	the complex absolute value intrinsic function is used.
+!	hopefully this fuction is faster than using sqrt and
+!	power-of-two instead.
+!
+!	internally double precision is used in this function, because
+!	machine precision is crucial when a coordinate pair appears
+!	near the edge or corner of an element.
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	dc_area
+! FUNCTION:
+!	calculate area of a triangle (in a plain) in double precision
+! SYNTAX:
+!	real= dc_area(real.arr, real.arr, real.arr)
+! ON INPUT:
+!	r_coord1: node1 of triangle			REAL
+!	r_coord2: node2 of triangle			REAL
+!	r_coord3: node3 of triangle			REAL
+! ON OUTPUT:
+!	r_area:   area of triangle			REAL
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_initialvalues, slm_analyticsolution
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	7/97
+!	2. names changed		j. behrens	7/97
+!	3. changed to use GRID_api	j. behrens	11/97
+!	4. changed interfaces		j. behrens	12/97
+!	5. compliant to amatos 1.0	j. behrens	12/2000
+!	6. compliant to amatos 1.2	j. behrens	3/2002
+!	7. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_initial
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC slm_initialvalues, slm_analyticsolution
+	  REAL (KIND = GRID_SR)                            :: r_hgt=4.0
+	  REAL (KIND = GRID_SR)                            :: r_srd=0.15
+	  REAL (KIND = GRID_SR)                            :: r_sln=0.22
+	  REAL (KIND = GRID_SR)                            :: r_swd=0.06
+	  LOGICAL                         :: l_circlinput
+	  INTEGER, PARAMETER              :: i_ioerr=0
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_initialvalues(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in) :: p_ghand
+	  INTEGER                        :: i_iofil= 11
+	  CHARACTER (len=80)             :: a_filrow
+	  INTEGER                        :: i_iost, i_ioend, i_alct, i_cnt
+	  INTEGER                        :: i_numcircl, i_tmp
+	  INTEGER, DIMENSION(3)          :: i_cntcircl
+	  INTEGER, PARAMETER             :: i_coor=1
+	  INTEGER, PARAMETER             :: i_diam=2
+	  INTEGER, PARAMETER             :: i_conc=3
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_coocircl
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE   :: r_concircl, r_diacircl
+
+!---------- open file
+
+	  open(unit= i_iofil, file= 'Initial.dat', status= 'OLD', action= 'READ', iostat= i_iost)
+	  file_notopen: IF(i_iost /= 0) THEN
+	    write(i_ioerr,*) 'ERROR: Filename: Initial.dat'
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'ERROR: Filename: Initial.dat'
+	    CALL grid_error(56)
+	  END IF file_notopen
+	  IF(GRID_parameters%iolog > 0) &
+	    write(GRID_parameters%iolog,*) 'INFO: Opened file on unit: ', i_iofil
+
+!---------- read file entries in a loop
+
+	  read_loop: DO
+	    read(i_iofil,2000,iostat=i_ioend) a_filrow
+
+!---------- if file ended
+
+	    file_end: IF(i_ioend /= 0) THEN
+	      close(i_iofil)
+	      IF(GRID_parameters%iolog > 0) &
+	        write(GRID_parameters%iolog,*) 'INFO: Closed file on unit: ', i_iofil
+	      EXIT read_loop
+	    ELSE file_end
+
+!---------- decide what to DO with line according to first character
+
+	    comment_line: IF(a_filrow(1:1) == '#' .or. a_filrow(1:1) == '!') THEN
+	      CYCLE read_loop
+	    ELSE IF(a_filrow(1:11) == 'CIRCLES_INP') THEN comment_line
+	      l_circlinput= .TRUE.
+	      i_cntcircl= 0
+	    ELSE IF(a_filrow(1:11) == 'FILES_INPUT') THEN comment_line
+	      IF(GRID_parameters%iolog  > 0) &
+	        write(GRID_parameters%iolog,*) 'INFO [slm_initialvalue]: File input not yet supported'
+	      l_circlinput= .FALSE.
+	    ELSE IF(a_filrow(1:11) == 'NUMBER_OF_C') THEN comment_line
+	      IF(.NOT. l_circlinput) CALL grid_error(57)
+	      read(i_iofil,*) i_numcircl
+	      IF(ALLOCATED(r_coocircl)) DEALLOCATE(r_coocircl)
+	      IF(ALLOCATED(r_concircl)) DEALLOCATE(r_concircl)
+	      IF(ALLOCATED(r_diacircl)) DEALLOCATE(r_diacircl)
+	      ALLOCATE(r_coocircl(GRID_dimension,i_numcircl), stat= i_alct)
+	      IF(i_alct /= 0) CALL grid_error(58)
+	      ALLOCATE(r_concircl(i_numcircl), r_diacircl(i_numcircl), stat= i_alct)
+	      IF(i_alct /= 0) CALL grid_error(58)
+	    ELSE IF(a_filrow(1:11) == 'NUMBER_OF_W') THEN comment_line
+	      IF(GRID_parameters%iolog  > 0) &
+	        write(GRID_parameters%iolog,*) 'INFO [slm_initialvalue]: File input not yet supported'
+	      IF(l_circlinput) CALL grid_error(57)
+	    ELSE IF(a_filrow(1:11) == 'CIRCLE_COOR') THEN comment_line
+	      IF(.NOT. l_circlinput) CALL grid_error(57)
+	      i_cntcircl(i_coor)= i_cntcircl(i_coor)+ 1
+	      i_tmp= i_cntcircl(i_coor)
+	      IF(i_tmp > i_numcircl) CALL grid_error(57)
+	      dim_loop: DO i_cnt=1,GRID_dimension
+	        read(i_iofil,*) r_coocircl(i_cnt,i_cntcircl(i_coor))
+	      END DO dim_loop
+	    ELSE IF(a_filrow(1:11) == 'CIRCLE_DIAM') THEN comment_line
+	      IF(.NOT. l_circlinput) CALL grid_error(57)
+	      i_cntcircl(i_diam)= i_cntcircl(i_diam)+ 1
+	      i_tmp= i_cntcircl(i_diam)
+	      IF(i_tmp > i_numcircl) CALL grid_error(57)
+	      read(i_iofil,*) r_diacircl(i_cntcircl(i_diam))
+	    ELSE IF(a_filrow(1:11) == 'CIRCLE_CONC') THEN comment_line
+	      IF(.NOT. l_circlinput) CALL grid_error(57)
+	      i_cntcircl(i_conc)= i_cntcircl(i_conc)+ 1
+	      i_tmp= i_cntcircl(i_conc)
+	      IF(i_tmp > i_numcircl) CALL grid_error(57)
+	      read(i_iofil,*) r_concircl(i_cntcircl(i_conc))
+	    ELSE IF(a_filrow(1:11) == 'INPUT_FILE_') THEN comment_line
+	      IF(GRID_parameters%iolog  > 0) &
+	        write(GRID_parameters%iolog,*) 'INFO [slm_initialvalue]: File input not yet supported'
+	      IF(l_circlinput) CALL grid_error(57)
+	    ELSE IF(a_filrow(1:11) == 'WATERMARK_L') THEN comment_line
+	      IF(GRID_parameters%iolog  > 0) &
+	        write(GRID_parameters%iolog,*) 'INFO [slm_initialvalue]: File input not yet supported'
+	      IF(l_circlinput) CALL grid_error(57)
+	    ELSE IF(a_filrow(1:11) == 'WATERMARK_C') THEN comment_line
+	      IF(GRID_parameters%iolog  > 0) &
+	        write(GRID_parameters%iolog,*) 'INFO [slm_initialvalue]: File input not yet supported'
+	      IF(l_circlinput) CALL grid_error(57)
+	    END IF comment_line
+
+	    END IF file_end
+	  END DO read_loop
+
+!---------- initialize cylinders
+
+	  CALL initcylndr(p_ghand, i_numcircl, r_coocircl, r_diacircl, r_concircl)
+
+	  RETURN
+ 2000	  FORMAT(a80)
+	  END SUBROUTINE slm_initialvalues
+!*****************************************************************
+	  SUBROUTINE slm_analyticsolution(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)              :: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  INTEGER, INTENT(in)                         :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)       :: r_array
+	  REAL (KIND = GRID_SR)                                        :: r_fac=.363610260832151995e-4
+	  REAL (KIND = GRID_SR)                                        :: r_rds, r_ras, r_rad, &
+	    r_ads, r_bds, r_cds, r_f1, r_f2, r_xya, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_fc, r_p1, r_p2, &
+	    r_pa, r_pb, r_pc, r_pd, r_tmp, r_centr
+	  INTEGER                                     :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE           :: r_coo
+	  LOGICAL                                     :: l_ino
+
+!---------- initialize some constants for the slotted cylinder
+
+	  r_centr(1)= -cos(r_fac* r_time)* 0.25_GRID_SR ! <--- based on 2D
+	  r_centr(2)= -sin(r_fac* r_time)* 0.25_GRID_SR ! <--- based on 2D
+
+	  r_rds= r_srd* r_srd
+	  r_ras= dot_product(r_centr, r_centr)
+	  r_rad= sqrt(r_ras)
+	  r_ads= r_swd* 0.5_GRID_SR
+	  r_bds= r_srd- r_sln
+	  r_cds= r_srd
+	  r_f1 = (r_rad- r_ads)/ r_rad
+	  r_f2 = (r_rad+ r_ads)/ r_rad
+	  r_p1 = abs(r_centr)
+	  r_xya= sum(r_p1)
+	  IF(r_xya == 0.0_GRID_SR) THEN
+	    r_fc= 0.0_GRID_SR
+	  ELSE
+	    r_fc(1)= -r_centr(2)/ r_xya
+	    r_fc(2)=  r_centr(1)/ r_xya
+	  END IF
+
+!---------- calculate endpoints of the slot
+
+	  r_p1= r_f1* r_centr
+	  r_p2= r_f2* r_centr
+
+	  r_pa= r_p1+ r_fc* r_bds
+	  r_pb= r_p1+ r_fc* r_cds
+	  r_pc= r_p2+ r_fc* r_cds
+	  r_pd= r_p2+ r_fc* r_bds
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  IF(i_arlen /= i_num) THEN
+	    CALL grid_error(52)
+	  END IF
+
+	  ALLOCATE(r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(53)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_array(i_count)= 0.0_GRID_SR
+	    r_tmp(:)        = r_coo(:,i_count)- r_centr(:)
+	    r_dpt= dot_product(r_tmp, r_tmp)
+	    inside: IF(r_dpt < r_rds) THEN
+	      r_array(i_count)= r_hgt
+	      l_ino= in_side(r_coo(:,i_count), r_pa, r_pb, r_pc)
+	      IF(l_ino) r_array(i_count)= 0.0_GRID_SR
+	      l_ino= in_side(r_coo(:,i_count), r_pa, r_pc, r_pd)
+	      IF(l_ino) r_array(i_count)= 0.0_GRID_SR
+	    END IF inside
+	  END DO node_loop
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsolution
+
+!*****************************************************************
+	  FUNCTION dc_area(r_coord1, r_coord2, r_coord3) RESULT (r_area)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord1, r_coord2, r_coord3
+	  REAL (KIND = GRID_DR)                            :: r_area
+	  REAL (KIND = GRID_DR)                            :: r_c
+	  REAL (KIND = GRID_DR), DIMENSION(GRID_dimension) :: r_a, r_b
+	  INTEGER                                     :: i_cnt
+
+!---------- calculate vector components
+
+	  dim_loop: DO i_cnt=1, GRID_dimension
+	    r_a(i_cnt)= REAL((r_coord2(i_cnt)- r_coord1(i_cnt)),GRID_DR)
+	    r_b(i_cnt)= REAL((r_coord3(i_cnt)- r_coord1(i_cnt)),GRID_DR)
+	  END DO dim_loop
+
+!---------- calculate components (a,b,c) of cross product vector
+
+	  r_c= (r_a(1)* r_b(2)- r_a(2)* r_b(1))
+
+!---------- calculate area
+
+	  r_area= abs(r_c)* 0.5_GRID_DR
+
+	  RETURN
+	  END FUNCTION dc_area
+
+!*****************************************************************
+	  FUNCTION in_side(r_coord, r_node1, r_node2, r_node3) RESULT (l_in)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_node1, r_node2, r_node3
+	  LOGICAL                                     :: l_in
+	  REAL (KIND = GRID_DR)                            :: r_sum, r_f, r_f1, r_f2, r_f3
+	  REAL (KIND = GRID_DR)                            :: r_eps
+
+!---------- set in_side value to out
+
+ 	  l_in= .FALSE.
+
+!---------- set epsilon (machine precision)
+
+	  r_eps= GRID_eps
+
+!---------- calculate areas (f, f1, f2, f3)
+
+	  r_f = dc_area(r_node1, r_node2, r_node3)
+	  r_f1= dc_area(r_coord, r_node2, r_node3)
+	  r_f2= dc_area(r_coord, r_node1, r_node2)
+	  r_f3= dc_area(r_coord, r_node1, r_node3)
+
+!---------- check if summed area is bigger than triangle area
+
+	  r_sum= r_f1+ r_f2+ r_f3
+	  if((r_sum- r_f) < r_eps) l_in= .TRUE.
+
+	  RETURN
+	  END FUNCTION in_side
+
+!*****************************************************************
+	  SUBROUTINE initcylndr(p_ghand, i_numcircl, r_coocircl, r_diacircl, r_concircl)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  INTEGER                                    :: i_numcircl
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_numcircl) :: r_coocircl
+	  REAL (KIND = GRID_SR), DIMENSION(i_numcircl)                :: r_diacircl, r_concircl
+	  REAL (KIND = GRID_SR)                                       :: r_radsq, r_heigt, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_tmp, r_centr
+	  INTEGER                                    :: i_count, i_num, i_alct, i_circ
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_coo
+	  INTEGER, DIMENSION(1)                       :: i_valind
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(55)
+	  END IF
+	  r_aux= 0.0_GRID_SR
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- loop over the circles
+
+	  circl_loop: DO i_circ= 1, i_numcircl
+
+	    r_radsq= r_diacircl(i_circ)* r_diacircl(i_circ)
+	    r_centr= r_coocircl(:,i_circ)
+	    r_heigt= r_concircl(i_circ)
+
+!---------- loop over the nodes
+
+	    node_loop: DO i_count= 1, i_num
+	      r_tmp(:)      = r_coo(:,i_count)- r_centr(:)
+	      r_dpt= dot_product(r_tmp, r_tmp)
+	      inside: IF(r_dpt < r_radsq) THEN
+	        r_aux(1,i_count)= r_aux(1,i_count)+ r_heigt
+	      END IF inside
+	    END DO node_loop
+	  END DO circl_loop
+
+!---------- update grid information
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE initcylndr
+
+	END MODULE SLM_initial
diff --git a/flash2d/src/options/SLM_initial.kaeser.f90 b/flash2d/src/options/SLM_initial.kaeser.f90
new file mode 100644
index 0000000..a9bf080
--- /dev/null
+++ b/flash2d/src/options/SLM_initial.kaeser.f90
@@ -0,0 +1,272 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_initial
+! FUNCTION:
+!	initialize values for semi-Lagrangian advection
+!	provides slm_analyticsolution to evaluate error and mass 
+!	conservation (when kaeser test case is applied)
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialvalues
+! FUNCTION:
+!	initialize a grid with values
+! SYNTAX:
+!	CALL slm_initialvalues(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initslottedcylinder
+! FUNCTION:
+!	initialize a grid with values of sliced sphere test case
+! SYNTAX:
+!	CALL slm_initball(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+! NAME:
+!	slm_analyticsolution
+! FUNCTION:
+!	calculates the 'analytic solution' to compare with in diagnostics
+! SYNTAX:
+!	CALL slm_analyticsolution(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+! PUBLIC:
+!	slm_initialvalues, slm_analyticsolution
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	7/97
+!	2. names changed		j. behrens	7/97
+!	3. changed to use GRID_api	j. behrens	11/97
+!	4. changed interfaces		j. behrens	12/97
+!	5. compliant to amatos 1.0	j. behrens	12/2000
+!	6. kaeser test case implemented	l. mentrup	12/2003
+!
+!*****************************************************************
+	MODULE SLM_initial
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC slm_initialvalues, slm_analyticsolution
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_cntr=&
+	  					(/ -0.25_GRID_SR, 0._GRID_SR /)
+	  REAL (KIND = GRID_SR)                            :: r_hgt=1.0_GRID_SR
+	  REAL (KIND = GRID_SR)                            :: r_srd=0.15_GRID_SR
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_initialvalues(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  INTEGER                                    :: i_lev= 6
+
+!---------- initialize some constant for the slotted cylinder
+
+	  CALL slm_initslottedcylinder(p_ghand)
+
+	  RETURN
+	  END SUBROUTINE slm_initialvalues
+!*****************************************************************
+	  SUBROUTINE slm_analyticsolution(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)              :: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  INTEGER, INTENT(in)                         :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)       :: r_array
+
+!---------- this is a dummy
+!	  r_array= 0.0_GRID_SR
+	  
+!---------- analyticsolution: slotted cylinder
+	  CALL slm_analyticsol_slottedcylinder(p_ghand, r_time, i_arlen, r_array)
+
+
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsolution
+	  
+!*****************************************************************
+	  SUBROUTINE slm_analyticsol_slottedcylinder(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)              :: p_ghand
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_centr
+	  REAL (KIND = GRID_SR)                                        :: r_rds, r_dpt
+	  REAL (KIND = GRID_SR)					      :: r_rds_kreisbahn
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_tmp
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  REAL (KIND = GRID_SR)					      :: r_tim, r_time_one_turn
+	  REAL (KIND = GRID_SR)					      :: r_PI, r_phi	
+	  INTEGER, INTENT(in)                         :: i_arlen
+	  INTEGER                                     :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)       :: r_array
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE           :: r_coo
+	  
+
+
+!---------- initialize some constant for the tracer ball
+
+	  r_rds = 0.15_GRID_SR
+
+!---------- here is the crux: where is the center of the ball at time r_time
+
+	  
+	  r_tim 		= r_time
+!	  r_time_one_turn 	= 1800. * 72		! Time which the ball needs for one turn around the center
+!	  r_PI 			= GRID_PI
+!	  r_phi			= r_PI			! Phasenwinkel um die Anfangskonstellation zu beruecksichtigen
+!	  r_centr		= r_cntr
+!	  r_rds_kreisbahn	= 0.25
+!
+!	  r_centr(1) 		= r_rds_kreisbahn * COS(2*r_PI * r_tim/r_time_one_turn + r_phi)	!Beschreibung der Kreisbahn um den Ursprung
+!	  r_centr(2) 		= r_rds_kreisbahn * SIN(2*r_PI * r_tim/r_time_one_turn + r_phi) !Beschreibung der Kreisbahn um den Ursprung
+! 
+!	  r_centr(1)		= r_centr(1) + 0.5	! Ins richtige Koordinatensystem
+!	  r_centr(2)		= r_centr(2) + 0.5	! Ins richtige Koordsys verschieben
+!
+!	  IF (r_tim == 0.0) THEN
+
+	    r_centr= r_cntr
+
+!	  ENDIF
+
+
+!---------- allocate workspace
+	  
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_coo(GRID_dimension,i_num), stat=i_alct)
+          IF(i_alct /= 0) THEN
+		CALL grid_error(55)
+	  END IF	
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+	
+
+!---------- for every quarter revolt: test if is node in or out of the sliced sphere and set r_array	  		
+	  r_array = 0.0_GRID_SR
+	  IF(MODULO(INT(r_tim)/1800,72) == 0) THEN
+	    node_loop: DO i_count= 1, i_num
+	      r_tmp(:) = r_coo(:,i_count) - r_centr(:)
+	      r_dpt    = dot_product(r_tmp, r_tmp)**0.5_GRID_SR  
+	      start_pos:IF(r_dpt <= r_rds .AND. &
+	      		.NOT.(r_tmp(2) < 0.07_GRID_SR .AND. r_tmp(1)< 0.03_GRID_SR .AND. r_tmp(1)>-0.03_GRID_SR)) THEN
+	        r_array(i_count)= r_hgt
+	      END IF start_pos
+	    END DO node_loop
+	  END IF
+
+	
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_coo)
+
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsol_slottedcylinder
+
+!*****************************************************************
+	  SUBROUTINE slm_initslottedcylinder(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_centr
+	  REAL (KIND = GRID_SR)                                       :: r_rds, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_tmp
+	  INTEGER                                    :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_coo
+	  INTEGER, DIMENSION(1)                      :: i_valind
+
+!---------- initialize some constant for the slotted cylinder
+
+	  r_rds= 0.15_GRID_SR
+	  r_centr= r_cntr
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(55)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_aux(1,i_count)= 0.0_GRID_SR
+	    r_tmp(:)      = r_coo(:,i_count)- r_centr(:)
+	    r_dpt= dot_product(r_tmp, r_tmp)**0.5_GRID_SR
+	    inside: IF(r_dpt <= r_rds .AND. &
+	    		.NOT. (r_tmp(2) < 0.07_GRID_SR .AND. r_tmp(1)< 0.03_GRID_SR .AND. r_tmp(1)>-0.03_GRID_SR)) THEN
+	      r_aux(1,i_count)= r_hgt
+	    END IF inside
+	  END DO node_loop
+
+!---------- update grid information
+	
+	  i_valind = (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint= i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_initslottedcylinder
+
+	END MODULE SLM_initial
diff --git a/flash2d/src/options/SLM_initial.leveque.f90 b/flash2d/src/options/SLM_initial.leveque.f90
new file mode 100644
index 0000000..2f00fa1
--- /dev/null
+++ b/flash2d/src/options/SLM_initial.leveque.f90
@@ -0,0 +1,638 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_initial
+! FUNCTION:
+!	initialize slotted cylinder for semi-Lagrangian advection
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialvalues
+! FUNCTION:
+!	initialize a grid with values
+! SYNTAX:
+!	CALL slm_initialvalues(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initslot
+! FUNCTION:
+!	initialize a grid with values of slotted cylinder test case
+! SYNTAX:
+!	CALL slm_initslot(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_analyticsolution
+! FUNCTION:
+!	calculates the 'analytic solution' to compare with in diagnostics
+! SYNTAX:
+!	CALL slm_analyticsolution(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initcylndr
+! FUNCTION:
+!	initialize a grid with values of a cylinder test case
+! SYNTAX:
+!	CALL slm_initcylndr(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_centr: coordinates of cyl. centre	REAL
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	in_side
+! FUNCTION:
+!	checks, if a given point (x,y) lies within a given triangle
+! SYNTAX:
+!	logical= in_side(real.arr, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	r_coord: coordinate array		REAL
+!	r_node1: node1 of triangle		REAL
+!	r_node2: node2 of triangle		REAL
+!	r_node3: node3 of triangle		REAL
+! ON OUTPUT:
+!	l_in:    .true. if r_coord \in p_elem	logical
+! CALLS:
+!
+! COMMENTS:
+!	this routine decides whether a point lies in or out of a
+!	triangle. this is done with the following approach:
+!	calculate the area for the given triangle and for the 
+!	three triangles resulting from drawing lines from the given
+!	point to all three triangle nodes.
+!	if the sum of the areas of those three trianlges exceeds
+!	the area of the given trianlge, the the point lies outside
+!	of it.
+!	for calculation of the areas following formula is used:
+!	(Herons formula(?))
+!
+!	A = sqrt(s* (s- a)* (s- b)* (s- c)),
+!
+!	where s= 1/2* (a+ b+ c)
+!	      a, b, c sides.
+!
+!	in order to calculate the sidelengths |x-y|= sqrt(x**2-y**2)
+!	the complex absolute value intrinsic function is used.
+!	hopefully this fuction is faster than using sqrt and
+!	power-of-two instead.
+!
+!	internally double precision is used in this function, because
+!	machine precision is crucial when a coordinate pair appears
+!	near the edge or corner of an element.
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	dc_area
+! FUNCTION:
+!	calculate area of a triangle (in a plain) in double precision
+! SYNTAX:
+!	real= dc_area(real.arr, real.arr, real.arr)
+! ON INPUT:
+!	r_coord1: node1 of triangle			REAL
+!	r_coord2: node2 of triangle			REAL
+!	r_coord3: node3 of triangle			REAL
+! ON OUTPUT:
+!	r_area:   area of triangle			REAL
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_initialvalues, slm_analyticsolution
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	7/97
+!	2. names changed		j. behrens	7/97
+!	3. changed to use GRID_api	j. behrens	11/97
+!	4. changed interfaces		j. behrens	12/97
+!	5. compliant to amatos 1.0	j. behrens	12/2000
+!	6. compliant to amatos 1.2	j. behrens	3/2002
+!	7. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_initial
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC slm_initialvalues, slm_analyticsolution
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_cntr=(/ 0.5, 0.75 /)
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_hcntr=(/ 0.25, 0.5 /)
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_ccntr=(/ 0.5, 0.25 /)
+	  REAL (KIND = GRID_SR)                            :: r_hgt=1.0
+	  REAL (KIND = GRID_SR)                            :: r_srd=0.15
+	  REAL (KIND = GRID_SR)                            :: r_sln=0.22
+	  REAL (KIND = GRID_SR)                            :: r_swd=0.06
+	  REAL (KIND = GRID_SR)                            :: r_onethird=1./3.
+	  REAL (KIND = GRID_SR)                            :: r_twothird=2./3.
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_initialvalues(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  INTEGER                                    :: i_lev= 6
+
+!---------- initialize some constant for the slotted cylinder
+
+	  cyl_slot: IF(p_ghand%i_maxlvl < i_lev) THEN
+	    CALL slm_initcylndr(p_ghand)
+	    CALL slm_inithump(p_ghand)
+	    CALL slm_initcone(p_ghand)
+	  ELSE cyl_slot
+	    CALL slm_initslot(p_ghand)
+	    CALL slm_inithump(p_ghand)
+	    CALL slm_initcone(p_ghand)
+	  END IF cyl_slot
+
+	  RETURN
+	  END SUBROUTINE slm_initialvalues
+!*****************************************************************
+	  SUBROUTINE slm_analyticsolution(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)              :: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  INTEGER, INTENT(in)                         :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(inout)     :: r_array
+	  REAL (KIND = GRID_SR)                                        :: r_fac=.363610260832151995e-4
+	  REAL (KIND = GRID_SR)                                        :: r_rds, r_ras, r_rad, &
+	    r_ads, r_bds, r_cds, r_f1, r_f2, r_xya, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_fc, r_p1, r_p2, &
+	    r_pa, r_pb, r_pc, r_pd, r_tmp, r_centr
+	  INTEGER                                     :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE           :: r_coo
+	  LOGICAL                                     :: l_aux
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  IF(i_arlen /= i_num) THEN
+	    CALL grid_error(52)
+	  END IF
+
+	  ALLOCATE(r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(53)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+
+!---------- compute values for slotted cylinder
+
+      CALL compute_slot(i_num, r_coo, r_array)
+
+!---------- compute values for Gaussian hump
+
+      CALL compute_hump(i_num, r_coo, r_array)
+
+!---------- compute values for cone
+
+      CALL compute_cone(i_num, r_coo, r_array)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsolution
+
+!*****************************************************************
+	  FUNCTION dc_area(r_coord1, r_coord2, r_coord3) RESULT (r_area)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord1, r_coord2, r_coord3
+	  REAL (KIND = GRID_DR)                            :: r_area
+	  REAL (KIND = GRID_DR)                            :: r_c
+	  REAL (KIND = GRID_DR), DIMENSION(GRID_dimension) :: r_a, r_b
+	  INTEGER                                     :: i_cnt
+
+!---------- calculate vector components
+
+	  dim_loop: DO i_cnt=1, GRID_dimension
+	    r_a(i_cnt)= REAL((r_coord2(i_cnt)- r_coord1(i_cnt)),GRID_DR)
+	    r_b(i_cnt)= REAL((r_coord3(i_cnt)- r_coord1(i_cnt)),GRID_DR)
+	  END DO dim_loop
+
+!---------- calculate components (a,b,c) of cross product vector
+
+	  r_c= (r_a(1)* r_b(2)- r_a(2)* r_b(1))
+
+!---------- calculate area
+
+	  r_area= abs(r_c)* 0.5_GRID_DR
+
+	  RETURN
+	  END FUNCTION dc_area
+
+!*****************************************************************
+	  FUNCTION in_side(r_coord, r_node1, r_node2, r_node3) RESULT (l_in)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_node1, r_node2, r_node3
+	  LOGICAL                                     :: l_in
+	  REAL (KIND = GRID_DR)                            :: r_sum, r_f, r_f1, r_f2, r_f3
+	  REAL (KIND = GRID_DR)                            :: r_eps
+
+!---------- set in_side value to out
+
+ 	  l_in= .FALSE.
+
+!---------- set epsilon (machine precision)
+
+	  r_eps= GRID_eps
+
+!---------- calculate areas (f, f1, f2, f3)
+
+	  r_f = dc_area(r_node1, r_node2, r_node3)
+	  r_f1= dc_area(r_coord, r_node2, r_node3)
+	  r_f2= dc_area(r_coord, r_node1, r_node2)
+	  r_f3= dc_area(r_coord, r_node1, r_node3)
+
+!---------- check if summed area is bigger than triangle area
+
+	  r_sum= r_f1+ r_f2+ r_f3
+	  if((r_sum- r_f) < r_eps) l_in= .TRUE.
+
+	  RETURN
+	  END FUNCTION in_side
+
+!*****************************************************************
+	  SUBROUTINE slm_initslot(p_ghand, l_initialize)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)                     :: p_ghand
+	  LOGICAL, OPTIONAL                                  :: l_initialize
+
+	  INTEGER                                            :: i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_coo
+	  INTEGER, DIMENSION(1)                              :: i_valind
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(54)
+	  END IF
+
+!---------- initialize values to zero if requested
+	  
+	  IF(present(l_initialize) .AND. l_initialize) r_aux= 0._GRID_SR
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- compute values for slotted cylinder
+
+      CALL compute_slot(i_num, r_coo, r_aux(1,:))
+
+!---------- update grid information
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_initslot
+
+!*****************************************************************
+	  SUBROUTINE compute_slot(i_num, r_coo, r_aux)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  INTEGER                                          :: i_num
+	  REAL (KIND = GRID_SR), DIMENSION(:)              :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:)            :: r_coo
+
+	  INTEGER                                          :: i_count
+	  REAL (KIND = GRID_SR)                            :: r_rds, r_ras, r_rad, &
+	    r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_tmp, &
+	    r_nw, r_sw, r_ne, r_se, r_centr
+	  LOGICAL                                          :: l_aux
+
+!---------- initialize some constants for the slotted cylinder
+
+	  r_centr= r_cntr
+	  r_rds= r_srd* r_srd
+	  r_ras= dot_product(r_centr, r_centr)
+	  r_rad= sqrt(r_ras)
+	  
+	  r_nw= r_centr + (/ -r_srd*r_onethird , r_srd*r_twothird /)
+	  r_se= r_centr + (/ r_srd*r_onethird , -r_srd*2 /)
+	  r_ne= r_centr + (/ r_srd*r_onethird , r_srd*r_twothird /)
+	  r_sw= r_centr + (/ -r_srd*r_onethird , -r_srd*2 /)
+	
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_aux(i_count)= 0.0_GRID_SR
+	    r_tmp(:)      = r_coo(:,i_count)- r_centr(:)
+	    r_dpt= dot_product(r_tmp, r_tmp)
+	    inside: IF(r_dpt < r_rds) THEN
+	      r_aux(i_count)= r_hgt
+	      l_aux= in_side(r_coo(:,i_count), r_nw, r_sw, r_se)
+	      IF(l_aux) r_aux(i_count)= 0.0
+	      l_aux= in_side(r_coo(:,i_count), r_nw, r_se, r_ne)
+	      IF(l_aux) r_aux(i_count)= 0.0
+	    END IF inside
+	  END DO node_loop
+
+	  RETURN
+	  END SUBROUTINE compute_slot
+
+!*****************************************************************
+	  SUBROUTINE slm_initcylndr(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_centr
+	  REAL (KIND = GRID_SR)                                       :: r_rds, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_tmp
+	  INTEGER                                    :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_coo
+	  INTEGER, DIMENSION(1)                       :: i_valind
+
+!---------- initialize some constant for the slotted cylinder
+
+	  r_rds= r_srd* r_srd
+	  r_centr= r_cntr
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(55)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_aux(1,i_count)= 0.0_GRID_SR
+	    r_tmp(:)      = r_coo(:,i_count)- r_centr(:)
+	    r_dpt= dot_product(r_tmp, r_tmp)
+	    inside: IF(r_dpt < r_rds) THEN
+	      r_aux(1,i_count)= r_hgt
+	    END IF inside
+	  END DO node_loop
+
+!---------- update grid information
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_initcylndr
+!*****************************************************************
+	  SUBROUTINE slm_inithump(p_ghand, l_initialize)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)                     :: p_ghand
+	  LOGICAL, OPTIONAL                                  :: l_initialize
+
+	  INTEGER                                            :: i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_coo
+	  INTEGER, DIMENSION(1)                              :: i_valind
+
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(55)
+	  END IF
+
+!---------- get information
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_getinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux, &
+	    r_nodecoordinates= r_coo)
+
+!---------- initialize values to zero if requested
+
+	  IF(present(l_initialize) .AND. l_initialize) r_aux= 0._GRID_SR
+
+!---------- compute values for Gaussian hump
+
+      CALL compute_hump(i_num, r_coo, r_aux(1,:))
+
+!---------- update grid information
+
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_inithump
+!*****************************************************************
+	  SUBROUTINE compute_hump(i_num, r_coo, r_aux)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  INTEGER                                          :: i_num
+	  REAL (KIND = GRID_SR), DIMENSION(:)              :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:)            :: r_coo
+
+	  INTEGER                                          :: i_count
+	  REAL (KIND = GRID_SR)                            :: r_rds, r_dpt, r_rad, r_pr
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_centr, r_tmp
+
+!---------- initialize some constant for the slotted cylinder
+
+	  r_rds= r_srd* r_srd
+	  r_centr= r_hcntr
+	
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_tmp(:)      = r_coo(:,i_count)- r_centr(:)
+	    r_dpt= dot_product(r_tmp, r_tmp)
+	    inside: IF(r_dpt < r_rds) THEN
+	      r_rad= min(sqrt(r_dpt),r_srd)/r_srd
+	      r_pr= GRID_PI* r_rad
+	      r_aux(i_count)= 0.25_GRID_SR* (1+ cos(r_pr))
+	    END IF inside
+	  END DO node_loop
+
+	  RETURN
+	  END SUBROUTINE compute_hump
+
+!*****************************************************************
+	  SUBROUTINE slm_initcone(p_ghand, l_initialize)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)                     :: p_ghand
+	  LOGICAL, OPTIONAL                                  :: l_initialize
+
+	  INTEGER                                            :: i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_coo
+	  INTEGER, DIMENSION(1)                              :: i_valind
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(55)
+	  END IF
+
+!---------- get information
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_getinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux, &
+	    r_nodecoordinates= r_coo)
+
+!---------- initialize values to zero if requested
+	  
+	  IF(present(l_initialize) .AND. l_initialize) r_aux= 0._GRID_SR
+
+!---------- compute values for cone
+
+      CALL compute_cone(i_num, r_coo, r_aux(1,:))
+
+!---------- update grid information
+
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_initcone
+!*****************************************************************
+	  SUBROUTINE compute_cone(i_num, r_coo, r_aux)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  INTEGER                                          :: i_num
+	  REAL (KIND = GRID_SR), DIMENSION(:)              :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:)            :: r_coo
+
+	  INTEGER                                          :: i_count
+	  REAL (KIND = GRID_SR)                            :: r_rds, r_dpt, r_rad, r_pr
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_centr, r_tmp
+
+!---------- initialize some constant for the slotted cylinder
+
+	  r_rds= r_srd* r_srd
+	  r_centr= r_ccntr
+	
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_tmp(:)      = r_coo(:,i_count)- r_centr(:)
+	    r_dpt= dot_product(r_tmp, r_tmp)
+	    inside: IF(r_dpt < r_rds) THEN
+	      r_rad= min(sqrt(r_dpt),r_srd)
+	      r_aux(i_count)= -(r_hgt/r_srd)* r_rad + r_hgt
+	    END IF inside
+	  END DO node_loop
+
+	  RETURN
+	  END SUBROUTINE compute_cone
+
+	END MODULE SLM_initial
diff --git a/flash2d/src/options/SLM_initial.m3.f90 b/flash2d/src/options/SLM_initial.m3.f90
new file mode 100644
index 0000000..36b70bb
--- /dev/null
+++ b/flash2d/src/options/SLM_initial.m3.f90
@@ -0,0 +1,363 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_initial
+! FUNCTION:
+!	initialize slotted cylinder for semi-Lagrangian advection
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialvalues
+! FUNCTION:
+!	initialize a grid with values
+! SYNTAX:
+!	CALL slm_initialvalues(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initm3
+! FUNCTION:
+!	initialize a grid with values of slotted cylinder test case
+! SYNTAX:
+!	CALL slm_initm3(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_analyticsolution
+! FUNCTION:
+!	calculates the 'analytic solution' to compare with in diagnostics
+! SYNTAX:
+!	CALL slm_analyticsolution(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initcylndr
+! FUNCTION:
+!	initialize a grid with values of a cylinder test case
+! SYNTAX:
+!	CALL slm_initcylndr(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_centr: coordinates of cyl. centre	REAL
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	in_side
+! FUNCTION:
+!	checks, if a given point (x,y) lies within a given triangle
+! SYNTAX:
+!	logical= in_side(real.arr, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	r_coord: coordinate array		REAL
+!	r_node1: node1 of triangle		REAL
+!	r_node2: node2 of triangle		REAL
+!	r_node3: node3 of triangle		REAL
+! ON OUTPUT:
+!	l_in:    .true. if r_coord \in p_elem	logical
+! CALLS:
+!
+! COMMENTS:
+!	this routine decides whether a point lies in or out of a
+!	triangle. this is done with the following approach:
+!	calculate the area for the given triangle and for the 
+!	three triangles resulting from drawing lines from the given
+!	point to all three triangle nodes.
+!	if the sum of the areas of those three trianlges exceeds
+!	the area of the given trianlge, the the point lies outside
+!	of it.
+!	for calculation of the areas following formula is used:
+!	(Herons formula(?))
+!
+!	A = sqrt(s* (s- a)* (s- b)* (s- c)),
+!
+!	where s= 1/2* (a+ b+ c)
+!	      a, b, c sides.
+!
+!	in order to calculate the sidelengths |x-y|= sqrt(x**2-y**2)
+!	the complex absolute value intrinsic function is used.
+!	hopefully this fuction is faster than using sqrt and
+!	power-of-two instead.
+!
+!	internally double precision is used in this function, because
+!	machine precision is crucial when a coordinate pair appears
+!	near the edge or corner of an element.
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	dc_area
+! FUNCTION:
+!	calculate area of a triangle (in a plain) in double precision
+! SYNTAX:
+!	real= dc_area(real.arr, real.arr, real.arr)
+! ON INPUT:
+!	r_coord1: node1 of triangle			REAL
+!	r_coord2: node2 of triangle			REAL
+!	r_coord3: node3 of triangle			REAL
+! ON OUTPUT:
+!	r_area:   area of triangle			REAL
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_initialvalues, slm_analyticsolution
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	7/97
+!	2. names changed		j. behrens	7/97
+!	3. changed to use GRID_api	j. behrens	11/97
+!	4. changed interfaces		j. behrens	12/97
+!	5. compliant to amatos 1.0	j. behrens	12/2000
+!	6. compliant to amatos 1.2	j. behrens	3/2002
+!	7. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_initial
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC slm_initialvalues, slm_analyticsolution
+	  REAL (KIND = GRID_SR)                            :: r_hgt=1.0
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_initialvalues(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  INTEGER                                    :: i_lev= 6
+
+!---------- initialize some constant for the slotted cylinder
+
+	  CALL slm_initm3(p_ghand)
+
+	  RETURN
+	  END SUBROUTINE slm_initialvalues
+!*****************************************************************
+	  SUBROUTINE slm_analyticsolution(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)              :: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  INTEGER, INTENT(in)                         :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)       :: r_array
+
+!---------- loop over the nodes
+
+	  r_array(1:i_arlen)= 0.0_GRID_SR
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsolution
+
+!*****************************************************************
+	  FUNCTION dc_area(r_coord1, r_coord2, r_coord3) RESULT (r_area)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord1, r_coord2, r_coord3
+	  REAL (KIND = GRID_DR)                            :: r_area
+	  REAL (KIND = GRID_DR)                            :: r_c
+	  REAL (KIND = GRID_DR), DIMENSION(GRID_dimension) :: r_a, r_b
+	  INTEGER                                     :: i_cnt
+
+!---------- calculate vector components
+
+	  dim_loop: DO i_cnt=1, GRID_dimension
+	    r_a(i_cnt)= REAL((r_coord2(i_cnt)- r_coord1(i_cnt)),GRID_DR)
+	    r_b(i_cnt)= REAL((r_coord3(i_cnt)- r_coord1(i_cnt)),GRID_DR)
+	  END DO dim_loop
+
+!---------- calculate components (a,b,c) of cross product vector
+
+	  r_c= (r_a(1)* r_b(2)- r_a(2)* r_b(1))
+
+!---------- calculate area
+
+	  r_area= abs(r_c)* 0.5_GRID_DR
+
+	  RETURN
+	  END FUNCTION dc_area
+
+!*****************************************************************
+	  FUNCTION in_side(r_coord, r_node1, r_node2, r_node3) RESULT (l_in)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_node1, r_node2, r_node3
+	  LOGICAL                                     :: l_in
+	  REAL (KIND = GRID_DR)                            :: r_sum, r_f, r_f1, r_f2, r_f3
+	  REAL (KIND = GRID_DR)                            :: r_eps
+
+!---------- set in_side value to out
+
+ 	  l_in= .FALSE.
+
+!---------- set epsilon (machine precision)
+
+	  r_eps= GRID_eps
+
+!---------- calculate areas (f, f1, f2, f3)
+
+	  r_f = dc_area(r_node1, r_node2, r_node3)
+	  r_f1= dc_area(r_coord, r_node2, r_node3)
+	  r_f2= dc_area(r_coord, r_node1, r_node2)
+	  r_f3= dc_area(r_coord, r_node1, r_node3)
+
+!---------- check if summed area is bigger than triangle area
+
+	  r_sum= r_f1+ r_f2+ r_f3
+	  if((r_sum- r_f) < r_eps) l_in= .TRUE.
+
+	  RETURN
+	  END FUNCTION in_side
+
+!*****************************************************************
+	  SUBROUTINE slm_initm3(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  REAL (KIND = GRID_DR), DIMENSION(GRID_dimension)            :: r_centr
+	  REAL (KIND = GRID_DR)                                       :: r_rds1, r_rds2
+	  REAL (KIND = GRID_DR), DIMENSION(GRID_dimension)            :: r_p1, r_p2, r_p3, &
+	    r_pa, r_pb, r_pc, r_tmp
+	  INTEGER                                    :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_DR), DIMENSION(:,:), ALLOCATABLE          :: r_aux
+	  REAL (KIND = GRID_DR), DIMENSION(:,:), ALLOCATABLE          :: r_coo
+	  REAL (KIND = GRID_DR), PARAMETER                            :: r_dia1=0.18
+	  REAL (KIND = GRID_DR), PARAMETER                            :: r_dia2=0.08
+	  INTEGER, DIMENSION(1)                       :: i_valind
+
+!---------- initialize some constants for the slotted cylinder
+
+	  r_centr= (/ 0.3_GRID_SR, -0.1_GRID_SR /)
+	  r_rds1= r_dia1* r_dia1
+	  r_rds2= r_dia2* r_dia2
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(59)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_aux(1,i_count)= 0.0
+
+!---------- the M
+
+	    r_pa= (/ -0.45_GRID_SR, 0.25_GRID_SR /); r_pb= (/ -0.45_GRID_SR, -0.25_GRID_SR /); r_pc= (/ -0.35_GRID_SR, 0.15_GRID_SR /)
+	    IF(in_side(r_coo(:,i_count), r_pa, r_pb, r_pc)) r_aux(1,i_count)= r_hgt
+	    r_pa= (/ -0.45_GRID_SR, -0.25_GRID_SR /); r_pb= (/ -0.35_GRID_SR, -0.25_GRID_SR /); r_pc= (/ -0.35_GRID_SR, 0.15_GRID_SR /)
+	    IF(in_side(r_coo(:,i_count), r_pa, r_pb, r_pc)) r_aux(1,i_count)= r_hgt
+	    r_pa= (/ -0.45_GRID_SR, 0.25_GRID_SR /); r_pb= (/ -0.2_GRID_SR, 0.0_GRID_SR /); r_pc= (/ 0.05_GRID_SR, 0.25_GRID_SR /)
+	    IF(in_side(r_coo(:,i_count), r_pa, r_pb, r_pc)) r_aux(1,i_count)= r_hgt
+	      r_p1= (/ -0.45_GRID_SR, 0.35_GRID_SR /); r_p2= (/ -0.2_GRID_SR, 0.1_GRID_SR /); r_p3= (/ 0.05_GRID_SR, 0.35_GRID_SR /)
+	      IF(in_side(r_coo(:,i_count), r_p1, r_p2, r_p3)) r_aux(1,i_count)= 0.0
+	    r_pa= (/ 0.05_GRID_SR, 0.25_GRID_SR /); r_pb= (/ -0.05_GRID_SR, 0.15_GRID_SR /); r_pc= (/ 0.05_GRID_SR, -0.25_GRID_SR /)
+	    IF(in_side(r_coo(:,i_count), r_pa, r_pb, r_pc)) r_aux(1,i_count)= r_hgt
+	    r_pa= (/ -0.05_GRID_SR, -0.25_GRID_SR /); r_pb= (/ 0.05_GRID_SR, -0.25_GRID_SR /); r_pc= (/ -0.05_GRID_SR, 0.15_GRID_SR /)
+	    IF(in_side(r_coo(:,i_count), r_pa, r_pb, r_pc)) r_aux(1,i_count)= r_hgt
+
+!---------- the 3
+
+	    r_pa= (/ 0.15_GRID_SR, 0.15_GRID_SR /); r_pb= (/ 0.45_GRID_SR, 0.15_GRID_SR /); r_pc= (/ 0.15_GRID_SR, 0.25_GRID_SR /)
+	    IF(in_side(r_coo(:,i_count), r_pa, r_pb, r_pc)) r_aux(1,i_count)= r_hgt
+	    r_pa= (/ 0.15_GRID_SR, 0.25_GRID_SR /); r_pb= (/ 0.45_GRID_SR, 0.15_GRID_SR /); r_pc= (/ 0.45_GRID_SR, 0.25_GRID_SR /)
+	    IF(in_side(r_coo(:,i_count), r_pa, r_pb, r_pc)) r_aux(1,i_count)= r_hgt
+	    r_pa= (/ 0.25_GRID_SR, 0.05_GRID_SR /); r_pb= (/ 0.35_GRID_SR, 0.05_GRID_SR /); r_pc= (/ 0.35_GRID_SR, 0.15_GRID_SR /)
+	    IF(in_side(r_coo(:,i_count), r_pa, r_pb, r_pc)) r_aux(1,i_count)= r_hgt
+	    r_pa= (/ 0.35_GRID_SR, 0.05_GRID_SR /); r_pb= (/ 0.45_GRID_SR, 0.15_GRID_SR /); r_pc= (/ 0.35_GRID_SR, 0.15_GRID_SR /)
+	    IF(in_side(r_coo(:,i_count), r_pa, r_pb, r_pc)) r_aux(1,i_count)= r_hgt
+	    r_tmp(:)        = r_coo(:,i_count)- r_centr(:)
+	    inside: IF(dot_product(r_tmp, r_tmp) < r_rds1) THEN
+	      r_aux(1,i_count)= r_hgt
+	      IF(dot_product(r_tmp, r_tmp) < r_rds2) r_aux(1,i_count)= 0.0_GRID_SR
+	      r_p1= (/ 0.06_GRID_SR, -0.25_GRID_SR /); r_p2= (/ 0.3_GRID_SR, -0.1_GRID_SR /); r_p3= (/ 0.06_GRID_SR, 0.05_GRID_SR /)
+	      IF(in_side(r_coo(:,i_count), r_p1, r_p2, r_p3)) r_aux(1,i_count)= 0.0_GRID_SR
+	      r_p1= (/ 0.28_GRID_SR, -0.1_GRID_SR /); r_p2= (/ 0.28_GRID_SR, 0.14_GRID_SR /); r_p3= (/ 0.06_GRID_SR, 0.05_GRID_SR /)
+	      IF(in_side(r_coo(:,i_count), r_p1, r_p2, r_p3)) r_aux(1,i_count)= 0.0_GRID_SR
+	    END IF inside
+	  END DO node_loop
+
+!---------- update grid information
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_initm3
+
+
+	END MODULE SLM_initial
diff --git a/flash2d/src/options/SLM_initial.nowind.f90 b/flash2d/src/options/SLM_initial.nowind.f90
new file mode 100644
index 0000000..6d3b90b
--- /dev/null
+++ b/flash2d/src/options/SLM_initial.nowind.f90
@@ -0,0 +1,496 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_initial
+! FUNCTION:
+!	initialize values for semi-Lagrangian advection
+!	provides slm_analyticsolution to evaluate error and mass 
+!	conservation
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialvalues
+! FUNCTION:
+!	initialize a grid with values
+! SYNTAX:
+!	CALL slm_initialvalues(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initslottedcylinder
+! FUNCTION:
+!	initialize a grid with values of sliced sphere test case
+! SYNTAX:
+!	CALL slm_initslottedcylinder(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initcosinebell
+! FUNCTION:
+!	initialize a grid with values of a cosine bell 
+!	(convergence test case)
+! SYNTAX:
+!	CALL slm_initcosinebell(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+! NAME:
+!	slm_analyticsolution
+! FUNCTION:
+!	calculates the 'analytic solution' to compare with in diagnostics
+! SYNTAX:
+!	CALL slm_analyticsolution(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for three dimensions only
+!
+!-----------------------------------------------------------------
+! NAME:
+!	slm_analyticsol_slottedcylinder
+! FUNCTION:
+!	calculates the 'analytic solution' for the slotted cylinder with
+!	a circular windfield 1 revolution/day
+! SYNTAX:
+!	CALL slm_analyticsol_slottedcylinder(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+! NAME:
+!	slm_analyticsol_cosinebell
+! FUNCTION:
+!	calculates the 'analytic solution' for a cosine bell with
+!	circular windfield 1 revolution/day
+! SYNTAX:
+!	CALL slm_analyticsol_cosinebell(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+! PUBLIC:
+!	slm_initialvalues, slm_analyticsolution
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	7/97
+!	2. names changed		j. behrens	7/97
+!	3. changed to use GRID_api	j. behrens	11/97
+!	4. changed interfaces		j. behrens	12/97
+!	5. compliant to amatos 1.0	j. behrens	12/2000
+!	6. slotted cylinder test case	l. mentrup	12/2003 
+!
+!*****************************************************************
+	MODULE SLM_initial
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC slm_initialvalues, slm_analyticsolution
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_cntr=&
+	  				(/ -0.25_GRID_SR, 0._GRID_SR /)
+	  REAL (KIND = GRID_SR)                            :: r_hgt=4.0_GRID_SR
+	  REAL (KIND = GRID_SR)                            :: r_srd=0.15_GRID_SR
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_initialvalues(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  INTEGER                                    :: i_lev= 6
+
+!---------- initialize some constant for the slotted cylinder
+
+	  CALL slm_initslottedcylinder(p_ghand)
+	  
+!---------- initialize some constant for the cosine bell test case
+
+!	  CALL slm_initcosinebell(p_ghand)
+
+!---------- initialize concentration one everywhere
+
+!	  CALL slm_initoneforall(p_ghand)
+
+	  RETURN
+	  END SUBROUTINE slm_initialvalues
+!*****************************************************************
+	  SUBROUTINE slm_analyticsolution(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)              :: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  INTEGER, INTENT(in)                         :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)       :: r_array
+
+!---------- this is a dummy
+!	  r_array= 0.0_GRID_SR
+	  
+!---------- analyticsolution: cosinebell
+!	  CALL slm_analyticsol_cosinebell(p_ghand, r_time, i_arlen, r_array)
+
+!---------- analyticsolution: ball
+	  CALL slm_analyticsol_slottedcylinder(p_ghand, r_time, i_arlen, r_array)
+
+!---------- analyticsolution: concentration one everywhere
+
+!	  CALL slm_analyticsol_oneforall(p_ghand, r_time, i_arlen, r_array)
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsolution
+	  
+!*****************************************************************
+	  SUBROUTINE slm_analyticsol_slottedcylinder(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)              :: p_ghand
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_centr
+	  REAL (KIND = GRID_SR)                                        :: r_rds, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_tmp
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  REAL (KIND = GRID_SR)					      :: r_PI	
+	  INTEGER, INTENT(in)                         :: i_arlen
+	  INTEGER                                     :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)       :: r_array
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE           :: r_coo
+	  
+
+
+!---------- initialize some constant for the tracer ball
+
+	  r_rds = 0.15_GRID_SR
+
+!---------- here is the crux: where is the center of the ball at time r_time
+
+	  r_centr		= r_cntr
+	  
+!---------- allocate workspace
+	  
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_coo(GRID_dimension,i_num), stat=i_alct)
+          IF(i_alct /= 0) THEN
+		CALL grid_error(55)
+	  END IF	
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+	
+
+!---------- nowind testcase!		
+	  r_array = 0.0
+	  node_loop: DO i_count= 1, i_num
+	    r_tmp(:) = r_coo(:,i_count) - r_centr(:)
+	    r_dpt    = dot_product(r_tmp, r_tmp)**0.5_GRID_SR
+	    r_array(i_count) = 0.
+	    IF(r_dpt <= r_rds .AND. .NOT.(r_tmp(2) <= 0.07_GRID_SR .AND. (r_tmp(1)<=0.03_GRID_SR .AND. r_tmp(1)>=-0.03_GRID_SR))) THEN
+	       r_array(i_count)= r_hgt
+	    END IF
+	  END DO node_loop
+
+	
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_coo)
+
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsol_slottedcylinder
+
+!*****************************************************************
+	  SUBROUTINE slm_initslottedcylinder(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_centr
+	  REAL (KIND = GRID_SR)                                       :: r_rds, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_tmp
+	  INTEGER                                    :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE            :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_coo
+	  INTEGER, DIMENSION(1)                      :: i_valind
+
+!---------- initialize some constant for the sliced sphere
+
+	  r_rds= 0.15_GRID_SR
+	  r_centr= r_cntr
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(55)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_aux(1,i_count)= 0.0_GRID_SR
+	    r_tmp(:)      = r_coo(:,i_count)- r_centr(:)
+	    r_dpt= dot_product(r_tmp, r_tmp)**0.5
+	    inside: IF(r_dpt <= r_rds .AND. &
+	    		.NOT.(r_tmp(2) <= 0.07_GRID_SR .AND. (r_tmp(1)>=-0.03_GRID_SR .AND. r_tmp(1)<=0.03_GRID_SR))) THEN
+	      r_aux(1,i_count)= r_hgt
+	    END IF inside
+	  END DO node_loop
+
+!---------- update grid information
+	  
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_initslottedcylinder
+!*****************************************************************
+	  SUBROUTINE slm_analyticsol_cosinebell(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)              :: p_ghand
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_centr
+	  REAL (KIND = GRID_SR)                                        :: r_rds, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_tmp
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  REAL (KIND = GRID_SR)					      :: r_tim
+	  REAL (KIND = GRID_SR)					      :: r_PI	
+	  INTEGER, INTENT(in)                         :: i_arlen
+	  INTEGER                                     :: i_count, i_num, i_alct, i_step
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)       :: r_array
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE           :: r_coo
+	  
+
+
+!---------- initialize some constant for the tracer ball
+
+	  r_rds = 0.15_GRID_SR
+
+!---------- here is the crux: where is the center of the ball at time r_time
+
+	  r_PI 			= GRID_PI
+	  r_centr= r_cntr
+	  
+
+!---------- allocate workspace
+	  
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_coo(GRID_dimension,i_num), stat=i_alct)
+          IF(i_alct /= 0) THEN
+		CALL grid_error(55)
+	  END IF	
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+	
+
+!---------- for every quarter revolt: test if is node in or out of the sliced sphere and set r_array	  		
+	  r_array = 0.0
+	  node_loop: DO i_count= 1, i_num
+	    r_tmp(:) = r_coo(:,i_count) - r_centr(:)
+	    r_dpt    = dot_product(r_tmp, r_tmp)**0.5_GRID_SR
+	    r_array(i_count) = 0.
+	    IF (r_dpt <= r_srd) THEN
+	      r_array(i_count) = r_hgt* cos(r_dpt*(r_PI/(2*r_srd)))
+	    END IF
+	  END DO node_loop
+
+	
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_coo)
+
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsol_cosinebell
+
+!*****************************************************************
+	  SUBROUTINE slm_initcosinebell(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_centr
+	  REAL (KIND = GRID_SR)                                       :: r_rds, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_tmp
+	  INTEGER                                    :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE            :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_coo
+	  INTEGER, DIMENSION(1)                      :: i_valind
+
+!---------- initialize some constant for the sliced sphere
+
+	  r_rds= 0.15_GRID_SR
+	  r_centr= r_cntr
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(55)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_aux(1,i_count)= 0.0_GRID_SR
+	    r_tmp(:)      = r_coo(:,i_count)- r_centr(:)
+	    r_dpt= dot_product(r_tmp, r_tmp)**0.5
+	    inside: IF(r_dpt <= r_rds) THEN
+	      r_aux(1,i_count)= r_hgt * cos(r_dpt*(GRID_PI/(2*r_rds)))
+	    END IF inside
+	  END DO node_loop
+
+!---------- update grid information
+	  
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_initcosinebell	  
+!*****************************************************************
+	  SUBROUTINE slm_analyticsol_oneforall(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)				:: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)				:: r_time
+	  INTEGER, INTENT(in)						:: i_arlen
+	  INTEGER							:: i_count, i_num, i_alct, i_step
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)	:: r_array
+
+	
+
+!---------- for every quarter revolt: test if is node in or out of the sliced sphere and set r_array	  		
+	  r_array = 1.0
+	  
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsol_oneforall
+      
+!*****************************************************************
+	  SUBROUTINE slm_initoneforall(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             			:: p_ghand
+	  INTEGER                                    			:: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE		:: r_aux
+	  INTEGER, DIMENSION(1)                      			:: i_valind
+
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_aux(1,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(55)
+	  END IF
+
+!----------
+
+	  r_aux= 1.0_GRID_SR
+	 
+
+!---------- update grid information
+	  
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux)
+
+	  RETURN
+	  END SUBROUTINE slm_initoneforall
+
+	END MODULE SLM_initial
diff --git a/flash2d/src/options/SLM_initial.slot.f90 b/flash2d/src/options/SLM_initial.slot.f90
new file mode 100644
index 0000000..2418652
--- /dev/null
+++ b/flash2d/src/options/SLM_initial.slot.f90
@@ -0,0 +1,495 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_initial
+! FUNCTION:
+!	initialize slotted cylinder for semi-Lagrangian advection
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialvalues
+! FUNCTION:
+!	initialize a grid with values
+! SYNTAX:
+!	CALL slm_initialvalues(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initslot
+! FUNCTION:
+!	initialize a grid with values of slotted cylinder test case
+! SYNTAX:
+!	CALL slm_initslot(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_analyticsolution
+! FUNCTION:
+!	calculates the 'analytic solution' to compare with in diagnostics
+! SYNTAX:
+!	CALL slm_analyticsolution(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initcylndr
+! FUNCTION:
+!	initialize a grid with values of a cylinder test case
+! SYNTAX:
+!	CALL slm_initcylndr(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_centr: coordinates of cyl. centre	REAL
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	in_side
+! FUNCTION:
+!	checks, if a given point (x,y) lies within a given triangle
+! SYNTAX:
+!	logical= in_side(real.arr, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	r_coord: coordinate array		REAL
+!	r_node1: node1 of triangle		REAL
+!	r_node2: node2 of triangle		REAL
+!	r_node3: node3 of triangle		REAL
+! ON OUTPUT:
+!	l_in:    .true. if r_coord \in p_elem	logical
+! CALLS:
+!
+! COMMENTS:
+!	this routine decides whether a point lies in or out of a
+!	triangle. this is done with the following approach:
+!	calculate the area for the given triangle and for the 
+!	three triangles resulting from drawing lines from the given
+!	point to all three triangle nodes.
+!	if the sum of the areas of those three trianlges exceeds
+!	the area of the given trianlge, the the point lies outside
+!	of it.
+!	for calculation of the areas following formula is used:
+!	(Herons formula(?))
+!
+!	A = sqrt(s* (s- a)* (s- b)* (s- c)),
+!
+!	where s= 1/2* (a+ b+ c)
+!	      a, b, c sides.
+!
+!	in order to calculate the sidelengths |x-y|= sqrt(x**2-y**2)
+!	the complex absolute value intrinsic function is used.
+!	hopefully this fuction is faster than using sqrt and
+!	power-of-two instead.
+!
+!	internally double precision is used in this function, because
+!	machine precision is crucial when a coordinate pair appears
+!	near the edge or corner of an element.
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	dc_area
+! FUNCTION:
+!	calculate area of a triangle (in a plain) in double precision
+! SYNTAX:
+!	real= dc_area(real.arr, real.arr, real.arr)
+! ON INPUT:
+!	r_coord1: node1 of triangle			REAL
+!	r_coord2: node2 of triangle			REAL
+!	r_coord3: node3 of triangle			REAL
+! ON OUTPUT:
+!	r_area:   area of triangle			REAL
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_initialvalues, slm_analyticsolution
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	7/97
+!	2. names changed		j. behrens	7/97
+!	3. changed to use GRID_api	j. behrens	11/97
+!	4. changed interfaces		j. behrens	12/97
+!	5. compliant to amatos 1.0	j. behrens	12/2000
+!	6. compliant to amatos 1.2	j. behrens	3/2002
+!	7. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_initial
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC slm_initialvalues, slm_analyticsolution
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_cntr=(/ -0.25, 0.0 /)
+	  REAL (KIND = GRID_SR)                            :: r_hgt=4.0
+	  REAL (KIND = GRID_SR)                            :: r_srd=0.15
+	  REAL (KIND = GRID_SR)                            :: r_sln=0.22
+	  REAL (KIND = GRID_SR)                            :: r_swd=0.06
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_initialvalues(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  INTEGER                                    :: i_lev= 6
+
+!---------- initialize some constant for the slotted cylinder
+
+	  cyl_slot: IF(p_ghand%i_maxlvl < i_lev) THEN
+	    CALL slm_initcylndr(p_ghand)
+	  ELSE cyl_slot
+	    CALL slm_initslot(p_ghand)
+	  END IF cyl_slot
+
+	  RETURN
+	  END SUBROUTINE slm_initialvalues
+!*****************************************************************
+	  SUBROUTINE slm_analyticsolution(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)              :: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  INTEGER, INTENT(in)                         :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)       :: r_array
+	  REAL (KIND = GRID_SR)                                        :: r_fac=.363610260832151995e-4
+	  REAL (KIND = GRID_SR)                                        :: r_rds, r_ras, r_rad, &
+	    r_ads, r_bds, r_cds, r_f1, r_f2, r_xya, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_fc, r_p1, r_p2, &
+	    r_pa, r_pb, r_pc, r_pd, r_tmp, r_centr
+	  INTEGER                                     :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE           :: r_coo
+	  LOGICAL                                     :: l_aux
+
+!---------- initialize some constants for the slotted cylinder
+
+	  r_centr(1)= -cos(r_fac* r_time)* 0.25_GRID_SR ! <--- based on 2D
+	  r_centr(2)= -sin(r_fac* r_time)* 0.25_GRID_SR ! <--- based on 2D
+
+	  r_rds= r_srd* r_srd
+	  r_ras= dot_product(r_centr, r_centr)
+	  r_rad= sqrt(r_ras)
+	  r_ads= r_swd* 0.5_GRID_SR
+	  r_bds= r_srd- r_sln
+	  r_cds= r_srd
+	  r_f1 = (r_rad- r_ads)/ r_rad
+	  r_f2 = (r_rad+ r_ads)/ r_rad
+	  r_p1 = abs(r_centr)
+	  r_xya= sum(r_p1)
+	  IF(r_xya == 0.0_GRID_SR) THEN
+	    r_fc= 0.0_GRID_SR
+	  ELSE
+	    r_fc(1)= -r_centr(2)/ r_xya
+	    r_fc(2)=  r_centr(1)/ r_xya
+	  END IF
+
+!---------- calculate endpoints of the slot
+
+	  r_p1= r_f1* r_centr
+	  r_p2= r_f2* r_centr
+
+	  r_pa= r_p1+ r_fc* r_bds
+	  r_pb= r_p1+ r_fc* r_cds
+	  r_pc= r_p2+ r_fc* r_cds
+	  r_pd= r_p2+ r_fc* r_bds
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  IF(i_arlen /= i_num) THEN
+	    CALL grid_error(52)
+	  END IF
+
+	  ALLOCATE(r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(53)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_array(i_count)= 0.0
+	    r_tmp(:)        = r_coo(:,i_count)- r_centr(:)
+	    r_dpt= dot_product(r_tmp, r_tmp)
+	    inside: IF(r_dpt < r_rds) THEN
+	      r_array(i_count)= r_hgt
+	      l_aux= in_side(r_coo(:,i_count), r_pa, r_pb, r_pc)
+	      IF(l_aux) r_array(i_count)= 0.0
+	      l_aux= in_side(r_coo(:,i_count), r_pa, r_pc, r_pd)
+	      IF(l_aux) r_array(i_count)= 0.0
+	    END IF inside
+	  END DO node_loop
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsolution
+
+!*****************************************************************
+	  FUNCTION dc_area(r_coord1, r_coord2, r_coord3) RESULT (r_area)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord1, r_coord2, r_coord3
+	  REAL (KIND = GRID_DR)                            :: r_area
+	  REAL (KIND = GRID_DR)                            :: r_c
+	  REAL (KIND = GRID_DR), DIMENSION(GRID_dimension) :: r_a, r_b
+	  INTEGER                                     :: i_cnt
+
+!---------- calculate vector components
+
+	  dim_loop: DO i_cnt=1, GRID_dimension
+	    r_a(i_cnt)= REAL((r_coord2(i_cnt)- r_coord1(i_cnt)),GRID_DR)
+	    r_b(i_cnt)= REAL((r_coord3(i_cnt)- r_coord1(i_cnt)),GRID_DR)
+	  END DO dim_loop
+
+!---------- calculate components (a,b,c) of cross product vector
+
+	  r_c= (r_a(1)* r_b(2)- r_a(2)* r_b(1))
+
+!---------- calculate area
+
+	  r_area= abs(r_c)* 0.5_GRID_DR
+
+	  RETURN
+	  END FUNCTION dc_area
+
+!*****************************************************************
+	  FUNCTION in_side(r_coord, r_node1, r_node2, r_node3) RESULT (l_in)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_node1, r_node2, r_node3
+	  LOGICAL                                     :: l_in
+	  REAL (KIND = GRID_DR)                            :: r_sum, r_f, r_f1, r_f2, r_f3
+	  REAL (KIND = GRID_DR)                            :: r_eps
+
+!---------- set in_side value to out
+
+ 	  l_in= .FALSE.
+
+!---------- set epsilon (machine precision)
+
+	  r_eps= GRID_eps
+
+!---------- calculate areas (f, f1, f2, f3)
+
+	  r_f = dc_area(r_node1, r_node2, r_node3)
+	  r_f1= dc_area(r_coord, r_node2, r_node3)
+	  r_f2= dc_area(r_coord, r_node1, r_node2)
+	  r_f3= dc_area(r_coord, r_node1, r_node3)
+
+!---------- check if summed area is bigger than triangle area
+
+	  r_sum= r_f1+ r_f2+ r_f3
+	  if((r_sum- r_f) < r_eps) l_in= .TRUE.
+
+	  RETURN
+	  END FUNCTION in_side
+
+!*****************************************************************
+	  SUBROUTINE slm_initslot(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_centr
+	  REAL (KIND = GRID_SR)                                       :: r_rds, r_ras, r_rad, &
+	    r_ads, r_bds, r_cds, r_f1, r_f2, r_xya, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_fc, r_p1, r_p2, &
+	    r_pa, r_pb, r_pc, r_pd, r_tmp
+	  INTEGER                                    :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_coo
+	  LOGICAL                                     :: l_aux
+	  INTEGER, DIMENSION(1)                       :: i_valind
+
+!---------- initialize some constants for the slotted cylinder
+
+	  r_centr= r_cntr
+	  r_rds= r_srd* r_srd
+	  r_ras= dot_product(r_centr, r_centr)
+	  r_rad= sqrt(r_ras)
+	  r_ads= r_swd* 0.5_GRID_SR
+	  r_bds= r_srd- r_sln
+	  r_cds= r_srd
+	  r_f1 = (r_rad- r_ads)/ r_rad
+	  r_f2 = (r_rad+ r_ads)/ r_rad
+	  r_p1 = abs(r_centr)
+	  r_xya= sum(r_p1)
+	  IF(r_xya == 0.0_GRID_SR) THEN
+	    r_fc= 0.0_GRID_SR
+	  ELSE
+	    r_fc(1)= -r_centr(2)/ r_xya
+	    r_fc(2)=  r_centr(1)/ r_xya
+	  END IF
+
+!---------- calculate endpoints of the slot
+
+	  r_p1= r_f1* r_centr
+	  r_p2= r_f2* r_centr
+
+	  r_pa= r_p1+ r_fc* r_bds
+	  r_pb= r_p1+ r_fc* r_cds
+	  r_pc= r_p2+ r_fc* r_cds
+	  r_pd= r_p2+ r_fc* r_bds
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(54)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_aux(1,i_count)= 0.0_GRID_SR
+	    r_tmp(:)        = r_coo(:,i_count)- r_centr(:)
+	    r_dpt= dot_product(r_tmp, r_tmp)
+	    inside: IF(r_dpt < r_rds) THEN
+	      r_aux(1,i_count)= r_hgt
+	      l_aux= in_side(r_coo(:,i_count), r_pa, r_pb, r_pc)
+	      IF(l_aux) r_aux(1,i_count)= 0.0
+	      l_aux= in_side(r_coo(:,i_count), r_pa, r_pc, r_pd)
+	      IF(l_aux) r_aux(1,i_count)= 0.0
+	    END IF inside
+	  END DO node_loop
+
+!---------- update grid information
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_initslot
+
+!*****************************************************************
+	  SUBROUTINE slm_initcylndr(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_centr
+	  REAL (KIND = GRID_SR)                                       :: r_rds, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_tmp
+	  INTEGER                                    :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_coo
+	  INTEGER, DIMENSION(1)                       :: i_valind
+
+!---------- initialize some constant for the slotted cylinder
+
+	  r_rds= r_srd* r_srd
+	  r_centr= r_cntr
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(55)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_aux(1,i_count)= 0.0_GRID_SR
+	    r_tmp(:)      = r_coo(:,i_count)- r_centr(:)
+	    r_dpt= dot_product(r_tmp, r_tmp)
+	    inside: IF(r_dpt < r_rds) THEN
+	      r_aux(1,i_count)= r_hgt
+	    END IF inside
+	  END DO node_loop
+
+!---------- update grid information
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_initcylndr
+
+	END MODULE SLM_initial
diff --git a/flash2d/src/options/SLM_initial.tum.f90 b/flash2d/src/options/SLM_initial.tum.f90
new file mode 100644
index 0000000..7d816a6
--- /dev/null
+++ b/flash2d/src/options/SLM_initial.tum.f90
@@ -0,0 +1,223 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_initial
+! FUNCTION:
+!	initialize slotted cylinder for semi-Lagrangian advection
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialvalues
+! FUNCTION:
+!	initialize a grid with values
+! SYNTAX:
+!	CALL slm_initialvalues(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initbar
+! FUNCTION:
+!	initialize a grid with values of a bar
+! SYNTAX:
+!	CALL slm_initbar(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_analyticsolution
+! FUNCTION:
+!	calculates the 'analytic solution' to compare with in diagnostics
+! SYNTAX:
+!	CALL slm_analyticsolution(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_initialvalues, slm_analyticsolution
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	7/97
+!	2. names changed		j. behrens	7/97
+!	3. changed to use GRID_api	j. behrens	11/97
+!	4. changed interfaces		j. behrens	12/97
+!	5. compliant to amatos 1.0	j. behrens	12/2000
+!	6. compliant to amatos 1.2	j. behrens	3/2002
+!	7. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_initial
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC slm_initialvalues, slm_analyticsolution
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_cntr=(/ -0.25, 0.0 /)
+	  REAL (KIND = GRID_SR)                            :: r_hgt=4.0
+	  REAL (KIND = GRID_SR)                            :: r_srd=0.15
+	  REAL (KIND = GRID_SR)                            :: r_sln=0.22
+	  REAL (KIND = GRID_SR)                            :: r_swd=0.06
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_initialvalues(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+
+!---------- initialize some constant for the slotted cylinder
+
+	  CALL slm_initbar(p_ghand)
+
+	  RETURN
+	  END SUBROUTINE slm_initialvalues
+!*****************************************************************
+	  SUBROUTINE slm_analyticsolution(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)              :: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  INTEGER, INTENT(in)                         :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)       :: r_array
+
+!---------- dummy routine
+
+	  r_array= 0.0_GRID_SR
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsolution
+
+!*****************************************************************
+	  SUBROUTINE slm_initbar(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  INTEGER                                    :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_DR), DIMENSION(:,:), ALLOCATABLE :: r_aux
+	  REAL (KIND = GRID_DR), DIMENSION(:,:), ALLOCATABLE :: r_coo
+	  REAL (KIND = GRID_DR), DIMENSION(GRID_dimension)   :: p_1, p_2, p_3, p_4, &
+	    p_5, p_6, p_7, p_8, p_9, p_10, p_11, p_12, p_13, p_14, p_15, p_16
+	  INTEGER, DIMENSION(1)                      :: i_valind
+
+!---------- initialize some constants for the Logo
+
+	  p_1=  (/ -0.375_GRID_SR,  0.0375_GRID_SR /)
+	  p_2=  (/  -0.35_GRID_SR, -0.0625_GRID_SR /)
+	  p_3=  (/ -0.325_GRID_SR,  0.0375_GRID_SR /)
+	  p_4=  (/   -0.3_GRID_SR, -0.0375_GRID_SR /)
+	  p_5=  (/   -0.3_GRID_SR, -0.0625_GRID_SR /)
+	  p_6=  (/ -0.275_GRID_SR,  0.0375_GRID_SR /)
+	  p_7=  (/ -0.275_GRID_SR,  0.0625_GRID_SR /)
+	  p_8=  (/  -0.25_GRID_SR,  0.0375_GRID_SR /)
+	  p_9=  (/  -0.25_GRID_SR, -0.0375_GRID_SR /)
+	  p_10= (/ -0.225_GRID_SR, -0.0375_GRID_SR /)
+	  p_11= (/ -0.225_GRID_SR,  0.0375_GRID_SR /)
+	  p_12= (/   -0.2_GRID_SR, -0.0625_GRID_SR /)
+	  p_13= (/ -0.175_GRID_SR,  0.0375_GRID_SR /)
+	  p_14= (/  -0.15_GRID_SR, -0.0625_GRID_SR /)
+	  p_15= (/ -0.125_GRID_SR,  0.0375_GRID_SR /)
+	  p_16= (/ -0.125_GRID_SR,  0.0625_GRID_SR /)
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(51)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_aux(1,i_count)= 0.0_GRID_SR
+	    inside: IF(inoutrect(r_coo(:,i_count),p_1,p_7) .OR. &
+	               inoutrect(r_coo(:,i_count),p_2,p_3) .OR. &
+	               inoutrect(r_coo(:,i_count),p_4,p_6) .OR. &
+	               inoutrect(r_coo(:,i_count),p_5,p_10) .OR. &
+	               inoutrect(r_coo(:,i_count),p_9,p_11) .OR. &
+	               inoutrect(r_coo(:,i_count),p_8,p_16) .OR. &
+	               inoutrect(r_coo(:,i_count),p_12,p_13) .OR. &
+	               inoutrect(r_coo(:,i_count),p_14,p_15)) THEN
+	      r_aux(1,i_count)= r_hgt
+	    END IF inside
+	  END DO node_loop
+
+!---------- update grid information
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_initbar
+
+!*****************************************************************
+	  FUNCTION inoutrect(r_coo, r_sw, r_ne) RESULT (l_inout)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  REAL (KIND = GRID_DR), DIMENSION(GRID_dimension), INTENT(in) :: r_coo, r_sw, r_ne
+	  LOGICAL                                     :: l_inout
+
+!---------- initialize output
+
+	  l_inout= .FALSE.
+
+	  inside: IF((r_coo(1)>r_sw(1) .AND. r_coo(1)<r_ne(1)) .AND. &
+	             (r_coo(2)>r_sw(2) .AND. r_coo(2)<r_ne(2))) THEN !! CAUTION 2D ONLY !!
+	    l_inout= .TRUE.
+	  END IF inside
+
+	  END FUNCTION inoutrect
+
+	END MODULE SLM_initial
diff --git a/flash2d/src/options/SLM_initial.vortex.f90 b/flash2d/src/options/SLM_initial.vortex.f90
new file mode 100644
index 0000000..24f889f
--- /dev/null
+++ b/flash2d/src/options/SLM_initial.vortex.f90
@@ -0,0 +1,272 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_initial
+! FUNCTION:
+!	initialize values for semi-Lagrangian advection
+!	provides slm_analyticsolution to evaluate error and mass 
+!	conservation (when vortex test case is applied)
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialvalues
+! FUNCTION:
+!	initialize a grid with values
+! SYNTAX:
+!	CALL slm_initialvalues(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initvortex
+! FUNCTION:
+!	initialize a grid with values of initial vortex conditions
+! see: Doswell 1984, Nair 2006
+! SYNTAX:
+!	CALL slm_initvortex(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+! NAME:
+!	slm_analyticsolution
+! FUNCTION:
+!	calculates the analytic solution to compare with in diagnostics
+! SYNTAX:
+!	CALL slm_analyticsolution(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+! PUBLIC:
+!	slm_initialvalues, slm_analyticsolution
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		l.mentrup    12/06
+!
+!*****************************************************************
+	MODULE SLM_initial
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC slm_initialvalues, slm_analyticsolution
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_center = (/ 0._GRID_SR, 0._GRID_SR /)
+		REAL (KIND = GRID_SR) 													 :: r_delta  = 0.05_GRID_SR 					! controls the width of the decay from value 2 to value 0
+		REAL (KIND = GRID_SR)                            :: r_vnot   = 2.598_GRID_SR					! tangential velocity such that omega < 1. 
+		REAL (KIND = GRID_SR)                            :: r_scale  = 86400._GRID_SR 				! scale on one day
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_initialvalues(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  INTEGER                                    :: i_lev= 6
+
+!---------- initialize vortex
+	  CALL slm_initvortex(p_ghand)
+
+	  RETURN
+	  END SUBROUTINE slm_initialvalues
+!*****************************************************************
+	  SUBROUTINE slm_analyticsolution(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)                               :: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  INTEGER, INTENT(in)                                          :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)       :: r_array
+
+!---------- this is a dummy
+!	  r_array= 0.0_GRID_SR
+	  
+!---------- analyticsolution: vortex
+	  CALL slm_analyticsol_vortex(p_ghand, r_time, i_arlen, r_array)
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsolution
+	  
+!*****************************************************************
+	  SUBROUTINE slm_analyticsol_vortex(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)                               :: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  INTEGER, INTENT(in)                                          :: i_arlen
+		
+		REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)       :: r_array
+
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE           :: r_coo		
+	  REAL (KIND = GRID_SR)                                        :: r_x, r_y, r_xc, r_yc
+	  REAL (KIND = GRID_SR)                                        :: r_r
+		REAL (KIND = GRID_SR)                                        :: r_dlt 								! controls the width of the decay from value 2 to value 0
+	  REAL (KIND = GRID_SR)                                        :: r_t
+		REAL (KIND = GRID_SR)                                        :: r_tanh
+	  REAL (KIND = GRID_SR)                                        :: r_vt, r_omg
+		REAL (KIND = GRID_SR)                                        :: r_eps = 1.E-6_GRID_SR
+		REAL (KIND = GRID_SR)                                        :: r_twopi 							! scale the domain from [-0.5,0,5]to [-Pi, Pi]
+
+	  INTEGER                                                      :: i_count, i_num, i_alct
+	 
+!---------- initialize some values
+    r_twopi = GRID_PI * 2._GRID_SR
+		
+		
+	  r_xc     = r_center(1) * r_twopi
+		r_yc     = r_center(2) * r_twopi
+		r_dlt    = r_delta
+
+!---------- here is the crux: what is the distribution at time r_time
+  
+	  r_t = r_time
+		write(*,*) r_t
+
+!---------- allocate workspace
+	  
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_coo(GRID_dimension,i_num), stat=i_alct)
+    IF(i_alct /= 0) THEN
+		  CALL grid_error(55)
+	  END IF	
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!----------	compute analytic solution (ref. to Nair 2006, Appl. Num. Math.)  		
+		
+    node_loop: DO i_count= 1, i_num
+		  r_x = r_coo(1,i_count) * r_twopi
+			r_y = r_coo(2,i_count) * r_twopi
+			
+			r_r = twonorm((/r_x - r_xc, r_y - r_yc/))	
+			
+			IF (r_r <= r_eps) THEN
+			  r_array(i_count) = 1._GRID_SR
+			ELSE
+			  r_tanh = tanh(r_r)
+		    r_vt   = (1._GRID_SR - r_tanh*r_tanh) * r_tanh * r_vnot * GRID_PI / r_scale
+		    r_omg  = r_vt / r_r
+				r_array(i_count) = tanh( ((r_y - r_yc)/r_dlt * cos(r_omg * r_t)) - &
+			                           ((r_x - r_xc)/r_dlt * sin(r_omg * r_t)) ) + 1._GRID_SR
+			END IF
+    END DO node_loop
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_coo)
+
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsol_vortex
+!*****************************************************************
+	  SUBROUTINE slm_initvortex(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)                              :: p_ghand
+		
+	  REAL (KIND = GRID_SR)                                       :: r_y
+	  REAL (KIND = GRID_SR)                                       :: r_dlt				! controls the width of the decay from value 2 to value 0
+		REAL (KIND = GRID_SR)                                       :: r_twopi			! scale the domain from [-0.5,0,5]to [-Pi, Pi]
+		
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)            :: r_tmp
+	  INTEGER                                                     :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE          :: r_coo
+	  INTEGER, DIMENSION(1)                                       :: i_valind
+
+!---------- initialize some constant for the slotted cylinder
+
+	  
+		r_dlt = r_delta
+				
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(55)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- loop over the nodes
+    
+		r_twopi = GRID_PI * 2._GRID_SR				
+		
+	  node_loop: DO i_count= 1, i_num
+		  r_y = r_coo(2, i_count) * r_twopi
+	    r_aux(1,i_count)= tanh((r_y - r_center(2)) / r_dlt) + 1._GRID_SR
+	  END DO node_loop
+
+!---------- update grid information
+
+	  i_valind = (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint= i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_initvortex
+!*****************************************************************
+    FUNCTION twonorm(r_vector) RESULT(r_nrm)
+		
+		IMPLICIT NONE
+
+		REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)           :: r_vector
+		REAL (KIND = GRID_SR)                                      :: r_nrm
+		
+		INTEGER                                                    :: i_cnt
+		
+		r_nrm = 0._GRID_SR
+		r_nrm = dot_product(r_vector,r_vector)		
+		r_nrm = sqrt(r_nrm)
+		
+		END FUNCTION twonorm
+		
+
+	END MODULE SLM_initial
diff --git a/flash2d/src/options/SLM_initial.xmas.f90 b/flash2d/src/options/SLM_initial.xmas.f90
new file mode 100644
index 0000000..09b4819
--- /dev/null
+++ b/flash2d/src/options/SLM_initial.xmas.f90
@@ -0,0 +1,415 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_initial
+! FUNCTION:
+!	initialize slotted cylinder for semi-Lagrangian advection
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialvalues
+! FUNCTION:
+!	initialize a grid with values
+! SYNTAX:
+!	CALL slm_initialvalues(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initslot
+! FUNCTION:
+!	initialize a grid with values of slotted cylinder test case
+! SYNTAX:
+!	CALL slm_initslot(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_analyticsolution
+! FUNCTION:
+!	calculates the 'analytic solution' to compare with in diagnostics
+! SYNTAX:
+!	CALL slm_analyticsolution(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initcylndr
+! FUNCTION:
+!	initialize a grid with values of a cylinder test case
+! SYNTAX:
+!	CALL slm_initcylndr(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_centr: coordinates of cyl. centre	REAL
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	in_side
+! FUNCTION:
+!	checks, if a given point (x,y) lies within a given triangle
+! SYNTAX:
+!	logical= in_side(real.arr, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	r_coord: coordinate array		REAL
+!	r_node1: node1 of triangle		REAL
+!	r_node2: node2 of triangle		REAL
+!	r_node3: node3 of triangle		REAL
+! ON OUTPUT:
+!	l_in:    .true. if r_coord \in p_elem	logical
+! CALLS:
+!
+! COMMENTS:
+!	this routine decides whether a point lies in or out of a
+!	triangle. this is done with the following approach:
+!	calculate the area for the given triangle and for the 
+!	three triangles resulting from drawing lines from the given
+!	point to all three triangle nodes.
+!	if the sum of the areas of those three trianlges exceeds
+!	the area of the given trianlge, the the point lies outside
+!	of it.
+!	for calculation of the areas following formula is used:
+!	(Herons formula(?))
+!
+!	A = sqrt(s* (s- a)* (s- b)* (s- c)),
+!
+!	where s= 1/2* (a+ b+ c)
+!	      a, b, c sides.
+!
+!	in order to calculate the sidelengths |x-y|= sqrt(x**2-y**2)
+!	the complex absolute value intrinsic function is used.
+!	hopefully this fuction is faster than using sqrt and
+!	power-of-two instead.
+!
+!	internally double precision is used in this function, because
+!	machine precision is crucial when a coordinate pair appears
+!	near the edge or corner of an element.
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	dc_area
+! FUNCTION:
+!	calculate area of a triangle (in a plain) in double precision
+! SYNTAX:
+!	real= dc_area(real.arr, real.arr, real.arr)
+! ON INPUT:
+!	r_coord1: node1 of triangle			REAL
+!	r_coord2: node2 of triangle			REAL
+!	r_coord3: node3 of triangle			REAL
+! ON OUTPUT:
+!	r_area:   area of triangle			REAL
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_initialvalues, slm_analyticsolution
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	7/97
+!	2. names changed		j. behrens	7/97
+!	3. changed to use GRID_api	j. behrens	11/97
+!	4. changed interfaces		j. behrens	12/97
+!	5. compliant to amatos 1.0	j. behrens	12/2000
+!	6. compliant to amatos 1.2	j. behrens	3/2002
+!	7. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_initial
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC slm_initialvalues, slm_analyticsolution
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_cntr=(/ 0.5, 0.75 /)
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_hcntr=(/ 0.25, 0.5 /)
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_ccntr=(/ 0.5, 0.25 /)
+	  REAL (KIND = GRID_SR)                            :: r_hgt=0.70
+	  REAL (KIND = GRID_SR)                            :: r_hgt2=0.68
+	  REAL (KIND = GRID_SR)                            :: r_srd=0.027
+	  REAL (KIND = GRID_SR)                            :: r_sln=0.22
+	  REAL (KIND = GRID_SR)                            :: r_swd=0.06
+	  REAL (KIND = GRID_SR)                            :: r_onethird=1./3.
+	  REAL (KIND = GRID_SR)                            :: r_twothird=2./3.
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_initialvalues(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  INTEGER                                    :: i_lev= 6
+
+!---------- initialize some constant for the slotted cylinder
+
+	  CALL slm_initxmas(p_ghand)
+
+	  RETURN
+	  END SUBROUTINE slm_initialvalues
+!*****************************************************************
+	  SUBROUTINE slm_analyticsolution(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)              :: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  INTEGER, INTENT(in)                         :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(inout)     :: r_array
+	  REAL (KIND = GRID_SR)                                        :: r_fac=.363610260832151995e-4
+	  REAL (KIND = GRID_SR)                                        :: r_rds, r_ras, r_rad, &
+	    r_ads, r_bds, r_cds, r_f1, r_f2, r_xya, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_fc, r_p1, r_p2, &
+	    r_pa, r_pb, r_pc, r_pd, r_tmp, r_centr
+	  INTEGER                                     :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE           :: r_coo
+	  LOGICAL                                     :: l_aux
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  IF(i_arlen /= i_num) THEN
+	    CALL grid_error(52)
+	  END IF
+
+	  ALLOCATE(r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(53)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+
+!---------- compute initial values for a christmas tree
+
+      CALL compute_xmas(i_num, r_coo, r_array)
+
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsolution
+
+!*****************************************************************
+	  FUNCTION dc_area(r_coord1, r_coord2, r_coord3) RESULT (r_area)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord1, r_coord2, r_coord3
+	  REAL (KIND = GRID_DR)                            :: r_area
+	  REAL (KIND = GRID_DR)                            :: r_c
+	  REAL (KIND = GRID_DR), DIMENSION(GRID_dimension) :: r_a, r_b
+	  INTEGER                                     :: i_cnt
+
+!---------- calculate vector components
+
+	  dim_loop: DO i_cnt=1, GRID_dimension
+	    r_a(i_cnt)= REAL((r_coord2(i_cnt)- r_coord1(i_cnt)),GRID_DR)
+	    r_b(i_cnt)= REAL((r_coord3(i_cnt)- r_coord1(i_cnt)),GRID_DR)
+	  END DO dim_loop
+
+!---------- calculate components (a,b,c) of cross product vector
+
+	  r_c= (r_a(1)* r_b(2)- r_a(2)* r_b(1))
+
+!---------- calculate area
+
+	  r_area= abs(r_c)* 0.5_GRID_DR
+
+	  RETURN
+	  END FUNCTION dc_area
+
+!*****************************************************************
+	  FUNCTION in_side(r_coord, r_node1, r_node2, r_node3) RESULT (l_in)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_node1, r_node2, r_node3
+	  LOGICAL                                     :: l_in
+	  REAL (KIND = GRID_DR)                            :: r_sum, r_f, r_f1, r_f2, r_f3
+	  REAL (KIND = GRID_DR)                            :: r_eps
+
+!---------- set in_side value to out
+
+ 	  l_in= .FALSE.
+
+!---------- set epsilon (machine precision)
+
+	  r_eps= GRID_eps
+
+!---------- calculate areas (f, f1, f2, f3)
+
+	  r_f = dc_area(r_node1, r_node2, r_node3)
+	  r_f1= dc_area(r_coord, r_node2, r_node3)
+	  r_f2= dc_area(r_coord, r_node1, r_node2)
+	  r_f3= dc_area(r_coord, r_node1, r_node3)
+
+!---------- check if summed area is bigger than triangle area
+
+	  r_sum= r_f1+ r_f2+ r_f3
+	  if((r_sum- r_f) < r_eps) l_in= .TRUE.
+
+	  RETURN
+	  END FUNCTION in_side
+
+!*****************************************************************
+	  SUBROUTINE slm_initxmas(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)                     :: p_ghand
+
+	  INTEGER                                            :: i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_coo
+	  INTEGER, DIMENSION(1)                              :: i_valind
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(54)
+	  END IF
+
+!---------- initialize values to zero 
+	  
+	  r_aux= 0._GRID_SR
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- compute values for slotted cylinder
+
+      CALL compute_xmas(i_num, r_coo, r_aux(1,:))
+
+!---------- update grid information
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_initxmas
+
+!*****************************************************************
+	  SUBROUTINE compute_xmas(i_num, r_coo, r_aux)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  INTEGER                                          :: i_num
+	  REAL (KIND = GRID_SR), DIMENSION(:)              :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:)            :: r_coo
+
+	  INTEGER                                          :: i_count, j_count
+	  REAL (KIND = GRID_SR)                            :: r_rds, r_ras, r_rad, &
+	    r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_tmp, &
+	    r_nw, r_sw, r_ne, r_se, r_centr
+	  LOGICAL                                          :: l_aux
+	  REAL (KIND = GRID_SR), &
+	    DIMENSION(GRID_dimension, 3, 6)                :: r_xmastree
+	  REAL (KIND = GRID_SR), &
+	    DIMENSION(GRID_dimension, 6)                   :: r_xmasball
+
+!---------- initialize coordinates of xmas tree triangles
+
+      r_xmastree(:,:,1) = RESHAPE( (/-0.1, 0.3, 0.1, 0.3, 0.0, 0.4 /), (/GRID_dimension, 3 /))
+      r_xmastree(:,:,2) = RESHAPE( (/-0.2, 0.15, 0.2, 0.15, 0.0, 0.35 /), (/GRID_dimension, 3 /))
+      r_xmastree(:,:,3) = RESHAPE( (/-0.3, -0.05, 0.3, -0.05, 0.0, 0.25 /), (/GRID_dimension, 3 /))
+      r_xmastree(:,:,4) = RESHAPE( (/-0.4, -0.3, 0.4, -0.3, 0.0, 0.1 /), (/GRID_dimension, 3 /))
+      r_xmastree(:,:,5) = RESHAPE( (/-0.05, -0.3, -0.05, -0.4, 0.05, -0.4 /), (/GRID_dimension, 3 /))
+      r_xmastree(:,:,6) = RESHAPE( (/-0.05, -0.3, 0.05, -0.4, 0.05, -0.3 /), (/GRID_dimension, 3 /))
+      r_xmasball(:,1)   = (/ 0.02, 0.25 /)
+      r_xmasball(:,2)   = (/-0.11, 0.06 /)
+      r_xmasball(:,3)   = (/ 0.1, 0.055 /)
+      r_xmasball(:,4)   = (/-0.18, -0.21 /)
+      r_xmasball(:,5)   = (/ 0.2, -0.17 /)
+      r_xmasball(:,6)   = (/ -0.015, -0.125 /)
+      r_rds= r_srd*r_srd
+      
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_aux(i_count)= 0.0_GRID_SR
+	    DO j_count= 1, 6
+	      inside: IF(in_side(r_coo(:,i_count), r_xmastree(:,1,j_count), &
+	        r_xmastree(:,2,j_count), r_xmastree(:,3,j_count))) THEN
+	        r_aux(i_count)= r_hgt2
+	      END IF inside
+	    END DO
+	    DO j_count= 1, 6
+	      r_tmp= r_coo(:,i_count)- r_xmasball(:,j_count)
+	      inball: IF(dot_product(r_tmp,r_tmp)<r_rds) THEN
+	        r_aux(i_count)= r_hgt
+	      END IF inball
+	    END DO
+	  END DO node_loop
+
+	  RETURN
+	  END SUBROUTINE compute_xmas
+
+	END MODULE SLM_initial
diff --git a/flash2d/src/options/SLM_initial.xmasElk.f90 b/flash2d/src/options/SLM_initial.xmasElk.f90
new file mode 100644
index 0000000..d33ece3
--- /dev/null
+++ b/flash2d/src/options/SLM_initial.xmasElk.f90
@@ -0,0 +1,457 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_initial
+! FUNCTION:
+!	initialize slotted cylinder for semi-Lagrangian advection
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialvalues
+! FUNCTION:
+!	initialize a grid with values
+! SYNTAX:
+!	CALL slm_initialvalues(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initslot
+! FUNCTION:
+!	initialize a grid with values of slotted cylinder test case
+! SYNTAX:
+!	CALL slm_initslot(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_analyticsolution
+! FUNCTION:
+!	calculates the 'analytic solution' to compare with in diagnostics
+! SYNTAX:
+!	CALL slm_analyticsolution(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initcylndr
+! FUNCTION:
+!	initialize a grid with values of a cylinder test case
+! SYNTAX:
+!	CALL slm_initcylndr(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_centr: coordinates of cyl. centre	REAL
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	in_side
+! FUNCTION:
+!	checks, if a given point (x,y) lies within a given triangle
+! SYNTAX:
+!	logical= in_side(real.arr, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	r_coord: coordinate array		REAL
+!	r_node1: node1 of triangle		REAL
+!	r_node2: node2 of triangle		REAL
+!	r_node3: node3 of triangle		REAL
+! ON OUTPUT:
+!	l_in:    .true. if r_coord \in p_elem	logical
+! CALLS:
+!
+! COMMENTS:
+!	this routine decides whether a point lies in or out of a
+!	triangle. this is done with the following approach:
+!	calculate the area for the given triangle and for the 
+!	three triangles resulting from drawing lines from the given
+!	point to all three triangle nodes.
+!	if the sum of the areas of those three trianlges exceeds
+!	the area of the given trianlge, the the point lies outside
+!	of it.
+!	for calculation of the areas following formula is used:
+!	(Herons formula(?))
+!
+!	A = sqrt(s* (s- a)* (s- b)* (s- c)),
+!
+!	where s= 1/2* (a+ b+ c)
+!	      a, b, c sides.
+!
+!	in order to calculate the sidelengths |x-y|= sqrt(x**2-y**2)
+!	the complex absolute value intrinsic function is used.
+!	hopefully this fuction is faster than using sqrt and
+!	power-of-two instead.
+!
+!	internally double precision is used in this function, because
+!	machine precision is crucial when a coordinate pair appears
+!	near the edge or corner of an element.
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	dc_area
+! FUNCTION:
+!	calculate area of a triangle (in a plain) in double precision
+! SYNTAX:
+!	real= dc_area(real.arr, real.arr, real.arr)
+! ON INPUT:
+!	r_coord1: node1 of triangle			REAL
+!	r_coord2: node2 of triangle			REAL
+!	r_coord3: node3 of triangle			REAL
+! ON OUTPUT:
+!	r_area:   area of triangle			REAL
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_initialvalues, slm_analyticsolution
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	7/97
+!	2. names changed		j. behrens	7/97
+!	3. changed to use GRID_api	j. behrens	11/97
+!	4. changed interfaces		j. behrens	12/97
+!	5. compliant to amatos 1.0	j. behrens	12/2000
+!	6. compliant to amatos 1.2	j. behrens	3/2002
+!	7. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_initial
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC slm_initialvalues, slm_analyticsolution
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_cntr=(/ 0.5, 0.75 /)
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_hcntr=(/ 0.25, 0.5 /)
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_ccntr=(/ 0.5, 0.25 /)
+	  REAL (KIND = GRID_SR)                            :: r_hgt=0.70
+	  REAL (KIND = GRID_SR)                            :: r_hgt2=0.68
+	  REAL (KIND = GRID_SR)                            :: r_srd=0.027
+	  REAL (KIND = GRID_SR)                            :: r_sln=0.22
+	  REAL (KIND = GRID_SR)                            :: r_swd=0.06
+	  REAL (KIND = GRID_SR)                            :: r_onethird=1./3.
+	  REAL (KIND = GRID_SR)                            :: r_twothird=2./3.
+	  
+	  INTEGER (KIND = GRID_SI), DIMENSION(:,:), ALLOCATABLE :: i_elch
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_initialvalues(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  INTEGER                                    :: i_lev= 6
+
+!---------- initialize some constant for the slotted cylinder
+
+	  CALL slm_initxmas(p_ghand)
+
+	  RETURN
+	  END SUBROUTINE slm_initialvalues
+!*****************************************************************
+	  SUBROUTINE slm_analyticsolution(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)              :: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  INTEGER, INTENT(in)                         :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(inout)     :: r_array
+	  REAL (KIND = GRID_SR)                                        :: r_fac=.363610260832151995e-4
+	  REAL (KIND = GRID_SR)                                        :: r_rds, r_ras, r_rad, &
+	    r_ads, r_bds, r_cds, r_f1, r_f2, r_xya, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_fc, r_p1, r_p2, &
+	    r_pa, r_pb, r_pc, r_pd, r_tmp, r_centr
+	  INTEGER                                     :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE           :: r_coo
+	  LOGICAL                                     :: l_aux
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  IF(i_arlen /= i_num) THEN
+	    CALL grid_error(52)
+	  END IF
+
+	  ALLOCATE(r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(53)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+
+!---------- compute initial values for a christmas tree
+
+!      CALL compute_xmas(i_num, r_coo, r_array)
+
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsolution
+
+!*****************************************************************
+	  FUNCTION dc_area(r_coord1, r_coord2, r_coord3) RESULT (r_area)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord1, r_coord2, r_coord3
+	  REAL (KIND = GRID_DR)                            :: r_area
+	  REAL (KIND = GRID_DR)                            :: r_c
+	  REAL (KIND = GRID_DR), DIMENSION(GRID_dimension) :: r_a, r_b
+	  INTEGER                                     :: i_cnt
+
+!---------- calculate vector components
+
+	  dim_loop: DO i_cnt=1, GRID_dimension
+	    r_a(i_cnt)= REAL((r_coord2(i_cnt)- r_coord1(i_cnt)),GRID_DR)
+	    r_b(i_cnt)= REAL((r_coord3(i_cnt)- r_coord1(i_cnt)),GRID_DR)
+	  END DO dim_loop
+
+!---------- calculate components (a,b,c) of cross product vector
+
+	  r_c= (r_a(1)* r_b(2)- r_a(2)* r_b(1))
+
+!---------- calculate area
+
+	  r_area= abs(r_c)* 0.5_GRID_DR
+
+	  RETURN
+	  END FUNCTION dc_area
+
+!*****************************************************************
+	  FUNCTION in_side(r_coord, r_node1, r_node2, r_node3) RESULT (l_in)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_node1, r_node2, r_node3
+	  LOGICAL                                     :: l_in
+	  REAL (KIND = GRID_DR)                            :: r_sum, r_f, r_f1, r_f2, r_f3
+	  REAL (KIND = GRID_DR)                            :: r_eps
+
+!---------- set in_side value to out
+
+ 	  l_in= .FALSE.
+
+!---------- set epsilon (machine precision)
+
+	  r_eps= GRID_eps
+
+!---------- calculate areas (f, f1, f2, f3)
+
+	  r_f = dc_area(r_node1, r_node2, r_node3)
+	  r_f1= dc_area(r_coord, r_node2, r_node3)
+	  r_f2= dc_area(r_coord, r_node1, r_node2)
+	  r_f3= dc_area(r_coord, r_node1, r_node3)
+
+!---------- check if summed area is bigger than triangle area
+
+	  r_sum= r_f1+ r_f2+ r_f3
+	  if((r_sum- r_f) < r_eps) l_in= .TRUE.
+
+	  RETURN
+	  END FUNCTION in_side
+
+!*****************************************************************
+	  SUBROUTINE slm_initxmas(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)                     :: p_ghand
+
+	  INTEGER                                            :: i_num, i_alct, &
+	    i_iofil, i_iost, i_ioend, i_cols, i_rows, i_c, i_r, i_charcnt
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_coo
+	  INTEGER, DIMENSION(1)                              :: i_valind
+      CHARACTER (len=80)                                 :: a_filrow
+      CHARACTER (len=70)                                 :: c_tmp
+
+!---------- open input file and read data
+
+!    IF(.NOT. allocated(i_elch)) THEN
+ !   write(*,*) 'DEBUG: entering'
+    i_iofil=13
+    open(unit= i_iofil, file= 'elch.pbm', status= 'OLD', &
+         action= 'READ', iostat= i_iost)
+!---------- first two lines contain meta-data...
+    read(i_iofil,2000,iostat=i_ioend) a_filrow
+!    write(*,*) a_filrow, i_ioend
+    read(i_iofil,2000,iostat=i_ioend) a_filrow
+ !   write(*,*) a_filrow, i_ioend
+    file_end: IF(i_ioend /= 0) THEN
+      close(i_iofil)
+      CALL grid_error(c_error='[slm_initxmas]: Elch file seems empty or corrupted...')
+    ENDIF file_end
+    read(i_iofil,*) i_cols, i_rows
+!---------- allocate elch array
+    allocate(i_elch(i_rows,i_cols), stat= i_alct)
+	IF(i_alct /= 0) THEN
+	  CALL grid_error(c_error='[slm_initxmas]: Elch array not allocated...')
+	END IF
+	read(i_iofil,2010,iostat=i_ioend) c_tmp
+	i_charcnt = 0
+	  DO i_r=1,i_rows
+	DO i_c=1,i_cols
+	    i_charcnt= i_charcnt+1
+	    IF(i_charcnt > 70) THEN
+	      read(i_iofil,2010,iostat=i_ioend) c_tmp
+	      i_charcnt= 1
+	    END IF
+	    read(c_tmp(i_charcnt:i_charcnt),*) i_elch(i_r, i_c)
+	    i_elch(i_r,i_c)= 1 - i_elch(i_r, i_c)
+	  END DO
+	END DO
+!	write(19,1000) ((i_elch(i_r, i_c), i_r=1,i_rows), i_c=1,i_cols)
+!    read(i_iofil,*) ((i_elch(i_r, i_c), i_r=1,i_rows), i_c=1,i_cols)
+ 1000 FORMAT(70i1)
+     CLOSE(i_iofil)
+!     END IF !allocated i_elch
+     
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(54)
+	  END IF
+
+!---------- initialize values to zero 
+	  
+	  r_aux= 0._GRID_SR
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- compute values for slotted cylinder
+
+      CALL compute_xmas(i_num, i_cols, i_rows, i_elch, r_coo, r_aux(1,:))
+
+!---------- update grid information
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo, i_elch)
+ 2000 FORMAT(a80)
+ 2010 FORMAT(a70)
+
+	  RETURN
+	  END SUBROUTINE slm_initxmas
+
+!*****************************************************************
+	  SUBROUTINE compute_xmas(i_num, i_cols, i_rows, i_elk, r_coo, r_aux)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  INTEGER (KIND = GRID_SI)                         :: i_num
+	  INTEGER (KIND = GRID_SI)                         :: i_cols
+	  INTEGER (KIND = GRID_SI)                         :: i_rows
+	  INTEGER (KIND = GRID_SI), DIMENSION(:,:)         :: i_elk
+	  REAL (KIND = GRID_SR), DIMENSION(:)              :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:)            :: r_coo
+
+	  INTEGER                                          :: i_count, j_count, i_i, i_j
+	  REAL (KIND = GRID_SR)                            :: r_dx, r_dy, &
+        r_left, r_rigt, r_up, r_down, r_rds
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_tmp, &
+	    r_nw, r_sw, r_ne, r_se, r_centr
+	  LOGICAL                                          :: l_aux
+	  REAL (KIND = GRID_SR), &
+	    DIMENSION(GRID_dimension, 3, 6)                :: r_xmastree
+	  REAL (KIND = GRID_SR), &
+	    DIMENSION(GRID_dimension)                   :: r_xmasball
+
+!---------- initialize coordinates of xmas tree triangles
+
+      r_left= minval(r_coo(1,:))
+      r_rigt= maxval(r_coo(1,:))
+      r_up= maxval(r_coo(2,:))
+      r_down= minval(r_coo(2,:))
+      r_dx= real((i_cols-1),GRID_SR)/(r_rigt-r_left)
+      r_dy= real((i_rows-1),GRID_SR)/(r_up- r_down)
+      r_xmasball = (/ 0.0, 0.0 /)
+      r_rds= r_srd*r_srd
+
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_aux(i_count)= 0.0_GRID_SR
+	    i_i= int(((r_coo(1,i_count)+0.5)* r_dx)) + 1
+	    i_j= int(((r_coo(2,i_count)+0.5)* r_dy)) + 1
+	    r_aux(i_count) = real((i_elk(i_j, i_i)), GRID_SR)
+	    r_tmp= r_coo(:,i_count)- r_xmasball
+	    IF(dot_product(r_tmp,r_tmp)<r_rds) THEN
+	      IF(r_aux(i_count) < 1.0) &
+	        r_aux(i_count)= 1.25
+	    END IF
+	  END DO node_loop
+
+	  RETURN
+	  END SUBROUTINE compute_xmas
+
+	END MODULE SLM_initial
diff --git a/flash2d/src/options/SLM_initial.xmasanim.f90 b/flash2d/src/options/SLM_initial.xmasanim.f90
new file mode 100644
index 0000000..e6590cc
--- /dev/null
+++ b/flash2d/src/options/SLM_initial.xmasanim.f90
@@ -0,0 +1,428 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_initial
+! FUNCTION:
+!	initialize slotted cylinder for semi-Lagrangian advection
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initialvalues
+! FUNCTION:
+!	initialize a grid with values
+! SYNTAX:
+!	CALL slm_initialvalues(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initslot
+! FUNCTION:
+!	initialize a grid with values of slotted cylinder test case
+! SYNTAX:
+!	CALL slm_initslot(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_analyticsolution
+! FUNCTION:
+!	calculates the 'analytic solution' to compare with in diagnostics
+! SYNTAX:
+!	CALL slm_analyticsolution(grid, real, int, real.arr)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_time:  model time			REAL
+!	i_arlen: array length for values array	INTEGER
+! ON OUTPUT:
+!	r_array: values at gridpoints		REAL
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_initcylndr
+! FUNCTION:
+!	initialize a grid with values of a cylinder test case
+! SYNTAX:
+!	CALL slm_initcylndr(grid)
+! ON INPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+!	r_centr: coordinates of cyl. centre	REAL
+! ON OUTPUT:
+!	p_ghand: grid handle			TYPE (grid_handle)
+! CALLS:
+!
+! COMMENTS:
+!	the routine is made for two dimensions only
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	in_side
+! FUNCTION:
+!	checks, if a given point (x,y) lies within a given triangle
+! SYNTAX:
+!	logical= in_side(real.arr, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	r_coord: coordinate array		REAL
+!	r_node1: node1 of triangle		REAL
+!	r_node2: node2 of triangle		REAL
+!	r_node3: node3 of triangle		REAL
+! ON OUTPUT:
+!	l_in:    .true. if r_coord \in p_elem	logical
+! CALLS:
+!
+! COMMENTS:
+!	this routine decides whether a point lies in or out of a
+!	triangle. this is done with the following approach:
+!	calculate the area for the given triangle and for the 
+!	three triangles resulting from drawing lines from the given
+!	point to all three triangle nodes.
+!	if the sum of the areas of those three trianlges exceeds
+!	the area of the given trianlge, the the point lies outside
+!	of it.
+!	for calculation of the areas following formula is used:
+!	(Herons formula(?))
+!
+!	A = sqrt(s* (s- a)* (s- b)* (s- c)),
+!
+!	where s= 1/2* (a+ b+ c)
+!	      a, b, c sides.
+!
+!	in order to calculate the sidelengths |x-y|= sqrt(x**2-y**2)
+!	the complex absolute value intrinsic function is used.
+!	hopefully this fuction is faster than using sqrt and
+!	power-of-two instead.
+!
+!	internally double precision is used in this function, because
+!	machine precision is crucial when a coordinate pair appears
+!	near the edge or corner of an element.
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	dc_area
+! FUNCTION:
+!	calculate area of a triangle (in a plain) in double precision
+! SYNTAX:
+!	real= dc_area(real.arr, real.arr, real.arr)
+! ON INPUT:
+!	r_coord1: node1 of triangle			REAL
+!	r_coord2: node2 of triangle			REAL
+!	r_coord3: node3 of triangle			REAL
+! ON OUTPUT:
+!	r_area:   area of triangle			REAL
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_initialvalues, slm_analyticsolution
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam, MISC_error, GRID_api
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	7/97
+!	2. names changed		j. behrens	7/97
+!	3. changed to use GRID_api	j. behrens	11/97
+!	4. changed interfaces		j. behrens	12/97
+!	5. compliant to amatos 1.0	j. behrens	12/2000
+!	6. compliant to amatos 1.2	j. behrens	3/2002
+!	7. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_initial
+	  USE FLASH_parameters
+	  USE GRID_api
+	  PRIVATE
+	  PUBLIC slm_initialvalues, slm_analyticsolution
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_cntr=(/ 0.5, 0.75 /)
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_hcntr=(/ 0.25, 0.5 /)
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_ccntr=(/ 0.5, 0.25 /)
+	  REAL (KIND = GRID_SR)                            :: r_hgt=0.70
+	  REAL (KIND = GRID_SR)                            :: r_hgt2=0.68
+	  REAL (KIND = GRID_SR)                            :: r_srd=0.016
+	  REAL (KIND = GRID_SR)                            :: r_sln=0.22
+	  REAL (KIND = GRID_SR)                            :: r_swd=0.06
+	  REAL (KIND = GRID_SR)                            :: r_onethird=1./3.
+	  REAL (KIND = GRID_SR)                            :: r_twothird=2./3.
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_initialvalues(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)             :: p_ghand
+	  INTEGER                                    :: i_lev= 6
+
+!---------- initialize some constant for the slotted cylinder
+
+	  CALL slm_initxmas(p_ghand)
+
+	  RETURN
+	  END SUBROUTINE slm_initialvalues
+!*****************************************************************
+	  SUBROUTINE slm_analyticsolution(p_ghand, r_time, i_arlen, r_array)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)              :: p_ghand
+	  REAL (KIND = GRID_SR), INTENT(in)                            :: r_time
+	  INTEGER, INTENT(in)                         :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(inout)     :: r_array
+	  REAL (KIND = GRID_SR)                                        :: r_fac=.363610260832151995e-4
+	  REAL (KIND = GRID_SR)                                        :: r_rds, r_ras, r_rad, &
+	    r_ads, r_bds, r_cds, r_f1, r_f2, r_xya, r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)             :: r_fc, r_p1, r_p2, &
+	    r_pa, r_pb, r_pc, r_pd, r_tmp, r_centr
+	  INTEGER                                     :: i_count, i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE           :: r_coo
+	  LOGICAL                                     :: l_aux
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  IF(i_arlen /= i_num) THEN
+	    CALL grid_error(52)
+	  END IF
+
+	  ALLOCATE(r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(53)
+	  END IF
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+
+!---------- compute initial values for a christmas tree
+
+      CALL compute_xmas(i_num, r_coo, r_array)
+
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_analyticsolution
+
+!*****************************************************************
+	  FUNCTION dc_area(r_coord1, r_coord2, r_coord3) RESULT (r_area)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord1, r_coord2, r_coord3
+	  REAL (KIND = GRID_DR)                            :: r_area
+	  REAL (KIND = GRID_DR)                            :: r_c
+	  REAL (KIND = GRID_DR), DIMENSION(GRID_dimension) :: r_a, r_b
+	  INTEGER                                     :: i_cnt
+
+!---------- calculate vector components
+
+	  dim_loop: DO i_cnt=1, GRID_dimension
+	    r_a(i_cnt)= REAL((r_coord2(i_cnt)- r_coord1(i_cnt)),GRID_DR)
+	    r_b(i_cnt)= REAL((r_coord3(i_cnt)- r_coord1(i_cnt)),GRID_DR)
+	  END DO dim_loop
+
+!---------- calculate components (a,b,c) of cross product vector
+
+	  r_c= (r_a(1)* r_b(2)- r_a(2)* r_b(1))
+
+!---------- calculate area
+
+	  r_area= abs(r_c)* 0.5_GRID_DR
+
+	  RETURN
+	  END FUNCTION dc_area
+
+!*****************************************************************
+	  FUNCTION in_side(r_coord, r_node1, r_node2, r_node3) RESULT (l_in)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in) :: r_node1, r_node2, r_node3
+	  LOGICAL                                     :: l_in
+	  REAL (KIND = GRID_DR)                            :: r_sum, r_f, r_f1, r_f2, r_f3
+	  REAL (KIND = GRID_DR)                            :: r_eps
+
+!---------- set in_side value to out
+
+ 	  l_in= .FALSE.
+
+!---------- set epsilon (machine precision)
+
+	  r_eps= GRID_eps
+
+!---------- calculate areas (f, f1, f2, f3)
+
+	  r_f = dc_area(r_node1, r_node2, r_node3)
+	  r_f1= dc_area(r_coord, r_node2, r_node3)
+	  r_f2= dc_area(r_coord, r_node1, r_node2)
+	  r_f3= dc_area(r_coord, r_node1, r_node3)
+
+!---------- check if summed area is bigger than triangle area
+
+	  r_sum= r_f1+ r_f2+ r_f3
+	  if((r_sum- r_f) < r_eps) l_in= .TRUE.
+
+	  RETURN
+	  END FUNCTION in_side
+
+!*****************************************************************
+	  SUBROUTINE slm_initxmas(p_ghand)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), INTENT(in)                     :: p_ghand
+
+	  INTEGER                                            :: i_num, i_alct
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE :: r_coo
+	  INTEGER, DIMENSION(1)                              :: i_valind
+
+!---------- allocate workspace
+
+	  i_num= p_ghand%i_nnumber
+	  ALLOCATE(r_aux(1,i_num), r_coo(GRID_dimension,i_num), stat= i_alct)
+	  IF(i_alct /= 0) THEN
+	    CALL grid_error(54)
+	  END IF
+
+!---------- initialize values to zero 
+	  
+	  r_aux= 0._GRID_SR
+
+!---------- get information
+
+	  CALL grid_getinfo(p_ghand, r_nodecoordinates= r_coo)
+
+!---------- compute values for slotted cylinder
+
+      CALL compute_xmas(i_num, r_coo, r_aux(1,:))
+
+!---------- update grid information
+
+	  i_valind= (/ GRID_tracer /)
+	  CALL grid_putinfo(p_ghand, i_arraypoint=i_valind, r_nodevalues= r_aux)
+
+!---------- deallocate workspace
+
+	  DEALLOCATE(r_aux, r_coo)
+
+	  RETURN
+	  END SUBROUTINE slm_initxmas
+
+!*****************************************************************
+	  SUBROUTINE compute_xmas(i_num, r_coo, r_aux)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  INTEGER                                          :: i_num
+	  REAL (KIND = GRID_SR), DIMENSION(:)              :: r_aux
+	  REAL (KIND = GRID_SR), DIMENSION(:,:)            :: r_coo
+
+	  INTEGER                                          :: i_count, j_count
+	  REAL (KIND = GRID_SR)                            :: r_rds, r_ras, r_rad, &
+	    r_dpt
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension) :: r_tmp, &
+	    r_nw, r_sw, r_ne, r_se, r_centr, r_off
+	  LOGICAL                                          :: l_aux
+	  REAL (KIND = GRID_SR), &
+	    DIMENSION(GRID_dimension, 3, 6)                :: r_xmastree
+	  REAL (KIND = GRID_SR), &
+	    DIMENSION(GRID_dimension, 6)                   :: r_xmasball
+
+!---------- initialize coordinates of xmas tree triangles
+
+      r_xmastree(:,:,1) = RESHAPE( (/0.2, 0.65, 0.3, 0.65, 0.25, 0.7 /), (/GRID_dimension, 3 /))
+      r_xmastree(:,:,2) = RESHAPE( (/0.15, 0.575, 0.35, 0.575, 0.25, 0.675 /), (/GRID_dimension, 3 /))
+      r_xmastree(:,:,3) = RESHAPE( (/0.1, 0.475, 0.4, 0.475, 0.25, 0.625 /), (/GRID_dimension, 3 /))
+      r_xmastree(:,:,4) = RESHAPE( (/0.05, 0.35, 0.45, 0.35, 0.25, 0.55 /), (/GRID_dimension, 3 /))
+      r_xmastree(:,:,5) = RESHAPE( (/ 0.225, 0.35, 0.225, 0.3, 0.275, 0.3 /), (/GRID_dimension, 3 /))
+      r_xmastree(:,:,6) = RESHAPE( (/ 0.225, 0.35, 0.275, 0.3, 0.275, 0.35 /), (/GRID_dimension, 3 /))
+      r_xmasball(:,1)   = (/ 0.252, 0.65 /)
+      r_xmasball(:,2)   = (/ 0.205, 0.53 /)
+      r_xmasball(:,3)   = (/ 0.3, 0.525 /)
+      r_xmasball(:,4)   = (/ 0.145, 0.39 /)
+      r_xmasball(:,5)   = (/ 0.35,  0.41 /)
+      r_xmasball(:,6)   = (/ 0.247, 0.425 /)
+      r_rds= r_srd*r_srd
+      
+!---------- compute offset for unit squares [0,1]^2 or [-0.5,0.5]^2
+
+      r_off= (/  0.0,  0.0 /) ! [0,1] unit square
+!      r_off= (/ -0.5, -0.5 /) ! [-0.5,0.5] unit square
+      DO i_count=1,6
+        DO j_count=1,3
+          r_xmastree(:,j_count,i_count)= r_xmastree(:,j_count,i_count)+ r_off(:)
+        END DO
+      END DO
+      DO i_count=1,6
+        r_xmasball(:,i_count)= r_xmasball(:,i_count)+ r_off(:)
+      END DO
+
+!---------- loop over the nodes
+
+	  node_loop: DO i_count= 1, i_num
+	    r_aux(i_count)= 0.0_GRID_SR
+	    DO j_count= 1, 6
+	      inside: IF(in_side(r_coo(:,i_count), r_xmastree(:,1,j_count), &
+	        r_xmastree(:,2,j_count), r_xmastree(:,3,j_count))) THEN
+	        r_aux(i_count)= r_hgt2
+	      END IF inside
+	    END DO
+	    DO j_count= 1, 6
+	      r_tmp= r_coo(:,i_count)- r_xmasball(:,j_count)
+	      inball: IF(dot_product(r_tmp,r_tmp)<r_rds) THEN
+	        r_aux(i_count)= r_hgt
+	      END IF inball
+	    END DO
+	  END DO node_loop
+
+	  RETURN
+	  END SUBROUTINE compute_xmas
+
+	END MODULE SLM_initial
diff --git a/flash2d/src/options/SLM_simple.algae.f90 b/flash2d/src/options/SLM_simple.algae.f90
new file mode 100644
index 0000000..fb16e62
--- /dev/null
+++ b/flash2d/src/options/SLM_simple.algae.f90
@@ -0,0 +1,395 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_simple
+! FUNCTION:
+!	provide simple semi-Lagrangian routines
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_step
+! FUNCTION:
+!	one step of the basic SLM algorithm
+! SYNTAX:
+!	CALL slm_step(int, real.arr, real.arr)
+! ON INPUT:
+!	...
+! ON OUTPUT:
+!	r_tracer: array with tracer values	real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_displace
+! FUNCTION:
+!	extrapolate the alpha, values for the displacements of the upstream
+!	points from the gridpoints
+! SYNTAX:
+!	CALL slm_displace(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_coord: real array of xy-coordinates		real
+! ON OUTPUT:
+!	r_alpha: displacement vectors to each point	real
+! CALLS:
+!	wind_field
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_update
+! FUNCTION:
+!	calculate the update to the velocity
+! SYNTAX:
+!	CALL slm_update(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_rside: array with right hand side values	real
+! ON OUTPUT:
+!	r_udate: array with new (updated) gid values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is trivial for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_upstream
+! FUNCTION:
+!	calculate right hand side of the equation (upstream values)
+! SYNTAX:
+!	CALL slm_upstream(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_alpha: displacement vectors to each point	real
+! ON OUTPUT:
+!	r_rside: array with right hand side values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is just interpolation for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_interpolate
+! FUNCTION:
+!	do the interpolation
+! SYNTAX:
+!	CALL slm_interpolate(grid, int, real, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	p_ogrid: grid handle to old grid (with data)	TYPE (grid_handle)
+!	r_fac:   factor at which point to interpolate	REAL
+!	i_arlen: array length for the following arrays	INTEGER
+!	r_coord: coordinate array (new grid)		REAL
+!	r_alpha: displacement array (corr. to r_coord)	REAL
+!	r_value: values on the old grid (array)		REAL
+! ON OUTPUT:
+!	r_rside: right hand side (interpolated)		REAL
+! CALLS:
+!
+! COMMENTS:
+!	this one is plain bi-cubic spline interpolation
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_step
+! COMMENTS:
+!
+! USES:
+!	FLASH_parameters, GRID_api, ADV_wind, ADV_rhs
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	4/2002
+!	2. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_simple
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE GRID_api
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_step
+	  CONTAINS
+
+!*****************************************************************
+	  SUBROUTINE slm_step(p_ghand, p_param, p_time, r_modtime, i_size, &
+	                       r_coord, r_tracer, i_newsdepth)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                         :: p_param
+	  TYPE (sw_info), INTENT(inout)                             :: p_time
+	  REAL (KIND = GRID_SR), INTENT(in)                         :: r_modtime
+	  INTEGER, INTENT(in)                                       :: i_size
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(2,i_size), INTENT(out)   :: r_tracer
+	  INTEGER, OPTIONAL, INTENT(in)                             :: i_newsdepth
+	  
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_newvl
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_alpha
+	  INTEGER                                                   :: i_alct
+
+!---------- check size!
+
+	  IF(i_size <= 0) THEN
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'INFO [slm_step]: Zero step size, returning to calling routine'
+	    RETURN
+	  END IF
+
+!---------- allocate auxiliary arrays
+
+	  allocate(r_newvl(2,i_size), r_alpha(GRID_dimension,i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(38)
+	  END IF not_alloc
+
+!-SLM--------- calculate trajectory pieces (displacements)
+
+	  CALL stop_watch('start',3,p_time)
+	  CALL slm_displace(p_param, i_size, r_coord, r_alpha, r_time=r_modtime)
+	  CALL stop_watch('stop ',3,p_time)
+
+!-SLM--------- calculate right hand side
+
+	  CALL stop_watch('start',4,p_time)
+	  CALL slm_upstream(p_ghand, i_size, r_coord, r_alpha, r_newvl)
+	  CALL stop_watch('stop ',4,p_time)
+
+!-SLM--------- calculate new grid values
+
+	  CALL stop_watch('start',5,p_time)
+	  CALL slm_update(p_param, i_size, r_coord, r_newvl, r_tracer, r_time=r_modtime)
+	  CALL stop_watch('stop ',5,p_time)
+
+!-SLM--------- put alpha values to u and v field entries
+
+	  r_alpha= -r_alpha
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_newsdepth=i_newsdepth, i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  ELSE
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  END IF
+
+!-SLM--------- deallocate work arrays
+
+	  deallocate(r_alpha, r_newvl)
+
+	  RETURN
+	  END SUBROUTINE slm_step
+
+!*****************************************************************
+	  SUBROUTINE slm_displace(p_param, i_arlen, r_coord, r_alpha, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                      :: p_param
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_alpha
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                           :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_fac, r_caf, &
+	    r_axy, r_xyc
+	  REAL (KIND = GRID_SR)                                                 :: r_dt0, r_dt1, &
+	    r_dt2, r_tim
+	  INTEGER                                              :: i_cnt1, i_cnt2
+          
+!---------- set constants
+!DEBUG:
+ !write(*,*) 'DEGBUG: entering slm_displace'
+ 
+ 	  r_dt0= p_param%num%r_deltatime
+	  r_dt1= 0.5* p_param%num%r_deltatime
+	  r_dt2= 1.5* p_param%num%r_deltatime
+	  r_fac= 0.5
+	  r_caf= 2.0
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0
+	  END IF
+
+!---------- calculate in an iteration process the displacements
+
+	  unknown_loop: DO i_cnt1=1,i_arlen
+	    r_axy= 0.0
+
+	    iter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_coord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO iter_loop
+
+	    r_alpha(:,i_cnt1)= r_axy
+	  END DO unknown_loop
+
+	  RETURN
+	  END SUBROUTINE slm_displace
+
+!*****************************************************************
+	  SUBROUTINE slm_update(p_param, i_arlen, r_coord, r_rside, r_udate, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                                    :: p_param
+	  INTEGER, INTENT(in)                                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), INTENT(in)                    :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), INTENT(out)                   :: r_udate
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                          :: r_time
+	  INTEGER                                                              :: i_cnt
+	  REAL (KIND = GRID_SR)                                                :: r_dt, r_tim
+
+!---------- in the linear advection case and with f90 this is just
+
+!	  r_udate= r_rside
+
+!---------- including a non-zero right hand side, we have
+
+	  r_dt= p_param%num%r_deltatime
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0
+	  END IF
+
+	  main_loop: DO i_cnt=1, i_arlen
+	    r_udate(:,i_cnt)= r_rside(:,i_cnt)+ &
+	      r_dt* slm_righthand(r_coord(:,i_cnt),r_rside(:,i_cnt))
+	  END DO main_loop
+
+	  RETURN
+	  END SUBROUTINE slm_update
+
+!*****************************************************************
+	  SUBROUTINE slm_upstream(p_mesh, i_arlen, r_coord, &
+	                          r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(2,i_arlen), INTENT(out)              :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                     :: r_fac
+
+!---------- set factor (at which point of trajectory shall i interpolate)
+
+	  r_fac= 1.0
+
+!---------- in the linear advection case this is just interpolation
+
+	  CALL slm_interpolate(p_mesh, r_fac, i_arlen, r_coord, &
+	                       r_alpha, r_rside)
+
+	  RETURN
+	  END SUBROUTINE slm_upstream
+!*****************************************************************
+	  SUBROUTINE slm_interpolate(p_mesh, r_fac, i_arlen, &
+	                             r_coord, r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in)         :: r_fac
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(2,i_arlen), INTENT(out)             :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE                   :: r_upstr
+	  REAL (KIND = GRID_SR)                                                :: r_eps
+	  INTEGER                                             :: i_cnt, i_alct, &
+	    i_val1, i_val2, i_out, i_stat
+
+!---------- initialize constant
+!DEBUG:
+! write(*,*) 'DEGBUG: entering slm_interpolate'
+
+	  i_val1= GRID_tracer
+	  i_val2= GRID_phi
+	  r_eps= GRID_EPS
+
+!---------- allocate work array
+
+	  ALLOCATE(r_upstr(GRID_dimension,i_arlen), stat=i_alct)
+	  not_allocated: IF(i_alct /= 0) THEN
+	    CALL grid_error(60)
+	  END IF not_allocated
+
+!---------- calculate upstream coordinates
+
+	  dim_loop: DO i_cnt=1, GRID_dimension
+	    r_upstr(i_cnt,:) = r_coord(i_cnt,:)- r_fac(i_cnt)* r_alpha(i_cnt,:)
+	  END DO dim_loop
+
+!---------- loop over nodes: find element containing upstream point
+
+	  node_loop: DO i_cnt=1, i_arlen
+
+!---------- check if upstream value is outside of the domain
+!DEBUG:
+! write(*,*) 'DEGBUG: calling grid_domaincheck with r_upstr, r_coord:', r_upstr(:,i_cnt), r_coord(:,i_cnt)
+
+	    i_out= grid_domaincheck(p_mesh(i_time), r_upstr(:,i_cnt))
+
+!---------- take the intersection of the trajectory with the boundary as new upstream point
+
+	    out_domain: IF(i_out /= 0) then
+	      r_upstr(:,i_cnt)= grid_boundintersect(p_mesh(i_time), &
+	                        r_coord(:,i_cnt), r_upstr(:,i_cnt), i_info=i_stat)
+	      no_intersect: IF(i_stat /= 0) THEN
+	        r_rside(:,i_cnt)= 0.0
+	        CYCLE node_loop
+	      END IF no_intersect
+	    END IF out_domain
+
+!---------- interpolate
+
+	    r_rside(1,i_cnt)= grid_coordvalue(p_mesh(i_time), r_upstr(:,i_cnt), &
+	                    i_interpolorder=GRID_highorder, i_valpoint=i_val1)
+	    small_val1: IF(abs(r_rside(1,i_cnt)) < r_eps) THEN
+	      r_rside(1,i_cnt)= 0.0
+	    END IF small_val1
+	    r_rside(2,i_cnt)= grid_coordvalue(p_mesh(i_time), r_upstr(:,i_cnt), &
+	                    i_interpolorder=GRID_highorder, i_valpoint=i_val2)
+	    small_val2: IF(abs(r_rside(2,i_cnt)) < r_eps) THEN
+	      r_rside(2,i_cnt)= 0.0
+	    END IF small_val2
+
+	  END DO node_loop
+
+!---------- deallocate work array
+
+	  DEALLOCATE(r_upstr)
+
+	  RETURN
+	  END SUBROUTINE slm_interpolate
+
+
+	END MODULE SLM_simple
diff --git a/flash2d/src/options/SLM_simple.clip.f90 b/flash2d/src/options/SLM_simple.clip.f90
new file mode 100644
index 0000000..b4bb4b3
--- /dev/null
+++ b/flash2d/src/options/SLM_simple.clip.f90
@@ -0,0 +1,415 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_simple
+! FUNCTION:
+!	provide advanced semi-Lagrangian routines
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_step
+! FUNCTION:
+!	one step of the basic SLM algorithm
+! SYNTAX:
+!	CALL slm_step(int, real.arr, real.arr)
+! ON INPUT:
+!	...
+! ON OUTPUT:
+!	r_tracer: array with tracer values	real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_displace
+! FUNCTION:
+!	extrapolate the alpha, values for the displacements of the upstream
+!	points from the gridpoints
+! SYNTAX:
+!	CALL slm_displace(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_coord: real array of xy-coordinates		real
+! ON OUTPUT:
+!	r_alpha: displacement vectors to each point	real
+! CALLS:
+!	wind_field
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_update
+! FUNCTION:
+!	calculate the update to the velocity
+! SYNTAX:
+!	CALL slm_update(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_rside: array with right hand side values	real
+! ON OUTPUT:
+!	r_udate: array with new (updated) gid values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is trivial for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_upstream
+! FUNCTION:
+!	calculate right hand side of the equation (upstream values)
+! SYNTAX:
+!	CALL slm_upstream(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_alpha: displacement vectors to each point	real
+! ON OUTPUT:
+!	r_rside: array with right hand side values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is just interpolation for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_interpolate
+! FUNCTION:
+!	do the interpolation
+! SYNTAX:
+!	CALL slm_interpolate(grid, int, real, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	p_ogrid: grid handle to old grid (with data)	TYPE (grid_handle)
+!	r_fac:   factor at which point to interpolate	REAL
+!	i_arlen: array length for the following arrays	INTEGER
+!	r_coord: coordinate array (new grid)		REAL
+!	r_alpha: displacement array (corr. to r_coord)	REAL
+!	r_value: values on the old grid (array)		REAL
+! ON OUTPUT:
+!	r_rside: right hand side (interpolated)		REAL
+! CALLS:
+!
+! COMMENTS:
+!	this one is plain bi-cubic spline interpolation
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_step
+! COMMENTS:
+!
+! USES:
+!	FLASH_parameters, GRID_api, ADV_wind, ADV_rhs
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	4/2002
+!	2. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_simple
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE GRID_api
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_step
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_step(p_ghand, p_param, p_time, r_modtime, i_size, &
+	                       r_coord, r_tracer, i_newsdepth)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                         :: p_param
+	  TYPE (sw_info), INTENT(inout)                             :: p_time
+	  REAL (KIND = GRID_SR), INTENT(in)                                          :: r_modtime
+	  INTEGER, INTENT(in)                                       :: i_size
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size), INTENT(in)        :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_size), INTENT(out)                      :: r_tracer
+	  INTEGER, OPTIONAL, INTENT(in)                             :: i_newsdepth
+	  
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE      :: r_newvl
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_alpha
+	  INTEGER                              :: i_alct
+
+!---------- check size!
+
+	  IF(i_size <= 0) THEN
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'INFO [slm_step]: Zero step size, returning to calling routine'
+	    RETURN
+	  END IF
+
+!---------- allocate auxiliary arrays
+
+	  allocate(r_newvl(i_size), r_alpha(GRID_dimension,i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(38)
+	  END IF not_alloc
+
+!-SLM--------- calculate trajectory pieces (displacements)
+
+	  CALL stop_watch('start',3,p_time)
+	  CALL slm_displace(p_param, i_size, r_coord, r_alpha, r_time=r_modtime)
+	  CALL stop_watch('stop ',3,p_time)
+
+!-SLM--------- calculate right hand side
+
+	  CALL stop_watch('start',4,p_time)
+	  CALL slm_upstream(p_ghand, i_size, r_coord, r_alpha, r_newvl)
+	  CALL stop_watch('stop ',4,p_time)
+
+!-SLM--------- calculate new grid values
+
+	  CALL stop_watch('start',5,p_time)
+	  CALL slm_update(p_param, i_size, r_coord, r_newvl, r_tracer, r_time=r_modtime)
+	  CALL stop_watch('stop ',5,p_time)
+
+!-SLM--------- put alpha values to u and v field entries
+
+	  r_alpha= -r_alpha
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_newsdepth=i_newsdepth, i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  ELSE
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  END IF
+
+!-SLM--------- deallocate work arrays
+
+	  deallocate(r_alpha, r_newvl)
+
+	  RETURN
+	  END SUBROUTINE slm_step
+
+!*****************************************************************
+	  SUBROUTINE slm_displace(p_param, i_arlen, r_coord, r_alpha, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                      :: p_param
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_alpha
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                           :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_fac, r_caf, &
+	    r_axy, r_xyc
+	  REAL (KIND = GRID_SR)                                                 :: r_dt0, r_dt1, &
+	    r_dt2, r_tim
+	  INTEGER                                              :: i_cnt1, i_cnt2
+          
+!---------- set constants
+
+	  r_dt0= p_param%num%r_deltatime
+	  r_dt1= 0.5_GRID_SR* p_param%num%r_deltatime
+	  r_dt2= 1.5_GRID_SR* p_param%num%r_deltatime
+	  r_fac= 0.5_GRID_SR
+	  r_caf= 2.0_GRID_SR
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- calculate in an iteration process the displacements
+
+	  unknown_loop: DO i_cnt1=1,i_arlen
+	    r_axy= 0.0_GRID_SR
+
+	    iter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_coord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO iter_loop
+
+	    r_alpha(:,i_cnt1)= r_axy
+	  END DO unknown_loop
+
+	  RETURN
+	  END SUBROUTINE slm_displace
+
+!*****************************************************************
+	  SUBROUTINE slm_update(p_param, i_arlen, r_coord, r_rside, r_udate, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                   :: p_param
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_udate
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                          :: r_time
+	  INTEGER                                             :: i_cnt
+	  REAL (KIND = GRID_SR)                                                :: r_dt, r_tim
+
+!---------- in the linear advection case and with f90 this is just
+
+!	  r_udate= r_rside
+
+!---------- including a non-zero right hand side, we have
+
+	  r_dt= p_param%num%r_deltatime
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+	  main_loop: DO i_cnt=1, i_arlen
+	    r_udate(i_cnt)= r_rside(i_cnt)+ r_dt* slm_righthand(r_coord(:,i_cnt))
+	  END DO main_loop
+
+	  RETURN
+	  END SUBROUTINE slm_update
+
+!*****************************************************************
+	  SUBROUTINE slm_upstream(p_mesh, i_arlen, r_coord, &
+	                          r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                     :: r_fac
+
+!---------- set factor (at which point of trajectory shall i interpolate)
+
+	  r_fac= 1.0_GRID_SR
+
+!---------- in the linear advection case this is just interpolation
+
+	  CALL slm_interpolate(p_mesh, r_fac, i_arlen, r_coord, &
+	                       r_alpha, r_rside)
+
+	  RETURN
+	  END SUBROUTINE slm_upstream
+!*****************************************************************
+	  SUBROUTINE slm_interpolate(p_mesh, r_fac, i_arlen, &
+	                             r_coord, r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in)         :: r_fac
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE                   :: r_upstr
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_nodevalues)                    :: r_tval
+	  INTEGER, DIMENSION(GRID_elementnodes)               :: i_ttmp
+	  REAL (KIND = GRID_SR)                                                :: r_eps, r_max, r_min, r_tmp
+	  INTEGER                                             :: i_cnt, i_alct, i_val
+	  INTEGER                                             :: i_ind, i_tim, &
+	    j_cnt, i_out, i_stat
+
+!---------- initialize constant
+
+	  i_val= GRID_tracer
+	  r_eps= GRID_EPS
+	  i_tim= p_mesh(i_time)%i_timetag
+
+!---------- allocate work array
+
+	  ALLOCATE(r_upstr(GRID_dimension,i_arlen), stat=i_alct)
+	  not_allocated: IF(i_alct /= 0) THEN
+	    CALL grid_error(60)
+	  END IF not_allocated
+
+!---------- calculate upstream coordinates
+
+	  dim_loop: DO i_cnt=1, GRID_dimension
+	    r_upstr(i_cnt,:) = r_coord(i_cnt,:)- r_fac(i_cnt)* r_alpha(i_cnt,:)
+	  END DO dim_loop
+
+!---------- loop over nodes: find element containing upstream point
+
+	  node_loop: DO i_cnt=1, i_arlen
+
+!---------- check if upstream value is outside of the domain
+
+	    i_out= grid_domaincheck(p_mesh(i_time), r_upstr(:,i_cnt))
+
+!---------- take the intersection of the trajectory with the boundary as new upstream point
+
+	    out_domain: IF(i_out /= 0) then
+	       r_upstr(:,i_cnt)= grid_boundintersect(p_mesh(i_time), &
+	                        r_coord(:,i_cnt), r_upstr(:,i_cnt), i_info=i_stat)
+               no_intersect: IF(i_stat /= 0) THEN
+                  r_rside(i_cnt)= 0.0_GRID_SR
+                  CYCLE node_loop
+               END IF no_intersect
+	    END IF out_domain
+
+!---------- interpolate
+
+	    r_tmp= grid_coordvalue(p_mesh(i_time), r_upstr(:,i_cnt), &
+	           i_interpolorder=GRID_highorder, i_valpoint=i_val, &
+             i_index=i_ind, i_domaincheck=0, l_relative=.FALSE., l_sfcorder=.FALSE.)
+
+	    index_valid: IF(i_ind > 0) THEN
+
+!---------- get nodes of element surrounding r_upstr
+
+	       CALL grid_getiteminfo(i_ind, 'elmt', i_arrlen=GRID_elementnodes, i_nodes=i_ttmp)
+
+!---------- get values at nodes of element surrounding r_upstr, and obtain min/max
+
+               r_min= 0.0_GRID_SR; r_max= 0.0_GRID_SR
+               elmt_loop: DO j_cnt=1,GRID_elementnodes
+                  CALL grid_getiteminfo(i_ttmp(j_cnt), 'node', i_arrlen=GRID_nodevalues, &
+                                        r_values= r_tval, i_time=i_tim)
+                  r_min= MIN(r_min, r_tval(i_val))
+                  r_max= MAX(r_max, r_tval(i_val))	      
+               END DO elmt_loop
+
+!---------- clip value
+
+               IF(r_tmp > r_max) THEN
+                  r_tmp= r_max
+               ELSE IF(r_tmp < r_min) THEN
+                  r_tmp= r_min
+               END IF
+	    END IF index_valid
+
+!---------- set interpolation value
+
+	    r_rside(i_cnt)= r_tmp
+	 
+	    small_val: IF(abs(r_rside(i_cnt)) < r_eps) THEN
+               r_rside(i_cnt)= 0.0_GRID_SR
+	    END IF small_val
+
+	  END DO node_loop
+
+!---------- deallocate work array
+
+	  DEALLOCATE(r_upstr)
+
+	  RETURN
+	  END SUBROUTINE slm_interpolate
+
+	END MODULE SLM_simple
diff --git a/flash2d/src/options/SLM_simple.periodic.f90 b/flash2d/src/options/SLM_simple.periodic.f90
new file mode 100644
index 0000000..1137fdb
--- /dev/null
+++ b/flash2d/src/options/SLM_simple.periodic.f90
@@ -0,0 +1,425 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_simple
+! FUNCTION:
+!	provide advanced semi-Lagrangian routines
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_step
+! FUNCTION:
+!	one step of the basic SLM algorithm
+! SYNTAX:
+!	CALL slm_step(int, real.arr, real.arr)
+! ON INPUT:
+!	...
+! ON OUTPUT:
+!	r_tracer: array with tracer values	real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_displace
+! FUNCTION:
+!	extrapolate the alpha, values for the displacements of the upstream
+!	points from the gridpoints
+! SYNTAX:
+!	CALL slm_displace(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_coord: real array of xy-coordinates		real
+! ON OUTPUT:
+!	r_alpha: displacement vectors to each point	real
+! CALLS:
+!	wind_field
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_update
+! FUNCTION:
+!	calculate the update to the velocity
+! SYNTAX:
+!	CALL slm_update(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_rside: array with right hand side values	real
+! ON OUTPUT:
+!	r_udate: array with new (updated) gid values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is trivial for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_upstream
+! FUNCTION:
+!	calculate right hand side of the equation (upstream values)
+! SYNTAX:
+!	CALL slm_upstream(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_alpha: displacement vectors to each point	real
+! ON OUTPUT:
+!	r_rside: array with right hand side values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is just interpolation for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_interpolate
+! FUNCTION:
+!	do the interpolation
+! SYNTAX:
+!	CALL slm_interpolate(grid, int, real, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	p_ogrid: grid handle to old grid (with data)	TYPE (grid_handle)
+!	r_fac:   factor at which point to interpolate	REAL
+!	i_arlen: array length for the following arrays	INTEGER
+!	r_coord: coordinate array (new grid)		REAL
+!	r_alpha: displacement array (corr. to r_coord)	REAL
+!	r_value: values on the old grid (array)		REAL
+! ON OUTPUT:
+!	r_rside: right hand side (interpolated)		REAL
+! CALLS:
+!
+! COMMENTS:
+!	this one is plain bi-cubic spline interpolation
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_step
+! COMMENTS:
+!
+! USES:
+!	FLASH_parameters, GRID_api, ADV_wind, ADV_rhs
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	4/2002
+!	2. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_simple
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE GRID_api
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_step
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE slm_step(p_ghand, p_param, p_time, r_modtime, i_size, &
+	                       r_coord, r_tracer, i_newsdepth)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                         :: p_param
+	  TYPE (sw_info), INTENT(inout)                             :: p_time
+	  REAL (KIND = GRID_SR), INTENT(in)                                          :: r_modtime
+	  INTEGER, INTENT(in)                                       :: i_size
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size), INTENT(in)        :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_size), INTENT(out)                      :: r_tracer
+	  INTEGER, OPTIONAL, INTENT(in)                             :: i_newsdepth
+	  
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE      :: r_newvl
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE    :: r_alpha
+	  INTEGER                              :: i_alct
+
+!---------- check size!
+
+	  IF(i_size <= 0) THEN
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'INFO [slm_step]: Zero step size, returning to calling routine'
+	    RETURN
+	  END IF
+
+!---------- allocate auxiliary arrays
+
+	  allocate(r_newvl(i_size), r_alpha(GRID_dimension,i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(38)
+	  END IF not_alloc
+
+!-SLM--------- calculate trajectory pieces (displacements)
+
+	  CALL stop_watch('start',3,p_time)
+	  CALL slm_displace(p_param, i_size, r_coord, r_alpha, r_time=r_modtime)
+	  CALL stop_watch('stop ',3,p_time)
+
+!-SLM--------- calculate right hand side
+
+	  CALL stop_watch('start',4,p_time)
+	  CALL slm_upstream(p_ghand, i_size, r_coord, r_alpha, r_newvl)
+	  CALL stop_watch('stop ',4,p_time)
+
+!-SLM--------- calculate new grid values
+
+	  CALL stop_watch('start',5,p_time)
+	  CALL slm_update(p_param, i_size, r_coord, r_newvl, r_tracer, r_time=r_modtime)
+	  CALL stop_watch('stop ',5,p_time)
+
+!-SLM--------- put alpha values to u and v field entries
+
+	  r_alpha= -r_alpha
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_newsdepth=i_newsdepth, i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  ELSE
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  END IF
+
+!-SLM--------- deallocate work arrays
+
+	  deallocate(r_alpha, r_newvl)
+
+	  RETURN
+	  END SUBROUTINE slm_step
+
+!*****************************************************************
+	  SUBROUTINE slm_displace(p_param, i_arlen, r_coord, r_alpha, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                      :: p_param
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_alpha
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                           :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_fac, r_caf, &
+	    r_axy, r_xyc
+	  REAL (KIND = GRID_SR)                                                 :: r_dt0, r_dt1, &
+	    r_dt2, r_tim
+	  INTEGER                                              :: i_cnt1, i_cnt2
+          
+!---------- set constants
+
+	  r_dt0= p_param%num%r_deltatime
+	  r_dt1= 0.5_GRID_SR* p_param%num%r_deltatime
+	  r_dt2= 1.5_GRID_SR* p_param%num%r_deltatime
+	  r_fac= 0.5_GRID_SR
+	  r_caf= 2.0_GRID_SR
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- calculate in an iteration process the displacements
+
+	  unknown_loop: DO i_cnt1=1,i_arlen
+	    r_axy= 0.0_GRID_SR
+
+	    iter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_coord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO iter_loop
+
+	    r_alpha(:,i_cnt1)= r_axy
+	  END DO unknown_loop
+
+	  RETURN
+	  END SUBROUTINE slm_displace
+
+!*****************************************************************
+	  SUBROUTINE slm_update(p_param, i_arlen, r_coord, r_rside, r_udate, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                   :: p_param
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_udate
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                          :: r_time
+	  INTEGER                                             :: i_cnt
+	  REAL (KIND = GRID_SR)                                                :: r_dt, r_tim
+
+!---------- in the linear advection case and with f90 this is just
+
+!	  r_udate= r_rside
+
+!---------- including a non-zero right hand side, we have
+
+	  r_dt= p_param%num%r_deltatime
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+	  main_loop: DO i_cnt=1, i_arlen
+	    r_udate(i_cnt)= r_rside(i_cnt)+ r_dt* slm_righthand(r_coord(:,i_cnt))
+	  END DO main_loop
+
+	  RETURN
+	  END SUBROUTINE slm_update
+
+!*****************************************************************
+	  SUBROUTINE slm_upstream(p_mesh, i_arlen, r_coord, &
+	                          r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                     :: r_fac
+
+!---------- set factor (at which point of trajectory shall i interpolate)
+
+	  r_fac= 1.0_GRID_SR
+
+!---------- in the linear advection case this is just interpolation
+
+	  CALL slm_interpolate(p_mesh, r_fac, i_arlen, r_coord, &
+	                       r_alpha, r_rside)
+
+	  RETURN
+	  END SUBROUTINE slm_upstream
+!*****************************************************************
+	  SUBROUTINE slm_interpolate(p_mesh, r_fac, i_arlen, &
+	                             r_coord, r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in)         :: r_fac
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE                   :: r_upstr
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_nodevalues)                    :: r_tval
+	  INTEGER, DIMENSION(GRID_elementnodes)               :: i_ttmp
+	  REAL (KIND = GRID_SR)                                                :: r_eps, r_max, r_min, r_tmp
+	  INTEGER                                             :: i_cnt, i_alct, i_val
+	  INTEGER                                             :: i_ind, i_tim, &
+	    j_cnt, i_out, i_stat
+
+!---------- initialize constant
+
+	  i_val= GRID_tracer
+	  r_eps= GRID_EPS
+	  i_tim= p_mesh(i_time)%i_timetag
+
+!---------- allocate work array
+
+	  ALLOCATE(r_upstr(GRID_dimension,i_arlen), stat=i_alct)
+	  not_allocated: IF(i_alct /= 0) THEN
+	    CALL grid_error(60)
+	  END IF not_allocated
+
+!---------- calculate upstream coordinates
+
+	  dim_loop: DO i_cnt=1, GRID_dimension
+	    r_upstr(i_cnt,:) = r_coord(i_cnt,:)- r_fac(i_cnt)* r_alpha(i_cnt,:)
+	  END DO dim_loop
+
+!---------- we want to check for periodic boundaries !!! THIS IS A DIRTY HACK!
+
+	  DO i_cnt=1, i_arlen
+	    IF(r_upstr(1,i_cnt) > 0.5_GRID_SR) r_upstr(1,i_cnt)= r_upstr(1,i_cnt)- 1.0_GRID_SR
+	    IF(r_upstr(1,i_cnt) < -0.5_GRID_SR) r_upstr(1,i_cnt)= r_upstr(1,i_cnt)+ 1.0_GRID_SR
+	    IF(r_upstr(2,i_cnt) > 0.5_GRID_SR) r_upstr(2,i_cnt)= r_upstr(2,i_cnt)- 1.0_GRID_SR
+	    IF(r_upstr(2,i_cnt) < -0.5_GRID_SR) r_upstr(2,i_cnt)= r_upstr(2,i_cnt)+ 1.0_GRID_SR
+	  END DO
+
+!---------- loop over nodes: find element containing upstream point
+
+	  node_loop: DO i_cnt=1, i_arlen
+
+!---------- check if upstream value is outside of the domain
+
+	    i_out= grid_domaincheck(p_mesh(i_time), r_upstr(:,i_cnt))
+
+!---------- take the intersection of the trajectory with the boundary as new upstream point
+
+	    out_domain: IF(i_out /= 0) then
+	       r_upstr(:,i_cnt)= grid_boundintersect(p_mesh(i_time), &
+	                        r_coord(:,i_cnt), r_upstr(:,i_cnt), i_info=i_stat)
+               no_intersect: IF(i_stat /= 0) THEN
+                  r_rside(i_cnt)= 0.0_GRID_SR
+                  CYCLE node_loop
+               END IF no_intersect
+	    END IF out_domain
+
+!---------- interpolate
+
+	    r_tmp= grid_coordvalue(p_mesh(i_time), r_upstr(:,i_cnt), &
+	           i_interpolorder=GRID_highorder, i_valpoint=i_val, &
+             l_relative=.FALSE., l_sfcorder=.FALSE., i_index=i_ind, i_domaincheck=0)
+
+
+	    index_valid: IF(i_ind > 0) THEN
+
+!---------- get nodes of element surrounding r_upstr
+
+	       CALL grid_getiteminfo(i_ind, 'elmt', i_arrlen=GRID_elementnodes, i_nodes=i_ttmp)
+
+!---------- get values at nodes of element surrounding r_upstr, and obtain min/max
+
+               r_min= 0.0; r_max= 0.0_GRID_SR
+               elmt_loop: DO j_cnt=1,GRID_elementnodes
+                  CALL grid_getiteminfo(i_ttmp(j_cnt), 'node', i_arrlen=GRID_nodevalues, &
+                                        r_values= r_tval, i_time=i_tim)
+                  r_min= MIN(r_min, r_tval(i_val))
+                  r_max= MAX(r_max, r_tval(i_val))	      
+               END DO elmt_loop
+
+!---------- clip value
+
+               IF(r_tmp > r_max) THEN
+                  r_tmp= r_max
+               ELSE IF(r_tmp < r_min) THEN
+                  r_tmp= r_min
+               END IF
+	    END IF index_valid
+
+!---------- set interpolation value
+
+	    r_rside(i_cnt)= r_tmp
+	 
+	    small_val: IF(abs(r_rside(i_cnt)) < r_eps) THEN
+               r_rside(i_cnt)= 0.0_GRID_SR
+	    END IF small_val
+
+	  END DO node_loop
+
+!---------- deallocate work array
+
+	  DEALLOCATE(r_upstr)
+
+	  RETURN
+	  END SUBROUTINE slm_interpolate
+
+	END MODULE SLM_simple
diff --git a/flash2d/src/options/SLM_simple.plain.f90 b/flash2d/src/options/SLM_simple.plain.f90
new file mode 100644
index 0000000..9bbfde7
--- /dev/null
+++ b/flash2d/src/options/SLM_simple.plain.f90
@@ -0,0 +1,382 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_simple
+! FUNCTION:
+!	provide simple semi-Lagrangian routines
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_step
+! FUNCTION:
+!	one step of the basic SLM algorithm
+! SYNTAX:
+!	CALL slm_step(int, real.arr, real.arr)
+! ON INPUT:
+!	...
+! ON OUTPUT:
+!	r_tracer: array with tracer values	real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_displace
+! FUNCTION:
+!	extrapolate the alpha, values for the displacements of the upstream
+!	points from the gridpoints
+! SYNTAX:
+!	CALL slm_displace(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_coord: real array of xy-coordinates		real
+! ON OUTPUT:
+!	r_alpha: displacement vectors to each point	real
+! CALLS:
+!	wind_field
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_update
+! FUNCTION:
+!	calculate the update to the velocity
+! SYNTAX:
+!	CALL slm_update(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_rside: array with right hand side values	real
+! ON OUTPUT:
+!	r_udate: array with new (updated) gid values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is trivial for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_upstream
+! FUNCTION:
+!	calculate right hand side of the equation (upstream values)
+! SYNTAX:
+!	CALL slm_upstream(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_alpha: displacement vectors to each point	real
+! ON OUTPUT:
+!	r_rside: array with right hand side values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is just interpolation for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_interpolate
+! FUNCTION:
+!	do the interpolation
+! SYNTAX:
+!	CALL slm_interpolate(grid, int, real, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	p_ogrid: grid handle to old grid (with data)	TYPE (grid_handle)
+!	r_fac:   factor at which point to interpolate	REAL
+!	i_arlen: array length for the following arrays	INTEGER
+!	r_coord: coordinate array (new grid)		REAL
+!	r_alpha: displacement array (corr. to r_coord)	REAL
+!	r_value: values on the old grid (array)		REAL
+! ON OUTPUT:
+!	r_rside: right hand side (interpolated)		REAL
+! CALLS:
+!
+! COMMENTS:
+!	this one is plain bi-cubic spline interpolation
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_step
+! COMMENTS:
+!
+! USES:
+!	FLASH_parameters, GRID_api, ADV_wind, ADV_rhs
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	4/2002
+!	2. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_simple
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE GRID_api
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_step
+	  CONTAINS
+
+!*****************************************************************
+	  SUBROUTINE slm_step(p_ghand, p_param, p_time, r_modtime, i_size, &
+	                       r_coord, r_tracer, i_newsdepth)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                         :: p_param
+	  TYPE (sw_info), INTENT(inout)                             :: p_time
+	  REAL (KIND = GRID_SR), INTENT(in)                         :: r_modtime
+	  INTEGER, INTENT(in)                                       :: i_size
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_size), INTENT(out)     :: r_tracer
+	  INTEGER, OPTIONAL, INTENT(in)                             :: i_newsdepth
+	  
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE          :: r_newvl
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_alpha
+	  INTEGER                                                   :: i_alct
+
+!---------- check size!
+
+	  IF(i_size <= 0) THEN
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'INFO [slm_step]: Zero step size, returning to calling routine'
+	    RETURN
+	  END IF
+
+!---------- allocate auxiliary arrays
+
+	  allocate(r_newvl(i_size), r_alpha(GRID_dimension,i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(38)
+	  END IF not_alloc
+
+!-SLM--------- calculate trajectory pieces (displacements)
+
+	  CALL stop_watch('start',3,p_time)
+	  CALL slm_displace(p_param, i_size, r_coord, r_alpha, r_time=r_modtime)
+	  CALL stop_watch('stop ',3,p_time)
+
+!-SLM--------- calculate right hand side
+
+	  CALL stop_watch('start',4,p_time)
+	  CALL slm_upstream(p_ghand, i_size, r_coord, r_alpha, r_newvl)
+	  CALL stop_watch('stop ',4,p_time)
+
+!-SLM--------- calculate new grid values
+
+	  CALL stop_watch('start',5,p_time)
+	  CALL slm_update(p_param, i_size, r_coord, r_newvl, r_tracer, r_time=r_modtime)
+	  CALL stop_watch('stop ',5,p_time)
+
+!-SLM--------- put alpha values to u and v field entries
+
+	  r_alpha= -r_alpha
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_newsdepth=i_newsdepth, i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  ELSE
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  END IF
+
+!-SLM--------- deallocate work arrays
+
+	  deallocate(r_alpha, r_newvl)
+
+	  RETURN
+	  END SUBROUTINE slm_step
+
+!*****************************************************************
+	  SUBROUTINE slm_displace(p_param, i_arlen, r_coord, r_alpha, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                      :: p_param
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_alpha
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                           :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_fac, r_caf, &
+	    r_axy, r_xyc
+	  REAL (KIND = GRID_SR)                                                 :: r_dt0, r_dt1, &
+	    r_dt2, r_tim
+	  INTEGER                                              :: i_cnt1, i_cnt2
+          
+!---------- set constants
+
+	  r_dt0= p_param%num%r_deltatime
+	  r_dt1= 0.5_GRID_SR* p_param%num%r_deltatime
+	  r_dt2= 1.5_GRID_SR* p_param%num%r_deltatime
+	  r_fac= 0.5_GRID_SR
+	  r_caf= 2.0_GRID_SR
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- calculate in an iteration process the displacements
+
+	  unknown_loop: DO i_cnt1=1,i_arlen
+	    r_axy= 0.0_GRID_SR
+
+	    iter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_coord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO iter_loop
+
+	    r_alpha(:,i_cnt1)= r_axy
+	  END DO unknown_loop
+
+	  RETURN
+	  END SUBROUTINE slm_displace
+
+!*****************************************************************
+	  SUBROUTINE slm_update(p_param, i_arlen, r_coord, r_rside, r_udate, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                   :: p_param
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_udate
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                          :: r_time
+	  INTEGER                                             :: i_cnt
+	  REAL (KIND = GRID_SR)                                                :: r_dt, r_tim
+
+!---------- in the linear advection case and with f90 this is just
+
+!	  r_udate= r_rside
+
+!---------- including a non-zero right hand side, we have
+
+	  r_dt= p_param%num%r_deltatime
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+	  main_loop: DO i_cnt=1, i_arlen
+	    r_udate(i_cnt)= r_rside(i_cnt)+ r_dt* slm_righthand(r_coord(:,i_cnt))
+	  END DO main_loop
+
+	  RETURN
+	  END SUBROUTINE slm_update
+
+!*****************************************************************
+	  SUBROUTINE slm_upstream(p_mesh, i_arlen, r_coord, &
+	                          r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                     :: r_fac
+
+!---------- set factor (at which point of trajectory shall i interpolate)
+
+	  r_fac= 1.0_GRID_SR
+
+!---------- in the linear advection case this is just interpolation
+
+	  CALL slm_interpolate(p_mesh, r_fac, i_arlen, r_coord, &
+	                       r_alpha, r_rside)
+
+	  RETURN
+	  END SUBROUTINE slm_upstream
+!*****************************************************************
+	  SUBROUTINE slm_interpolate(p_mesh, r_fac, i_arlen, &
+	                             r_coord, r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in)         :: r_fac
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE                   :: r_upstr
+	  REAL (KIND = GRID_SR)                                                :: r_eps
+	  INTEGER                                             :: i_cnt, i_alct, &
+	    i_val, i_out, i_stat
+
+!---------- initialize constant
+
+	  i_val= GRID_tracer
+	  r_eps= GRID_EPS
+
+!---------- allocate work array
+
+	  ALLOCATE(r_upstr(GRID_dimension,i_arlen), stat=i_alct)
+	  not_allocated: IF(i_alct /= 0) THEN
+	    CALL grid_error(60)
+	  END IF not_allocated
+
+!---------- calculate upstream coordinates
+
+	  dim_loop: DO i_cnt=1, GRID_dimension
+	    r_upstr(i_cnt,:) = r_coord(i_cnt,:)- r_fac(i_cnt)* r_alpha(i_cnt,:)
+	  END DO dim_loop
+
+!---------- loop over nodes: find element containing upstream point
+
+	  node_loop: DO i_cnt=1, i_arlen
+
+!---------- check if upstream value is outside of the domain
+
+	    i_out= grid_domaincheck(p_mesh(i_time), r_upstr(:,i_cnt))
+
+!---------- take the intersection of the trajectory with the boundary as new upstream point
+
+	    out_domain: IF(i_out /= 0) then
+	      r_upstr(:,i_cnt)= grid_boundintersect(p_mesh(i_time), &
+	                        r_coord(:,i_cnt), r_upstr(:,i_cnt), i_info=i_stat)
+	      no_intersect: IF(i_stat /= 0) THEN
+	        r_rside(i_cnt)= 0.0_GRID_SR
+	        CYCLE node_loop
+	      END IF no_intersect
+	    END IF out_domain
+
+!---------- interpolate
+
+	    r_rside(i_cnt)= grid_coordvalue(p_mesh(i_time), r_upstr(:,i_cnt), &
+	                    l_relative=.FALSE., l_sfcorder=.FALSE.,  i_interpolorder=GRID_highorder, i_valpoint=i_val)
+	    small_val: IF(abs(r_rside(i_cnt)) < r_eps) THEN
+	      r_rside(i_cnt)= 0.0_GRID_SR
+	    END IF small_val
+
+	  END DO node_loop
+
+!---------- deallocate work array
+
+	  DEALLOCATE(r_upstr)
+
+	  RETURN
+	  END SUBROUTINE slm_interpolate
+
+
+	END MODULE SLM_simple
diff --git a/flash2d/src/options/SLM_simple.tps.f90 b/flash2d/src/options/SLM_simple.tps.f90
new file mode 100644
index 0000000..53eea2e
--- /dev/null
+++ b/flash2d/src/options/SLM_simple.tps.f90
@@ -0,0 +1,382 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	SLM_simple
+! FUNCTION:
+!	provide simple semi-Lagrangian routines
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_step
+! FUNCTION:
+!	one step of the basic SLM algorithm
+! SYNTAX:
+!	CALL slm_step(int, real.arr, real.arr)
+! ON INPUT:
+!	...
+! ON OUTPUT:
+!	r_tracer: array with tracer values	real
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_displace
+! FUNCTION:
+!	extrapolate the alpha, values for the displacements of the upstream
+!	points from the gridpoints
+! SYNTAX:
+!	CALL slm_displace(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_coord: real array of xy-coordinates		real
+! ON OUTPUT:
+!	r_alpha: displacement vectors to each point	real
+! CALLS:
+!	wind_field
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_update
+! FUNCTION:
+!	calculate the update to the velocity
+! SYNTAX:
+!	CALL slm_update(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_rside: array with right hand side values	real
+! ON OUTPUT:
+!	r_udate: array with new (updated) gid values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is trivial for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_upstream
+! FUNCTION:
+!	calculate right hand side of the equation (upstream values)
+! SYNTAX:
+!	CALL slm_upstream(int, real.arr, real.arr)
+! ON INPUT:
+!	i_arlen: array length for the real arrays	integer
+!	r_alpha: displacement vectors to each point	real
+! ON OUTPUT:
+!	r_rside: array with right hand side values	real
+! CALLS:
+!
+! COMMENTS:
+!	this routine is just interpolation for linear advection
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	slm_interpolate
+! FUNCTION:
+!	do the interpolation
+! SYNTAX:
+!	CALL slm_interpolate(grid, int, real, real.arr, real.arr, real.arr)
+! ON INPUT:
+!	p_ogrid: grid handle to old grid (with data)	TYPE (grid_handle)
+!	r_fac:   factor at which point to interpolate	REAL
+!	i_arlen: array length for the following arrays	INTEGER
+!	r_coord: coordinate array (new grid)		REAL
+!	r_alpha: displacement array (corr. to r_coord)	REAL
+!	r_value: values on the old grid (array)		REAL
+! ON OUTPUT:
+!	r_rside: right hand side (interpolated)		REAL
+! CALLS:
+!
+! COMMENTS:
+!	this one is plain bi-cubic spline interpolation
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	slm_step
+! COMMENTS:
+!
+! USES:
+!	FLASH_parameters, GRID_api, ADV_wind, ADV_rhs
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version		j. behrens	4/2002
+!	2. compliant to amatos 2.0	j. behrens	7/2003
+!
+!*****************************************************************
+	MODULE SLM_simple
+	  USE FLASH_parameters
+	  USE MISC_timing
+	  USE GRID_api
+	  USE ADV_wind
+	  USE ADV_rhs
+	  PRIVATE
+	  PUBLIC  :: slm_step
+	  CONTAINS
+
+!*****************************************************************
+	  SUBROUTINE slm_step(p_ghand, p_param, p_time, r_modtime, i_size, &
+	                       r_coord, r_tracer, i_newsdepth)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps), INTENT(in) :: p_ghand
+	  TYPE (control_struct), INTENT(in)                         :: p_param
+	  TYPE (sw_info), INTENT(inout)                             :: p_time
+	  REAL (KIND = GRID_SR), INTENT(in)                         :: r_modtime
+	  INTEGER, INTENT(in)                                       :: i_size
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_size), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_size), INTENT(out)     :: r_tracer
+	  INTEGER, OPTIONAL, INTENT(in)                             :: i_newsdepth
+	  
+	  REAL (KIND = GRID_SR), DIMENSION(:), ALLOCATABLE          :: r_newvl
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE        :: r_alpha
+	  INTEGER                                                   :: i_alct
+
+!---------- check size!
+
+	  IF(i_size <= 0) THEN
+	    IF(GRID_parameters%iolog > 0) &
+	      write(GRID_parameters%iolog,*) 'INFO [slm_step]: Zero step size, returning to calling routine'
+	    RETURN
+	  END IF
+
+!---------- allocate auxiliary arrays
+
+	  allocate(r_newvl(i_size), r_alpha(GRID_dimension,i_size), stat=i_alct)
+	  not_alloc: IF(i_alct /= 0) THEN
+	    CALL grid_error(38)
+	  END IF not_alloc
+
+!-SLM--------- calculate trajectory pieces (displacements)
+
+	  CALL stop_watch('start',3,p_time)
+	  CALL slm_displace(p_param, i_size, r_coord, r_alpha, r_time=r_modtime)
+	  CALL stop_watch('stop ',3,p_time)
+
+!-SLM--------- calculate right hand side
+
+	  CALL stop_watch('start',4,p_time)
+	  CALL slm_upstream(p_ghand, i_size, r_coord, r_alpha, r_newvl)
+	  CALL stop_watch('stop ',4,p_time)
+
+!-SLM--------- calculate new grid values
+
+	  CALL stop_watch('start',5,p_time)
+	  CALL slm_update(p_param, i_size, r_coord, r_newvl, r_tracer, r_time=r_modtime)
+	  CALL stop_watch('stop ',5,p_time)
+
+!-SLM--------- put alpha values to u and v field entries
+
+	  r_alpha= -r_alpha
+	  IF(present(i_newsdepth)) THEN
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_newsdepth=i_newsdepth, i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  ELSE
+	    CALL grid_putinfo(p_ghand(i_timeplus), r_nodevalues=r_alpha, &
+	  		      i_arraypoint=(/ GRID_ucomp, GRID_vcomp /))
+	  END IF
+
+!-SLM--------- deallocate work arrays
+
+	  deallocate(r_alpha, r_newvl)
+
+	  RETURN
+	  END SUBROUTINE slm_step
+
+!*****************************************************************
+	  SUBROUTINE slm_displace(p_param, i_arlen, r_coord, r_alpha, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                      :: p_param
+	  INTEGER, INTENT(in)                                  :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in)  :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(out) :: r_alpha
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                           :: r_time
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                      :: r_fac, r_caf, &
+	    r_axy, r_xyc
+	  REAL (KIND = GRID_SR)                                                 :: r_dt0, r_dt1, &
+	    r_dt2, r_tim
+	  INTEGER                                              :: i_cnt1, i_cnt2
+          
+!---------- set constants
+
+	  r_dt0= p_param%num%r_deltatime
+	  r_dt1= 0.5_GRID_SR* p_param%num%r_deltatime
+	  r_dt2= 1.5_GRID_SR* p_param%num%r_deltatime
+	  r_fac= 0.5_GRID_SR
+	  r_caf= 2.0_GRID_SR
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+!---------- calculate in an iteration process the displacements
+
+	  unknown_loop: DO i_cnt1=1,i_arlen
+	    r_axy= 0.0_GRID_SR
+
+	    iter_loop: DO i_cnt2=1, p_param%num%i_adviterations
+	      r_xyc= r_coord(:,i_cnt1)- r_fac* r_axy
+	      r_axy= r_dt0* slm_windfield(r_xyc, r_time=r_tim)
+	    END DO iter_loop
+
+	    r_alpha(:,i_cnt1)= r_axy
+	  END DO unknown_loop
+
+	  RETURN
+	  END SUBROUTINE slm_displace
+
+!*****************************************************************
+	  SUBROUTINE slm_update(p_param, i_arlen, r_coord, r_rside, r_udate, r_time)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (control_struct), INTENT(in)                   :: p_param
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(in)                :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_udate
+	  REAL (KIND = GRID_SR), INTENT(in), OPTIONAL                          :: r_time
+	  INTEGER                                             :: i_cnt
+	  REAL (KIND = GRID_SR)                                                :: r_dt, r_tim
+
+!---------- in the linear advection case and with f90 this is just
+
+!	  r_udate= r_rside
+
+!---------- including a non-zero right hand side, we have
+
+	  r_dt= p_param%num%r_deltatime
+	  IF(present(r_time)) THEN
+	    r_tim= r_time
+	  ELSE
+	    r_tim= 0.0_GRID_SR
+	  END IF
+
+	  main_loop: DO i_cnt=1, i_arlen
+	    r_udate(i_cnt)= r_rside(i_cnt)+ r_dt* slm_righthand(r_coord(:,i_cnt))
+	  END DO main_loop
+
+	  RETURN
+	  END SUBROUTINE slm_update
+
+!*****************************************************************
+	  SUBROUTINE slm_upstream(p_mesh, i_arlen, r_coord, &
+	                          r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension)                     :: r_fac
+
+!---------- set factor (at which point of trajectory shall i interpolate)
+
+	  r_fac= 1.0_GRID_SR
+
+!---------- in the linear advection case this is just interpolation
+
+	  CALL slm_interpolate(p_mesh, r_fac, i_arlen, r_coord, &
+	                       r_alpha, r_rside)
+
+	  RETURN
+	  END SUBROUTINE slm_upstream
+!*****************************************************************
+	  SUBROUTINE slm_interpolate(p_mesh, r_fac, i_arlen, &
+	                             r_coord, r_alpha, r_rside)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  TYPE (grid_handle), DIMENSION(GRID_timesteps)       :: p_mesh
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension), INTENT(in)         :: r_fac
+	  INTEGER, INTENT(in)                                 :: i_arlen
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_coord
+	  REAL (KIND = GRID_SR), DIMENSION(GRID_dimension,i_arlen), INTENT(in) :: r_alpha
+	  REAL (KIND = GRID_SR), DIMENSION(i_arlen), INTENT(out)               :: r_rside
+	  REAL (KIND = GRID_SR), DIMENSION(:,:), ALLOCATABLE                   :: r_upstr
+	  REAL (KIND = GRID_SR)                                                :: r_eps
+	  INTEGER                                             :: i_cnt, i_alct, &
+	    i_val, i_out, i_stat
+
+!---------- initialize constant
+
+	  i_val= GRID_tracer
+	  r_eps= GRID_EPS
+
+!---------- allocate work array
+
+	  ALLOCATE(r_upstr(GRID_dimension,i_arlen), stat=i_alct)
+	  not_allocated: IF(i_alct /= 0) THEN
+	    CALL grid_error(60)
+	  END IF not_allocated
+
+!---------- calculate upstream coordinates
+
+	  dim_loop: DO i_cnt=1, GRID_dimension
+	    r_upstr(i_cnt,:) = r_coord(i_cnt,:)- r_fac(i_cnt)* r_alpha(i_cnt,:)
+	  END DO dim_loop
+
+!---------- loop over nodes: find element containing upstream point
+
+	  node_loop: DO i_cnt=1, i_arlen
+
+!---------- check if upstream value is outside of the domain
+
+	    i_out= grid_domaincheck(p_mesh(i_time), r_upstr(:,i_cnt))
+
+!---------- take the intersection of the trajectory with the boundary as new upstream point
+
+	    out_domain: IF(i_out /= 0) then
+	      r_upstr(:,i_cnt)= grid_boundintersect(p_mesh(i_time), &
+	                        r_coord(:,i_cnt), r_upstr(:,i_cnt), i_info=i_stat)
+	      no_intersect: IF(i_stat /= 0) THEN
+	        r_rside(i_cnt)= 0.0_GRID_SR
+	        CYCLE node_loop
+	      END IF no_intersect
+	    END IF out_domain
+
+!---------- interpolate
+
+	    r_rside(i_cnt)= grid_coordvalue(p_mesh(i_time), r_upstr(:,i_cnt), &
+	                    l_relative=.FALSE., l_sfcorder=.FALSE., i_interpolorder=GRID_thinplate, i_valpoint=i_val)
+	    small_val: IF(abs(r_rside(i_cnt)) < r_eps) THEN
+	      r_rside(i_cnt)= 0.0_GRID_SR
+	    END IF small_val
+
+	  END DO node_loop
+
+!---------- deallocate work array
+
+	  DEALLOCATE(r_upstr)
+
+	  RETURN
+	  END SUBROUTINE slm_interpolate
+
+
+	END MODULE SLM_simple
diff --git a/flash2d/src/petsc/Makefile.t3e b/flash2d/src/petsc/Makefile.t3e
new file mode 100644
index 0000000..83ac19f
--- /dev/null
+++ b/flash2d/src/petsc/Makefile.t3e
@@ -0,0 +1,48 @@
+##################################################################
+#   FLASH90                                                      #
+#   FLexible Adaptive Semi-Lagrangian Hack                       #
+#   written in Fortran 90                                        #
+##################################################################
+# Makefile for creating the graphics library (j.b. 1/94)         #
+# j. behrens 1/94, 3/96, 9/96, 3/98                              #
+# n.rakowsky 9/99                                                #
+# --- this is for cray t3e -                                     #
+##################################################################
+
+MAKETHING= libuGL.a
+LIBDIR= ./..
+PETSC_DIR = /fserv/userm/sfricken/petsc-2.0.24
+INCS = -I$(PETSC_DIR)  -I$(PETSC_DIR)/include   -I$(PETSC_DIR)/bmake/t3e 
+
+F90 = f90
+AR = ar
+
+FFLAGS = -dp -F -O2  -O unroll2
+ARFLAGS = vru
+
+##################################################################
+# AFTER THIS LINE, NO CHANGES SHOULD BE NECESSARY                #
+##################################################################
+
+OBJ  = graphics.o
+
+.F90.o:
+	@echo "make: Building object module from "$<
+	@$(F90) $(FFLAGS) $(INCS) -c $<
+
+$(MAKETHING):   $(OBJ)
+	@echo "make: Creating an archive from object modules"
+	@$(AR) $(ARFLAGS) $(MAKETHING) $(OBJ)
+
+clean::
+	@echo "make: Clearing directory from trash files"
+	@rm -f core a.out *.trace *.o
+
+install::
+	@echo "make: Installing library"
+	@mv $(MAKETHING) $(LIBDIR)
+
+all::
+	@make $(MAKETHING)
+	@make install
+	@make clean
diff --git a/flash2d/src/petsc/README b/flash2d/src/petsc/README
new file mode 100644
index 0000000..8dad896
--- /dev/null
+++ b/flash2d/src/petsc/README
@@ -0,0 +1,44 @@
+**************************************************************************
+ FLASH90
+ FLexible Adaptive Semi-Lagrangian Hack
+ written in Fortran 90
+
+**************************************************************************
+
+ CONTENTS OF THIS DIRECTORY "$(FLASHDIR)/lib/nogl"
+
+Makefile	- Makefile for creating the archive file libuGL.a
+Makefile.xxx	- Makefiles taylored for specific machines
+README		- this file
+graphics.F90	- f90 source file containing graphics interface for petsc
+                  (sorry, no parallel routines yet)
+
+--------------------------------------------------------------------------
+
+ WHAT TO DO HERE:
+
+If there is no petsc library on your machine, obtain a copy from 
+http://www.mcs.anl.gov/petsc/. Edit the PETSC_DIR entry in the Makefile.
+
+In order to create the library to be used in FLASH type
+	make all
+The library is then created, installed, and remaining *.o files are
+removed to save disk space.
+'make all' consists of the three commands
+	make libuGL.a
+	make install
+	make clean
+
+
+This library has to be linked together with libpetscfortran, libpetsc, libX11.
+E.g., on the Cray T3E at AWI add the library path
+ -L/fserv/userm/sfricken/petsc-2.0.24/lib/libO/t3e
+(on other machines, change path accordingly) and the libraries
+ -lpetscfortran -lpetsc -lX11
+when linking the FLASH program.
+
+**************************************************************************
+ j. behrens, 1/94, 3/96, 8/98
+ n. rakowsy, 9/99 
+**************************************************************************
+
diff --git a/flash2d/src/petsc/graphics.F90 b/flash2d/src/petsc/graphics.F90
new file mode 100644
index 0000000..6a3b734
--- /dev/null
+++ b/flash2d/src/petsc/graphics.F90
@@ -0,0 +1,591 @@
+
+      module graphics_parameters
+
+! FUNCTION: provides global parameters, variables and error handling for 
+!           the routines graphics_init, graphics_draw, graphics_quit
+
+! COMMENTS: 
+
+! LIBRARIES: Petsc
+
+! REFERENCES:
+
+! VERSION(S):
+! 	1. original version (serial)			n. rakowsky 9/99
+
+#include "include/finclude/petsc.h"
+#include "include/finclude/viewer.h"
+#include "include/finclude/draw.h"
+
+! Parameters determining window geometry (sorry, it's all static...
+! no resize during execution of the program)
+        integer, parameter :: n_pixel(2)= (/ 360,360 /)  ! size of X-window 
+
+        real, parameter :: r_border_width =.05  ! minimum width of border around computational
+                                               !  domain (relative to window size)
+
+        real, parameter :: r_max_vec_comp = .1 ! maxmimal length of wind vector components 
+                                               ! (relative to window size)
+
+!        real, parameter :: r_point_size = .01  ! size of single points (rel. to window size)
+! not enabled... DrawPointSetSize does not work (yet).
+
+! colormap:  0:31 basic colors, see (petsc-dir)/include/draw.h 
+! 32:255 uniform colormap  red -> yellow -> green -> blue)
+        integer, parameter :: i_col_min=95    ! from yellow
+        integer, parameter :: i_col_max=32    ! to red
+        integer, parameter :: i_col_range = (i_col_max-i_col_min) 
+ 
+
+! Coordinate range covered by X-window,  equals size of comp. domain + border    
+! and is determined in graphics_init.
+        real  :: x_min, y_min, x_max, y_max  
+
+! Size of font used for strings (relative to window size). Determined in graphics_init.
+        real  :: r_font_height, r_font_width 
+
+! and some parameters concerning text output
+        real, parameter :: x_offset=.01, y_offset=.01  ! relativ to window size
+        real, parameter :: r_baselineskip = 1.1        ! in terms of font height
+
+! boundary of the domain
+        integer             :: n_bound_nodes
+        real, allocatable   :: r_bound_nodes(:,:) ! dim (2,n_bound),  Coord of bound. nodes
+        
+        integer :: i_plotflag  ! flag: what to plot (tracer, wind vector, grid)
+       
+        Draw    :: drw  ! petsc-internal: identifier for plot
+
+        
+        public
+
+      contains
+
+        subroutine graphics_error(c_error_text)
+
+          ! prints c_error_text to standard out and exits the program
+
+          character(len=45), intent(in) :: c_error_text          
+
+          print *,'graphics_error: ',adjustl(c_error_text)
+          
+          stop
+
+        end subroutine graphics_error
+
+
+        subroutine graphics_print_centered(n_length,c_text)
+
+          ! prints c_text in the center of the graphics window        
+
+          integer, intent(in)                  :: n_length
+          character (len=n_length), intent(in) :: c_text
+
+          real                                 :: x_coord, y_coord
+          integer                              :: n_len
+
+          n_len = n_length
+          if (n_len*r_font_width > 1) then  ! string to large for window => clip
+             n_len = 1./r_font_width - 1
+          end if
+          ! centered output: calculate lower left corner
+          y_coord = .5*(1. - r_font_height)*(y_max - y_min) + y_min 
+          x_coord = .5*(1. - n_length*r_font_width)*(x_max - x_min) + x_min
+          if (x_coord < x_min) x_coord = x_min
+
+          call DrawString(drw,x_coord,y_coord,DRAW_BLACK,c_text(1:n_len),i_error)
+
+        end subroutine graphics_print_centered
+
+
+
+      end module graphics_parameters
+
+
+
+      subroutine setparams(p_param)
+! FUNCTION: dummy routine (if openGL graphic routines were invoked, the routine 
+!           setparams would allow the user to set parameters with an openGL interface)
+
+! VERSION(S):
+! 	1. original version 			n. rakowsky 9/99
+      end subroutine setparams
+
+!---------------------------------------------------------------------------------              
+
+
+
+      subroutine graphics_init(n_bound, x_bound, y_bound, n_wl, c_wintext, &
+           n_ml, c_polygonfile, i_plotflag_input)
+
+! FUNCTION: initializes graphic output with petsc-routines
+          
+        use graphics_parameters
+        implicit none
+
+! ON INPUT:
+!       polygon defining the boundary: n_bound nodes with coordinates x_bound, y_bound
+        integer, intent(in)              :: n_bound
+        real, intent(in)                 :: x_bound(n_bound), y_bound(n_bound)   
+
+
+        integer, intent(in)              :: n_wl, n_ml    ! size of foolowing strings
+        character (len=n_wl), intent(in) :: c_wintext     ! window title
+        character (len=n_ml), intent(in) :: c_polygonfile ! file containing landmask (ignored) 
+
+!       flag: what to plot  
+        integer, intent(in)              :: i_plotflag_input ! =  7:  grid 
+!                                                              =  8:  wind vector field
+!                                                              = 10:  tracer
+!                                                              = 11:  tracer + grid
+!                                                              other values: not supported   
+
+! ON OUTPUT: 
+
+! CALLS:
+!       graphics_error        external: module graphics_parameters 
+!       PetscInitialize       external: petsc
+!       DrawOpenX                   "
+!       DrawStringGetSize           "
+!       DrawSetCoordinates          "
+!       DrawSetDoubleBuffer         "
+
+! COMMENTS: Plotting parameters like window size are set statically in 
+!           the module graphics_parameters
+
+! LIBRARIES: Petsc
+
+! REFERENCES:
+
+! VERSION(S):
+! 	1. original version (serial)			n. rakowsky 9/99
+
+
+! auxiliary variables
+        real    :: x_range, y_range, x_domain_fraction, y_domain_fraction
+        real    :: x_left_border, x_right_border, y_lower_border, y_upper_border
+        real    :: x_min_d, x_max_d, y_min_d, y_max_d
+        real    :: r_rescale, y_3_lines, r_det
+        integer :: i_error 
+
+
+
+! determine coordinate range of the comp domain
+        x_min_d = minval(x_bound) 
+        x_max_d = maxval(x_bound)
+        x_range = x_max_d - x_min_d
+        
+        y_min_d = minval(y_bound)
+        y_max_d = maxval(y_bound)
+        y_range = y_max_d - y_min_d
+        if (x_range <= epsilon(x_min) .or. y_range <= epsilon(y_min)) then
+           call graphics_error('domain to small for machine precision')
+        endif
+
+        
+! initialize petsc, X-window          
+        call PetscInitialize(PETSC_NULL_CHARACTER,i_error)
+        call DrawOpenX(PETSC_COMM_SELF, PETSC_NULL_CHARACTER, c_wintext, &
+     &                 0, 0, n_pixel(1), n_pixel(2), drw, i_error) 
+! get font size 
+        call DrawStringGetSize(drw,r_font_width,r_font_height,i_error)
+
+
+! Add a small border around the computational domain, 
+! allow for three lines of text below the comp. domain.
+
+! the following auxiliary variables are relative to window height/width
+! (Can the computation be simplified ?!)
+
+        y_3_lines = 3.*r_baselineskip*r_font_height + 3.*y_offset
+        y_lower_border = max( y_3_lines , r_border_width)
+        y_upper_border = r_border_width
+! this remains for the vertical expansion of the comp domain
+        y_domain_fraction = 1. - y_lower_border - y_upper_border 
+        if (y_domain_fraction <= epsilon(1.)) then
+           call graphics_error('window too small, adjust parameters+recompile')
+        endif                  
+
+! keep aspect ratio
+        x_domain_fraction = (x_range/y_range) * y_domain_fraction
+
+! does this still fit into the window ? If not => rescale
+        if (x_domain_fraction > 1.-2.*r_border_width) then
+           r_rescale = (1.-2.*r_border_width) / x_domain_fraction
+           x_domain_fraction = 1.-2.*r_border_width
+           y_domain_fraction = y_domain_fraction * r_rescale
+           y_lower_border = max( y_3_lines, .5*(1.-y_domain_fraction))
+           y_upper_border = 1. - y_lower_border - y_domain_fraction
+        endif
+! center comp domain horizontally 
+        x_left_border =  .5*(1.-x_domain_fraction)
+        x_right_border = x_left_border
+
+        print *,x_left_border, x_right_border ,y_lower_border, y_upper_border
+
+! determine coordiante system of the X window including computational domain,
+! border and space for description text.
+! Sorry, this looks a little ugly... includes inverse 2x2-matrices.
+        r_det = 1./(1. - y_lower_border - y_upper_border)
+        y_min = r_det*((1.-y_upper_border) * y_min_d      - y_lower_border*y_max_d )
+        y_max = r_det*(   - y_upper_border * y_min_d + (1.-y_lower_border)*y_max_d )
+
+        r_det = 1./(1. - x_left_border - x_right_border)
+        x_min = r_det*((1.-x_right_border) * x_min_d      - x_left_border*x_max_d )
+        x_max = r_det*(   - x_right_border * x_min_d + (1.-x_left_border)*x_max_d )
+        
+        print *, x_min, x_max, y_min, y_max
+ 
+        call DrawSetCoordinates(drw, x_min, y_min, x_max, y_max, i_error) 
+        call DrawSetDoubleBuffer(drw,i_error)
+
+
+! save geometrie of the boundary
+        n_bound_nodes = n_bound
+        allocate(r_bound_nodes(2,n_bound_nodes), stat=i_error)
+        if (i_error/=0) call graphics_error('not enough memory')
+
+        r_bound_nodes(1,1:n_bound_nodes) = x_bound(1:n_bound_nodes)
+        r_bound_nodes(2,1:n_bound_nodes) = y_bound(1:n_bound_nodes)
+
+
+! initialize plotflag
+        i_plotflag = i_plotflag_input
+
+
+      end subroutine graphics_init
+
+!---------------------------------------------------------------------------------        
+
+      subroutine graphics_quit 
+
+! FUNCTION: frees memory, deletes the draw context and finishes petsc
+          
+        use graphics_parameters
+        implicit none
+
+! ON INPUT:
+
+! ON OUTPUT: 
+
+! CALLS: DrawDestroy
+!        PetscFinalize    
+
+! COMMENTS: 
+
+! LIBRARIES: Petsc
+
+! REFERENCES:
+
+! VERSION(S):
+! 	1. original version (serial)			n. rakowsky 9/99
+
+        integer :: i_error 
+  
+        call DrawDestroy(drw, i_error)
+        call PetscFinalize(i_error)
+        deallocate(r_bound_nodes)
+
+      end subroutine graphics_quit
+
+!---------------------------------------------------------------------------------        
+
+
+          
+      function graphics_draw(n_nodes_per_element, n_efine, n_nnum, &
+             x_elmt, y_elmt, x_node, y_node, z_elmt, u_node, v_node, &
+             n_fl, c_fratext, n_tl, c_tiffile, c_desc) &
+           result (i_plotquit)  
+
+! FUNCTION: frees memory, deletes the draw context and finishes petsc
+          
+        use graphics_parameters
+        implicit none
+
+! ON INPUT: 
+
+        integer, intent(in)                :: n_nodes_per_element 
+        integer, intent(in)                :: n_efine           ! number of elements
+        integer, intent(in)                :: n_nnum            ! number of nodes
+
+        real, dimension(n_nodes_per_element,n_efine), intent(in) :: & 
+     &                                        x_elmt, y_elmt, & ! elements: node coordinates
+     &                                        z_elmt            ! and (tracer) value at nodes
+!                                                                 belonging to the element    
+
+        real, dimension(n_nnum),intent(in) :: x_node, y_node, & ! nodes: coordinates and
+     &                                        u_node, v_node    ! velocity components at nodes
+
+        integer, intent(in)                :: n_fl, n_tl      ! length of following strings
+        character (len=n_fl), intent(in)   :: c_fratext       ! (ignored)  
+        character (len=n_tl), intent(in)   :: c_tiffile       ! (ignored)
+
+        TYPE descr
+           INTEGER            :: l1,l2,l3
+           CHARACTER (LEN=32) :: s1,s2,s3
+        END TYPE descr
+          
+        type(descr), intent(in)        :: c_desc     ! description text ( 3 lines that will
+                                                     ! be placed in the lower left corner)
+
+! ON OUTPUT:                               
+        integer :: i_plotquit  ! 0 plotting succesful, -1 on error
+
+! CALLS: print_descriptor          internal
+!        plot_grid                    �
+!        plot_boundary                �
+!        plot_wind_vector             �
+!        plot_tracer                  �
+!        graphics_print_centered   external: module graphics_parameters 
+!        DrawBOP                   external: petsc
+!        DrawClear                    �
+!        DrawEOP                      �
+!        DrawFlush                    �    
+! 
+! CALLS BY INTERNAL ROUTINES: 
+!        DrawPoint                 external: petsc   
+!        DrawLine                     "
+!        DrawTriangle                 "
+!        DrawString                   "
+
+! COMMENTS: 
+
+! LIBRARIES: Petsc
+
+! REFERENCES:
+
+! VERSION(S):
+! 	1. original version (serial)			n. rakowsky 9/99
+
+
+! auxiliary variables
+
+        integer            :: i_col(n_nodes_per_element) ! colour corresponding to 
+                                                         ! value at element node
+
+        real               :: z_max, z_min, z_range_inv  ! value range 
+        character (len=50) :: c_text                     ! text f"ur evtl. ausgaben
+        
+!   auxiliary variables
+        integer            :: i,n, n_length
+        integer :: i_error 
+        
+
+
+        i_plotquit = -1
+
+        call DrawBOP(drw,i_error)
+        if (i_error /= 0) return
+        call DrawClear(drw)
+        
+        call print_descriptor
+
+
+        select case (i_plotflag)
+
+           case (7)           ! plotting grid 
+
+              call plot_grid
+              
+           case (8)           ! plotting wind vector
+
+              call plot_boundary
+              call plot_wind_vector
+
+           case (10)          ! plotting tracer
+
+              call plot_boundary
+              call plot_tracer   
+           
+           case (11)          ! plotting tracer + grid
+
+              call plot_tracer
+              call plot_grid
+
+           case default
+
+              write(c_text,*) 'TYPE_OF_PLOTTING',i_plotflag,'not supported'
+              c_text = adjustl(c_text)
+              n_length = len_trim(c_text)
+              call graphics_print_centered(n_length,c_text)
+              
+        end select
+
+
+        call DrawEOP(drw,i_error)
+        if (i_error /= 0) return
+            
+        call DrawFlush(drw,i_error)
+        if (i_error /= 0) return
+        
+        i_plotquit = 0
+
+      contains
+
+
+        subroutine print_descriptor
+
+          real              :: x_coord, y_coord
+          integer           :: n_max_length, n_length
+          integer           :: i_box_width
+          real              :: x_box, y_box
+          character(len=32) :: c_text
+
+
+! max number of characters fitting into a line
+          if (r_font_width == 0) then
+             return
+          endif
+          n_max_length = 1./r_font_width - 1
+
+! position of left margin
+          x_coord = x_min + x_offset*(x_max-x_min)       
+
+! 1. line
+          c_text = adjustl(c_desc%s1)
+          n_length = len_trim(c_text)
+          if (n_length > n_max_length) c_text = c_text(1:n_max_length)
+          i_box_width = n_length
+
+          y_coord = y_min + (y_offset + 2*r_baselineskip*r_font_height)*(y_max-y_min)
+          call DrawString(drw,x_coord,y_coord,DRAW_BLACK,c_text,i_error)
+
+! 2. line
+          c_text = adjustl(c_desc%s2)
+          n_length = len_trim(c_text)
+          if (n_length > n_max_length) c_text = c_text(1:n_max_length)
+          i_box_width = max(n_length,i_box_width)
+
+          y_coord = y_min + (y_offset +   r_baselineskip*r_font_height)*(y_max-y_min)
+          call DrawString(drw,x_coord,y_coord,DRAW_BLACK,c_text,i_error)
+
+! 3. line
+          c_text = adjustl(c_desc%s3)
+          n_length = len_trim(c_text)
+          if (n_length > n_max_length) c_text = c_text(1:n_max_length)
+          i_box_width = max(n_length,i_box_width)
+
+          y_coord = y_min +  y_offset*(y_max-y_min)
+          call DrawString(drw,x_coord,y_coord,DRAW_BLACK,c_text,i_error)
+
+
+! and a rectangular box (lower left corner  (x_min, y_min),
+!                        upper right corner (x_box, y_box)
+
+          i_box_width = min(n_max_length,i_box_width)  ! number of char in box
+
+          x_box = x_min + (i_box_width*r_font_width + 2*x_offset)*(x_max-x_min)
+ 
+          y_box = y_min + (3*r_baselineskip*r_font_height + 2*y_offset)*(y_max-y_min)
+          
+          call DrawLine(drw, x_min,y_box, x_box,y_box, DRAW_BLACK,i_error)
+          call DrawLine(drw, x_box,y_min, x_box,y_box, DRAW_BLACK,i_error)
+
+        end subroutine print_descriptor
+
+
+        subroutine plot_boundary
+
+          do n=1,n_bound_nodes-1
+             call DrawLine(drw, r_bound_nodes(1,n),   r_bound_nodes(2,n), &
+                                r_bound_nodes(1,n+1), r_bound_nodes(2,n+1), &
+                                                              DRAW_BLACK, i_error)
+          enddo
+          call DrawLine(drw, r_bound_nodes(1,n_bound_nodes),r_bound_nodes(2,n_bound_nodes), &
+                             r_bound_nodes(1,1),            r_bound_nodes(2,1), &
+                                                              DRAW_BLACK, i_error)
+
+        end subroutine plot_boundary
+
+
+        subroutine plot_grid
+
+ ! plot grid lines element wise
+          do n=1,n_efine
+             do i=1,n_nodes_per_element-1
+                call DrawLine(drw, x_elmt(i,n), y_elmt(i,n), x_elmt(i+1,n), y_elmt(i+1,n), &
+                     &                       DRAW_BLACK, i_error)
+             enddo
+             i = n_nodes_per_element
+             call DrawLine(drw, x_elmt(i,n), y_elmt(i,n), x_elmt(1,n), y_elmt(1,n), &
+                  &                    DRAW_BLACK, i_error)
+          enddo
+
+        end subroutine plot_grid
+
+
+
+        subroutine plot_wind_vector
+
+          real :: u_max, v_max        ! maximal velocity values (absolute)
+          real :: r_scale             ! scaling factor
+          real :: x_end, y_end        ! end point of wind vector
+
+          real :: u_scale, v_scale
+
+          ! determine maximal velocity value
+          u_max = maxval(abs(u_node))
+          v_max = maxval(abs(v_node))
+
+          ! determine scale factor
+          if (u_max > 0) then
+             u_scale = (x_max - x_min)/u_max
+          else 
+             u_scale = 1
+          endif
+          if (v_max > 0) then
+             v_scale  = (y_max - y_min)/v_max
+          else
+             v_scale = 1
+          endif
+          r_scale  = r_max_vec_comp * min(u_scale,v_scale)
+
+! enlarge the vector starting point  -- sorry, doesn't work (yet ?!)
+!          call DrawPointSetSize(drw,r_point_size,i_error)
+
+          ! plot a velocity vector at each node
+          do i=1,n_nnum
+             x_end = x_node(i) + r_scale*u_node(i)
+             x_end = min(x_max, max(x_end, x_min))   ! outside window ? => clip
+
+             y_end = y_node(i) + r_scale*v_node(i)
+             y_end = min(y_max, max(y_end, y_min))   ! outside window ? => clip
+
+             call DrawLine(drw,x_node(i),y_node(i), x_end, y_end,DRAW_RED,i_error)
+             call DrawPoint(drw,x_node(i),y_node(i),DRAW_BLACK,i_error)
+          enddo
+
+        end subroutine plot_wind_vector
+
+
+        subroutine plot_tracer
+
+          ! determining value range
+          z_min = minval(z_elmt)
+          z_max = maxval(z_elmt)
+          z_range_inv = 1. / (z_max - z_min)
+
+
+          if (n_nodes_per_element == 3) then
+             do n=1,n_efine
+                i_col(1) = i_col_min + i_col_range * (z_elmt(1,n) - z_min)*z_range_inv 
+                i_col(2) = i_col_min + i_col_range * (z_elmt(2,n) - z_min)*z_range_inv 
+                i_col(3) = i_col_min + i_col_range * (z_elmt(3,n) - z_min)*z_range_inv 
+                
+                call DrawTriangle(drw, x_elmt(1,n),y_elmt(1,n), x_elmt(2,n),y_elmt(2,n), & 
+                     x_elmt(3,n),y_elmt(3,n), i_col(1), i_col(2), i_col(3), i_error)
+             enddo
+          else
+             write(c_text,*) 'TYPE_OF_PLOTTING',i_plotflag,'for triangular grid only'
+             c_text = adjustl(c_text)
+             n_length = len_trim(c_text)
+             call graphics_print_centered(n_length,c_text)
+          endif
+
+        end subroutine plot_tracer
+
+
+      end function graphics_draw
+
+
+          
diff --git a/flash2d/src/system/cray-f90/MISC_system.f90 b/flash2d/src/system/cray-f90/MISC_system.f90
new file mode 100644
index 0000000..532999c
--- /dev/null
+++ b/flash2d/src/system/cray-f90/MISC_system.f90
@@ -0,0 +1,97 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	MISC_system
+! FUNCTION:
+!	contains system dependent functions (e.g. command line io)
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	sys_getcmdargs
+! FUNCTION:
+!	same as getarg (read command line option)
+! SYNTAX:
+!	call sys_getcmdargs(int, char)
+! ON INPUT:
+!	i_pos:	position of command line option		integer
+! ON OUTPUT:
+!	c_opt:	option read from command line		character string
+! CALLS:
+!
+! COMMENTS:
+!	i_pos=0 returns the command itself
+!-----------------------------------------------------------------
+!
+! NAME:
+!	sys_numcmdargs
+! FUNCTION:
+!	same as iargc (tell number of command line options)
+! SYNTAX:
+!	int= sys_numcmdargs
+! ON INPUT:
+!
+! ON OUTPUT:
+!	i_argnum: number of command line items		integer
+! CALLS:
+!
+! COMMENTS:
+!	i_argnum excludes the command itself, thus i_argnum=0
+!	indicates that there are no command line options given.
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	sys_getcmdargs, sys_numcmdargs
+! COMMENTS:
+!	this is for the CRAY CF90 compiler,
+!	supporting POSIX ipxfargc and pxfgetarg
+! USES:
+!
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version	j. behrens	1/97
+!
+!*****************************************************************
+	MODULE MISC_system
+	  PRIVATE
+	  PUBLIC :: sys_getcmdargs, sys_numcmdargs
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE sys_getcmdargs(i_pos, c_opt, i_len)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  INTEGER, INTENT(in)             :: i_pos
+	  CHARACTER (len=*), INTENT(out)  :: c_opt
+	  INTEGER, OPTIONAL               :: i_len
+	  INTEGER                         :: i_err
+	  EXTERNAL pxfgetarg
+
+!---------- this uses a POSIX routine. no error code is checked, no matching
+!---------- of length is checked!!!
+
+	  CALL pxfgetarg(i_pos, c_opt, i_len, i_err)
+
+	  RETURN
+	  END SUBROUTINE sys_getcmdargs
+!*****************************************************************
+	  FUNCTION sys_numcmdargs() RESULT(i_argnum)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  INTEGER :: i_argnum
+	  EXTERNAL   ipxfargc
+	  INTEGER :: ipxfargc
+
+	  i_argnum= ipxfargc()
+
+	  RETURN
+	  END FUNCTION sys_numcmdargs
+	END MODULE MISC_system
diff --git a/flash2d/src/system/gfortran/MISC_system.f90 b/flash2d/src/system/gfortran/MISC_system.f90
new file mode 100644
index 0000000..906c838
--- /dev/null
+++ b/flash2d/src/system/gfortran/MISC_system.f90
@@ -0,0 +1,96 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!   MISC_system
+! FUNCTION:
+!   contains system dependent functions (e.g. command line io)
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!   sys_getcmdargs
+! FUNCTION:
+!   same as getarg (read command line option)
+! SYNTAX:
+!   call sys_getcmdargs(int, char)
+! ON INPUT:
+!   i_pos:  position of command line option     integer
+! ON OUTPUT:
+!   c_opt:  option read from command line       character string
+! CALLS:
+!
+! COMMENTS:
+!   i_pos=0 returns the command itself
+!-----------------------------------------------------------------
+!
+! NAME:
+!   sys_numcmdargs
+! FUNCTION:
+!   same as iargc (tell number of command line options)
+! SYNTAX:
+!   int = sys_numcmdargs
+! ON INPUT:
+!
+! ON OUTPUT:
+!   i_argnum: number of command line items      integer
+! CALLS:
+!
+! COMMENTS:
+!   i_argnum excludes the command itself, thus i_argnum=0
+!   indicates that there are no command line options given.
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!   sys_getcmdargs, sys_numcmdargs
+! COMMENTS:
+!   this is for "standard" compilers, supporting iargc and getarg
+! USES:
+!
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!  1. original version              j. behrens      01/97
+!
+!*****************************************************************
+MODULE MISC_system
+
+  PRIVATE
+  PUBLIC :: sys_getcmdargs, sys_numcmdargs
+
+  CONTAINS
+!*****************************************************************
+  SUBROUTINE sys_getcmdargs(i_pos, c_opt, i_len)
+
+    IMPLICIT NONE
+
+!---------- local declarations
+
+    INTEGER, INTENT(in)                             :: i_pos
+    CHARACTER (len=*), INTENT(out)                  :: c_opt
+    INTEGER, OPTIONAL                               :: i_len
+
+!---------- read command line argument
+
+    CALL GET_COMMAND_ARGUMENT(i_pos, VALUE=c_opt)
+
+    RETURN
+  END SUBROUTINE sys_getcmdargs
+
+!*****************************************************************
+  FUNCTION sys_numcmdargs() RESULT(i_argnum)
+
+    IMPLICIT NONE
+
+!---------- local declarations
+
+    INTEGER                                         :: i_argnum
+
+    i_argnum= COMMAND_ARGUMENT_COUNT()
+
+    RETURN
+  END FUNCTION sys_numcmdargs
+
+!*****************************************************************
+END MODULE MISC_system
diff --git a/flash2d/src/system/gfortran/MISC_wrapper.c b/flash2d/src/system/gfortran/MISC_wrapper.c
new file mode 100644
index 0000000..afaba06
--- /dev/null
+++ b/flash2d/src/system/gfortran/MISC_wrapper.c
@@ -0,0 +1,15 @@
+/***************************************************
+* wrapqsort.c
+* this is a hack to link gfortran programs to qsort
+***************************************************/
+
+#include <stdlib.h>
+
+#ifdef macosx_gfortran
+void qsort_(void* data, int* c, int* s, int* fn)
+#else
+void qsort_(void* data, int* c, int* s, __compar_fn_t fn)
+#endif
+{
+  qsort(data, (size_t)*c, (size_t)*s, fn);
+}
diff --git a/flash2d/src/system/mpi/PAR_datatype.f b/flash2d/src/system/mpi/PAR_datatype.f
new file mode 100644
index 0000000..2bf5a89
--- /dev/null
+++ b/flash2d/src/system/mpi/PAR_datatype.f
@@ -0,0 +1,470 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	PAR_datatype
+! FUNCTION:
+!	define the data structures for communication
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	parsys_makeinttype
+! FUNCTION:
+!	create integer data type for communication (of derived types)
+! SYNTAX:
+!	CALL parsys_makeinttype(int, int, int.arr)
+! ON INPUT:
+!	i_mpipnt:   pointer to type in array i_mpitypes	INTEGER
+!	i_mpilen:   length of array i_mpitypes		INTEGER
+! ON OUTPUT:
+!	i_mpitypes: array containig data type def.s	INTEGER
+! CALLS:
+!	print_error
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	parsys_makerealtype
+! FUNCTION:
+!	create real data type for communication (of derived types)
+! SYNTAX:
+!	CALL parsys_makerealtype(int, int, int.arr)
+! ON INPUT:
+!	i_mpipnt:   pointer to type in array i_mpitypes	INTEGER
+!	i_mpilen:   length of array i_mpitypes		INTEGER
+! ON OUTPUT:
+!	i_mpitypes: array containig data type def.s	INTEGER
+! CALLS:
+!	print_error
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	parsys_makeelmttype
+! FUNCTION:
+!	create element derived data type for communication
+! SYNTAX:
+!	CALL parsys_makeelmttype(int, int, int.arr)
+! ON INPUT:
+!	i_mpipnt:   pointer to type in array i_mpitypes	INTEGER
+!	i_mpilen:   length of array i_mpitypes		INTEGER
+! ON OUTPUT:
+!	i_mpitypes: array containig data type def.s	INTEGER
+! CALLS:
+!	print_error, mpi_address, mpi_type_struct, mpi_type_commit
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	parsys_makeedgetype
+! FUNCTION:
+!	create edge derived data type for communication
+! SYNTAX:
+!	CALL parsys_makeedgetype(int, int, int.arr)
+! ON INPUT:
+!	i_mpipnt:   pointer to type in array i_mpitypes	INTEGER
+!	i_mpilen:   length of array i_mpitypes		INTEGER
+! ON OUTPUT:
+!	i_mpitypes: array containig data type def.s	INTEGER
+! CALLS:
+!	print_error, mpi_address, mpi_type_struct, mpi_type_commit
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	parsys_makeinttype
+! FUNCTION:
+!	create node derived data type for communication
+! SYNTAX:
+!	CALL parsys_makenodetype(int, int, int.arr)
+! ON INPUT:
+!	i_mpipnt:   pointer to type in array i_mpitypes	INTEGER
+!	i_mpilen:   length of array i_mpitypes		INTEGER
+! ON OUTPUT:
+!	i_mpitypes: array containig data type def.s	INTEGER
+! CALLS:
+!	print_error, mpi_address, mpi_type_struct, mpi_type_commit
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	parsys_makeinfotype
+! FUNCTION:
+!	create info derived data type for communication
+! SYNTAX:
+!	CALL parsys_makeinfotype(int, int, int.arr)
+! ON INPUT:
+!	i_mpipnt:   pointer to type in array i_mpitypes	INTEGER
+!	i_mpilen:   length of array i_mpitypes		INTEGER
+! ON OUTPUT:
+!	i_mpitypes: array containig data type def.s	INTEGER
+! CALLS:
+!	print_error, mpi_address, mpi_type_struct, mpi_type_commit
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!
+! COMMENTS:
+!	CAUTION: when changing the type definition in FEM_define,
+!	         the definitions have to be changed here as well!
+!
+! USES:
+!
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version	j. behrens	4/98
+!
+!*****************************************************************
+	MODULE PAR_datatype
+
+	USE MISC_globalparam
+	USE MISC_error
+	USE FEM_define
+	USE PAR_define
+
+!---------- include the mpi definitions
+
+	INCLUDE "mpif.h"
+
+	CONTAINS
+!*****************************************************************
+	SUBROUTINE parsys_makeinttype(i_mpipnt, i_mpilen, i_mpitypes)
+
+	IMPLICIT NONE
+	
+!---------- local declarations
+
+	INTEGER, INTENT(in)                 :: i_mpipnt, i_mpilen
+	INTEGER, DIMENSION(DEF_numtypes)    :: i_mpitypes
+	INTEGER                             :: i_err
+
+!---------- check length
+
+	IF(i_mpipnt > DEF_numtypes) CALL print_error(199)
+
+!---------- this is the normal integer type
+
+	IF(i_mpipnt == DEF_inttype) THEN
+	  i_mpitypes(i_mpipnt) = MPI_INTEGER
+	ELSE
+	  CALL print_error(199)
+	END IF
+
+	RETURN
+	END SUBROUTINE parsys_makeinttype
+!*****************************************************************
+	SUBROUTINE parsys_makerealtype(i_mpipnt, i_mpilen, i_mpitypes)
+
+	IMPLICIT NONE
+	
+!---------- local declarations
+
+	INTEGER, INTENT(in)                 :: i_mpipnt, i_mpilen
+	INTEGER, DIMENSION(DEF_numtypes)    :: i_mpitypes
+	INTEGER                             :: i_err
+
+!---------- check length
+
+	IF(i_mpipnt > DEF_numtypes) CALL print_error(199)
+
+!---------- this is the normal integer type
+
+	IF(i_mpipnt == DEF_realtype) THEN
+	  i_mpitypes(i_mpipnt) = MPI_REAL
+	ELSE
+	  CALL print_error(199)
+	END IF
+
+	RETURN
+	END SUBROUTINE parsys_makerealtype
+!*****************************************************************
+	SUBROUTINE parsys_makeelmttype(i_mpipnt, i_mpilen, i_mpitypes)
+
+	IMPLICIT NONE
+	
+!---------- local declarations
+
+	INTEGER, INTENT(in)                 :: i_mpipnt, i_mpilen
+	INTEGER, DIMENSION(i_mpilen)        :: i_mpitypes
+	INTEGER                             :: i_err
+	INTEGER                             :: i_mpitmp, i_cnt
+	INTEGER, PARAMETER                  :: i_mpie= 13
+	INTEGER, DIMENSION(i_mpie)          :: i_mpiecnt, i_mpietyp, i_mpiedis
+	TYPE (elmt)                         :: p_etmp
+
+!---------- behave differently according to the different data types
+
+	i_err= MPI_SUCCESS
+
+!---------- check length
+
+	IF(i_mpipnt > DEF_numtypes) CALL print_error(199)
+
+!---------- this is the element type
+
+	elmt_typ: IF(i_mpipnt ==  DEF_elmttype) THEN
+
+!---------- conter array
+
+	  i_mpiecnt= (/ 1, DEF_elnodes, DEF_eledges, 3, DEF_timesteps, DEF_timesteps, &
+	                DEF_evalsize, DEF_timesteps, DEF_elchild* DEF_timesteps, &
+	                3, 1, DEF_timesteps, DEF_elchild* DEF_timesteps  /)
+!----------- types array
+
+	  i_mpietyp= (/ MPI_INTEGER, MPI_INTEGER, MPI_INTEGER, MPI_INTEGER, &
+	                MPI_INTEGER, MPI_INTEGER, MPI_REAL, MPI_INTEGER, MPI_INTEGER, &
+	                MPI_INTEGER, MPI_REAL, MPI_INTEGER, MPI_INTEGER /)
+
+!---------- address displacements array
+
+	  CALL mpi_address(p_etmp%def%i_indx, i_mpiedis(1), i_err)
+	  CALL mpi_address(p_etmp%def%p_node(1), i_mpiedis(2), i_err)
+	  CALL mpi_address(p_etmp%def%p_edge(1), i_mpiedis(3), i_err)
+	  CALL mpi_address(p_etmp%att%i_time, i_mpiedis(4), i_err)
+	  CALL mpi_address(p_etmp%att%i_edge(1), i_mpiedis(5), i_err)
+	  CALL mpi_address(p_etmp%att%i_stat(1), i_mpiedis(6), i_err)
+	  CALL mpi_address(p_etmp%att%r_vals(1), i_mpiedis(7), i_err)
+	  CALL mpi_address(p_etmp%lnk%p_prnt(1), i_mpiedis(8), i_err)
+	  CALL mpi_address(p_etmp%lnk%p_chil(1,1), i_mpiedis(9), i_err)
+	  CALL mpi_address(p_etmp%par%i_proc, i_mpiedis(10), i_err)
+	  CALL mpi_address(p_etmp%par%r_load, i_mpiedis(11), i_err)
+	  CALL mpi_address(p_etmp%par%i_prnt(1), i_mpiedis(12), i_err)
+	  CALL mpi_address(p_etmp%par%i_chil(1,1), i_mpiedis(13), i_err)
+	  i_mpitmp= i_mpiedis(1)
+	  i_mpiedis= i_mpiedis- i_mpitmp
+
+!---------- type definition
+
+	  CALL mpi_type_struct(i_mpie, i_mpiecnt, i_mpiedis, i_mpietyp, i_mpitmp, i_err)
+	  CALL mpi_type_commit(i_mpitmp, i_err)
+	  i_mpitypes(i_mpipnt) = i_mpitmp
+
+	  IF(i_err /= MPI_SUCCESS) THEN
+	    IF(i_iolog > 0) WRITE(i_iolog,*) 'ERROR: parallel error code:',i_err
+	    CALL print_error(160)
+	  END IF	    
+
+	END IF elmt_typ
+	    
+	RETURN
+	END SUBROUTINE parsys_makeelmttype
+!*****************************************************************
+	SUBROUTINE parsys_makeedgetype(i_mpipnt, i_mpilen, i_mpitypes)
+
+	IMPLICIT NONE
+	
+!---------- local declarations
+
+	INTEGER, INTENT(in)                 :: i_mpipnt, i_mpilen
+	INTEGER, DIMENSION(i_mpilen)        :: i_mpitypes
+	INTEGER                             :: i_err
+	INTEGER                             :: i_mpitmp, i_cnt
+	INTEGER, PARAMETER                  :: i_mpig= 16
+	INTEGER, DIMENSION(i_mpig)          :: i_mpigcnt, i_mpigtyp, i_mpigdis
+	TYPE (edge)                         :: p_gtmp
+
+!---------- behave differently according to the different data types
+
+	i_err= MPI_SUCCESS
+
+!---------- check length
+
+	IF(i_mpipnt > DEF_numtypes) CALL print_error(199)
+
+!---------- this is the element type
+
+	edge_typ: IF(i_mpipnt ==  DEF_edgetype) THEN
+
+!---------- conter array
+
+	  i_mpigcnt= (/ 1, DEF_egnodes, 1, DEF_egelems, DEF_timesteps, 1, DEF_timesteps, &
+	                DEF_egchild* DEF_timesteps, 1, 3, DEF_egparcopy, DEF_egparcopy, &
+	                DEF_timesteps, DEF_egelems, DEF_egchild*DEF_timesteps, 1 /)
+
+!---------- types array
+
+	  i_mpigtyp= MPI_INTEGER
+
+!---------- address displacements array
+
+	  CALL mpi_address(p_gtmp%def%i_indx, i_mpigdis(1), i_err)
+	  CALL mpi_address(p_gtmp%def%p_node(1), i_mpigdis(2), i_err)
+	  CALL mpi_address(p_gtmp%att%i_time, i_mpigdis(3), i_err)
+	  CALL mpi_address(p_gtmp%att%p_elem(1), i_mpigdis(4), i_err)
+	  CALL mpi_address(p_gtmp%att%i_node(1), i_mpigdis(5), i_err)
+	  CALL mpi_address(p_gtmp%att%i_boun, i_mpigdis(6), i_err)
+	  CALL mpi_address(p_gtmp%att%i_stat(1), i_mpigdis(7), i_err)
+	  CALL mpi_address(p_gtmp%lnk%p_chil(1,1), i_mpigdis(8), i_err)
+	  CALL mpi_address(p_gtmp%lnk%p_peri, i_mpigdis(9), i_err)
+	  CALL mpi_address(p_gtmp%par%i_proc, i_mpigdis(10), i_err)
+	  CALL mpi_address(p_gtmp%par%i_cppr(1), i_mpigdis(11), i_err)
+	  CALL mpi_address(p_gtmp%par%i_cpid(1), i_mpigdis(12), i_err)
+	  CALL mpi_address(p_gtmp%par%i_node(1), i_mpigdis(13), i_err)
+	  CALL mpi_address(p_gtmp%par%i_elem(1), i_mpigdis(14), i_err)
+	  CALL mpi_address(p_gtmp%par%i_chil(1,1), i_mpigdis(15), i_err)
+	  CALL mpi_address(p_gtmp%par%i_peri, i_mpigdis(16), i_err)
+	  i_mpitmp= i_mpigdis(1)
+	  i_mpigdis= i_mpigdis- i_mpitmp
+
+!---------- type definition
+
+	  CALL mpi_type_struct(i_mpig, i_mpigcnt, i_mpigdis, i_mpigtyp, i_mpitmp, i_err)
+	  CALL mpi_type_commit(i_mpitmp, i_err)
+	  i_mpitypes(i_mpipnt) = i_mpitmp
+
+	  IF(i_err /= MPI_SUCCESS) THEN
+	    IF(i_iolog > 0) WRITE(i_iolog,*) 'ERROR: parallel error code:',i_err
+	    CALL print_error(160)
+	  END IF
+
+	END IF edge_typ
+	    
+	RETURN
+	END SUBROUTINE parsys_makeedgetype
+!*****************************************************************
+	SUBROUTINE parsys_makenodetype(i_mpipnt, i_mpilen, i_mpitypes)
+
+	IMPLICIT NONE
+	
+!---------- local declarations
+
+	INTEGER, INTENT(in)                 :: i_mpipnt, i_mpilen
+	INTEGER, DIMENSION(i_mpilen)        :: i_mpitypes
+	INTEGER                             :: i_err
+	INTEGER                             :: i_mpitmp, i_cnt
+	INTEGER, PARAMETER                  :: i_mpin= 14
+	INTEGER, DIMENSION(i_mpin)          :: i_mpincnt, i_mpintyp, i_mpindis
+	TYPE (node)                         :: p_ntmp
+
+!---------- behave differently according to the different data types
+
+	i_err= MPI_SUCCESS
+
+!---------- check length
+
+	IF(i_mpipnt > DEF_numtypes) CALL print_error(199)
+
+!---------- this is the element type
+
+	node_typ: IF(i_mpipnt ==  DEF_nodetype) THEN
+
+!---------- conter array
+
+	  i_mpincnt= (/ 1, DEF_dimension, 2, DEF_timesteps, DEF_timesteps, &
+	                DEF_ndpatch* DEF_timesteps, DEF_nvalsize* DEF_timesteps, &
+	                1, 3, DEF_ndparcopy, DEF_ndparcopy, 1, &
+	                DEF_ndpatch* DEF_timesteps, 1 /)
+
+!---------- types array
+
+	  i_mpintyp= (/ MPI_INTEGER, MPI_REAL, MPI_INTEGER, MPI_INTEGER, &
+	                MPI_INTEGER, MPI_INTEGER, MPI_REAL, MPI_INTEGER, &
+	                MPI_INTEGER, MPI_INTEGER, MPI_INTEGER, MPI_INTEGER, &
+	                MPI_INTEGER, MPI_INTEGER /)
+
+!---------- address displacements array
+
+	  CALL mpi_address(p_ntmp%def%i_indx, i_mpindis(1), i_err)
+	  CALL mpi_address(p_ntmp%def%r_coor(1), i_mpindis(2), i_err)
+	  CALL mpi_address(p_ntmp%att%i_time, i_mpindis(3), i_err)
+	  CALL mpi_address(p_ntmp%att%i_ptch(1), i_mpindis(4), i_err)
+	  CALL mpi_address(p_ntmp%att%i_stat(1), i_mpindis(5), i_err)
+	  CALL mpi_address(p_ntmp%att%p_ptch(1,1), i_mpindis(6), i_err)
+	  CALL mpi_address(p_ntmp%att%r_vals(1,1), i_mpindis(7), i_err)
+	  CALL mpi_address(p_ntmp%lnk%p_peri, i_mpindis(8), i_err)
+	  CALL mpi_address(p_ntmp%par%i_proc, i_mpindis(9), i_err)
+	  CALL mpi_address(p_ntmp%par%i_cppr(1), i_mpindis(10), i_err)
+	  CALL mpi_address(p_ntmp%par%i_cpid(1), i_mpindis(11), i_err)
+	  CALL mpi_address(p_ntmp%par%i_edge, i_mpindis(12), i_err)
+	  CALL mpi_address(p_ntmp%par%i_ptcp(1,1), i_mpindis(13), i_err)
+	  CALL mpi_address(p_ntmp%par%i_peri, i_mpindis(14), i_err)
+	  i_mpitmp= i_mpindis(1)
+	  i_mpindis= i_mpindis- i_mpitmp
+
+!---------- type definition
+
+	  CALL mpi_type_struct(i_mpin, i_mpincnt, i_mpindis, i_mpintyp, i_mpitmp, i_err)
+	  CALL mpi_type_commit(i_mpitmp, i_err)
+	  i_mpitypes(i_mpipnt) = i_mpitmp
+
+	  IF(i_err /= MPI_SUCCESS) THEN
+	    IF(i_iolog > 0) WRITE(i_iolog,*) 'ERROR: parallel error code:',i_err
+	    CALL print_error(160)
+	  END IF
+
+	END IF node_typ
+	    
+	RETURN
+	END SUBROUTINE parsys_makenodetype
+!*****************************************************************
+	SUBROUTINE parsys_makeinfotype(i_mpipnt, i_mpilen, i_mpitypes)
+
+	IMPLICIT NONE
+	
+!---------- local declarations
+
+	INTEGER, INTENT(in)                 :: i_mpipnt, i_mpilen
+	INTEGER, DIMENSION(i_mpilen)        :: i_mpitypes
+	INTEGER                             :: i_err
+	INTEGER                             :: i_mpitmp, i_cnt
+	INTEGER, PARAMETER                  :: i_mpii= 5
+	INTEGER, DIMENSION(i_mpii)          :: i_mpiicnt, i_mpiityp, i_mpiidis
+	TYPE (grid_glob)                    :: p_itmp
+
+!---------- behave differently according to the different data types
+
+	i_err= MPI_SUCCESS
+
+!---------- check length
+
+	IF(i_mpipnt > DEF_numtypes) CALL print_error(199)
+
+!---------- this is the element type
+
+	info_typ: IF(i_mpipnt ==  DEF_infotype) THEN
+
+!---------- conter array
+
+	  i_mpiicnt= (/ 1, 1, 1, 1, 1 /)
+
+!---------- types array
+
+	  i_mpiityp= MPI_INTEGER
+
+!---------- address displacements array
+
+	  CALL mpi_address(p_itmp%i_totalelements, i_mpiidis(1), i_err)
+	  CALL mpi_address(p_itmp%i_fineelements, i_mpiidis(2), i_err)
+	  CALL mpi_address(p_itmp%i_totaledges, i_mpiidis(3), i_err)
+	  CALL mpi_address(p_itmp%i_fineedges, i_mpiidis(4), i_err)
+	  CALL mpi_address(p_itmp%i_totalnodes, i_mpiidis(5), i_err)
+	  i_mpitmp= i_mpiidis(1)
+	  i_mpiidis= i_mpiidis- i_mpitmp
+
+!---------- type definition
+
+	  CALL mpi_type_struct(i_mpii, i_mpiicnt, i_mpiidis, i_mpiityp, i_mpitmp, i_err)
+	  CALL mpi_type_commit(i_mpitmp, i_err)
+	  i_mpitypes(i_mpipnt) = i_mpitmp
+
+	  IF(i_err /= MPI_SUCCESS) THEN
+	    IF(i_iolog > 0) WRITE(i_iolog,*) 'ERROR: parallel error code:',i_err
+	    CALL print_error(160)
+	  END IF	    
+
+	END IF info_typ
+	    
+	RETURN
+	END SUBROUTINE parsys_makeinfotype
+
+	END MODULE PAR_datatype
diff --git a/flash2d/src/system/mpi/PAR_sysstop.f b/flash2d/src/system/mpi/PAR_sysstop.f
new file mode 100644
index 0000000..9664c5f
--- /dev/null
+++ b/flash2d/src/system/mpi/PAR_sysstop.f
@@ -0,0 +1,74 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	PAR_sysstop
+! FUNCTION:
+!	implementation specific part of the parallelization
+!	system stop for error handling
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	parsys_stop
+! FUNCTION:
+!	gracefully finish parallelization
+! SYNTAX:
+!	CALL parsys_stop
+! ON INPUT:
+!
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	parsys_stop
+! COMMENTS:
+!	this is for the MPI-1 standard
+! USES:
+!
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version	j. behrens	1/98
+!
+!*****************************************************************
+	MODULE PAR_sysstop
+
+	USE MISC_globalparam
+
+!---------- include the mpi definitions
+
+	INCLUDE "mpif.h"
+
+	PRIVATE
+	PUBLIC :: parsys_stop
+
+	CONTAINS
+!*****************************************************************
+	SUBROUTINE parsys_stop
+
+	IMPLICIT NONE
+	
+!---------- local declarations
+
+	INTEGER              :: i_err
+
+!---------- this is the implementation dependent finalize command
+
+	CALL mpi_finalize(i_err)
+
+	IF(i_err /= MPI_SUCCESS) THEN
+	  WRITE(0,*) 'ERROR: [parsys_stop] Finalize routine has been executad unsuccessfully'
+	  WRITE(0,*) 'ERROR: [parsys_stop] parallel error code:',i_err
+	END IF
+
+	RETURN
+	END SUBROUTINE parsys_stop
+
+	END MODULE PAR_sysstop
diff --git a/flash2d/src/system/mpi/PAR_system.f b/flash2d/src/system/mpi/PAR_system.f
new file mode 100644
index 0000000..d625661
--- /dev/null
+++ b/flash2d/src/system/mpi/PAR_system.f
@@ -0,0 +1,1085 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	PAR_system
+! FUNCTION:
+!	implementation specific part of the parallelization
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	parsys_singlesided
+! FUNCTION:
+!	test if singlesided communication is available
+! SYNTAX:
+!	logical= parsys_singlesided()
+! ON INPUT:
+!
+! ON OUTPUT:
+!	l_sing:	true if single sided comm. available	LOGICAL
+! CALLS:
+!
+! COMMENTS:
+!	this has to be set by hand
+!-----------------------------------------------------------------
+!
+! NAME:
+!	parsys_usertypes
+! FUNCTION:
+!	test if user defined (derived) types are supported
+! SYNTAX:
+!	logical= parsys_usertypes()
+! ON INPUT:
+!
+! ON OUTPUT:
+!	l_types: true if user types are supported	LOGICAL
+! CALLS:
+!
+! COMMENTS:
+!	this has to be set by hand
+!-----------------------------------------------------------------
+!
+! NAME:
+!	parsys_init
+! FUNCTION:
+!	initialize the parallelization library
+! SYNTAX:
+!	CALL parsys_init
+! ON INPUT:
+!
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	parsys_totprocs
+! FUNCTION:
+!	total number of processors
+! SYNTAX:
+!	CALL parsys_totprocs(int)
+! ON INPUT:
+!
+! ON OUTPUT:
+!	i_num: total number of procs	INTEGER
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	parsys_mynumber
+! FUNCTION:
+!	the local processor id
+! SYNTAX:
+!	CALL parsys_mynumber(int)
+! ON INPUT:
+!
+! ON OUTPUT:
+!	i_num: my local process id	INTEGER
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	parsys_quit
+! FUNCTION:
+!	gracefully finish parallelization
+! SYNTAX:
+!	CALL parsys_quit
+! ON INPUT:
+!
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	parsys_barrier
+! FUNCTION:
+!	calling interface to barrier routine
+! SYNTAX:
+!	CALL parsys_barrier
+! ON INPUT:
+!
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	parsys_bcast
+! FUNCTION:
+!	broadcast data items to all other processes
+! SYNTAX:
+!	CALL parsys_bcast(int, int, int, *.arr)
+! ON INPUT:
+!	i_rootid: sender's process id		INTEGER
+!	i_length: length of array		INTEGER
+!	i_type:   data type handle		INTEGER
+!	i_arr:    integer array (optional)	INTEGER
+!	r_arr:    real array (optional)		REAL
+!	e_arr:    element array (optional)	TYPE (elmt)
+!	g_arr:    edge array (optional)		TYPE (edge)
+!	n_arr:    node array (optional)		TYPE (node)
+!	t_arr:    info array (optional)		TYPE (grid_glob)
+! ON OUTPUT:
+!	i_arr:    integer array (optional)	INTEGER
+!	r_arr:    real array (optional)		REAL
+!	e_arr:    element array (optional)	TYPE (elmt)
+!	g_arr:    edge array (optional)		TYPE (edge)
+!	n_arr:    node array (optional)		TYPE (node)
+!	t_arr:    info array (optional)		TYPE (grid_glob)
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	parsys_send
+! FUNCTION:
+!	send data items to a remote process
+! SYNTAX:
+!	CALL parsys_send(int, int, int, int, *.arr)
+! ON INPUT:
+!	i_local: local process id (sender)	INTEGER
+!	i_remot: remote process id (recipient)	INTEGER
+!	i_length: length of array		INTEGER
+!	i_type:   data type handle		INTEGER
+!	i_arr:    integer array (optional)	INTEGER
+!	r_arr:    real array (optional)		REAL
+!	e_arr:    element array (optional)	TYPE (elmt)
+!	g_arr:    edge array (optional)		TYPE (edge)
+!	n_arr:    node array (optional)		TYPE (node)
+!	t_arr:    info array (optional)		TYPE (grid_glob)
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!	it is (in this release) assumed that we can use non-blocking
+!	send/recieve constructs
+!-----------------------------------------------------------------
+!
+! NAME:
+!	parsys_recv
+! FUNCTION:
+!	recieve data items from a remote process
+! SYNTAX:
+!	CALL parsys_recv(int, int, int, int, *.arr)
+! ON INPUT:
+!	i_local: local process id (sender)	INTEGER
+!	i_remot: remote process id (recipient)	INTEGER
+!	i_length: length of array		INTEGER
+!	i_type:   data type handle		INTEGER
+! ON OUTPUT:
+!	i_arr:    integer array (optional)	INTEGER
+!	r_arr:    real array (optional)		REAL
+!	e_arr:    element array (optional)	TYPE (elmt)
+!	g_arr:    edge array (optional)		TYPE (edge)
+!	n_arr:    node array (optional)		TYPE (node)
+!	t_arr:    info array (optional)		TYPE (grid_glob)
+! CALLS:
+!
+! COMMENTS:
+!	it is (in this release) assumed that we can use non-blocking
+!	send/recieve constructs
+!-----------------------------------------------------------------
+!
+! NAME:
+!	parsys_waitallrecv
+! FUNCTION:
+!	wait until all nonblocking recieves are finished
+! SYNTAX:
+!	CALL parsys_waitallrecv
+! ON INPUT:
+!
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!	uses a globally defined (but private in this module) array
+!
+!	CAUTION: the counter for request counting is a buggy thing:
+!	when not waiting after each series of non-blocking recieves,
+!	it will potentially produce deadlocks, because it is set to
+!	a wrong number ...
+!-----------------------------------------------------------------
+!
+! NAME:
+!	parsys_waitallrecvinit
+! FUNCTION:
+!	initialize waiting after nonblocking recieves
+! SYNTAX:
+!	CALL parsys_waitallrecvinit
+! ON INPUT:
+!
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	parsys_procsum
+! FUNCTION:
+!	sum up a scalar over all processors and distribute results to all
+! SYNTAX:
+!	CALL parsys_procsum(int, int, real, real)
+! ON INPUT:
+!	i_local: local variable (optional)	INTEGER
+!	r_local: local variable (optional)	REAL
+! ON OUTPUT:
+!	i_global: global variable (optional)	INTEGER
+!	r_global: global variable (optional)	REAL
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	parsys_procmin
+! FUNCTION:
+!	global minimum local scalars of over all processors
+! SYNTAX:
+!	CALL parsys_procmin(int, int, real, real)
+! ON INPUT:
+!	i_local: local variable (optional)	INTEGER
+!	r_local: local variable (optional)	REAL
+! ON OUTPUT:
+!	i_global: global variable (optional)	INTEGER
+!	r_global: global variable (optional)	REAL
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	parsys_procmax
+! FUNCTION:
+!	global maximum local scalars of over all processors
+! SYNTAX:
+!	CALL parsys_procmax(int, int, real, real)
+! ON INPUT:
+!	i_local: local variable (optional)	INTEGER
+!	r_local: local variable (optional)	REAL
+! ON OUTPUT:
+!	i_global: global variable (optional)	INTEGER
+!	r_global: global variable (optional)	REAL
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	parsys_maketypes
+! FUNCTION:
+!	create data types for communication of derived types
+! SYNTAX:
+!	CALL parsys_maketypes
+! ON INPUT:
+!
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!	there is an array i_mpitypes, that holds data type info
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!
+! FUNCTION:
+!
+! SYNTAX:
+!
+! ON INPUT:
+!
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	parsys_singlesided, parsys_usertypes, parsys_init,
+!	parsys_totprocs, parsys_mynumber, parsys_quit, parsys_bcast,
+!	parsys_barrier, parsys_send, parsys_recv, parsys_waitallrecv,
+!	parsys_maketypes
+! COMMENTS:
+!	this is for the MPI-1 standard
+!
+!	most of the routines in this module are just translations of the
+!	mpi naming into a local library-independent naming. however, there
+!	are a few more complex routines, which concern the derived data
+!	types used in the mesh generation and finite-element-packages, this
+!	set of routines is made for.
+! USES:
+!	MISC_globalparam, MISC_error, PAR_define
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version	j. behrens	8/97
+!
+!*****************************************************************
+	MODULE PAR_system
+
+	USE MISC_globalparam
+	USE MISC_error
+	USE PAR_define
+	USE PAR_datatype
+
+!---------- include the mpi definitions
+
+	INCLUDE "mpif.h"
+
+	PRIVATE
+	PUBLIC :: parsys_singlesided, parsys_usertypes, parsys_init, &
+	          parsys_totprocs, parsys_mynumber, parsys_quit, parsys_bcast, &
+	          parsys_maketypes, parsys_barrier, parsys_send, parsys_recv, &
+	          parsys_waitallrecv
+
+!---------- this is for user defined data types
+	INTEGER, DIMENSION(DEF_numtypes) :: i_mpitypes
+!---------- these are the tag and status array for sending/recieving
+	INTEGER                          :: i_mpitag=17
+	INTEGER, DIMENSION(MPI_STATUS_SIZE) :: i_mpistat
+!---------- this is for non-blocking recieves (used in wait)
+	INTEGER, DIMENSION(:), ALLOCATABLE :: i_mpirecvreq, i_mpisendreq
+	INTEGER, DIMENSION(:,:), ALLOCATABLE :: i_mpistats
+	INTEGER                            :: i_mpirecvreqcount, i_mpisendreqcount
+	CONTAINS
+!*****************************************************************
+	FUNCTION parsys_singlesided() RESULT (l_side)
+
+	IMPLICIT NONE
+
+!---------- local declarations
+
+	LOGICAL :: l_side
+
+!---------- this value is set manually (false for MPI)
+
+	l_side= .FALSE.
+
+	RETURN
+	END FUNCTION parsys_singlesided
+
+!*****************************************************************
+	FUNCTION parsys_usertypes() RESULT (l_types)
+
+	IMPLICIT NONE
+
+!---------- local declarations
+
+	LOGICAL :: l_types
+
+!---------- this value is set manually (true for MPI)
+
+	l_types= .TRUE.
+
+	RETURN
+	END FUNCTION parsys_usertypes
+
+!*****************************************************************
+	SUBROUTINE parsys_init
+
+	IMPLICIT NONE
+
+!---------- local declarations
+
+	INTEGER :: i_err, i_proc
+	LOGICAL :: l_ini
+
+!---------- check if initialization has already been performed
+
+	CALL mpi_initialized(i_ini, i_err)
+	IF(i_ini) THEN
+	  IF(i_iolog > 0) WRITE(i_iolog,*) 'WARNING: [parsys_init] Parallel execution environment already initialized!'
+	  RETURN
+	END IF
+
+!---------- this is the implementation dependent initialization
+
+	CALL mpi_init(i_err)
+
+	IF(i_err /= MPI_SUCCESS) THEN
+	  IF(i_iolog > 0) WRITE(i_iolog,*) 'ERROR: parallel error code:',i_err
+	  CALL print_error(160)
+	END IF
+
+!---------- allocate data for nonblocking communications
+
+	CALL mpi_comm_size(MPI_COMM_WORLD, i_proc, i_err)
+	ALLOCATE(i_mpirecvreq(i_proc), i_mpisendreq(i_proc), stat= i_err)
+	IF(i_err /= 0) THEN
+	  CALL print_error(159)
+	END IF
+	i_mpisendreqcount= 0
+	i_mpirecvreqcount= 0
+	ALLOCATE(i_mpistats(MPI_STATUS_SIZE,i_proc), stat= i_err)
+	IF(i_err /= 0) THEN
+	  CALL print_error(159)
+	END IF
+
+	RETURN
+	END SUBROUTINE parsys_init
+
+!*****************************************************************
+	SUBROUTINE parsys_totprocs(i_num)
+
+	IMPLICIT NONE
+	
+!---------- local declarations
+
+	INTEGER, INTENT(out) :: i_num
+	INTEGER              :: i_err
+
+!---------- this is the implementation dependent processor number
+
+	CALL mpi_comm_size(MPI_COMM_WORLD, i_num, i_err)
+
+	IF(i_err /= MPI_SUCCESS) THEN
+	  IF(i_iolog > 0) WRITE(i_iolog,*) 'ERROR: parallel error code:',i_err
+	  CALL print_error(160)
+	END IF
+
+	RETURN
+	END SUBROUTINE parsys_totprocs
+
+!*****************************************************************
+	SUBROUTINE parsys_mynumber(i_num)
+
+	IMPLICIT NONE
+	
+!---------- local declarations
+
+	INTEGER, INTENT(out) :: i_num
+	INTEGER              :: i_err
+
+!---------- this is the implementation dependent processor id
+
+	CALL mpi_comm_rank(MPI_COMM_WORLD, i_num, i_err)
+
+	IF(i_err /= MPI_SUCCESS) THEN
+	  IF(i_iolog > 0) WRITE(i_iolog,*) 'ERROR: parallel error code:',i_err
+	  CALL print_error(160)
+	END IF
+
+!---------- first process id is 1 (for fortran array compatibility)
+
+	i_num= i_num+ 1
+
+	RETURN
+	END SUBROUTINE parsys_mynumber
+
+!*****************************************************************
+	SUBROUTINE parsys_quit
+
+	IMPLICIT NONE
+	
+!---------- local declarations
+
+	INTEGER              :: i_err
+	LOGICAL              :: l_ini
+
+!---------- check if parallel exec. environment is active
+
+	CALL mpi_initialized(l_ini, i_err)
+	IF(.NOT. l_ini) THEN
+	  IF(i_iolog > 0) WRITE(i_iolog,*) 'WARNING: [parsys_quit] Parallel execution environment not active!'
+	  RETURN
+	END IF
+
+!---------- this is the implementation dependent finalize command
+
+	CALL mpi_finalize(i_err)
+
+	IF(i_err /= MPI_SUCCESS) THEN
+	  IF(i_iolog > 0) WRITE(i_iolog,*) 'ERROR: parallel error code:',i_err
+	  WRITE(i_ioerr,*) 'ERROR: [parsys_quit] Finalize routine has been executad unsuccessfully'
+	END IF
+
+!---------- deallocate data for nonblocking communications
+
+	IF(allocated(i_mpirecvreq)) DEALLOCATE(i_mpirecvreq)
+	IF(allocated(i_mpisendreq)) DEALLOCATE(i_mpisendreq)
+	IF(allocated(i_mpistats))   DEALLOCATE(i_mpistats)
+
+	RETURN
+	END SUBROUTINE parsys_quit
+
+!*****************************************************************
+	SUBROUTINE parsys_bcast(i_rootid, i_length, i_type, i_arr, r_arr, e_arr, &
+	                        g_arr, n_arr, t_arr)
+
+	IMPLICIT NONE
+	
+!---------- local declarations
+
+	INTEGER, INTENT(in)                             :: i_rootid, i_length, i_type
+	INTEGER, DIMENSION(i_length), OPTIONAL          :: i_arr
+	REAL, DIMENSION(i_length), OPTIONAL             :: r_arr
+	TYPE (elmt), DIMENSION(i_length), OPTIONAL      :: e_arr
+	TYPE (edge), DIMENSION(i_length), OPTIONAL      :: g_arr
+	TYPE (node), DIMENSION(i_length), OPTIONAL      :: n_arr
+	TYPE (grid_glob), DIMENSION(i_length), OPTIONAL :: t_arr
+	INTEGER                                         :: i_err
+	INTEGER                                         :: i_mpitmp, i_mpiroot
+
+
+!---------- do the broadcasting using the type identifier given
+
+	i_mpitmp= i_mpitypes(i_type)
+	i_mpiroot= i_rootid- 1
+	i_err   = MPI_SUCCESS
+
+!---------- select type
+
+	type_case: SELECT CASE (i_type)
+	  CASE(DEF_inttype) type_case
+	    IF(.NOT. present(i_arr)) THEN
+	      CALL print_error(155)
+	    END IF
+	    CALL mpi_bcast(i_arr, i_length, i_mpitmp, i_mpiroot, MPI_COMM_WORLD, i_err)
+	  CASE(DEF_realtype) type_case
+	    IF(.NOT. present(r_arr)) THEN
+	      CALL print_error(155)
+	    END IF
+	    CALL mpi_bcast(r_arr, i_length, i_mpitmp, i_mpiroot, MPI_COMM_WORLD, i_err)
+	  CASE(DEF_elmttype) type_case
+	    IF(.NOT. present(e_arr)) THEN
+	      CALL print_error(155)
+	    END IF
+	    CALL mpi_bcast(e_arr, i_length, i_mpitmp, i_mpiroot, MPI_COMM_WORLD, i_err)
+	  CASE(DEF_edgetype) type_case
+	    IF(.NOT. present(g_arr)) THEN
+	      CALL print_error(155)
+	    END IF
+	    CALL mpi_bcast(g_arr, i_length, i_mpitmp, i_mpiroot, MPI_COMM_WORLD, i_err)
+	  CASE(DEF_nodetype) type_case
+	    IF(.NOT. present(n_arr)) THEN
+	      CALL print_error(155)
+	    END IF
+	    CALL mpi_bcast(n_arr, i_length, i_mpitmp, i_mpiroot, MPI_COMM_WORLD, i_err)
+	  CASE(DEF_infotype) type_case
+	    IF(.NOT. present(t_arr)) THEN
+	      CALL print_error(155)
+	    END IF
+	    CALL mpi_bcast(t_arr, i_length, i_mpitmp, i_mpiroot, MPI_COMM_WORLD, i_err)
+	  CASE DEFAULT type_case
+	    CALL print_error(154)
+	END SELECT type_case
+
+	IF(i_err /= MPI_SUCCESS) THEN
+	  IF(i_iolog > 0) WRITE(i_iolog,*) 'ERROR: parallel error code:',i_err
+	  CALL print_error(160)
+	END IF
+
+	RETURN
+	END SUBROUTINE parsys_bcast
+
+!*****************************************************************
+	SUBROUTINE parsys_gather(i_rootid, i_length, i_type, i_scl, i_arr, r_scl, r_arr)
+
+	IMPLICIT NONE
+	
+!---------- local declarations
+
+	INTEGER, INTENT(in)                             :: i_rootid, i_length, i_type
+	INTEGER                                         :: i_scl
+	INTEGER, DIMENSION(i_length), OPTIONAL          :: i_arr
+	REAL                                            :: r_scl
+	REAL, DIMENSION(i_length), OPTIONAL             :: r_arr
+	INTEGER                                         :: i_err
+	INTEGER                                         :: i_mpitmp, i_mpiroot
+
+
+!---------- do the broadcasting using the type identifier given
+
+	i_mpitmp= i_mpitypes(i_type)
+	i_mpiroot= i_rootid- 1
+	i_err   = MPI_SUCCESS
+
+!---------- select type
+
+	type_case: SELECT CASE (i_type)
+	  CASE(DEF_inttype) type_case
+	    IF(present(i_arr) .AND. present(i_scl)) THEN
+	      CALL mpi_gather(i_scl, 1, i_mpitmp, i_arr, 1, i_mpitmp, i_mpiroot, MPI_COMM_WORLD, i_err)
+	    ELSE
+	      CALL print_error(155)
+	    END IF
+	  CASE(DEF_realtype) type_case
+	    IF(present(r_arr) .AND. present(r_scl)) THEN
+	      CALL mpi_gather(r_scl, 1, i_mpitmp, r_arr, 1, i_mpitmp, i_mpiroot, MPI_COMM_WORLD, i_err)
+	    ELSE
+	      CALL print_error(155)
+	    END IF
+	  CASE DEFAULT type_case
+	    CALL print_error(154)
+	END SELECT type_case
+
+	IF(i_err /= MPI_SUCCESS) THEN
+	  IF(i_iolog > 0) WRITE(i_iolog,*) 'ERROR: parallel error code:',i_err
+	  CALL print_error(160)
+	END IF
+
+	RETURN
+	END SUBROUTINE parsys_gather
+
+!*****************************************************************
+	SUBROUTINE parsys_scatter(i_rootid, i_length, i_type, i_scl, i_arr, r_scl, r_arr)
+
+	IMPLICIT NONE
+	
+!---------- local declarations
+
+	INTEGER, INTENT(in)                             :: i_rootid, i_length, i_type
+	INTEGER, OPTIONAL                               :: i_scl
+	INTEGER, DIMENSION(i_length), OPTIONAL          :: i_arr
+	REAL, OPTIONAL                                  :: r_scl
+	REAL, DIMENSION(i_length), OPTIONAL             :: r_arr
+	INTEGER                                         :: i_err
+	INTEGER                                         :: i_mpitmp, i_mpiroot
+
+
+!---------- do the broadcasting using the type identifier given
+
+	i_mpitmp= i_mpitypes(i_type)
+	i_mpiroot= i_rootid- 1
+	i_err   = MPI_SUCCESS
+
+!---------- select type
+
+	type_case: SELECT CASE (i_type)
+	  CASE(DEF_inttype) type_case
+	    IF(present(i_arr) .AND. present(i_scl)) THEN
+	      CALL mpi_scatter(i_arr, 1, i_mpitmp, i_scl, 1, i_mpitmp, i_mpiroot, MPI_COMM_WORLD, i_err)
+	    ELSE
+	      CALL print_error(155)
+	    END IF
+	  CASE(DEF_realtype) type_case
+	    IF(present(r_arr) .AND. present(r_scl)) THEN
+	      CALL mpi_scatter(r_arr, 1, i_mpitmp, r_scl, 1, i_mpitmp, i_mpiroot, MPI_COMM_WORLD, i_err)
+	    ELSE
+	      CALL print_error(155)
+	    END IF
+	  CASE DEFAULT type_case
+	    CALL print_error(154)
+	END SELECT type_case
+
+	IF(i_err /= MPI_SUCCESS) THEN
+	  IF(i_iolog > 0) WRITE(i_iolog,*) 'ERROR: parallel error code:',i_err
+	  CALL print_error(160)
+	END IF
+
+	RETURN
+	END SUBROUTINE parsys_scatter
+
+!*****************************************************************
+	SUBROUTINE parsys_barrier
+
+	IMPLICIT NONE
+	
+!---------- local declarations
+
+	INTEGER              :: i_err
+
+!---------- this is the implementation dependent processor number
+
+	CALL mpi_barrier(MPI_COMM_WORLD, i_err)
+
+	IF(i_err /= MPI_SUCCESS) THEN
+	  IF(i_iolog > 0) WRITE(i_iolog,*) 'ERROR: parallel error code:',i_err
+	  CALL print_error(160)
+	END IF
+
+	RETURN
+	END SUBROUTINE parsys_barrier
+
+!*****************************************************************
+	SUBROUTINE parsys_send(i_local, i_remot, i_length, i_type, i_arr, &
+	                       r_arr, e_arr, g_arr, n_arr, t_arr)
+
+	IMPLICIT NONE
+	
+!---------- local declarations
+
+	INTEGER, INTENT(in)                             :: i_local, i_remot, i_length, i_type
+	INTEGER, DIMENSION(i_length), OPTIONAL          :: i_arr
+	REAL, DIMENSION(i_length), OPTIONAL             :: r_arr
+	TYPE (elmt), DIMENSION(i_length), OPTIONAL      :: e_arr
+	TYPE (edge), DIMENSION(i_length), OPTIONAL      :: g_arr
+	TYPE (node), DIMENSION(i_length), OPTIONAL      :: n_arr
+	TYPE (grid_glob), DIMENSION(i_length), OPTIONAL :: t_arr
+	INTEGER                                         :: i_err
+	INTEGER                                         :: i_mpitmp, i_mpiremot, i_mpilocal
+
+
+!---------- do the broadcasting using the type identifier given
+
+	i_mpitmp= i_mpitypes(i_type)
+	i_err   = MPI_SUCCESS
+	i_mpisendreqcount= i_mpisendreqcount+ 1
+	i_mpilocal= i_local- 1
+	i_mpiremot= i_remot- 1
+
+!---------- select type
+
+	type_case: SELECT CASE (i_type)
+	  CASE(DEF_inttype) type_case
+	    IF(.NOT. present(i_arr)) THEN
+	      CALL print_error(157)
+	    END IF
+	    CALL mpi_isend(i_arr, i_length, i_mpitmp, i_mpiremot, i_mpitag, &
+	                  MPI_COMM_WORLD, i_mpisendreq(i_mpisendreqcount), i_err)
+	  CASE(DEF_realtype) type_case
+	    IF(.NOT. present(r_arr)) THEN
+	      CALL print_error(157)
+	    END IF
+	    CALL mpi_isend(r_arr, i_length, i_mpitmp, i_mpiremot, i_mpitag, &
+	                  MPI_COMM_WORLD, i_mpisendreq(i_mpisendreqcount), i_err)
+	  CASE(DEF_elmttype) type_case
+	    IF(.NOT. present(e_arr)) THEN
+	      CALL print_error(157)
+	    END IF
+	    CALL mpi_isend(e_arr, i_length, i_mpitmp, i_mpiremot, i_mpitag, &
+	                  MPI_COMM_WORLD, i_mpisendreq(i_mpisendreqcount), i_err)
+	  CASE(DEF_edgetype) type_case
+	    IF(.NOT. present(g_arr)) THEN
+	      CALL print_error(157)
+	    END IF
+	    CALL mpi_isend(g_arr, i_length, i_mpitmp, i_mpiremot, i_mpitag, &
+	                  MPI_COMM_WORLD, i_mpisendreq(i_mpisendreqcount), i_err)
+	  CASE(DEF_nodetype) type_case
+	    IF(.NOT. present(n_arr)) THEN
+	      CALL print_error(157)
+	    END IF
+	    CALL mpi_isend(n_arr, i_length, i_mpitmp, i_mpiremot, i_mpitag, &
+	                  MPI_COMM_WORLD, i_mpisendreq(i_mpisendreqcount), i_err)
+	  CASE(DEF_infotype) type_case
+	    IF(.NOT. present(t_arr)) THEN
+	      CALL print_error(157)
+	    END IF
+	    CALL mpi_isend(t_arr, i_length, i_mpitmp, i_mpiremot, i_mpitag, &
+	                  MPI_COMM_WORLD, i_mpisendreq(i_mpisendreqcount), i_err)
+	  CASE DEFAULT type_case
+	    CALL print_error(154)
+	END SELECT type_case
+
+	IF(i_err /= MPI_SUCCESS) THEN
+	  IF(i_iolog > 0) WRITE(i_iolog,*) 'ERROR: parallel error code:',i_err
+	  CALL print_error(160)
+	END IF
+
+	RETURN
+	END SUBROUTINE parsys_send
+
+!*****************************************************************
+	SUBROUTINE parsys_recv(i_local, i_remot, i_length, i_type, i_arr, &
+	                       r_arr, e_arr, g_arr, n_arr, t_arr)
+
+	IMPLICIT NONE
+	
+!---------- local declarations
+
+	INTEGER, INTENT(in)                 :: i_local, i_remot, i_type, i_length
+	INTEGER, DIMENSION(i_length), OPTIONAL     :: i_arr
+	REAL, DIMENSION(i_length), OPTIONAL        :: r_arr
+	TYPE (elmt), DIMENSION(i_length), OPTIONAL :: e_arr
+	TYPE (edge), DIMENSION(i_length), OPTIONAL :: g_arr
+	TYPE (node), DIMENSION(i_length), OPTIONAL :: n_arr
+	TYPE (grid_glob), DIMENSION(i_length), OPTIONAL :: t_arr
+	INTEGER                             :: i_err
+	INTEGER                             :: i_mpitmp, i_mpiremot, i_mpilocal
+
+
+!---------- do the broadcasting using the type identifier given
+
+	i_mpitmp= i_mpitypes(i_type)
+	i_err   = MPI_SUCCESS
+	i_mpirecvreqcount= i_mpirecvreqcount+ 1
+	i_mpilocal= i_local- 1
+	i_mpiremot= i_remot- 1
+
+!---------- select type
+
+	type_case: SELECT CASE (i_type)
+	  CASE(DEF_inttype) type_case
+	    IF(.NOT. present(i_arr)) THEN
+	      CALL print_error(157)
+	    END IF
+	    CALL mpi_irecv(i_arr, i_length, i_mpitmp, i_mpiremot, i_mpitag, &
+	                  MPI_COMM_WORLD, i_mpirecvreq(i_mpirecvreqcount), i_err)
+	  CASE(DEF_realtype) type_case
+	    IF(.NOT. present(r_arr)) THEN
+	      CALL print_error(157)
+	    END IF
+	    CALL mpi_irecv(r_arr, i_length, i_mpitmp, i_mpiremot, i_mpitag, &
+	                  MPI_COMM_WORLD, i_mpirecvreq(i_mpirecvreqcount), i_err)
+	  CASE(DEF_elmttype) type_case
+	    IF(.NOT. present(e_arr)) THEN
+	      CALL print_error(157)
+	    END IF
+	    CALL mpi_irecv(e_arr, i_length, i_mpitmp, i_mpiremot, i_mpitag, &
+	                  MPI_COMM_WORLD, i_mpirecvreq(i_mpirecvreqcount), i_err)
+	  CASE(DEF_edgetype) type_case
+	    IF(.NOT. present(g_arr)) THEN
+	      CALL print_error(157)
+	    END IF
+	    CALL mpi_irecv(g_arr, i_length, i_mpitmp, i_mpiremot, i_mpitag, &
+	                  MPI_COMM_WORLD, i_mpirecvreq(i_mpirecvreqcount), i_err)
+	  CASE(DEF_nodetype) type_case
+	    IF(.NOT. present(n_arr)) THEN
+	      CALL print_error(157)
+	    END IF
+	    CALL mpi_irecv(n_arr, i_length, i_mpitmp, i_mpiremot, i_mpitag, &
+	                  MPI_COMM_WORLD, i_mpirecvreq(i_mpirecvreqcount), i_err)
+	  CASE(DEF_infotype) type_case
+	    IF(.NOT. present(t_arr)) THEN
+	      CALL print_error(157)
+	    END IF
+	    CALL mpi_irecv(t_arr, i_length, i_mpitmp, i_mpiremot, i_mpitag, &
+	                  MPI_COMM_WORLD, i_mpirecvreq(i_mpirecvreqcount), i_err)
+	  CASE DEFAULT type_case
+	    CALL print_error(154)
+	END SELECT type_case
+
+	IF(i_err /= MPI_SUCCESS) THEN
+	  IF(i_iolog > 0) WRITE(i_iolog,*) 'ERROR: parallel error code:',i_err
+	  CALL print_error(160)
+	END IF
+
+	RETURN
+	END SUBROUTINE parsys_recv
+
+!*****************************************************************
+	SUBROUTINE parsys_waitallrecv
+
+	IMPLICIT NONE
+	
+!---------- local declarations
+
+	INTEGER :: i_mpimaxcount, i_err
+
+!---------- derive the number of requests
+
+	i_mpimaxcount= i_mpirecvreqcount
+
+!---------- call wait
+
+	CALL mpi_waitall(i_mpimaxcount, i_mpirecvreq, i_mpistats, i_err)
+
+	IF(i_err /= MPI_SUCCESS) THEN
+	  IF(i_iolog > 0) WRITE(i_iolog,*) 'ERROR: parallel error code:',i_err
+	  CALL print_error(160)
+	END IF
+
+	RETURN
+	END SUBROUTINE parsys_waitallrecv
+
+!*****************************************************************
+	SUBROUTINE parsys_waitallrecvinit
+
+	IMPLICIT NONE
+	
+!---------- local declarations
+
+	i_mpirecvreqcount= 0
+	i_mpirecvreq     = 0
+
+	RETURN
+	END SUBROUTINE parsys_waitallrecvinit
+
+!*****************************************************************
+	SUBROUTINE parsys_procsum(i_local, i_global, r_local, r_global)
+
+	IMPLICIT NONE
+	
+!---------- local declarations
+
+	INTEGER, INTENT(in), OPTIONAL  :: i_local
+	INTEGER, INTENT(out), OPTIONAL :: i_global
+	REAL, INTENT(in), OPTIONAL     :: r_local
+	REAL, INTENT(out), OPTIONAL    :: r_global
+	INTEGER                        :: i_err
+
+!---------- act accordint to input
+
+	in_type: IF(present(i_local)) THEN
+	  IF(.NOT. present(i_global)) THEN
+	    CALL print_error(161)
+	  END IF
+	  CALL mpi_allreduce(i_local, i_global, 1, MPI_INTEGER, MPI_SUM, MPI_COMM_WORLD, i_err)
+	ELSE IF((present(r_local)) THEN in_type
+	  IF(.NOT. present(r_global)) THEN
+	    CALL print_error(161)
+	  END IF
+	  CALL mpi_allreduce(r_local, r_global, 1, MPI_REAL, MPI_SUM, MPI_COMM_WORLD, i_err)
+	ELSE in_type
+	  CALL print_error(161)
+	END IF in_type
+
+	IF(i_err /= MPI_SUCCESS) THEN
+	  IF(i_iolog > 0) WRITE(i_iolog,*) 'ERROR: parallel error code:',i_err
+	  CALL print_error(160)
+	END IF
+
+	RETURN
+	END SUBROUTINE parsys_procsum
+
+!*****************************************************************
+	SUBROUTINE parsys_procmin(i_local, i_global, r_local, r_global)
+
+	IMPLICIT NONE
+	
+!---------- local declarations
+
+	INTEGER, INTENT(in), OPTIONAL  :: i_local
+	INTEGER, INTENT(out), OPTIONAL :: i_global
+	REAL, INTENT(in), OPTIONAL     :: r_local
+	REAL, INTENT(out), OPTIONAL    :: r_global
+	INTEGER                        :: i_err
+
+!---------- act accordint to input
+
+	in_type: IF(present(i_local)) THEN
+	  IF(.NOT. present(i_global)) THEN
+	    CALL print_error(161)
+	  END IF
+	  CALL mpi_allreduce(i_local, i_global, 1, MPI_INTEGER, MPI_MIN, MPI_COMM_WORLD, i_err)
+	ELSE IF((present(r_local)) THEN in_type
+	  IF(.NOT. present(r_global)) THEN
+	    CALL print_error(161)
+	  END IF
+	  CALL mpi_allreduce(r_local, r_global, 1, MPI_REAL, MPI_MIN, MPI_COMM_WORLD, i_err)
+	ELSE in_type
+	  CALL print_error(161)
+	END IF in_type
+
+	IF(i_err /= MPI_SUCCESS) THEN
+	  IF(i_iolog > 0) WRITE(i_iolog,*) 'ERROR: parallel error code:',i_err
+	  CALL print_error(160)
+	END IF
+
+	RETURN
+	END SUBROUTINE parsys_procmin
+
+!*****************************************************************
+	SUBROUTINE parsys_procmax(i_local, i_global, r_local, r_global)
+
+	IMPLICIT NONE
+	
+!---------- local declarations
+
+	INTEGER, INTENT(in), OPTIONAL  :: i_local
+	INTEGER, INTENT(out), OPTIONAL :: i_global
+	REAL, INTENT(in), OPTIONAL     :: r_local
+	REAL, INTENT(out), OPTIONAL    :: r_global
+	INTEGER                        :: i_err
+
+!---------- act accordint to input
+
+	in_type: IF(present(i_local)) THEN
+	  IF(.NOT. present(i_global)) THEN
+	    CALL print_error(161)
+	  END IF
+	  CALL mpi_allreduce(i_local, i_global, 1, MPI_INTEGER, MPI_MAX, MPI_COMM_WORLD, i_err)
+	ELSE IF((present(r_local)) THEN in_type
+	  IF(.NOT. present(r_global)) THEN
+	    CALL print_error(161)
+	  END IF
+	  CALL mpi_allreduce(r_local, r_global, 1, MPI_REAL, MPI_MAX, MPI_COMM_WORLD, i_err)
+	ELSE in_type
+	  CALL print_error(161)
+	END IF in_type
+
+	IF(i_err /= MPI_SUCCESS) THEN
+	  IF(i_iolog > 0) WRITE(i_iolog,*) 'ERROR: parallel error code:',i_err
+	  CALL print_error(160)
+	END IF
+
+	RETURN
+	END SUBROUTINE parsys_procmax
+
+!*****************************************************************
+	SUBROUTINE parsys_maketypes
+
+	IMPLICIT NONE
+	
+!---------- local declarations
+
+	INTEGER                             :: i_cnt
+
+!---------- behave differently according to the different data types
+
+	all_types: DO i_cnt= 1, DEF_numtypes
+
+!---------- tis is the normal integer type
+
+	  IF(i_cnt == DEF_inttype) THEN
+
+	    CALL parsys_makeintype(i_cnt, DEF_numtypes, i_mpitypes)
+
+!---------- tis is the normal real type
+
+	  ELSE IF(i_cnt == DEF_realtype) THEN
+
+	    CALL parsys_makerealype(i_cnt, DEF_numtypes, i_mpitypes)
+
+!---------- here we define the element type
+
+	  ELSE IF(i_cnt == DEF_elmttype) THEN
+
+	    CALL parsys_makeelmtype(i_cnt, DEF_numtypes, i_mpitypes)
+
+!---------- here we define the edge type
+
+	  ELSE IF(i_cnt == DEF_edgetype) THEN
+
+	    CALL parsys_makeedgetype(i_cnt, DEF_numtypes, i_mpitypes)
+
+!---------- here we define the node type
+
+	  ELSE IF(i_cnt == DEF_nodetype) THEN
+
+	    CALL parsys_makenodetype(i_cnt, DEF_numtypes, i_mpitypes)
+
+!---------- here we define the info type
+
+	  ELSE IF(i_cnt == DEF_infotype) THEN
+
+	    CALL parsys_makeinfotype(i_cnt, DEF_numtypes, i_mpitypes)
+
+	  END IF
+	END DO all_types
+	    
+	RETURN
+	END SUBROUTINE parsys_maketypes
+
+	END MODULE PAR_system
diff --git a/flash2d/src/system/nag-f90/MISC_system.f90 b/flash2d/src/system/nag-f90/MISC_system.f90
new file mode 100644
index 0000000..0f13dbf
--- /dev/null
+++ b/flash2d/src/system/nag-f90/MISC_system.f90
@@ -0,0 +1,93 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	MISC_system
+! FUNCTION:
+!	contains system dependent functions (e.g. command line io)
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	sys_getcmdargs
+! FUNCTION:
+!	same as getarg (read command line option)
+! SYNTAX:
+!	call sys_getcmdargs(int, char)
+! ON INPUT:
+!	i_pos:	position of command line option		integer
+! ON OUTPUT:
+!	c_opt:	option read from command line		character string
+! CALLS:
+!
+! COMMENTS:
+!	i_pos=0 returns the command itself
+!-----------------------------------------------------------------
+!
+! NAME:
+!	sys_numcmdargs
+! FUNCTION:
+!	same as iargc (tell number of command line options)
+! SYNTAX:
+!	int= sys_numcmdargs
+! ON INPUT:
+!
+! ON OUTPUT:
+!	i_argnum: number of command line items		integer
+! CALLS:
+!
+! COMMENTS:
+!	i_argnum excludes the command itself, thus i_argnum=0
+!	indicates that there are no command line options given.
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	sys_getcmdargs, sys_numcmdargs
+! COMMENTS:
+!	this is for the NAG NAGWare f90 compiler,
+!	supporting iargc and getarg when USEing f90_unix module
+! USES:
+!
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version	j. behrens	1/97
+!
+!*****************************************************************
+	MODULE MISC_system
+	  USE f90_unix
+	  PRIVATE
+	  PUBLIC :: sys_getcmdargs, sys_numcmdargs
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE sys_getcmdargs(i_pos, c_opt, i_len)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  INTEGER, INTENT(in)             :: i_pos
+	  CHARACTER (len=*), INTENT(out)  :: c_opt
+	  INTEGER, OPTIONAL               :: i_len
+
+!---------- read command line argument
+
+	  CALL getarg(i_pos, c_opt)
+
+	  RETURN
+	  END SUBROUTINE sys_getcmdargs
+!*****************************************************************
+	  FUNCTION sys_numcmdargs() RESULT(i_argnum)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  INTEGER :: i_argnum
+
+	  i_argnum= iargc()
+
+	  RETURN
+	  END FUNCTION sys_numcmdargs
+	END MODULE MISC_system
diff --git a/flash2d/src/system/posix-f90/MISC_system.f90 b/flash2d/src/system/posix-f90/MISC_system.f90
new file mode 100644
index 0000000..f0fa082
--- /dev/null
+++ b/flash2d/src/system/posix-f90/MISC_system.f90
@@ -0,0 +1,97 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	MISC_system
+! FUNCTION:
+!	contains system dependent functions (e.g. command line io)
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	sys_getcmdargs
+! FUNCTION:
+!	same as getarg (read command line option)
+! SYNTAX:
+!	call sys_getcmdargs(int, char)
+! ON INPUT:
+!	i_pos:	position of command line option		integer
+! ON OUTPUT:
+!	c_opt:	option read from command line		character string
+! CALLS:
+!
+! COMMENTS:
+!	i_pos=0 returns the command itself
+!-----------------------------------------------------------------
+!
+! NAME:
+!	sys_numcmdargs
+! FUNCTION:
+!	same as iargc (tell number of command line options)
+! SYNTAX:
+!	int= sys_numcmdargs
+! ON INPUT:
+!
+! ON OUTPUT:
+!	i_argnum: number of command line items		integer
+! CALLS:
+!
+! COMMENTS:
+!	i_argnum excludes the command itself, thus i_argnum=0
+!	indicates that there are no command line options given.
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	sys_getcmdargs, sys_numcmdargs
+! COMMENTS:
+!	this is for the CRAY CF90 compiler,
+!	supporting POSIX ipxfargc and pxfgetarg
+! USES:
+!
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version	j. behrens	1/97
+!
+!*****************************************************************
+	MODULE MISC_system
+	  PRIVATE
+	  PUBLIC :: sys_getcmdargs, sys_numcmdargs
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE sys_getcmdargs(i_pos, c_opt, i_len)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  INTEGER, INTENT(in)              :: i_pos
+	  CHARACTER (len=128), INTENT(out) :: c_opt
+	  INTEGER, OPTIONAL                :: i_len
+	  INTEGER                          :: i_err
+	  EXTERNAL pxfgetarg
+
+!---------- this uses a POSIX routine. no error code is checked, no matching
+!---------- of length is checked!!!
+
+	  CALL pxfgetarg(i_pos, c_opt, i_len, i_err)
+
+	  RETURN
+	  END SUBROUTINE sys_getcmdargs
+!*****************************************************************
+	  FUNCTION sys_numcmdargs() RESULT(i_argnum)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  INTEGER :: i_argnum
+	  EXTERNAL   ipxfargc
+	  INTEGER :: ipxfargc
+
+	  i_argnum= ipxfargc()
+
+	  RETURN
+	  END FUNCTION sys_numcmdargs
+	END MODULE MISC_system
diff --git a/flash2d/src/system/std-f90/MISC_system.f90 b/flash2d/src/system/std-f90/MISC_system.f90
new file mode 100644
index 0000000..ff04e7a
--- /dev/null
+++ b/flash2d/src/system/std-f90/MISC_system.f90
@@ -0,0 +1,94 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	MISC_system
+! FUNCTION:
+!	contains system dependent functions (e.g. command line io)
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!	sys_getcmdargs
+! FUNCTION:
+!	same as getarg (read command line option)
+! SYNTAX:
+!	call sys_getcmdargs(int, char)
+! ON INPUT:
+!	i_pos:	position of command line option		integer
+! ON OUTPUT:
+!	c_opt:	option read from command line		character string
+! CALLS:
+!
+! COMMENTS:
+!	i_pos=0 returns the command itself
+!-----------------------------------------------------------------
+!
+! NAME:
+!	sys_numcmdargs
+! FUNCTION:
+!	same as iargc (tell number of command line options)
+! SYNTAX:
+!	int= sys_numcmdargs
+! ON INPUT:
+!
+! ON OUTPUT:
+!	i_argnum: number of command line items		integer
+! CALLS:
+!
+! COMMENTS:
+!	i_argnum excludes the command itself, thus i_argnum=0
+!	indicates that there are no command line options given.
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!	sys_getcmdargs, sys_numcmdargs
+! COMMENTS:
+!	this is for "standard" compilers, supporting iargc and getarg
+! USES:
+!
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version	j. behrens	1/97
+!
+!*****************************************************************
+	MODULE MISC_system
+	  PRIVATE
+	  PUBLIC :: sys_getcmdargs, sys_numcmdargs
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE sys_getcmdargs(i_pos, c_opt, i_len)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  INTEGER, INTENT(in)              :: i_pos
+	  CHARACTER (len=*), INTENT(out)   :: c_opt
+	  INTEGER, OPTIONAL                :: i_len
+	  EXTERNAL getarg
+
+!---------- read command line argument
+
+      CALL getarg(i_pos, c_opt)
+
+	  RETURN
+	  END SUBROUTINE sys_getcmdargs
+!*****************************************************************
+	  FUNCTION sys_numcmdargs() RESULT(i_argnum)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+
+	  INTEGER :: i_argnum
+	  EXTERNAL   iargc
+	  INTEGER :: iargc
+
+	  i_argnum= iargc()
+
+	  RETURN
+	  END FUNCTION sys_numcmdargs
+	END MODULE MISC_system
diff --git a/flash2d/src/timing/MISC_timing.f90 b/flash2d/src/timing/MISC_timing.f90
new file mode 100644
index 0000000..d1d5bbb
--- /dev/null
+++ b/flash2d/src/timing/MISC_timing.f90
@@ -0,0 +1,324 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!	MISC_timing
+! FUNCTION:
+!	miscellaneaus utility routines
+! CONTAINS:
+!	second, ticktock, stop_watch
+!-----------------------------------------------------------------
+!
+! NAME:
+!	stop_watch_init
+! FUNCTION:
+!	initialize time measurement
+! SYNTAX:
+!	CALL stop_watch_init(int, char, rtinfo)
+! ON INPUT:
+!	i_number:  number of timers in timer structure	INTEGER
+!	c_strings: strings describing the code segments	CHARACTER*16
+!	p_tsinfo:  runtime info data structure		TYPE (rt_info)
+! ON OUTPUT:
+!	p_tsinfo: runtime info data structure (updated)	TYPE (rt_info)
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! NAME:
+!	stop_watch
+! FUNCTION:
+!	measure time for a code segment and put info in runtime structure
+! SYNTAX:
+!	CALL stop_watch(char, int, rtinfo)
+! ON INPUT:
+!	c_action: start or stop the watch		CHARACTER*5
+!	i_ident:  identification for the timer		INTEGER
+!	p_tsinfo: runtime info data structure		TYPE (rt_info)
+! ON OUTPUT:
+!	p_tsinfo: runtime info data structure (updated)	TYPE (rt_info)
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+! NAME:
+!	second
+! FUNCTION:
+!	calculate actual second for timing
+! SYNTAX:
+!	real= second()
+! ON INPUT:
+!
+! ON OUTPUT:
+!	second:	actual second measured from 1/1/1996	real
+! CALLS:
+!
+! COMMENTS:
+!	if no system clock is available, result is negative
+!
+!-----------------------------------------------------------------
+! NAME:
+!	ticktock
+! FUNCTION:
+!	fortran 90 portable timing routine
+! SYNTAX:
+!	real= ticktock(overhead= real, start= real)
+! ON INPUT:
+!	overhead:	if present, overhead is subtracted	real
+!	start:		first call to tick			real
+! ON OUTPUT:
+!	overhead:	if present, overhead is computed	real
+!	ticktock:	time of program segment			real
+! CALLS:
+!
+! COMMENTS:
+!	this routine has different functionalities:
+!	on 1st call:
+!	        r_sta = ticktock(overhead= r_ovh)
+!	    or
+!	        r_sta = ticktock()
+!	    gives back the starting tick mark for timing in r_sta and, if
+!	    requested, the overhead for calling the timing routine in r_ovh
+!	on second call:
+!	        r_tim= ticktock(start=r_sta)
+!	    or
+!	        r_tim= ticktock(start=r_sta, overhead= r_ovh)
+!	    gives back the time in [s] for the program segment in r_tim,
+!	    additionally, the overhead given by r_ovh is subtracted from total
+!	    time
+!
+!	the convention is:
+!	noting is given:              first call
+!	only overhead is given:       first call
+!       only start is given           following call
+!	overhead and start are given: following call
+!
+!-----------------------------------------------------------------
+! PUBLIC:
+!	stop_watch, stop_watch_init
+! COMMENTS:
+!
+! USES:
+!	MISC_globalparam
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version			j. behrens	7/96
+!	2. stop_watch changed			j. behrens	1/97
+!	   stop_watch_init added
+!	3. changed for self consistency		j. behrens	1/97
+!	4. fixed ticktock			j. behrens	3/98
+!	5. changed to be completely
+!	   self-consistent			j. behrens	12/2000
+!
+!*****************************************************************
+	MODULE MISC_timing
+	  INTEGER, PARAMETER :: i_ioerr= 0
+	  PRIVATE
+
+!---------- structure for timing
+
+	  INTEGER, PARAMETER   :: DEF_timings= 10 ! number of different timers
+
+	  TYPE time_info
+	    CHARACTER (len=16) :: c_tim
+	    REAL               :: r_tim
+	    REAL               :: r_lap
+	  END TYPE time_info
+	  TYPE sw_info
+	    INTEGER                                  :: i_num
+	    TYPE (time_info), DIMENSION(DEF_timings) :: p_tim
+	  END TYPE sw_info
+
+	  PUBLIC :: stop_watch, stop_watch_init, time_info, sw_info, DEF_timings
+	  CONTAINS
+!*****************************************************************
+	  SUBROUTINE stop_watch_init(i_number, c_strings, p_tsinfo)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  INTEGER, INTENT(in)                                  :: i_number
+	  CHARACTER (len=16), INTENT(in), DIMENSION(i_number)  :: c_strings
+	  TYPE (sw_info), INTENT(inout)                        :: p_tsinfo
+	  INTEGER                                              :: i_cnt
+
+!---------- initialize
+
+	  p_tsinfo%i_num = 0
+
+!---------- consistency check
+
+	  check_con: IF(i_number > DEF_timings) THEN
+	    write(i_ioerr,*) 'TIMING: Initialization of timers omitted several'
+	    RETURN
+	  ELSE check_con
+
+!---------- set number of timers in this structure
+
+	    p_tsinfo%i_num = min(DEF_timings, i_number)
+
+!---------- initialize info structure
+
+	    main_loop: DO i_cnt=1, p_tsinfo%i_num
+	      p_tsinfo%p_tim(i_cnt)%c_tim= c_strings(i_cnt)
+	      p_tsinfo%p_tim(i_cnt)%r_tim= 0.0
+	      p_tsinfo%p_tim(i_cnt)%r_lap= 0.0
+	    END DO main_loop
+	  END IF check_con
+
+	  RETURN
+	  END SUBROUTINE stop_watch_init
+	  
+!*****************************************************************
+	  SUBROUTINE stop_watch(c_action, i_ident, p_tsinfo)
+
+!---------- local declarations
+
+	  IMPLICIT NONE
+	  CHARACTER (len= 5), INTENT(in) :: c_action
+	  INTEGER, INTENT(in)            :: i_ident
+	  TYPE (sw_info), INTENT(inout)  :: p_tsinfo
+	  REAL                           :: r_tmp
+
+!---------- consistency check
+
+	  check_con: IF(i_ident > p_tsinfo%i_num) THEN
+	    write(i_ioerr,*) 'TIMING: Identification not correct, nothing done'
+	    RETURN
+	  END IF check_con
+
+!---------- action start:
+
+	  start_stop: IF(c_action(1:4) == 'star') THEN
+	    p_tsinfo%p_tim(i_ident)%r_lap= ticktock()
+
+!---------- action stop:
+
+	  ELSE IF(c_action(1:4) == 'stop') THEN start_stop
+	    r_tmp= ticktock(start= p_tsinfo%p_tim(i_ident)%r_lap)
+	    p_tsinfo%p_tim(i_ident)%r_tim= p_tsinfo%p_tim(i_ident)%r_tim+ r_tmp
+
+!---------- not supported
+
+	  ELSE start_stop
+	    write(i_ioerr,*) 'TIMING: No supported action given: ', c_action
+	  END IF start_stop
+
+	  RETURN
+	  END SUBROUTINE stop_watch
+
+!*****************************************************************
+	FUNCTION second() RESULT (times)
+
+!---------- local declarations
+
+	IMPLICIT NONE
+
+	REAL               :: times
+!	CHARACTER (len=8)  :: a_date
+	INTEGER, PARAMETER :: i_start= 19960101
+	INTEGER, PARAMETER :: i_dsecs= 86400
+	INTEGER, DIMENSION(10) :: i_time
+	REAL, PARAMETER       :: r_mil=1/1000.
+	REAL, PARAMETER       :: r_sec=1.
+	REAL, PARAMETER       :: r_min=60.*r_sec
+	REAL, PARAMETER       :: r_hor=60.*r_min
+	REAL, PARAMETER       :: r_day=24.*r_hor
+!	REAL, PARAMETER       :: r_yea=365.*r_day
+!	INTEGER            :: i_day, i_mult
+	INTEGER            :: i_cnt, i_rte
+	INTEGER            :: i_total
+
+!---------- CALL date_and_time for day info
+
+!	CALL date_and_time(date= a_date)
+!	date_ok: IF(a_date /= '        ') THEN
+!	  read(a_date,*) i_day
+!	  i_mult= abs(i_day- i_start)
+!	ELSE date_ok
+!	  i_mult= 1
+!	END IF date_ok
+
+!---------- CALL date_and_time for easy time access
+
+	CALL date_and_time(values=i_time)
+	date_ok: IF(i_time(1) /= -HUGE(0)) THEN
+	  times= r_day* i_time(3)+ &
+	         r_hor* i_time(5)+ &
+	         r_min* i_time(6)+ &
+	         r_sec* i_time(7)+ &
+	         r_mil* i_time(8)
+	ELSE date_ok
+	  times= -1.0
+	END IF date_ok
+
+!---------- CALL system_clock for maximum precision clock
+
+!	CALL system_clock(count= i_cnt, count_rate= i_rte)
+!	clock_ok: IF(i_rte /= 0) THEN
+!	  i_total= i_cnt+ i_mult* i_dsecs
+!	  i_total= i_cnt
+!	  times= float(i_total)/ float(i_rte)
+!	ELSE clock_ok
+!	  times= -1.0
+!	END IF clock_ok
+
+	RETURN
+
+	END FUNCTION second
+!*****************************************************************
+	FUNCTION ticktock(start, overhead) RESULT (timing)
+
+!---------- local declarations
+
+	IMPLICIT NONE
+
+	REAL, OPTIONAL, INTENT(inout) :: overhead
+	REAL, OPTIONAL, INTENT(in)    :: start
+	REAL                          :: timing
+	INTEGER, PARAMETER            :: i_loop= 10
+	INTEGER                       :: i
+	REAL                          :: r_tm, r_t1, r_tsum
+
+!---------- initialize
+
+	timing=0.0
+
+!---------- check presence of input variables and act accordingly
+
+!---------- second call to ticktock
+	start_present: IF(present(start)) THEN
+	  overhead_present: IF(present(overhead)) THEN
+	    r_tm= second()- start- overhead
+	  ELSE overhead_present
+	    r_tm= second()- start
+	  END IF overhead_present
+
+!---------- first call to ticktock
+	ELSE start_present
+	  overhead_requested: IF(present(overhead)) THEN
+	    r_tsum= 0.0
+	    DO i=2, i_loop
+	      r_t1= second()
+	      r_tm= second()
+	      r_tsum= r_tsum+ (r_tm- r_t1)
+	    END DO
+	    overhead= r_tsum/float(i_loop)
+	    r_tm= second()
+	  ELSE overhead_requested
+	    r_tm= second()
+	  END IF overhead_requested
+	END IF start_present
+
+!---------- result
+
+	timing= r_tm
+
+	RETURN
+	END FUNCTION ticktock
+	END MODULE MISC_timing
diff --git a/flash2d/templates/header.f b/flash2d/templates/header.f
new file mode 100644
index 0000000..24ed1d1
--- /dev/null
+++ b/flash2d/templates/header.f
@@ -0,0 +1,24 @@
+!*****************************************************************
+!
+! NAME:
+!
+! FUNCTION:
+!
+! SYNTAX:
+!
+! ON INPUT:
+!
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version	j. behrens	/96
+!
+!*****************************************************************
diff --git a/flash2d/templates/header.h b/flash2d/templates/header.h
new file mode 100644
index 0000000..210dfc6
--- /dev/null
+++ b/flash2d/templates/header.h
@@ -0,0 +1,17 @@
+!*****************************************************************
+!
+! NAME:
+!
+! FUNCTION:
+!
+! VERSION(S):
+!	1. original version	j. behrens	/96
+!
+!*****************************************************************
+
+
+!*****************************************************************
+!
+! END of include file ''
+!
+!*****************************************************************
diff --git a/flash2d/templates/module_header.f b/flash2d/templates/module_header.f
new file mode 100644
index 0000000..251402e
--- /dev/null
+++ b/flash2d/templates/module_header.f
@@ -0,0 +1,42 @@
+!*****************************************************************
+!
+! MODULE NAME:
+!
+! FUNCTION:
+!
+! CONTAINS:
+!-----------------------------------------------------------------
+!
+! NAME:
+!
+! FUNCTION:
+!
+! SYNTAX:
+!
+! ON INPUT:
+!
+! ON OUTPUT:
+!
+! CALLS:
+!
+! COMMENTS:
+!
+!-----------------------------------------------------------------
+!
+! PUBLIC:
+!
+! COMMENTS:
+!
+! USES:
+!
+! LIBRARIES:
+!
+! REFERENCES:
+!
+! VERSION(S):
+!	1. original version	j. behrens	/96
+!
+!*****************************************************************
+	MODULE
+	  CONTAINS
+	END MODULE
diff --git a/flash2d/templates/readtemplate b/flash2d/templates/readtemplate
new file mode 100644
index 0000000..858de48
--- /dev/null
+++ b/flash2d/templates/readtemplate
@@ -0,0 +1,16 @@
+**************************************************************************
+ FLASH90
+ FLexible Adaptive Semi-Lagrangian Hack
+ written in Fortran 90
+
+**************************************************************************
+
+ CONTENTS OF THIS DIRECTORY "$(FLASHDIR)/lib"
+
+--------------------------------------------------------------------------
+
+ WHAT TO DO HERE:
+
+**************************************************************************
+ j. behrens, 8/98
+**************************************************************************
diff --git a/flash2d/tools/runFLASH b/flash2d/tools/runFLASH
new file mode 100644
index 0000000..107c0cf
--- /dev/null
+++ b/flash2d/tools/runFLASH
@@ -0,0 +1,329 @@
+#!/bin/sh
+
+
+#Basic settings and initialization
+
+paramfile="./param.dat"
+
+grid_coarse=""
+grid_fine=""
+method=""
+timestep_finish=""
+wind=""
+
+diagnostics=""
+output_file=""
+gmv_plot="0"
+help=""
+
+# read existing Parameters.dat and set values
+# to be done in a later version
+
+
+# set parameters given at prompt
+# values like wind and method depend on the settings in the Makefile for FLASH
+if (test -n "$1"); then
+  while (test -n "$1"); do
+    case "$1" in 
+  	  -gc) 
+		  if (test -n "$2"); then
+		    grid_coarse="$2"
+		    shift
+		  else
+		    help="1"
+		  fi;;
+	  -gf)
+		  if (test -n "$2"); then
+		    grid_fine="$2"
+		    shift
+		  else
+		    help="1"
+		  fi;;
+	  -m)	
+		  if (test -n "$2"); then
+		    case "$2" in 
+			  Plain)
+				  method="Plain";;
+			  CI)
+				  method="Cellintegrated";;
+			  CW)
+				  method="Dual";;
+			  MPSLM)
+				  method="$2";;
+			  Priestley)
+				  method="Conservative";;
+			  Quad)
+				  method="Quadrature";;
+			  Analytic)
+				  method="$2";;
+			  *)
+				  help="1";;
+		    esac	
+		    shift
+		  else
+		    help="1"
+		  fi;;
+	  -t)
+		  if (test -n "$2"); then
+		    timestep_finish="$2"
+		    shift
+		  else
+		    help="1"
+		  fi;;
+	  -w)	
+		  if (test -n "$2"); then
+		    case "$2" in
+		  	  CircWind)
+		  		  wind="$2";;
+			  ConvWind)
+				  wind="$2";;
+			  DiagWind)
+				  wind="$2";;
+			  Kaeser)
+				  wind="$2";;
+			  *)
+				  help="1";;
+		    esac
+		    shift
+		  else
+		    help="1"
+		  fi;;
+	  -d)	
+		  diagnostics="1";;
+	  -gmv)
+		  gmv_plot="1";;
+	  -o)
+		  output_file="1";;
+	  "-?"|"--help"|"-help")
+		  help="1";;
+	  *)
+		  echo "unknown option: "$1
+		  exit ;;
+    esac
+    shift
+  done
+else
+  help="1"  
+fi
+
+# for debugging only
+#echo "gc:"$grid_coarse
+#echo "gf:"$grid_fine
+#echo "t:"$timestep_finish
+#echo "m:"$method
+#echo "w:"$wind
+
+if (test -z "$grid_coarse") || (test -z "$grid_fine") || (test -z "$timestep_finish") || (test -z "$method") || (test -z "$wind"); then
+   help="1"
+fi
+
+#Some help wanted?
+
+if (test -n "$help"); then
+  echo "-------------------------------------"
+  echo "  runFLASH Version 0.1"
+  echo "  by Lars Mentrup 2004"
+  echo "-------------------------------------"
+  echo
+  echo "Script to run FLASH automatically." 
+  echo "1. Creates user defined Parameters file corresponding to given Parameters."
+  echo "2. Compiles the given method and wind into FLASH executable."
+  echo "3. Runs FLASH with the created Parameters file."
+  echo "4. Renames the outputfiles (gmv,matlab,diagnosis,out) to a [method_wind_coarse-grid_fine-grid]"
+  echo "   specific name."
+  echo
+  echo "Specify the following options:"
+  echo
+  echo "  Essential parameters:"
+  echo -e "   -gc #          \t\t Coarse grid level"
+  echo -e "   -gf #          \t\t Fine grid level"
+  echo -e "   -m [method]    \t\t Method used (Possible: Plain, CI, CW, MPSLM, Priestley, Quad, Analytic)"
+  echo -e "   -t #           \t\t Number of timesteps "
+  echo -e "   -w [windfield] \t\t What kind of wind (Possible: CircWind, ConvWind, DiagWind, Kaeser)"
+  echo 
+  echo -e "  Optional parameters:"
+  echo -e "   -d            \t\t turn diagnostics on (default: off)"
+  echo -e "   -gmv          \t\t turn GMV plot on (default: off)"
+  echo -e "   -o            \t\t save output into File (default: off)"
+  echo
+  exit
+fi
+
+
+
+
+#Create Parameters.dat according to given options
+
+echo "#-----------------------------------------------------------" > $paramfile
+echo "# Input file for batch mode input">>$paramfile
+echo "# input is controlled via keywords">>$paramfile
+echo "#">>$paramfile
+echo "# j. behrens 12/96">>$paramfile
+echo "#-----------------------------------------------------------">>$paramfile
+
+echo "# the experiment no. (0 for a new experiment)     [integer]">>$paramfile
+echo "EXPERIMENT_NUMBER">>$paramfile
+echo "0">>$paramfile
+
+echo "# desired maximum level of refinements            [integer]">>$paramfile
+echo "FINE_GRID_LEVEL">>$paramfile
+echo $grid_fine>>$paramfile
+
+echo "# minimum level of refinements                    [integer]">>$paramfile
+echo "COARSE_GRID_LEVEL">>$paramfile
+echo $grid_coarse>>$paramfile
+
+echo "# tolerance for refinement                        [real]">>$paramfile
+echo "TOLERANCE_OF_REFINEMENT">>$paramfile
+echo "0.2">>$paramfile
+
+echo "# tolerance for coarsening                        [real]">>$paramfile
+echo "TOLERANCE_OF_COARSENING">>$paramfile
+echo "0.1">>$paramfile
+
+echo "# watermark for refinement                        [real]">>$paramfile
+echo "WATERMARK_OF_REFINEMENT">>$paramfile
+echo "0.01">>$paramfile
+
+echo "# watermark for coarsening                        [real]">>$paramfile
+echo "WATERMARK_OF_COARSENING">>$paramfile
+echo "0.01">>$paramfile
+
+echo "# timestep length                                 [real]">>$paramfile
+echo "TIMESTEP_LENGTH">>$paramfile
+echo "1800.">>$paramfile
+
+echo "# first timestep                                  [integer]">>$paramfile
+echo "BEGINNING_TIMESTEP">>$paramfile
+echo "1">>$paramfile
+
+echo "# last timestep                                   [integer]">>$paramfile
+echo "FINISHING_TIMESTEP">>$paramfile
+echo $timestep_finish>>$paramfile
+
+echo "# plot in matlab style to file (no plot = 0)      [integer]">>$paramfile
+echo "MATLAB_PLOTTING">>$paramfile
+echo $gmv_plot>>$paramfile
+
+echo "# plot in gmv style to file (no plot = 0)         [integer]">>$paramfile
+echo "GMV_FILE_PLOTTING">>$paramfile
+echo $gmv_plot>>$paramfile
+
+echo "# timesteps between plots                         [integer]">>$paramfile
+echo "STEPS_BTW_PLOTS">>$paramfile
+echo "1">>$paramfile
+
+echo "# timesteps between saves                         [integer]">>$paramfile
+echo "STEPS_BTW_SAVES">>$paramfile
+echo "500">>$paramfile
+
+echo "# save last timestep for next experiment (no = 0) [integer]">>$paramfile
+echo "SAVE_FINISH_CONFIGURATION">>$paramfile
+echo "0">>$paramfile
+
+echo "# plot a polygonal line from file (if given)      [character]">>$paramfile
+echo "POLYGON_FILE_NAME">>$paramfile
+echo "Land.dat">>$paramfile
+
+echo "# take advecting wind from file (if given)        [character]">>$paramfile
+echo "WIND_FILE_NAME">>$paramfile
+echo "Windparam.dat">>$paramfile
+
+echo "# file defining the domain                        [character]">>$paramfile
+echo "DOMAIN_FILE_NAME">>$paramfile
+echo "Domain.dat">>$paramfile
+
+echo "# file defining the initial triangulation         [character]">>$paramfile
+echo "TRIANG_FILE_NAME">>$paramfile
+echo "Triang.dat">>$paramfile
+
+echo "# number of iterations in trajectory estimation   [integer]">>$paramfile
+echo "SLM_ITERATION_NUMBER">>$paramfile
+echo "4">>$paramfile
+echo "#-----------------------------------------------------------">>$paramfile
+echo "# END OF FILE">>$paramfile
+echo "#-----------------------------------------------------------">>$paramfile
+
+# Empty directory of earlier outputs
+
+if (test -r "./Flash90_diag.0000"); then
+  rm ./Flash90_diag.0000
+fi
+if (test -r "./Flash90.out"); then
+  rm ./Flash90.out
+fi
+if (test -r "./Flash90_gmv.0000"); then
+  rm ./Flash90_gmv.*
+fi
+if (test -r "./Flash90_matlab.0000"); then
+  rm ./Flash90_matlab.*
+fi
+rm ./matlab_*
+
+
+# Compile the right FLASH version; incorporate method and windfield
+if (test ! -r "./FLASH"); then
+  echo "No compiled version of FLASH found. Trying to make one."
+  make FLASH > /dev/null
+  if (test ! -r "./FLASH"); then
+    echo "Failed."
+    exit
+  fi
+fi
+
+# Get input files for FLASH 
+if (test ! -r "./Triang.dat"); then
+  echo "Copying initial data."
+  make datacopy
+fi
+
+#Compile method and wind
+if (test $method = "Plain"); then
+  make FLASH
+else
+  make $method
+fi
+
+echo make $wind
+make $wind
+make executable
+
+
+# Put the command string together according to options
+execute="./FLASH -b "
+if (test -n "$diagnostics"); then
+  execute=$execute"-d "
+fi
+if (test -n "$output_file"); then
+  execute=$execute"-o "
+fi
+execute=$execute"-f "$paramfile
+
+
+
+echo Using these parameters: Method: $method Windfield: $wind Coarse grid: $grid_coarse Fine grid:$grid_fine Last timestep:$timestep_finish
+echo $execute
+
+# Start FLASH
+$execute
+
+
+# Rename produced files according to method, wind and grid
+if (test -n "$diagnostics"); then
+  mv Flash90_diag.0000 "diagnosis_"$method"_"$wind"_"$grid_coarse"_"$grid_fine".txt"
+fi
+
+if (test -n "$output_file"); then
+  mv Flash90.out "out_"$method"_"$wind"_"$grid_coarse"_"$grid_fine".txt"
+fi
+
+if (test $gmv_plot = "1"); then
+  if (test -r "gmv_"$method"_"$wind"_"$grid_coarse"_"$grid_fine".0000"); then
+    rm "gmv_"$method"_"$wind"_"$grid_coarse"_"$grid_fine"."*
+  fi
+#  rename Flash90_gmv. "gmv_"$method"_"$wind"_"$grid_coarse"_"$grid_fine"." *
+#
+   for file in Flash90_gmv.*; do mv $file  `echo $file | sed 's/\(Flash90_gmv.\)/gmv_'$method'_'$wind'_'$grid_coarse'_'$grid_fine'.'/` ; done
+   for file in Flash90_matlab.*; do mv $file  `echo $file | sed 's/\(Flash90_matlab.\)/matlab_'$method'_'$wind'_'$grid_coarse'_'$grid_fine'.'/` ; done
+   for file in Flash90_netcdf.*; do mv $file  `echo $file | sed 's/\(Flash90_netcdf.\)/netcdf_'$method'_'$wind'_'$grid_coarse'_'$grid_fine'.'/` ; done
+fi
diff --git a/flash2d/tools/testreihe b/flash2d/tools/testreihe
new file mode 100644
index 0000000..7f5a0fe
--- /dev/null
+++ b/flash2d/tools/testreihe
@@ -0,0 +1,175 @@
+#!/bin/sh
+
+grid_coarse=""
+grid_fine=""
+timesteps=""
+help="0"
+
+circ="0"
+conv="0"
+diag="0"
+kaeser="0"
+
+Plain="0"
+Analytic="0"
+CW="0"
+CI="0"
+MPSLM="0"
+Priestley="0"
+Quad="0"
+
+execute="runFLASH "
+
+if (test -n "$1"); then
+  while (test -n "$1"); do
+    case "$1" in 
+  	-gc) 
+		if (test -n "$2"); then
+		  grid_coarse="$2"
+		  shift
+		else
+		  help="1"
+		fi ;;
+	-gf)
+		if (test -n "$2"); then
+		  grid_fine="$2"
+		  shift
+		else
+		  help="1"
+		fi ;;
+	-t)	
+		if (test -n "$2"); then
+		  timesteps=$2
+		  shift
+		else
+		  help="1"
+		fi ;;
+	-d)
+		execute=$execute"-d ";;
+	-gmv)
+		execute=$execute"-gmv ";;
+	-o)
+		execute=$execute"-o ";;
+	CircWind)	
+	  	circ="1";;
+	ConvWind)
+		conv="1";;
+	DiagWind)		  
+		diag="1";;
+	Kaeser)
+		kaeser="1";;
+	Plain)
+		Plain="1";;
+	Analytic)
+		Analytic="1";;
+	CW)
+		CW="1";;
+	CI)
+		CI="1";;
+	MPSLM)
+		MPSLM="1";;
+	Priestley)
+		Priestley="1";;
+	Quad)
+		Quad="1";;
+	all)
+		Plain="1"
+		Analytic="1"
+		CW="1"
+		CI="1"
+		MPSLM="1"
+		Priestley="1"
+		Quad="1";;
+	"-?")
+		help="1";;
+	"-help")
+		help="1";;
+	"--help")
+		help="1";;
+	*)
+		echo "option unknown: "$1
+		echo "Try testreihe -help"
+		exit;;
+    esac
+    shift
+  done
+else
+  help="1"
+fi
+
+if (test -z "$grid_coarse") || (test -z "$grid_fine") || (test -z "$timesteps") || (test ! -x ./runFLASH); then
+  help="1"
+fi
+
+if test $help = "1"; then
+  echo "-------------------------------------"
+  echo "  testreihe Version 0.2"
+  echo "  by Lars Mentrup 2004"
+  echo "-------------------------------------"
+  echo
+  echo "Usage: testreihe -gc # -gf # -t # [Analytic][CI][CW][MPSLM][Priestley][Quad] [CircWind][ConvWind][DiagWind][Kaeser]"
+  echo 
+  echo "Script to run multiple FLASH tests automatically." 
+  echo "Runs runFLASH corresponding to given Parameters."
+  echo "You can give multiple methods/winds on prompt." 
+  echo
+  echo "Specify the following options:"
+  echo
+  echo "  Essential parameters:"
+  echo "   -gc #         \t\tCoarse grid level"
+  echo "   -gf #         \t\tFine grid level"
+
+  echo "   -t #          \t\tNumber of timesteps "
+ 
+  echo 
+  echo "  Optional parameters:"
+  echo "   [method]      \t\tMethods to use (At least one of: Plain, CI, CW, MPSLM, Priestley, Quad, Analytic)"
+  echo "   [windfield]   \t\tWhat kind of winds to use (At least one of: CircWind, ConvWind, DiagWind, Kaeser)"
+  echo "   -d            \t\tturn diagnostics on (default: off)"
+  echo "   -gmv          \t\tturn GMV plot on (default: off)"
+  echo "   -o            \t\tsave output into File (default: off)"
+  echo
+  exit
+fi
+
+if test $circ = "1"; then
+  if test $Plain = "1"; then 		$execute -gf $grid_fine -gc $grid_coarse -w CircWind -t $timesteps -m Plain; fi
+  if test $Analytic = "1"; then 	$execute -gf $grid_fine -gc $grid_coarse -w CircWind -t $timesteps -m Analytic; fi
+  if test $CW = "1"; then 		$execute -gf $grid_fine -gc $grid_coarse -w CircWind -t $timesteps -m CW; fi
+  if test $CI = "1"; then 		$execute -gf $grid_fine -gc $grid_coarse -w CircWind -t $timesteps -m CI; fi
+  if test $MPSLM = "1"; then 		$execute -gf $grid_fine -gc $grid_coarse -w CircWind -t $timesteps -m MPSLM; fi
+  if test $Priestley = "1"; then 	$execute -gf $grid_fine -gc $grid_coarse -w CircWind -t $timesteps -m Priestley; fi
+  if test $Quad = "1"; then 		$execute -gf $grid_fine -gc $grid_coarse -w CircWind -t $timesteps -m Quad; fi
+fi
+
+
+if test $conv = "1"; then
+  if test $Plain = "1"; then 		$execute -gf $grid_fine -gc $grid_coarse -w ConvWind -t $timesteps -m Plain; fi
+  if test $Analytic = "1"; then 	$execute -gf $grid_fine -gc $grid_coarse -w ConvWind -t $timesteps -m Analytic; fi
+  if test $CW = "1"; then 		$execute -gf $grid_fine -gc $grid_coarse -w ConvWind -t $timesteps -m CW; fi
+  if test $CI = "1"; then 		$execute -gf $grid_fine -gc $grid_coarse -w ConvWind -t $timesteps -m CI; fi
+  if test $MPSLM = "1"; then 		$execute -gf $grid_fine -gc $grid_coarse -w ConvWind -t $timesteps -m MPSLM; fi
+  if test $Priestley = "1"; then 	$execute -gf $grid_fine -gc $grid_coarse -w ConvWind -t $timesteps -m Priestley; fi
+  if test $Quad = "1"; then 		$execute -gf $grid_fine -gc $grid_coarse -w ConvWind -t $timesteps -m Quad; fi
+fi
+
+
+if test "$diag" = "1";then
+  if test $Plain = "1"; then 		$execute -gf $grid_fine -gc $grid_coarse -w DiagWind -t $timesteps -m Plain; fi
+  if test $Analytic = "1"; then 	$execute -gf $grid_fine -gc $grid_coarse -w DiagWind -t $timesteps -m Analytic; fi
+  if test $CW = "1"; then 		$execute -gf $grid_fine -gc $grid_coarse -w DiagWind -t $timesteps -m CW; fi
+  if test $CI = "1"; then 		$execute -gf $grid_fine -gc $grid_coarse -w DiagWind -t $timesteps -m CI; fi
+  if test $MPSLM = "1"; then 		$execute -gf $grid_fine -gc $grid_coarse -w DiagWind -t $timesteps -m MPSLM; fi
+  if test $Priestley = "1"; then 	$execute -gf $grid_fine -gc $grid_coarse -w DiagWind -t $timesteps -m Priestley; fi
+  if test $Quad = "1"; then 		$execute -gf $grid_fine -gc $grid_coarse -w DiagWind -t $timesteps -m Quad; fi
+fi
+
+if test "$kaeser" = "1";then
+  if test $Plain = "1"; then 		$execute -gf $grid_fine -gc $grid_coarse -w Kaeser -t $timesteps -m Plain; fi
+  if test $Analytic = "1"; then 	$execute -gf $grid_fine -gc $grid_coarse -w Kaeser -t $timesteps -m Analytic; fi
+  if test $CW = "1"; then 		$execute -gf $grid_fine -gc $grid_coarse -w Kaeser -t $timesteps -m CW; fi
+  if test $CI = "1"; then 		$execute -gf $grid_fine -gc $grid_coarse -w Kaeser -t $timesteps -m CI; fi
+  if test $MPSLM = "1"; then 		$execute -gf $grid_fine -gc $grid_coarse -w Kaeser -t $timesteps -m MPSLM; fi
+  if test $Priestley = "1"; then 	$execute -gf $grid_fine -gc $grid_coarse -w Kaeser -t $timesteps -m Priestley; fi
+  if test $Quad = "1"; then 		$execute -gf $grid_fine -gc $grid_coarse -w Kaeser -t $timesteps -m Quad; fi
+fi
-- 
GitLab