00001
00002
00003 #include "cddefines.h"
00004 #include "mpi_utilities.h"
00005 #include "save.h"
00006 #include "grid.h"
00007
00008 #ifdef MPI_ENABLED
00009
00010 namespace MPI
00011 {
00012 void load_balance::init(int nJobs)
00013 {
00014 ASSERT( nJobs > 0 );
00015 p_jobs.resize( nJobs );
00016 p_ptr = COMM_WORLD.Get_rank();
00017
00018
00019 if( p_ptr == 0 )
00020 {
00021 for( int i=0; i < nJobs; ++i )
00022 p_jobs[i] = i;
00023
00024
00025 srand( unsigned( time(NULL) ) );
00026 random_shuffle( p_jobs.begin(), p_jobs.end() );
00027 }
00028
00029 COMM_WORLD.Bcast( &p_jobs[0], nJobs, type(p_jobs[0]), 0 );
00030 }
00031 }
00032
00033 #endif
00034
00036 void process_output()
00037 {
00038 DEBUG_ENTRY( "process_output()" );
00039
00040
00041
00042 string main_input = save.chRedirectPrefix + ".in";
00043 string main_output = save.chRedirectPrefix + ".out";
00044
00045
00046 FILE* main_output_handle = open_data( main_output.c_str(), "a", AS_LOCAL_ONLY );
00047 for( int j=0; j < grid.totNumModels; ++j )
00048 {
00049 string Base = GridPointPrefix(j) + save.chRedirectPrefix;
00050 string in_name = Base + ".in";
00051 remove( in_name.c_str() );
00052 string out_name = Base + ".out";
00053 append_file( main_output_handle, out_name.c_str() );
00054 remove( out_name.c_str() );
00055 }
00056 fclose( main_output_handle );
00057
00058 fstream main_input_handle;
00059 open_data( main_input_handle, main_input.c_str(), mode_r, AS_LOCAL_ONLY );
00060 string line;
00061
00062 int ipPun = 0;
00063
00064 while( getline( main_input_handle, line ) )
00065 {
00066 string caps_line;
00067
00068 string::const_iterator p = line.begin();
00069 while( p != line.end() )
00070 caps_line.push_back( toupper(*p++) );
00071 if( caps_line.compare( 0, 4, "SAVE" ) == 0 || caps_line.compare( 0, 4, "PUNC" ) == 0 )
00072 {
00073 ASSERT( ipPun < save.nsave );
00074 string fnam = save.chFilenamePrefix;
00075 string::size_type p = line.find( '"' );
00076 fnam += line.substr( ++p );
00077 fnam.erase( fnam.find( '"' ) );
00078
00079 FILE *dest = open_data( fnam.c_str(), "ab", AS_LOCAL_ONLY_TRY );
00080 if( dest != NULL )
00081 {
00082 if( save.lgSaveToSeparateFiles[ipPun] )
00083 {
00084
00085
00086
00087
00088 string gridnam = GridPointPrefix(0) + fnam;
00089 append_file( dest, gridnam.c_str() );
00090 fclose( dest );
00091 dest = NULL;
00092
00093 rename( fnam.c_str(), gridnam.c_str() );
00094 }
00095 else
00096 {
00097
00098 for( int j=0; j < grid.totNumModels; ++j )
00099 {
00100 string gridnam = GridPointPrefix(j) + fnam;
00101 append_file( dest, gridnam.c_str() );
00102 remove( gridnam.c_str() );
00103 }
00104 }
00105 if( caps_line.find( "XSPE", 4 ) != string::npos )
00106 {
00107
00108 ASSERT( save.FITStype[ipPun] >= 0 &&
00109 save.FITStype[ipPun] < NUM_OUTPUT_TYPES );
00110 saveFITSfile( dest, save.FITStype[ipPun] );
00111 fseek( dest, 0, SEEK_END );
00112 ASSERT( ftell(dest)%2880 == 0 );
00113 }
00114 if( dest != NULL )
00115 {
00116 fclose( dest );
00117 }
00118 }
00119 else
00120 {
00121 fprintf( ioQQQ, " PROBLEM - could not open file %s\n", fnam.c_str() );
00122 }
00123 ++ipPun;
00124 }
00125 }
00126 }
00127
00129 void append_file( FILE *dest, const char *source )
00130 {
00131 DEBUG_ENTRY( "append_file()" );
00132
00133 FILE *src = open_data( source, "rb", AS_LOCAL_ONLY_TRY );
00134 if( src == NULL )
00135 return;
00136 int chr = fgetc(src);
00137 while( ! feof(src) )
00138 {
00139 fputc( chr, dest );
00140 chr = fgetc(src);
00141 }
00142 fclose(src);
00143 return;
00144 }