Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bddc #3738

Merged
merged 27 commits into from
Dec 3, 2018
Merged

Bddc #3738

Show file tree
Hide file tree
Changes from 7 commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
9b55f6a
BDDC: new xml files for tests
crdohrm Oct 23, 2018
bbacfaa
BDDC: new files for examples
crdohrm Oct 23, 2018
8778b75
BDDC: new files for preconditioner and testing
crdohrm Oct 23, 2018
d25fd8e
BDDC: new test file
crdohrm Oct 23, 2018
609475b
BDDC: major modifications and some deletions
crdohrm Oct 23, 2018
8ff0bd4
BDDC: some minor fixes when optional packages/TPLs are not enabled
crdohrm Oct 23, 2018
c33cc56
Merge remote-tracking branch 'upstream/develop' into bddc
crdohrm Oct 26, 2018
4095668
BDDC: many changes to addreass pull requrest comments from Mark H. an…
crdohrm Nov 6, 2018
0c3e77c
Merge remote-tracking branch 'upstream/develop' into bddc
crdohrm Nov 6, 2018
c8b9066
removed generateRootMap function since it's not called from anywhere
crdohrm Nov 18, 2018
3b560f9
adjustments to use a const reference in the PComm constructor
crdohrm Nov 18, 2018
4cf656c
Use ScopeGuard to simplify things a lot. Many thanks to Mark Hoemmen for
crdohrm Nov 18, 2018
a4acb62
separate individual tests for greater flexibility in testing (thanks …
crdohrm Nov 18, 2018
7ad346b
change specifications for bddc from "EX OPTIONAL" to "PT REQUIRED"
crdohrm Nov 18, 2018
bd61574
BDDC: change from .h extensions to .hpp extensions
crdohrm Nov 19, 2018
d81789b
BDDC:changes from .h extensions to .hpp extensions
crdohrm Nov 19, 2018
71bdeb9
Merge remote-tracking branch 'upstream/develop' into bddc
crdohrm Nov 19, 2018
e9c623d
BDDC: Removed Experimental namespace for Tacho. I think I didn't catc…
crdohrm Nov 20, 2018
3176884
Merge remote-tracking branch 'upstream/develop' into bddc
crdohrm Nov 20, 2018
cb29cee
BDDC: fix spelling error and remove two unneeded lines
crdohrm Nov 20, 2018
e8c96c6
Merge remote-tracking branch 'upstream/develop' into bddc
crdohrm Nov 20, 2018
8520356
BDDC: install .hpp files instead of .h files and put .cpp files in a …
crdohrm Nov 28, 2018
54a2ef2
BDDC: New files needed to hide SuperLU header files from users (with …
crdohrm Nov 28, 2018
6bb29b6
BDDC: part of refactor to hide SuperLU header files from users
crdohrm Nov 28, 2018
abf9134
Merge remote-tracking branch 'upstream/develop' into bddc
crdohrm Nov 28, 2018
334be82
BDDC: add missing #if defined(HAVE_SHYLU_DDBDDC_SUPERLU)
crdohrm Nov 28, 2018
ecb3d27
BDDC: added missing header file (don't know why this wasn't needed be…
crdohrm Nov 28, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions packages/shylu/shylu_dd/bddc/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ ADD_SUBDIRECTORY(src)

TRIBITS_ADD_TEST_DIRECTORIES(test)


#TRIBITS_ADD_EXAMPLE_DIRECTORIES(example)
TRIBITS_ADD_EXAMPLE_DIRECTORIES(example)

TRIBITS_SUBPACKAGE_POSTPROCESS()
6 changes: 3 additions & 3 deletions packages/shylu/shylu_dd/bddc/cmake/Dependencies.cmake
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
SET(LIB_REQUIRED_DEP_PACKAGES Tpetra Teuchos Zoltan)
SET(LIB_OPTIONAL_DEP_PACKAGES ShyLU_NodeTacho)
SET(LIB_OPTIONAL_DEP_PACKAGES Amesos2 MueLu ShyLU_NodeTacho)
SET(TEST_REQUIRED_DEP_PACKAGES Gtest)
SET(TEST_OPTIONAL_DEP_PACKAGES)
SET(LIB_REQUIRED_DEP_TPLS MPI METIS)
SET(LIB_OPTIONAL_DEP_TPLS MKL PARDISO_MKL SuperLU)
SET(LIB_REQUIRED_DEP_TPLS MPI BLAS LAPACK)
SET(LIB_OPTIONAL_DEP_TPLS MKL PARDISO_MKL SuperLU METIS ParMETIS)
SET(TEST_REQUIRED_DEP_TPLS)
SET(TEST_OPTIONAL_DEP_TPLS)

8 changes: 8 additions & 0 deletions packages/shylu/shylu_dd/bddc/cmake/ShyLU_DDBDDC_config.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@

#cmakedefine HAVE_SHYLU_DDBDDC_TPETRA
mhoemmen marked this conversation as resolved.
Show resolved Hide resolved

#cmakedefine HAVE_SHYLU_DDBDDC_PARMETIS

#cmakedefine HAVE_SHYLU_DDBDDC_METIS

#cmakedefine HAVE_SHYLU_DDBDDC_MKL
Expand All @@ -19,6 +21,12 @@

#cmakedefine HAVE_SHYLU_DDBDDC_SUPERLU

#cmakedefine HAVE_SHYLU_DDBDDC_MUELU

#cmakedefine HAVE_SHYLU_DDBDDC_SHYLU_NODETACHO

#cmakedefine HAVE_SHYLU_DDBDDC_AMESOS2

#cmakedefine HAVE_SHYLU_DDBDDC_LAPACK
mhoemmen marked this conversation as resolved.
Show resolved Hide resolved

#endif // SHYLU_DDBDDCCONFIG_H
26 changes: 26 additions & 0 deletions packages/shylu/shylu_dd/bddc/example/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})

TRIBITS_ADD_EXECUTABLE_AND_TEST(
example1
SOURCES example1.C
mhoemmen marked this conversation as resolved.
Show resolved Hide resolved
DEPLIBS
ARGS ""
COMM mpi
NUM_MPI_PROCS 8
mhoemmen marked this conversation as resolved.
Show resolved Hide resolved
)

TRIBITS_ADD_EXECUTABLE_AND_TEST(
simpleExample1
SOURCES simpleExample1.C
DEPLIBS
ARGS ""
COMM mpi
NUM_MPI_PROCS 8
)

TRIBITS_COPY_FILES_TO_BINARY_DIR(ShyLUBDDCExampleFiles
SOURCE_FILES problemMaker.xml problemMakerSimple.xml bddc.xml
)

48 changes: 48 additions & 0 deletions packages/shylu/shylu_dd/bddc/example/bddc.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<ParameterList name="BDDC">
<Parameter name="Use Corners" type="bool" value="false"/>
<Parameter name="Use Edges" type="bool" value="true"/>
<Parameter name="Use Faces" type="bool" value="false"/>
<Parameter name="Corner Weight Type" type="string" value="stiffness"/>
<Parameter name="Edge Weight Type" type="string" value="stiffness"/>
<Parameter name="Face Weight Type" type="string" value="stiffness"/>
<Parameter name="Use Vertex Coarse Space" type="bool" value="false"/>
<Parameter name="Economic Vertex Coarse Space" type="bool" value="false"/>
<Parameter name="Interface Preconditioner" type="bool" value="false"/>
<Parameter name="Use PComm" type="bool" value="true"/>
<!-- Krylov Solver options: -->
<!-- PCG: preconditioned conjugate gradient -->
<!-- GCR: generalized conjugate residual -->
<Parameter name="Krylov Solver" type="string" value="PCG"/>
<Parameter name="Maximum Iterations" type="int" value="20"/>
<Parameter name="Convergence Tolerance" type="double" value="1e-6"/>
<Parameter name="Convergence Check Interval" type="int" value="100"/>
<Parameter name="Maximum Stored Directions" type="int" value="200"/>
<!-- Solver options: -->
<!-- LAPACK: uses LAPACK banded or dense solver (not best option) -->
<!-- SuperLU: requires enabling SuperLU TPL -->
<!-- Pardiso: requires enabling Intel/MKL Pardiso TPL -->
<!-- KLU2: requires enabling Amesos2 package -->
<!-- Tacho: requires enabling Tacho in Shylu_node subpackage -->
<!-- MueLu: requires enabling MueLu package -->
<Parameter name="Dirichlet Solver" type="string" value="LAPACK"/>
<Parameter name="Neumann Solver" type="string" value="LAPACK"/>
<Parameter name="Coarse Solver" type="string" value="LAPACK"/>
<Parameter name="Estimate Condition Number" type="bool" value="true"/>
<Parameter name="Print Summary" type="int" value="3"/>
<Parameter name="numSubdomainsPerCoarseSubdomain" type="int" value="1000"/>
<Parameter name="numCoarseSubdomainsPerMpiRank" type="int" value="1"/>
<!-- coarsening options: -->
<!-- Graph: graph-based -->
<!-- RCB: recursive coordinate bisection -->
<!-- RIB: recursive inetial bisection -->
<Parameter name="Coarsening Option" type="string" value="RCB"/>
<!-- graph package options = PHG or ParMETIS -->
<Parameter name="Graph Package" type="string" value="PHG"/>
<Parameter name="Output Timing" type="bool" value="false"/>
<Parameter name="Operator Name" type="string" value="none"/>
<Parameter name="Print Coarsest Matrix" type="bool" value="false"/>
<Parameter name="Print Vertex Matrix" type="bool" value="false"/>
<Parameter name="Print Psi Matrix" type="bool" value="false"/>
<Parameter name="Print Operator Matrix" type="bool" value="false"/>
<Parameter name="Print Preconditioner Matrix" type="bool" value="false"/>
</ParameterList>
210 changes: 210 additions & 0 deletions packages/shylu/shylu_dd/bddc/example/example1.C
Original file line number Diff line number Diff line change
@@ -0,0 +1,210 @@

//@HEADER
// ************************************************************************
//
// ShyLU: Hybrid preconditioner package
// Copyright 2012 Sandia Corporation
//
// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
// the U.S. Government retains certain rights in this software.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// 1. Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// 3. Neither the name of the Corporation nor the names of the
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Questions? Contact Michael A. Heroux ([email protected])
//
// ************************************************************************
//@HEADER

#include <mpi.h>
#include "ShyLU_DDBDDC_config.h"
#if defined(HAVE_SHYLU_DDBDDC_SHYLU_NODETACHO)
#include "Kokkos_Core.hpp"
#endif
#include "shylu_PreconditionerBDDC.h"
#include "shylu_KrylovSolver.h"
#include "setupTest.h"
#include <Teuchos_XMLParameterListHelpers.hpp>

using Teuchos::RCP;

typedef int LO; // Local Ordinal
typedef long GO; // Global Ordinal
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you're using Tpetra in this example, you would need to check whether GO=long is enabled. If you don't really depend on GO=long, it would be better just to depend on Tpetra's default global ordinal type:

typedef Tpetra::Map<>::global_ordinal_type GO;

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Followed your suggestion and am now using Tpetra's default global ordinal type.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here is how you can ensure that you always get a 64-bit global ordinal type:

// Your application prefers long, though I don't 
// necessarily agree that this is a good idea. 
#if defined(HAVE_TPETRA_INST_INT_LONG)
  using GO = long;
#elif defined(HAVE_TPETRA_INST_INT_LONG_LONG)
  using GO = long long;
#elif defined(HAVE_TPETRA_INST_INT_UNSIGNED_LONG)
  using GO = unsigned long;
#  error "Tpetra does not enable one of the possibly 64-bit global ordinal types."
#endif
static_assert (sizeof (GO) >= size_t (8), "GO is not a 64-bit type.");

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Once Tpetra finishes deprecation and removal of the GlobalOrdinal template parameter, you should be able to remove the macros and just have one typedef for GO and a static_assert. The typedef for GO would look like this: using GO = Tpetra::Map::global_ordinal_type;. Right now, since the template parameters are still there, you could write using GO = Tpetra::Map<>::global_ordinal_type;.

typedef double SX; // floating point data type
typedef double SM; // real (magnitude) for SX

void readInputFiles(MPI_Comm Comm,
const std::string fileNamePM,
const std::string fileNameBDDC,
const std::string fileNameMueLu,
const std::string fileNameNodalAMG,
RCP<Teuchos::ParameterList> & parametersPM,
RCP<Teuchos::ParameterList> & parametersBDDC,
RCP<Teuchos::ParameterList> & parametersMueLu,
RCP<Teuchos::ParameterList> & parametersNodalAMG)
{
RCP<const Teuchos::Comm<int> > TComm =
Teuchos::rcp( new Teuchos::MpiComm<int>(Comm) );
Teuchos::ParameterList paramsPM, paramsBDDC, paramsMueLu, paramsNodalAMG;

Teuchos::updateParametersFromXmlFileAndBroadcast
(fileNamePM, Teuchos::Ptr<Teuchos::ParameterList>(&paramsPM), *TComm);
parametersPM = Teuchos::rcp( new Teuchos::ParameterList(paramsPM) );

Teuchos::updateParametersFromXmlFileAndBroadcast
(fileNameBDDC, Teuchos::Ptr<Teuchos::ParameterList>(&paramsBDDC), *TComm);
parametersBDDC = Teuchos::rcp( new Teuchos::ParameterList(paramsBDDC) );

if (fileNameMueLu != "") {
Teuchos::updateParametersFromXmlFileAndBroadcast
(fileNameMueLu, Teuchos::Ptr<Teuchos::ParameterList>(&paramsMueLu),
*TComm);
parametersMueLu = Teuchos::rcp( new Teuchos::ParameterList(paramsMueLu) );
}

if (fileNameNodalAMG != "") {
Teuchos::updateParametersFromXmlFileAndBroadcast
(fileNameNodalAMG, Teuchos::Ptr<Teuchos::ParameterList>(&paramsNodalAMG),
*TComm);
parametersNodalAMG =
Teuchos::rcp( new Teuchos::ParameterList(paramsNodalAMG) );
}
}

void runTest(RCP<Teuchos::ParameterList> & parametersPM,
RCP<Teuchos::ParameterList> & parametersBDDC,
RCP<Teuchos::ParameterList> & parametersMueLu,
RCP<Teuchos::ParameterList> & parametersNodalAMG,
const std::string meshDataFile,
const int myPID,
MPI_Comm Comm,
const bool resetFile,
int & numIterations)
{
// setup test data
bddc::setupTest<LO,GO,SX,SM>
test(parametersPM, parametersBDDC, parametersMueLu,
parametersNodalAMG, meshDataFile, Comm);
LO numNode, *nodeBegin(nullptr), *localDofs(nullptr);
const GO *nodeGlobalIDs(nullptr);
const SM *xCoord(nullptr), *yCoord(nullptr), *zCoord(nullptr);
std::vector<LO*> subRowBeginPtr, subColumnsPtr;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

std::vector of raw pointer suggests a memory leak to me. Do those inner pointers get freed / cleaned up at some point?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For better or worse, I wanted to have a plain old data interface to BDDC. The pointers actually point to standard vector data that later gets deallocated.

std::vector<SX*> subValuesPtr;
bddc::OperatorBase<SX>* Operator(nullptr);
// extract test data
test.getProblemData(numNode, nodeBegin, localDofs, nodeGlobalIDs,
xCoord, yCoord, zCoord, subRowBeginPtr,
subColumnsPtr, subValuesPtr, Operator);
const std::vector< std::vector<LO> > & subNodes = test.getSubNodes();
std::vector<int> nodeSend;
bddc::getNodeSend(numNode, nodeGlobalIDs, Comm, nodeSend);
// initialize preconditioner
int level(0);
MPI_Barrier(Comm);
double startTimeBDDCPre = test.getTime();
RCP< bddc::PreconditionerBDDC<SX,SM,LO,GO> > Preconditioner =
rcp( new bddc::PreconditionerBDDC<SX,SM,LO,GO>
(numNode, nodeBegin, localDofs, nodeGlobalIDs, xCoord, yCoord, zCoord,
subNodes, subRowBeginPtr.data(), subColumnsPtr.data(),
subValuesPtr.data(), parametersBDDC, Comm, level, Operator,
&nodeSend) );
MPI_Barrier(Comm);
double stopTimeBDDCPre = test.getTime();
const LO numMyRows = Preconditioner->NumMyRows();
std::vector<SX> rhs;
test.getRhs(numMyRows, rhs);
double startTimeKrylovInit(0), startTimeKrylovSolve(0);
double stopTimeKrylovInit(0), stopTimeKrylovSolve(0);
test.openFiles(Preconditioner, resetFile);
MPI_Barrier(Comm);
// initialize Krylov solver
startTimeKrylovInit = test.getTime();
RCP< bddc::KrylovSolver<SX,SM,LO,GO> > Solver =
rcp ( new bddc::KrylovSolver<SX,SM,LO,GO>(Preconditioner, parametersBDDC) );
std::vector<SX> sol(numMyRows), Ax(numMyRows);
MPI_Barrier(Comm);
// solve equations
stopTimeKrylovInit = test.getTime();
startTimeKrylovSolve = test.getTime();
LO numberOfSolves = parametersPM->get("Number of Solves", 1);
for (int i=0; i<numberOfSolves; i++) {
if (i > 0) test.updateRhs(rhs.data(), numMyRows);
Solver->Solve(rhs.data(), sol.data());
}
MPI_Barrier(Comm);
stopTimeKrylovSolve = test.getTime();
Preconditioner->ApplyFullOperator(sol.data(), Ax.data());
for (LO i=0; i<numMyRows; i++) {
Ax[i] = rhs[i] - Ax[i];
}
// check solution
SM normError = Preconditioner->Norm2(Ax.data(), numMyRows);
SM normRhs = Preconditioner->Norm2(rhs.data(), numMyRows);
if (myPID == 0) {
std::cout << "BDDC Preconditioner initialization time = "
<< stopTimeBDDCPre - startTimeBDDCPre << std::endl;
std::cout << "KrylovSolver initialization time = "
<< stopTimeKrylovInit - startTimeKrylovInit << std::endl;
std::cout << "KrylovSolver solve solve time = "
<< stopTimeKrylovSolve - startTimeKrylovSolve << std::endl;
std::cout << "relative residual = " << normError/normRhs << std::endl;
}
const bool outputTiming = parametersBDDC->get("Output Timing", false);
if (outputTiming) {
int krylovMethod = parametersBDDC->get("Krylov Method", 0);
test.printTimings(Preconditioner, Solver, krylovMethod);
Preconditioner->printTimings("BDDC_timers.dat");
}
}

int main (int argc, char *argv[]) {
MPI_Init(&argc, &argv);
mhoemmen marked this conversation as resolved.
Show resolved Hide resolved
#if defined(HAVE_SHYLU_DDBDDC_SHYLU_NODETACHO)
Kokkos::initialize(argc, argv);
#endif
const std::string fileNamePM = "problemMaker.xml";
const std::string fileNameBDDC = "bddc.xml";
const std::string fileNameMueLu = "";
const std::string fileNameNodalAMG = "";
const std::string meshDataFile = "";
RCP<Teuchos::ParameterList> parametersPM, parametersBDDC, parametersMueLu,
parametersNodalAMG;
MPI_Comm Comm = MPI_COMM_WORLD;
int myPID;
MPI_Comm_rank(Comm, &myPID);
readInputFiles(Comm, fileNamePM, fileNameBDDC, fileNameMueLu,
fileNameNodalAMG, parametersPM, parametersBDDC,
parametersMueLu, parametersNodalAMG);
int numIterations;
bool resetFile = true;
runTest(parametersPM, parametersBDDC, parametersMueLu, parametersNodalAMG,
meshDataFile, myPID, Comm, resetFile, numIterations);
#if defined(HAVE_SHYLU_DDBDDC_SHYLU_NODETACHO)
Kokkos::finalize();
#endif
MPI_Finalize();
}
39 changes: 39 additions & 0 deletions packages/shylu/shylu_dd/bddc/example/problemMaker.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<ParameterList name="BDDC">
<!-- Problem Type options: -->
<!-- Poisson-3D -->
<!-- Elasticity-3D -->
<!-- Poisson-2D -->
<!-- Elasticity-3D -->
<Parameter name="Problem Type String" type="string" value="Poisson-3D"/>
<Parameter name="Length Direction 1" type="double" value="1"/>
<Parameter name="Length Direction 2" type="double" value="1"/>
<Parameter name="Length Direction 3" type="double" value="1"/>
<Parameter name="Number Subregions Direction 1" type="int" value="2"/>
<Parameter name="Number Subregions Direction 2" type="int" value="2"/>
<Parameter name="Number Subregions Direction 3" type="int" value="2"/>
<Parameter name="Number Subdomains Per Subregion Direction 1" type="int" value="2"/>
<Parameter name="Number Subdomains Per Subregion Direction 2" type="int" value="2"/>
<Parameter name="Number Subdomains Per Subregion Direction 3" type="int" value="2"/>
<Parameter name="Number of Elements Per Subdomain Direction 1" type="int" value="4"/>
<Parameter name="Number of Elements Per Subdomain Direction 2" type="int" value="4"/>
<Parameter name="Number of Elements Per Subdomain Direction 3" type="int" value="4"/>
<Parameter name="Sort Subdomain Nodes" type="bool" value="true"/>
<Parameter name="Apply Left Side Essential BCs" type="bool" value="true"/>
<Parameter name="Apply Right Side Essential BCs" type="bool" value="false"/>
<!-- Diagonal Scale Factor > 1 removes singularities for floating domains -->
<Parameter name="Diagonal Scale Factor" type="double" value="1.0000"/>
<Parameter name="Output Model" type="bool" value="false"/>
<Parameter name="Load Direction" type="int" value="0"/>
<Parameter name="Material Property Option" type="int" value="0"/>
<Parameter name="E1" type="double" value="1.0"/>
<Parameter name="nu1" type="double" value="0.3"/>
<Parameter name="E2" type="double" value="1.0"/>
<Parameter name="nu2" type="double" value="0.3"/>
<Parameter name="Artificial Foundation Stiffness" type="double" value="0"/>
<Parameter name="omega" type="double" value="0"/>
<Parameter name="Adjust Nodal Coordinates" type="bool" value="true"/>
<Parameter name="Add Asymmetry" type="bool" value="false"/>
<Parameter name="Number of Solves" type="int" value="2"/>
<Parameter name="Quad Type 2 Point" type="int" value="1"/>
<Parameter name="Quad Type TP" type="int" value="1"/>
</ParameterList>
Loading