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>yg{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 zfwZ7v0aqMJMcqyuUO$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<u2WB24OdV7WxDAHa?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