diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml
index 8159b5aaf9d..13d8cc534a3 100644
--- a/.github/workflows/cmake.yml
+++ b/.github/workflows/cmake.yml
@@ -32,7 +32,6 @@ permissions:
jobs:
cmake-linux:
- if: false
name: ${{ matrix.container }} ${{ matrix.compiler_mpi }} openmp=${{ matrix.openmp }} ${{ matrix.build_type }}
runs-on: [ubuntu-24.04]
container: ${{ matrix.container }}
diff --git a/Build/for_bundle/FDS_Web_Site.url b/Build/for_bundle/FDS_Web_Site.url
deleted file mode 100644
index 00391ace6e6..00000000000
--- a/Build/for_bundle/FDS_Web_Site.url
+++ /dev/null
@@ -1,2 +0,0 @@
-[InternetShortcut]
-URL=https://pages.nist.gov/fds-smv/
diff --git a/Build/for_bundle/Modules/linux/openmpi/211_64 b/Build/for_bundle/Modules/linux/openmpi/211_64
deleted file mode 100644
index e178ab2e2bc..00000000000
--- a/Build/for_bundle/Modules/linux/openmpi/211_64
+++ /dev/null
@@ -1,45 +0,0 @@
-#%Module@VER@#####################################################################
-
-proc ModulesHelp { } {
- global helpmsg
- puts stderr "\t$helpmsg\n"
-}
-
-#module add library/gmp6.0.0a library/mpfr3.1.2 library/mpc1.0.3 compilers/gcc4.9.2
-
-
-# change 'mpihome' to base directory where openmpi is located
-# and all variables below will be set correctly
-
-set mpihome /shared/openmpi211_64
-
-# make sure that another openmpi or FDS6 modules are not loaded
-#
-conflict openmpi
-conflict FDS6
-
-if [ file isdirectory $mpihome/bin ] {
- module-whatis "Sets up your openmpi environment to use $mpihome"
- set helpmsg "Sets up your openmpi environment to use $mpihome"
-
- setenv OPAL_PREFIX $mpihome
-
- setenv CC $mpihome/bin/mpicc
- setenv FC $mpihome/bin/mpif77
- setenv F90 $mpihome/bin/mpif90
- setenv F77 $mpihome/bin/mpif77
-
- prepend-path PATH $mpihome/bin
- prepend-path MANPATH $mpihome/man
- prepend-path C_INCLUDE_PATH $mpihome/include
- prepend-path CPLUS_INCLUDE_PATH $mpihome/include
- if [ file isdirectory $mpihome/lib64 ] {
- prepend-path LD_LIBRARY_PATH $mpihome/lib64:$mpihome/lib
- } else {
- prepend-path LD_LIBRARY_PATH $mpihome/lib
- }
-} else {
- module-whatis "MPI $mpihome is NOT installed"
- set helpmsg "MPI $mpihome is NOT installed"
-}
-
diff --git a/Build/for_bundle/Modules/linux/openmpi/211_64ib b/Build/for_bundle/Modules/linux/openmpi/211_64ib
deleted file mode 100644
index 435ae8ea84d..00000000000
--- a/Build/for_bundle/Modules/linux/openmpi/211_64ib
+++ /dev/null
@@ -1,48 +0,0 @@
-#%Module@VER@#####################################################################
-
-proc ModulesHelp { } {
- global helpmsg
- puts stderr "\t$helpmsg\n"
-}
-
-#module add library/gmp6.0.0a library/mpfr3.1.2 library/mpc1.0.3 compilers/gcc4.9.2
-
-
-# change 'mpihome' to base directory where openmpi is located
-# and all variables below will be set correctly
-
-set mpihome /shared/openmpi211_64ib
-
-# make sure that another openmpi or FDS6 modules are not loaded
-#
-conflict openmpi
-conflict FDS6
-
-if [ file isdirectory $mpihome/bin ] {
- module-whatis "Sets up your openmpi environment to use $mpihome"
- set helpmsg "Sets up your openmpi environment to use $mpihome"
-
- setenv OPAL_PREFIX $mpihome
-
- setenv CC $mpihome/bin/mpicc
- setenv FC $mpihome/bin/mpif77
- setenv F90 $mpihome/bin/mpif90
- setenv F77 $mpihome/bin/mpif77
-
- prepend-path PATH $mpihome/bin
- prepend-path MANPATH $mpihome/man
- prepend-path C_INCLUDE_PATH $mpihome/include
- prepend-path CPLUS_INCLUDE_PATH $mpihome/include
- if [ file isdirectory $mpihome/lib64 ] {
- prepend-path LD_LIBRARY_PATH $mpihome/lib64:$mpihome/lib
- } else {
- prepend-path LD_LIBRARY_PATH $mpihome/lib
- }
- if [ file isdirectory /usr/lib64 ] {
- prepend-path LD_LIBRARY_PATH /usr/lib64
- }
-} else {
- module-whatis "MPI $mpihome is NOT installed"
- set helpmsg "MPI $mpihome is NOT installed"
-}
-
diff --git a/Build/for_bundle/Modules/linux/openmpi/64 b/Build/for_bundle/Modules/linux/openmpi/64
deleted file mode 100644
index 509ea2dd591..00000000000
--- a/Build/for_bundle/Modules/linux/openmpi/64
+++ /dev/null
@@ -1,43 +0,0 @@
-#%Module@VER@#####################################################################
-
-proc ModulesHelp { } {
- global helpmsg
- puts stderr "\t$helpmsg\n"
-}
-
-#module add library/gmp6.0.0a library/mpfr3.1.2 library/mpc1.0.3 compilers/gcc4.9.2
-
-#
-# 1. change 'mpihome' to base directory: /usr/local/XXX/XXX/XXX,
-# and all variables below will be set correctly
-#
-set mpihome /shared/openmpi_64
-
-conflict openmpi
-conflict FDS6
-
-if [ file isdirectory $mpihome/bin ] {
- module-whatis "Sets up your openmpi environment to use $mpihome"
- set helpmsg "Sets up your openmpi environment to use $mpihome"
-
- setenv OPAL_PREFIX $mpihome
-
- setenv CC $mpihome/bin/mpicc
- setenv FC $mpihome/bin/mpif77
- setenv F90 $mpihome/bin/mpif90
- setenv F77 $mpihome/bin/mpif77
-
- prepend-path PATH $mpihome/bin
- prepend-path MANPATH $mpihome/man
- prepend-path C_INCLUDE_PATH $mpihome/include
- prepend-path CPLUS_INCLUDE_PATH $mpihome/include
- if [ file isdirectory $mpihome/lib64 ] {
- prepend-path LD_LIBRARY_PATH $mpihome/lib64:$mpihome/lib
- } else {
- prepend-path LD_LIBRARY_PATH $mpihome/lib
- }
-} else {
- module-whatis "MPI $mpihome is NOT installed"
- set helpmsg "MPI $mpihome is NOT installed"
-}
-
diff --git a/Build/for_bundle/Modules/linux/openmpi/64ib b/Build/for_bundle/Modules/linux/openmpi/64ib
deleted file mode 100644
index a28d83a5562..00000000000
--- a/Build/for_bundle/Modules/linux/openmpi/64ib
+++ /dev/null
@@ -1,46 +0,0 @@
-#%Module@VER@#####################################################################
-
-proc ModulesHelp { } {
- global helpmsg
- puts stderr "\t$helpmsg\n"
-}
-
-#module add library/gmp6.0.0a library/mpfr3.1.2 library/mpc1.0.3 compilers/gcc4.9.2
-
-#
-# 1. change 'mpihome' to base directory: /usr/local/XXX/XXX/XXX,
-# and all variables below will be set correctly
-#
-set mpihome /shared/openmpi_64ib
-
-conflict openmpi
-conflict FDS6
-
-if [ file isdirectory $mpihome/bin ] {
- module-whatis "Sets up your openmpi environment to use $mpihome"
- set helpmsg "Sets up your openmpi environment to use $mpihome"
-
- setenv OPAL_PREFIX $mpihome
-
- setenv CC $mpihome/bin/mpicc
- setenv FC $mpihome/bin/mpif77
- setenv F90 $mpihome/bin/mpif90
- setenv F77 $mpihome/bin/mpif77
-
- prepend-path PATH $mpihome/bin
- prepend-path MANPATH $mpihome/man
- prepend-path C_INCLUDE_PATH $mpihome/include
- prepend-path CPLUS_INCLUDE_PATH $mpihome/include
- if [ file isdirectory $mpihome/lib64 ] {
- prepend-path LD_LIBRARY_PATH $mpihome/lib64:$mpihome/lib
- } else {
- prepend-path LD_LIBRARY_PATH $mpihome/lib
- }
- if [ file isdirectory /usr/lib64 ] {
- prepend-path LD_LIBRARY_PATH /usr/lib64
- }
-} else {
- module-whatis "MPI $mpihome is NOT installed"
- set helpmsg "MPI $mpihome is NOT installed"
-}
-
diff --git a/Build/for_bundle/Modules/making_modules.txt b/Build/for_bundle/Modules/making_modules.txt
deleted file mode 100644
index be7d62c2e0f..00000000000
--- a/Build/for_bundle/Modules/making_modules.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-
-Suppose you have a script that sets environment variables.
-If you want to make a module from this script perform the
-following steps
-
-1. env | sort > file1
-2. run the script that sets environtment variables
-3. env | sort > file2
-4. ./env2mod -f file1 file2
-5. clean up module file named modulefile created by env2mod
-
-The program env2mod is located in the smv repo and may be built
-using scripts at smv/Build/env2mod.
diff --git a/Build/for_bundle/Modules/osx/openmpi/202_64 b/Build/for_bundle/Modules/osx/openmpi/202_64
deleted file mode 100644
index 5359dec2e9b..00000000000
--- a/Build/for_bundle/Modules/osx/openmpi/202_64
+++ /dev/null
@@ -1,45 +0,0 @@
-#%Module@VER@#####################################################################
-
-proc ModulesHelp { } {
- global helpmsg
- puts stderr "\t$helpmsg\n"
-}
-
-#module add library/gmp6.0.0a library/mpfr3.1.2 library/mpc1.0.3 compilers/gcc4.9.2
-
-
-# change 'mpihome' to base directory where openmpi is located
-# and all variables below will be set correctly
-
-set mpihome /shared/openmpi202_i17_64
-
-# make sure that another openmpi or FDS6 modules are not loaded
-
-conflict openmpi
-conflict FDS6
-
-if [ file isdirectory $mpihome/bin ] {
- module-whatis "Sets up your openmpi environment to use $mpihome"
- set helpmsg "Sets up your openmpi environment to use $mpihome"
-
- setenv OPAL_PREFIX $mpihome
-
- setenv CC $mpihome/bin/mpicc
- setenv FC $mpihome/bin/mpif77
- setenv F90 $mpihome/bin/mpif90
- setenv F77 $mpihome/bin/mpif77
-
- prepend-path PATH $mpihome/bin
- prepend-path MANPATH $mpihome/man
- prepend-path C_INCLUDE_PATH $mpihome/include
- prepend-path CPLUS_INCLUDE_PATH $mpihome/include
- if [ file isdirectory $mpihome/lib64 ] {
- prepend-path LD_LIBRARY_PATH $mpihome/lib64:$mpihome/lib
- } else {
- prepend-path LD_LIBRARY_PATH $mpihome/lib
- }
-} else {
- module-whatis "MPI $mpihome is NOT installed"
- set helpmsg "MPI $mpihome is NOT installed"
-}
-
diff --git a/Build/for_bundle/Modules/osx/openmpi/211_64 b/Build/for_bundle/Modules/osx/openmpi/211_64
deleted file mode 100644
index 3cfb18445ab..00000000000
--- a/Build/for_bundle/Modules/osx/openmpi/211_64
+++ /dev/null
@@ -1,45 +0,0 @@
-#%Module@VER@#####################################################################
-
-proc ModulesHelp { } {
- global helpmsg
- puts stderr "\t$helpmsg\n"
-}
-
-#module add library/gmp6.0.0a library/mpfr3.1.2 library/mpc1.0.3 compilers/gcc4.9.2
-
-
-# change 'mpihome' to base directory where openmpi is located
-# and all variables below will be set correctly
-
-set mpihome /shared/openmpi211_i17u4_64
-
-# make sure that another openmpi or FDS6 modules are not loaded
-
-conflict openmpi
-conflict FDS6
-
-if [ file isdirectory $mpihome/bin ] {
- module-whatis "Sets up your openmpi environment to use $mpihome"
- set helpmsg "Sets up your openmpi environment to use $mpihome"
-
- setenv OPAL_PREFIX $mpihome
-
- setenv CC $mpihome/bin/mpicc
- setenv FC $mpihome/bin/mpif77
- setenv F90 $mpihome/bin/mpif90
- setenv F77 $mpihome/bin/mpif77
-
- prepend-path PATH $mpihome/bin
- prepend-path MANPATH $mpihome/man
- prepend-path C_INCLUDE_PATH $mpihome/include
- prepend-path CPLUS_INCLUDE_PATH $mpihome/include
- if [ file isdirectory $mpihome/lib64 ] {
- prepend-path LD_LIBRARY_PATH $mpihome/lib64:$mpihome/lib
- } else {
- prepend-path LD_LIBRARY_PATH $mpihome/lib
- }
-} else {
- module-whatis "MPI $mpihome is NOT installed"
- set helpmsg "MPI $mpihome is NOT installed"
-}
-
diff --git a/Build/for_bundle/Modules/osx/openmpi/64 b/Build/for_bundle/Modules/osx/openmpi/64
deleted file mode 100644
index 509ea2dd591..00000000000
--- a/Build/for_bundle/Modules/osx/openmpi/64
+++ /dev/null
@@ -1,43 +0,0 @@
-#%Module@VER@#####################################################################
-
-proc ModulesHelp { } {
- global helpmsg
- puts stderr "\t$helpmsg\n"
-}
-
-#module add library/gmp6.0.0a library/mpfr3.1.2 library/mpc1.0.3 compilers/gcc4.9.2
-
-#
-# 1. change 'mpihome' to base directory: /usr/local/XXX/XXX/XXX,
-# and all variables below will be set correctly
-#
-set mpihome /shared/openmpi_64
-
-conflict openmpi
-conflict FDS6
-
-if [ file isdirectory $mpihome/bin ] {
- module-whatis "Sets up your openmpi environment to use $mpihome"
- set helpmsg "Sets up your openmpi environment to use $mpihome"
-
- setenv OPAL_PREFIX $mpihome
-
- setenv CC $mpihome/bin/mpicc
- setenv FC $mpihome/bin/mpif77
- setenv F90 $mpihome/bin/mpif90
- setenv F77 $mpihome/bin/mpif77
-
- prepend-path PATH $mpihome/bin
- prepend-path MANPATH $mpihome/man
- prepend-path C_INCLUDE_PATH $mpihome/include
- prepend-path CPLUS_INCLUDE_PATH $mpihome/include
- if [ file isdirectory $mpihome/lib64 ] {
- prepend-path LD_LIBRARY_PATH $mpihome/lib64:$mpihome/lib
- } else {
- prepend-path LD_LIBRARY_PATH $mpihome/lib
- }
-} else {
- module-whatis "MPI $mpihome is NOT installed"
- set helpmsg "MPI $mpihome is NOT installed"
-}
-
diff --git a/Build/for_bundle/Overview.html b/Build/for_bundle/Overview.html
deleted file mode 100644
index 513ec91553c..00000000000
--- a/Build/for_bundle/Overview.html
+++ /dev/null
@@ -1,54 +0,0 @@
-
-
-
-FDS and Smokeview Overview
-
-
-FDS and Smokeview Overview
-
-
-
-FDS is a computer program that solves equations that describe the evolution of fire. It is a Fortran program
-that reads input parameters from a text file, computes a numerical solution to the governing equations, and
-writes user-specified output data to files. Smokeview is a companion program that creates visualizations of
-FDS generated data.
-
-
FDS Documentation
-
-
-
-Smokeview Documentation
-
-
-Updates
-
-
-User Support
-The FDS-Smokeview discussion group exists so that users may discuss fire phenomena related to FDS/Smokeview scenarios.
-Similar to the discussion group, is the Issue Tracker which was set up to report problems and to request enhancements.
-When reporting a problem to the Issue Tracker, it is important to simplify your case as much as possible and still exhibit the problem.
-The Discussion group and Issue tracker are available at
-
-
-
-
-
-
-
-
diff --git a/Build/for_bundle/Overview_linux_osx.html b/Build/for_bundle/Overview_linux_osx.html
deleted file mode 100644
index 920ddfe385d..00000000000
--- a/Build/for_bundle/Overview_linux_osx.html
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-
-FDS and Smokeview Overview
-
-
-FDS and Smokeview Overview
-
-
-
-FDS is a computer program that solves equations that describe the evolution of fire. It is a Fortran program
-that reads input parameters from a text file, computes a numerical solution to the governing equations, and
-writes user-specified output data to files. Smokeview is a companion program that reads FDS output files
-and produces animations on the computer screen.
-
-
Documentation
-
-
-
-Updates
-
-
-User Support
-The FDS-Smokeview discussion group exists so that users may discuss fire phenomena related to FDS/Smokeview scenarios.
-Similar to the discussion group, is the Issue Tracker which was set up to report problems and to request enhancements.
-When reporting a problem to the ISsue Tracker, it is important to simplify your case as much as possible and still exhibit the problem.
-The Discussion group and Issue tracker are available at
-
-
-
-
-
-
-
-
diff --git a/Build/for_bundle/about.txt b/Build/for_bundle/about.txt
deleted file mode 100644
index 1f3d3adf62e..00000000000
--- a/Build/for_bundle/about.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-The Fire Dynamics Simulator (FDS), is a computational
-fluid dynamics (CFD) model of fire-driven fluid flow.
-
-Smokeview is a separate visualization program that is used to display the
-results of an FDS simulation.
\ No newline at end of file
diff --git a/Build/for_bundle/fds_local.bat b/Build/for_bundle/fds_local.bat
deleted file mode 100644
index 8ca235cbbc9..00000000000
--- a/Build/for_bundle/fds_local.bat
+++ /dev/null
@@ -1,215 +0,0 @@
-@echo off
-
-if NOT "x%1%" == "x" goto skip_usage
- call :usage
- exit /b
-:skip_usage
-
-set n_mpi=1
-set n_openmp=1
-set show_only=0
-set stop_script=0
-set use_openmp=0
-set force_openmp=0
-set have_casename=0
-set show_version=0
-set MPIEXEC_PORT_RANGE=
-set MPICH_PORT_RANGE=
-set debug=
-set oversubscribed=
-set casedir=
-set use_default_casedir=
-set "fabric="
-
-
-call :getopts %*
-if "%stop_script%" == "1" exit /b
-call :set_openmp_defaults
-
-if "x%IN_CMDFDS%" == "x1" goto skip_fdsinit
- echo setting up environment for fds
- call fdsinit
-:skip_fdsinit
-
-if "x%IN_CMDFDS%" == "x1" goto skip_NO_IN_CMDFDS
- echo ***Error: environment not setup for using fds
- echo type: fdsinit or use the CMDfds command shell
- exit /b
-:skip_NO_IN_CMDFDS
-
-if "%show_version%" == "0" goto skip_showversion
- mpiexec -localonly -n 1 fds
-goto eof
-:skip_showversion
-
-if "%have_casename%" == "1" goto skip_casename_test
- echo ***error: an input file is missing
- call :usage
- echo .
- if "%show_only%" == "1" goto skip_casename_test
- exit /b
-:skip_casename_test
-
-set ECHO=
-if "%show_only%" == "1" set ECHO=echo
-
-if "%show_only%" == "1" goto skip1
-if "x%use_default_casedir%" == "x" goto skip3
- set casedir=%casename:~0,-4%
-:skip3
-if "x%casedir%" == "x" goto skip2
-if NOT exist %casedir% mkdir %casedir%
- echo @echo off > %casedir%.bat
- echo smokeview %casedir% >> %casedir%.bat
- copy %casename% %casedir%
- cd %casedir%
-:skip2
-:skip1
-
-:: placeholder names for openmp and non-openmp versions of fds
-
-set fds_openmp=fds_openmp
-set fds_non_openmp=fds
-
-set fds=%fds_openmp%
-set "openmp_env=-env OMP_NUM_THREADS %n_openmp%"
-
-:: use non-openmp fds if number of threads is 1 and openmp is not being forced
-
-if NOT "%n_openmp%" == "1" goto skip1
-if "%force_openmp%" == "1" goto skip1
- set fds=%fds_non_openmp%
- set openmp_env=
-:skip1
-
-TITLE %casename%
-%ECHO% mpiexec -localonly -n %n_mpi% %openmp_env% %debug% %oversubscribed% %fabric% %fds% %casename%
-
-:eof
-exit /b
-
-:-------------------------------------------------------------------------
-:----------------------subroutines----------------------------------------
-:-------------------------------------------------------------------------
-
-:-------------------------------------------------------------------------
-:getopts
-:-------------------------------------------------------------------------
- if (%1)==() exit /b
-
- set casename=%1
- set case1=%casename:~0,1%
- if "%case1%" == "-" goto skip_casename
-
- set have_casename=1
- if EXIST %casename% goto skip_casename_notexist
- if "%show_only%" == "1" goto skip_casename_notexist
- echo ***error: The input file %casename% does not exist
- set stop_script=1
-
- :skip_casename_notexist
- exit /b
-
- :skip_casename
- set valid=0
- set arg=%1
- if /I "%1" EQU "-p" (
- set valid=1
- set n_mpi=%2
- shift
- )
- if /I "%1" EQU "-c" (
- set valid=1
- set show_only=1
- )
- if /I "%1" EQU "-v" (
- set valid=1
- set show_version=1
- )
- if /I "%1" EQU "-d" (
- set valid=1
- set "debug=-env I_MPI_DEBUG=5"
- )
- if /I "%1" EQU "-F" (
- set valid=1
- set "fabric=-env I_MPI_FABRICS=%2"
- shift
- )
- if /I "%1" EQU "-h" (
- set valid=1
- set stop_script=1
- call :usage
- exit /b
- )
- if "%1" EQU "-o" (
- set valid=1
- set n_openmp=%2
- set use_openmp=1
- shift
- )
- if "%1" EQU "-f" (
- set valid=1
- set force_openmp=1
- )
- if "%1" EQU "-y" (
- set valid=1
- set casedir=%2
- shift
- )
- if "%1" EQU "-Y" (
- set valid=1
- set use_default_casedir=1
- )
- if "%1" EQU "-O" (
- set valid=1
- set "oversubscribed=-env I_MPI_WAIT_MODE=1"
- )
- shift
- if %valid% == 0 (
- echo.
- echo ***Error: the input argument %arg% is invalid
- echo.
- echo Usage:
- call :usage
- set stop_script=1
- exit /b
- )
-if not (%1)==() goto getopts
-exit /b
-
-:-------------------------------------------------------------------------
-:set_openmp_defaults
-:-------------------------------------------------------------------------
-:: if number of openmp threads are not specified then
-:: set number of openmp threads to 1 if number of mpi processes > 1
-:: set number of openmp threads to %OMP_NUM_THREADS% if number of mpi processes = 1
-
-if "%use_openmp%" == "1" exit /b
-if "%n_mpi%" == "1" set n_openmp=%OMP_NUM_THREADS%
-if "%n_mpi%" == "1" exit /b
-set n_openmp=1
-exit /b
-
-:-------------------------------------------------------------------------
-:usage
-:-------------------------------------------------------------------------
-echo.
-echo Usage:
-echo fds_local [options] casename.fds
-echo.
-echo options:
-echo -c - show command line generated by this script (fds is not run)
-echo -d - add -env I_MPI_DEBUG=5 to the mpiexec line for debugging
-echo -f - force the openmp version of fds to be used even if the number of threads is 1
-echo -F fabric - set I_MPI_FABRICS fabric variable
-echo -h - display this message
-echo -p xx - number of MPI processes [default: 1]
-echo -o yy - number of OpenMP threads per process [default: %OMP_NUM_THREADS% ]
-echo fds_local uses the non-OpenMP version of fds if the number of OpenMP threads
-echo specified per process is 1 unless the -f option is also specified
-echo -O - add -env I_MPI_WAIT=1 to the mpiexec line for use when your case is oversubscribed
-echo -v - show fds version information
-echo -y dir - run casename.fds in directory dir
-echo -Y - run casename.fds in directory casename
-
-exit /b
diff --git a/Build/for_bundle/fdsinit.bat b/Build/for_bundle/fdsinit.bat
deleted file mode 100644
index 989e1bdef2d..00000000000
--- a/Build/for_bundle/fdsinit.bat
+++ /dev/null
@@ -1,11 +0,0 @@
-@echo off
-set I_MPI_ROOT=%~dp0\mpi
-set PATH=%I_MPI_ROOT%;%PATH%
-set IN_CMDFDS=1
-set MPIEXEC_PORT_RANGE=
-set MPICH_PORT_RANGE=
-
-title FDS
-echo.
-echo type helpfds for help on running fds
-
diff --git a/Build/for_bundle/fdspath.bat b/Build/for_bundle/fdspath.bat
deleted file mode 100644
index 6ce819cb297..00000000000
--- a/Build/for_bundle/fdspath.bat
+++ /dev/null
@@ -1,43 +0,0 @@
-@echo off
-set CURDIR=%CD%
-
-if "x%FDS_SAVE_PATH%" == "x" goto set_fds_path
-:: restore original path
-
-echo restoring original path
-set PATH=%FDS_SAVE_PATH%
-echo.
-echo PATH=%PATH%
-set FDS_SAVE_PATH=
-echo.
-echo original path restored
-
-goto eof
-
-:set_fds_path
-
-:: set path containing fds, smokeview, intel mpi and windows entries
-
-SET I_MPI_ROOT=%~dp0\mpi
-SET FDS_PATH=%~dp0
-SET SMV_PATH=%~dp0\..\..\SMV6
-
-cd %I_MPI_ROOT%
-SET I_MPI_ROOT=%CD%
-
-cd %FDS_PATH%
-SET FDS_PATH=%CD%
-
-cd %SMV_PATH%
-SET SMV_PATH=%CD%
-
-SET FDS_SAVE_PATH=%PATH%
-echo setting path to contain only fds, smokeview, intel mpi and windows entries
-echo type fdspath again to restore original path
-SET PATH=%SMV_PATH%;%FDS_PATH%;%I_MPI_ROOT%;%WINDIR%;%WINDIR%\system32
-echo.
-echo PATH=%PATH%
-
-:eof
-
-cd %CURDIR%
diff --git a/Build/for_bundle/helpfds.bat b/Build/for_bundle/helpfds.bat
deleted file mode 100644
index c66f025b89e..00000000000
--- a/Build/for_bundle/helpfds.bat
+++ /dev/null
@@ -1,21 +0,0 @@
-@echo off
-fds -v
-echo Current number of OpenMP threads per MPI process:
-echo OMP_NUM_THREADS=%OMP_NUM_THREADS%
-echo.
-echo To run fds, open the command shell CMDfds located on the desktop.
-echo.
-echo To run fds for cases using this computer only:
-echo fds_local -p xx -o yy casename.fds
-echo.
-echo For more options type: fds_local -h
-echo.
-echo To run fds for cases using multiple computers:
-echo mpiexec -n xx -hostfile hostfile.txt -wdir WDIR -env OMP_NUM_THREADS yy fds casename.fds
-echo.
-echo xx -- number of MPI processes requested
-echo yy -- number of OpenMP threads requested per MPI process
-echo hostfile.txt -- list of available computers
-echo WDIR -- Network address of the working directory
-echo.
-
diff --git a/Build/for_bundle/icon.ico b/Build/for_bundle/icon.ico
deleted file mode 100644
index d8dfc51c751..00000000000
Binary files a/Build/for_bundle/icon.ico and /dev/null differ
diff --git a/Build/for_bundle/setup.bat b/Build/for_bundle/setup.bat
deleted file mode 100644
index 1efd368e6e7..00000000000
--- a/Build/for_bundle/setup.bat
+++ /dev/null
@@ -1,534 +0,0 @@
-@echo off
-set script_dir=%~dp0
-
-title FDS and Smokeview Installer for %username% with home directory %userprofile%
-
-:: before we do anything make sure this is a 64 bit PC
-
-if defined PROGRAMFILES(X86) (
- echo.
-) else (
- echo.
- echo *** Fatal error: 32 bit Windows detected.
- echo FDS and Smokeview can only run on 64 bit systems.
- echo Installation aborted.
- echo *** Press any key to continue. ***
- pause>NUL
- goto abort
-)
-
-:: form extraction directory
-
-set /p basename= Nul
-
-set "LOGFILE=%INSTALLDIR%\fds_install.log"
-echo FDS/Smokeview installation log > "%LOGFILE%"
-
-echo. >> "%LOGFILE%"
-echo *** Copying fds files >> "%LOGFILE%"
-xcopy /E /I /H /Q firemodels\FDS6 "%FDS6%" >> "%LOGFILE%"
-
-echo. >> "%LOGFILE%"
-echo *** Copying smokeview files >> "%LOGFILE%"
-xcopy /E /I /H /Q firemodels\SMV6 "%SMV6%" >> "%LOGFILE%"
-
-set "filepath=%FDS6%\bin\fds.exe%"
-call :is_file_copied fds.exe
-
-set "filepath=%SMV6%\smokeview.exe"
-call :is_file_copied smokeview.exe
-
-set "filepath=%FDS6%\bin\mpi\mpiexec.exe"
-call :is_file_copied mpiexec.exe
-
-echo copy complete
-
-echo *** Removing previous FDS/Smokeview entries from the system and user path.
-echo. >> "%LOGFILE%"
-echo *** Removing previous FDS/Smokeview entries from the system and user path. >> "%LOGFILE%"
-call "%UNINSTALLDIR%\set_path.exe" -s -m -b -r "nist\fds" >> "%LOGFILE%"
-call "%UNINSTALLDIR%\set_path.exe" -u -m -b -r "FDS\FDS5" >> "%LOGFILE%"
-call "%UNINSTALLDIR%\set_path.exe" -s -m -b -r "FDS\FDS5" >> "%LOGFILE%"
-call "%UNINSTALLDIR%\set_path.exe" -u -m -b -r "FDS\FDS6" >> "%LOGFILE%"
-call "%UNINSTALLDIR%\set_path.exe" -s -m -b -r "FDS\FDS6" >> "%LOGFILE%"
-call "%UNINSTALLDIR%\set_path.exe" -s -m -b -r "firemodels\FDS6" >> "%LOGFILE%"
-call "%UNINSTALLDIR%\set_path.exe" -s -m -b -r "firemodels\SMV6" >> "%LOGFILE%"
-call "%UNINSTALLDIR%\set_path.exe" -u -m -b -r "firemodels\FDS6" >> "%LOGFILE%"
-call "%UNINSTALLDIR%\set_path.exe" -u -m -b -r "firemodels\SMV6" >> "%LOGFILE%"
-
-:: ------------ create aliases ----------------
-
-set numcoresfile="%TEMP%\numcoresfile"
-
-:: ------------ setting up path ------------
-
-echo *** Setting up PATH variable.
-
-echo. >> "%LOGFILE%"
-echo *** Setting up PATH variable >> "%LOGFILE%"
-if NOT "%option_install%" == "1" goto skip_systempath
- call "%UNINSTALLDIR%\set_path.exe" -s -m -f "%FDS6%\bin" >> "%LOGFILE%"
- call "%UNINSTALLDIR%\set_path.exe" -s -m -f "%SMV6%" >> "%LOGFILE%"
- goto after_setpath
-:skip_systempath
-
-call "%UNINSTALLDIR%\set_path.exe" -u -m -f "%FDS6%\bin" >> "%LOGFILE%"
-call "%UNINSTALLDIR%\set_path.exe" -u -m -f "%SMV6%" >> "%LOGFILE%"
-
-:after_setpath
-
-:: ------------- file association -------------
-echo *** Associating the .smv file extension with smokeview.exe
-
-echo. >> "%LOGFILE%"
-echo *** Associating the .smv file extension with smokeview.exe >> "%LOGFILE%"
-ftype smvDoc="%SMV6%\smokeview.exe" "%%1" >> "%LOGFILE%"
-assoc .smv=smvDoc >> "%LOGFILE%"
-
-if exist "%Programdata%\Microsoft\Windows\Start Menu\Programs" set "FDSSTART=%Programdata%\Microsoft\Windows\Start Menu\Programs\FDS6"
-if exist "%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs" set "FDSSTART=%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\FDS6"
-:: ------------- start menu shortcuts ---------------
-echo *** Adding document shortcuts to %FDSSTART% .
-if exist "%FDSSTART%" rmdir /q /s "%FDSSTART%"
-
-mkdir "%FDSSTART%"
-
-echo. >> "%LOGFILE%"
-echo *** Setting up shortcuts/urls >> "%LOGFILE%"
-call :copy_url "%DOCDIR%\FDS_on_the_Web\Official_Web_Site.url" "%FDSSTART%\FDS Home Page.url"
-
-call :setup_shortcut "%FDSSTART%\FDS Config Management Plan.lnk" "%DOCDIR%\Guides_and_Release_Notes\FDS_Config_Management_Plan.pdf"
-call :setup_shortcut "%FDSSTART%\FDS User Guide.lnk" "%DOCDIR%\Guides_and_Release_Notes\FDS_User_Guide.pdf"
-call :setup_shortcut "%FDSSTART%\FDS Technical Reference Guide.lnk" "%DOCDIR%\Guides_and_Release_Notes\FDS_Technical_Reference_Guide.pdf"
-call :setup_shortcut "%FDSSTART%\FDS Validation Guide.lnk" "%DOCDIR%\Guides_and_Release_Notes\FDS_Validation_Guide.pdf"
-call :setup_shortcut "%FDSSTART%\FDS Verification Guide.lnk" "%DOCDIR%\Guides_and_Release_Notes\FDS_Verification_Guide.pdf"
-call :setup_shortcut "%FDSSTART%\FDS Release Notes.lnk" "%DOCDIR%\Guides_and_Release_Notes\FDS_Release_Notes.htm"
-call :setup_shortcut "%FDSSTART%\Smokeview User Guide.lnk" "%DOCDIR%\Guides_and_Release_Notes\SMV_User_Guide.pdf"
-call :setup_shortcut "%FDSSTART%\Smokeview Technical Reference Guide.lnk" "%DOCDIR%\Guides_and_Release_Notes\SMV_Technical_Reference_Guide.pdf"
-call :setup_shortcut "%FDSSTART%\Smokeview Verification Guide.lnk" "%DOCDIR%\Guides_and_Release_Notes\SMV_Verification_Guide.pdf"
-call :setup_shortcut "%FDSSTART%\Smokeview release notes.lnk" "%DOCDIR%\Guides_and_Release_Notes\Smokeview_release_notes.html"
-call :setup_shortcut "%FDSSTART%\Uninstall.lnk" "%UNINSTALLDIR%\uninstall.bat"
-
-set "DESKTOPDIR=%userprofile%\Desktop"
-set "DESKTOPDIR11=%OneDrive%\Desktop"
-
- call :setup_cmdfds "%FDSSTART%\CMDfds.lnk"
-if exist "%DESKTOPDIR%" call :setup_cmdfds "%DESKTOPDIR%\CMDfds.lnk"
-if exist "%DESKTOPDIR11%" call :setup_cmdfds "%DESKTOPDIR11%\CMDfds.lnk"
-set cmdexist=0
-if exist "%DESKTOPDIR%\CMDfds.lnk" set cmdexist=1
-if exist "%DESKTOPDIR11%\CMDfds.lnk" set cmdexist=1
-if "%cmdexist%" == "0" echo ***error: CMDfds failed to be copied to the desktop
-
-:: ----------- setting up openmp threads environment variable
-
-::WMIC CPU Get NumberofLogicalProcessors | more /E +1 > %numcoresfile%
-set ncores=1
-if "x%NUMBER_OF_PROCESSORS%" == "x" goto endif1
- echo %NUMBER_OF_PROCESSORS% > %numcoresfile%
-:endif1
-
-set /p ncores=<%numcoresfile%
-
-if %ncores% GEQ 8 (
- set nthreads=4
-) else (
- if %ncores% GEQ 4 (
- set nthreads=2
- ) else (
- set nthreads=1
- )
-)
-
-echo. >> "%LOGFILE%"
-echo *** Setting up the OMP_NUM_THREADS variable >> "%LOGFILE%"
-setx -m OMP_NUM_THREADS %nthreads% >> "%LOGFILE%"
-
-:: ----------- setting up firewall for mpi version of FDS
-
-:: remove smpd and hydra
-
-echo. >> "%LOGFILE%"
-echo *** Removing smpd >> "%LOGFILE%"
-smpd -remove 1>> Nul 2>&1
-echo. >> "%LOGFILE%"
-echo *** Removing hydra >> "%LOGFILE%"
-hydra_service -remove 1>> Nul 2>&1
-
-echo. >> "%LOGFILE%"
-echo *** Setting up firewall exceptions. >> "%LOGFILE%"
-echo *** Setting up firewall exceptions.
-set "firewall_setup=%FDS6%\setup_fds_firewall.bat"
-call "%firewall_setup%" "%FDS6%\bin\mpi"
-
-:: ----------- setting up uninstall file
-
-echo. >> "%LOGFILE%"
-echo *** Setting up the Uninstall script. >> "%LOGFILE%"
-echo *** Setting up the Uninstall script.
-
-:: remove smokeview path and directory
-
-echo if "%%cfastinstalled%%" == "1" goto skip2 >> "%UNINSTALLDIR%\uninstall_base.bat"
-echo echo Removing "%SMV6%" from the System Path >> "%UNINSTALLDIR%\uninstall_base.bat"
-echo call "%UNINSTALLDIR%\set_path.exe" -s -b -r %SMV6% >> "%UNINSTALLDIR%\uninstall_base.bat"
-echo rmdir /s /q "%SMV6%" >> "%UNINSTALLDIR%\uninstall_base.bat"
-echo :skip2 >> "%UNINSTALLDIR%\uninstall_base.bat"
-
-echo echo Removing CMDfds desktop shortcut >> "%UNINSTALLDIR%\uninstall_base.bat"
-echo if exist "%DESKTOPDIR%\CMDfds.lnk" erase "%DESKTOPDIR%\CMDfds.lnk" >> "%UNINSTALLDIR%\uninstall_base.bat"
-echo if exist "%DESKTOPDIR11%\CMDfds.lnk" erase "%DESKTOPDIR11%\CMDfds.lnk" >> "%UNINSTALLDIR%\uninstall_base.bat"
-
-:: remove FDS path and directory
-
-echo echo Removing "%FDS6%\bin" from the System Path >> "%UNINSTALLDIR%\uninstall_base.bat"
-echo call "%UNINSTALLDIR%\set_path.exe" -s -b -r "%FDS6%\bin" >> "%UNINSTALLDIR%\uninstall_base.bat"
-echo echo. >> "%UNINSTALLDIR%\uninstall_base.bat"
-echo echo Removing "%FDS6%" >> "%UNINSTALLDIR%\uninstall_base.bat"
-echo rmdir /s /q "%FDS6%" >> "%UNINSTALLDIR%\uninstall_base.bat"
-
-:: if cfast exists then only remove fds
-:: if cfast does not exist then remove everything
-
-echo if exist "%CFAST%" goto skip_remove >> "%UNINSTALLDIR%\uninstall_base.bat"
-echo echo Removing "%SMV6%" >> "%UNINSTALLDIR%\uninstall_base.bat"
-echo rmdir /s /q "%SMV6%" >> "%UNINSTALLDIR%\uninstall_base.bat"
-echo echo Removing "%INSTALLDIR%" >> "%UNINSTALLDIR%\uninstall_base.bat"
-echo rmdir "%INSTALLDIR%" >> "%UNINSTALLDIR%\uninstall_base.bat"
-echo :skip_remove >> "%UNINSTALLDIR%\uninstall_base.bat"
-
-echo echo *** Uninstall complete >> "%UNINSTALLDIR%\uninstall_base.bat"
-
-type "%UNINSTALLDIR%\uninstall_base2.bat" >> "%UNINSTALLDIR%\uninstall_base.bat"
-echo pause>Nul >> "%UNINSTALLDIR%\uninstall_base.bat"
-erase "%UNINSTALLDIR%\uninstall_base2.bat"
-
-echo "%UNINSTALLDIR%\uninstall.vbs" >> "%UNINSTALLDIR%\uninstall.bat"
-echo echo Uninstall complete >> "%UNINSTALLDIR%\uninstall.bat"
-echo pause >> "%UNINSTALLDIR%\uninstall.bat"
-
-set "ELEVATE_APP=%UNINSTALLDIR%\uninstall_base.bat"
-set ELEVATE_PARMS=
-echo Set objShell = CreateObject("Shell.Application") > "%UNINSTALLDIR%\uninstall.vbs"
-echo Set objWshShell = WScript.CreateObject("WScript.Shell") >> "%UNINSTALLDIR%\uninstall.vbs"
-echo Set objWshProcessEnv = objWshShell.Environment("PROCESS") >> "%UNINSTALLDIR%\uninstall.vbs"
-echo objShell.ShellExecute "%ELEVATE_APP%", "%ELEVATE_PARMS%", "", "runas" >> "%UNINSTALLDIR%\uninstall.vbs"
-echo WScript.Sleep 10000 >> "%UNINSTALLDIR%\uninstall.vbs"
-
-echo. >> "%LOGFILE%"
-echo *** Cleanup >> "%LOGFILE%"
-erase "%firewall_setup%" >> "%LOGFILE%"
-erase "%FDS6%\shortcut.exe" >> "%LOGFILE%"
-
-echo.
-echo To run fds for cases using this computer only, open the
-echo command shell CMDfds (located on the desktop) and type:
-echo.
-echo fds_local casename.fds
-echo.
-echo where casename is the name of your case. For more information type: helpfds.
-echo.
-echo *** Press any key, then reboot to complete the installation. ***
-pause>NUL
-goto eof
-
-:-------------------------------------------------------------------------
-:----------------------subroutines----------------------------------------
-:-------------------------------------------------------------------------
-
-:: -------------------------------------------------------------
-:is_file_copied
-:: -------------------------------------------------------------
-
- set file=%1
- if not exist "%filepath%" echo.
- if not exist "%filepath%" echo ***error: %file% failed to copy to %filepath%
- exit /b 0
-
-:-------------------------------------------------------------------------
-:setup_cmdfds
-:-------------------------------------------------------------------------
-set outfile=%1
-
-"%FDS6%\shortcut.exe" /F:%outfile% /T:"%COMSPEC%" /P:"/k fdsinit" /W:"%userprofile%" /A:C > Nul
-if exist %outfile% echo The shortcut %outfile% was created >> "%LOGFILE%
-if NOT exist %outfile% echo ***error: The shortcut %outfile% failed to be created >> "%LOGFILE%
-if NOT exist %outfile% echo ***error: The shortcut %outfile% failed to be created
-exit /b
-
-:-------------------------------------------------------------------------
-:setup_shortcut
-:-------------------------------------------------------------------------
-set infile=%2
-set outfile=%1
-
-"%FDS6%\shortcut.exe" /F:%outfile% /T:%infile% /A:C > Nul
-if exist %outfile% echo The shortcut %outfile% was created >> "%LOGFILE%
-if NOT exist %outfile% echo ***error: The shortcut %outfile% failed to be created >> "%LOGFILE%
-if NOT exist %outfile% echo ***error: The shortcut %outfile% failed to be created
-
-exit /b
-
-:-------------------------------------------------------------------------
-:copy_url
-:-------------------------------------------------------------------------
-set infile=%1
-set outfile=%2
-
-copy %infile% %outfile%
-if exist %outfile% echo The url %outfile% was created >> "%LOGFILE%
-if NOT exist %outfile% echo ***error: The url %outfile% failed to be created >> "%LOGFILE%
-if NOT exist %outfile% echo ***error: The url %outfile% failed to be created
-
-exit /b
-
-:-------------------------------------------------------------------------
-:get_yesnoextract
-:-------------------------------------------------------------------------
-set answer=%1
-set answervar=%2
-set repeatvar=%3
-
-set answer=%answer:~0,1%
-if "%answer%" == "Y" set answer=y
-if "%answer%" == "N" set answer=n
-if "%answer%" == "Q" set answer=q
-if "%answer%" == "E" set answer=e
-set %answervar%=%answer%
-set repeat=1
-if "%answer%" == "y" set repeat=0
-if "%answer%" == "n" set repeat=0
-if "%answer%" == "q" set repeat=2
-if "%answer%" == "e" set repeat=3
-set %repeatvar%=%repeat%
-exit /b
-
-:-------------------------------------------------------------------------
-:get_yesno
-:-------------------------------------------------------------------------
-set answer=%1
-set answervar=%2
-set repeatvar=%3
-
-set answer=%answer:~0,1%
-if "%answer%" == "Y" set answer=y
-if "%answer%" == "N" set answer=n
-set %answervar%=%answer%
-set repeat=1
-if "%answer%" == "y" set repeat=0
-if "%answer%" == "n" set repeat=0
-set %repeatvar%=%repeat%
-exit /b
-
-:-------------------------------------------------------------------------
-:count_programs
-:-------------------------------------------------------------------------
-call :count fds
-call :count smokeview
-call :count mpiexec
-call :count hydra_service
-exit /b
-
-:-------------------------------------------------------------------------
-:stop_programs
-:-------------------------------------------------------------------------
-:: remove old installation
-
-if NOT "%hydra_service_count%" == "0" (
- echo *** Stopping hydra_service
- taskkill /F /IM hydra_service.exe >Nul 2>Nul
-)
-
-if NOT "%smokeview_count%" == "0" (
- echo *** Stopping smokeview
- taskkill /F /IM smokeview.exe >Nul 2>Nul
-)
-
-if NOT "%fds_count%" == "0" (
- echo *** Stopping fds
- taskkill /F /IM fds.exe >Nul 2>Nul
-)
-
-if NOT "%mpiexec_count%" == "0" (
- echo *** Stopping mpiexec
- taskkill /F /IM mpiexec.exe >Nul 2>Nul
-)
-exit /b
-
-:-------------------------------------------------------------------------
-:count
-:-------------------------------------------------------------------------
-set progbase=%1
-set prog=%progbase%.exe
-set countvar=%progbase%_count
-set stringvar=%progbase%_string
-
-tasklist | find /c "%prog%" > count.txt
-set /p count%= Nul
-xcopy /E /I /H /Q firemodels\FDS6 "%FDS6%" > Nul
-xcopy /E /I /H /Q firemodels\SMV6 "%SMV6%" > Nul
-
-echo Copy complete
-echo Press any key to finish
-pause > Nul
-goto eof
-
-:abort
-echo FDS and Smokeview installation aborted.
-echo Press any key to finish
-pause > Nul
-
-:eof
-exit
\ No newline at end of file
diff --git a/Build/for_bundle/setup_fds_firewall.bat b/Build/for_bundle/setup_fds_firewall.bat
deleted file mode 100644
index 6d9b3a7780f..00000000000
--- a/Build/for_bundle/setup_fds_firewall.bat
+++ /dev/null
@@ -1,15 +0,0 @@
-@echo off
-set bindir=%1
-:: This script deletes previous Intel MPI firewall exceptions and creates two
-:: new rules opening ports specified by the environment variable PORT_VAL.
-
-set PORT_VAL=8670-8690
-netsh advfirewall firewall delete rule name="Intel MPI Port for FDS" > Nul
-netsh advfirewall firewall add rule dir=in action=allow name="Intel MPI Port for FDS" profile=domain,private protocol=tcp localport=%PORT_VAL% > Nul
-netsh advfirewall firewall add rule dir=in action=allow name="Intel MPI Port for FDS" profile=domain,private protocol=udp localport=%PORT_VAL% > Nul
-
-:: setx -m MPIEXEC_PORT_RANGE 8670:8690 > Nul
-:: setx -m MPICH_PORT_RANGE 8670:8690 > Nul
-
-%bindir%\hydra_service -install > Nul
-
diff --git a/Build/for_bundle/temp/.gitignore b/Build/for_bundle/temp/.gitignore
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/Build/for_bundle/uninstall.bat b/Build/for_bundle/uninstall.bat
deleted file mode 100644
index 5141616ce8e..00000000000
--- a/Build/for_bundle/uninstall.bat
+++ /dev/null
@@ -1,7 +0,0 @@
-@echo off
-
-echo.
-echo *** Uninstalling FDS and Smokeview
-echo.
-echo Press any key to proceed or CTRL C to abort
-pause>NUL
diff --git a/Build/for_bundle/uninstall_fds.bat b/Build/for_bundle/uninstall_fds.bat
deleted file mode 100644
index bffaa95eef0..00000000000
--- a/Build/for_bundle/uninstall_fds.bat
+++ /dev/null
@@ -1,35 +0,0 @@
-@echo off
-
-NET SESSION >nul 2>&1
-IF %ERRORLEVEL% NEQ 0 (
- echo *** Error: This script is running as %username%. It must run as Administrator.
- echo Run again, after right clicking on this script and selecting "Run as Adminstrator"
- echo FDS/Smokeview uninstaller aborted.
- pause
- exit
-)
-
-call :is_cfast_installed
-if %cfastinstalled% == 1 goto skip1
- echo *** Removing the association between .smv and Smokeview
- assoc .smv=
- ftype smvDoc=
-:skip1
-
-echo *** Removing FDS from the Start menu.
-rmdir /q /s "%ALLUSERSPROFILE%\Start Menu\Programs\FDS6"
-
-echo *** Stopping smokeview
-taskkill /F /IM smokeview.exe >Nul 2>Nul
-
-echo *** Stopping fds
-taskkill /F /IM fds.exe >Nul 2>Nul
-
-echo *** Stopping mpiexec
-taskkill /F /IM mpiexec.exe >Nul 2>Nul
-
-echo *** Removing hydra_service
-taskkill /F /IM hydra_service.exe >Nul 2>Nul
-
-echo *** Removing smpd
-smpd -remove >Nul 2>Nul
diff --git a/Build/for_bundle/uninstall_fds2.bat b/Build/for_bundle/uninstall_fds2.bat
deleted file mode 100644
index 6a6b4b86b62..00000000000
--- a/Build/for_bundle/uninstall_fds2.bat
+++ /dev/null
@@ -1,13 +0,0 @@
-goto eof
-
-:is_cfast_installed
-cfast 1> %temp%\file_exist.txt 2>&1
-type %temp%\file_exist.txt | find /i /c "not recognized" > %temp%\file_exist_count.txt
-set /p nothave=<%temp%\file_exist_count.txt
-set cfastinstalled=1
-if %nothave% == 1 (
- set cfastinstalled=0
-)
-exit /b 0
-
-:eof
diff --git a/Manuals/Bibliography/commoncommands.tex b/Manuals/Bibliography/commoncommands.tex
index b0bc8f3e9c7..746d9fdf884 100644
--- a/Manuals/Bibliography/commoncommands.tex
+++ b/Manuals/Bibliography/commoncommands.tex
@@ -64,7 +64,7 @@
\usepackage[section]{placeins}
\usepackage{scrextend}
\usepackage{needspace}
-\usepackage[backend=biber, style=phys, sorting=none, backref=true, giveninits=true, maxbibnames=99]{biblatex}
+\usepackage[backend=biber, style=numeric-comp, sorting=none, backref=true, giveninits=true, maxbibnames=99]{biblatex}
\ExecuteBibliographyOptions[report]{doi=true, url=true}
\renewbibmacro{in:}{}
\DeclareFieldFormat{titlecase}{#1}
@@ -112,8 +112,20 @@
pdfpagemode=UseNone,
bookmarksopen=true,
plainpages=false,
+ hypertexnames=true,
verbose]{hyperref}
+% Needed to fix page back ref links
+\makeatletter
+\hypersetup{pageanchor=false}
+
+\let\FDS@orig@pagenumbering\pagenumbering
+\renewcommand*{\pagenumbering}[1]{%
+ \hypersetup{pageanchor=true}%
+ \FDS@orig@pagenumbering{#1}%
+}
+\makeatother
+
% The Following commented code makes the ``Draft'' watermark on each page.
%\usepackage{eso-pic}
%\usepackage{type1cm}
@@ -163,7 +175,7 @@
\newcommand{\logosigs}{
\begin{minipage}[b]{6.25in}
-\parbox[b]{.5\textwidth}{\flushleft{\includegraphics[height=1in]{../Bibliography/FSRI_blk_logo_Lockup}}}
+\parbox[b]{.5\textwidth}{\flushleft{\includegraphics[height=0.8in]{../Bibliography/FSRI_blk_logo_Lockup}}}
\hfill
\parbox[b]{.5\textwidth}{\flushright{\includegraphics[height=1in]{../Bibliography/nistident_flright_vec}}}
\end{minipage}
diff --git a/Manuals/FDS_Config_Management_Plan/FDS_Config_Management_Plan.tex b/Manuals/FDS_Config_Management_Plan/FDS_Config_Management_Plan.tex
index 66568e8697a..e100ec9030e 100755
--- a/Manuals/FDS_Config_Management_Plan/FDS_Config_Management_Plan.tex
+++ b/Manuals/FDS_Config_Management_Plan/FDS_Config_Management_Plan.tex
@@ -178,7 +178,7 @@ \section{Model Version}
Version 1 of FDS was publicly released in February 2000, version 2 in December 2001, version 3 in November 2002, version 4 in July 2004, version 5 in October 2007, and version 6 in October 2013.
-Starting with FDS 5, a formal revision management system was implemented to track changes to the FDS source code. The open-source program development tools are provided by GitHub (https://github.com/).
+A revision management system tracks changes to the FDS source code, manuals, and various supporting scripts. The open-source program development tools are provided by GitHub (https://github.com/).
Wiki files (accessible through the \emph{Wiki Pages} button at \href{https://pages.nist.gov/fds-smv} {\ct{https://pages.nist.gov/fds-smv}}), maintained by the developers, details the changes made for each release. A separate file is provided for both FDS and Smokeview.
@@ -262,7 +262,7 @@ \section{Governing Equations, Assumptions and Numerics}
The following is a brief description of the major components of FDS. Detailed information regarding the assumptions and governing equations associated with the model is provided in Volume~1 of the FDS Technical Reference Guide~\cite{FDS_Tech_Guide}.
\begin{description}
\item[Hydrodynamic Model] FDS solves numerically a form of the Navier-Stokes equations appropriate for low-speed, thermally-driven flow with an emphasis on smoke and heat transport from fires. The core algorithm is an explicit predictor-corrector scheme that is second order accurate in space and time. Turbulence is treated by means of Large Eddy Simulation (LES). It is possible to perform a Direct Numerical Simulation (DNS) if the underlying numerical grid is fine enough. LES is the default mode of operation.
-\item[Combustion Model] For most applications, FDS uses a combustion model based on the mixing limited, infinitely fast reaction of lumped species. Lumped species are reacting scalar quantities that represent a mixture of species such as air which is a mixture of nitrogen, oxygen, water vapor, and carbon dioxide. As with FDS 5, the reaction of fuel and oxygen is not necessarily instantaneous and complete, and there are several optional schemes that are designed to predict the extent of combustion in under-ventilated spaces. The mass fractions of all primitive species can be obtained from a linear combination of the lumped species.
+\item[Combustion Model] For most applications, FDS uses a combustion model based on the mixing limited, infinitely fast reaction of lumped species. Lumped species are reacting scalar quantities that represent a mixture of species such as air which is a mixture of nitrogen, oxygen, water vapor, and carbon dioxide. The reaction of fuel and oxygen is not necessarily instantaneous and complete, and there are several optional schemes that are designed to predict the extent of combustion in under-ventilated spaces. The mass fractions of all primitive species can be obtained from a linear combination of the lumped species.
\item[Radiation Transport] Radiative heat transfer is included in the model via the solution of the radiation transport equation for a gray gas. In a limited number of cases, a wide band model can be used in place of the gray gas model to provide a better spectral accuracy. The radiation equation is solved using a technique similar to a finite volume method for convective transport, thus the name given to it is the Finite Volume Method (FVM). Using approximately 100 discrete angles, the finite volume solver requires about 20~\% of the total CPU time of a calculation, a modest cost given the complexity of radiation heat transfer. Water droplets can absorb and scatter thermal radiation. This is important in cases involving mist sprinklers, but also plays a role in all sprinkler cases. The absorption and scattering coefficients are based on Mie theory. The scattering from the gaseous species and soot is not included in the model.
\item[Geometry] FDS approximates the governing equations on one or more rectilinear grids. The user prescribes rectangular obstructions that are forced to conform with the underlying grid.
\item[Boundary Conditions] All solid surfaces are assigned thermal boundary conditions, plus information about the burning behavior of the material. Heat and mass transfer to and from solid surfaces is usually handled with empirical correlations, although it is possible to compute directly the heat and mass transfer when performing a Direct Numerical Simulation (DNS).
@@ -352,14 +352,18 @@ \subsection{Version Identification and Numbering}
At the start of a simulation, FDS writes header information to the Smokeview output file, FDS output file, and the FDS log file. This header information contains the version of FDS used to perform that simulation.
-Official versions of the model released by NIST are identified with specific version numbers tied to specific revisions in the repository and are identified on the download page for the model that can be compared to the version output from the model. For example, the following information is included on the FDS download website for FDS version 6.7.9
+Official versions of the software are identified with specific version numbers tied to specific revisions in the repository and are identified on the download page for the model that can be compared to the version output from the model. For example, the following information is included on the FDS download website for FDS version 6.7.9
\begin{lstlisting}
Version : FDS 6.7.9
- Revision : FDS6.7.9-0-gec52dee42-release
+ Revision : FDS-6.7.9-0-gec52dee42-release
Revision Date : Wed Aug 24 16:29:46 2016 -0400
Compilation Date : Aug 24, 2016 22:28:55
\end{lstlisting}
-New versions of FDS and Smokeview are identified using a specific numbering convention consisting of three integers separated by periods, where the first number is the {\em major} release, the second is the {\em minor} release, and the third is the {\em maintenance} release. For example, FDS 6.7.9 indicates that this is FDS 6, the sixth major release. The 7 indicates a significant upgrade (a minor release), but still within the framework of FDS 6. The 9 indicates the ninth maintenance release of 6.7, mostly bug fixes and minor user requests. All volumes of the FDS/Smokeview documentation are also automatically tagged with this information on the title page of each document providing documentation and traceability of a given version of the documents to a specific version of FDS/Smokeview and a specific repository revision. Release notes indicate whether the changes affect a particular model feature. Maintenance releases are either just bug fixes or the addition of minor enhancements (such as a new output quantity), and should not affect code functionality.
+New versions of FDS and Smokeview are identified using a specific numbering convention consisting of three integers separated by periods, where the first number is the {\em major} release, the second is the {\em minor} release, and the third is the {\em maintenance} release. For example, FDS 6.7.9 indicates that this is FDS 6, the sixth major release. The 7 indicates a significant upgrade (a minor release), but still within the framework of FDS 6. The 9 indicates the ninth maintenance release of 6.7, mostly bug fixes and minor user requests. The integer following the version string, in this case 0, indicates the number of git revisions made since the issuing of the release. The integer 0, along with the term ``release'' indicates that this is an official release. Nightly patches are released between maintenance releases, as indicated by a non-zero integer following the version string. The ``nightly bundles'' serve to address issues brought up by users in daily discussion and issue posts.
+
+The hexadecimal string \ct{ec52dee42} in the version string is an abbreviated git commit hash which can be used to check out the exact state of the GitHub repository. The letter {\ct g} preceding it stands for ``git''.
+
+All volumes of the FDS/Smokeview documentation are also automatically tagged with this information on the title page of each document providing documentation and traceability of a given version of the documents to a specific version of FDS/Smokeview and a specific repository revision. Release notes indicate whether the changes affect a particular model feature. Maintenance releases are either just bug fixes or the addition of minor enhancements (such as a new output quantity), and should not affect code functionality.
@@ -543,7 +547,7 @@ \section{Records Collection, Maintenance, and Retention}
\section{Securing the FDS/Smokeview Installation Files}
-FDS and Smokeview installation files are built on NIST managed computers with access limited to only those associated with the FDS/Smokeview project. Each bundle file and the bundle itself is scanned for viruses and malware. The bundle is not made available if the scan identifies a suspicious signature. A SHA256 hash code is also generated for each bundle file so that one may verify that files have not been altered. A list of these hash codes and the status of the virus scan is stored in a separate file with the suffix {\tt \_manifest.html} and made available along with the bundle.
+FDS and Smokeview installation files are built on NIST managed computers with access limited to only those associated with the FDS/Smokeview project. Each bundle file and the bundle itself is scanned for viruses and malware. The bundle is not made available if the scan identifies a suspicious signature. A SHA256 hash code is also generated for each bundle file so that one may verify that files have not been altered. A list of these hash codes and the status of the virus scan is stored in a separate file with the suffix \ct{_manifest.html} and made available along with the bundle.
diff --git a/Manuals/FDS_Technical_Reference_Guide/Appendices.tex b/Manuals/FDS_Technical_Reference_Guide/Appendices.tex
index 45c4c35326f..b12787e5d15 100644
--- a/Manuals/FDS_Technical_Reference_Guide/Appendices.tex
+++ b/Manuals/FDS_Technical_Reference_Guide/Appendices.tex
@@ -2621,7 +2621,7 @@ \subsection*{Discrete Laplacian on a Staggered Grid (2D)}
\draw[gray!60, thin] (gyB.north) -- (1,0); % bottom face
\end{tikzpicture}
-\caption{Construction of the discrete Laplacian of $H$ on a two–dimensional staggered grid. Pressure gradients are evaluated at cell faces and differenced back to the cell center to form the five–point stencil.}
+\caption[The discrete Laplacian on a two–dimensional staggered grid]{Construction of the discrete Laplacian of $H$ on a two–dimensional staggered grid. Pressure gradients are evaluated at cell faces and differenced back to the cell center to form the five–point stencil.}
\label{fig:laplacian_staggered}
\end{figure}
@@ -2814,7 +2814,7 @@ \subsection*{Dirichlet Boundary Conditions}
\end{scope}
\end{tikzpicture}
-\caption{Imposition of a Dirichlet boundary condition using a single ghost cell in FDS. The ghost value is eliminated using the prescribed boundary value, resulting in a modification of the diagonal entry of the discrete Laplacian and the right hand side.}
+\caption[Dirichlet boundary condition using a single ghost cell in FDS]{Imposition of a Dirichlet boundary condition using a single ghost cell in FDS. The ghost value is eliminated using the prescribed boundary value, resulting in a modification of the diagonal entry of the discrete Laplacian and the right hand side.}
\label{fig:dirichlet_bc_fds}
\end{figure}
@@ -2965,7 +2965,7 @@ \subsection*{Neumann Boundary Conditions}
\end{scope}
\end{tikzpicture}
-\caption{Imposition of a Neumann boundary condition using a ghost cell in FDS. The ghost value is defined to enforce a prescribed normal gradient at the boundary. Elimination of the ghost cell removes one neighbor contribution, resulting in a change of the diagonal entry of the discrete Laplacian from $-4$ to $-3$. The RHS is augmented per Eq.~(X).}
+\caption[Neumann boundary condition using a ghost cell in FDS]{Imposition of a Neumann boundary condition using a ghost cell in FDS. The ghost value is defined to enforce a prescribed normal gradient at the boundary. Elimination of the ghost cell removes one neighbor contribution, resulting in a change of the diagonal entry of the discrete Laplacian from $-4$ to $-3$. The RHS is augmented per Eq.~(X).}
\label{fig:neumann_bc_fds}
\end{figure}
@@ -3038,7 +3038,7 @@ \subsection*{Geometry at Coarse-Fine Interface}
\draw[<->, gray] (2.25,-0.8) -- (3,-0.8);
\node[gray] at (2.625,-1.1) {$\delta x_F/2$};
\end{tikzpicture}
-\caption{2D view of coarse-fine interface showing cell centroids (blue dots) and flux couplings (green arrows). The interface (red dashed line) separates the coarse mesh from the fine mesh.}
+\caption[2D view of coarse-fine interface]{2D view of coarse-fine interface showing cell centroids (blue dots) and flux couplings (green arrows). The interface (red dashed line) separates the coarse mesh from the fine mesh.}
\label{fig:coarse_fine_interface}
\end{figure}
@@ -3148,7 +3148,7 @@ \subsection*{Flux matched Interpolation}
\node[anchor=west] at (2.5,1.0) {\small \textcolor{green!60!black}{$\bullet$} Fine cell centers};
\end{tikzpicture}
-\caption{Guard cell interpolation at 2:1 refinement interface. The fine cells have half the width
+\caption[Guard cell interpolation at 2:1 refinement interface]{Guard cell interpolation at 2:1 refinement interface. The fine cells have half the width
of the coarse cell ($\Delta x_f = \Delta x_c/2$). The coarse guard cell (red dashed boundary)
overlaps two fine cells. The guard cell centroid (red dot) is located at $\Delta x_c/2$ from the
interface, which corresponds to the left edge of the fine cells (gray dotted line).}
diff --git a/Manuals/FDS_User_Guide/FDS_User_Guide.tex b/Manuals/FDS_User_Guide/FDS_User_Guide.tex
index 0cdb9f2e758..7d95d9db5e8 100644
--- a/Manuals/FDS_User_Guide/FDS_User_Guide.tex
+++ b/Manuals/FDS_User_Guide/FDS_User_Guide.tex
@@ -1727,7 +1727,7 @@ \subsubsection{Open Vents}
The first special \ct{VENT} is invoked by the parameter \ct{SURF_ID='OPEN'}. This \ct{VENT} denotes a passive opening to the outside, and it can only be applied to the exterior boundary of the computational domain. By default, FDS assumes that the exterior boundary of the computational domain (the \ct{XB}s on the \ct{MESH} line where they are not adjacent to another \ct{MESH}) is a solid wall. To create a totally or partially open domain, use \ct{OPEN} vents on the exterior mesh boundaries. It is sometimes convenient to specify doors or windows that open out to the exterior of the computational domain by simply specifying it to be \ct{OPEN}. However, keep in mind that the pressure boundary condition on such an opening is imperfect, and it is recommended that if the flow through the doorway or window is important, you should extend the domain a few meters beyond the doorway or window. You would still have to use the \ct{OPEN} boundary on the extended region to open up one or more sides of the computational domain, but these openings would be far enough away from the modeled door or window that they would not affect the flow pattern.
-By default, it is assumed that ambient conditions exist beyond the \ct{'OPEN'} vent. However, in some cases, you may want to alter this assumption, for example, the temperature. If you assume a temperature other than ambient, specify \ct{TMP_EXTERIOR} along with \ct{SURF_ID='OPEN'}. You can modify the time history of this parameter using a ramp function, \ct{TMP_EXTERIOR_RAMP} (see Section~\ref{info:RAMP_Time} for details about time/temperature ramps). Use this option cautiously -- in many situations if you want to describe the exterior of a building, it is better to include the exterior explicitly in your calculation because the flow in and out of the doors and windows will be more naturally captured. See Sec.~\ref{info:stackeffect} for more details. If you want to specify a non-ambient pressure at the \ct{OPEN} boundary, see Sec.~\ref{info:pressure_boundary}.
+By default, it is assumed that ambient conditions exist beyond the \ct{'OPEN'} vent. However, in some cases, you may want to alter this assumption, for example, the temperature. If you assume a temperature other than ambient, specify \ct{TMP_EXTERIOR} along with \ct{SURF_ID='OPEN'}. You can modify the time history of this parameter using a ramp function, \ct{TMP_EXTERIOR_RAMP} (see Eq.~(\ref{temp_time_ramp}) as an example). Use this option cautiously -- in many situations if you want to describe the exterior of a building, it is better to include the exterior explicitly in your calculation because the flow in and out of the doors and windows will be more naturally captured. See Sec.~\ref{info:stackeffect} for more details. If you want to specify a non-ambient pressure at the \ct{OPEN} boundary, see Sec.~\ref{info:pressure_boundary}.
The \ct{OPEN} pressure boundary condition is most stable for flows that are predominantly normal to the vent, either mostly in or mostly out. This is because the prescribed pressure at an \ct{OPEN} boundary is ill-conditioned (a small perturbation to the input may lead to large change in the output) if the flow is parallel to the vent. Suppose, for example, that an outdoor flow is 10 m/s in the $x$ direction and $\pm 0.001$ m/s in the $z$ direction with an \ct{OPEN} top boundary. The kinetic energy of this flow is roughly $k=50$ \unit{m^2/s^2}. When the vertical velocity is positive (+0.001 m/s) then the prescribed boundary condition for the stagnation pressure is set to $\cH = k = 50$ \unit{m^2/s^2}. But when the vertical velocity is negative (-0.001 m/s) then $\cH = 0$ (see \cite{FDS_Tech_Guide}). For this reason, \ct{OPEN} vents should be used with care in outdoor applications. See Section \ref{info:WIND} for an alternative approach.
@@ -4317,12 +4317,16 @@ \chapter{User-Specified Functions}
\section{Time-Dependent Functions}
\label{info:RAMP_Time}
-At the start of any calculation, the temperature is ambient everywhere, the flow velocity is zero everywhere, nothing is burning, and the mass fractions of all species are uniform. You can control the rate at which things turn on, or turn off, by specifying time histories either with pre-defined functions or with user-defined functions. The parameters \ct{TAU_Q}, \ct{TAU_T}, and \ct{TAU_V} indicate that the heat release rate (\ct{HRRPUA}); surface temperature (\ct{TMP_FRONT}); and/or normal velocity (\ct{VEL}, \ct{VOLUME_FLOW}), or \ct{MASS_FLUX_TOTAL} are to ramp up to their prescribed values as follows, using the heat release rate, $\dot{Q}(t)$, as an example:
+At the start of any simulation, the temperature is ambient everywhere, the flow velocity is zero everywhere, nothing is burning, and the mass fractions of all species are uniform. You can control various time histories either with pre-defined functions or with user-defined functions, referred to as ``time ramps.'' For example, the heat release rate, $\dot{Q}(t)$, can be ramped up from zero as follows:
\begin{equation}
\dot Q(t) = \left\{ \begin{array}{ll} \dot Q_0 \, \left( t/\tau \right)^2 & (\tau < 0) \\[.1in]
- \dot Q_0 \, \tanh \left( t/\tau \right) & (\tau > 0) \end{array} \right.
+ \dot Q_0 \, \tanh \left( t/\tau \right) & (\tau > 0) \end{array} \right.
\end{equation}
-$\dot Q_0$ is the user-specified heat release rate. If the fire ramps up following a $t$-squared curve, then it remains constant after \ct{TAU_Q} seconds. These rules apply to \ct{TAU_T} and \ct{TAU_V} as well. The default value for all \ct{TAU}s is 1~s\footnote{You can change the default ramp-up time by setting \ct{TAU_DEFAULT} on the \ct{MISC} line.}. If something other than a tanh or $t$-squared ramp up is desired, then a user-defined function can be input. To do this, set \ct{RAMP_Q}, \ct{RAMP_T} or \ct{RAMP_V} equal to a character string designating the ramp function to use for that particular surface type, then somewhere in the input file generate lines of the form:
+where $\dot{Q}_0$ is the user-specified heat release rate and $\tau$ is a time-scale with a default value of 1~s that can be specified via \ct{TAU_Q} on the \ct{SURF} line. The parameter \ct{TAU_T} controls the surface temperature (\ct{TMP_FRONT}) and \ct{TAU_V} controls the normal velocity (\ct{VEL}), volume flow (\ct{VOLUME_FLOW}), or total mass flux (\ct{MASS_FLUX_TOTAL}).
+
+If the fire ramps up following a $t$-squared curve, then it remains constant after |\ct{TAU_Q}| seconds. These rules apply to \ct{TAU_T} and \ct{TAU_V} as well. The default value for all \ct{TAU}s is 1~s\footnote{You can change the default ramp-up time by setting \ct{TAU_DEFAULT} on the \ct{MISC} line.}.
+
+If something other than a tanh or $t$-squared ramp up is desired, then a user-defined function can be input. To do this, set \ct{RAMP_Q}, \ct{RAMP_T} or \ct{RAMP_V} equal to a character string designating the ramp function to use for that particular surface type, then somewhere in the input file generate lines of the form:
\begin{lstlisting}
&RAMP ID='rampname1', T= 0.0, F=0.0 /
&RAMP ID='rampname1', T= 5.0, F=0.5 /
@@ -4343,7 +4347,7 @@ \section{Time-Dependent Functions}
\end{lstlisting}
Use \ct{TAU_T} or \ct{RAMP_T} to control the ramp-ups for surface temperature. The surface temperature at time $t$, $T(t)$, is
\be
-T(t) = T_0 + f(t) \left( T_{\rm f} - T_0 \right)
+T(t) = T_0 + f(t) \left( T_{\rm f} - T_0 \right) \label{temp_time_ramp}
\ee
where $f(t)$ is the result of evaluating the \ct{RAMP_T} at time $t$, $T_0$ is the ambient temperature, and $T_{\rm f}$ is specified via \ct{TMP_FRONT} on the same \ct{SURF} line as \ct{RAMP_T}. Use \ct{TAU_MF(N)} or \ct{RAMP_MF(N)} to control the ramp-ups for either the mass fraction or mass flux of species \ct{N}. For example:
\begin{lstlisting}
diff --git a/Manuals/FDS_Verification_Guide/FDS_Verification_Guide.tex b/Manuals/FDS_Verification_Guide/FDS_Verification_Guide.tex
index 069d9ec695f..8c07851b272 100644
--- a/Manuals/FDS_Verification_Guide/FDS_Verification_Guide.tex
+++ b/Manuals/FDS_Verification_Guide/FDS_Verification_Guide.tex
@@ -1426,7 +1426,7 @@ \subsection{Temperature Bounds for Large Differences in Molecular Weight}
\subsection{Temperature Lower Bound in a Fire Simulation}
\label{tmp_lower_limit}
-A 2-D methane-air diffusion flame calculation is run three different ways to check that the temperature does not fall below the ambient (20~\unit{\degreeCelsius}). The results are shown in Fig.~\ref{tmp_lower_limit_fig}. The left plot shows the global minimum temperature for the case where the reaction stoichiometry is specified explicitly. Theright plot is for the case where the simple chemistry model is used.
+A 2-D methane-air diffusion flame calculation is run three different ways to check that the temperature does not fall below the ambient (20~\unit{\degreeCelsius}). The results are shown in Fig.~\ref{tmp_lower_limit_fig}. The left plot shows the global minimum temperature for the case where the reaction stoichiometry is specified explicitly. The right plot is for the case where the simple chemistry model is used.
\begin{figure}[!ht]
\begin{tabular*}{\textwidth}{l@{\extracolsep{\fill}}r}
@@ -1608,7 +1608,7 @@ \section{Discharge Coefficient}
\begin{figure}[!ht]
\centering
\includegraphics[height=2.2in]{SCRIPT_FIGURES/thick_orifice}
-\caption[Results of the \ct{thick_orifice} case]{Pressure rise behind an square, thick orifice in a duct.}
+\caption[Results of the \ct{thick_orifice} case]{Pressure rise behind a square, thick orifice in a duct.}
\label{fig:thick_orifice}
\end{figure}
@@ -1968,7 +1968,7 @@ \subsubsection{Abbas Jaber, NIST SURF student}
\section{Heated Channel Flow}
-The simulation of turbulent channel flow (Re$_{\tau}=180$) with a heat source was performed to verify the log law near-wall model for heat transfer \cite{FDS_Tech_Guide}. The height of the channel is $H=2$ m, the width is $W=6$ m, and the length is $L=12$ m. There are 96 cells in the stream-wise direction ($\delta x = 0.125$ m) and 48 cells in the spanwise and wall-normal directions ($\delta y=\delta z=0.125$ m). The midpoint of the first cell in viscous units is $z^+ \approx 18$, putting the first velocity unknown within the buffer layer. For this reason, the dynamic Smagorinsky SGS model is used for the residual stress. Additionally, these cases were run with (\ct{SIMULATION_MODE='LES'} on \ct{MISC}), which accounts for both molecular the turbulent transport coefficients, a must for distinguishing between fluids with different molecular Prandtl or Schmidt numbers (here the Reynolds number is so low that molecular effects may dominate locally). The flow is maintained by a mean pressure gradient ($9.0 \times 10^{-6}$ Pa/m) in the stream-wise direction (follows from Re$_{\tau}=180$). A constant volumetric heat source (0.5 W/m$^3$) is imposed on the fluid. The boundary conditions for momentum equations are no-slip at top and bottom walls and periodic for the stream-wise and spanwise directions. The boundary condition for the energy equation is constant temperature ($T_w = 20 \,\mbox{\unit{\degreeCelsius}} $) at the wall. To evaluate the effects of Prandtl number (Pr) and compare the DNS study \cite{Kim:1987} with FDS, the specific heat ($c_p = 1$ \unit{kJ/(kg.K)}) and viscosity ($\mu = 1.8216 \times 10^{-5}$ \unit{kg/(m.s)}) are fixed and the conductivity, $k$, of the fluid (air) is adjusted to:
+The simulation of turbulent channel flow (Re$_{\tau}=180$) with a heat source was performed to verify the log law near-wall model for heat transfer \cite{FDS_Tech_Guide}. The height of the channel is $H=2$ m, the width is $W=6$ m, and the length is $L=12$ m. There are 96 cells in the stream-wise direction ($\delta x = 0.125$ m) and 48 cells in the spanwise and wall-normal directions ($\delta y=\delta z=0.125$ m). The midpoint of the first cell in viscous units is $z^+ \approx 18$, putting the first velocity unknown within the buffer layer. For this reason, the dynamic Smagorinsky SGS model is used for the residual stress. Additionally, these cases were run with (\ct{SIMULATION_MODE='LES'} on \ct{MISC}), which accounts for both molecular and turbulent transport coefficients, a must for distinguishing between fluids with different molecular Prandtl or Schmidt numbers (here the Reynolds number is so low that molecular effects may dominate locally). The flow is maintained by a mean pressure gradient ($9.0 \times 10^{-6}$ Pa/m) in the stream-wise direction (follows from Re$_{\tau}=180$). A constant volumetric heat source (0.5 W/m$^3$) is imposed on the fluid. The boundary conditions for momentum equations are no-slip at top and bottom walls and periodic for the stream-wise and spanwise directions. The boundary condition for the energy equation is constant temperature ($T_w = 20 \,\mbox{\unit{\degreeCelsius}} $) at the wall. To evaluate the effects of Prandtl number (Pr) and compare the DNS study \cite{Kim:1987} with FDS, the specific heat ($c_p = 1$ \unit{kJ/(kg.K)}) and viscosity ($\mu = 1.8216 \times 10^{-5}$ \unit{kg/(m.s)}) are fixed and the conductivity, $k$, of the fluid (air) is adjusted to:
\begin{center}
\begin{tabular}{ll}
Pr & $k$ (\unit{W/(m.K)}) \\
@@ -2500,7 +2500,7 @@ \subsection{Integral Mass Test for Complex Geometry}
\section{Energy Conservation}
-FDS does not explicitly solve the energy conservation equation. Instead, mass transport equations are solved for the the $n$ independent gas species. The density is found from summing the individual gas species densities, $\rho = \sum_\alpha \rho_\alpha$. Source terms from the energy equation are incorporated in the velocity divergence, $\nabla \cdot \bu$, which is factored out of the sensible enthalpy transport equation, i.e.,
+FDS does not explicitly solve the energy conservation equation. Instead, mass transport equations are solved for the $n$ independent gas species. The density is found from summing the individual gas species densities, $\rho = \sum_\alpha \rho_\alpha$. Source terms from the energy equation are incorporated in the velocity divergence, $\nabla \cdot \bu$, which is factored out of the sensible enthalpy transport equation, i.e.,
\be
\label{eqn_new_div}
\nabla\cdot\mathbf{u} = \frac{1}{\rho h_{\rm s}} \left[ \frac{\mbox{D}}{\mbox{D} t}(\bar{p}-\rho h_{\rm s}) + \dot{q}^{\prime\prime\prime} + \nabla\cdot(k \nabla T) - \nabla\cdot\sum_\alpha h_{s,\alpha} \mathbf{J}_\alpha - \nabla\cdot\dot{\mathbf{q}}_r^{\prime\prime} + \dot{q}_b^{\prime\prime\prime} \right] \,\mbox{.}
@@ -4448,7 +4448,7 @@ \subsection{Thermophoretic Deposition}
Using the equation for the thermophoretic velocity, $u_{\rm th}$, the thermophoretic velocities for the gas cells adjacent to the hot and cold walls are respectively $2.25 \times 10^{-4}$~m/s and $2.15 \times 10^{-4}$~m/s. Adjacent to the cold wall, $u_{\rm th}$ is the rate at which the aerosol deposits onto the wall. Over the simulation time of 2~s, the soot will move $4.29 \times 10^{-4}$~m which is 42.9~\% of the cell size. That fraction of the aerosol in the cell will deposit which is $5.05 \times 10^{-9}$~\unit{kg/m^2}. Adjacent to the hot wall, $u_{\rm th}$ is the rate at which the aerosol leaves the cell. Over the simulation time of 2~s, the soot will move $4.49 \times 10^{-4}$~m which is 44.9~\% of the cell size. One minus that fraction of the original aerosol density in the cell will remain which is $4.98 \times 10^{-6}$~\unit{kg/m^3}.
-The thermophorertic velocity is given by
+The thermophoretic velocity is given by
\be
u_{\rm th} = \frac{K_{\rm th} \nu}{T_{\rm g}} \; \frac{\d T}{\d x}
\ee
@@ -4518,7 +4518,7 @@ \subsection{Agglomeration}
\label{fig:agglomeration}
\end{figure}
-In the second case three pairs of small (3~mm by 3~mm) vents are placed on opposite corners of the the walls, floor, and ceiling of the box. Each pair is connected by an HVAC duct that blows air at 1~m/s at the face of the vents. The average dissipation rate in the box is 0.0204~m$^2$/s$^3$. Using the average dissipation rate, the agglomeration rate is computed and the resulting mass fractions are compared against the volume averaged mass fractions computed by FDS.
+In the second case three pairs of small (3~mm by 3~mm) vents are placed on opposite corners of the walls, floor, and ceiling of the box. Each pair is connected by an HVAC duct that blows air at 1~m/s at the face of the vents. The average dissipation rate in the box is 0.0204~m$^2$/s$^3$. Using the average dissipation rate, the agglomeration rate is computed and the resulting mass fractions are compared against the volume averaged mass fractions computed by FDS.
\begin{figure}[ht]
\centering
@@ -4756,7 +4756,7 @@ \section{Convective Cooling}
\section{Simple Thermocouple Model}
\label{thermocouples}
-This example tests the simple thermocouple model in FDS. It consists of a box whose walls and gas temperatures are fixed at 500~\unit{\degreeCelsius}. Inside the box are three thermocouples with bead diameters of 1~mm, 2~mm, and 3~mm. Also included in the box are three ``targets'' -- small solid objects whose surfaces are assumed to be composed of small spheres of the same diameter as the thermocouples. Figure~\ref{thermocouples_fig} compares the temperature rise of the objects. The thermocouple model is not compared with an analytical solutions. This is simply a comparison of the thermally thin thermocouple calculation with the thermally thick ``target'' calculation. Small differences in temperature are due to slightly different flow conditions in different regions of the box and numerical error due to node spacing and time step size.
+This example tests the simple thermocouple model in FDS. It consists of a box whose walls and gas temperatures are fixed at 500~\unit{\degreeCelsius}. Inside the box are three thermocouples with bead diameters of 1~mm, 2~mm, and 3~mm. Also included in the box are three ``targets'' -- small solid objects whose surfaces are assumed to be composed of small spheres of the same diameter as the thermocouples. Figure~\ref{thermocouples_fig} compares the temperature rise of the objects. The thermocouple model is not compared with a analytical solutions. This is simply a comparison of the thermally thin thermocouple calculation with the thermally thick ``target'' calculation. Small differences in temperature are due to slightly different flow conditions in different regions of the box and numerical error due to node spacing and time step size.
\begin{figure}[ht]
\centering
@@ -6999,7 +6999,7 @@ \subsection{Leak Pressure Exponent}
\ee
By default, $C_{\rm d}=1$, $n=0.5$ and $\Delta p_{\rm ref}=4$~Pa, meaning that the leak area will not change with pressure unless you specify an exponent other than 0.5.
-The first verification case involves three 1000~m$^3$ compartments that have 0.01~m$^2$ of leakage to the ambient. Each compartment is supplied with 0.16~m$^3$/s of inlet flow. The first compartment has the default values for the exponent and reference pressure, the second changes the exponent to 0.6, and the third third changes exponent and the reference pressure respectively to 0.6 and 10~Pa. The expected leakage velocities for these conditions are 160~m/s, 11.8~m/s, and 12.8~m/s. Note in the left plot of Fig.~\ref{leak_exponent_fig} that the velocities are negative because the FDS output for the leakage velocity is from the lower numbered pressure zone (in this case ambient) to the higher number (inside the compartment). Negative velocity indicates flow from inside to outside as expected.
+The first verification case involves three 1000~m$^3$ compartments that have 0.01~m$^2$ of leakage to the ambient. Each compartment is supplied with 0.16~m$^3$/s of inlet flow. The first compartment has the default values for the exponent and reference pressure, the second changes the exponent to 0.6, and the third changes exponent and the reference pressure respectively to 0.6 and 10~Pa. The expected leakage velocities for these conditions are 160~m/s, 11.8~m/s, and 12.8~m/s. Note in the left plot of Fig.~\ref{leak_exponent_fig} that the velocities are negative because the FDS output for the leakage velocity is from the lower numbered pressure zone (in this case ambient) to the higher number (inside the compartment). Negative velocity indicates flow from inside to outside as expected.
The second case involves a steel e nclosure with four localized leaks, two near the bottom and two near the top. The air flow into the compartment is ramped up slowly, and the right hand plot of Fig.~\ref{leak_exponent_fig} shows the ideal and predicted relationship between the volume flow and compartment pressure. In this case, $C_{\rm d}=0.61$, $n=0.6$, $\Delta p_{\rm ref}=1$~Pa, and $A_{\rm L,ref}=0.18$ at each of the four ``cracks.''
@@ -7238,7 +7238,7 @@ \subsection{Elliptical Fire Spread}
\label{fig:level_set_ellipse_error}
\end{figure}
-\subsection{Custom Wind Fuction}
+\subsection{Custom Wind Function}
\label{LS_wind_ramp}
The level set model determines a wind-aided head fire spread rate based on the function
@@ -7529,7 +7529,7 @@ \subsection{Adding Texture Maps with Different Methods}
N_LEVELS=3,SPHERE_RADIUS=0.25,SPHERE_ORIGIN=0.75,0.5,0.5,
TEXTURE_ORIGIN=0.75,0.5,0.5,TEXTURE_MAPPING='SPHERICAL' /
\end{lstlisting}
-The \ct{TEXTURE_MAP}\ keyword is used to specify the name of the image file applied to the geometric object. The \ct{SPHERICAL}\ setting indicates that that the texture map image is applied to the object using spherical coordinates.
+The \ct{TEXTURE_MAP}\ keyword is used to specify the name of the image file applied to the geometric object. The \ct{SPHERICAL}\ setting indicates that the texture map image is applied to the object using spherical coordinates.
\begin{figure}[!ht]
@@ -7865,7 +7865,7 @@ \subsection{RMS, Co-Variance, and Cross-Correlation}
FDS can output the root mean square (RMS), co-variance, and cross-correlation for both point and line \ct{DEVC} outputs. To test these outputs a 1 m$^3$ box with open sides and a 10 cm grid size is defined with two inlet vents centered on adjacent faces. This results in two orthogonal flow streams that collide at the center of the box and exit diagonally. Within the diagonal portion of the flow, are placed point measurements for the FDS outputs of the u-velocity RMS, the u-velocity/w-velocity co-variance, and the u-velocity/w-velocity cross-correlation.
-Computation of the these quantities by their typical statistical definition would require having the entire time history for the velocities. This is obviously not possible during runtime. Instead FDS computes the values using logarithmic averaging and a user-defined averaging window. One would expect, once steady-state conditions are reached, that the FDS predicted values should approach the analytic values. Results are shown in Fig.~\ref{rms_cov_corr_plots}. In each figure the red line represents the value computed using the entire time history after steady-state is reached. As seen, the FDS predicted values approach the analytic values.
+Computation of these quantities by their typical statistical definition would require having the entire time history for the velocities. This is obviously not possible during runtime. Instead FDS computes the values using logarithmic averaging and a user-defined averaging window. One would expect, once steady-state conditions are reached, that the FDS predicted values should approach the analytic values. Results are shown in Fig.~\ref{rms_cov_corr_plots}. In each figure the red line represents the value computed using the entire time history after steady-state is reached. As seen, the FDS predicted values approach the analytic values.
\begin{figure}[p]
\centering
diff --git a/Source/ccib.f90 b/Source/ccib.f90
index 140d51d5246..e7088f5adc4 100644
--- a/Source/ccib.f90
+++ b/Source/ccib.f90
@@ -3712,7 +3712,7 @@ SUBROUTINE MESH_CC_EXCHANGE(CODE)
REAL(EB), POINTER, DIMENSION(:,:,:) :: UP,UP2,VP,VP2,WP,WP2
LOGICAL, SAVE :: INITIALIZE_CC_SCALARS_FORC=.TRUE.
-INTEGER :: EP,INPE,INT_NPE_LO,INT_NPE_HI,VIND,ICELL,IEDGE,IFEP,IW,IIO,JJO,KKO
+INTEGER :: EP,INPE,INT_NPE_LO,INT_NPE_HI,VIND,ICELL,IEDGE,IFEP
REAL(EB) :: TNOW,TINTP
! For solid phase only return. All variables exchanged currently here are gas-phase.
@@ -4513,35 +4513,22 @@ SUBROUTINE MESH_CC_EXCHANGE(CODE)
IF (CODE==1 .AND. M2%NICC_R(1)>0) THEN
NQT2 = 4+N_TOTAL_SCALARS
LL = 0
- ! Copy-cut cell scalar quantities from MESHES(NOM)%OMESH(NM) cells to MESHES(NM) (i.e. other mesh) cut-cells:
- ! Use External wall cell loop:
- EXTERNAL_WALL_LOOP_1 : DO IW=1,M%N_EXTERNAL_WALL_CELLS
- WC=>M%WALL(IW)
- EWC=>M%EXTERNAL_WALL(IW)
- BC=>M%BOUNDARY_COORD(WC%BC_INDEX)
- IF (.NOT.(WC%BOUNDARY_TYPE == INTERPOLATED_BOUNDARY)) CYCLE EXTERNAL_WALL_LOOP_1
- IF (EWC%NOM/=NM) CYCLE EXTERNAL_WALL_LOOP_1
- IF (M%CCVAR(BC%II,BC%JJ,BC%KK,CC_CGSC) /= CC_CUTCFE) CYCLE EXTERNAL_WALL_LOOP_1
- DO KKO=EWC%KKO_MIN,EWC%KKO_MAX
- DO JJO=EWC%JJO_MIN,EWC%JJO_MAX
- DO IIO=EWC%IIO_MIN,EWC%IIO_MAX
- ICC = MESHES(NM)%CCVAR(IIO,JJO,KKO,CC_IDCC)
- IF (ICC > 0) THEN
- DO JCC=1,MESHES(NM)%CUT_CELL(ICC)%NCELL
- LL = LL + 1
- MESHES(NM)%CUT_CELL(ICC)%RHOS(JCC) = M2%REAL_RECV_PKG11(NQT2*(LL-1)+1)
- MESHES(NM)%CUT_CELL(ICC)%TMP(JCC) = M2%REAL_RECV_PKG11(NQT2*(LL-1)+2)
- MESHES(NM)%CUT_CELL(ICC)%RSUM(JCC) = M2%REAL_RECV_PKG11(NQT2*(LL-1)+3)
- MESHES(NM)%CUT_CELL(ICC)%D(JCC) = M2%REAL_RECV_PKG11(NQT2*(LL-1)+4)
- DO NN=1,N_TOTAL_SCALARS
- MESHES(NM)%CUT_CELL(ICC)%ZZS(NN,JCC) = M2%REAL_RECV_PKG11(NQT2*(LL-1)+4+NN)
- ENDDO
- ENDDO
- ENDIF
- ENDDO
+ ! Unpack from sender-validated ICC_UNKZ_CC_R list (avoids stale CCVAR for ghost cut-cells
+ ! rejected by the sender's validation pass).
+ DO ICC1=1,M2%NICC_R(1)
+ ICC = M2%ICC_UNKZ_CC_R(ICC1)
+ IF (ICC < 1) CYCLE
+ DO JCC=1,MESHES(NM)%CUT_CELL(ICC)%NCELL
+ LL = LL + 1
+ MESHES(NM)%CUT_CELL(ICC)%RHOS(JCC) = M2%REAL_RECV_PKG11(NQT2*(LL-1)+1)
+ MESHES(NM)%CUT_CELL(ICC)%TMP(JCC) = M2%REAL_RECV_PKG11(NQT2*(LL-1)+2)
+ MESHES(NM)%CUT_CELL(ICC)%RSUM(JCC) = M2%REAL_RECV_PKG11(NQT2*(LL-1)+3)
+ MESHES(NM)%CUT_CELL(ICC)%D(JCC) = M2%REAL_RECV_PKG11(NQT2*(LL-1)+4)
+ DO NN=1,N_TOTAL_SCALARS
+ MESHES(NM)%CUT_CELL(ICC)%ZZS(NN,JCC) = M2%REAL_RECV_PKG11(NQT2*(LL-1)+4+NN)
ENDDO
ENDDO
- ENDDO EXTERNAL_WALL_LOOP_1
+ ENDDO
ENDIF
IF((CODE==1 .OR. CODE==4) .AND. M2%NFCC_R(2)>0) THEN
@@ -4636,36 +4623,22 @@ SUBROUTINE MESH_CC_EXCHANGE(CODE)
IF (CODE==4 .AND. M2%NICC_R(1)>0) THEN
NQT2 = 4+N_TOTAL_SCALARS
LL = 0
- ! Copy-cut cell scalar quantities from MESHES(NOM)%OMESH(NM) cells to MESHES(NM) (i.e. other mesh) cut-cells:
- ! Use External wall cell loop:
- EXTERNAL_WALL_LOOP_2 : DO IW=1,M%N_EXTERNAL_WALL_CELLS
- WC=>M%WALL(IW)
- IF (.NOT.(WC%BOUNDARY_TYPE == INTERPOLATED_BOUNDARY)) CYCLE EXTERNAL_WALL_LOOP_2
- BC=>M%BOUNDARY_COORD(WC%BC_INDEX)
- EWC=>M%EXTERNAL_WALL(IW)
- IF (EWC%NOM/=NM) CYCLE EXTERNAL_WALL_LOOP_2
- IF (M%CCVAR(BC%II,BC%JJ,BC%KK,CC_CGSC) /= CC_CUTCFE) &
- CYCLE EXTERNAL_WALL_LOOP_2
- DO KKO=EWC%KKO_MIN,EWC%KKO_MAX
- DO JJO=EWC%JJO_MIN,EWC%JJO_MAX
- DO IIO=EWC%IIO_MIN,EWC%IIO_MAX
- ICC = MESHES(NM)%CCVAR(IIO,JJO,KKO,CC_IDCC)
- IF (ICC > 0) THEN
- DO JCC=1,MESHES(NM)%CUT_CELL(ICC)%NCELL
- LL = LL + 1
- MESHES(NM)%CUT_CELL(ICC)%RHO(JCC) = M2%REAL_RECV_PKG11(NQT2*(LL-1)+1)
- MESHES(NM)%CUT_CELL(ICC)%TMP(JCC) = M2%REAL_RECV_PKG11(NQT2*(LL-1)+2)
- MESHES(NM)%CUT_CELL(ICC)%RSUM(JCC) = M2%REAL_RECV_PKG11(NQT2*(LL-1)+3)
- MESHES(NM)%CUT_CELL(ICC)%DS(JCC) = M2%REAL_RECV_PKG11(NQT2*(LL-1)+4)
- DO NN=1,N_TOTAL_SCALARS
- MESHES(NM)%CUT_CELL(ICC)%ZZ(NN,JCC) = M2%REAL_RECV_PKG11(NQT2*(LL-1)+4+NN)
- ENDDO
- ENDDO
- ENDIF
- ENDDO
+ ! Unpack from sender-validated ICC_UNKZ_CC_R list (avoids stale CCVAR for ghost cut-cells
+ ! rejected by the sender's validation pass).
+ DO ICC1=1,M2%NICC_R(1)
+ ICC = M2%ICC_UNKZ_CC_R(ICC1)
+ IF (ICC < 1) CYCLE
+ DO JCC=1,MESHES(NM)%CUT_CELL(ICC)%NCELL
+ LL = LL + 1
+ MESHES(NM)%CUT_CELL(ICC)%RHO(JCC) = M2%REAL_RECV_PKG11(NQT2*(LL-1)+1)
+ MESHES(NM)%CUT_CELL(ICC)%TMP(JCC) = M2%REAL_RECV_PKG11(NQT2*(LL-1)+2)
+ MESHES(NM)%CUT_CELL(ICC)%RSUM(JCC) = M2%REAL_RECV_PKG11(NQT2*(LL-1)+3)
+ MESHES(NM)%CUT_CELL(ICC)%DS(JCC) = M2%REAL_RECV_PKG11(NQT2*(LL-1)+4)
+ DO NN=1,N_TOTAL_SCALARS
+ MESHES(NM)%CUT_CELL(ICC)%ZZ(NN,JCC) = M2%REAL_RECV_PKG11(NQT2*(LL-1)+4+NN)
ENDDO
ENDDO
- ENDDO EXTERNAL_WALL_LOOP_2
+ ENDDO
ENDIF
IF (CODE==6 .AND. M2%NFCC_R(1)>0) THEN
@@ -4780,13 +4753,12 @@ SUBROUTINE MESH_CC_EXCHANGE(CODE)
SUBROUTINE FILL_GCCUTCELL_SPECIES
-REAL(EB):: PRFCT, VCELL, RHO_CC, TMP_CC, RSUM_CC, D_CC, ZZ_CC(1:N_TOTAL_SCALARS), VOL
-TYPE (OMESH_TYPE), POINTER :: OM
+REAL(EB):: VCELL, RHO_CC, TMP_CC, RSUM_CC, D_CC, ZZ_CC(1:N_TOTAL_SCALARS), VOL
TYPE(CC_CUTCELL_TYPE), POINTER :: OCC
-INTEGER :: NM,NOM,NN,ICC,JCC,IW,IIO,JJO,KKO
+INTEGER :: NM,NOM,NN,ICC,ICC1,JCC,IW,IIO,JJO,KKO
+LOGICAL :: VALID_SOURCE_CC
! Here inject OMESH cut-cell info obtained in MESH_CC_EXCHANGE into ghost-cell cc containers:
-PRFCT = 0._EB; IF (PREDICTOR) PRFCT = 1._EB
MESH_LOOP : DO NM=LOWER_MESH_INDEX,UPPER_MESH_INDEX
CALL POINT_TO_MESH(NM)
EXTERNAL_WALL_LOOP : DO IW=1,N_EXTERNAL_WALL_CELLS
@@ -4797,34 +4769,61 @@ SUBROUTINE FILL_GCCUTCELL_SPECIES
IF (CCVAR(BC%II,BC%JJ,BC%KK,CC_CGSC) /= CC_CUTCFE) CYCLE EXTERNAL_WALL_LOOP
! Do volume average to a cell container for ghost cell II,JJ,KK:
NOM = EWC%NOM
- OM => MESHES(NM)%OMESH(NOM)
RHO_CC=0._EB; TMP_CC=0._EB; RSUM_CC=0._EB; D_CC=0._EB; ZZ_CC(1:N_TOTAL_SCALARS)=0._EB; VOL=0._EB
DO KKO=EWC%KKO_MIN,EWC%KKO_MAX
DO JJO=EWC%JJO_MIN,EWC%JJO_MAX
DO IIO=EWC%IIO_MIN,EWC%IIO_MAX
IF (MESHES(NOM)%CELL(MESHES(NOM)%CELL_INDEX(IIO,JJO,KKO))%SOLID) CYCLE
ICC = MESHES(NOM)%CCVAR(IIO,JJO,KKO,CC_IDCC)
- IF (ICC > 0) THEN ! Cut-cells:
+ ! For remote NOM, only accept the cut-cell entry if it appears in the sender-validated
+ ! ICC_UNKZ_CC_R list. Otherwise the OMESH cut-cell scalars haven't been filled by
+ ! MESH_CC_EXCHANGE and reading them would mix in stale/zero state.
+ VALID_SOURCE_CC = ICC > 0 .AND. (PROCESS(NOM)==MY_RANK .OR. NM==NOM)
+ IF (ICC > 0 .AND. .NOT.VALID_SOURCE_CC .AND. ALLOCATED(MESHES(NM)%OMESH(NOM)%ICC_UNKZ_CC_R)) THEN
+ DO ICC1=1,MESHES(NM)%OMESH(NOM)%NICC_R(1)
+ IF (MESHES(NM)%OMESH(NOM)%ICC_UNKZ_CC_R(ICC1)==ICC) THEN
+ VALID_SOURCE_CC = .TRUE.
+ EXIT
+ ENDIF
+ ENDDO
+ ENDIF
+ IF (VALID_SOURCE_CC) THEN ! Cut-cells:
OCC => MESHES(NOM)%CUT_CELL(ICC)
DO JCC=1,OCC%NCELL
VCELL = OCC%VOLUME(JCC)
- RHO_CC = RHO_CC + (PRFCT *OCC%RHOS(JCC) + (1._EB-PRFCT)*OCC%RHO(JCC))*VCELL
TMP_CC = TMP_CC + OCC%TMP(JCC)*VCELL
RSUM_CC = RSUM_CC + OCC%RSUM(JCC)*VCELL
- D_CC = D_CC + (PRFCT *OCC%D(JCC) + (1._EB-PRFCT)*OCC%DS(JCC))*VCELL
- DO NN=1,N_TOTAL_SCALARS
- ZZ_CC(NN) = ZZ_CC(NN) + (PRFCT *OCC%ZZS(NN,JCC) + (1._EB-PRFCT)*OCC%ZZ(NN,JCC))*VCELL
- ENDDO
+ IF (PREDICTOR) THEN
+ RHO_CC = RHO_CC + OCC%RHOS(JCC)*VCELL
+ D_CC = D_CC + OCC%D(JCC)*VCELL
+ DO NN=1,N_TOTAL_SCALARS
+ ZZ_CC(NN) = ZZ_CC(NN) + OCC%ZZS(NN,JCC)*VCELL
+ ENDDO
+ ELSE
+ RHO_CC = RHO_CC + OCC%RHO(JCC)*VCELL
+ D_CC = D_CC + OCC%DS(JCC)*VCELL
+ DO NN=1,N_TOTAL_SCALARS
+ ZZ_CC(NN) = ZZ_CC(NN) + OCC%ZZ(NN,JCC)*VCELL
+ ENDDO
+ ENDIF
VOL = VOL + VCELL
ENDDO
- ELSEIF(MESHES(NOM)%CCVAR(IIO,JJO,KKO,CC_CGSC) == CC_GASPHASE) THEN ! Regular cell:
+ ELSEIF(MESHES(NOM)%CCVAR(IIO,JJO,KKO,CC_CGSC) == CC_GASPHASE .OR. ICC > 0) THEN ! Regular cell or unvalidated remote cut-cell.
VCELL = MESHES(NOM)%DX(IIO)*MESHES(NOM)%DY(JJO)*MESHES(NOM)%DZ(KKO)
- RHO_CC = RHO_CC + (PRFCT*RHOS(BC%II,BC%JJ,BC%KK) + (1._EB-PRFCT)*RHO(BC%II,BC%JJ,BC%KK))*VCELL
TMP_CC = TMP_CC + TMP(BC%II,BC%JJ,BC%KK)*VCELL
- D_CC = D_CC + (PRFCT*D(BC%II,BC%JJ,BC%KK) + (1._EB-PRFCT)*DS(BC%II,BC%JJ,BC%KK))*VCELL
- DO NN=1,N_TOTAL_SCALARS
- ZZ_CC(NN)=ZZ_CC(NN)+(PRFCT*ZZS(BC%II,BC%JJ,BC%KK,NN)+(1._EB-PRFCT)*ZZ(BC%II,BC%JJ,BC%KK,NN))*VCELL
- ENDDO
+ IF (PREDICTOR) THEN
+ RHO_CC = RHO_CC + RHOS(BC%II,BC%JJ,BC%KK)*VCELL
+ D_CC = D_CC + D(BC%II,BC%JJ,BC%KK)*VCELL
+ DO NN=1,N_TOTAL_SCALARS
+ ZZ_CC(NN) = ZZ_CC(NN) + ZZS(BC%II,BC%JJ,BC%KK,NN)*VCELL
+ ENDDO
+ ELSE
+ RHO_CC = RHO_CC + RHO(BC%II,BC%JJ,BC%KK)*VCELL
+ D_CC = D_CC + DS(BC%II,BC%JJ,BC%KK)*VCELL
+ DO NN=1,N_TOTAL_SCALARS
+ ZZ_CC(NN) = ZZ_CC(NN) + ZZ(BC%II,BC%JJ,BC%KK,NN)*VCELL
+ ENDDO
+ ENDIF
VOL = VOL + VCELL
ENDIF
ENDDO
@@ -19338,7 +19337,7 @@ SUBROUTINE FILL_UNKZ_GUARDCELLS
#else
TYPE (MPI_REQUEST), ALLOCATABLE, DIMENSION(:) :: REQ0,REQ0DUM
#endif
-INTEGER :: N_REQ0, NICC_R, ICC, ICC1, NCELL, JCC, NICF_R, ICF
+INTEGER :: N_REQ0, NICC_R, ICC, ICC1, NCELL, JCC, NICF_R, ICF, NICC_VALID, NUNKZ_VALID
INTEGER, ALLOCATABLE, DIMENSION(:) :: NCC_SV
INTEGER :: ISTR,IEND,JSTR,JEND,KSTR,KEND,IIO,JJO,KKO,IOR,IW,N_INT,IIOF,JJOF,KKOF,X1AXIS
LOGICAL :: ALL_FLG
@@ -19582,48 +19581,118 @@ SUBROUTINE FILL_UNKZ_GUARDCELLS
ELSE
M2 => MESHES(NOM)%OMESH(NM)
M2%ICC_UNKZ_CC_S(1:3*M2%NICC_S(1)) = M3%ICC_UNKZ_CC_R(1:3*M3%NICC_R(1))
- ! Here write the ICC into ICC_UNKZ_CC_S for OMESH NM:
- M => MESHES(NOM); DO ICC1=1,M2%NICC_S(1)
- IIO=M2%ICC_UNKZ_CC_S(3*ICC1-2)
- JJO=M2%ICC_UNKZ_CC_S(3*ICC1-1)
- KKO=M2%ICC_UNKZ_CC_S(3*ICC1 )
- M2%ICC_UNKZ_CC_S(ICC1) = M%CCVAR(IIO,JJO,KKO,CC_IDCC)
- ENDDO
- ALLOCATE(INT1D(1:M2%NICC_S(1))); INT1D(1:M2%NICC_S(1)) = M2%ICC_UNKZ_CC_S(1:M2%NICC_S(1))
- CALL MOVE_ALLOC(FROM=INT1D,TO=M2%ICC_UNKZ_CC_S)
ENDIF
ENDDO
ENDDO
IF ((N_REQ0>0) .AND. (N_MPI_PROCESSES>1)) CALL MPI_WAITALL(N_REQ0,REQ0(1:N_REQ0),MPI_STATUSES_IGNORE,IERR)
+DO NM=LOWER_MESH_INDEX,UPPER_MESH_INDEX
+ M => MESHES(NM)
+ DO NOM=1,NMESHES
+ M3 => MESHES(NM)%OMESH(NOM)
+ IF (.NOT.ALLOCATED(M3%ICC_UNKZ_CC_S)) CYCLE
+ NICC_VALID = 0
+ NUNKZ_VALID = 0
+ DO ICC1=1,M3%NICC_S(1)
+ IIO = M3%ICC_UNKZ_CC_S(3*ICC1-2)
+ JJO = M3%ICC_UNKZ_CC_S(3*ICC1-1)
+ KKO = M3%ICC_UNKZ_CC_S(3*ICC1 )
+ ICC = M%CCVAR(IIO,JJO,KKO,CC_IDCC)
+ IF (ICC<1 .OR. M%CCVAR(IIO,JJO,KKO,CC_CGSC)/=CC_CUTCFE) CYCLE
+ NICC_VALID = NICC_VALID + 1
+ M3%ICC_UNKZ_CC_S(3*NICC_VALID-2:3*NICC_VALID) = (/ IIO, JJO, KKO /)
+ NUNKZ_VALID = NUNKZ_VALID + M%CUT_CELL(ICC)%NCELL
+ ENDDO
+ M3%NICC_S(1) = NICC_VALID
+ M3%NICC_S(2) = NUNKZ_VALID
+ ENDDO
+ENDDO
+
+! Exchange the sender-validated cut-cell counts back to the receivers.
+N_REQ0 = 0
DO NM=1,NMESHES
DO NOM=LOWER_MESH_INDEX,UPPER_MESH_INDEX
M2 => MESHES(NOM)%OMESH(NM)
- IF (N_MPI_PROCESSES>1 .AND. NM/=NOM .AND. PROCESS(NM)/=MY_RANK .AND. M2%NICC_S(1)>0) THEN
- ! Here write the ICC into ICC_UNKZ_CC_S for OMESH NM:
- M => MESHES(NOM); DO ICC1=1,M2%NICC_S(1)
- IIO=M2%ICC_UNKZ_CC_S(3*ICC1-2)
- JJO=M2%ICC_UNKZ_CC_S(3*ICC1-1)
- KKO=M2%ICC_UNKZ_CC_S(3*ICC1 )
- M2%ICC_UNKZ_CC_S(ICC1) = M%CCVAR(IIO,JJO,KKO,CC_IDCC)
- ENDDO
- ALLOCATE(INT1D(1:M2%NICC_S(1))); INT1D(1:M2%NICC_S(1)) = M2%ICC_UNKZ_CC_S(1:M2%NICC_S(1))
- CALL MOVE_ALLOC(FROM=INT1D,TO=M2%ICC_UNKZ_CC_S)
+ IF (N_MPI_PROCESSES>1 .AND. NM/=NOM .AND. PROCESS(NM)/=MY_RANK .AND. M2%NICC_R(1)>0) THEN
+ N_REQ0 = N_REQ0 + 1; CALL CHECK_REQ0_SIZE
+ CALL MPI_IRECV(M2%NICC_R(1),2,MPI_INTEGER,PROCESS(NM),NM,MPI_COMM_WORLD,REQ0(N_REQ0),IERR)
ENDIF
ENDDO
ENDDO
+DO NM=1,NMESHES
+ CALL MPI_BARRIER(MPI_COMM_WORLD,IERR)
+ IF (PROCESS(NM)/=MY_RANK) CYCLE
+ DO NOM=1,NMESHES
+ IF (NM/=NOM .AND. .NOT.MESHES(NM)%CONNECTED_MESH(NOM)) CYCLE
+ M3 => MESHES(NM)%OMESH(NOM)
+ IF (.NOT.ALLOCATED(M3%ICC_UNKZ_CC_S)) CYCLE
+ IF (N_MPI_PROCESSES>1 .AND. NM/=NOM .AND. PROCESS(NOM)/=MY_RANK) THEN
+ N_REQ0 = N_REQ0 + 1; CALL CHECK_REQ0_SIZE
+ CALL MPI_ISEND(M3%NICC_S(1),2,MPI_INTEGER,PROCESS(NOM),NM,MPI_COMM_WORLD,REQ0(N_REQ0),IERR)
+ ELSE
+ IF(.NOT. ALLOCATED(MESHES(NOM)%OMESH)) CYCLE
+ M2 => MESHES(NOM)%OMESH(NM)
+ M2%NICC_R(1:2) = M3%NICC_S(1:2)
+ ENDIF
+ ENDDO
+ENDDO
+IF ((N_REQ0>0) .AND. (N_MPI_PROCESSES>1)) CALL MPI_WAITALL(N_REQ0,REQ0(1:N_REQ0),MPI_STATUSES_IGNORE,IERR)
+
+! Exchange the compacted cut-cell coordinate list back to the receivers.
+N_REQ0 = 0
+DO NM=1,NMESHES
+ DO NOM=LOWER_MESH_INDEX,UPPER_MESH_INDEX
+ M2 => MESHES(NOM)%OMESH(NM)
+ IF (N_MPI_PROCESSES>1 .AND. NM/=NOM .AND. PROCESS(NM)/=MY_RANK .AND. ALLOCATED(M2%ICC_UNKZ_CC_R)) THEN
+ N_REQ0 = N_REQ0 + 1; CALL CHECK_REQ0_SIZE
+ CALL MPI_IRECV(M2%ICC_UNKZ_CC_R(1),3*M2%NICC_R(1),MPI_INTEGER,PROCESS(NM),NM,MPI_COMM_WORLD,REQ0(N_REQ0),IERR)
+ ENDIF
+ ENDDO
+ENDDO
+DO NM=1,NMESHES
+ CALL MPI_BARRIER(MPI_COMM_WORLD,IERR)
+ IF (PROCESS(NM)/=MY_RANK) CYCLE
+ DO NOM=1,NMESHES
+ IF (NM/=NOM .AND. .NOT.MESHES(NM)%CONNECTED_MESH(NOM)) CYCLE
+ M3 => MESHES(NM)%OMESH(NOM)
+ IF (.NOT.ALLOCATED(M3%ICC_UNKZ_CC_S)) CYCLE
+ IF (N_MPI_PROCESSES>1 .AND. NM/=NOM .AND. PROCESS(NOM)/=MY_RANK) THEN
+ N_REQ0 = N_REQ0 + 1; CALL CHECK_REQ0_SIZE
+ CALL MPI_ISEND(M3%ICC_UNKZ_CC_S(1),3*M3%NICC_S(1),MPI_INTEGER,PROCESS(NOM),NM,MPI_COMM_WORLD,REQ0(N_REQ0),IERR)
+ ELSE
+ IF(.NOT. ALLOCATED(MESHES(NOM)%OMESH)) CYCLE
+ M2 => MESHES(NOM)%OMESH(NM)
+ IF (M2%NICC_R(1)>0) M2%ICC_UNKZ_CC_R(1:3*M2%NICC_R(1)) = M3%ICC_UNKZ_CC_S(1:3*M3%NICC_S(1))
+ ENDIF
+ ENDDO
+ENDDO
+IF ((N_REQ0>0) .AND. (N_MPI_PROCESSES>1)) CALL MPI_WAITALL(N_REQ0,REQ0(1:N_REQ0),MPI_STATUSES_IGNORE,IERR)
+
+! Convert compacted coordinate lists to local ICC indices on sender and receiver.
+DO NM=LOWER_MESH_INDEX,UPPER_MESH_INDEX
+ M => MESHES(NM)
+ DO NOM=1,NMESHES
+ M3 => MESHES(NM)%OMESH(NOM)
+ IF (M3%NICC_S(1)<1) CYCLE
+ DO ICC1=1,M3%NICC_S(1)
+ IIO = M3%ICC_UNKZ_CC_S(3*ICC1-2)
+ JJO = M3%ICC_UNKZ_CC_S(3*ICC1-1)
+ KKO = M3%ICC_UNKZ_CC_S(3*ICC1 )
+ M3%ICC_UNKZ_CC_S(ICC1) = M%CCVAR(IIO,JJO,KKO,CC_IDCC)
+ ENDDO
+ ENDDO
+ENDDO
DO NM=LOWER_MESH_INDEX,UPPER_MESH_INDEX
DO NOM=1,NMESHES
M3 => MESHES(NM)%OMESH(NOM)
IF (M3%NICC_R(1)<1) CYCLE
- M => MESHES(NOM); DO ICC1=1,M3%NICC_R(1)
- IIO=M3%ICC_UNKZ_CC_R(3*ICC1-2)
- JJO=M3%ICC_UNKZ_CC_R(3*ICC1-1)
- KKO=M3%ICC_UNKZ_CC_R(3*ICC1 )
+ M => MESHES(NOM)
+ DO ICC1=1,M3%NICC_R(1)
+ IIO = M3%ICC_UNKZ_CC_R(3*ICC1-2)
+ JJO = M3%ICC_UNKZ_CC_R(3*ICC1-1)
+ KKO = M3%ICC_UNKZ_CC_R(3*ICC1 )
M3%ICC_UNKZ_CC_R(ICC1) = M%CCVAR(IIO,JJO,KKO,CC_IDCC)
ENDDO
- ALLOCATE(INT1D(1:M3%NICC_R(1))); INT1D(1:M3%NICC_R(1)) = M3%ICC_UNKZ_CC_R(1:M3%NICC_R(1))
- CALL MOVE_ALLOC(FROM=INT1D,TO=M3%ICC_UNKZ_CC_R)
ENDDO
ENDDO
@@ -19802,49 +19871,21 @@ SUBROUTINE FILL_UNKZ_GUARDCELLS
NCC_SV(:)=0
CALL POINT_TO_MESH(NM)
! Loop over cut-cells:
- EXTERNAL_WALL_LOOP_2 : DO IW=1,N_EXTERNAL_WALL_CELLS
- WC=>WALL(IW)
- EWC=>EXTERNAL_WALL(IW)
- BC=>BOUNDARY_COORD(WC%BC_INDEX)
- IF (.NOT.(WC%BOUNDARY_TYPE == INTERPOLATED_BOUNDARY .OR. &
- WC%BOUNDARY_TYPE == MIRROR_BOUNDARY) ) CYCLE EXTERNAL_WALL_LOOP_2
- IF ( WC%BOUNDARY_TYPE==INTERPOLATED_BOUNDARY ) THEN
- IF (CCVAR(BC%II,BC%JJ,BC%KK,CC_CGSC) /= CC_CUTCFE) CYCLE EXTERNAL_WALL_LOOP_2
- NOM = EWC%NOM
- DO KKO=EWC%KKO_MIN,EWC%KKO_MAX
- DO JJO=EWC%JJO_MIN,EWC%JJO_MAX
- DO IIO=EWC%IIO_MIN,EWC%IIO_MAX
- ICC = MESHES(NOM)%CCVAR(IIO,JJO,KKO,CC_IDCC)
- IF (ICC > 0) THEN
- DO JCC=1,MESHES(NOM)%CUT_CELL(ICC)%NCELL
- NCC_SV(NOM)=NCC_SV(NOM)+1
- MESHES(NOM)%CUT_CELL(ICC)%UNKZ(JCC) = M%OMESH(NOM)%UNKZ_CC_R(NCC_SV(NOM))
- ENDDO
- ENDIF
- ENDDO
- ENDDO
+ DO NOM=1,NMESHES
+ M3 => M%OMESH(NOM)
+ IF (M3%NICC_R(1)<1) CYCLE
+ ! Walk the sender-validated ICC_UNKZ_CC_R list directly. This matches exactly the
+ ! ordering and count used by the sender to fill UNKZ_CC_R, eliminating any reliance
+ ! on local CCVAR for indexing into the buffer.
+ DO ICC1=1,M3%NICC_R(1)
+ ICC = M3%ICC_UNKZ_CC_R(ICC1)
+ IF (ICC < 1) CYCLE
+ DO JCC=1,MESHES(NOM)%CUT_CELL(ICC)%NCELL
+ NCC_SV(NOM)=NCC_SV(NOM)+1
+ MESHES(NOM)%CUT_CELL(ICC)%UNKZ(JCC) = M3%UNKZ_CC_R(NCC_SV(NOM))
ENDDO
- ELSEIF ( WC%BOUNDARY_TYPE==MIRROR_BOUNDARY ) THEN
- IIO = BC%IIG; JJO = BC%JJG; KKO = BC%KKG
- IF (CCVAR(BC%II,BC%JJ,BC%KK,CC_CGSC) /= CC_CUTCFE) CYCLE EXTERNAL_WALL_LOOP_2
- ! CYCLE if OBJECT face is in the Mirror Boundary, normal out into ghost-cell:
- SELECT CASE(BC%IOR)
- CASE( IAXIS); IF(FCVAR(IIO-1,JJO ,KKO ,CC_FGSC,IAXIS) == CC_SOLID) CYCLE EXTERNAL_WALL_LOOP_2
- CASE(-IAXIS); IF(FCVAR(IIO ,JJO ,KKO ,CC_FGSC,IAXIS) == CC_SOLID) CYCLE EXTERNAL_WALL_LOOP_2
- CASE( JAXIS); IF(FCVAR(IIO ,JJO-1,KKO ,CC_FGSC,JAXIS) == CC_SOLID) CYCLE EXTERNAL_WALL_LOOP_2
- CASE(-JAXIS); IF(FCVAR(IIO ,JJO ,KKO ,CC_FGSC,JAXIS) == CC_SOLID) CYCLE EXTERNAL_WALL_LOOP_2
- CASE( KAXIS); IF(FCVAR(IIO ,JJO ,KKO-1,CC_FGSC,KAXIS) == CC_SOLID) CYCLE EXTERNAL_WALL_LOOP_2
- CASE(-KAXIS); IF(FCVAR(IIO ,JJO ,KKO ,CC_FGSC,KAXIS) == CC_SOLID) CYCLE EXTERNAL_WALL_LOOP_2
- END SELECT
- NOM = NM; ICC = MESHES(NOM)%CCVAR(IIO,JJO,KKO,CC_IDCC)
- IF (ICC > 0) THEN
- DO JCC=1,MESHES(NOM)%CUT_CELL(ICC)%NCELL
- NCC_SV(NOM)=NCC_SV(NOM)+1
- MESHES(NOM)%CUT_CELL(ICC)%UNKZ(JCC) = M%OMESH(NOM)%UNKZ_CC_R(NCC_SV(NOM))
- ENDDO
- ENDIF
- ENDIF
- ENDDO EXTERNAL_WALL_LOOP_2
+ ENDDO
+ ENDDO
ENDDO
DEALLOCATE(NCC_SV)
@@ -22285,10 +22326,13 @@ SUBROUTINE NUMBER_UNKH_CUTCELLS(FLAG12,NM,IPZ,NUNKH_LC)
INTEGER :: ICC, JCC, I, J, K
FLAG12_COND : IF (FLAG12) THEN
- ! Initialize Cut-cell unknown numbers as undefined.
- DO ICC=1,MESHES(NM)%N_CUTCELL_MESH
- CUT_CELL(ICC)%UNKH(:) = CC_UNDEFINED
- ENDDO
+ ! Initialize once before the pressure-zone loop assigns per-zone cut-cell unknowns.
+ ! Reinitializing on each IPZ pass would erase unknowns assigned to earlier zones.
+ IF (IPZ==0) THEN
+ DO ICC=1,MESHES(NM)%N_CUTCELL_MESH
+ CUT_CELL(ICC)%UNKH(:) = CC_UNDEFINED
+ ENDDO
+ ENDIF
DO ICC=1,MESHES(NM)%N_CUTCELL_MESH
CC => CUT_CELL(ICC); I=CC%IJK(IAXIS); J=CC%IJK(JAXIS); K=CC%IJK(KAXIS); IF(CELL(CELL_INDEX(I,J,K))%SOLID) CYCLE
IF(ZONE_SOLVE(PRESSURE_ZONE(I,J,K))%CONNECTED_ZONE_PARENT/=IPZ ) CYCLE
diff --git a/Source/geom.f90 b/Source/geom.f90
index e660e6a9d44..3331bca3b61 100644
--- a/Source/geom.f90
+++ b/Source/geom.f90
@@ -766,7 +766,8 @@ SUBROUTINE SET_CUTCELLS_3D
LOGICAL, ALLOCATABLE, DIMENSION(:) :: CC_COMPUTE_MESH, CC_COMPUTE_MESH_AUX
REAL(EB), ALLOCATABLE, DIMENSION(:,:) :: GEOM_ZMAX_AUX
-INTEGER :: IW,II,JJ,IIF,JJF,KKF,IIOF,JJOF,KKOF,LOHIF,IOR,CT,NCFACE_CUTCELL,NFACE_CELL,AX,SIDE,ICC,JCC,ICFC,IFC
+INTEGER :: IW,II,JJ,IIF,JJF,KKF,IIOF,JJOF,KKOF,LOHIF,IOR,CT,NCFACE_CUTCELL,NFACE_CELL,AX,SIDE,ICC,JCC,ICFC,IFC, &
+ IBOD_DONOR,ITRI_DONOR
TYPE(MESH_TYPE), POINTER :: M, M2
TYPE(EXTERNAL_WALL_TYPE), POINTER :: EWC
TYPE(WALL_TYPE), POINTER :: WC
@@ -779,6 +780,7 @@ SUBROUTINE SET_CUTCELLS_3D
INTEGER, PARAMETER :: ADDJ(LOW_IND:HIGH_IND,IAXIS:KAXIS) = RESHAPE((/ 0,0,-1,0, 0,0/),(/2,3/))
INTEGER, PARAMETER :: ADDK(LOW_IND:HIGH_IND,IAXIS:KAXIS) = RESHAPE((/ 0,0, 0,0,-1,0/),(/2,3/))
INTEGER :: IIO,JJO,KKO,IOGC,JOGC,KOGC
+LOGICAL :: FM_PENDING_BLOCK_SCAN(1:NMESHES)
REAL(EB) :: TNOW
@@ -1508,6 +1510,14 @@ SUBROUTINE SET_CUTCELLS_3D
IF (ALLOCATED(SPCELLS_TO_BLOCK)) DEALLOCATE(SPCELLS_TO_BLOCK)
ENDDO MAIN_MESH_LOOP
+! Promote refinement footprints from initially blocked fine cells (e.g., slivers tagged
+! BLOCKED_SMALL_CELL in GET_CARTCELL_CUTCELLS / GET_CELL_LINK_INFO):
+DO NM=1,NMESHES
+ IF (.NOT.CC_COMPUTE_MESH(NM)) CYCLE ! Only MESHES assigned to processor and OMESHES of these.
+ IF (PERIODIC_TEST==105 .AND. PROCESS(NM)/=MY_RANK) CYCLE ! Don't do OMESHES for PERIODIC_TEST==105
+ CALL PROMOTE_REFINEMENT_FOOTPRINTS_FROM_BLOCKED_FINE(NM)
+ENDDO
+
CALL DEALLOCATE_BODINT_PLANE(BODINT_PLANE)
CALL DEALLOCATE_BODINT_PLANE(BODINT_PLANE2)
@@ -1516,6 +1526,8 @@ SUBROUTINE SET_CUTCELLS_3D
DO IDIM=1,MAX_DIM
+FM_PENDING_BLOCK_SCAN = .FALSE.
+
! Exchange CC%NOADVANCE(JCC)>0 information among NEIGHBOURING meshes:
CALL EXCHANGE_CC_NOADVANCE_INFO
! Add CC%NOADVANCE(JCC) where needed:
@@ -1591,9 +1603,9 @@ SUBROUTINE SET_CUTCELLS_3D
CF => M%CUT_FACE(ICF1)
IIF=CF%IJK(IAXIS); JJF=CF%IJK(JAXIS); KKF=CF%IJK(KAXIS)
SELECT CASE(CF%IJK(KAXIS+1))
- CASE(IAXIS); ACRT = DY(JJF)*DZ(KKF)
- CASE(JAXIS); ACRT = DZ(KKF)*DX(IIF)
- CASE(KAXIS); ACRT = DX(IIF)*DY(JJF)
+ CASE(IAXIS); ACRT = DYFACE(JJF)*DZFACE(KKF)
+ CASE(JAXIS); ACRT = DZFACE(KKF)*DXFACE(IIF)
+ CASE(KAXIS); ACRT = DXFACE(IIF)*DYFACE(JJF)
END SELECT
IF(SUM(CF%AREA(1:CF%NFACE))/ACRT>=CCVOL_LINK) CYCLE
CC%NOADVANCE(J)=BLOCKED_CAVITY_CELL
@@ -1601,38 +1613,44 @@ SUBROUTINE SET_CUTCELLS_3D
ENDDO
ENDDO
IF (K>0) THEN
+ FM_PENDING_BLOCK_SCAN(NM) = .TRUE.
+ ENDIF
+ CALL DEFINE_XYZFACE_CELL(ALLOC_FLG=.FALSE.)
+ENDDO MAIN_MESH_LOOP_1
+
+IF (ANY(FM_PENDING_BLOCK_SCAN)) THEN
+ DO WHILE (ANY(FM_PENDING_BLOCK_SCAN))
+ DO NM=1,NMESHES
+ IF (.NOT.FM_PENDING_BLOCK_SCAN(NM)) CYCLE
+ FM_PENDING_BLOCK_SCAN(NM) = .FALSE.
+ CALL PROMOTE_REFINEMENT_FOOTPRINTS_FROM_BLOCKED_FINE(NM)
+ ENDDO
+ ENDDO
+ MAIN_MESH_LOOP_1B : DO NM=1,NMESHES
+ IF (.NOT.CC_COMPUTE_MESH(NM)) CYCLE ! Only MESHES assigned to processor and OMESHES of these.
+ IF (PERIODIC_TEST==105 .AND. PROCESS(NM)/=MY_RANK) CYCLE ! Don't do OMESHES for PERIODIC_TEST==105
+
+ CALL POINT_TO_MESH(NM)
+ M => MESHES(NM)
+ CALL DEFINE_XYZFACE_CELL(ALLOC_FLG=.TRUE.)
+ CALL GET_CC_FACE_CELL_LIST_INFO(NM,PHASE=2)
+ CALL GET_CELL_LINK_INFO(NM)
CALL BLOCK_SMALL_UNLINKED_CUTCELLS(NM,SUM_CCELL)
IF(SUM_CCELL>0) THEN ! Rebuild incidences and cell linking information:
CALL GET_CC_FACE_CELL_LIST_INFO(NM,PHASE=2)
CALL GET_CELL_LINK_INFO(NM)
ENDIF
- ENDIF
- CALL DEFINE_XYZFACE_CELL(ALLOC_FLG=.FALSE.)
-ENDDO MAIN_MESH_LOOP_1
+ CALL DEFINE_XYZFACE_CELL(ALLOC_FLG=.FALSE.)
+ ENDDO MAIN_MESH_LOOP_1B
+ENDIF
+CALL EXCHANGE_CC_NOADVANCE_INFO
+CALL ADD_NEIGHBOR_BLOCKED_CELLS
! Call tag boundary cut-cells for blocking in refinement interfaces:
CALL TAG_CC_BLOCKING_REFINEMENT
ENDDO
-! WRITE A file per process and mesh with the NOADVANCE cut-cells:
-! DO NM=1,NMESHES
-! M => MESHES(NM)
-! IF(N_MPI_PROCESSES>1) THEN
-! WRITE(VERBOSE_FILE,'(A,A,I0,A,I0,A)') TRIM(CHID),'_NOADVANCE_',MY_RANK,'_',NM,'.2log'
-! ELSE
-! WRITE(VERBOSE_FILE,'(A,A,I0,A,I0,A)') TRIM(CHID),'_NOADVANCE_',MY_RANK,'_',NM,'.1log'
-! ENDIF
-! OPEN(UNIT=787,FILE=TRIM(VERBOSE_FILE),STATUS='UNKNOWN')
-! DO ICC=1,M%N_CUTCELL_MESH+M%N_GCCUTCELL_MESH
-! CC=>M%CUT_CELL(ICC)
-! DO JCC=1,CC%NCELL
-! IF(CC%NOADVANCE(JCC)>0) WRITE(787,*) 'B',NM,';',ICC,JCC,CC%IJK(IAXIS:KAXIS),CC%NCELL
-! ENDDO
-! ENDDO
-! CLOSE(787)
-! ENDDO
-
MAIN_MESH_LOOP_3 : DO NM=1,NMESHES
IF (.NOT.CC_COMPUTE_MESH(NM)) CYCLE ! Only MESHES assigned to processor and OMESHES of these.
@@ -1768,6 +1786,14 @@ SUBROUTINE SET_CUTCELLS_3D
MESHES(NM)%N_CC_BLOCKED = 0
IF(ALLOCATED(MESHES(NM)%XYZ_CC_BLOCKED)) DEALLOCATE(MESHES(NM)%XYZ_CC_BLOCKED)
IF(ALLOCATED(MESHES(NM)%JBT_CC_BLOCKED)) DEALLOCATE(MESHES(NM)%JBT_CC_BLOCKED)
+ ! BODTRI_DONOR is consumed only during the setup blocking / refinement-interface passes
+ ! above. Free it here so it doesn't sit allocated for the lifetime of the run.
+ IF (ALLOCATED(MESHES(NM)%CUT_CELL)) THEN
+ DO ICC=1,MESHES(NM)%N_CUTCELL_MESH+MESHES(NM)%N_GCCUTCELL_MESH
+ IF (ALLOCATED(MESHES(NM)%CUT_CELL(ICC)%BODTRI_DONOR)) &
+ DEALLOCATE(MESHES(NM)%CUT_CELL(ICC)%BODTRI_DONOR)
+ ENDDO
+ ENDIF
ENDDO
! Finally allocate Face and cell variables, compute area and volume factors:
@@ -2242,11 +2268,294 @@ SUBROUTINE SET_CUTCELLS_3D
CONTAINS
+SUBROUTINE PROMOTE_REFINEMENT_FOOTPRINTS_FROM_BLOCKED_FINE(NM_FINE)
+
+INTEGER, INTENT(IN) :: NM_FINE
+INTEGER :: NM_COARSE,IW_LOC,II_COARSE,JJ_COARSE,KK_COARSE,IOR_COARSE, &
+ I_FINE,J_FINE,K_FINE,IIO_LOC,JJO_LOC,KKO_LOC,IBOD_DONOR,ITRI_DONOR
+LOGICAL :: FINE_BLOCKED,CELL_CHANGED
+TYPE(WALL_TYPE), POINTER :: WC_COARSE
+TYPE(EXTERNAL_WALL_TYPE), POINTER :: EWC_COARSE
+TYPE(BOUNDARY_COORD_TYPE), POINTER :: BC_COARSE
+TYPE(MESH_TYPE), POINTER :: MC
+
+COARSE_MESH_LOOP : DO NM_COARSE=1,NMESHES
+ IF (PROCESS(NM_COARSE)/=MY_RANK) CYCLE COARSE_MESH_LOOP
+ MC => MESHES(NM_COARSE)
+ COARSE_WALL_LOOP : DO IW_LOC=1,MC%N_EXTERNAL_WALL_CELLS
+ WC_COARSE => MC%WALL(IW_LOC); IF (WC_COARSE%BOUNDARY_TYPE/=INTERPOLATED_BOUNDARY) CYCLE COARSE_WALL_LOOP
+ EWC_COARSE => MC%EXTERNAL_WALL(IW_LOC); IF (EWC_COARSE%NOM/=NM_FINE) CYCLE COARSE_WALL_LOOP
+ IF ((EWC_COARSE%IIO_MAX-EWC_COARSE%IIO_MIN+1) * &
+ (EWC_COARSE%JJO_MAX-EWC_COARSE%JJO_MIN+1) * &
+ (EWC_COARSE%KKO_MAX-EWC_COARSE%KKO_MIN+1) <= 1) CYCLE COARSE_WALL_LOOP
+ BC_COARSE => MC%BOUNDARY_COORD(WC_COARSE%BC_INDEX)
+ II_COARSE = BC_COARSE%IIG; JJ_COARSE = BC_COARSE%JJG; KK_COARSE = BC_COARSE%KKG; IOR_COARSE = BC_COARSE%IOR
+
+ FINE_BLOCKED = .FALSE.; IBOD_DONOR = 0; ITRI_DONOR = 0
+ DO KKO_LOC=EWC_COARSE%KKO_MIN,EWC_COARSE%KKO_MAX
+ DO JJO_LOC=EWC_COARSE%JJO_MIN,EWC_COARSE%JJO_MAX
+ DO IIO_LOC=EWC_COARSE%IIO_MIN,EWC_COARSE%IIO_MAX
+ CALL GET_FINE_CELL_FROM_COARSE_WALL(IOR_COARSE,IIO_LOC,JJO_LOC,KKO_LOC,I_FINE,J_FINE,K_FINE)
+ IF (.NOT.CELL_HAS_BLOCKED_CUTCELL(NM_FINE,I_FINE,J_FINE,K_FINE)) CYCLE
+ FINE_BLOCKED = .TRUE.
+ IF (IBOD_DONOR<1 .OR. ITRI_DONOR<1) &
+ CALL GET_REFINEMENT_CELL_DONOR(NM_FINE,I_FINE,J_FINE,K_FINE,IBOD_DONOR,ITRI_DONOR)
+ ENDDO
+ ENDDO
+ ENDDO
+ IF (.NOT.FINE_BLOCKED) CYCLE COARSE_WALL_LOOP
+ CALL TAG_CELL_BLOCKED_BY_REFINEMENT_FOOTPRINT(NM_COARSE,II_COARSE,JJ_COARSE,KK_COARSE,BLOCKED_REFI_INTER, &
+ IBOD_DONOR,ITRI_DONOR,CELL_CHANGED)
+ IF (CELL_CHANGED) FM_PENDING_BLOCK_SCAN(NM_COARSE) = .TRUE.
+ CALL TAG_ALL_FINE_FOOTPRINTS_FOR_COARSE_CELL(NM_COARSE,II_COARSE,JJ_COARSE,KK_COARSE,IOR_COARSE, &
+ BLOCKED_REFI_INTER,IBOD_DONOR,ITRI_DONOR)
+ ENDDO COARSE_WALL_LOOP
+ENDDO COARSE_MESH_LOOP
+END SUBROUTINE PROMOTE_REFINEMENT_FOOTPRINTS_FROM_BLOCKED_FINE
+
+SUBROUTINE TAG_ALL_FINE_FOOTPRINTS_FOR_COARSE_CELL(NM_COARSE,II_COARSE,JJ_COARSE,KK_COARSE,IOR_TRIGGER,BLOCK_TAG, &
+ IBOD_DONOR,ITRI_DONOR)
+INTEGER, INTENT(IN) :: NM_COARSE,II_COARSE,JJ_COARSE,KK_COARSE,IOR_TRIGGER,BLOCK_TAG,IBOD_DONOR,ITRI_DONOR
+INTEGER :: IW_LOC,NM_FINE
+TYPE(WALL_TYPE), POINTER :: WC_COARSE
+TYPE(EXTERNAL_WALL_TYPE), POINTER :: EWC_COARSE
+TYPE(BOUNDARY_COORD_TYPE), POINTER :: BC_COARSE
+TYPE(MESH_TYPE), POINTER :: MC
+
+MC => MESHES(NM_COARSE); IF (.NOT.ALLOCATED(MC%WALL)) RETURN
+DO IW_LOC=1,MC%N_EXTERNAL_WALL_CELLS
+ WC_COARSE => MC%WALL(IW_LOC); IF (WC_COARSE%BOUNDARY_TYPE/=INTERPOLATED_BOUNDARY) CYCLE
+ BC_COARSE => MC%BOUNDARY_COORD(WC_COARSE%BC_INDEX)
+ IF (BC_COARSE%IOR/=IOR_TRIGGER) CYCLE
+ IF (BC_COARSE%IIG/=II_COARSE .OR. BC_COARSE%JJG/=JJ_COARSE .OR. BC_COARSE%KKG/=KK_COARSE) CYCLE
+ EWC_COARSE => MC%EXTERNAL_WALL(IW_LOC)
+ NM_FINE = EWC_COARSE%NOM
+ CALL TAG_FINE_CELLS_IN_COARSE_CELL_VOLUME(NM_COARSE,II_COARSE,JJ_COARSE,KK_COARSE,NM_FINE,BLOCK_TAG, &
+ IBOD_DONOR,ITRI_DONOR)
+ENDDO
+END SUBROUTINE TAG_ALL_FINE_FOOTPRINTS_FOR_COARSE_CELL
+
+SUBROUTINE TAG_FINE_CELLS_IN_COARSE_CELL_VOLUME(NM_COARSE,I_COARSE,J_COARSE,K_COARSE,NM_FINE,BLOCK_TAG,IBOD_DONOR,ITRI_DONOR)
+INTEGER, INTENT(IN) :: NM_COARSE,I_COARSE,J_COARSE,K_COARSE,NM_FINE,BLOCK_TAG,IBOD_DONOR,ITRI_DONOR
+INTEGER :: I_FINE,J_FINE,K_FINE
+REAL(EB) :: XLO,XHI,YLO,YHI,ZLO,ZHI,EPS_LOC
+LOGICAL :: CELL_CHANGED
+TYPE(MESH_TYPE), POINTER :: MC,MF
+
+IF (PROCESS(NM_FINE)/=MY_RANK) RETURN
+
+MC => MESHES(NM_COARSE)
+MF => MESHES(NM_FINE)
+XLO = MC%X(I_COARSE-1); XHI = MC%X(I_COARSE)
+YLO = MC%Y(J_COARSE-1); YHI = MC%Y(J_COARSE)
+ZLO = MC%Z(K_COARSE-1); ZHI = MC%Z(K_COARSE)
+EPS_LOC = 10._EB*GEOMEPS
+DO K_FINE=0,MF%KBP1
+ IF (MF%ZC(K_FINE)ZHI+EPS_LOC) CYCLE
+ DO J_FINE=0,MF%JBP1
+ IF (MF%YC(J_FINE)YHI+EPS_LOC) CYCLE
+ DO I_FINE=0,MF%IBP1
+ IF (I_FINE>=1 .AND. I_FINE<=MF%IBAR .AND. &
+ J_FINE>=1 .AND. J_FINE<=MF%JBAR .AND. &
+ K_FINE>=1 .AND. K_FINE<=MF%KBAR) CYCLE
+ IF (MF%XC(I_FINE)XHI+EPS_LOC) CYCLE
+ CALL TAG_CELL_BLOCKED_BY_REFINEMENT_FOOTPRINT(NM_FINE,I_FINE,J_FINE,K_FINE,BLOCK_TAG, &
+ IBOD_DONOR,ITRI_DONOR,CELL_CHANGED)
+ IF (CELL_CHANGED) FM_PENDING_BLOCK_SCAN(NM_FINE) = .TRUE.
+ ENDDO
+ ENDDO
+ENDDO
+END SUBROUTINE TAG_FINE_CELLS_IN_COARSE_CELL_VOLUME
+
+SUBROUTINE GET_FINE_CELL_FROM_COARSE_WALL(IOR_COARSE,IIO_LOC,JJO_LOC,KKO_LOC,I_FINE,J_FINE,K_FINE)
+
+INTEGER, INTENT(IN) :: IOR_COARSE,IIO_LOC,JJO_LOC,KKO_LOC
+INTEGER, INTENT(OUT) :: I_FINE,J_FINE,K_FINE
+
+I_FINE = IIO_LOC; J_FINE = JJO_LOC; K_FINE = KKO_LOC
+SELECT CASE(ABS(IOR_COARSE))
+CASE(IAXIS); I_FINE = I_FINE + SIGN(1,IOR_COARSE)
+CASE(JAXIS); J_FINE = J_FINE + SIGN(1,IOR_COARSE)
+CASE(KAXIS); K_FINE = K_FINE + SIGN(1,IOR_COARSE)
+END SELECT
+END SUBROUTINE GET_FINE_CELL_FROM_COARSE_WALL
+
+LOGICAL FUNCTION CELL_HAS_BLOCKED_CUTCELL(NM_LOC,I_LOC,J_LOC,K_LOC)
+INTEGER, INTENT(IN) :: NM_LOC,I_LOC,J_LOC,K_LOC
+INTEGER :: ICC_LOC
+CELL_HAS_BLOCKED_CUTCELL = .FALSE.
+ICC_LOC = MESHES(NM_LOC)%CCVAR(I_LOC,J_LOC,K_LOC,CC_IDCC); IF (ICC_LOC<1) RETURN
+CELL_HAS_BLOCKED_CUTCELL = ANY(MESHES(NM_LOC)%CUT_CELL(ICC_LOC)%NOADVANCE(1:MESHES(NM_LOC)%CUT_CELL(ICC_LOC)%NCELL)>0)
+END FUNCTION CELL_HAS_BLOCKED_CUTCELL
+
+SUBROUTINE GET_REFINEMENT_CELL_DONOR(NM_LOC,I_LOC,J_LOC,K_LOC,IBOD_OUT,ITRI_OUT)
+
+INTEGER, INTENT(IN) :: NM_LOC,I_LOC,J_LOC,K_LOC
+INTEGER, INTENT(OUT) :: IBOD_OUT,ITRI_OUT
+INTEGER :: II,JJ,KK,ICC_LOC,JCC_LOC,IFC,IFACE,IFC1,JFC1,COUNT,COUNT_MAX,DUM,PASS
+INTEGER, ALLOCATABLE, DIMENSION(:,:) :: BODTRI_ACC
+REAL(EB), ALLOCATABLE, DIMENSION(:) :: AREA_ACC
+TYPE(MESH_TYPE), POINTER :: MT
+
+IBOD_OUT = 0; ITRI_OUT = 0
+MT => MESHES(NM_LOC)
+DO PASS=1,2
+ DO KK=K_LOC-1,K_LOC+1
+ DO JJ=J_LOC-1,J_LOC+1
+ DO II=I_LOC-1,I_LOC+1
+ ICC_LOC = MT%CCVAR(II,JJ,KK,CC_IDCC); IF (ICC_LOC<1) CYCLE
+ DO JCC_LOC=1,MT%CUT_CELL(ICC_LOC)%NCELL
+ IF (PASS==1 .AND. MT%CUT_CELL(ICC_LOC)%NOADVANCE(JCC_LOC)<=0) CYCLE
+ IBOD_OUT = MT%CUT_CELL(ICC_LOC)%BODTRI_DONOR(1,JCC_LOC)
+ ITRI_OUT = MT%CUT_CELL(ICC_LOC)%BODTRI_DONOR(2,JCC_LOC)
+ IF (IBOD_OUT>0 .AND. ITRI_OUT>0) RETURN
+ ENDDO
+ ENDDO
+ ENDDO
+ ENDDO
+ENDDO
+COUNT_MAX = 0
+DO KK=K_LOC-1,K_LOC+1
+ DO JJ=J_LOC-1,J_LOC+1
+ DO II=I_LOC-1,I_LOC+1
+ ICC_LOC = MT%CCVAR(II,JJ,KK,CC_IDCC); IF (ICC_LOC<1) CYCLE
+ DO JCC_LOC=1,MT%CUT_CELL(ICC_LOC)%NCELL
+ COUNT_MAX = COUNT_MAX + MT%CUT_CELL(ICC_LOC)%CCELEM(1,JCC_LOC)
+ ENDDO
+ ENDDO
+ ENDDO
+ENDDO
+IF (COUNT_MAX<1) RETURN
+ALLOCATE(BODTRI_ACC(1:2,COUNT_MAX+1),AREA_ACC(COUNT_MAX+1))
+BODTRI_ACC = 0; AREA_ACC = 0._EB; COUNT = 0;
+DO KK=K_LOC-1,K_LOC+1
+ DO JJ=J_LOC-1,J_LOC+1
+ DO II=I_LOC-1,I_LOC+1
+ ICC_LOC = MT%CCVAR(II,JJ,KK,CC_IDCC); IF (ICC_LOC<1) CYCLE
+ DO JCC_LOC=1,MT%CUT_CELL(ICC_LOC)%NCELL
+ DO IFC=1,MT%CUT_CELL(ICC_LOC)%CCELEM(1,JCC_LOC)
+ IFACE = MT%CUT_CELL(ICC_LOC)%CCELEM(IFC+1,JCC_LOC)
+ IF (MT%CUT_CELL(ICC_LOC)%FACE_LIST(1,IFACE)/=CC_FTYPE_CFINB) CYCLE
+ IFC1 = MT%CUT_CELL(ICC_LOC)%FACE_LIST(4,IFACE)
+ JFC1 = MT%CUT_CELL(ICC_LOC)%FACE_LIST(5,IFACE)
+ IF (IFC1<1 .OR. IFC1>MT%N_CUTFACE_MESH+MT%N_GCCUTFACE_MESH) CYCLE
+ IF (.NOT.ALLOCATED(MT%CUT_FACE(IFC1)%BODTRI)) CYCLE
+ IF (JFC1<1 .OR. JFC1>SIZE(MT%CUT_FACE(IFC1)%BODTRI,DIM=2)) CYCLE
+ CALL ACCUMULATE_BLOCKING_BODTRI(MT%CUT_FACE(IFC1)%BODTRI(1:2,JFC1),MT%CUT_FACE(IFC1)%AREA(JFC1), &
+ COUNT,BODTRI_ACC,AREA_ACC)
+ ENDDO
+ ENDDO
+ ENDDO
+ ENDDO
+ENDDO
+IF (COUNT>0) THEN
+ DUM = MAXLOC(AREA_ACC(1:COUNT),DIM=1)
+ IBOD_OUT = BODTRI_ACC(1,DUM)
+ ITRI_OUT = BODTRI_ACC(2,DUM)
+ENDIF
+DEALLOCATE(BODTRI_ACC,AREA_ACC)
+END SUBROUTINE GET_REFINEMENT_CELL_DONOR
+
+SUBROUTINE SET_REFINEMENT_CUTCELL_DONOR(NM_LOC,ICC_LOC,JCC_LOC,IBOD_IN,ITRI_IN)
+INTEGER, INTENT(IN) :: NM_LOC,ICC_LOC,JCC_LOC,IBOD_IN,ITRI_IN
+INTEGER :: IBOD_LOC,ITRI_LOC
+
+IF (IBOD_IN>0 .AND. ITRI_IN>0) THEN
+ MESHES(NM_LOC)%CUT_CELL(ICC_LOC)%BODTRI_DONOR(1:2,JCC_LOC) = (/ IBOD_IN, ITRI_IN /)
+ELSE
+ CALL GET_BLOCKING_CUTCELL_DONOR(NM_LOC,ICC_LOC,JCC_LOC,IBOD_LOC,ITRI_LOC)
+ENDIF
+END SUBROUTINE SET_REFINEMENT_CUTCELL_DONOR
+
+SUBROUTINE TAG_CELL_BLOCKED_BY_REFINEMENT_FOOTPRINT(NM_LOC,I_LOC,J_LOC,K_LOC,BLOCK_TAG,IBOD_DONOR,ITRI_DONOR,CELL_CHANGED)
+
+INTEGER, INTENT(IN) :: NM_LOC,I_LOC,J_LOC,K_LOC,BLOCK_TAG,IBOD_DONOR,ITRI_DONOR
+LOGICAL, INTENT(OUT) :: CELL_CHANGED
+INTEGER :: ICC_LOC,JCC_LOC,AX_LOC,SIDE_LOC,ICFC_LOC,CT_LOC,NCFACE_CUTCELL_LOC,NFACE_CELL_LOC,NCELL_LOC
+INTEGER, ALLOCATABLE, DIMENSION(:,:) :: CCELEM_LOC,FACE_LIST_LOC
+INTEGER, ALLOCATABLE, DIMENSION(:) :: NOADVANCE_LOC
+REAL(EB), ALLOCATABLE, DIMENSION(:,:) :: XYZCEN_LOC
+REAL(EB), ALLOCATABLE, DIMENSION(:) :: VOLUME_LOC
+TYPE(MESH_TYPE), POINTER :: MT
+
+CELL_CHANGED = .FALSE.
+MT => MESHES(NM_LOC)
+
+SELECT CASE(MT%CCVAR(I_LOC,J_LOC,K_LOC,CC_CGSC))
+CASE(CC_SOLID)
+ RETURN
+CASE(CC_CUTCFE)
+ ICC_LOC = MT%CCVAR(I_LOC,J_LOC,K_LOC,CC_IDCC)
+ IF (ICC_LOC<1) RETURN
+ DO JCC_LOC=1,MT%CUT_CELL(ICC_LOC)%NCELL
+ IF (MT%CUT_CELL(ICC_LOC)%NOADVANCE(JCC_LOC)/=NOT_BLOCKED) CYCLE
+ MT%CUT_CELL(ICC_LOC)%NOADVANCE(JCC_LOC) = BLOCK_TAG
+ CALL SET_REFINEMENT_CUTCELL_DONOR(NM_LOC,ICC_LOC,JCC_LOC,IBOD_DONOR,ITRI_DONOR)
+ CELL_CHANGED = .TRUE.
+ ENDDO
+CASE(CC_GASPHASE)
+ CT_LOC = 6
+ NCFACE_CUTCELL_LOC = CT_LOC + 1
+ NCELL_LOC = 1; NFACE_CELL_LOC = CT_LOC
+ ALLOCATE(CCELEM_LOC(1:NCFACE_CUTCELL_LOC,1:NCELL_LOC)); CCELEM_LOC = CC_UNDEFINED
+ ALLOCATE(FACE_LIST_LOC(1:CC_NPARAM_CCFACE,1:NFACE_CELL_LOC)); FACE_LIST_LOC = CC_UNDEFINED
+ ALLOCATE(VOLUME_LOC(1:NCELL_LOC)); VOLUME_LOC(1) = MT%DX(I_LOC)*MT%DY(J_LOC)*MT%DZ(K_LOC)
+ ALLOCATE(XYZCEN_LOC(IAXIS:KAXIS,1:NCELL_LOC))
+ XYZCEN_LOC(IAXIS:KAXIS,1) = (/ MT%XC(I_LOC), MT%YC(J_LOC), MT%ZC(K_LOC) /)
+ ALLOCATE(NOADVANCE_LOC(1:NCELL_LOC)); NOADVANCE_LOC(1) = BLOCK_TAG
+ CT_LOC = 1; CCELEM_LOC(1,1) = 0
+ DO AX_LOC=IAXIS,KAXIS
+ DO SIDE_LOC=LOW_IND,HIGH_IND
+ IF (.NOT.FACE_INDEX_IN_BOUNDS(NM_LOC,I_LOC+ADDI(SIDE_LOC,AX_LOC),J_LOC+ADDJ(SIDE_LOC,AX_LOC), &
+ K_LOC+ADDK(SIDE_LOC,AX_LOC),AX_LOC)) CYCLE
+ ICFC_LOC = MT%FCVAR(I_LOC+ADDI(SIDE_LOC,AX_LOC),J_LOC+ADDJ(SIDE_LOC,AX_LOC), &
+ K_LOC+ADDK(SIDE_LOC,AX_LOC),CC_IDCF,AX_LOC)
+ IF (ICFC_LOC>0) THEN
+ FACE_LIST_LOC(1:CC_NPARAM_CCFACE,CT_LOC) = (/ CC_FTYPE_CFGAS, SIDE_LOC, AX_LOC,ICFC_LOC, 1, CC_UNDEFINED /)
+ CCELEM_LOC(1,1) = CCELEM_LOC(1,1) + 1
+ CCELEM_LOC(CCELEM_LOC(1,1)+1,1) = CT_LOC
+ CT_LOC = CT_LOC + 1
+ ELSEIF (MT%FCVAR(I_LOC+ADDI(SIDE_LOC,AX_LOC),J_LOC+ADDJ(SIDE_LOC,AX_LOC), &
+ K_LOC+ADDK(SIDE_LOC,AX_LOC),CC_FGSC,AX_LOC)==CC_GASPHASE) THEN
+ FACE_LIST_LOC(1:CC_NPARAM_CCFACE,CT_LOC) = (/ CC_FTYPE_RCGAS, SIDE_LOC, AX_LOC, 0, 0, CC_UNDEFINED /)
+ CCELEM_LOC(1,1) = CCELEM_LOC(1,1) + 1
+ CCELEM_LOC(CCELEM_LOC(1,1)+1,1) = CT_LOC
+ CT_LOC = CT_LOC + 1
+ ENDIF
+ ENDDO
+ ENDDO
+ CALL INSERT_CUT_CELL(NM_LOC,I_LOC,J_LOC,K_LOC,ICC_LOC)
+ MT => MESHES(NM_LOC)
+ CALL NEW_CELL_ALLOC(NM_LOC,ICC_LOC,NCELL_LOC,NFACE_CELL_LOC,NCFACE_CUTCELL_LOC)
+ MT%CUT_CELL(ICC_LOC)%NCELL = NCELL_LOC
+ MT%CUT_CELL(ICC_LOC)%NFACE_CELL = NFACE_CELL_LOC
+ CALL MOVE_ALLOC(FROM=CCELEM_LOC,TO=MT%CUT_CELL(ICC_LOC)%CCELEM)
+ CALL MOVE_ALLOC(FROM=FACE_LIST_LOC,TO=MT%CUT_CELL(ICC_LOC)%FACE_LIST)
+ CALL MOVE_ALLOC(FROM=VOLUME_LOC,TO=MT%CUT_CELL(ICC_LOC)%VOLUME)
+ CALL MOVE_ALLOC(FROM=XYZCEN_LOC,TO=MT%CUT_CELL(ICC_LOC)%XYZCEN)
+ CALL MOVE_ALLOC(FROM=NOADVANCE_LOC,TO=MT%CUT_CELL(ICC_LOC)%NOADVANCE)
+ CALL SET_REFINEMENT_CUTCELL_DONOR(NM_LOC,ICC_LOC,1,IBOD_DONOR,ITRI_DONOR)
+ CELL_CHANGED = .TRUE.
+END SELECT
+
+END SUBROUTINE TAG_CELL_BLOCKED_BY_REFINEMENT_FOOTPRINT
+
+
+LOGICAL FUNCTION FACE_INDEX_IN_BOUNDS(NM_LOC,I_LOC,J_LOC,K_LOC,AX_LOC)
+
+INTEGER, INTENT(IN) :: NM_LOC,I_LOC,J_LOC,K_LOC,AX_LOC
+
+FACE_INDEX_IN_BOUNDS = NM_LOC>=1 .AND. NM_LOC<=NMESHES; IF (.NOT.FACE_INDEX_IN_BOUNDS) RETURN
+FACE_INDEX_IN_BOUNDS = I_LOC>=LBOUND(MESHES(NM_LOC)%FCVAR,DIM=1) .AND. I_LOC<=UBOUND(MESHES(NM_LOC)%FCVAR,DIM=1) .AND. &
+ J_LOC>=LBOUND(MESHES(NM_LOC)%FCVAR,DIM=2) .AND. J_LOC<=UBOUND(MESHES(NM_LOC)%FCVAR,DIM=2) .AND. &
+ K_LOC>=LBOUND(MESHES(NM_LOC)%FCVAR,DIM=3) .AND. K_LOC<=UBOUND(MESHES(NM_LOC)%FCVAR,DIM=3) .AND. &
+ AX_LOC>=LBOUND(MESHES(NM_LOC)%FCVAR,DIM=5) .AND. AX_LOC<=UBOUND(MESHES(NM_LOC)%FCVAR,DIM=5)
+END FUNCTION FACE_INDEX_IN_BOUNDS
+
SUBROUTINE ADD_NEIGHBOR_BLOCKED_CELLS
USE TRAN, ONLY: GET_IJK
INTEGER :: NM2,ICELL,I2,J2,K2,BLOCK_TAG
-LOGICAL :: IND_FOUND
REAL(EB):: XCO,YCO,ZCO,VOL_NM,VOL_NOM,X1,Y1,Z1
TYPE(MESH_TYPE), POINTER :: M2
@@ -2268,91 +2577,67 @@ SUBROUTINE ADD_NEIGHBOR_BLOCKED_CELLS
M2 => MESHES(NOM)
ICELL_DO : DO ICELL=1,M2%N_CC_BLOCKED
- XCO = M2%XYZ_CC_BLOCKED(IAXIS,ICELL)
- YCO = M2%XYZ_CC_BLOCKED(JAXIS,ICELL)
- ZCO = M2%XYZ_CC_BLOCKED(KAXIS,ICELL)
+ XCO = M2%XYZ_CC_BLOCKED(IAXIS,ICELL); YCO = M2%XYZ_CC_BLOCKED(JAXIS,ICELL); ZCO = M2%XYZ_CC_BLOCKED(KAXIS,ICELL)
BLOCK_TAG = M2%JBT_CC_BLOCKED(2,ICELL)
CALL GET_IJK(XCO,YCO,ZCO,NOM,X1,Y1,Z1,I2,J2,K2)
+ IF (I2<1 .OR. I2>M2%IBAR .OR. J2<1 .OR. J2>M2%JBAR .OR. K2<1 .OR. K2>M2%KBAR) CYCLE ICELL_DO
VOL_NOM = M2%DX(I2)*M2%DY(J2)*M2%DZ(K2)
-
IF (VOL_NM > 1.5_EB * VOL_NOM) THEN ! NM is COARSE, NOM is FINE
- IF(XCO < M2%XS .OR. XCO > M2%XF .OR. &
- YCO < M2%YS .OR. YCO > M2%YF .OR. &
- ZCO < M2%ZS .OR. ZCO > M2%ZF) CYCLE ICELL_DO
+ IF(XCO < M2%XS .OR. XCO > M2%XF .OR. YCO < M2%YS .OR. YCO > M2%YF .OR. ZCO < M2%ZS .OR. ZCO > M2%ZF) CYCLE ICELL_DO
IF(XCO > M2%X(1) .AND. XCO < M2%X(M2%IBAR-1) .AND. &
YCO > M2%Y(1) .AND. YCO < M2%Y(M2%JBAR-1) .AND. &
ZCO > M2%Z(1) .AND. ZCO < M2%Z(M2%KBAR-1)) CYCLE ICELL_DO
- ! Find I,J,K in NM where (XCO,YCO,ZCO) falls within cell bounds
- IND_FOUND = .FALSE.
- DO I=ILO_CELL-1,IHI_CELL+1
- IF (XCO < XFACE(I-1)-GEOMEPS .OR. XCO > XFACE(I)+GEOMEPS) CYCLE
- DO J=JLO_CELL-1,JHI_CELL+1
- IF (YCO < YFACE(J-1)-GEOMEPS .OR. YCO > YFACE(J)+GEOMEPS) CYCLE
- DO K=KLO_CELL-1,KHI_CELL+1
- IF (ZCO < ZFACE(K-1)-GEOMEPS .OR. ZCO > ZFACE(K)+GEOMEPS) CYCLE
- IF (I > ILO_CELL-1 .AND. I < IHI_CELL+1 .AND. &
- J > JLO_CELL-1 .AND. J < JHI_CELL+1 .AND. &
- K > KLO_CELL-1 .AND. K < KHI_CELL+1) CYCLE
- IND_FOUND = .TRUE.
- EXIT
- ENDDO
- IF (IND_FOUND) EXIT
- ENDDO
- IF (IND_FOUND) EXIT
- ENDDO
- IF (.NOT.IND_FOUND) CYCLE ICELL_DO
+ ! Find I,J,K in NM where (XCO,YCO,ZCO) falls within cell bounds (ghost band only).
+ I = MINLOC(ABS(XCELL(ILO_CELL-1:IHI_CELL+1)-XCO),DIM=1) + ILO_CELL - 2
+ J = MINLOC(ABS(YCELL(JLO_CELL-1:JHI_CELL+1)-YCO),DIM=1) + JLO_CELL - 2
+ K = MINLOC(ABS(ZCELL(KLO_CELL-1:KHI_CELL+1)-ZCO),DIM=1) + KLO_CELL - 2
+ IF (XCO < XFACE(I-1)-GEOMEPS .OR. XCO > XFACE(I)+GEOMEPS .OR. &
+ YCO < YFACE(J-1)-GEOMEPS .OR. YCO > YFACE(J)+GEOMEPS .OR. &
+ ZCO < ZFACE(K-1)-GEOMEPS .OR. ZCO > ZFACE(K)+GEOMEPS) CYCLE ICELL_DO
+ IF (I>ILO_CELL-1 .AND. IJLO_CELL-1 .AND. JKLO_CELL-1 .AND. K 0) THEN
DO JCC = 1, M%CUT_CELL(ICC)%NCELL
- IF (M%CUT_CELL(ICC)%NOADVANCE(JCC) == NOT_BLOCKED) &
+ IF (M%CUT_CELL(ICC)%NOADVANCE(JCC) == NOT_BLOCKED) THEN
M%CUT_CELL(ICC)%NOADVANCE(JCC) = BLOCK_TAG
+ IF (M2%JBT_CC_BLOCKED(3,ICELL)>0 .AND. M2%JBT_CC_BLOCKED(4,ICELL)>0) &
+ M%CUT_CELL(ICC)%BODTRI_DONOR(1:2,JCC) = M2%JBT_CC_BLOCKED(3:4,ICELL)
+ ENDIF
ENDDO
ENDIF
-
+ ELSEIF (VOL_NOM > 1.5_EB * VOL_NM) THEN ! NM is FINE, NOM is COARSE
+ CALL TAG_FINE_CELLS_IN_COARSE_CELL_VOLUME(NOM,I2,J2,K2,NM,BLOCK_TAG, &
+ M2%JBT_CC_BLOCKED(3,ICELL),M2%JBT_CC_BLOCKED(4,ICELL))
ELSE
- ! =====================================================
! Same refinement level (or refinement handled by EXT_WALL_LOOP) - use centroid matching
- ! =====================================================
- IND_FOUND = .FALSE.
- DO I=ILO_CELL-1,IHI_CELL+1
- IF (ABS(XCO-XCELL(I))=GEOMEPS .OR. ABS(YCO-YCELL(J))>=GEOMEPS .OR. &
+ ABS(ZCO-ZCELL(K))>=GEOMEPS) CYCLE ICELL_DO
! Here we have found the I,J,K indices of the blocked cut-cell:
ICC=M%CCVAR(I,J,K,CC_IDCC)
- IF(ICC>0) M%CUT_CELL(ICC)%NOADVANCE(M2%JBT_CC_BLOCKED(1,ICELL)) = BLOCK_TAG
-
+ IF (ICC>0) THEN
+ IF (M2%JBT_CC_BLOCKED(1,ICELL)>0) THEN
+ IF (M2%JBT_CC_BLOCKED(1,ICELL)<=M%CUT_CELL(ICC)%NCELL) THEN
+ M%CUT_CELL(ICC)%NOADVANCE(M2%JBT_CC_BLOCKED(1,ICELL)) = BLOCK_TAG
+ IF (M2%JBT_CC_BLOCKED(3,ICELL)>0 .AND. M2%JBT_CC_BLOCKED(4,ICELL)>0) &
+ M%CUT_CELL(ICC)%BODTRI_DONOR(1:2,M2%JBT_CC_BLOCKED(1,ICELL)) = M2%JBT_CC_BLOCKED(3:4,ICELL)
+ ENDIF
+ ENDIF
+ ENDIF
ENDIF
ENDDO ICELL_DO
ENDDO NEIGHBORING_MESHES_DO
CALL DEFINE_XYZFACE_CELL(ALLOC_FLG=.FALSE.)
ENDDO MESH_LOOP
-
END SUBROUTINE ADD_NEIGHBOR_BLOCKED_CELLS
@@ -2486,7 +2771,6 @@ END SUBROUTINE DEFINE_XYZFACE_CELL
SUBROUTINE TAG_CC_BLOCKING_REFINEMENT
-
LOGICAL, PARAMETER :: DO_RAY_TRACING=.TRUE.
INTEGER :: DUM,II1,JJ1,KK1,IIO1,JJO1,KKO1,IIO2,JJO2,KKO2,IIG,JJG,KKG,IIOG,JJOG,KKOG
@@ -2660,6 +2944,7 @@ SUBROUTINE TAG_CC_BLOCKING_REFINEMENT
END SELECT
IF(M%FCVAR(IIF,JJF,KKF,CC_CGSC,X1AXIS)==CC_SOLID) CYCLE EXT_WALL_LOOP ! No need to do anything.
IF(M2%FCVAR(IIOF,JJOF,KKOF,CC_CGSC,X1AXIS)==CC_SOLID) THEN ! Coarse side face is solid.
+ CALL GET_REFINEMENT_CELL_DONOR(NOM,IIOF,JJOF,KKOF,IBOD_DONOR,ITRI_DONOR)
! Set II,JJ,KK fine cells next to this EWC for blocking.
IF(M%CCVAR(II,JJ,KK,CC_CGSC)==CC_GASPHASE) THEN
! Insert cut-cell in this location, set to Block.
@@ -2697,6 +2982,7 @@ SUBROUTINE TAG_CC_BLOCKING_REFINEMENT
CALL MOVE_ALLOC(FROM=VOLUME ,TO=M%CUT_CELL(ICC)%VOLUME)
CALL MOVE_ALLOC(FROM=XYZCEN ,TO=M%CUT_CELL(ICC)%XYZCEN)
CALL MOVE_ALLOC(FROM=NOADVANCE,TO=M%CUT_CELL(ICC)%NOADVANCE)
+ CALL SET_REFINEMENT_CUTCELL_DONOR(NM,ICC,1,IBOD_DONOR,ITRI_DONOR)
ELSEIF(M%CCVAR(II,JJ,KK,CC_CGSC)==CC_CUTCFE) THEN
! Find face in IIF,JFF,JJF,X1AXIS location and set the owner cell to block.
ICC=M%CCVAR(II,JJ,KK,CC_IDCC); CC=> M%CUT_CELL(ICC)
@@ -2706,6 +2992,7 @@ SUBROUTINE TAG_CC_BLOCKING_REFINEMENT
IF( (CC%FACE_LIST(1,IFACE)==CC_FTYPE_RCGAS .OR. CC%FACE_LIST(1,IFACE)==CC_FTYPE_CFGAS) .AND. &
CC%FACE_LIST(2,IFACE)==LOHIF .AND. CC%FACE_LIST(3,IFACE)==X1AXIS ) THEN
IF(CC%NOADVANCE(JCC)==NOT_BLOCKED) CC%NOADVANCE(JCC)=BLOCKED_REFI_INTER
+ CALL SET_REFINEMENT_CUTCELL_DONOR(NM,ICC,JCC,IBOD_DONOR,ITRI_DONOR)
CYCLE JCC_LOOP_1
ENDIF
ENDDO
@@ -2717,6 +3004,8 @@ SUBROUTINE TAG_CC_BLOCKING_REFINEMENT
ELSEIF((EWC%IIO_MAX-EWC%IIO_MIN+1)*(EWC%JJO_MAX-EWC%JJO_MIN+1)*(EWC%KKO_MAX-EWC%KKO_MIN+1)>1) THEN
IF(M%FCVAR(IIF,JJF,KKF,CC_CGSC,X1AXIS)==CC_SOLID) THEN ! Coarse side face is solid.
+ IF (PROCESS(NOM)/=MY_RANK) CYCLE EXT_WALL_LOOP
+ CALL GET_REFINEMENT_CELL_DONOR(NM,IIF,JJF,KKF,IBOD_DONOR,ITRI_DONOR)
! If needed, block ghost cells of the other mesh which has finer cells.
DO KKO=EWC%KKO_MIN,EWC%KKO_MAX
DO JJO=EWC%JJO_MIN,EWC%JJO_MAX
@@ -2770,6 +3059,7 @@ SUBROUTINE TAG_CC_BLOCKING_REFINEMENT
CALL MOVE_ALLOC(FROM=VOLUME ,TO=M2%CUT_CELL(ICC)%VOLUME)
CALL MOVE_ALLOC(FROM=XYZCEN ,TO=M2%CUT_CELL(ICC)%XYZCEN)
CALL MOVE_ALLOC(FROM=NOADVANCE,TO=M2%CUT_CELL(ICC)%NOADVANCE)
+ CALL SET_REFINEMENT_CUTCELL_DONOR(NOM,ICC,1,IBOD_DONOR,ITRI_DONOR)
ELSEIF(M2%CCVAR(IOGC,JOGC,KOGC,CC_CGSC)==CC_CUTCFE) THEN
! Find face in IIF,JFF,JJF,X1AXIS location and set the owner cell to block.
ICC=M2%CCVAR(IOGC,JOGC,KOGC,CC_IDCC); CC=> M2%CUT_CELL(ICC)
@@ -2779,6 +3069,7 @@ SUBROUTINE TAG_CC_BLOCKING_REFINEMENT
IF( (CC%FACE_LIST(1,IFACE)==CC_FTYPE_RCGAS .OR. CC%FACE_LIST(1,IFACE)==CC_FTYPE_CFGAS) .AND. &
CC%FACE_LIST(2,IFACE)==LOHIF .AND. CC%FACE_LIST(3,IFACE)==X1AXIS ) THEN
IF(CC%NOADVANCE(JCC)==NOT_BLOCKED) CC%NOADVANCE(JCC)=BLOCKED_REFI_INTER
+ CALL SET_REFINEMENT_CUTCELL_DONOR(NOM,ICC,JCC,IBOD_DONOR,ITRI_DONOR)
CYCLE JCC_LOOP_3
ENDIF
ENDDO
@@ -2802,6 +3093,7 @@ SUBROUTINE TAG_BLOCK_CELL(NM,II1,JJ1,KK1,NOM,IIO1,JJO1,KKO1,FINE_CELL)
INTEGER, INTENT(IN) :: NM,II1,JJ1,KK1,NOM,IIO1,JJO1,KKO1
LOGICAL, INTENT(IN) :: FINE_CELL
+INTEGER :: JCC_LOC,IBOD_LOC,ITRI_LOC
TYPE(MESH_TYPE), POINTER :: M,M2
M =>MESHES( NM)
M2=>MESHES(NOM)
@@ -2810,6 +3102,7 @@ SUBROUTINE TAG_BLOCK_CELL(NM,II1,JJ1,KK1,NOM,IIO1,JJO1,KKO1,FINE_CELL)
ICC2 = M2%CCVAR(IIO1,JJO1,KKO1,CC_IDCC); ICC = 0
IF ( ICC2 > 0 .OR. M2%CCVAR(IIO1,JJO1,KKO1,CC_CGSC)==CC_SOLID) THEN ! There are cut-cells in omesh cartesian cell.
+ CALL GET_REFINEMENT_CELL_DONOR(NOM,IIO1,JJO1,KKO1,IBOD_LOC,ITRI_LOC)
IF(M%CCVAR(II1,JJ1,KK1,CC_CGSC)==CC_GASPHASE) THEN
! Insert cut-cell is this location:
CT = 6;
@@ -2847,14 +3140,19 @@ SUBROUTINE TAG_BLOCK_CELL(NM,II1,JJ1,KK1,NOM,IIO1,JJO1,KKO1,FINE_CELL)
CALL MOVE_ALLOC(FROM=VOLUME ,TO=M%CUT_CELL(ICC)%VOLUME)
CALL MOVE_ALLOC(FROM=XYZCEN ,TO=M%CUT_CELL(ICC)%XYZCEN)
CALL MOVE_ALLOC(FROM=NOADVANCE,TO=M%CUT_CELL(ICC)%NOADVANCE)
+ IF (M%CUT_CELL(ICC)%NOADVANCE(1)>0) &
+ CALL SET_REFINEMENT_CUTCELL_DONOR(NM,ICC,1,IBOD_LOC,ITRI_LOC)
ELSEIF(M%CCVAR(II1,JJ1,KK1,CC_IDCC)>0) THEN
ICC = M%CCVAR(II1,JJ1,KK1,CC_IDCC)
ENDIF
! Here Test if cut-cells in II,KK,KK are blocked or not in IIO,JJO,KKO:
IF(ICC>0) THEN
IF(M2%CCVAR(IIO1,JJO1,KKO1,CC_CGSC)==CC_SOLID) THEN
- WHERE(M%CUT_CELL(ICC)%NOADVANCE(1:M%CUT_CELL(ICC)%NCELL)==NOT_BLOCKED) &
- M%CUT_CELL(ICC)%NOADVANCE(1:M%CUT_CELL(ICC)%NCELL) = BLOCKED_REFI_INTER
+ DO JCC_LOC=1,M%CUT_CELL(ICC)%NCELL
+ IF(M%CUT_CELL(ICC)%NOADVANCE(JCC_LOC)/=NOT_BLOCKED) CYCLE
+ M%CUT_CELL(ICC)%NOADVANCE(JCC_LOC) = BLOCKED_REFI_INTER
+ CALL SET_REFINEMENT_CUTCELL_DONOR(NM,ICC,JCC_LOC,IBOD_LOC,ITRI_LOC)
+ ENDDO
ELSE; CALL TEST_CC_FOR_BLOCKING(NM,ICC,NOM,IIO1,JJO1,KKO1,ICC2)
ENDIF
ENDIF
@@ -2862,6 +3160,7 @@ SUBROUTINE TAG_BLOCK_CELL(NM,II1,JJ1,KK1,NOM,IIO1,JJO1,KKO1,FINE_CELL)
ELSE
+ IF (PROCESS(NOM)/=MY_RANK) RETURN
ICC = M%CCVAR(II1,JJ1,KK1,CC_IDCC); ICC2 = 0
IF(ICC>0) THEN
! Set IOGC,JOGC,KOGC fine cells next to this EWC for blocking.
@@ -2921,7 +3220,7 @@ SUBROUTINE TEST_CC_FOR_BLOCKING(NM,ICC,NOM,IIO1,JJO1,KKO1,ICC2)
INTEGER, INTENT(IN) :: NM,ICC,NOM,IIO1,JJO1,KKO1,ICC2
INTEGER :: JCC,FC_FOUND,FC_TYPE,INBFC,INBFC_LOC,VERT_CUTFACE,NVERT,X1AXIS,X2AXIS,X3AXIS,NCROSS,DIRRAY,IFC1,JFC1,&
- NVERT2,VERT_CUTFACE2,IV,IFCC,IFACE2,IFC2,JFC2
+ NVERT2,VERT_CUTFACE2,IV,IFCC,IFACE2,IFC2,JFC2,IBOD_DONOR,ITRI_DONOR
TYPE(MESH_TYPE), POINTER :: M,M2
TYPE(CC_CUTCELL_TYPE), POINTER :: CC,CC2
TYPE(CC_CUTFACE_TYPE), POINTER :: CF2
@@ -2938,6 +3237,7 @@ SUBROUTINE TEST_CC_FOR_BLOCKING(NM,ICC,NOM,IIO1,JJO1,KKO1,ICC2)
M =>MESHES( NM)
M2=>MESHES(NOM)
+CALL GET_REFINEMENT_CELL_DONOR(NOM,IIO1,JJO1,KKO1,IBOD_DONOR,ITRI_DONOR)
INBFC=M2%CCVAR(IIO1,JJO1,KKO1,CC_IDCF); IF(INBFC<1) RETURN ! No CC_INBOUNDARY faces in this cartesian cell.
@@ -3180,7 +3480,10 @@ SUBROUTINE TEST_CC_FOR_BLOCKING(NM,ICC,NOM,IIO1,JJO1,KKO1,ICC2)
! ENDIF
ENDDO INBFC_LOC_LOOP
! Here set no ADVANCE if BLOCK_CELL=T:
- IF(BLOCK_CELL .AND. CC%NOADVANCE(JCC)==NOT_BLOCKED) CC%NOADVANCE(JCC) = BLOCKED_REFI_INTER
+ IF(BLOCK_CELL .AND. CC%NOADVANCE(JCC)==NOT_BLOCKED) THEN
+ CC%NOADVANCE(JCC) = BLOCKED_REFI_INTER
+ CALL SET_REFINEMENT_CUTCELL_DONOR(NM,ICC,JCC,IBOD_DONOR,ITRI_DONOR)
+ ENDIF
ENDDO JCC_LOOP
! IF(NM==1 .AND. ICC<30) CLOSE(LU_CCELL)
@@ -4735,7 +5038,7 @@ SUBROUTINE SET_GC_CUTCELLS_3D
DO JJO=EWC%JJO_MIN,EWC%JJO_MAX
DO IIO=EWC%IIO_MIN,EWC%IIO_MAX
ICC = MESHES(NOM)%CCVAR(IIO,JJO,KKO,CC_IDCC)
- IF (ICC > 0) THEN
+ IF (ICC > 0 .AND. MESHES(NOM)%CCVAR(IIO,JJO,KKO,CC_CGSC)==CC_CUTCFE) THEN
N_CF = N_CF + 1
MESHES(NM)%CUT_CELL(NMICC)%NOMICC(1:2,N_CF) = (/ NOM, ICC /)
NCELL = MESHES(NOM)%CUT_CELL(ICC)%NCELL
@@ -4774,7 +5077,8 @@ SUBROUTINE SET_GC_CUTCELLS_3D
IF(FCVAR(IIO ,JJO ,KKO ,CC_FGSC,KAXIS) == CC_SOLID) CYCLE
END SELECT
IF (MESHES(NM)%CCVAR(II,JJ,KK,CC_CGSC) == CC_CUTCFE) THEN
- ICC = MESHES(NOM)%CCVAR(IIO,JJO,KKO,CC_IDCC); IF (ICC<1) CYCLE
+ ICC = MESHES(NOM)%CCVAR(IIO,JJO,KKO,CC_IDCC)
+ IF (ICC<1 .OR. MESHES(NOM)%CCVAR(IIO,JJO,KKO,CC_CGSC)/=CC_CUTCFE) CYCLE
NMICC = MESHES(NM)%CCVAR(II,JJ,KK,CC_IDCC)
NOFC = 1
ALLOCATE(MESHES(NM)%CUT_CELL(NMICC)%NOMICC(2,NOFC)); MESHES(NM)%CUT_CELL(NMICC)%NOMICC(1:2,1:NOFC) = 0
@@ -4991,7 +5295,7 @@ SUBROUTINE SNAP_GEOM_NODES
ENDDO AXIS_LOOP_1
ENDDO MAIN_GEOM_LOOP_1
-! Now Mesh loop on mesh + guard planes to test against
+! Now mesh loop on mesh + guard planes to test against.
! Main Loop over Meshes:
MAIN_MESH_LOOP : DO NM=1,NMESHES
@@ -5052,6 +5356,7 @@ SUBROUTINE SNAP_GEOM_NODES
CALL DEFINE_XYZFACE_CELL(ALLOC_FLG=.FALSE.)
ENDDO MAIN_MESH_LOOP
+
! Deallocate SNAP_NODE in geometries:
DO IG=1,N_GEOMETRY
DEALLOCATE(GEOMETRY(IG)%SNAP_NODE)
@@ -5067,6 +5372,127 @@ END SUBROUTINE SNAP_GEOM_NODES
END SUBROUTINE SET_CUTCELLS_3D
+SUBROUTINE ACCUMULATE_BLOCKING_BODTRI(BODTRI_FACE,FACE_AREA,COUNT,BODTRI_ACC,AREA_ACC)
+
+INTEGER, INTENT(IN) :: BODTRI_FACE(1:2)
+REAL(EB), INTENT(IN) :: FACE_AREA
+INTEGER, INTENT(INOUT) :: COUNT
+INTEGER, INTENT(INOUT), DIMENSION(:,:) :: BODTRI_ACC
+REAL(EB), INTENT(INOUT), DIMENSION(:) :: AREA_ACC
+INTEGER :: DUM
+
+IF (SIZE(BODTRI_ACC,DIM=1)<2 .OR. SIZE(AREA_ACC)<1) RETURN
+IF (BODTRI_FACE(1)<1 .OR. BODTRI_FACE(2)<1) RETURN
+DUM = 1
+DO DUM=1,COUNT
+ IF (ALL(BODTRI_ACC(1:2,DUM)==BODTRI_FACE(1:2))) EXIT
+ENDDO
+IF (DUM>COUNT) THEN
+ BODTRI_ACC(1:2,DUM) = BODTRI_FACE(1:2)
+ COUNT = DUM
+ENDIF
+AREA_ACC(DUM) = AREA_ACC(DUM) + MAX(FACE_AREA,0._EB)
+
+END SUBROUTINE ACCUMULATE_BLOCKING_BODTRI
+
+
+SUBROUTINE GET_BLOCKING_CUTCELL_DONOR(NM_LOC,ICC_LOC,JCC_LOC,IBOD_OUT,ITRI_OUT)
+
+INTEGER, INTENT(IN) :: NM_LOC,ICC_LOC,JCC_LOC
+INTEGER, INTENT(OUT) :: IBOD_OUT,ITRI_OUT
+INTEGER :: I_LOC,J_LOC,K_LOC,II,JJ,KK,ICC2,JCC2,IFC,IFACE,IFC1,JFC1,COUNT,COUNT_MAX,DUM
+INTEGER, ALLOCATABLE, DIMENSION(:,:) :: BODTRI_ACC
+REAL(EB), ALLOCATABLE, DIMENSION(:) :: AREA_ACC
+TYPE(MESH_TYPE), POINTER :: MT
+
+IBOD_OUT = 0
+ITRI_OUT = 0
+MT => MESHES(NM_LOC)
+IBOD_OUT = MT%CUT_CELL(ICC_LOC)%BODTRI_DONOR(1,JCC_LOC)
+ITRI_OUT = MT%CUT_CELL(ICC_LOC)%BODTRI_DONOR(2,JCC_LOC)
+IF (IBOD_OUT>0 .AND. ITRI_OUT>0) RETURN
+
+COUNT_MAX = MAX(1,MT%CUT_CELL(ICC_LOC)%CCELEM(1,JCC_LOC))
+ALLOCATE(BODTRI_ACC(1:2,COUNT_MAX+1),AREA_ACC(COUNT_MAX+1))
+BODTRI_ACC = 0; AREA_ACC = 0._EB;COUNT = 0
+DO IFC=1,MT%CUT_CELL(ICC_LOC)%CCELEM(1,JCC_LOC)
+ IFACE = MT%CUT_CELL(ICC_LOC)%CCELEM(IFC+1,JCC_LOC)
+ IF (MT%CUT_CELL(ICC_LOC)%FACE_LIST(1,IFACE)/=CC_FTYPE_CFINB) CYCLE
+ IFC1 = MT%CUT_CELL(ICC_LOC)%FACE_LIST(4,IFACE)
+ JFC1 = MT%CUT_CELL(ICC_LOC)%FACE_LIST(5,IFACE)
+ IF (IFC1<1 .OR. IFC1>MT%N_CUTFACE_MESH+MT%N_GCCUTFACE_MESH) CYCLE
+ IF (.NOT.ALLOCATED(MT%CUT_FACE(IFC1)%BODTRI)) CYCLE
+ IF (JFC1<1 .OR. JFC1>SIZE(MT%CUT_FACE(IFC1)%BODTRI,DIM=2)) CYCLE
+ CALL ACCUMULATE_BLOCKING_BODTRI(MT%CUT_FACE(IFC1)%BODTRI(1:2,JFC1),MT%CUT_FACE(IFC1)%AREA(JFC1), &
+ COUNT,BODTRI_ACC,AREA_ACC)
+ENDDO
+IF (COUNT<1) THEN
+ DEALLOCATE(BODTRI_ACC,AREA_ACC)
+ COUNT_MAX = 0
+ I_LOC = MT%CUT_CELL(ICC_LOC)%IJK(IAXIS)
+ J_LOC = MT%CUT_CELL(ICC_LOC)%IJK(JAXIS)
+ K_LOC = MT%CUT_CELL(ICC_LOC)%IJK(KAXIS)
+ DO KK=K_LOC-1,K_LOC+1
+ DO JJ=J_LOC-1,J_LOC+1
+ DO II=I_LOC-1,I_LOC+1
+ ICC2 = MT%CCVAR(II,JJ,KK,CC_IDCC); IF (ICC2<1) CYCLE
+ DO JCC2=1,MT%CUT_CELL(ICC2)%NCELL
+ COUNT_MAX = COUNT_MAX + MT%CUT_CELL(ICC2)%CCELEM(1,JCC2)
+ ENDDO
+ ENDDO
+ ENDDO
+ ENDDO
+ IF (COUNT_MAX<1) RETURN
+ ALLOCATE(BODTRI_ACC(1:2,COUNT_MAX+1),AREA_ACC(COUNT_MAX+1))
+ BODTRI_ACC = 0
+ AREA_ACC = 0._EB
+ COUNT = 0
+ DO KK=K_LOC-1,K_LOC+1
+ DO JJ=J_LOC-1,J_LOC+1
+ DO II=I_LOC-1,I_LOC+1
+ ICC2 = MT%CCVAR(II,JJ,KK,CC_IDCC); IF (ICC2<1) CYCLE
+ DO JCC2=1,MT%CUT_CELL(ICC2)%NCELL
+ DO IFC=1,MT%CUT_CELL(ICC2)%CCELEM(1,JCC2)
+ IFACE = MT%CUT_CELL(ICC2)%CCELEM(IFC+1,JCC2)
+ IF (MT%CUT_CELL(ICC2)%FACE_LIST(1,IFACE)/=CC_FTYPE_CFINB) CYCLE
+ IFC1 = MT%CUT_CELL(ICC2)%FACE_LIST(4,IFACE)
+ JFC1 = MT%CUT_CELL(ICC2)%FACE_LIST(5,IFACE)
+ IF (IFC1<1 .OR. IFC1>MT%N_CUTFACE_MESH+MT%N_GCCUTFACE_MESH) CYCLE
+ IF (.NOT.ALLOCATED(MT%CUT_FACE(IFC1)%BODTRI)) CYCLE
+ IF (JFC1<1 .OR. JFC1>SIZE(MT%CUT_FACE(IFC1)%BODTRI,DIM=2)) CYCLE
+ CALL ACCUMULATE_BLOCKING_BODTRI(MT%CUT_FACE(IFC1)%BODTRI(1:2,JFC1),MT%CUT_FACE(IFC1)%AREA(JFC1), &
+ COUNT,BODTRI_ACC,AREA_ACC)
+ ENDDO
+ ENDDO
+ ENDDO
+ ENDDO
+ ENDDO
+ENDIF
+IF (COUNT>0) THEN
+ DUM = MAXLOC(AREA_ACC(1:COUNT),DIM=1)
+ IBOD_OUT = BODTRI_ACC(1,DUM)
+ ITRI_OUT = BODTRI_ACC(2,DUM)
+ MT%CUT_CELL(ICC_LOC)%BODTRI_DONOR(1:2,JCC_LOC) = (/ IBOD_OUT, ITRI_OUT /)
+ENDIF
+IF (ALLOCATED(BODTRI_ACC)) DEALLOCATE(BODTRI_ACC)
+IF (ALLOCATED(AREA_ACC)) DEALLOCATE(AREA_ACC)
+
+END SUBROUTINE GET_BLOCKING_CUTCELL_DONOR
+
+
+LOGICAL FUNCTION VALID_GEOMETRY_FACE_DONOR(IBOD,IWSEL)
+
+INTEGER, INTENT(IN) :: IBOD,IWSEL
+
+VALID_GEOMETRY_FACE_DONOR = .FALSE.
+IF (.NOT.ALLOCATED(GEOMETRY)) RETURN
+IF (IBOD<1 .OR. IBOD>SIZE(GEOMETRY,DIM=1)) RETURN
+IF (.NOT.ALLOCATED(GEOMETRY(IBOD)%FACES_NORMAL)) RETURN
+IF (IWSEL<1 .OR. IWSEL>SIZE(GEOMETRY(IBOD)%FACES_NORMAL,DIM=2)) RETURN
+VALID_GEOMETRY_FACE_DONOR = .TRUE.
+
+END FUNCTION VALID_GEOMETRY_FACE_DONOR
+
! ----------------------- CHECK_WALL_CELL_PLANE_MATCH ----------------------------
SUBROUTINE CHECK_WALL_CELL_PLANE_MATCH
@@ -5131,7 +5557,7 @@ SUBROUTINE EXCHANGE_CC_NOADVANCE_INFO
USE MPI_F08
! Local Variables:
- INTEGER :: NM,NOM,N,IERR,I,J,K,ICC,JCC
+ INTEGER :: NM,NOM,N,IERR,I,J,K,ICC,JCC,IBOD_DONOR,ITRI_DONOR
TYPE(MESH_TYPE), POINTER :: M
TYPE (MPI_REQUEST), ALLOCATABLE, DIMENSION(:) :: REQ0,REQ0DUM
INTEGER :: N_REQ0
@@ -5144,28 +5570,52 @@ SUBROUTINE EXCHANGE_CC_NOADVANCE_INFO
! Count cut-cells for blocking in mesh:
M%N_CC_BLOCKED = 0
DO ICC=1,MESHES(NM)%N_CUTCELL_MESH
- CC => CUT_CELL(ICC)
+ CC => M%CUT_CELL(ICC)
DO JCC=1,CC%NCELL
IF(CC%NOADVANCE(JCC)>0) M%N_CC_BLOCKED = M%N_CC_BLOCKED + 1
ENDDO
ENDDO
+ ! Also count CC_SOLID interior cells in the outer 1-cell boundary band, so they get
+ ! projected to fine ghost cells at refinement interfaces.
+ DO K=1,M%KBAR
+ DO J=1,M%JBAR
+ DO I=1,M%IBAR
+ IF (M%CCVAR(I,J,K,CC_CGSC)/=CC_SOLID) CYCLE
+ IF (I>1 .AND. I1 .AND. J1 .AND. K0) THEN
IF(ALLOCATED(M%XYZ_CC_BLOCKED)) DEALLOCATE(M%XYZ_CC_BLOCKED)
IF(ALLOCATED(M%JBT_CC_BLOCKED)) DEALLOCATE(M%JBT_CC_BLOCKED)
ALLOCATE(M%XYZ_CC_BLOCKED(3,M%N_CC_BLOCKED))
- ALLOCATE(M%JBT_CC_BLOCKED(2,M%N_CC_BLOCKED))
+ ALLOCATE(M%JBT_CC_BLOCKED(4,M%N_CC_BLOCKED))
! Fill in blocked cut-cell info:
M%N_CC_BLOCKED = 0
DO ICC=1,MESHES(NM)%N_CUTCELL_MESH
- CC => CUT_CELL(ICC); I = CC%IJK(IAXIS); J = CC%IJK(JAXIS); K = CC%IJK(KAXIS)
+ CC => M%CUT_CELL(ICC); I = CC%IJK(IAXIS); J = CC%IJK(JAXIS); K = CC%IJK(KAXIS)
DO JCC=1,CC%NCELL
IF(CC%NOADVANCE(JCC)>0) THEN
M%N_CC_BLOCKED = M%N_CC_BLOCKED + 1
- M%XYZ_CC_BLOCKED(1:3,M%N_CC_BLOCKED) = (/XC(I),YC(J),ZC(K)/)
- M%JBT_CC_BLOCKED(1:2,M%N_CC_BLOCKED) = (/JCC,CC%NOADVANCE(JCC)/)
+ M%XYZ_CC_BLOCKED(1:3,M%N_CC_BLOCKED) = (/M%XC(I),M%YC(J),M%ZC(K)/)
+ CALL GET_BLOCKING_CUTCELL_DONOR(NM,ICC,JCC,IBOD_DONOR,ITRI_DONOR)
+ M%JBT_CC_BLOCKED(1:4,M%N_CC_BLOCKED) = (/JCC,CC%NOADVANCE(JCC),IBOD_DONOR,ITRI_DONOR/)
ENDIF
ENDDO
ENDDO
+ ! Fill in CC_SOLID boundary-band coarse cells so they project to fine ghost cells.
+ DO K=1,M%KBAR
+ DO J=1,M%JBAR
+ DO I=1,M%IBAR
+ IF (M%CCVAR(I,J,K,CC_CGSC)/=CC_SOLID) CYCLE
+ IF (I>1 .AND. I1 .AND. J1 .AND. K0) THEN
- ALLOCATE(BODTRI(2,COUNT+1),AREA(COUNT+1)); BODTRI=0; AREA=0._EB; COUNT = 0
- DO IFC=1,M%CUT_CELL(ICC)%CCELEM(1,JCC)
- IFACE = M%CUT_CELL(ICC)%CCELEM(IFC+1,JCC)
- IFC1 = M%CUT_CELL(ICC)%FACE_LIST(4,IFACE)
- JFC1 = M%CUT_CELL(ICC)%FACE_LIST(5,IFACE)
- IF (M%CUT_CELL(ICC)%FACE_LIST(1,IFACE) /= CC_FTYPE_CFINB) CYCLE
- DO DUM=1,COUNT
- IF( BODTRI(1,DUM)==M%CUT_FACE(IFC1)%BODTRI(1,JFC1) .AND. &
- BODTRI(2,DUM)==M%CUT_FACE(IFC1)%BODTRI(2,JFC1) ) EXIT
- ENDDO
- IF(DUM > COUNT) THEN ! No match in previous loop DUM=COUNT+1
- BODTRI(1:2,DUM)=M%CUT_FACE(IFC1)%BODTRI(1:2,JFC1)
- COUNT = DUM
- ENDIF
- AREA(DUM) = AREA(DUM) + M%CUT_FACE(IFC1)%AREA(JFC1)
- ENDDO
- IF (COUNT>0) THEN
- ! Now set IBOD, ITRI
- DUM = MAXLOC(AREA,DIM=1) ! BOD,TRI and SURF_ID with max area in cc being blocked.
- IBOD= BODTRI(1,DUM); ITRI= BODTRI(2,DUM)
- ENDIF
- DEALLOCATE(BODTRI,AREA)
-ELSE
- ! Look in surrounding cells:
- DO KK=K-1,K+1
- DO JJ=J-1,J+1
- DO II=I-1,I+1
- ICC2=M%CCVAR(II,JJ,KK,CC_IDCC)
- IF (ICC2>0) THEN
- DO JCC2=1,M%CUT_CELL(ICC2)%NCELL
- DO IFC=1,M%CUT_CELL(ICC2)%CCELEM(1,JCC2)
- IFACE = M%CUT_CELL(ICC2)%CCELEM(IFC+1,JCC2)
- IF (M%CUT_CELL(ICC2)%FACE_LIST(1,IFACE) == CC_FTYPE_CFINB) COUNT = COUNT + 1
- ENDDO
- ENDDO
- ENDIF
- ENDDO
- ENDDO
- ENDDO
- IF (COUNT>0) THEN
- ALLOCATE(BODTRI(2,COUNT+1),AREA(COUNT+1)); BODTRI=0; AREA=0._EB; COUNT = 0
- DO KK=K-1,K+1
- DO JJ=J-1,J+1
- DO II=I-1,I+1
- ICC2=M%CCVAR(II,JJ,KK,CC_IDCC)
- IF (ICC2>0) THEN
- DO JCC2=1,M%CUT_CELL(ICC2)%NCELL
- DO IFC=1,M%CUT_CELL(ICC2)%CCELEM(1,JCC2)
- IFACE = M%CUT_CELL(ICC2)%CCELEM(IFC+1,JCC2)
- IFC1 = M%CUT_CELL(ICC2)%FACE_LIST(4,IFACE)
- JFC1 = M%CUT_CELL(ICC2)%FACE_LIST(5,IFACE)
- IF (M%CUT_CELL(ICC2)%FACE_LIST(1,IFACE) /= CC_FTYPE_CFINB) CYCLE
- DO DUM=1,COUNT
- IF( BODTRI(1,DUM)==M%CUT_FACE(IFC1)%BODTRI(1,JFC1) .AND. &
- BODTRI(2,DUM)==M%CUT_FACE(IFC1)%BODTRI(2,JFC1) ) EXIT
- ENDDO
- IF(DUM > COUNT) THEN
- BODTRI(1:2,DUM)=M%CUT_FACE(IFC1)%BODTRI(1:2,JFC1)
- COUNT = DUM
- ENDIF
- AREA(DUM) = AREA(DUM) + M%CUT_FACE(IFC1)%AREA(JFC1)
- ENDDO
- ENDDO
- ENDIF
- ENDDO
- ENDDO
- ENDDO
- IF (COUNT>0) THEN
- ! Now set IBOD, ITRI
- DUM = MAXLOC(AREA,DIM=1) ! BOD,TRI and SURF_ID with max area in cc being blocked.
- IBOD= BODTRI(1,DUM); ITRI= BODTRI(2,DUM)
- ENDIF
- DEALLOCATE(BODTRI,AREA)
- ENDIF
-ENDIF
+CALL GET_BLOCKING_CUTCELL_DONOR(NM,ICC,JCC,IBOD,ITRI)
! For cut-cell ICC, JCC run through its boundary faces and generate new boundary EDGES, CUT-FACES and cells:
BLOCK_PHASE_IF : IF(BLOCK_PHASE==1) THEN
@@ -6895,7 +7263,8 @@ SUBROUTINE BLOCK_CUT_CELL(NM,ICC,JCC,BLOCK_PHASE)
! Scheme:
! 0. Add REG and CFGAS cut edges as INB cut edges for the normal faces where it corresponds:
DUM=0; IF(ALLOCATED(M%CUT_FACE(IFC1)%EDGE_LIST)) DUM=SIZE(M%CUT_FACE(IFC1)%EDGE_LIST,DIM=2)
- ALLOCATE(EDGE_LIST_AUX(3,DUM+M%CUT_FACE(IFCX)%CEDGES(1,JFCX)));
+ DUM2 = M%CUT_FACE(IFCX)%CEDGES(1,JFCX); IF(DUM2<0) DUM2 = 0
+ ALLOCATE(EDGE_LIST_AUX(3,DUM+DUM2));
EDGE_LIST_AUX = CC_UNDEFINED; EDGE_LIST_REG(1,:) = CC_ETYPE_CFINB ! Initialize EDGE_LIST addition.
IF(DUM>0) EDGE_LIST_AUX(1:3,1:DUM) = M%CUT_FACE(IFC1)%EDGE_LIST(1:3,1:DUM)
ALLOCATE(CEDGES_AUX(SIZE(M%CUT_FACE(IFC1)%CFELEM,DIM=1),SIZE(M%CUT_FACE(IFC1)%CFELEM,DIM=2)))
@@ -8198,6 +8567,9 @@ SUBROUTINE DROP_CUTFACE(NM,FTYPE,I,J,K,ILHF,X1AXIS,IFC,JFC)
ICC1 = CF%CELL_LIST(2,ILH,IND(DUM))
JCC1 = CF%CELL_LIST(3,ILH,IND(DUM))
IFC1 = CF%CELL_LIST(4,ILH,IND(DUM))
+ ! One side may have already been dropped to CC_SOLID (CELL_LIST entries set to
+ ! CC_UNDEFINED). Skip those entries safely; no cell exists on that side to reindex.
+ IF (ICC1<1 .OR. JCC1<1 .OR. IFC1<1) CYCLE
IFACE= M%CUT_CELL(ICC1)%CCELEM(IFC1+1,JCC1)
! Dropping gas-cut cells, do not reindex local JCF for INBOUNDARY faces. These have been changed already.
IF(FTYPE==CC_FTYPE_CFINB .OR. (FTYPE==CC_FTYPE_CFGAS .AND. M%CUT_CELL(ICC1)%FACE_LIST(1,IFACE)/=CC_FTYPE_CFINB)) &
@@ -8448,6 +8820,7 @@ SUBROUTINE GET_CELL_LINK_INFO(NM)
IFACE2 = CC%FACE_LIST(5,IFACE)
IBOD = M%CUT_FACE(IFC2)%BODTRI(1,IFACE2)
IWSEL = M%CUT_FACE(IFC2)%BODTRI(2,IFACE2)
+ IF (.NOT.VALID_GEOMETRY_FACE_DONOR(IBOD,IWSEL)) CYCLE
AF = M%CUT_FACE(IFC2)%AREA( IFACE2)
NRML(IAXIS:KAXIS) = NRML(IAXIS:KAXIS) + GEOMETRY(IBOD)%FACES_NORMAL(IAXIS:KAXIS,IWSEL)*AF
AREA = AREA + AF
@@ -8559,6 +8932,7 @@ SUBROUTINE GET_CELL_LINK_INFO(NM)
IFACE2 = CC%FACE_LIST(5,IFACE)
IBOD = M%CUT_FACE(IFC2)%BODTRI(1,IFACE2)
IWSEL = M%CUT_FACE(IFC2)%BODTRI(2,IFACE2)
+ IF (.NOT.VALID_GEOMETRY_FACE_DONOR(IBOD,IWSEL)) CYCLE
AF = M%CUT_FACE(IFC2)%AREA( IFACE2)
NRML(IAXIS:KAXIS) = NRML(IAXIS:KAXIS) + GEOMETRY(IBOD)%FACES_NORMAL(IAXIS:KAXIS,IWSEL)*AF
AREA = AREA + AF
@@ -9011,7 +9385,13 @@ SUBROUTINE INIT_CFACE_CELL(NM,ICF,IFACE,CFACE_INDEX,SURF_INDEX,STAGE_FLG,IS_INB,
ELSE
IBOD =CF%BODTRI(1,IFACE)
IWSEL=CF%BODTRI(2,IFACE)
- BC%NVEC(IAXIS:KAXIS) = GEOMETRY(IBOD)%FACES_NORMAL(IAXIS:KAXIS,IWSEL)
+ IF (VALID_GEOMETRY_FACE_DONOR(IBOD,IWSEL)) THEN
+ BC%NVEC(IAXIS:KAXIS) = GEOMETRY(IBOD)%FACES_NORMAL(IAXIS:KAXIS,IWSEL)
+ ELSEIF (NORM2(BC%NVEC)>TWENTY_EPSILON_EB) THEN
+ BC%NVEC(IAXIS:KAXIS) = BC%NVEC(IAXIS:KAXIS)/NORM2(BC%NVEC)
+ ELSE
+ BC%NVEC(IAXIS:KAXIS) = 0._EB
+ ENDIF
ENDIF
X1AXIS = MAXLOC(ABS(BC%NVEC(IAXIS:KAXIS)),DIM=1)
BC%IOR = INT(SIGN(1._EB,BC%NVEC(X1AXIS)))*X1AXIS
@@ -9071,24 +9451,26 @@ SUBROUTINE INIT_CFACE_CELL(NM,ICF,IFACE,CFACE_INDEX,SURF_INDEX,STAGE_FLG,IS_INB,
IF (SF%BACKING==EXPOSED .AND. SF%THERMAL_BC_INDEX==THERMALLY_THICK) THEN
IG = CF%BODTRI(1,IFACE)
TRI = CF%BODTRI(2,IFACE)
- XP(IAXIS:KAXIS) = (/ BC%X, BC%Y, BC%Z /) ! CFACE centroid location.
- RDIR(IAXIS:KAXIS)= - GEOMETRY(IG)%FACES_NORMAL(IAXIS:KAXIS,TRI) ! Normal into the body.
- TRI_LOOP : DO IWSEL=1,GEOMETRY(IG)%N_FACES
- IF (IWSEL==TRI) CYCLE
- WSELEM(NOD1:NOD3) = GEOMETRY(IG)%FACES(NODS_WSEL*(IWSEL-1)+1:NODS_WSEL*IWSEL)
- ! Triangles NODES coordinates:
- V1(IAXIS:KAXIS) = GEOMETRY(IG)%VERTS(MAX_DIM*(WSELEM(NOD1)-1)+1:MAX_DIM*WSELEM(NOD1))
- V2(IAXIS:KAXIS) = GEOMETRY(IG)%VERTS(MAX_DIM*(WSELEM(NOD2)-1)+1:MAX_DIM*WSELEM(NOD2))
- V3(IAXIS:KAXIS) = GEOMETRY(IG)%VERTS(MAX_DIM*(WSELEM(NOD3)-1)+1:MAX_DIM*WSELEM(NOD3))
-
- ! Fast triangle discard method: To do.
-
- ! Search for intersection point in POS(IAXIS:KAXIS):
- CALL RAY_TRIANGLE_INTERSECT_PT(V1,V2,V3,XP,RDIR,IS_INTERSECT,POS)
-
- IF (IS_INTERSECT) EXIT TRI_LOOP
-
- ENDDO TRI_LOOP
+ IF (VALID_GEOMETRY_FACE_DONOR(IG,TRI)) THEN
+ XP(IAXIS:KAXIS) = (/ BC%X, BC%Y, BC%Z /) ! CFACE centroid location.
+ RDIR(IAXIS:KAXIS)= - GEOMETRY(IG)%FACES_NORMAL(IAXIS:KAXIS,TRI) ! Normal into the body.
+ TRI_LOOP : DO IWSEL=1,GEOMETRY(IG)%N_FACES
+ IF (IWSEL==TRI) CYCLE
+ WSELEM(NOD1:NOD3) = GEOMETRY(IG)%FACES(NODS_WSEL*(IWSEL-1)+1:NODS_WSEL*IWSEL)
+ ! Triangles NODES coordinates:
+ V1(IAXIS:KAXIS) = GEOMETRY(IG)%VERTS(MAX_DIM*(WSELEM(NOD1)-1)+1:MAX_DIM*WSELEM(NOD1))
+ V2(IAXIS:KAXIS) = GEOMETRY(IG)%VERTS(MAX_DIM*(WSELEM(NOD2)-1)+1:MAX_DIM*WSELEM(NOD2))
+ V3(IAXIS:KAXIS) = GEOMETRY(IG)%VERTS(MAX_DIM*(WSELEM(NOD3)-1)+1:MAX_DIM*WSELEM(NOD3))
+
+ ! Search for intersection point in POS(IAXIS:KAXIS):
+ CALL RAY_TRIANGLE_INTERSECT_PT(V1,V2,V3,XP,RDIR,IS_INTERSECT,POS)
+
+ IF (IS_INTERSECT) EXIT TRI_LOOP
+
+ ENDDO TRI_LOOP
+ ELSE
+ IS_INTERSECT = .FALSE.
+ ENDIF
IF (IS_INTERSECT) THEN
@@ -19164,14 +19546,14 @@ SUBROUTINE GET_CARTCELL_CUTFACES(NM,ISTR,IEND,JSTR,JEND,KSTR,KEND,BNDINT_FLAG)
CYCLE
ENDIF
enddo
- IF (.NOT.INLIST) THEN
+ IF (.NOT.INLIST .AND. SEG_CELL(6,ISEG)>0 .AND. SEG_CELL(4,ISEG)>0) THEN
! Add first triang to list:
NBODTRI = NBODTRI + 1
BOD_TRI(1:2,NBODTRI) = SEG_CELL( (/ 6, 4 /) , ISEG)
ENDIF
! No second triangle associated:
- IF ( SEG_CELL(3,ISEG) < 2 ) CYCLE
+ IF ( SEG_CELL(3,ISEG) < 2 .OR. SEG_CELL(6,ISEG)<1 .OR. SEG_CELL(5,ISEG)<1 ) CYCLE
! Second triangle location
INLIST = .FALSE.
@@ -20373,7 +20755,7 @@ SUBROUTINE EAR_CLIP_CFACES(SIZE_CEELEM_SEG_CELL,NSEG,SEG_CELL,XYZVERT,&
ENDIF
IF(.NOT.FOUND_ISEG1) CYCLE
- TRI = 0
+ TRI = 0; BOD = 0
! Test if triangle given by ISEG ISEG+1 DIAG is valid.
! First, drop if Body not the same:
IF ( (COUNTEXT<3) .AND. (SEG_CELL2(6,ISEG)/=SEG_CELL2(6,ISEG1)) ) CYCLE
@@ -20407,7 +20789,7 @@ SUBROUTINE EAR_CLIP_CFACES(SIZE_CEELEM_SEG_CELL,NSEG,SEG_CELL,XYZVERT,&
ENDIF
ENDIF
- IF ( TRI == 0 ) THEN
+ IF ( BOD<1 .OR. TRI<1 ) THEN
CYCLE
ELSE ! Found two segments with matching triangle.
@@ -21499,6 +21881,7 @@ SUBROUTINE CUT_CELL_MOVE(CUT_CELL_FROM,CUT_CELL_TO)
CALL MOVE_ALLOC(FROM=CUT_CELL_FROM%DEL_RHO_D_DEL_Z_VOL ,TO=CUT_CELL_TO%DEL_RHO_D_DEL_Z_VOL)
CALL MOVE_ALLOC(FROM=CUT_CELL_FROM%U_DOT_DEL_RHO_Z_VOL ,TO=CUT_CELL_TO%U_DOT_DEL_RHO_Z_VOL)
CALL MOVE_ALLOC(FROM=CUT_CELL_FROM%NOADVANCE ,TO=CUT_CELL_TO%NOADVANCE)
+CALL MOVE_ALLOC(FROM=CUT_CELL_FROM%BODTRI_DONOR ,TO=CUT_CELL_TO%BODTRI_DONOR)
CALL MOVE_ALLOC(FROM=CUT_CELL_FROM%NOMICC ,TO=CUT_CELL_TO%NOMICC)
RETURN
@@ -21519,6 +21902,7 @@ SUBROUTINE CELL_DEALLOC(NM,ICC)
DEALLOCATE(MESHES(NM)%CUT_CELL(ICC)%IJK_LINK,MESHES(NM)%CUT_CELL(ICC)%LINK_LEV)
DEALLOCATE(MESHES(NM)%CUT_CELL(ICC)%VOLUME, MESHES(NM)%CUT_CELL(ICC)%XYZCEN)
DEALLOCATE(MESHES(NM)%CUT_CELL(ICC)%NOADVANCE,MESHES(NM)%CUT_CELL(ICC)%UNKZ)
+IF (ALLOCATED(MESHES(NM)%CUT_CELL(ICC)%BODTRI_DONOR)) DEALLOCATE(MESHES(NM)%CUT_CELL(ICC)%BODTRI_DONOR)
RETURN
@@ -21539,9 +21923,11 @@ SUBROUTINE NEW_CELL_ALLOC(NM,ICC,NCELL,NFACE_CELL,NCFACE_CUTCELL)
MESHES(NM)%CUT_CELL(ICC)%IJK_LINK = CC_UNDEFINED
MESHES(NM)%CUT_CELL(ICC)%LINK_LEV = 0 ! Root of link Hierarchy is zero.
-ALLOCATE(MESHES(NM)%CUT_CELL(ICC)%VOLUME(1:NCELL),MESHES(NM)%CUT_CELL(ICC)%NOADVANCE(1:NCELL))
+ALLOCATE(MESHES(NM)%CUT_CELL(ICC)%VOLUME(1:NCELL),MESHES(NM)%CUT_CELL(ICC)%NOADVANCE(1:NCELL), &
+ MESHES(NM)%CUT_CELL(ICC)%BODTRI_DONOR(1:2,1:NCELL))
MESHES(NM)%CUT_CELL(ICC)%VOLUME = 0._EB
MESHES(NM)%CUT_CELL(ICC)%NOADVANCE= NOT_BLOCKED
+MESHES(NM)%CUT_CELL(ICC)%BODTRI_DONOR = 0
ALLOCATE(MESHES(NM)%CUT_CELL(ICC)%XYZCEN(IAXIS:KAXIS,1:NCELL))
MESHES(NM)%CUT_CELL(ICC)%XYZCEN = 0._EB
diff --git a/Source/pres.f90 b/Source/pres.f90
index b62ceac18ed..3d992946834 100644
--- a/Source/pres.f90
+++ b/Source/pres.f90
@@ -2846,13 +2846,7 @@ SUBROUTINE ULMAT_H_MATRIX_SOLVER_SETUP(NM,IPZ)
MNUM = 1
! Set level MSG to 1 for factorization:
-IF (CHECK_POISSON) THEN
- MSGLVL = 1
- SELECT CASE(ULMAT_SOLVER_LIBRARY)
- CASE(MKL_PARDISO_FLAG); IF(MY_RANK==0) WRITE(LU_ERR,*) 'ULMAT : PARDISO factorization for MESH,ZONE=',NM,IPZ,ZM%NUNKH
- CASE(HYPRE_FLAG); IF(MY_RANK==0) WRITE(LU_ERR,*) 'HYPRE : Matrix and Solver setup for MESH,ZONE=',NM,IPZ,ZM%NUNKH
- END SELECT
-ENDIF
+IF (CHECK_POISSON) MSGLVL = 1
ERROR = 0 ! initialize error flag
! Each MPI process builds its local set of rows.
diff --git a/Source/type.f90 b/Source/type.f90
index 2cb52c57d0b..faab13ada22 100644
--- a/Source/type.f90
+++ b/Source/type.f90
@@ -1389,6 +1389,7 @@ MODULE TYPES
REAL(EB), ALLOCATABLE, DIMENSION(:,:) :: XYZCEN !< Cut-cell centroid locations. (IAXIS:KAXIS,1:NCELL)
INTEGER, ALLOCATABLE, DIMENSION(:) :: UNKZ !< Cut-cells unknown number for scalars.
INTEGER, ALLOCATABLE, DIMENSION(:) :: NOADVANCE !< Array to define if cut-cell should be blocked. (1:NCELL)
+ INTEGER, ALLOCATABLE, DIMENSION(:,:) :: BODTRI_DONOR !< Donor body/triangle for blocked-cell generated inboundary faces. (1:2,1:NCELL)
INTEGER :: N_NOMICC=0 !< Number of entries in NOMICC
INTEGER, ALLOCATABLE, DIMENSION(:,:) :: NOMICC !< OMESH cut-cells array. (1:2,1:N_NOMICC)
diff --git a/Utilities/Python/FDS_verification_dataplot_inputs.csv b/Utilities/Python/FDS_verification_dataplot_inputs.csv
index 2781c5706f3..b41f091d68c 100644
--- a/Utilities/Python/FDS_verification_dataplot_inputs.csv
+++ b/Utilities/Python/FDS_verification_dataplot_inputs.csv
@@ -9,10 +9,10 @@ d,adiabatic_net_flux,Heat_Transfer/adiabatic_net_flux_git.txt,Heat_Transfer/adia
d,adiabatic_surface_temperature,Radiation/adiabatic_surface_temperature_git.txt,Radiation/adiabatic_surface_temperature_devc.csv,2,3,Time,temp,Plate (temp),k-,0,100000,,100,120,-1.00E+09,1.00E+09,20,Radiation/adiabatic_surface_temperature_devc.csv,2,3,Time,AST,AST,k--,0,100000,,100,120,-1.00E+09,1.00E+09,20,Plate Temp vs AST (adiabatic_surface_temperature),Time (s),Temperature (°C),0,120,1,0,500,1,no,0.05 0.90,SouthEast,,1,linear,FDS_User_Guide/SCRIPT_FIGURES/adiabatic_surface_temperature,Relative Error,mean,0.01,Radiation,ro,r,TeX
d,adiabatic_surface_temperature,Radiation/adiabatic_surface_temperature_git.txt,Radiation/adiabatic_surface_temperature_devc.csv,2,3,Time,AST,AST,k-,0,100000,,100,120,-1.00E+09,1.00E+09,20,Radiation/adiabatic_surface_temperature_devc.csv,2,3,Time,AST-Gas,AST-Gas,k--,0,100000,,100,120,-1.00E+09,1.00E+09,20,Gas vs Solid AST (adiabatic_surface_temperature),Time (s),Temperature (°C),0,120,1,0,500,1,no,0.05 0.90,SouthEast,,1,linear,FDS_User_Guide/SCRIPT_FIGURES/adiabatic_surface_temperature_gas,Relative Error,mean,0.0001,Radiation,ro,r,TeX
d,adiabatic_surf_temp_spray,Sprinklers_and_Sprays/adiabatic_surf_temp_spray_git.txt,Sprinklers_and_Sprays/adiabatic_surf_temp_spray_devc.csv,2,3,Time,temp,Plate (temp),k-,0,100000,,0,100000,-1.00E+09,1.00E+09,20,Sprinklers_and_Sprays/adiabatic_surf_temp_spray_devc.csv,2,3,Time,AST,AST,k--,0,100000,,70,100,-1.00E+09,1.00E+09,20,Plate Temp vs AST \newline (adiabatic_surf_temp_spray),Time (s),Temperature (°C),0,150,1,0,400,1,no,0.05 0.90,East,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/adiabatic_surf_temp_spray,N/A,mean,0.01,Sprinklers and Sprays,rs,r,TeX
-d,aerosol_agglomeration,Aerosols/aerosol_agglomeration_git.txt,Aerosols/aerosol_agglomeration.csv,1,2,Time,Exact Total|Exact Bin 1,Exact Total|Exact Bin 1,ko|ro,0,60,,0,60,-1.00E+09,1.00E+09,0,Aerosols/aerosol_agglomeration_devc.csv,2,3,Time,FDS Total|FDS Bin 1,FDS Total|FDS Bin 1,k-|r-,0,60,,0,60,-1.00E+09,1.00E+09,0,(aerosol_agglomeration),Time (s),Mass Fraction (kg/kg),0,60,1,9.95E-06,1.01E-05,1,no,0.05 0.90,SouthWest,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/aerosol_agglomeration_bin1,Relative Error,end,0.02,Aerosols,kd,k,TeX
-d,aerosol_agglomeration,Aerosols/aerosol_agglomeration_git.txt,Aerosols/aerosol_agglomeration.csv,1,2,Time,Exact Bin 2,Exact Bin 2,ko,0,60,,0,60,-1.00E+09,1.00E+09,0,Aerosols/aerosol_agglomeration_devc.csv,2,3,Time,FDS Bin 2,FDS Bin 2,k-,0,60,,0,60,-1.00E+09,1.00E+09,0,(aerosol_agglomeration),Time (s),Mass Fraction (kg/kg),0,60,1,0.00E+00,1.50E-09,1,no,0.05 0.90,West,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/aerosol_agglomeration_bin2,Relative Error,end,0.02,Aerosols,kd,k,TeX
-d,aerosol_agglomeration,Aerosols/aerosol_agglomeration_2_git.txt,Aerosols/aerosol_agglomeration_2.csv,1,2,Time,Exact Total|Exact Bin 1,Exact Total|Exact Bin 1,ko|ro,0,60,,0,60,-1.00E+09,1.00E+09,0,Aerosols/aerosol_agglomeration_2_devc.csv,2,3,Time,FDS Total|FDS Bin 1,FDS Total|FDS Bin 1,k-|r-,0,60,,0,60,-1.00E+09,1.00E+09,0,(aerosol_agglomeration_2),Time (s),Mass Fraction (kg/kg),0,60,1,9.95E-06,1.01E-05,1,no,0.05 0.90,SouthWest,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/aerosol_agglomeration_2_bin1,Relative Error,end,0.02,Aerosols,kd,k,TeX
-d,aerosol_agglomeration,Aerosols/aerosol_agglomeration_2_git.txt,Aerosols/aerosol_agglomeration_2.csv,1,2,Time,Exact Bin 2,Exact Bin 2,ko,0,60,,0,60,-1.00E+09,1.00E+09,0,Aerosols/aerosol_agglomeration_2_devc.csv,2,3,Time,FDS Bin 2,FDS Bin 2,k-,0,60,,0,60,-1.00E+09,1.00E+09,0,(aerosol_agglomeration_2),Time (s),Mass Fraction (kg/kg),0,60,1,0.00E+00,2.00E-09,1,no,0.05 0.90,West,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/aerosol_agglomeration_2_bin2,Relative Error,end,0.02,Aerosols,kd,k,TeX
+d,aerosol_agglomeration,Aerosols/aerosol_agglomeration_git.txt,Aerosols/aerosol_agglomeration.csv,1,2,Time,Exact Total|Exact Bin 1,Exact Total|Exact Bin 1,ko|ro,0,60,,0,60,-1.00E+09,1.00E+09,0,Aerosols/aerosol_agglomeration_devc.csv,2,3,Time,FDS Total|FDS Bin 1,FDS Total|FDS Bin 1,k-|r-,0,60,,0,60,-1.00E+09,1.00E+09,0,(aerosol_agglomeration),Time (s),Mass Fraction (kg/kg),0,60,1,9.98E-06,1.02E-05,1,no,0.05 0.90,SouthWest,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/aerosol_agglomeration_bin1,Relative Error,end,0.02,Aerosols,kd,k,TeX
+d,aerosol_agglomeration,Aerosols/aerosol_agglomeration_git.txt,Aerosols/aerosol_agglomeration.csv,1,2,Time,Exact Bin 2,Exact Bin 2,ko,0,60,,0,60,-1.00E+09,1.00E+09,0,Aerosols/aerosol_agglomeration_devc.csv,2,3,Time,FDS Bin 2,FDS Bin 2,k-,0,60,,0,60,-1.00E+09,1.00E+09,0,(aerosol_agglomeration),Time (s),Mass Fraction (kg/kg),0,60,1,0.00E+00,2.50E-09,1,no,0.05 0.90,West,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/aerosol_agglomeration_bin2,Relative Error,end,0.02,Aerosols,kd,k,TeX
+d,aerosol_agglomeration,Aerosols/aerosol_agglomeration_2_git.txt,Aerosols/aerosol_agglomeration_2.csv,1,2,Time,Exact Total|Exact Bin 1,Exact Total|Exact Bin 1,ko|ro,0,60,,0,60,-1.00E+09,1.00E+09,0,Aerosols/aerosol_agglomeration_2_devc.csv,2,3,Time,FDS Total|FDS Bin 1,FDS Total|FDS Bin 1,k-|r-,0,60,,0,60,-1.00E+09,1.00E+09,0,(aerosol_agglomeration_2),Time (s),Mass Fraction (kg/kg),0,60,1,9.98E-06,1.02E-05,1,no,0.05 0.90,SouthWest,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/aerosol_agglomeration_2_bin1,Relative Error,end,0.02,Aerosols,kd,k,TeX
+d,aerosol_agglomeration,Aerosols/aerosol_agglomeration_2_git.txt,Aerosols/aerosol_agglomeration_2.csv,1,2,Time,Exact Bin 2,Exact Bin 2,ko,0,60,,0,60,-1.00E+09,1.00E+09,0,Aerosols/aerosol_agglomeration_2_devc.csv,2,3,Time,FDS Bin 2,FDS Bin 2,k-,0,60,,0,60,-1.00E+09,1.00E+09,0,(aerosol_agglomeration_2),Time (s),Mass Fraction (kg/kg),0,60,1,0.00E+00,2.50E-09,1,no,0.05 0.90,West,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/aerosol_agglomeration_2_bin2,Relative Error,end,0.02,Aerosols,kd,k,TeX
d,aerosol_gravitational_deposition,Aerosols/aerosol_gravitational_deposition_git.txt,Aerosols/aerosol_gravitational_deposition.csv,1,2,Time,Exact Gas 1|Exact Gas 2,Exact Gas 1|Exact Gas 2,ko|ro,0,1,,0.795,0.805,-1.00E+09,1.00E+09,0,Aerosols/aerosol_gravitational_deposition_devc.csv,2,3,Time,FDS Gas 1|FDS Gas 2,FDS Gas 1|FDS Gas 2,k-|r-,0,1,,0.795,0.805,-1.00E+09,1.00E+09,0,(aerosol_gravitational_deposition),Time (s),Mass Fraction (kg/kg),0,1,1,0,1.50E-05,1,no,0.05 0.90,West,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/aerosol_gravitational_deposition_gas,Relative Error,end,0.03,Aerosols,ro,r,TeX
d,aerosol_gravitational_deposition,Aerosols/aerosol_gravitational_deposition_git.txt,Aerosols/aerosol_gravitational_deposition.csv,1,2,Time,Exact Wall Top|Exact Wall Bottom,Exact Wall Top|Exact Wall Bottom,ko|ro,0,1,,0.795,0.805,-1.00E+09,1.00E+09,0,Aerosols/aerosol_gravitational_deposition_devc.csv,2,3,Time,FDS Wall Top|FDS Wall Bottom,FDS Wall Top|FDS Wall Bottom,k-|r-,0,1,,0.795,0.805,-1.00E+09,1.00E+09,0,(aerosol_gravitational_deposition),Time (s),Surface Density (kg/m²),0,1,1,0,8.00E-08,1,no,0.05 0.90,West,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/aerosol_gravitational_deposition_wall,Relative Error,end,0.02,Aerosols,ro,r,TeX
d,aerosol_gravitational_deposition,Aerosols/aerosol_gravitational_deposition_2_git.txt,Aerosols/aerosol_gravitational_deposition_2.csv,1,2,Time,Exact Gas 1|Exact Gas 2,Exact Gas 1|Exact Gas 2,ko|ro,0,1,,0.795,0.805,-1.00E+09,1.00E+09,0,Aerosols/aerosol_gravitational_deposition_2_devc.csv,2,3,Time,FDS Gas 1|FDS Gas 2,FDS Gas 1|FDS Gas 2,k-|r-,0,1,,0.795,0.805,-1.00E+09,1.00E+09,0,(aerosol_gravitational_deposition_2),Time (s),Mass Fraction (kg/kg),0,1,1,0,1.50E-05,1,no,0.05 0.90,West,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/aerosol_gravitational_deposition_2_gas,Relative Error,end,0.03,Aerosols,ro,r,TeX
@@ -105,7 +105,7 @@ d,condensation_evaporation,Species/condensation_1_git.txt,Species/condensation_1
d,condensation_evaporation,Species/condensation_1_git.txt,Species/condensation_1.csv,1,2,Time,pres,Analytical,ko,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species/condensation_1_devc.csv,2,3,Time,pres,FDS,k-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Pressure (condensation_1),Time (s),Pressure (kPa),0,0.01,1,-6000,0,1,no,0.05 0.90,NorthEast,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/condensation_1_P,Relative Error,end,0.02,Condensation,r^,r,TeX
d,condensation_evaporation,Species/condensation_2_git.txt,Species/condensation_2.csv,1,2,Time,temp,Analytical,ko,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species/condensation_2_devc.csv,2,3,Time,Temp,FDS,k-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Temperature (condensation_2),Time (s),Temperature (°C),0,10,1,0,40,1,no,0.05 0.90,SouthEast,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/condensation_2_T,Relative Error,end,0.02,Condensation,r^,r,TeX
d,condensation_evaporation,Species/condensation_2_git.txt,Species/condensation_2.csv,1,2,Time,pres,Analytical,ko,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species/condensation_2_devc.csv,2,3,Time,pres,FDS,k-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Pressure (condensation_2),Time (s),Pressure (kPa),0,10,1,0,25000,1,no,0.05 0.80,SouthEast,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/condensation_2_P,Relative Error,end,0.02,Condensation,r^,r,TeX
-d,condensation_radiation,Species/condensation_3_git.txt,Species/condensation_3_devc.csv,2,3,Time,PART,Analytical,ko,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species/condensation_3_devc.csv,2,3,Time,COND,FDS,k-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Radiative Heat Flux (condensation_3),Time (s),Radiative Flux (kW/m²),0,1.00E-05,1,0,30,1,no,0.05 0.80,SouthEast,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/condensation_3,Relative Error,end,0.01,Condensation,r^,r,TeX
+d,condensation_radiation,Species/condensation_3_git.txt,Species/condensation_3_devc.csv,2,3,Time,PART,Analytical,ko,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species/condensation_3_devc.csv,2,3,Time,COND,FDS,k-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Radiative Heat Flux (condensation_3),Time (s),Radiative Flux (kW/m²),0,1.00E-05,1,20,30,1,no,0.05 0.80,SouthEast,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/condensation_3,Relative Error,end,0.01,Condensation,r^,r,TeX
d,condensation_evaporation,Species/wall_cond_git.txt,Species/wall_cond.csv,1,2,Time,Tgas,Analytical,ko,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species/wall_cond_devc.csv,2,3,Time,Temp,FDS,k-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Temperature (wall_cond),Time (s),Temperature (°C),0,20000,1,0,100,1,no,0.05 0.90,SouthEast,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/wall_cond_T,Relative Error,end,0.05,Condensation,r^,r,TeX
d,condensation_evaporation,Species/wall_cond_git.txt,Species/wall_cond.csv,1,2,Time,dP,Analytical,ko,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species/wall_cond_devc.csv,2,3,Time,pres,FDS,k-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Pressure (wall_cond),Time (s),Pressure (Pa),0,20000,1,-25000,0,1,no,0.05 0.80,SouthEast,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/wall_cond_P,Relative Error,end,0.05,Condensation,r^,r,TeX
d,control_test_2,Controls/control_test_2_git.txt,Controls/control_test_2.csv,1,2,Time,Add|Multiply|Subtract|Divide|Power|PID,Add|Multiply|Subtract|Divide|Power|PID,ko|ro|bo|go|mo|co,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Controls/control_test_2_devc.csv,2,3,Time,CF Add|CF Multiply|CF Subtract|CF Divide|CF Power|CF PID,FDS Add|FDS Multiply|FDS Subtract|FDS Divide|FDS Power|FDS PID,k-|r-|b-|g-|m-|c-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Control Function Outputs (control_test_2),Time (s),Control Function Output,0,10,1,-15,40,1,no,0.05 0.90,EastOutside,,1.35,linear,FDS_User_Guide/SCRIPT_FIGURES/control_test_2,Relative Error,end,0.01,Controls,kd,k,TeX
@@ -205,7 +205,7 @@ d,energy_budget_adiabatic_walls,Energy_Budget/energy_budget_adiabatic_walls_git.
d,energy_budget_adiabatic_two_fuels,Energy_Budget/energy_budget_adiabatic_two_fuels_git.txt,Energy_Budget/energy_budget_adiabatic_two_fuels.csv,1,2,Time,HRR,Expected (HRR),ko,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Energy_Budget/energy_budget_adiabatic_two_fuels_hrr.csv,2,3,Time,HRR,FDS (HRR),k-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Energy Budget (two fuels),Time (s),Energy Rate (kW),0,600,1,0,1500,1,no,0.05 0.90,SouthEast,,1,linear,FDS_User_Guide/SCRIPT_FIGURES/energy_budget_adiabatic_two_fuels,Absolute Error,end,12,Energy Budget,kd,k,TeX
d,energy_budget_cold_walls,Energy_Budget/energy_budget_cold_walls_git.txt,Energy_Budget/energy_budget_cold_walls.csv,1,2,Time,HRR|Net Enthalpy Change|Losses,Expected (HRR)|Expected (Net Enthalpy)|Expected (Losses),ko|ro|bo,0,100000,,250,300,-1.00E+09,1.00E+09,0,Energy_Budget/energy_budget_cold_walls_hrr.csv,2,3,Time,HRR|Q_TOTAL|Q_RADI+Q_CONV+Q_COND+Q_DIFF,FDS (HRR)|FDS (Q_TOTAL)|FDS (Sum of Losses),k-|r-|b-,0,100000,,250,300,-1.00E+09,1.00E+09,0,Energy Budget (cold walls),Time (s),Energy Rate (kW),0,300,1,-1500,2000,1,no,0.05 0.90,EastOutside,,1.35,linear,FDS_Verification_Guide/SCRIPT_FIGURES/energy_budget_cold_walls,Absolute Error,mean,20,Energy Budget,kd,k,TeX
d,energy_budget_combustion,Energy_Budget/energy_budget_combustion_git.txt,Energy_Budget/energy_budget_combustion_devc.csv,2,3,Time,dp,Pressure Rise (kPa),k-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Energy_Budget/energy_budget_combustion_devc.csv,2,3,Time,dh,Enthalpy Rise (kJ),k--,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Energy Budget (combustion),Time (s),Energy (kJ),0,0.001,1,0,500,1,no,0.05 0.90,South,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/energy_budget_combustion,Relative Error,end,0.05,Energy Budget,kd,k,TeX
-d,energy_budget_dns_100,Energy_Budget/energy_budget_dns_100_git.txt,Energy_Budget/energy_budget_dns.csv,1,2,Time,div,Expected (div),ko,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Energy_Budget/energy_budget_dns_100_devc.csv,2,3,Time,div,FDS (div),k-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Energy Budget (dns),Time (s),Net Volume Flow (m³/s),0,2,1,-1.50E-08,0.00E+00,1,no,0.05 0.90,East,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/energy_budget_dns_div,Relative Error,end,0.01,Energy Budget,kd,k,TeX
+d,energy_budget_dns_100,Energy_Budget/energy_budget_dns_100_git.txt,Energy_Budget/energy_budget_dns.csv,1,2,Time,div,Expected (div),ko,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Energy_Budget/energy_budget_dns_100_devc.csv,2,3,Time,div,FDS (div),k-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Energy Budget (dns),Time (s),Net Volume Flow (m³/s),0,2,1,-1.50E-05,0.00E+00,1,no,0.05 0.90,East,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/energy_budget_dns_div,Relative Error,end,0.01,Energy Budget,kd,k,TeX
d,energy_budget_particles,Energy_Budget/energy_budget_particles_git.txt,Energy_Budget/energy_budget_particles_hrr.csv,2,3,Time,Q_ENTH,Q_ENTH,k-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Energy_Budget/energy_budget_particles_hrr.csv,2,3,Time,Q_TOTAL,Q_TOTAL,k--,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Energy Budget (particles),Time (s),Energy Rate (kW),0,300,1,-2,1,1,no,0.05 0.90,SouthEast,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/energy_budget_particles_total,Relative Error,area,0.01,Energy Budget,kd,k,TeX
d,energy_budget_particles,Energy_Budget/energy_budget_particles_git.txt,Energy_Budget/energy_budget_particles_hrr.csv,2,3,Time,Q_RADI|Q_COND,Q_RADI|Q_COND,k-|r-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Energy_Budget/energy_budget_particles_hrr.csv,2,3,Time,Q_PRES|Q_PART,Q_PRES|Q_PART,|g-|m-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Energy Budget (particles),Time (s),Energy Rate (kW),0,300,1,-2,1,1,no,0.05 0.90,SouthEast,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/energy_budget_particles,N/A,area,0,Energy Budget,kd,k,TeX
d,energy_budget_tmix,Energy_Budget/energy_budget_tmix_git.txt,Energy_Budget/energy_budget_tmix.csv,1,2,Time,Temp,Expected (temp),ko,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Energy_Budget/energy_budget_tmix_devc.csv,2,3,Time,Temp,FDS (Temp),k-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Energy Budget (tmix),Time (s),Outlet Temperature (°C),0,20,1,0.00E+00,5.00E+02,1,no,0.05 0.90,East,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/energy_budget_tmix,Relative Error,end,0.01,Energy Budget,kd,k,TeX