From f2a372abba91d2f873378975e7829de3e01efb48 Mon Sep 17 00:00:00 2001
From: Jean-Paul Pelteret
Date: Thu, 20 Aug 2015 15:29:48 +0200
Subject: [PATCH] Direct support for Abaqus mesh files in GridIn.
The mesh_converter program is now considered obsolete and has been
removed from the contrib folder.
Direct support for Abaqus mesh files has been added to the GridIn
class through the function GridIn::read_abaqus(). An internal class
Abaqus_to_UCD captures all of the functionality of the original
mesh_converter program and feeds its output directly to the
already implemented GridIn::read_ucd() function. This is suboptimal
but works sufficiently well to act as an interim solution until the
internal renumbering scheme necessary to convert the Abaqus format
directly to deal.II's internal number can be determined.
On top of the already existing functionality to read in Abaqus meshes
created using Cubit, patches provided by Krzysztof Bzowski that allow
for the input of mesh files exported directly from Abaqus have also
been included.
Test cases have been added to the testsuite, with the original
mesh files from the mesh_converter program used for this purpose.
---
cmake/setup_cached_variables.cmake | 8 +-
cmake/setup_custom_targets.cmake | 4 +-
contrib/CMakeLists.txt | 6 -
contrib/mesh_conversion/CMakeLists.txt | 43 -
contrib/mesh_conversion/Main.cc | 74 --
contrib/mesh_conversion/MeshConversion.cc | 520 --------
contrib/mesh_conversion/MeshConversion.h | 60 -
contrib/mesh_conversion/README.txt | 66 -
contrib/mesh_conversion/gpl-2.0.txt | 339 -----
.../mesh_conversion/mesh/3d/other_simple.ucd | 13 -
.../mesh/3d/test_cube_pave_1.ucd | 91 --
.../mesh/3d/test_cube_two_materials.ucd | 63 -
contrib/mesh_conversion/test.sh | 48 -
doc/news/changes.h | 13 +
doc/readme.html | 8 -
doc/users/cmake.html | 20 +-
doc/users/config.sample | 4 -
include/deal.II/grid/grid_in.h | 73 +-
source/grid/grid_in.cc | 584 ++++++++-
tests/CMakeLists.txt | 4 +-
tests/grid/grid_in_abaqus_01.cc | 111 ++
tests/grid/grid_in_abaqus_01.output | 31 +
.../grid/grids/abaqus/2d/2d_quad.cub | Bin
.../grid/grids/abaqus/2d/2d_quad.inp | 0
.../grid/grids/abaqus}/2d/2d_test.cub | Bin
.../grid/grids/abaqus}/2d/2d_test.inp | 0
tests/grid/grids/abaqus/2d/2d_test_abaqus.cae | Bin 0 -> 94208 bytes
tests/grid/grids/abaqus/2d/2d_test_abaqus.inp | 232 ++++
tests/grid/grids/abaqus/2d/2d_test_pave.cub | Bin 0 -> 32726 bytes
tests/grid/grids/abaqus/2d/2d_test_pave.inp | 388 ++++++
.../grid/grids/abaqus/3d/3d_CC.cub | Bin
.../grid/grids/abaqus/3d/3d_CC_cubit_new.inp | 0
.../grid/grids/abaqus/3d/3d_CC_cubit_old.inp | 0
.../grid/grids/abaqus/3d/3d_other_simple.inp | 0
tests/grid/grids/abaqus/3d/3d_test_abaqus.cae | Bin 0 -> 81920 bytes
tests/grid/grids/abaqus/3d/3d_test_abaqus.inp | 1049 ++++++++++++++++
.../grid/grids/abaqus/3d/3d_test_cube_1.cub | Bin
.../grid/grids/abaqus/3d/3d_test_cube_1.inp | 0
.../grids/abaqus/3d/3d_test_cube_pave_1.cub | Bin
.../grids/abaqus/3d/3d_test_cube_pave_1.inp | 0
.../abaqus/3d/3d_test_cube_two_materials.cub | Bin
.../abaqus/3d/3d_test_cube_two_materials.inp | 0
.../grid/grids/ucd/2d/2d_quad.ucd | 2 +-
.../grid/grids/ucd}/2d/2d_test.ucd | 0
tests/grid/grids/ucd/2d/2d_test_abaqus.ucd | 200 +++
tests/grid/grids/ucd/2d/2d_test_pave.ucd | 341 +++++
.../grid/grids/ucd/3d/3d_CC_cubit_new.ucd | 2 +-
.../grid/grids/ucd/3d/3d_CC_cubit_old.ucd | 2 +-
.../grids/ucd/3d/3d_other_simple.ucd} | 2 +-
tests/grid/grids/ucd/3d/3d_test_abaqus.ucd | 1105 +++++++++++++++++
.../grid/grids/ucd/3d/3d_test_cube_1.ucd | 2 +-
.../grids/ucd/3d/3d_test_cube_pave_1.ucd} | 2 +-
.../ucd/3d/3d_test_cube_two_materials.ucd} | 2 +-
tests/mesh_converter/CMakeLists.txt | 116 --
tests/mesh_converter/meshes/2d/2d_test.cub | Bin 22952 -> 0 bytes
tests/mesh_converter/meshes/2d/2d_test.inp | 252 ----
tests/mesh_converter/meshes/2d/2d_test.ucd | 251 ----
tests/mesh_converter/meshes/2d/quad.cub | Bin 14372 -> 0 bytes
tests/mesh_converter/meshes/2d/quad.inp | 29 -
tests/mesh_converter/meshes/2d/quad.ucd | 25 -
tests/mesh_converter/meshes/3d/CC.cub | Bin 51528 -> 0 bytes
.../mesh_converter/meshes/3d/CC_cubit_new.inp | 157 ---
.../mesh_converter/meshes/3d/CC_cubit_new.ucd | 106 --
.../mesh_converter/meshes/3d/CC_cubit_old.inp | 113 --
.../mesh_converter/meshes/3d/CC_cubit_old.ucd | 106 --
.../mesh_converter/meshes/3d/other_simple.inp | 17 -
.../mesh_converter/meshes/3d/test_cube_1.cub | Bin 25385 -> 0 bytes
.../mesh_converter/meshes/3d/test_cube_1.inp | 25 -
.../mesh_converter/meshes/3d/test_cube_1.ucd | 19 -
.../meshes/3d/test_cube_pave_1.cub | Bin 29571 -> 0 bytes
.../meshes/3d/test_cube_pave_1.inp | 97 --
.../meshes/3d/test_cube_two_materials.cub | Bin 27699 -> 0 bytes
.../meshes/3d/test_cube_two_materials.inp | 67 -
tests/mesh_converter/meshes/README.txt | 66 -
tests/run_testsuite.cmake | 2 +-
75 files changed, 4115 insertions(+), 2845 deletions(-)
delete mode 100644 contrib/mesh_conversion/CMakeLists.txt
delete mode 100644 contrib/mesh_conversion/Main.cc
delete mode 100644 contrib/mesh_conversion/MeshConversion.cc
delete mode 100644 contrib/mesh_conversion/MeshConversion.h
delete mode 100644 contrib/mesh_conversion/README.txt
delete mode 100644 contrib/mesh_conversion/gpl-2.0.txt
delete mode 100644 contrib/mesh_conversion/mesh/3d/other_simple.ucd
delete mode 100644 contrib/mesh_conversion/mesh/3d/test_cube_pave_1.ucd
delete mode 100644 contrib/mesh_conversion/mesh/3d/test_cube_two_materials.ucd
delete mode 100755 contrib/mesh_conversion/test.sh
create mode 100644 tests/grid/grid_in_abaqus_01.cc
create mode 100644 tests/grid/grid_in_abaqus_01.output
rename contrib/mesh_conversion/mesh/2d/quad.cub => tests/grid/grids/abaqus/2d/2d_quad.cub (100%)
rename contrib/mesh_conversion/mesh/2d/quad.inp => tests/grid/grids/abaqus/2d/2d_quad.inp (100%)
rename {contrib/mesh_conversion/mesh => tests/grid/grids/abaqus}/2d/2d_test.cub (100%)
rename {contrib/mesh_conversion/mesh => tests/grid/grids/abaqus}/2d/2d_test.inp (100%)
create mode 100755 tests/grid/grids/abaqus/2d/2d_test_abaqus.cae
create mode 100755 tests/grid/grids/abaqus/2d/2d_test_abaqus.inp
create mode 100644 tests/grid/grids/abaqus/2d/2d_test_pave.cub
create mode 100644 tests/grid/grids/abaqus/2d/2d_test_pave.inp
rename contrib/mesh_conversion/mesh/3d/CC.cub => tests/grid/grids/abaqus/3d/3d_CC.cub (100%)
rename contrib/mesh_conversion/mesh/3d/CC_cubit_new.inp => tests/grid/grids/abaqus/3d/3d_CC_cubit_new.inp (100%)
rename contrib/mesh_conversion/mesh/3d/CC_cubit_old.inp => tests/grid/grids/abaqus/3d/3d_CC_cubit_old.inp (100%)
rename contrib/mesh_conversion/mesh/3d/other_simple.inp => tests/grid/grids/abaqus/3d/3d_other_simple.inp (100%)
create mode 100755 tests/grid/grids/abaqus/3d/3d_test_abaqus.cae
create mode 100755 tests/grid/grids/abaqus/3d/3d_test_abaqus.inp
rename contrib/mesh_conversion/mesh/3d/test_cube_1.cub => tests/grid/grids/abaqus/3d/3d_test_cube_1.cub (100%)
rename contrib/mesh_conversion/mesh/3d/test_cube_1.inp => tests/grid/grids/abaqus/3d/3d_test_cube_1.inp (100%)
rename contrib/mesh_conversion/mesh/3d/test_cube_pave_1.cub => tests/grid/grids/abaqus/3d/3d_test_cube_pave_1.cub (100%)
rename contrib/mesh_conversion/mesh/3d/test_cube_pave_1.inp => tests/grid/grids/abaqus/3d/3d_test_cube_pave_1.inp (100%)
rename contrib/mesh_conversion/mesh/3d/test_cube_two_materials.cub => tests/grid/grids/abaqus/3d/3d_test_cube_two_materials.cub (100%)
rename contrib/mesh_conversion/mesh/3d/test_cube_two_materials.inp => tests/grid/grids/abaqus/3d/3d_test_cube_two_materials.inp (100%)
rename contrib/mesh_conversion/mesh/2d/quad.ucd => tests/grid/grids/ucd/2d/2d_quad.ucd (94%)
rename {contrib/mesh_conversion/mesh => tests/grid/grids/ucd}/2d/2d_test.ucd (100%)
create mode 100755 tests/grid/grids/ucd/2d/2d_test_abaqus.ucd
create mode 100644 tests/grid/grids/ucd/2d/2d_test_pave.ucd
rename contrib/mesh_conversion/mesh/3d/CC_cubit_new.ucd => tests/grid/grids/ucd/3d/3d_CC_cubit_new.ucd (98%)
rename contrib/mesh_conversion/mesh/3d/CC_cubit_old.ucd => tests/grid/grids/ucd/3d/3d_CC_cubit_old.ucd (98%)
rename tests/{mesh_converter/meshes/3d/other_simple.ucd => grid/grids/ucd/3d/3d_other_simple.ucd} (91%)
create mode 100755 tests/grid/grids/ucd/3d/3d_test_abaqus.ucd
rename contrib/mesh_conversion/mesh/3d/test_cube_1.ucd => tests/grid/grids/ucd/3d/3d_test_cube_1.ucd (93%)
rename tests/{mesh_converter/meshes/3d/test_cube_pave_1.ucd => grid/grids/ucd/3d/3d_test_cube_pave_1.ucd} (98%)
rename tests/{mesh_converter/meshes/3d/test_cube_two_materials.ucd => grid/grids/ucd/3d/3d_test_cube_two_materials.ucd} (97%)
delete mode 100644 tests/mesh_converter/CMakeLists.txt
delete mode 100644 tests/mesh_converter/meshes/2d/2d_test.cub
delete mode 100644 tests/mesh_converter/meshes/2d/2d_test.inp
delete mode 100644 tests/mesh_converter/meshes/2d/2d_test.ucd
delete mode 100644 tests/mesh_converter/meshes/2d/quad.cub
delete mode 100644 tests/mesh_converter/meshes/2d/quad.inp
delete mode 100644 tests/mesh_converter/meshes/2d/quad.ucd
delete mode 100644 tests/mesh_converter/meshes/3d/CC.cub
delete mode 100644 tests/mesh_converter/meshes/3d/CC_cubit_new.inp
delete mode 100644 tests/mesh_converter/meshes/3d/CC_cubit_new.ucd
delete mode 100644 tests/mesh_converter/meshes/3d/CC_cubit_old.inp
delete mode 100644 tests/mesh_converter/meshes/3d/CC_cubit_old.ucd
delete mode 100644 tests/mesh_converter/meshes/3d/other_simple.inp
delete mode 100644 tests/mesh_converter/meshes/3d/test_cube_1.cub
delete mode 100644 tests/mesh_converter/meshes/3d/test_cube_1.inp
delete mode 100644 tests/mesh_converter/meshes/3d/test_cube_1.ucd
delete mode 100644 tests/mesh_converter/meshes/3d/test_cube_pave_1.cub
delete mode 100644 tests/mesh_converter/meshes/3d/test_cube_pave_1.inp
delete mode 100644 tests/mesh_converter/meshes/3d/test_cube_two_materials.cub
delete mode 100644 tests/mesh_converter/meshes/3d/test_cube_two_materials.inp
delete mode 100644 tests/mesh_converter/meshes/README.txt
diff --git a/cmake/setup_cached_variables.cmake b/cmake/setup_cached_variables.cmake
index 262a995a62..1520d56664 100644
--- a/cmake/setup_cached_variables.cmake
+++ b/cmake/setup_cached_variables.cmake
@@ -24,7 +24,6 @@
# DEAL_II_ALLOW_BUNDLED
# DEAL_II_COMPONENT_DOCUMENTATION
# DEAL_II_COMPONENT_EXAMPLES
-# DEAL_II_COMPONENT_MESH_CONVERTER
# DEAL_II_COMPONENT_PARAMETER_GUI
# DEAL_II_COMPONENT_PACKAGE
# DEAL_II_FORCE_AUTODETECTION
@@ -84,11 +83,6 @@ OPTION(DEAL_II_COMPONENT_EXAMPLES
ON
)
-OPTION(DEAL_II_COMPONENT_MESH_CONVERTER
- "Build and install the mesh_converter. This adds a COMPONENT \"mesh_converter\" to the build system."
- ON
- )
-
OPTION(DEAL_II_COMPONENT_PARAMETER_GUI
"Build and install the parameter_gui. This adds a COMPONENT \"parameter_gui\" to the build system."
OFF
@@ -384,7 +378,7 @@ FOREACH(_var ${_res})
#
# Same for components:
#
- IF(_var MATCHES "^(DOCUMENTATION|EXAMPLES|MESH_CONVERTER|PACKAGE|PARAMETER_GUI)")
+ IF(_var MATCHES "^(DOCUMENTATION|EXAMPLES|PACKAGE|PARAMETER_GUI)")
SET(DEAL_II_COMPONENT_${_var} ${${_var}} CACHE BOOL "" FORCE)
UNSET(${_var} CACHE)
ENDIF()
diff --git a/cmake/setup_custom_targets.cmake b/cmake/setup_custom_targets.cmake
index 0cd0494479..38daa74e50 100644
--- a/cmake/setup_custom_targets.cmake
+++ b/cmake/setup_custom_targets.cmake
@@ -20,7 +20,6 @@
# compat_files
# documentation
# examples
-# mesh_converter
# parameter_gui
#
@@ -55,7 +54,7 @@ ENDIF()
# The library can always be compiled and/or installed unconditionally ;-)
_add_custom_target(library)
-FOREACH(_component compat_files documentation examples mesh_converter parameter_gui)
+FOREACH(_component compat_files documentation examples parameter_gui)
STRING(TOUPPER "${_component}" _component_uppercase)
IF(DEAL_II_COMPONENT_${_component_uppercase})
_add_custom_target(${_component})
@@ -121,7 +120,6 @@ FILE(WRITE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/print_info.cmake
# documentation - ${_description_string} component 'documentation'
# examples - ${_description_string} component 'examples'
# library - ${_description_string} component 'library'
-# mesh_converter - ${_description_string} component 'mesh_converter'
# parameter_gui - ${_description_string} component 'parameter_gui'
# package - build binary package
#
diff --git a/contrib/CMakeLists.txt b/contrib/CMakeLists.txt
index 30fc5c517c..61c5dd2497 100644
--- a/contrib/CMakeLists.txt
+++ b/contrib/CMakeLists.txt
@@ -13,12 +13,6 @@
##
## ---------------------------------------------------------------------
-IF(DEAL_II_COMPONENT_MESH_CONVERTER)
- MESSAGE(STATUS "Setting up mesh_converter")
- ADD_SUBDIRECTORY(mesh_conversion)
- MESSAGE(STATUS "Setting up mesh_converter - Done")
-ENDIF()
-
IF(DEAL_II_COMPONENT_PARAMETER_GUI)
MESSAGE(STATUS "Setting up parameter_gui")
ADD_SUBDIRECTORY(parameter_gui)
diff --git a/contrib/mesh_conversion/CMakeLists.txt b/contrib/mesh_conversion/CMakeLists.txt
deleted file mode 100644
index ed922bfd10..0000000000
--- a/contrib/mesh_conversion/CMakeLists.txt
+++ /dev/null
@@ -1,43 +0,0 @@
-## ---------------------------------------------------------------------
-##
-## Copyright (C) 2012 - 2014 by the deal.II authors
-##
-## This file is part of the deal.II library.
-##
-## The deal.II library is free software; you can use it, redistribute
-## it, and/or modify it under the terms of the GNU Lesser General
-## Public License as published by the Free Software Foundation; either
-## version 2.1 of the License, or (at your option) any later version.
-## The full text of the license can be found in the file LICENSE at
-## the top level of the deal.II distribution.
-##
-## ---------------------------------------------------------------------
-
-CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
-#PROJECT(mesh_converter)
-
-IF("${DEAL_II_EXECUTABLE_RELDIR}" STREQUAL "")
- SET(DEAL_II_EXECUTABLE_RELDIR "bin")
-ENDIF()
-
-ADD_EXECUTABLE(mesh_converter_exe
- Main.cc
- MeshConversion.cc
- )
-SET_TARGET_PROPERTIES(mesh_converter_exe
- PROPERTIES
- OUTPUT_NAME mesh_converter
- RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${DEAL_II_EXECUTABLE_RELDIR}"
- )
-
-ADD_DEPENDENCIES(mesh_converter mesh_converter_exe)
-
-INSTALL(TARGETS mesh_converter_exe
- RUNTIME DESTINATION ${DEAL_II_EXECUTABLE_RELDIR}
- COMPONENT mesh_converter
- )
-EXPORT(TARGETS mesh_converter_exe
- FILE
- ${CMAKE_BINARY_DIR}/${DEAL_II_PROJECT_CONFIG_RELDIR}/${DEAL_II_PROJECT_CONFIG_NAME}Targets.cmake
- APPEND
- )
diff --git a/contrib/mesh_conversion/Main.cc b/contrib/mesh_conversion/Main.cc
deleted file mode 100644
index 9403bf996c..0000000000
--- a/contrib/mesh_conversion/Main.cc
+++ /dev/null
@@ -1,74 +0,0 @@
-// ======================================================
-// MESH CONVERSION TOOL
-//
-// This program is distributed under the terms of the
-// GNU GPL v2.0 license.
-//
-// Author: Jean-Paul Pelteret
-// jppelteret.uct@gmail.com
-// modified by: Timo Heister, heister@clemson.edu
-// ======================================================
-
-#include "MeshConversion.h"
-#include
-#include
-
-using namespace std;
-
-//--------------------------------------------------------------------------------
-
-void display_help (void) {
- std::cout << "The first input argument is the spatial dimension of the input file, "
- << std::endl
- << "the second is the path to the read-in Abaqus .inp file, "
- << std::endl
- << "and the third is the name of the file to which you wish to write the output AVS .ucd file to."
- << std::endl
- << std::endl
- << "Correct program usage is: "
- << std::endl
- << " './convert_mesh /path/to/input_file.inp /path/to/output_file.ucd'"
- << std::endl
- << "e.g. './convert_mesh 3 mesh/3d/test_in.inp mesh/3d/test_out.ucd'"
- << std::endl
- << "NOTE: New Abaqus files outputted by Cubit 12.0 and later MUST be generated with the 'NOT CUBIT ID's' option selected. "
- << std::endl;
-}
-
-int main (int argc, char* argv[]) {
- if (argc != 4)
- {
- display_help();
- return 0;
- }
-
- try
- {
- const unsigned int dimension = atoi (argv[1]);
- std::cout << "Dimension: " << dimension << std::endl;
- std::string input_file = argv[2];
- std::string output_file = argv[3];
-
- MeshConversion mesh (dimension, input_file, output_file);
- const bool success = mesh.convert_mesh ();
-
- if (success == false) {
- std::cout << "Something has gone wrong with the conversion..." << std::endl;
- display_help();
- }
- }
-
- catch (...)
- {
- std::cerr << std::endl
- << "==============" << std::endl;
- std::cerr << "UNKNOWN ERROR!" << std::endl
- << "==============" << std::endl;
-
- return 1;
- }
-
- return 0;
-}
-
-//--------------------------------------------------------------------------------
diff --git a/contrib/mesh_conversion/MeshConversion.cc b/contrib/mesh_conversion/MeshConversion.cc
deleted file mode 100644
index 5f5a0eb833..0000000000
--- a/contrib/mesh_conversion/MeshConversion.cc
+++ /dev/null
@@ -1,520 +0,0 @@
-// ======================================================
-// MESH CONVERSION TOOL
-//
-// This program is distributed under the terms of the
-// GNU GPL v2.0 license.
-//
-// Author: Jean-Paul Pelteret
-// jppelteret.uct@gmail.com
-// modified by: Timo Heister, heister@clemson.edu
-// ======================================================
-
-#include "MeshConversion.h"
-
-//--------------------------------------------------------------------------------
-
-MeshConversion::MeshConversion (const unsigned int dimension, const std::string input_file, const std::string output_file)
- :
- tolerance (5e-16), // Used to offset Cubit tolerance error when outputting value close to zero
- dimension (dimension),
- input_file_name (input_file),
- output_file_name (output_file)
-{
- greeting ();
-
- if (dimension == 2)
- {
- node_per_face = 2; // Line edge
- node_per_cell = 4; // Quad face
- face_per_cell = 2 * dimension; // Lines per quad
- }
- else
- if (dimension == 3)
- {
- node_per_face = 4; // Quad face
- node_per_cell = 8; // Hex cell
- face_per_cell = 2 * dimension; // Quads per hex
- }
- else
- {
- std::cerr << "ERROR: Chosen spatial dimension is invalid!" << std::endl;
- }
-}
-
-//--------------------------------------------------------------------------------
-
-MeshConversion::~MeshConversion ()
-{
-}
-
-//--------------------------------------------------------------------------------
-
-bool MeshConversion::convert_mesh (void)
-{
- if (!read_in_abaqus())
- {
- std::cerr << "ERROR: could not parse file." << std::endl;
- return false;
- }
-
- return write_out_avs_ucd();
-}
-
-//--------------------------------------------------------------------------------
-
-
-// ========================================================
-// http://www.codeguru.com/forum/showthread.php?t=231054
-// ========================================================
-template bool from_string (T& t, const std::string& s, std::ios_base& (*f) (std::ios_base&))
-{
- std::istringstream iss (s);
- return ! (iss >> f >> t).fail();
-}
-
-//--------------------------------------------------------------------------------
-
-void MeshConversion::greeting ()
-{
- std::cout << std::endl;
- std::cout << std::endl;
- std::cout << std::endl;
- std::cout << "************************************************************************************" << std::endl;
- std::cout << "*** FEM Mesh conversion tool ***" << std::endl;
- std::cout << "************************************************************************************" << std::endl;
- std::cout << "*** Author: Jean-Paul Pelteret, Timo Heister ***" << std::endl;
- std::cout << "*** Date: June 2010, September 2011 ***" << std::endl;
- std::cout << "*** References: ***" << std::endl;
- std::cout << "*** http://www.dealii.org/developer/doxygen/deal.II/structGeometryInfo.html ***" << std::endl;
- std::cout << "*** http://people.scs.fsu.edu/~burkardt/data/ucd/ucd.html ***" << std::endl;
- std::cout << "*** http://www.cprogramming.com/tutorial/string.html ***" << std::endl;
- std::cout << "*** http://www.codeguru.com/forum/showthread.php?t=231054 ***" << std::endl;
- std::cout << "************************************************************************************" << std::endl;
- std::cout << "*** FEATURES: ***" << std::endl;
- std::cout << "*** Read-in file types: ***" << std::endl;
- std::cout << "*** - Abaqus inp (from Cubit) ***" << std::endl;
- std::cout << "*** Write-out file types: ***" << std::endl;
- std::cout << "*** - AVS UCD ***" << std::endl;
- std::cout << "************************************************************************************" << std::endl;
- std::cout << std::endl;
-}
-
-
-
-bool MeshConversion::read_in_abaqus ()
-{
- std::cout << "Reading in ABAQUS .inp FILE: " << input_file_name << std::endl;
-
- std::ifstream input_stream;
-
- input_stream.open (input_file_name.c_str(), std::ifstream::in);
-
- if (!input_stream.good())
- {
- std::cerr << "ERROR: file '" << input_file_name << "' not found." << std::endl;
- return false;
- }
-
- std::string line;
-
- std::getline (input_stream, line);
-
- while (!input_stream.eof())
- {
- if (0 == line.compare ("*HEADING")
- || 0 == line.compare (0, 2, "**")
- || 0 == line.compare (0, 5, "*PART"))
- {
- //skip header and comments
- while (!input_stream.eof())
- {
- std::getline (input_stream, line);
- if (line[0] == '*')
- goto cont;
- }
- }
- else
- if (0 == line.compare (0, 5, "*NODE"))
- {
- //header might be:
- //*NODE, NSET=ALLNODES
- //*NODE
-
- // contains lines in the form:
- //index, x, y, z
- int c = 0;
- while (!input_stream.eof())
- {
- std::getline (input_stream, line);
- if (line[0] == '*')
- goto cont;
-
- std::vector node (dimension + 1);
-
- istringstream iss (line);
- char comma;
- for (unsigned int i = 0; i < dimension + 1; ++i)
- iss >> node[i] >> comma;
-
- node_list.push_back (node);
-
- ++c;
- }
- }
- else
- if (0 == line.compare (0, 8, "*ELEMENT"))
- {
- //different header formats:
- //*ELEMENT, TYPE=S4R, ELSET=EB
- //*ELEMENT, TYPE=C3D8R, ELSET=EB
- //*ELEMENT, TYPE=C3D8
-
- //elements itself (n=4 or n=8):
- //index, i[0], ..., i[n]
-
- int material = 0;
-
- //scan for material
- {
- string before_material = "ELSET=EB";
- size_t idx = line.find (before_material);
- if (idx != std::string::npos)
- {
- from_string (material, line.substr (idx + before_material.size()), std::dec);
- }
- }
-
- std::getline (input_stream, line);
- while (!input_stream.eof())
- {
- if (line[0] == '*')
- goto cont;
-
- istringstream iss (line);
- char comma;
-
- const int n_points = 2 << dimension;
- std::vector cell (1 + n_points);
- for (int i = 0; i < 1 + n_points; ++i)
- iss >> cell[i] >> comma;
-
- //overwrite cell index from file by material
- cell[0] = (double) material;
-
- cell_list.push_back (cell);
-
- std::getline (input_stream, line);
- }
- }
- else
- if (0 == line.compare (0, 8, "*SURFACE"))
- {
- //old format:
- //*SURFACE, NAME=SS
- // , S
-
- int b_indicator = 0;
- {
- string before = "NAME=SS";
- size_t idx = line.find (before);
- if (idx != std::string::npos)
- {
- from_string (b_indicator, line.substr (idx + before.size()), std::dec);
- }
- }
-
- std::getline (input_stream, line);
- while (!input_stream.eof())
- {
- if (line[0] == '*')
- goto cont;
-
- istringstream iss (line);
- char comma;
- char temp;
- int el_idx;
- int face_number;
- string face_number_str;
- iss >> el_idx >> comma >> temp >> face_number;
-
- std::vector quad_node_list;
- quad_node_list = get_global_node_numbers (el_idx, face_number);
- quad_node_list.insert (quad_node_list.begin(), b_indicator);
-
- face_list.push_back (quad_node_list);
-
- std::getline (input_stream, line);
- }
- }
- else
- if (0 == line.compare (0, 6, "*ELSET"))
- {
- //new style line/face indicators
- //*ELSET, ELSET=SS1_S3
- //,, ...
- //*SURFACE, NAME=SS
- //SS1_S3, S
-
- std::vector elements;
- std::getline (input_stream, line);
- while (!input_stream.eof())
- {
- if (line[0] == '*')
- break;
-
- istringstream iss (line);
- char comma;
- int elid;
- while (!iss.eof())
- {
- iss >> elid >> comma;
- elements.push_back (elid);
- }
-
- std::getline (input_stream, line);
- }
-
- if (0 != line.compare (0, 8, "*SURFACE"))
- {
- std::cout << "WARNING: expected SURFACE after ELSET." << std::endl;
- goto cont;
- }
-
- int b_indicator = 0;
- {
- string before = "NAME=SS";
- size_t idx = line.find (before);
- if (idx != std::string::npos)
- {
- from_string (b_indicator, line.substr (idx + before.size()), std::dec);
- }
- }
-
- std::getline (input_stream, line);
-
- istringstream iss (line);
- char comma;
- std::string temp;
- int face_number;
- iss >> temp >> comma >> face_number;
-
- for (unsigned int i = 0;i < elements.size();++i)
- {
- std::vector quad_node_list;
-
- quad_node_list = get_global_node_numbers (elements[i], face_number);
-
- quad_node_list.insert (quad_node_list.begin(), b_indicator);
-
- face_list.push_back (quad_node_list);
- }
- }
- else
- if (0 == line.compare (0, 5, "*NSET"))
- {
- //skip nodesets, we have no use for them
- while (!input_stream.eof())
- {
- std::getline (input_stream, line);
- if (line[0] == '*')
- goto cont;
- }
- }
- else
- {
- std::cout << "Warning, skipping line:" << line << std::endl;
- }
-
- std::getline (input_stream, line);
- cont:
- (void) 0;
- }
- return true;
-}
-
-
-
-//--------------------------------------------------------------------------------
-
-std::vector MeshConversion::get_global_node_numbers (const int face_cell_no, const int face_cell_face_no)
-{
- std::vector quad_node_list (node_per_face);
-
- if (dimension == 2)
- {
- if (face_cell_face_no == 1)
- {
- quad_node_list[0] = cell_list[face_cell_no - 1][1];
- quad_node_list[1] = cell_list[face_cell_no - 1][2];
- }
- else
- if (face_cell_face_no == 2)
- {
- quad_node_list[0] = cell_list[face_cell_no - 1][2];
- quad_node_list[1] = cell_list[face_cell_no - 1][3];
- }
- else
- if (face_cell_face_no == 3)
- {
- quad_node_list[0] = cell_list[face_cell_no - 1][3];
- quad_node_list[1] = cell_list[face_cell_no - 1][4];
- }
- else
- if (face_cell_face_no == 4)
- {
- quad_node_list[0] = cell_list[face_cell_no - 1][4];
- quad_node_list[1] = cell_list[face_cell_no - 1][1];
- }
- else
- {
- std::cerr << "ERROR! Invalid face number inputted!" << std::endl;
- std::cerr << "face_cell_face_no = " << face_cell_face_no << std::endl;
- }
- }
- else // (dimension == 3)
- {
- if (face_cell_face_no == 1)
- {
- quad_node_list[0] = cell_list[face_cell_no - 1][1];
- quad_node_list[1] = cell_list[face_cell_no - 1][4];
- quad_node_list[2] = cell_list[face_cell_no - 1][3];
- quad_node_list[3] = cell_list[face_cell_no - 1][2];
- }
- else
- if (face_cell_face_no == 2)
- {
- quad_node_list[0] = cell_list[face_cell_no - 1][5];
- quad_node_list[1] = cell_list[face_cell_no - 1][8];
- quad_node_list[2] = cell_list[face_cell_no - 1][7];
- quad_node_list[3] = cell_list[face_cell_no - 1][6];
- }
- else
- if (face_cell_face_no == 3)
- {
- quad_node_list[0] = cell_list[face_cell_no - 1][1];
- quad_node_list[1] = cell_list[face_cell_no - 1][2];
- quad_node_list[2] = cell_list[face_cell_no - 1][6];
- quad_node_list[3] = cell_list[face_cell_no - 1][5];
- }
- else
- if (face_cell_face_no == 4)
- {
- quad_node_list[0] = cell_list[face_cell_no - 1][2];
- quad_node_list[1] = cell_list[face_cell_no - 1][3];
- quad_node_list[2] = cell_list[face_cell_no - 1][7];
- quad_node_list[3] = cell_list[face_cell_no - 1][6];
- }
- else
- if (face_cell_face_no == 5)
- {
- quad_node_list[0] = cell_list[face_cell_no - 1][3];
- quad_node_list[1] = cell_list[face_cell_no - 1][4];
- quad_node_list[2] = cell_list[face_cell_no - 1][8];
- quad_node_list[3] = cell_list[face_cell_no - 1][7];
- }
- else
- if (face_cell_face_no == 6)
- {
- quad_node_list[0] = cell_list[face_cell_no - 1][1];
- quad_node_list[1] = cell_list[face_cell_no - 1][5];
- quad_node_list[2] = cell_list[face_cell_no - 1][8];
- quad_node_list[3] = cell_list[face_cell_no - 1][4];
- }
- else
- {
- std::cerr << "ERROR! Invalid face number inputted!" << std::endl;
- std::cerr << "face_cell_face_no = " << face_cell_face_no << std::endl;
- }
- }
-
- return quad_node_list;
-}
-
-//--------------------------------------------------------------------------------
-
-bool MeshConversion::write_out_avs_ucd (void)
-{
- std::cout << "Writing out AVS .ucd FILE: " << output_file_name << std::endl;
-
- std::ofstream output;
- output.open (output_file_name.c_str());
-
- // Write out title - Note: No other commented text can be inserted below the title in a UCD file
- output << "# FEM Mesh Converter" << std::endl;
- output << "# Mesh type: AVS UCD" << std::endl;
- output << "# Input file name: " << input_file_name << std::endl;
-
- // ========================================================
- // ASCII UCD File Format
- // The input file cannot contain blank lines or lines with leading blanks. Comments, if present, must precede all data in the file. Comments within the data will cause read errors. The general order of the data is as follows:
- // 1. Numbers defining the overall structure, including the number of nodes, the number of cells, and the length of the vector of data associated with the nodes, cells, and the model.
- // e.g. 1:
- //
- // e.g. 2:
- // n_elements = n_hex_cells + n_bc_quads + n_quad_cells + n_bc_edges
- // outfile.write(str(n_nodes) + " " + str(n_elements) + " 0 0 0\n")
- // 2. For each node, its node id and the coordinates of that node in space. Node-ids must be integers, but any number including non sequential numbers can be used. Mid-edge nodes are treated like any other node.
- // 3. For each cell: its cell-id, material, cell type (hexahedral, pyramid, etc.), and the list of node-ids that correspond to each of the cell's vertices. The below table specifies the different cell types and the keyword used to represent them in the file.
-
- // Write out header
- output << node_list.size() << "\t" << (cell_list.size() + face_list.size()) << "\t0\t0\t0" << std::endl;
-
- // Write out node numbers
- for (unsigned int ii = 0; ii < node_list.size(); ++ii) // Loop over all nodes
- {
- for (unsigned int jj = 0; jj < dimension + 1; ++jj) // Loop over entries to be outputted
- {
- if (jj == 0) // Node number
- {
- output.precision();
- output << node_list[ii][jj] << "\t";
- }
- else // Node coordinates
- {
- output.width (16);
- output.setf (ios::scientific, ios::floatfield);
- output.precision (8);
- if (abs (node_list[ii][jj]) > tolerance) // invoke tolerance -> set points close to zero equal to zero
- output << static_cast (node_list[ii][jj]) << "\t";
- else
- output << 0.0 << "\t";
- }
- }
- if (dimension == 2)
- output << 0.0 << "\t";
-
- output << std::endl;
- output.unsetf (ios::floatfield);
- }
-
- // Write out cell node numbers
- for (unsigned int ii = 0; ii < cell_list.size(); ++ii)
- {
- output << ii + 1 << "\t" << cell_list[ii][0] << "\t" << (dimension == 2 ? "quad" : "hex") << "\t";
- for (unsigned int jj = 1; jj < node_per_cell + 1; ++jj)
- output << cell_list[ii][jj] << "\t";
-
- output << std::endl;
- }
-
- // Write out quad node numbers
- for (unsigned int ii = 0; ii < face_list.size(); ++ii)
- {
- output << ii + 1 << "\t" << face_list[ii][0] << "\t" << (dimension == 2 ? "line" : "quad") << "\t";
- for (unsigned int jj = 1; jj < node_per_face + 1; ++jj)
- output << face_list[ii][jj] << "\t";
-
- output << std::endl;
- }
-
- output.close();
-
- std::cout << "Output successful!" << std::endl;
- std::cout << " Number of nodes: " << node_list.size() << std::endl;
- std::cout << " Number of cells: " << cell_list.size() << std::endl;
- std::cout << " Number of boundary faces: " << face_list.size() << std::endl << std::endl;
-
- return true;
-}
-
-//--------------------------------------------------------------------------------
diff --git a/contrib/mesh_conversion/MeshConversion.h b/contrib/mesh_conversion/MeshConversion.h
deleted file mode 100644
index d945404935..0000000000
--- a/contrib/mesh_conversion/MeshConversion.h
+++ /dev/null
@@ -1,60 +0,0 @@
-// ======================================================
-// MESH CONVERSION TOOL
-//
-// This program is distributed under the terms of the
-// GNU GPL v2.0 license.
-//
-// Author: Jean-Paul Pelteret
-// jppelteret.uct@gmail.com
-// modified by: Timo Heister, heister@clemson.edu
-// ======================================================
-
-#ifndef MESH_CONVERSION_H
-#define MESH_CONVERSION_H
-
-//--------------------------------------------------------------------------------
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-using namespace std;
-
-class MeshConversion
-{
- public:
- MeshConversion (const unsigned int dimension, const std::string input_file, const std::string output_file);
- ~MeshConversion ();
- bool convert_mesh ();
-
- private:
- void greeting ();
-
- bool read_in_abaqus ();
- bool write_out_avs_ucd ();
-
- std::vector get_global_node_numbers(const int face_cell_no, const int face_cell_face_no);
-
- const double tolerance;
- const unsigned int dimension;
-
- unsigned int node_per_face;
- unsigned int node_per_cell;
- unsigned int face_per_cell;
-
- const std::string input_file_name;
- const std::string output_file_name;
-
- // NL: Stored as [ global node-id (int), x-coord, y-coord, z-coord ]
- std::vector< std::vector > node_list;
- // CL: Stored as [ material-id (int), node1, node2, node3, node4, node5, node6, node7, node8 ]
- std::vector< std::vector > cell_list;
- // FL: Stored as [ sideset-id (int), node1, node2, node3, node4 ]
- std::vector< std::vector > face_list;
-};
-
-#endif // MESH_CONVERSION_H
diff --git a/contrib/mesh_conversion/README.txt b/contrib/mesh_conversion/README.txt
deleted file mode 100644
index 10dfeb0360..0000000000
--- a/contrib/mesh_conversion/README.txt
+++ /dev/null
@@ -1,66 +0,0 @@
-====================================================
-MESH CONVERSION TOOL
-v. 1.2
-
-Use: Convert an ABAQUS .inp file to an AVS UCD file.
-
-Author: Jean-Paul Pelteret
- jppelteret.uct@gmail.com
- modified by: Timo Heister, heister@clemson.edu
-===================================================
-
-
-This tool is intended to support converting ABAQUS .inp files into a
-format that deal.II can read. To use this tool, you need to configure
-deal.II using the "-DDEAL_II_COMPONENT_MESH_CONVERTER=ON" argument
-when calling 'cmake'. The resulting executable will then be placed in
-the installation directory.
-
-
-
-Cubit features captured by ABAQUS .inp files:
----------------------------------------------
-1. Multiple material-id's can be defined in the mesh. This is done by specifying blocksets in the pre-processor.
-2. Arbitrary surface boundaries can be defined in the mesh. This is done by specifying sidesets in the pre-processor. In particular, boundaries are not confined to just surfaces (in 3d) - individual element faces can be added to the sideset as well. This is useful when a boundary condition is to be applied on a complex shape boundary that is difficult to define using "surfaces" alone. Similar can be done in 2d.
-
-How to use:
------------
-1. It is necessary to save the mesh as an Abaqus input file .inp. In Cubit, this is done as follows:
-1.1. Go to "Analysis setup mode" by clicking on the disc icon in the toolbar on the right.
-1.2. Select "Export Mesh" under "Operation" by clicking on the necessary icon in the toolbar on the right.
-1.3. Select an output file. I have found that in Cubit version 11.0 and 12.0 that it is necessary to click on the browse button and type it in the dialogue that pops up.
-1.4. Select the dimension to output in.
-1.5. Tick the overwrite box.
-1.6. If using Cubit v12.0 onwards, uncheck the box "Export using Cubit ID's". The conversion process will encounter errors if box if left checked.
-1.7. Click apply.
-
-2. Converting the mesh
-IMPORTANT NOTE: From v12.0 onwards, the format of the Abaqus file that Cubit outputted changed. This has been accounted for but an requires a flag to be passed to the conversion program.
- I describe outputs from before v12.0 as "Abaqus OLD" and v12.0 an on (up to v12.1 at this point) as "Abaqus NEW".
-2.1. Compile the program using 'make' or another suitable tool
-2.2. Run the program with the following command line arguments:
- './convert_mesh /path/to/input_file.inp /path/to/output_file.ucd'
-
- The first input argument is the spatial dimension of the input file, the second is the path to the read-in Abaqus .inp file, and the third is the name of the file to which you wish to write the output AVS .ucd file to.
- An example of the correct program usage is:
-e.g. './convert_mesh 3 mesh/3d/test_in.inp mesh/3d/test_out.ucd'
-
-
-Notes:
-------
-1. A few example / test meshes are provided in the directory "mesh". The .inp files that have been generated are all of the Abaqus OLD format except for one - CC.cub has been converted into both the "new" and "old" formats and both subsequently converted into deal.II readable meshes.
-
-Copyright:
-----------
-This program is distributed under the GNU GPL v2.0 copyright. Details can be found at:
-http://www.gnu.org/licenses/gpl-2.0.html
-
-This copyright is extended to the example mesh files distributed with this program, namely
-./mesh/2d/2d_test.*
-./mesh/2d/quad.*
-./mesh/3d/CC.*
-./mesh/3d/CC_cubit_new.*
-./mesh/3d/CC_cubit_old.*
-./mesh/3d/test_cube_1.*
-./mesh/3d/test_cube_pave_1.*
-./mesh/3d/test_cube_two_materials.*
\ No newline at end of file
diff --git a/contrib/mesh_conversion/gpl-2.0.txt b/contrib/mesh_conversion/gpl-2.0.txt
deleted file mode 100644
index d159169d10..0000000000
--- a/contrib/mesh_conversion/gpl-2.0.txt
+++ /dev/null
@@ -1,339 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Lesser General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-
- Copyright (C)
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) year name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- , 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.
diff --git a/contrib/mesh_conversion/mesh/3d/other_simple.ucd b/contrib/mesh_conversion/mesh/3d/other_simple.ucd
deleted file mode 100644
index 073dd734a5..0000000000
--- a/contrib/mesh_conversion/mesh/3d/other_simple.ucd
+++ /dev/null
@@ -1,13 +0,0 @@
-# FEM Mesh Converter
-# Mesh type: AVS UCD
-# Input file name: mesh/3d/other_simple.inp
-8 1 0 0 0
-1 0.00000000e+00 0.00000000e+00 0.00000000e+00
-2 0.00000000e+00 0.00000000e+00 5.00000000e+01
-3 5.00000000e+01 0.00000000e+00 5.00000000e+01
-4 5.00000000e+01 0.00000000e+00 0.00000000e+00
-5 0.00000000e+00 5.00000000e+01 0.00000000e+00
-6 7.05725000e-01 5.00000000e+01 5.00000000e+01
-7 5.00000000e+01 5.00000000e+01 5.00000000e+01
-8 5.00000000e+01 5.00000000e+01 0.00000000e+00
-1 0 hex 1 2 3 4 5 6 7 8
diff --git a/contrib/mesh_conversion/mesh/3d/test_cube_pave_1.ucd b/contrib/mesh_conversion/mesh/3d/test_cube_pave_1.ucd
deleted file mode 100644
index 02c7fd4898..0000000000
--- a/contrib/mesh_conversion/mesh/3d/test_cube_pave_1.ucd
+++ /dev/null
@@ -1,91 +0,0 @@
-# FEM Mesh Converter
-# Mesh type: AVS UCD
-# Input file name: mesh/3d/test_cube_pave_1.inp
-39 48 0 0 0
-1 1.00000000e+00 1.00000000e+00 0.00000000e+00
-2 5.00000000e-01 1.00000000e+00 0.00000000e+00
-3 5.58355900e-01 3.92933100e-01 0.00000000e+00
-4 1.00000000e+00 0.00000000e+00 0.00000000e+00
-5 1.00000000e+00 1.00000000e+00 1.00000000e+00
-6 5.00000000e-01 1.00000000e+00 1.00000000e+00
-7 5.58355900e-01 3.92933100e-01 1.00000000e+00
-8 1.00000000e+00 0.00000000e+00 1.00000000e+00
-9 0.00000000e+00 1.00000000e+00 0.00000000e+00
-10 1.56240900e-01 1.79928800e-01 0.00000000e+00
-11 0.00000000e+00 1.00000000e+00 1.00000000e+00
-12 1.56240900e-01 1.79928800e-01 1.00000000e+00
-13 -5.00000000e-01 1.00000000e+00 0.00000000e+00
-14 -3.89707500e-01 6.80424600e-02 0.00000000e+00
-15 -5.00000000e-01 1.00000000e+00 1.00000000e+00
-16 -3.89707500e-01 6.80424600e-02 1.00000000e+00
-17 -1.00000000e+00 1.00000000e+00 0.00000000e+00
-18 -1.00000000e+00 0.00000000e+00 0.00000000e+00
-19 -1.00000000e+00 1.00000000e+00 1.00000000e+00
-20 -1.00000000e+00 0.00000000e+00 1.00000000e+00
-21 -1.00000000e+00 -1.00000000e+00 0.00000000e+00
-22 0.00000000e+00 -1.00000000e+00 0.00000000e+00
-23 -1.00000000e+00 -1.00000000e+00 1.00000000e+00
-24 0.00000000e+00 -1.00000000e+00 1.00000000e+00
-25 1.00000000e+00 -1.00000000e+00 0.00000000e+00
-26 1.00000000e+00 -1.00000000e+00 1.00000000e+00
-27 1.00000000e+00 1.00000000e+00 -1.00000000e+00
-28 5.00000000e-01 1.00000000e+00 -1.00000000e+00
-29 5.58355900e-01 3.92933100e-01 -1.00000000e+00
-30 1.00000000e+00 0.00000000e+00 -1.00000000e+00
-31 0.00000000e+00 1.00000000e+00 -1.00000000e+00
-32 1.56240900e-01 1.79928800e-01 -1.00000000e+00
-33 -5.00000000e-01 1.00000000e+00 -1.00000000e+00
-34 -3.89707500e-01 6.80424600e-02 -1.00000000e+00
-35 -1.00000000e+00 1.00000000e+00 -1.00000000e+00
-36 -1.00000000e+00 0.00000000e+00 -1.00000000e+00
-37 -1.00000000e+00 -1.00000000e+00 -1.00000000e+00
-38 0.00000000e+00 -1.00000000e+00 -1.00000000e+00
-39 1.00000000e+00 -1.00000000e+00 -1.00000000e+00
-1 1 hex 1 2 3 4 5 6 7 8
-2 1 hex 2 9 10 3 6 11 12 7
-3 1 hex 9 13 14 10 11 15 16 12
-4 1 hex 13 17 18 14 15 19 20 16
-5 1 hex 21 22 14 18 23 24 16 20
-6 1 hex 10 14 22 25 12 16 24 26
-7 1 hex 25 4 3 10 26 8 7 12
-8 1 hex 27 28 29 30 1 2 3 4
-9 1 hex 28 31 32 29 2 9 10 3
-10 1 hex 31 33 34 32 9 13 14 10
-11 1 hex 33 35 36 34 13 17 18 14
-12 1 hex 37 38 34 36 21 22 14 18
-13 1 hex 32 34 38 39 10 14 22 25
-14 1 hex 39 30 29 32 25 4 3 10
-1 1 quad 5 8 7 6
-2 1 quad 6 7 12 11
-3 1 quad 11 12 16 15
-4 1 quad 15 16 20 19
-5 1 quad 23 20 16 24
-6 1 quad 12 26 24 16
-7 1 quad 26 12 7 8
-8 2 quad 27 30 29 28
-9 2 quad 28 29 32 31
-10 2 quad 31 32 34 33
-11 2 quad 33 34 36 35
-12 2 quad 37 36 34 38
-13 2 quad 32 39 38 34
-14 2 quad 39 32 29 30
-15 3 quad 21 22 24 23
-16 3 quad 22 25 26 24
-17 3 quad 37 38 22 21
-18 3 quad 38 39 25 22
-19 4 quad 17 18 20 19
-20 4 quad 21 23 20 18
-21 4 quad 35 36 18 17
-22 4 quad 37 21 18 36
-23 5 quad 1 2 6 5
-24 5 quad 2 9 11 6
-25 5 quad 9 13 15 11
-26 5 quad 13 17 19 15
-27 5 quad 27 28 2 1
-28 5 quad 28 31 9 2
-29 5 quad 31 33 13 9
-30 5 quad 33 35 17 13
-31 6 quad 1 5 8 4
-32 6 quad 25 4 8 26
-33 6 quad 27 1 4 30
-34 6 quad 39 30 4 25
diff --git a/contrib/mesh_conversion/mesh/3d/test_cube_two_materials.ucd b/contrib/mesh_conversion/mesh/3d/test_cube_two_materials.ucd
deleted file mode 100644
index 3889718dd6..0000000000
--- a/contrib/mesh_conversion/mesh/3d/test_cube_two_materials.ucd
+++ /dev/null
@@ -1,63 +0,0 @@
-# FEM Mesh Converter
-# Mesh type: AVS UCD
-# Input file name: mesh/3d/test_cube_two_materials.inp
-27 32 0 0 0
-1 -1.00000000e+00 -1.00000000e+00 1.00000000e+00
-2 -1.00000000e+00 -1.00000000e+00 0.00000000e+00
-3 -1.00000000e+00 0.00000000e+00 0.00000000e+00
-4 -1.00000000e+00 0.00000000e+00 1.00000000e+00
-5 0.00000000e+00 -1.00000000e+00 1.00000000e+00
-6 0.00000000e+00 -1.00000000e+00 0.00000000e+00
-7 0.00000000e+00 0.00000000e+00 0.00000000e+00
-8 0.00000000e+00 0.00000000e+00 1.00000000e+00
-9 -1.00000000e+00 -1.00000000e+00 -1.00000000e+00
-10 -1.00000000e+00 0.00000000e+00 -1.00000000e+00
-11 0.00000000e+00 -1.00000000e+00 -1.00000000e+00
-12 0.00000000e+00 0.00000000e+00 -1.00000000e+00
-13 -1.00000000e+00 1.00000000e+00 0.00000000e+00
-14 -1.00000000e+00 1.00000000e+00 1.00000000e+00
-15 0.00000000e+00 1.00000000e+00 0.00000000e+00
-16 0.00000000e+00 1.00000000e+00 1.00000000e+00
-17 -1.00000000e+00 1.00000000e+00 -1.00000000e+00
-18 0.00000000e+00 1.00000000e+00 -1.00000000e+00
-19 1.00000000e+00 -1.00000000e+00 1.00000000e+00
-20 1.00000000e+00 -1.00000000e+00 0.00000000e+00
-21 1.00000000e+00 0.00000000e+00 0.00000000e+00
-22 1.00000000e+00 0.00000000e+00 1.00000000e+00
-23 1.00000000e+00 -1.00000000e+00 -1.00000000e+00
-24 1.00000000e+00 0.00000000e+00 -1.00000000e+00
-25 1.00000000e+00 1.00000000e+00 0.00000000e+00
-26 1.00000000e+00 1.00000000e+00 1.00000000e+00
-27 1.00000000e+00 1.00000000e+00 -1.00000000e+00
-1 1 hex 1 2 3 4 5 6 7 8
-2 1 hex 2 9 10 3 6 11 12 7
-3 1 hex 4 3 13 14 8 7 15 16
-4 1 hex 3 10 17 13 7 12 18 15
-5 1 hex 5 6 7 8 19 20 21 22
-6 2 hex 6 11 12 7 20 23 24 21
-7 2 hex 8 7 15 16 22 21 25 26
-8 2 hex 7 12 18 15 21 24 27 25
-1 1 quad 1 5 8 4
-2 1 quad 4 8 16 14
-3 1 quad 5 19 22 8
-4 1 quad 8 22 26 16
-5 1 quad 13 14 16 15
-6 1 quad 17 13 15 18
-7 1 quad 15 16 26 25
-8 1 quad 18 15 25 27
-9 1 quad 1 4 3 2
-10 1 quad 2 3 10 9
-11 1 quad 4 14 13 3
-12 1 quad 3 13 17 10
-13 1 quad 1 2 6 5
-14 1 quad 2 9 11 6
-15 1 quad 5 6 20 19
-16 1 quad 6 11 23 20
-17 2 quad 9 10 12 11
-18 2 quad 10 17 18 12
-19 2 quad 12 18 27 24
-20 2 quad 21 25 27 24
-21 3 quad 19 22 21 20
-22 3 quad 11 12 24 23
-23 3 quad 20 21 24 23
-24 3 quad 22 26 25 21
diff --git a/contrib/mesh_conversion/test.sh b/contrib/mesh_conversion/test.sh
deleted file mode 100755
index cff12d8026..0000000000
--- a/contrib/mesh_conversion/test.sh
+++ /dev/null
@@ -1,48 +0,0 @@
-#!/bin/bash
-# ======================================================
-# MESH CONVERSION TOOL
-# v. 1.2
-#
-# This program is distributed under the terms of the
-# GNU GPL v2.0 license.
-#
-# Author: Jean-Paul Pelteret
-# jppelteret.uct@gmail.com
-# modified by: Timo Heister, heister@clemson.edu
-# ======================================================
-
-mesh=mesh/2d/2d_test
-./convert_mesh 2 $mesh.inp test/`basename $mesh.ucd` >/dev/null
-diff -q $mesh.ucd test/`basename $mesh.ucd`
-
-mesh=mesh/2d/quad
-./convert_mesh 2 $mesh.inp test/`basename $mesh.ucd` >/dev/null
-diff -q $mesh.ucd test/`basename $mesh.ucd`
-
-mesh=mesh/3d/test_cube_1
-./convert_mesh 3 $mesh.inp test/`basename $mesh.ucd` >/dev/null
-diff -q $mesh.ucd test/`basename $mesh.ucd`
-
-mesh=mesh/3d/test_cube_two_materials
-./convert_mesh 3 $mesh.inp test/`basename $mesh.ucd` >/dev/null
-diff -q $mesh.ucd test/`basename $mesh.ucd`
-
-mesh=mesh/3d/CC_cubit_old
-./convert_mesh 3 $mesh.inp test/`basename $mesh.ucd` >/dev/null
-diff -q $mesh.ucd test/`basename $mesh.ucd`
-
-mesh=mesh/3d/CC_cubit_new
-./convert_mesh 3 $mesh.inp test/`basename $mesh.ucd` >/dev/null
-diff -q $mesh.ucd test/`basename $mesh.ucd`
-
-mesh=mesh/3d/test_cube_pave_1
-./convert_mesh 3 $mesh.inp test/`basename $mesh.ucd` >/dev/null
-diff -q $mesh.ucd test/`basename $mesh.ucd`
-
-mesh=mesh/3d/other_simple
-./convert_mesh 3 $mesh.inp test/`basename $mesh.ucd` >/dev/null
-diff -q $mesh.ucd test/`basename $mesh.ucd`
-
-# mesh=mesh/3d/other
-# ./convert_mesh 3 $mesh.inp test/`basename $mesh.ucd` >/dev/null
-# diff -q $mesh.ucd test/`basename $mesh.ucd`
diff --git a/doc/news/changes.h b/doc/news/changes.h
index 2f59813705..1b722dc4ca 100644
--- a/doc/news/changes.h
+++ b/doc/news/changes.h
@@ -39,6 +39,13 @@ inconvenience this causes.
+ - Changed: The mesh_converter program has been removed from the
+ contrib folder. The equivalent functionality can now be found in
+ the GridIn class.
+
+ (Jean-Paul Pelteret, 2015/08/12)
+
+
- Changed: The signature of the FiniteElement::fill_fe_values(),
FiniteElement::fill_fe_face_values(), and FiniteElement::fill_fe_subface_values()
functions has been changed, in an effort to clarify which of these contain
@@ -149,6 +156,12 @@ inconvenience this causes.
(Wolfgang Bangerth, Bruno Turcksin, 2015/08/13)
+ - New: Direct support for Abaqus mesh files has been added to the GridIn
+ class through the function GridIn::read_abaqus().
+
+ (Jean-Paul Pelteret, Timo Heister, Krzysztof Bzowski, 2015/08/12)
+
+
- Improved: Some finite elements compute hessians analytically rather than
by finite differencing. Namely, these are finite elements that are subclasses
of FEPoly as well as FESystem with those as base elements.
diff --git a/doc/readme.html b/doc/readme.html
index 82a2da6141..d4221863c5 100644
--- a/doc/readme.html
+++ b/doc/readme.html
@@ -391,14 +391,6 @@
-
-
- mesh_converter: If you wish to compile and install the
- mesh_converter
tool discussed in the documentation
- of the GridIn
class, specify
- -DDEAL_II_COMPONENT_MESH_CONVERTER=ON
. (This is in fact
- the default.)
-
-
parameter_gui: If you wish to compile and install the
parameter_gui
tool discussed in the documentation
diff --git a/doc/users/cmake.html b/doc/users/cmake.html
index 8703010946..12b3b99714 100644
--- a/doc/users/cmake.html
+++ b/doc/users/cmake.html
@@ -184,9 +184,9 @@ cmake -DDEAL_II_WITH_MPI=ON <...>
The same holds for all variables starting with COMPONENT_
and all individual component names:
- DOCUMENTATION
, EXAMPLES
,
- MESH_CONVERTER
and PARAMETER_GUI
(which
- will be expanded to the full DEAL_II_COMPONENT_*
variable name).
+ DOCUMENTATION
, EXAMPLES
+ and PARAMETER_GUI
(which will be expanded to the
+ full DEAL_II_COMPONENT_*
variable name).
@@ -223,7 +223,6 @@ cmake -DDEAL_II_WITH_MPI=ON <...>
# documentation - build and install component 'documentation'
# examples - build and install component 'examples'
# library - build and install component 'library'
-# mesh_converter - build and install component 'mesh_converter'
# parameter_gui - build and install component 'parameter_gui'
#
# test - run a minimal set of tests
@@ -263,7 +262,6 @@ cmake -DDEAL_II_WITH_MPI=ON <...>
# Component configuration:
# ( DEAL_II_COMPONENT_DOCUMENTATION = OFF )
# DEAL_II_COMPONENT_EXAMPLES
-# DEAL_II_COMPONENT_MESH_CONVERTER
# ( DEAL_II_COMPONENT_PARAMETER_GUI = OFF )
#
# Detailed information (compiler flags, feature configuration) can be found in detailed.log
@@ -401,7 +399,6 @@ $ cmake -GNinja [...]
documentation - builds and installs the 'documentation' component
examples - builds and installs the 'examples' component
library - builds and installs the 'library' component
-mesh_converter - builds and installs the 'mesh_converter' component
parameter_gui - builds and installs the 'parameter_gui' component
@@ -752,17 +749,6 @@ cmake -DLAPACK_FOUND=true \
This adds a component examples
to the build system.
-
-
- DEAL_II_COMPONENT_MESH_CONVERTER
(default
- ON
):
-
-
- Enable configuration and installation of the
- mesh_converter
binary. This adds a component
- mesh_converter
to the build system.
-
-
DEAL_II_COMPONENT_PARAMETER_GUI
(default
diff --git a/doc/users/config.sample b/doc/users/config.sample
index b761fa5ce2..cbb65f38b2 100644
--- a/doc/users/config.sample
+++ b/doc/users/config.sample
@@ -24,10 +24,6 @@
# "Enable configuration and installation of the example steps. This adds a COMPONENT \"examples\" to the build system."
# )
#
-# SET(DEAL_II_COMPONENT_MESH_CONVERTER ON CACHE BOOL
-# "Build and install the mesh_converter. This adds a COMPONENT \"mesh_converter\" to the build system."
-# )
-#
# SET(DEAL_II_COMPONENT_PARAMETER_GUI OFF CACHE BOOL
# "Build and install the parameter_gui. This adds a COMPONENT \"parameter_gui\" to the build system."
# )
diff --git a/include/deal.II/grid/grid_in.h b/include/deal.II/grid/grid_in.h
index ea27687105..c1eb66f914 100644
--- a/include/deal.II/grid/grid_in.h
+++ b/include/deal.II/grid/grid_in.h
@@ -209,27 +209,11 @@ struct SubCellData;
* plug-in script can be found on the deal.II wiki page,
* http://code.google.com/p/dealii/wiki/MeshInputAndOutput .
*
- * There is also a little program bin/mesh_conversion
(in the
- * directory where deal.II was installed), written by Jean-Paul Pelteret, that
- * can convert Cubit ABAQUS files into the UCD format that can be read in as
- * discussed above. The program was designed with the intention of exporting
- * geometries with complex boundary condition surfaces and multiple materials
- * from Cubit - information which is currently not easily obtained through
- * Cubit's python interface. Using the the program is simple: to use it, it
- * needs to be built and run with the command
- * @code
- * /path/to/deal.II/bin/mesh_conversion /path/to/input_file.inp /path/to/output_file.ucd
- * @endcode.
- * More information is available in the readme file included with the program
- * and located in the contrib/mesh_conversion/README.txt
file in
- * the deal.II source directory tree. Note that the program's copyright
- * remains with its author and that it is under a separate license than the
- * rest of the library.
- *
- * To build the program, see the doc/readmes.html
and
- * doc/development/cmake.html
files.
- *
- *
+ * Alternatively, Cubit can generate ABAQUS files that can be read in via the
+ * read_abaqus() function. This may be a better option for geometries with
+ * complex boundary condition surfaces and multiple materials
+ * - information which is currently not easily obtained through
+ * Cubit's python interface.
*
* Structure of input grid data. The GridReordering class
*
@@ -302,8 +286,9 @@ struct SubCellData;
*
* @ingroup grid
* @ingroup input
- * @author Wolfgang Bangerth, 1998, 2000, Luca Heltai, 2004, 2007
+ * @author Wolfgang Bangerth, 1998, 2000, Luca Heltai, 2004, 2007, Jean-Paul Pelteret 2015, Timo Heister 2015, Krzysztof Bzowski, 2015
*/
+
template
class GridIn
{
@@ -320,6 +305,8 @@ public:
unv,
/// Use read_ucd()
ucd,
+ /// Use read_abaqus()
+ abaqus,
/// Use read_dbmesh()
dbmesh,
/// Use read_xda()
@@ -378,6 +365,46 @@ public:
*/
void read_ucd (std::istream &in);
+ /**
+ * Read grid data from an Abaqus file. Numerical and constitutive data
+ * is ignored.
+ *
+ * @note The current implementation of this mesh reader is suboptimal,
+ * and may therefore be slow for large meshes.
+ *
+ * @note Usage tips for Cubit:
+ * - Multiple material-id's can be defined in the mesh.
+ * This is done by specifying blocksets in the pre-processor.
+ * - Arbitrary surface boundaries can be defined in the mesh.
+ * This is done by specifying sidesets in the pre-processor.
+ * In particular, boundaries are not confined to just surfaces (in 3d)
+ * individual element faces can be added to the sideset as well.
+ * This is useful when a boundary condition is to be applied on a
+ * complex shape boundary that is difficult to define using "surfaces"
+ * alone. Similar can be done in 2d.
+ *
+ * @note Compatibility information for this file format is listed below.
+ * - Files generated in Abaqus CAE 6.12 have been verified to be
+ * correctly imported, but older (or newer) versions of Abaqus may
+ * also generate valid input decks.
+ * - Files generated using Cubit 11.x, 12.x and 13.x are valid, but only
+ * when using a specific set of export steps. These are as follows:
+ * 1. Go to "Analysis setup mode" by clicking on the disc icon in the
+ * toolbar on the right.
+ * 2. Select "Export Mesh" under "Operation" by clicking on the
+ * necessary icon in the toolbar on the right.
+ * 3. Select an output file. In Cubit version 11.0 and 12.0 it might be
+ * necessary to click on the browse button and type it in the
+ * dialogue that pops up.
+ * 4. Select the dimension to output in.
+ * 5. Tick the overwrite box.
+ * 6. If using Cubit v12.0 onwards, uncheck the box "Export using Cubit
+ * ID's". An invalid file will encounter errors if this box is left
+ * checked.
+ * 7. Click apply.
+ */
+ void read_abaqus (std::istream &in);
+
/**
* Read grid data from a file containing data in the DB mesh format.
*/
@@ -577,8 +604,6 @@ private:
Format default_format;
};
-
-
/* -------------- declaration of explicit specializations ------------- */
#ifndef DOXYGEN
diff --git a/source/grid/grid_in.cc b/source/grid/grid_in.cc
index 6da36aef97..7e68c15175 100644
--- a/source/grid/grid_in.cc
+++ b/source/grid/grid_in.cc
@@ -757,6 +757,64 @@ void GridIn::read_ucd (std::istream &in)
tria->create_triangulation_compatibility (vertices, cells, subcelldata);
}
+namespace
+{
+ template
+ class Abaqus_to_UCD
+ {
+ public:
+ Abaqus_to_UCD ();
+
+ void read_in_abaqus (std::istream &in);
+ void write_out_avs_ucd (std::ostream &out) const;
+
+ private:
+ const double tolerance;
+
+ std::vector get_global_node_numbers (const int face_cell_no,
+ const int face_cell_face_no) const;
+
+ // NL: Stored as [ global node-id (int), x-coord, y-coord, z-coord ]
+ std::vector< std::vector > node_list;
+ // CL: Stored as [ material-id (int), node1, node2, node3, node4, node5, node6, node7, node8 ]
+ std::vector< std::vector > cell_list;
+ // FL: Stored as [ sideset-id (int), node1, node2, node3, node4 ]
+ std::vector< std::vector > face_list;
+ // ELSET: Stored as [ (std::string) elset_name = (std::vector) of cells numbers]
+ std::map< std::string, std::vector > elsets_list;
+ };
+}
+
+template
+void GridIn::read_abaqus (std::istream &in)
+{
+ Assert (tria != 0, ExcNoTriangulationSelected());
+ Assert (dim==2 || dim==3, ExcNotImplemented());
+ AssertThrow (in, ExcIO());
+
+ // Read in the Abaqus file into an intermediate object
+ // that is to be passed along to the UCD reader
+ Abaqus_to_UCD abaqus_to_ucd;
+ abaqus_to_ucd.read_in_abaqus(in);
+
+ std::stringstream in_ucd;
+ abaqus_to_ucd.write_out_avs_ucd(in_ucd);
+
+ // This next call is wrapped in a try-catch for the following reason:
+ // It ensures that if the Abaqus mesh is read in correctly but produces
+ // an erroneous result then the user is alerted to the source of the problem
+ // and doesn't think that they've somehow called the wrong function.
+ try
+ {
+ read_ucd(in_ucd);
+ }
+ catch (...)
+ {
+ AssertThrow(false, ExcMessage("Internal conversion from ABAQUS file to UCD format was unsuccessful. \
+ Are you sure that your ABAQUS mesh file conforms with the requirements \
+ listed in the documentation?"));
+ }
+}
template
@@ -770,7 +828,6 @@ void GridIn::read_dbmesh (std::istream &in)
// skip comments at start of file
skip_comment_lines (in, '#');
-
// first read in identifier string
std::string line;
getline (in, line);
@@ -2649,6 +2706,10 @@ void GridIn::read (std::istream &in,
read_ucd (in);
return;
+ case abaqus:
+ read_abaqus(in);
+ return;
+
case xda:
read_xda (in);
return;
@@ -2687,6 +2748,8 @@ GridIn::default_suffix (const Format format)
return ".unv";
case ucd:
return ".inp";
+ case abaqus:
+ return ".inp"; // Typical suffix for Abaqus mesh files conflicts with UCD.
case xda:
return ".xda";
case netcdf:
@@ -2717,6 +2780,7 @@ GridIn::parse_format (const std::string &format_name)
if (format_name == "vtk")
return vtk;
+ // This is also the typical extension of Abaqus input files.
if (format_name == "inp")
return ucd;
@@ -2760,9 +2824,525 @@ GridIn::parse_format (const std::string &format_name)
template
std::string GridIn::get_format_names ()
{
- return "dbmesh|msh|unv|vtk|ucd|xda|netcdf|tecplot";
+ return "dbmesh|msh|unv|vtk|ucd|abaqus|xda|netcdf|tecplot";
}
+namespace
+{
+ template
+ Abaqus_to_UCD::Abaqus_to_UCD ()
+ : tolerance (5e-16) // Used to offset Cubit tolerance error when outputting value close to zero
+ {
+ AssertThrow(dim==2 || dim==3, ExcNotImplemented());
+ }
+
+ // Convert from a string to some other data type
+ // Reference: http://www.codeguru.com/forum/showthread.php?t=231054
+ template bool
+ from_string (T &t,
+ const std::string &s,
+ std::ios_base& (*f) (std::ios_base &))
+ {
+ std::istringstream iss (s);
+ return ! (iss >> f >> t).fail();
+ }
+
+ // Extract an integer from a string
+ int
+ extract_int (const std::string &s)
+ {
+ std::string tmp;
+ for (unsigned int i = 0; i
+ void
+ Abaqus_to_UCD::read_in_abaqus (std::istream &input_stream)
+ {
+ AssertThrow (input_stream, ExcIO());
+ std::string line;
+ std::getline (input_stream, line);
+
+ while (!input_stream.eof())
+ {
+ std::transform(line.begin(), line.end(), line.begin(), ::toupper);
+
+ if (line.compare ("*HEADING") == 0 ||
+ line.compare (0, 2, "**") == 0 ||
+ line.compare (0, 5, "*PART") == 0)
+ {
+ // Skip header and comments
+ while (!input_stream.eof())
+ {
+ std::getline (input_stream, line);
+ if (line[0] == '*')
+ goto cont; // My eyes, they burn!
+ }
+ }
+ else if (line.compare (0, 5, "*NODE") == 0)
+ {
+ // Extract list of vertices
+ // Header line might be:
+ // *NODE, NSET=ALLNODES
+ // *NODE
+
+ // Contains lines in the form:
+ // Index, x, y, z
+ while (!input_stream.eof())
+ {
+ std::getline (input_stream, line);
+ if (line[0] == '*')
+ goto cont;
+
+ std::vector node (dim+1);
+
+ std::istringstream iss (line);
+ char comma;
+ for (unsigned int i = 0; i < dim+1; ++i)
+ iss >> node[i] >> comma;
+
+ node_list.push_back (node);
+ }
+ }
+ else if (line.compare (0, 8, "*ELEMENT") == 0)
+ {
+ // Element construction.
+ // There are different header formats, the details
+ // of which we're not particularly interested in except
+ // whether they represent quads or hexahedrals.
+ // *ELEMENT, TYPE=S4R, ELSET=EB
+ // *ELEMENT, TYPE=C3D8R, ELSET=EB
+ // *ELEMENT, TYPE=C3D8
+ // Elements itself (n=4 or n=8):
+ // Index, i[0], ..., i[n]
+
+ int material = 0;
+ // Scan for material id
+ {
+ const std::string before_material = "ELSET=EB";
+ const std::size_t idx = line.find (before_material);
+ if (idx != std::string::npos)
+ {
+ from_string (material, line.substr (idx + before_material.size()), std::dec);
+ }
+ }
+
+ // Read ELEMENT definition
+ std::getline (input_stream, line);
+ while (!input_stream.eof())
+ {
+ if (line[0] == '*')
+ goto cont;
+
+ std::istringstream iss (line);
+ char comma;
+
+ // We will store the material id in the zeroth entry of the
+ // vector and the rest of the elements represent the global
+ // node numbers
+ const unsigned int n_data_per_cell = 1+GeometryInfo::vertices_per_cell;
+ std::vector cell (n_data_per_cell);
+ for (unsigned int i = 0; i < n_data_per_cell; ++i)
+ iss >> cell[i] >> comma;
+
+ // Overwrite cell index from file by material
+ cell[0] = static_cast (material);
+ cell_list.push_back (cell);
+
+ std::getline (input_stream, line);
+ }
+ }
+ else if (line.compare (0, 8, "*SURFACE") == 0)
+ {
+ // Extract the definitions of boundary surfaces
+ // Old format from Cubit:
+ // *SURFACE, NAME=SS
+ // , S
+ // Abaqus default format:
+ // *SURFACE, TYPE=ELEMENT, NAME=SURF-
+
+ // Get name of the surface and extract id from it;
+ // this will be the boundary indicator
+ const std::string name_key = "NAME=";
+ const std::size_t name_idx_start = line.find(name_key) + name_key.size();
+ std::size_t name_idx_end = line.find(',', name_idx_start);
+ if (name_idx_end == std::string::npos)
+ {
+ name_idx_end = line.size();
+ }
+ const int b_indicator = extract_int(line.substr(name_idx_start, name_idx_end - name_idx_start));
+
+ // Read SURFACE definition
+ // Note that the orientation of the faces is embedded within the
+ // definition of each "set" of faces that comprise the surface
+ // These are either marked by an "S" or "E" in 3d or 2d respectively.
+ std::getline (input_stream, line);
+ while (!input_stream.eof())
+ {
+ if (line[0] == '*')
+ goto cont;
+
+ // Change all characters to upper case
+ std::transform(line.begin(), line.end(), line.begin(), ::toupper);
+
+ // Surface can be created from ELSET, or directly from cells
+ // If elsets_list contains a key with specific name - refers to that ELSET, otherwise refers to cell
+ std::istringstream iss (line);
+ char comma;
+ int el_idx;
+ int face_number;
+ char temp;
+
+ // Get relevant faces, taking into account the element orientation
+ std::vector quad_node_list;
+ const std::string elset_name = line.substr(0, line.find(','));
+ if (elsets_list.count(elset_name) != 0)
+ {
+ // Surface refers to ELSET
+ std::string stmp;
+ iss >> stmp >> temp >> face_number;
+
+ const std::vector cells = elsets_list[elset_name];
+ for (unsigned int i = 0; i > el_idx >> comma >> temp >> face_number;
+ quad_node_list = get_global_node_numbers (el_idx, face_number);
+ quad_node_list.insert (quad_node_list.begin(), b_indicator);
+
+ face_list.push_back (quad_node_list);
+ }
+
+ std::getline (input_stream, line);
+ }
+ }
+ else if (line.compare (0, 6, "*ELSET") == 0)
+ {
+ // Get ELSET name.
+ // Materials are attached to elsets with specific name
+ std::string elset_name;
+ {
+ const std::string elset_key = "*ELSET, ELSET=";
+ const std::size_t idx = line.find(elset_key);
+ if (idx != std::string::npos)
+ {
+ const std::string comma = ",";
+ const std::size_t first_comma = line.find(comma);
+ const std::size_t second_comma = line.find(comma, first_comma+1);
+ const std::size_t elset_name_start = line.find(elset_key) + elset_key.size();
+ elset_name = line.substr(elset_name_start, second_comma-elset_name_start);
+ }
+
+ }
+
+ // There are two possibilities of storing cells numbers in ELSET:
+ // 1. If the header contains the 'GENERATE' keyword, then the next line describes range of cells as:
+ // cell_id_start, cell_id_end, cell_step
+ // 2. If the header does not contain the 'GENERATE' keyword, then the next lines contain cells numbers
+ std::vector elements;
+ const std::size_t generate_idx = line.find("GENERATE");
+ if (generate_idx != std::string::npos)
+ {
+ // Option (1)
+ std::getline (input_stream, line);
+ std::istringstream iss (line);
+ char comma;
+ int elid_start;
+ int elid_end;
+ int elis_step;
+ iss >> elid_start >> comma >> elid_end >> comma >> elis_step;
+ for (int i = elid_start; i <= elid_end; i+= elis_step)
+ {
+ elements.push_back(i);
+ }
+ elsets_list[elset_name] = elements;
+
+ std::getline (input_stream, line);
+ }
+ else
+ {
+ // Option (2)
+ std::getline (input_stream, line);
+ while (!input_stream.eof())
+ {
+ if (line[0] == '*')
+ break;
+
+ std::istringstream iss (line);
+ char comma;
+ int elid;
+ while (!iss.eof())
+ {
+ iss >> elid >> comma;
+ elements.push_back (elid);
+ }
+
+ std::getline (input_stream, line);
+ }
+
+ elsets_list[elset_name] = elements;
+ }
+
+ goto cont;
+ }
+ else if (line.compare (0, 5, "*NSET") == 0)
+ {
+ // Skip nodesets; we have no use for them
+ while (!input_stream.eof())
+ {
+ std::getline (input_stream, line);
+ if (line[0] == '*')
+ goto cont;
+ }
+ }
+ else if (line.compare(0, 14, "*SOLID SECTION") == 0)
+ {
+ // The ELSET name, which describes a section for particular material
+ const std::string elset_key = "ELSET=";
+ const std::size_t elset_start = line.find("ELSET=") + elset_key.size();
+ const std::size_t elset_end = line.find(',', elset_start+1);
+ const std::string elset_name = line.substr(elset_start, elset_end-elset_start);
+
+ // Solid material definition.
+ // We assume that material id is taken from material name,
+ // eg. "Material-1" -> ID=1
+ const std::string material_key = "MATERIAL=";
+ const std::size_t last_equal = line.find("MATERIAL=") + material_key.size();
+ const std::size_t material_id_start = line.find('-', last_equal);
+ int material_id = 0;
+ from_string(material_id, line.substr(material_id_start+1), std::dec);
+
+ // Assign material id to cells
+ const std::vector &elset_cells = elsets_list[elset_name];
+ for (unsigned int i = 0; i < elset_cells.size(); ++i)
+ {
+ const int cell_id = elset_cells[i] - 1;
+ cell_list[cell_id][0] = material_id;
+ }
+ }
+ // Note: All other lines / entries are ignored
+
+ std::getline (input_stream, line);
+
+cont:
+ (void) 0;
+ }
+ }
+
+ template
+ std::vector
+ Abaqus_to_UCD::get_global_node_numbers (const int face_cell_no,
+ const int face_cell_face_no) const
+ {
+ std::vector quad_node_list (GeometryInfo::vertices_per_face);
+
+ // These orderings were reverse engineered by hand and may
+ // conceivably be erroneous.
+ // TODO: Currently one test (2d unstructured mesh) in the test
+ // suite fails, presumably because of an ordering issue.
+ if (dim == 2)
+ {
+ if (face_cell_face_no == 1)
+ {
+ quad_node_list[0] = cell_list[face_cell_no - 1][1];
+ quad_node_list[1] = cell_list[face_cell_no - 1][2];
+ }
+ else if (face_cell_face_no == 2)
+ {
+ quad_node_list[0] = cell_list[face_cell_no - 1][2];
+ quad_node_list[1] = cell_list[face_cell_no - 1][3];
+ }
+ else if (face_cell_face_no == 3)
+ {
+ quad_node_list[0] = cell_list[face_cell_no - 1][3];
+ quad_node_list[1] = cell_list[face_cell_no - 1][4];
+ }
+ else if (face_cell_face_no == 4)
+ {
+ quad_node_list[0] = cell_list[face_cell_no - 1][4];
+ quad_node_list[1] = cell_list[face_cell_no - 1][1];
+ }
+ else
+ {
+ AssertThrow(face_cell_face_no <= 4, ExcMessage("Invalid face number in 2d"));
+ }
+ }
+ else if (dim == 3)
+ {
+ if (face_cell_face_no == 1)
+ {
+ quad_node_list[0] = cell_list[face_cell_no - 1][1];
+ quad_node_list[1] = cell_list[face_cell_no - 1][4];
+ quad_node_list[2] = cell_list[face_cell_no - 1][3];
+ quad_node_list[3] = cell_list[face_cell_no - 1][2];
+ }
+ else if (face_cell_face_no == 2)
+ {
+ quad_node_list[0] = cell_list[face_cell_no - 1][5];
+ quad_node_list[1] = cell_list[face_cell_no - 1][8];
+ quad_node_list[2] = cell_list[face_cell_no - 1][7];
+ quad_node_list[3] = cell_list[face_cell_no - 1][6];
+ }
+ else if (face_cell_face_no == 3)
+ {
+ quad_node_list[0] = cell_list[face_cell_no - 1][1];
+ quad_node_list[1] = cell_list[face_cell_no - 1][2];
+ quad_node_list[2] = cell_list[face_cell_no - 1][6];
+ quad_node_list[3] = cell_list[face_cell_no - 1][5];
+ }
+ else if (face_cell_face_no == 4)
+ {
+ quad_node_list[0] = cell_list[face_cell_no - 1][2];
+ quad_node_list[1] = cell_list[face_cell_no - 1][3];
+ quad_node_list[2] = cell_list[face_cell_no - 1][7];
+ quad_node_list[3] = cell_list[face_cell_no - 1][6];
+ }
+ else if (face_cell_face_no == 5)
+ {
+ quad_node_list[0] = cell_list[face_cell_no - 1][3];
+ quad_node_list[1] = cell_list[face_cell_no - 1][4];
+ quad_node_list[2] = cell_list[face_cell_no - 1][8];
+ quad_node_list[3] = cell_list[face_cell_no - 1][7];
+ }
+ else if (face_cell_face_no == 6)
+ {
+ quad_node_list[0] = cell_list[face_cell_no - 1][1];
+ quad_node_list[1] = cell_list[face_cell_no - 1][5];
+ quad_node_list[2] = cell_list[face_cell_no - 1][8];
+ quad_node_list[3] = cell_list[face_cell_no - 1][4];
+ }
+ else
+ {
+ AssertThrow(face_cell_no <= 6, ExcMessage("Invalid face number in 3d"));
+ }
+ }
+ else
+ {
+ AssertThrow(dim==2 || dim==3, ExcNotImplemented());
+ }
+
+ return quad_node_list;
+ }
+
+ template
+ void
+ Abaqus_to_UCD::write_out_avs_ucd (std::ostream &output) const
+ {
+ AssertThrow (output, ExcIO());
+
+ // Write out title - Note: No other commented text can be inserted below the
+ // title in a UCD file
+ output << "# Abaqus to UCD mesh conversion" << std::endl;
+ output << "# Mesh type: AVS UCD" << std::endl;
+
+ // ========================================================
+ // ASCII UCD File Format
+ // The input file cannot contain blank lines or lines with leading blanks.
+ // Comments, if present, must precede all data in the file.
+ // Comments within the data will cause read errors.
+ // The general order of the data is as follows:
+ // 1. Numbers defining the overall structure, including the number of nodes,
+ // the number of cells, and the length of the vector of data associated
+ // with the nodes, cells, and the model.
+ // e.g. 1:
+ //
+ // e.g. 2:
+ // n_elements = n_hex_cells + n_bc_quads + n_quad_cells + n_bc_edges
+ // outfile.write(str(n_nodes) + " " + str(n_elements) + " 0 0 0\n")
+ // 2. For each node, its node id and the coordinates of that node in space.
+ // Node-ids must be integers, but any number including non sequential
+ // numbers can be used. Mid-edge nodes are treated like any other node.
+ // 3. For each cell: its cell-id, material, cell type (hexahedral, pyramid,
+ // etc.), and the list of node-ids that correspond to each of the cell's
+ // vertices. The below table specifies the different cell types and the
+ // keyword used to represent them in the file.
+
+ // Write out header
+ output
+ << node_list.size() << "\t"
+ << (cell_list.size() + face_list.size()) << "\t0\t0\t0"
+ << std::endl;
+
+ // Write out node numbers
+ for (unsigned int ii = 0; ii < node_list.size(); ++ii) // Loop over all nodes
+ {
+ for (unsigned int jj = 0; jj < dim + 1; ++jj) // Loop over entries to be outputted
+ {
+ if (jj == 0) // Node number
+ {
+ output.precision();
+ output << node_list[ii][jj] << "\t";
+ }
+ else // Node coordinates
+ {
+ output.width (16);
+ output.setf (std::ios::scientific,
+ std::ios::floatfield);
+ output.precision (8);
+ if (std::abs (node_list[ii][jj]) > tolerance) // invoke tolerance -> set points close to zero equal to zero
+ output << static_cast (node_list[ii][jj]) << "\t";
+ else
+ output << 0.0 << "\t";
+ }
+ }
+ if (dim == 2)
+ output << 0.0 << "\t";
+
+ output
+ << std::endl;
+ output.unsetf (std::ios::floatfield);
+ }
+
+ // Write out cell node numbers
+ for (unsigned int ii = 0; ii < cell_list.size(); ++ii)
+ {
+ output
+ << ii + 1 << "\t"
+ << cell_list[ii][0] << "\t"
+ << (dim == 2 ? "quad" : "hex") << "\t";
+ for (unsigned int jj = 1; jj < GeometryInfo::vertices_per_cell + 1; ++jj)
+ output
+ << cell_list[ii][jj] << "\t";
+
+ output
+ << std::endl;
+ }
+
+ // Write out quad node numbers
+ for (unsigned int ii = 0; ii < face_list.size(); ++ii)
+ {
+ output
+ << ii + 1 << "\t"
+ << face_list[ii][0] << "\t"
+ << (dim == 2 ? "line" : "quad") << "\t";
+ for (unsigned int jj = 1; jj < GeometryInfo::vertices_per_face + 1; ++jj)
+ output
+ << face_list[ii][jj] << "\t";
+
+ output
+ << std::endl;
+ }
+ }
+}
//explicit instantiations
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index d9459fdc2a..fe1bcabe96 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -89,9 +89,7 @@ SET(_categories
slepc trilinos umfpack sharedtria
)
IF(DEFINED DEAL_II_HAVE_TESTS_DIRECTORY)
- # Only set up mesh_converter tests if the testsuite is set up as a
- # dependent project:
- LIST(APPEND _categories mesh_converter)
+
ENDIF()
#
diff --git a/tests/grid/grid_in_abaqus_01.cc b/tests/grid/grid_in_abaqus_01.cc
new file mode 100644
index 0000000000..0ef18ad438
--- /dev/null
+++ b/tests/grid/grid_in_abaqus_01.cc
@@ -0,0 +1,111 @@
+// ---------------------------------------------------------------------
+//
+// Copyright (C) 2004 - 2014 by the deal.II authors
+//
+// This file is part of the deal.II library.
+//
+// The deal.II library is free software; you can use it, redistribute
+// it, and/or modify it under the terms of the GNU Lesser General
+// Public License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// The full text of the license can be found in the file LICENSE at
+// the top level of the deal.II distribution.
+//
+// ---------------------------------------------------------------------
+
+
+
+// check whether we can read in with the abaqus format
+
+#include "../tests.h"
+#include
+
+#include
+#include
+#include
+#include
+
+#include
+#include
+
+
+template
+void abaqus_grid (const char *name)
+{
+ Triangulation tria;
+ GridIn grid_in;
+ grid_in.attach_triangulation (tria);
+ std::ifstream input_file(name);
+ grid_in.read_abaqus(input_file);
+
+ deallog << " " << tria.n_active_cells() << " active cells" << std::endl;
+
+ int hash = 0;
+ int index = 0;
+ for (typename Triangulation::active_cell_iterator c=tria.begin_active();
+ c!=tria.end(); ++c, ++index)
+ for (unsigned int i=0; i::vertices_per_cell; ++i)
+ hash += (index * i * c->vertex_index(i)) % (tria.n_active_cells()+1);
+ deallog << " hash=" << hash << std::endl;
+}
+
+
+int main ()
+{
+ std::ofstream logfile("output");
+ deallog.attach(logfile);
+ deallog.depth_console(0);
+ deallog.threshold_double(1.e-10);
+
+ try
+ {
+ deallog << "2d_test.inp" << std::endl;
+ abaqus_grid<2> (SOURCE_DIR "/grids/abaqus/2d/2d_test.inp");
+ deallog << "2d_quad.inp" << std::endl;
+ abaqus_grid<2> (SOURCE_DIR "/grids/abaqus/2d/2d_quad.inp");
+// deallog << "2d_test_pave.inp" << std::endl;
+// abaqus_grid<2> (SOURCE_DIR "/grids/abaqus/2d/2d_test_pave.inp"); // Failing test
+ deallog << "2d_test_abaqus.inp" << std::endl;
+ abaqus_grid<2> (SOURCE_DIR "/grids/abaqus/2d/2d_test_abaqus.inp");
+
+ deallog << "3d_test_cube_1.inp" << std::endl;
+ abaqus_grid<3> (SOURCE_DIR "/grids/abaqus/3d/3d_test_cube_1.inp");
+ deallog << "3d_test_cube_two_materials.inp" << std::endl;
+ abaqus_grid<3> (SOURCE_DIR "/grids/abaqus/3d/3d_test_cube_two_materials.inp");
+ deallog << "3d_CC_cubit_old.inp" << std::endl;
+ abaqus_grid<3> (SOURCE_DIR "/grids/abaqus/3d/3d_CC_cubit_old.inp");
+ deallog << "3d_CC_cubit_new.inp" << std::endl;
+ abaqus_grid<3> (SOURCE_DIR "/grids/abaqus/3d/3d_CC_cubit_new.inp");
+ deallog << "3d_test_cube_pave_1.inp" << std::endl;
+ abaqus_grid<3> (SOURCE_DIR "/grids/abaqus/3d/3d_test_cube_pave_1.inp");
+ deallog << "3d_other_simple.inp" << std::endl;
+ abaqus_grid<3> (SOURCE_DIR "/grids/abaqus/3d/3d_other_simple.inp");
+ deallog << "3d_test_abaqus.inp" << std::endl;
+ abaqus_grid<3> (SOURCE_DIR "/grids/abaqus/3d/3d_test_abaqus.inp");
+ }
+ catch (std::exception &exc)
+ {
+ deallog << std::endl << std::endl
+ << "----------------------------------------------------"
+ << std::endl;
+ deallog << "Exception on processing: " << std::endl
+ << exc.what() << std::endl
+ << "Aborting!" << std::endl
+ << "----------------------------------------------------"
+ << std::endl;
+ return 1;
+ }
+ catch (...)
+ {
+ deallog << std::endl << std::endl
+ << "----------------------------------------------------"
+ << std::endl;
+ deallog << "Unknown exception!" << std::endl
+ << "Aborting!" << std::endl
+ << "----------------------------------------------------"
+ << std::endl;
+ return 1;
+ };
+
+ return 0;
+}
diff --git a/tests/grid/grid_in_abaqus_01.output b/tests/grid/grid_in_abaqus_01.output
new file mode 100644
index 0000000000..afd1b2fe78
--- /dev/null
+++ b/tests/grid/grid_in_abaqus_01.output
@@ -0,0 +1,31 @@
+
+DEAL::2d_test.inp
+DEAL:: 108 active cells
+DEAL:: hash=17533
+DEAL::2d_quad.inp
+DEAL:: 4 active cells
+DEAL:: hash=19
+DEAL::2d_test_abaqus.inp
+DEAL:: 75 active cells
+DEAL:: hash=7783
+DEAL::3d_test_cube_1.inp
+DEAL:: 1 active cells
+DEAL:: hash=0
+DEAL::3d_test_cube_two_materials.inp
+DEAL:: 8 active cells
+DEAL:: hash=179
+DEAL::3d_CC_cubit_old.inp
+DEAL:: 16 active cells
+DEAL:: hash=920
+DEAL::3d_CC_cubit_new.inp
+DEAL:: 16 active cells
+DEAL:: hash=920
+DEAL::3d_test_cube_pave_1.inp
+DEAL:: 14 active cells
+DEAL:: hash=551
+DEAL::3d_other_simple.inp
+DEAL:: 1 active cells
+DEAL:: hash=0
+DEAL::3d_test_abaqus.inp
+DEAL:: 375 active cells
+DEAL:: hash=494873
diff --git a/contrib/mesh_conversion/mesh/2d/quad.cub b/tests/grid/grids/abaqus/2d/2d_quad.cub
similarity index 100%
rename from contrib/mesh_conversion/mesh/2d/quad.cub
rename to tests/grid/grids/abaqus/2d/2d_quad.cub
diff --git a/contrib/mesh_conversion/mesh/2d/quad.inp b/tests/grid/grids/abaqus/2d/2d_quad.inp
similarity index 100%
rename from contrib/mesh_conversion/mesh/2d/quad.inp
rename to tests/grid/grids/abaqus/2d/2d_quad.inp
diff --git a/contrib/mesh_conversion/mesh/2d/2d_test.cub b/tests/grid/grids/abaqus/2d/2d_test.cub
similarity index 100%
rename from contrib/mesh_conversion/mesh/2d/2d_test.cub
rename to tests/grid/grids/abaqus/2d/2d_test.cub
diff --git a/contrib/mesh_conversion/mesh/2d/2d_test.inp b/tests/grid/grids/abaqus/2d/2d_test.inp
similarity index 100%
rename from contrib/mesh_conversion/mesh/2d/2d_test.inp
rename to tests/grid/grids/abaqus/2d/2d_test.inp
diff --git a/tests/grid/grids/abaqus/2d/2d_test_abaqus.cae b/tests/grid/grids/abaqus/2d/2d_test_abaqus.cae
new file mode 100755
index 0000000000000000000000000000000000000000..827df1aa8a7d202e823a4a2df9e3542cf1121b49
GIT binary patch
literal 94208
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