MOAB: Mesh Oriented datABase  (version 5.4.1)
main_moab.cpp
Go to the documentation of this file.
00001 /* *****************************************************************
00002     MESQUITE -- The Mesh Quality Improvement Toolkit
00003 
00004     Copyright 2004 Sandia Corporation and Argonne National
00005     Laboratory.  Under the terms of Contract DE-AC04-94AL85000
00006     with Sandia Corporation, the U.S. Government retains certain
00007     rights in this software.
00008 
00009     This library is free software; you can redistribute it and/or
00010     modify it under the terms of the GNU Lesser General Public
00011     License as published by the Free Software Foundation; either
00012     version 2.1 of the License, or (at your option) any later version.
00013 
00014     This library is distributed in the hope that it will be useful,
00015     but WITHOUT ANY WARRANTY; without even the implied warranty of
00016     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00017     Lesser General Public License for more details.
00018 
00019     You should have received a copy of the GNU Lesser General Public License
00020     (lgpl.txt) along with this library; if not, write to the Free Software
00021     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00022 
00023     [email protected], [email protected], [email protected],
00024     [email protected], [email protected], [email protected]
00025 
00026   ***************************************************************** */
00027 // -*- Mode : c++; tab-width: 3; c-tab-always-indent: t; indent-tabs-mode: nil; c-basic-offset: 3
00028 // -*-
00029 //
00030 //   SUMMARY:
00031 //     USAGE:
00032 //
00033 // ORIG-DATE: 19-Feb-02 at 10:57:52
00034 //  LAST-MOD: 10-Feb-04 at 22:44:58 by Thomas Leurent
00035 //
00036 //
00037 // DESCRIPTION:
00038 // ============
00039 /*! \file main.cpp
00040 
00041 describe main.cpp here
00042 
00043  */
00044 // DESCRIP-END.
00045 //
00046 
00047 #include "Mesquite.hpp"
00048 #include "MsqMOAB.hpp"
00049 #include "MeshImpl.hpp"
00050 #include "MsqError.hpp"
00051 #include "InstructionQueue.hpp"
00052 #include "TerminationCriterion.hpp"
00053 #include "QualityAssessor.hpp"
00054 #include "PlanarDomain.hpp"
00055 #include "MeshWriter.hpp"
00056 #include "TestUtil.hpp"
00057 
00058 // algorithms
00059 #include "IdealWeightInverseMeanRatio.hpp"
00060 #include "EdgeLengthQualityMetric.hpp"
00061 #include "LPtoPTemplate.hpp"
00062 #include "FeasibleNewton.hpp"
00063 #include "ConjugateGradient.hpp"
00064 #include "SmartLaplacianSmoother.hpp"
00065 
00066 #include <iostream>
00067 using std::cerr;
00068 using std::cout;
00069 using std::endl;
00070 
00071 #include "iBase.h"
00072 
00073 using namespace MBMesquite;
00074 
00075 std::string default_file_name = TestDir + "unittest/mesquite/3D/vtk/large_box_hex_1000.vtk";
00076 
00077 void usage()
00078 {
00079     cout << "main [-N] [filename]" << endl;
00080     cout << "  -N : Use native representation instead of TSTT implementation\n";
00081     cout << "  If no file name is specified, will use \"" << default_file_name << '"' << endl;
00082     exit( 1 );
00083 }
00084 
00085 // Construct a MeshTSTT from the file
00086 Mesh* get_imesh_mesh( const char* file_name );
00087 
00088 // Construct a MeshImpl from the file
00089 Mesh* get_native_mesh( const char* file_name );
00090 
00091 // Run FeasibleNewton solver
00092 int run_global_smoother( Mesh* mesh, MsqError& err );
00093 
00094 // Run SmoothLaplacian solver
00095 int run_local_smoother( Mesh* mesh, MsqError& err );
00096 
00097 int main( int argc, char* argv[] )
00098 {
00099     MBMesquite::MsqPrintError err( cout );
00100 
00101     // command line arguments
00102     const char* file_name = 0;
00103     bool use_native = false, opts_done = false;
00104     for( int arg = 1; arg < argc; ++arg )
00105     {
00106         if( !opts_done && argv[arg][0] == '-' )
00107         {
00108             if( !strcmp( argv[arg], "-N" ) )
00109                 use_native = true;
00110             else if( !strcmp( argv[arg], "--" ) )
00111                 opts_done = true;
00112             else
00113                 usage();
00114         }
00115         else if( !file_name )
00116             file_name = argv[arg];
00117         else
00118             usage();
00119     }
00120     if( !file_name )
00121     {
00122         file_name = default_file_name.c_str();
00123         cout << "No file specified: using default: " << default_file_name << endl;
00124     }
00125 
00126     // Try running a global smoother on the mesh
00127     Mesh* mesh = use_native ? get_native_mesh( file_name ) : get_imesh_mesh( file_name );
00128     if( !mesh )
00129     {
00130         std::cerr << "Failed to load input file.  Aborting." << std::endl;
00131         return 1;
00132     }
00133 
00134     MeshWriter::write_vtk( mesh, "original.vtk", err );
00135     if( err ) return 1;
00136     cout << "Wrote \"original.vtk\"" << endl;
00137     run_global_smoother( mesh, err );
00138     if( err ) return 1;
00139 
00140     // Try running a local smoother on the mesh
00141     mesh = use_native ? get_native_mesh( file_name ) : get_imesh_mesh( file_name );
00142     if( !mesh )
00143     {
00144         std::cerr << "Failed to load input file.  Aborting." << std::endl;
00145         return 1;
00146     }
00147 
00148     run_local_smoother( mesh, err );
00149     if( err ) return 1;
00150 
00151     return 0;
00152 }
00153 
00154 int run_global_smoother( Mesh* mesh, MsqError& err )
00155 {
00156     double OF_value = 0.0001;
00157 
00158     // creates an intruction queue
00159     InstructionQueue queue1;
00160 
00161     // creates a mean ratio quality metric ...
00162     IdealWeightInverseMeanRatio* mean_ratio = new IdealWeightInverseMeanRatio( err );
00163     if( err ) return 1;
00164     mean_ratio->set_averaging_method( QualityMetric::SUM, err );
00165     if( err ) return 1;
00166 
00167     // ... and builds an objective function with it
00168     LPtoPTemplate* obj_func = new LPtoPTemplate( mean_ratio, 1, err );
00169     if( err ) return 1;
00170 
00171     // creates the feas newt optimization procedures
00172     FeasibleNewton* pass1 = new FeasibleNewton( obj_func );
00173     pass1->use_global_patch();
00174     if( err ) return 1;
00175 
00176     QualityAssessor stop_qa( mean_ratio );
00177 
00178     // **************Set stopping criterion****************
00179     TerminationCriterion tc_inner;
00180     tc_inner.add_absolute_vertex_movement( OF_value );
00181     if( err ) return 1;
00182     TerminationCriterion tc_outer;
00183     tc_outer.add_iteration_limit( 1 );
00184     pass1->set_inner_termination_criterion( &tc_inner );
00185     pass1->set_outer_termination_criterion( &tc_outer );
00186 
00187     queue1.add_quality_assessor( &stop_qa, err );
00188     if( err ) return 1;
00189 
00190     // adds 1 pass of pass1 to mesh_set1
00191     queue1.set_master_quality_improver( pass1, err );
00192     if( err ) return 1;
00193 
00194     queue1.add_quality_assessor( &stop_qa, err );
00195     if( err ) return 1;
00196 
00197     // launches optimization on mesh_set
00198     queue1.run_instructions( mesh, err );
00199     if( err ) return 1;
00200 
00201     MeshWriter::write_vtk( mesh, "feasible-newton-result.vtk", err );
00202     if( err ) return 1;
00203     cout << "Wrote \"feasible-newton-result.vtk\"" << endl;
00204 
00205     // print_timing_diagnostics( cout );
00206     return 0;
00207 }
00208 
00209 int run_local_smoother( Mesh* mesh, MsqError& err )
00210 {
00211     double OF_value = 0.0001;
00212 
00213     // creates an intruction queue
00214     InstructionQueue queue1;
00215 
00216     // creates a mean ratio quality metric ...
00217     IdealWeightInverseMeanRatio* mean_ratio = new IdealWeightInverseMeanRatio( err );
00218     if( err ) return 1;
00219     mean_ratio->set_averaging_method( QualityMetric::SUM, err );
00220     if( err ) return 1;
00221 
00222     // ... and builds an objective function with it
00223     LPtoPTemplate* obj_func = new LPtoPTemplate( mean_ratio, 1, err );
00224     if( err ) return 1;
00225 
00226     // creates the smart laplacian optimization procedures
00227     SmartLaplacianSmoother* pass1 = new SmartLaplacianSmoother( obj_func );
00228 
00229     QualityAssessor stop_qa( mean_ratio );
00230 
00231     // **************Set stopping criterion****************
00232     TerminationCriterion tc_inner;
00233     tc_inner.add_absolute_vertex_movement( OF_value );
00234     TerminationCriterion tc_outer;
00235     tc_outer.add_iteration_limit( 1 );
00236     pass1->set_inner_termination_criterion( &tc_inner );
00237     pass1->set_outer_termination_criterion( &tc_outer );
00238 
00239     queue1.add_quality_assessor( &stop_qa, err );
00240     if( err ) return 1;
00241 
00242     // adds 1 pass of pass1 to mesh_set
00243     queue1.set_master_quality_improver( pass1, err );
00244     if( err ) return 1;
00245 
00246     queue1.add_quality_assessor( &stop_qa, err );
00247     if( err ) return 1;
00248 
00249     // launches optimization on mesh_set
00250     queue1.run_instructions( mesh, err );
00251     if( err ) return 1;
00252 
00253     MeshWriter::write_vtk( mesh, "smart-laplacian-result.vtk", err );
00254     if( err ) return 1;
00255     cout << "Wrote \"smart-laplacian-result.vtk\"" << endl;
00256 
00257     // print_timing_diagnostics( cout );
00258     return 0;
00259 }
00260 
00261 Mesh* get_imesh_mesh( const char* file_name )
00262 {
00263     moab::Core* mb = new( std::nothrow ) moab::Core;
00264     if( NULL == mb ) return 0;
00265 
00266     moab::ErrorCode rval;
00267     // This file is in the mesh files directory
00268     rval = mb->load_file( file_name );MB_CHK_SET_ERR_RET_VAL( rval, "Failed to read", 0 );
00269 
00270     moab::Tag fixed_tag;
00271     rval = mb->tag_get_handle( "fixed", fixed_tag );
00272 
00273     moab::EntityHandle root_set = 0;
00274     MsqError err;
00275     Mesh* result = new MBMesquite::MsqMOAB( mb, root_set, moab::MBHEX, err, &fixed_tag );
00276     if( MSQ_CHKERR( err ) )
00277     {
00278         delete result;
00279         cerr << err << endl;
00280         return 0;
00281     }
00282 
00283     return result;
00284 }
00285 
00286 Mesh* get_native_mesh( const char* file_name )
00287 {
00288     MsqError err;
00289     MeshImpl* mesh = new MeshImpl;
00290     if( !mesh )
00291     {
00292         cerr << "Failed during MeshImpl construction.\n";
00293         exit( 2 );
00294     }
00295     mesh->read_vtk( file_name, err );
00296     if( err )
00297     {
00298         cerr << err << endl;
00299         exit( 3 );
00300     }
00301 
00302     return mesh;
00303 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines