00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "SAMRAI_config.h"
00011
00012 #include <iostream>
00013 #include <string>
00014
00015 #ifdef HAVE_ISO_HEADERS
00016 #include <fstream>
00017 using namespace std;
00018 #else
00019 #include <fstream.h>
00020 #endif
00021
00022 #include <printObjectX.h>
00023 #include "JacobiPoissonX.h"
00024
00025
00026
00027
00028 #include <tbox_SAMRAIManager.h>
00029 #include <tbox_Array.h>
00030 #include <tbox_Boolean.h>
00031 #include <tbox_Database.h>
00032 #include <tbox_InputManager.h>
00033 #include <tbox_MPI.h>
00034 #include <tbox_PIO.h>
00035 #include <tbox_Pointer.h>
00036 #include <tbox_String.h>
00037 #include <tbox_TimerManager.h>
00038 #include <tbox_Utilities.h>
00039 #include <plot_CartesianVizamraiDataWriter2.h>
00040
00041
00042
00043
00044 #include <hier_GridGeometry2.h>
00045 #include <hier_VariableDatabase2.h>
00046 #include <mesh_BergerRigoutsos2.h>
00047 #include <geom_CartesianGridGeometry2.h>
00048 #include <mesh_GriddingAlgorithm2.h>
00049 #include <hier_PatchHierarchy2.h>
00050 #include <mesh_StandardTagAndInitialize2.h>
00051 #include <mesh_UniformLoadBalance2.h>
00052
00053 #ifndef LACKS_NAMESPACE
00054 using namespace SAMRAI;
00055 #endif
00056
00057
00058
00059
00067 int main( int argc, char *argv[] )
00068 {
00069
00070
00071
00072
00073 tbox_MPI::init(&argc, &argv);
00074 tbox_SAMRAIManager::startup();
00075
00076 string input_filename = "input";
00077 if ( argc > 1 ) input_filename = argv[1];
00078
00079
00080
00081
00082
00083
00084 tbox_Pointer<tbox_Database> input_db = new tbox_InputDatabase("input_db");
00085 tbox_InputManager::getManager()->parseInputFile(input_filename, input_db);
00086
00087
00088
00089
00090
00091
00092
00093 tbox_Pointer<tbox_Database> main_db = input_db->getDatabase("Main");
00094 plog << "Main database:" << endl; main_db->printClassData(plog);
00095
00096
00097
00098
00099
00100
00101 string base_filename = main_db->getStringWithDefault("base_filename", "jp");
00102
00103
00104
00105
00106
00107
00108 string log_filename
00109 = main_db->getStringWithDefault("log_filename", base_filename+".log");
00110 tbox_PIO::logOnlyNodeZero(log_filename);
00111
00112
00113
00114
00115
00116
00117 tbox_Pointer<hier_PatchHierarchy2> patch_hierarchy;
00118 {
00119
00120
00121
00122 tbox_Pointer<geom_CartesianGridGeometryX> grid_geometry =
00123 new geom_CartesianGridGeometryX("CartesianGridGeometry",
00124 input_db->getDatabase("CartesianGridGeometry"));
00125 plog << "Grid Geometry:" << endl;
00126 grid_geometry->printClassData(plog);
00127 patch_hierarchy =
00128 new hier_PatchHierarchy2("Patch Hierarchy", grid_geometry);
00129 }
00130 printObjectX( plog, *patch_hierarchy );
00131
00132
00133
00134
00135
00136
00137
00138
00139 JacobiPoissonX* jacobi_poisson = new JacobiPoissonX(
00140 "JacobiPoissonX"
00141 , input_db->getDatabase("JacobiPoissonX")
00142 );
00143 printObjectX( plog, *patch_hierarchy );
00144
00145
00146
00147
00148
00149
00150
00151 tbox_Pointer<mesh_GriddingAlgorithmX> gridding_algorithm;
00152 {
00153
00154
00155
00156
00157 tbox_Pointer<mesh_StandardTagAndInitializeX> tag_and_initializer =
00158 new mesh_StandardTagAndInitializeX(
00159 "CellTaggingMethod"
00160 , jacobi_poisson
00161 , input_db->getDatabase("StandardTagAndInitialize")
00162 );
00163 tbox_Pointer<mesh_BergerRigoutsosX> box_generator =
00164 new mesh_BergerRigoutsosX();
00165 tbox_Pointer<mesh_UniformLoadBalanceX> load_balancer =
00166 new mesh_UniformLoadBalanceX(input_db->getDatabase("UniformLoadBalance"));
00167
00168 gridding_algorithm =
00169 new mesh_GriddingAlgorithmX("Gridding Algorithm",
00170 input_db->getDatabase("GriddingAlgorithm"),
00171 tag_and_initializer,
00172 box_generator,
00173 load_balancer);
00174 plog << "Gridding algorithm:" << endl;
00175 gridding_algorithm->printClassData(plog);
00176 }
00177
00178
00179
00180
00181
00182
00183 gridding_algorithm->makeCoarsestLevel(patch_hierarchy,0.0);
00184 bool done=false;
00185 for (int lnum = 0;
00186 gridding_algorithm->levelCanBeRefined(lnum) && !done; lnum++) {
00187 plog << "Adding finner levels with lnum = " << lnum << endl;
00188 gridding_algorithm->makeFinerLevel( patch_hierarchy
00189 , 0.0
00190 , true
00191 , 0
00192 );
00193 plog << "Just added finner levels with lnum = " << lnum << endl;
00194 done = !(patch_hierarchy->finerLevelExists(lnum));
00195 }
00196
00197
00198
00199
00200
00201
00202 tbox_Pointer<plot_CartesianVizamraiDataWriter2> viz_data_writer;
00203
00204 string viz_filename
00205 = main_db->getStringWithDefault("viz_filename", base_filename);
00206 int viz_dump_interval
00207 = main_db->getIntegerWithDefault("viz_dump_interval", 0 );
00208 if ( viz_dump_interval ) {
00209
00210 viz_data_writer = new plot_CartesianVizamraiDataWriter2("Viz Writer");
00211
00212 jacobi_poisson->registerVariablesWithPlotter(viz_data_writer);
00213
00214
00215
00216
00217 for ( int ln=1; ln<gridding_algorithm->getMaxLevels(); ln++ ) {
00218 const hier_IntVectorX &lratio =
00219 gridding_algorithm->getRatioToCoarserLevel(ln);
00220 viz_data_writer->setRatioToCoarserLevel(ln, lratio);
00221 }
00222
00223
00224
00225 int finest_plot_level
00226 = main_db->getIntegerWithDefault( "finest_plot_level"
00227 , patch_hierarchy->getFinestLevelNumber() );
00228 viz_data_writer->setFinestLevelToPlot(finest_plot_level);
00229 }
00230
00231
00232
00233
00234
00235
00236
00237
00238 plog << "\nCheck input data and variables before simulation:" << endl;
00239 plog << "Input database..." << endl;
00240 input_db->printClassData(plog);
00241 plog << "\nVariable database..." << endl;
00242 hier_VariableDatabaseX::getDatabase()->printClassData(plog);
00243
00244
00245
00246
00247
00248
00249
00250 pout.setf(ios::scientific);
00251 int number_of_iterations =
00252 main_db->getIntegerWithDefault("number_of_iterations",1);
00253 for ( int itnum=0; itnum<number_of_iterations; ++itnum ) {
00254 pout << "Iteration " << itnum
00255 ;
00256 if ( viz_dump_interval && !(itnum%viz_dump_interval) ) {
00257
00258 viz_data_writer->writePlotData( patch_hierarchy , viz_filename , itnum );
00259 }
00260
00261 jacobi_poisson->jacobiIteration( patch_hierarchy , 1.0 );
00262
00263 double l2norm, linorm;
00264 jacobi_poisson->computeError( patch_hierarchy, &l2norm, &linorm );
00265 pout << " l2norm " << l2norm << " linorm " << linorm << endl;
00266 }
00267
00268
00269
00270
00271
00272 if ( viz_dump_interval )
00273 viz_data_writer->writePlotData( patch_hierarchy , viz_filename
00274 , number_of_iterations );
00275
00276
00277
00278
00279
00280
00281 tbox_SAMRAIManager::shutdown();
00282 tbox_MPI::finalize();
00283
00284
00285 return(0);
00286 }