/*========================================*/ int initCAN(int bus) { NCTYPE_ATTRID AttrIdList[8]; NCTYPE_UINT32 AttrValueList[8]; //NCTYPE_UINT32 Baudrate = 125000; // BAUD_125K NCTYPE_UINT32 Baudrate = NC_BAUD_1000K; char Interface[15]; NCTYPE_STATUS Status = 0; NCTYPE_OBJH TxHandle; sprintf_s(Interface, "CAN%d", bus); // Configure the CAN Network Interface Object AttrIdList[0] = NC_ATTR_BAUD_RATE; AttrValueList[0] = Baudrate; AttrIdList[1] = NC_ATTR_START_ON_OPEN; AttrValueList[1] = NC_TRUE; AttrIdList[2] = NC_ATTR_READ_Q_LEN; AttrValueList[2] = 100; AttrIdList[3] = NC_ATTR_WRITE_Q_LEN; AttrValueList[3] = 10; AttrIdList[4] = NC_ATTR_CAN_COMP_STD; AttrValueList[4] = 0;//0xCFFFFFFF; AttrIdList[5] = NC_ATTR_CAN_MASK_STD; AttrValueList[5] = NC_CAN_MASK_STD_DONTCARE; AttrIdList[6] = NC_ATTR_CAN_COMP_XTD; AttrValueList[6] = 0;//0xCFFFFFFF; AttrIdList[7] = NC_ATTR_CAN_MASK_XTD; AttrValueList[7] = NC_CAN_MASK_XTD_DONTCARE; printf("<< CAN: Config\n"); Status = ncConfig(Interface, 2, AttrIdList, AttrValueList); if (Status < 0) { PrintStat(bus, Status, "ncConfig"); return Status; } printf(" - Done\n"); // open the CAN Network Interface Object printf("<< CAN: Open Channel\n"); Status = ncOpenObject (Interface, &TxHandle); if (Status < 0) { PrintStat(bus, Status, "ncOpenObject"); return Status; } canDev[bus] = TxHandle; printf(" - Done\n"); return 0; }
void RemoveLowLocalAndOutputChanged(SuccinctDBG &dbg, FILE *contigs_file, FILE *multi_file, FILE *final_contig_file, FILE *addi_contig_file, FILE *addi_multi_file, double min_depth, int min_len, double local_ratio, int min_final_contig_len) { xtimer_t timer; timer.reset(); timer.start(); UnitigGraph unitig_graph(&dbg); unitig_graph.InitFromSdBG(); timer.stop(); printf("Simple path graph size: %u, time for building: %lf\n", unitig_graph.size(), timer.elapsed()); timer.reset(); timer.start(); histogram.clear(); if (final_contig_file == NULL) { unitig_graph.OutputInitUnitigs(contigs_file, multi_file, histogram); } else { unitig_graph.OutputInitUnitigs(contigs_file, multi_file, final_contig_file, histogram, min_final_contig_len); } PrintStat(); timer.stop(); printf("Time to output: %lf\n", timer.elapsed()); const double kMaxDepth = 65535; const int kLocalWidth = 1000; int64_t num_removed = 0; timer.reset(); timer.start(); while (min_depth < kMaxDepth) { // xtimer_t local_timer; // local_timer.reset(); // local_timer.start(); if (!unitig_graph.RemoveLocalLowDepth(min_depth, min_len, kLocalWidth, local_ratio, num_removed)) { break; } min_depth *= 1.1; // local_timer.stop(); // printf("depth: %lf, num: %ld, time: %lf\n", min_depth, num_removed, local_timer.elapsed()); } timer.stop(); printf("Number of unitigs removed: %ld, time: %lf\n", num_removed, timer.elapsed()); histogram.clear(); unitig_graph.OutputChangedUnitigs(addi_contig_file, addi_multi_file, histogram); PrintStat(); }
int canSendMsg(int bus, int id, char len, unsigned char *data, int blocking) { if (!canDev[bus]) return -1; NCTYPE_STATUS Status = 0; NCTYPE_STATE State = 0; NCTYPE_CAN_FRAME TxFrame; TxFrame.IsRemote = NC_FRMTYPE_DATA; TxFrame.ArbitrationId = id; TxFrame.DataLength = len; for (int i=0; i<len; i++) TxFrame.Data[i] = ((NCTYPE_UINT8_P)data)[i]; Status = ncWrite(canDev[bus], sizeof(NCTYPE_CAN_FRAME), &TxFrame); if (Status < 0) { PrintStat(bus, Status, "ncWrite"); return Status; } if (blocking) { Status = ncWaitForState(canDev[bus], (NC_ST_WRITE_SUCCESS | NC_ST_WARNING | NC_ST_ERROR), NC_DURATION_INFINITE, &State); if (Status < 0 || !(NC_ST_WRITE_SUCCESS & State)) return -1; // failed } return Status; }
int main (int argc, char *argv[]) { t_fmsg *f; int i; /* Creer la file */ f = CreerFile(); // Créer le thread consommateur CreateProc((function_t)Consommateur,(void *)f, 0); // Créer les threads producteurs for (i = 0; i < NBPROD; i++) CreateProc((function_t)Producteur,(void *)f, 0); // Lancer l'ordonnanceur en mode non "verbeux" sched(1); // Imprimer les statistiques PrintStat(); return EXIT_SUCCESS; }
//======================= void plotSignalAndBGofMC(Char_t *fileNameIn = "histos_jPsi_2360GeV_STARTUP", //don't put ".root" at the end! Char_t *enLabel = "2360 GeV", Bool_t takeBest = kTRUE, //uses the histograms after all cuts Bool_t normalize = kTRUE, //normalizes the histos to 1 nb-1 Double_t intLumi = 261.//jPsi: DESIGN: 2.36 TeV: 266.; 900 GeV: 263. //jPsi: STARTUP: 2.36 TeV: 261.; 900 GeV: 384. ) { LoadHistos(fileNameIn, takeBest); Normalize(normalize, intLumi); LoadBGHistos("histos_ppMuXLoose_2360GeV_STARTUP.root", takeBest, 5.5); PlotHistos(enLabel, fileNameIn); PrintStat(); }
int main (int argc, char *argv[]) { // Créer les processus long CreateProc((function_t)Thread1,(void *)NULL, 0); // Lancer l'ordonnanceur en mode "verbeux" sched(0); // Imprimer les statistiques PrintStat(); return EXIT_SUCCESS; }
void AssembleFinalFromUnitigGraph(SuccinctDBG &dbg, FILE *final_contig_file, int min_final_contig_len) { xtimer_t timer; timer.reset(); timer.start(); UnitigGraph unitig_graph(&dbg); unitig_graph.InitFromSdBG(); timer.stop(); printf("unitig graph size: %u, time for building: %lf\n", unitig_graph.size(), timer.elapsed()); timer.reset(); timer.start(); histogram.clear(); unitig_graph.OutputFinalUnitigs(final_contig_file, histogram, min_final_contig_len); PrintStat(); timer.stop(); printf("Time to output: %lf\n", timer.elapsed()); }
void main(int argc, char *argv[]) { char *path; if (argc == 2) { g_simulate = false; path = argv[1]; } else if (argc == 3 && !strcmp(argv[1], "-s")) { g_simulate = true; g_verbose = false; path = argv[2]; } else if (argc == 3 && !strcmp(argv[1], "-v")) { g_simulate = false; g_verbose = true; path = argv[2]; } else if (argc == 4 && ((!strcmp(argv[1], "-s") && !strcmp(argv[2], "-v")) || (!strcmp(argv[1], "-v") && !strcmp(argv[2], "-s")))) { g_simulate = true; g_verbose = true; path = argv[3]; } else { printf( "detfs 1.4\n" "\n" "Usage: detfs [-s] [-v] <path>\n" "\n" "-s Simulate\n" "-v Verbose logging\n"); return; } DelinkTFS(path); PrintStat(); }
int freeCAN(int bus) { if (!canDev[bus]) return -1; NCTYPE_STATUS Status = 0; printf("<< CAN: Close\n"); Status = ncCloseObject(canDev[bus]); if (Status < 0) { PrintStat(bus, Status, "ncCloseObject"); return Status; } canDev[bus] = 0; printf(" - Done\n"); return 0; }
void RemoveLowLocalAndOutputFinal(SuccinctDBG &dbg, FILE *final_contig_file, double min_depth, int min_len, double local_ratio, int min_final_contig_len) { UnitigGraph unitig_graph(&dbg); unitig_graph.InitFromSdBG(); printf("Simple path graph size: %u\n", unitig_graph.size()); const double kMaxDepth = 65535; const int kLocalWidth = 1000; int64_t num_removed = 0; while (min_depth < kMaxDepth && unitig_graph.RemoveLocalLowDepth(min_depth, min_len, kLocalWidth, local_ratio, num_removed)) { min_depth *= 1.1; } printf("Number of unitigs removed: %ld\n", num_removed); histogram.clear(); unitig_graph.OutputFinalUnitigs(final_contig_file, histogram, min_final_contig_len); PrintStat(); }
int main (int argc, char *argv[]) { int i; int *j; // Créer les processus long for (i = 0; i < 2; i++) { j = (int *) malloc(sizeof(int)); *j= i; CreateProc((function_t)ProcLong,(void *)j, 80); } // Créer les processus court for (i = 0; i < 2; i++) { j = (int *) malloc(sizeof(int)); *j= i; CreateProc((function_t)ProcCourt,(void *)j, 10); } // Definir une nouvelle primitive d'election avec un quantum de 1 seconde // SchedParam(NEW, 1, RandomElect); // Definir une nouvelle primitive d'election sans quantum (batch) //SchedParam(NEW, 0, SJFElect); // Redefinir le quantum par defaut //SchedParam(PREMPT, 2, NULL); // Passer en mode batch //SchedParam(BATCH, 0, NULL); // Lancer l'ordonnanceur en mode non "verbeux" sched(0); // Imprimer les statistiques PrintStat(); return EXIT_SUCCESS; }
int canReadMsg(int bus, int *id, int *len, unsigned char *data, int blocking) { if (!canDev[bus]) return -1; NCTYPE_STATUS Status = 0; NCTYPE_STATE State = 0; NCTYPE_CAN_STRUCT RxFrame; if (blocking) { Status = ncWaitForState(canDev[bus], NC_ST_READ_AVAIL, NC_DURATION_INFINITE, &State); if (Status < 0 || !(NC_ST_READ_AVAIL & State)) return -1; // failed } memset(&RxFrame, 0, sizeof(NCTYPE_CAN_FRAME)); //RxFrame.FrameType = NC_FRMTYPE_DATA; RxFrame.DataLength = *len; Status = ncRead(canDev[bus], sizeof(NCTYPE_CAN_STRUCT), &RxFrame); if (Status < 0 || NC_FRMTYPE_DATA != RxFrame.FrameType) { PrintStat(bus, Status, "ncRead"); return Status; } else if (Status == CanWarnOldData) { (*len) = 0; return Status; } (*id) = RxFrame.ArbitrationId; //(*time) = (FILETIME)(RxFrame.Timestamp); (*len) = RxFrame.DataLength; for (int i=0; i<RxFrame.DataLength; i++) ((NCTYPE_UINT8_P)data)[i] = RxFrame.Data[i]; #ifdef _DUMP_RXFRAME PrintRxFrame(RxFrame); #endif return Status; }
main(int argc, char *argv[]) { char buf[80]; Point3 **v; Point3 *BaseV; int *usedpoint; List T=NULL_LIST, Q=NULL_LIST; int n,i=1; FILE *fp=stdout; double sec; SetProgramName("DeWall"); if((argc<2) || (strcmp(argv[i],"/?")==0)|| (strcmp(argv[i],"-?")==0)|| (strcmp(argv[i],"/h")==0)|| (strcmp(argv[i],"-h")==0) ) Error(USAGE_MESSAGE, EXIT); while(*argv[i]=='-') { switch(argv[i][1]) { case 'p' : UpdateFlag=ON; break; case 'c' : CheckFlag=ON; break; case 't' : SafeTetraFlag=ON; break; case 's' : StatFlag=ON; if(argv[i][2]=='1') NumStatFlag=ON; if(argv[i][2]=='2') { NumStatTitleFlag=ON; NumStatFlag=ON; } break; case 'u' : UGScaleFlag=ON; if(argv[i][2]==0 && isdigit(argv[i+1][0])) UGScale=atof(argv[++i]); else UGScale=atof(argv[i]+2); break; default : sprintf(buf,"Unknown options '%s'\n",argv[i]); Error(buf,NO_EXIT); } i++; } BaseV=ReadPoints(argv[i++],&n); if(argc>i) fp=fopen(argv[i],"w"); SI.Point=n; v=(Point3 **)malloc(n*sizeof(Point3 *)); usedpoint=(int *)malloc(n*sizeof(int)); if(!v || !usedpoint) Error("Unable to allocate memory for Points\n",EXIT); for(i=0;i<n;i++) v[i]=&(BaseV[i]); for(i=0;i<n;i++) usedpoint[i] = -1; Q=NewList(FIFO,sizeof(Face)); /* Initialize First Face */ ChangeEqualObjectList(EqualFace,Q); /* List Q. */ if(n>40) HashList(n/4,HashFace,Q); T=NewList(LIFO,sizeof(ShortTetra)); /* Initialize Built Tetra-*/ ChangeEqualObjectList(EqualTetra,T); /* hedra List T. */ if(SafeTetraFlag && n>40) HashList(n/4,HashTetra,T); ResetChronos(USER_CHRONOS); StartChronos(USER_CHRONOS); DeWall(v,BaseV,usedpoint,n,Q,T,XAxis); StopChronos(USER_CHRONOS); sec=ReadChronos(USER_CHRONOS); SI.Tetra=CountList(T); SI.Secs=sec; if(StatFlag && !NumStatFlag) PrintStat(); if(StatFlag && NumStatFlag && NumStatTitleFlag) PrintNumStatTitle(); if(StatFlag && NumStatFlag) PrintNumStat(); if(!StatFlag) printf("Points:%7i Secs:%6.2f Tetras:%7i\n",SI.Point,SI.Secs,SI.Tetra); WriteTetraList(T,fp); return 0; }
void *arrivalThread(void *id) { My402ListElem *elem; Packet *pkt; int i; long pkt_sleep, pkt_service; int pkt_token; long sleep_time; long prev_pkt_time=0, instant_time; long avg_ia=0; for (i=0;i<num_packets;i++) { getStatistics(&pkt_sleep,&pkt_service,&pkt_token,i); if(pkt_sleep > 10000000) pkt_sleep = 10000000; if(pkt_service > 1000000) pkt_service = 10000000; taend=getinstanttime(); sleep_time = pkt_sleep - (taend-tastart); usleep(sleep_time); // Creating the Packet pkt = (Packet *)malloc(sizeof(struct tagPacket)); pkt->pkt_id = i; pkt->num_tokens = pkt_token; pkt->service_time = pkt_service; pkt->sys_enter = tastart = getinstanttime(); if(pkt->num_tokens > B) { // Drop the packet pkts_to_arrive--; PrintStat(getinstanttime()); fprintf(stdout, "p%d arrives, Invalid token requirement, p%d Dropped!!\n", pkt->pkt_id, pkt->pkt_id); continue; } else { instant_time = getinstanttime(); if(prev_pkt_time==0) { prev_pkt_time = pkt->inter_arrival_time = (instant_time - temulation_start); prev_pkt_time = instant_time; } else { pkt->inter_arrival_time = instant_time - prev_pkt_time; prev_pkt_time = instant_time; } PrintStat(instant_time); avg_ia += pkt->inter_arrival_time; fprintf(stdout, "p%d arrives, needs %d tokens, inter-arrival time = %.3fms\n", pkt->pkt_id,pkt->num_tokens,(double)(pkt->inter_arrival_time)/1000); } pthread_mutex_lock(&my_mutex); if(My402ListEmpty(&queue1)){ My402ListAppend(&queue1,pkt); pkt->q1_enter = getinstanttime(); PrintStat(getinstanttime()); fprintf(stdout,"p%d enters Q1\n", pkt->pkt_id); if(!My402ListEmpty(&queue2)) { pthread_cond_signal(&queue2_cond); } else { if(token_bucket >= pkt->num_tokens) { elem = My402ListFirst(&queue1); pkt = (Packet *)elem->obj; My402ListUnlink(&queue1,elem); pkt->q1_exit = getinstanttime(); token_bucket-=pkt->num_tokens; PrintStat(getinstanttime()); fprintf(stdout, "p%d leaves Q1, time in Q1 = %.3fms, token bucket now has %d tokens\n", pkt->pkt_id, (double)(pkt->q1_exit - pkt->q1_enter)/1000, token_bucket); avg_pkt_q1 += (pkt->q1_exit - pkt->q1_enter); pkts_left_q1++; My402ListAppend(&queue2,pkt); pkt->q1_enter = 0; pkt->q1_exit = 0; pkt->q2_enter = getinstanttime(); PrintStat(getinstanttime()); fprintf(stdout,"p%d enters Q2\n", pkt->pkt_id); pthread_cond_signal(&queue2_cond); } } } else { My402ListAppend(&queue1,pkt); pkt->q1_enter = getinstanttime(); PrintStat(getinstanttime()); fprintf(stdout,"p%d enters Q1\n", pkt->pkt_id); } pthread_mutex_unlock(&my_mutex); } pthread_mutex_lock(&my_mutex); pthread_cond_signal(&queue2_cond); // This can also be a false signal just to wake up server, if pthread_mutex_unlock(&my_mutex); // say last packet is dropped and there is no pkt to be queued to q2. if(i==-1) { avg_inter_arrival = 0; pkt_drop_prob = 0; } else { avg_inter_arrival = (double)((double)avg_ia/(double)((i+1)*1000000)); pkt_drop_prob = (double)(num_packets - pkts_to_arrive)/(i+1); } pthread_exit(NULL); }
int main(int argc, char **argv) { long t1=1, t2=2, t3=3; pthread_t arrThread, serThread, tokThread; long total_emulation_time; // Setting to default values lambda = 0.5; mu = 0.35; r = 1.5; P = 3; B = 10; num_packets = 20; token_bucket = 0; server_die = 0; token_die = 0; avg_pkt_q1 = avg_pkt_q2 = avg_pkt_s = 0; // Done // Initialize Queues My402ListInit(&queue1); My402ListInit(&queue2); pthread_mutex_init(&my_mutex,NULL); pthread_cond_init(&queue2_cond,NULL); parseCommandline(argc,argv); tokenarrival = (long)((1/r)*1000000); pkts_to_arrive = num_packets; pthread_create(&arrThread, NULL, arrivalThread,(void *)t1); pthread_create(&tokThread, NULL, tokenThread,(void *)t2); pthread_create(&serThread, NULL, serverThread, (void *)t3); temulation_start = tastart = ttstart = getinstanttime(); PrintStat(getinstanttime()); fprintf(stdout, "Emulation Begins\n"); pthread_join(arrThread, NULL); pthread_join(tokThread, NULL); pthread_join(serThread, NULL); temulation_end = getinstanttime(); PrintStat(getinstanttime()); fprintf(stdout, "Emulation Ends \n"); total_emulation_time = temulation_end - temulation_start; fprintf(stdout,"Statistics: \n\n"); fprintf(stdout,"\taverage packet inter arrival time = %.08g sec\n",avg_inter_arrival); fprintf(stdout,"\taverage packet service time = %.08g sec\n\n",avg_serv_time); fprintf(stdout,"\taverage number of packets in Q1 = %.08g\n",(double)avg_pkt_q1/total_emulation_time); fprintf(stdout,"\taverage number of packets in Q2 = %.08g\n",(double)avg_pkt_q2/total_emulation_time); fprintf(stdout,"\taverage number of packets at S = %.08g\n\n",(double)avg_pkt_s/total_emulation_time); fprintf(stdout,"\taverage time a packet spent in the system = %.08g sec\n",avg_pkt_sys_time); fprintf(stdout,"\tstandard deviation for time spent in system = %.08g sec \n\n",std_deviation); fprintf(stdout,"\ttoken drop probability = %.08g\n",token_drop_prob); fprintf(stdout,"\tpacket drop probability = %.08g\n",pkt_drop_prob); pthread_mutex_destroy(&my_mutex); pthread_cond_destroy(&queue2_cond); pthread_exit(NULL); }
void CDynamoRIOView::OnEditCopystats() { if (m_ProcessList.GetCurSel() == 0) { MessageBox(_T("No instance selected"), _T("Error"), MB_OK | MYMBFLAGS); return; } if (!OpenClipboard()) { MessageBox(_T("Error opening clipboard"), _T("Error"), MB_OK | MYMBFLAGS); return; } EmptyClipboard(); #define CLIPBOARD_BUFSZ USHRT_MAX TCHAR buf[CLIPBOARD_BUFSZ]; TCHAR *pos = buf; if (m_selected_pid > 0) { if (m_stats != NULL) { pos += _stprintf(pos, _T("Process id = %d\r\n"), m_stats->process_id); pos += _stprintf(pos, _T("Process name = %") ASCII_PRINTF _T("\r\n"), m_stats->process_name); pos += _stprintf(pos, _T("Status = %s\r\n"), m_Exited.GetBuffer(0)); #ifndef DRSTATS_DEMO pos += _stprintf(pos, _T("Log mask = %s\r\n"), m_LogMask.GetBuffer(0)); pos += _stprintf(pos, _T("Log level = %s\r\n"), m_LogLevel.GetBuffer(0)); pos += _stprintf(pos, _T("Log file = %s\r\n"), m_LogDir.GetBuffer(0)); #endif pos += _stprintf(pos, _T("\r\nSTATS\r\n")); uint i; for (i = 0; i < m_stats->num_stats; i++) { if (pos >= &buf[STATS_BUFSZ-STAT_NAME_MAX_LEN*2]) break; // FIXME: Filter here too pos += PrintStat(pos, i, TRUE/*filter*/); assert(pos < &buf[STATS_BUFSZ-1]); } } else { CString pname; m_ProcessList.GetLBText(m_ProcessList.GetCurSel(), pname); _stprintf(pos, _T("%s"), pname); pos += _tcslen(pos); } } if (m_clientStats != NULL) { pos += PrintClientStats(pos, &buf[STATS_BUFSZ-1]); } size_t len = _tcslen(buf); // Allocate a global memory object for the text. HGLOBAL hglbCopy = GlobalAlloc(GMEM_DDESHARE, (len + 1) * sizeof(TCHAR)); if (hglbCopy == NULL) { CloseClipboard(); return; } // Lock the handle and copy the text to the buffer. LPTSTR lptstrCopy = (LPTSTR) GlobalLock(hglbCopy); memcpy(lptstrCopy, buf, (len + 1) * sizeof(TCHAR)); lptstrCopy[len] = (TCHAR) 0; // null TCHARacter GlobalUnlock(hglbCopy); // Place the handle on the clipboard. SetClipboardData( #ifdef UNICODE CF_UNICODETEXT, #else CF_TEXT, #endif hglbCopy); CloseClipboard(); }
void pzgssv(int nprocs, SuperMatrix *A, int *perm_c, int *perm_r, SuperMatrix *L, SuperMatrix *U, SuperMatrix *B, int *info ) { /* * -- SuperLU MT routine (version 2.0) -- * Lawrence Berkeley National Lab, Univ. of California Berkeley, * and Xerox Palo Alto Research Center. * September 10, 2007 * * Purpose * ======= * * PZGSSV solves the system of linear equations A*X=B, using the parallel * LU factorization routine PZGSTRF. It performs the following steps: * * 1. If A is stored column-wise (A->Stype = NC): * * 1.1. Permute the columns of A, forming A*Pc, where Pc is a * permutation matrix. * For more details of this step, see sp_preorder.c. * * 1.2. Factor A as Pr*A*Pc=L*U with the permutation Pr determined * by Gaussian elimination with partial pivoting. * L is unit lower triangular with offdiagonal entries * bounded by 1 in magnitude, and U is upper triangular. * * 1.3. Solve the system of equations A*X=B using the factored * form of A. * * 2. If A is stored row-wise (A->Stype = NR), apply the above algorithm * to the tranpose of A: * * 2.1. Permute columns of tranpose(A) (rows of A), * forming transpose(A)*Pc, where Pc is a permutation matrix. * For more details of this step, see sp_preorder.c. * * 2.2. Factor A as Pr*transpose(A)*Pc=L*U with the permutation Pr * determined by Gaussian elimination with partial pivoting. * L is unit lower triangular with offdiagonal entries * bounded by 1 in magnitude, and U is upper triangular. * * 2.3. Solve the system of equations A*X=B using the factored * form of A. * * See supermatrix.h for the definition of "SuperMatrix" structure. * * * Arguments * ========= * * nprocs (input) int * Number of processes (or threads) to be spawned and used to perform * the LU factorization by pzgstrf(). There is a single thread of * control to call pzgstrf(), and all threads spawned by pzgstrf() * are terminated before returning from pzgstrf(). * * A (input) SuperMatrix* * Matrix A in A*X=B, of dimension (A->nrow, A->ncol), where * A->nrow = A->ncol. Currently, the type of A can be: * Stype = NC or NR; Dtype = _D; Mtype = GE. In the future, * more general A will be handled. * * perm_c (input/output) int* * If A->Stype=NC, column permutation vector of size A->ncol, * which defines the permutation matrix Pc; perm_c[i] = j means * column i of A is in position j in A*Pc. * On exit, perm_c may be overwritten by the product of the input * perm_c and a permutation that postorders the elimination tree * of Pc'*A'*A*Pc; perm_c is not changed if the elimination tree * is already in postorder. * * If A->Stype=NR, column permutation vector of size A->nrow * which describes permutation of columns of tranpose(A) * (rows of A) as described above. * * perm_r (output) int*, * If A->Stype=NR, row permutation vector of size A->nrow, * which defines the permutation matrix Pr, and is determined * by partial pivoting. perm_r[i] = j means row i of A is in * position j in Pr*A. * * If A->Stype=NR, permutation vector of size A->ncol, which * determines permutation of rows of transpose(A) * (columns of A) as described above. * * L (output) SuperMatrix* * The factor L from the factorization * Pr*A*Pc=L*U (if A->Stype=NC) or * Pr*transpose(A)*Pc=L*U (if A->Stype=NR). * Uses compressed row subscripts storage for supernodes, i.e., * L has types: Stype = SCP, Dtype = _D, Mtype = TRLU. * * U (output) SuperMatrix* * The factor U from the factorization * Pr*A*Pc=L*U (if A->Stype=NC) or * Pr*transpose(A)*Pc=L*U (if A->Stype=NR). * Use column-wise storage scheme, i.e., U has types: * Stype = NCP, Dtype = _D, Mtype = TRU. * * B (input/output) SuperMatrix* * B has types: Stype = DN, Dtype = _D, Mtype = GE. * On entry, the right hand side matrix. * On exit, the solution matrix if info = 0; * * info (output) int* * = 0: successful exit * > 0: if info = i, and i is * <= A->ncol: U(i,i) is exactly zero. The factorization has * been completed, but the factor U is exactly singular, * so the solution could not be computed. * > A->ncol: number of bytes allocated when memory allocation * failure occurred, plus A->ncol. * */ trans_t trans; NCformat *Astore; DNformat *Bstore; SuperMatrix *AA; /* A in NC format used by the factorization routine.*/ SuperMatrix AC; /* Matrix postmultiplied by Pc */ int i, n, panel_size, relax; fact_t fact; yes_no_t refact, usepr; double diag_pivot_thresh, drop_tol; void *work; int lwork; superlumt_options_t superlumt_options; Gstat_t Gstat; double t; /* Temporary time */ double *utime; flops_t *ops, flopcnt; /* ------------------------------------------------------------ Test the input parameters. ------------------------------------------------------------*/ Astore = A->Store; Bstore = B->Store; *info = 0; if ( nprocs <= 0 ) *info = -1; else if ( A->nrow != A->ncol || A->nrow < 0 || (A->Stype != SLU_NC && A->Stype != SLU_NR) || A->Dtype != SLU_Z || A->Mtype != SLU_GE ) *info = -2; else if ( B->ncol < 0 || Bstore->lda < SUPERLU_MAX(1, A->nrow) )*info = -7; if ( *info != 0 ) { i = -(*info); xerbla_("pzgssv", &i); return; } #if 0 /* Use the best sequential code. if this part is commented out, we will use the parallel code run on one processor. */ if ( nprocs == 1 ) { return; } #endif fact = EQUILIBRATE; refact = NO; trans = NOTRANS; panel_size = sp_ienv(1); relax = sp_ienv(2); diag_pivot_thresh = 1.0; usepr = NO; drop_tol = 0.0; work = NULL; lwork = 0; /* ------------------------------------------------------------ Allocate storage and initialize statistics variables. ------------------------------------------------------------*/ n = A->ncol; StatAlloc(n, nprocs, panel_size, relax, &Gstat); StatInit(n, nprocs, &Gstat); utime = Gstat.utime; ops = Gstat.ops; /* ------------------------------------------------------------ Convert A to NC format when necessary. ------------------------------------------------------------*/ if ( A->Stype == SLU_NR ) { NRformat *Astore = A->Store; AA = (SuperMatrix *) SUPERLU_MALLOC( sizeof(SuperMatrix) ); zCreate_CompCol_Matrix(AA, A->ncol, A->nrow, Astore->nnz, Astore->nzval, Astore->colind, Astore->rowptr, SLU_NC, A->Dtype, A->Mtype); trans = TRANS; } else if ( A->Stype == SLU_NC ) AA = A; /* ------------------------------------------------------------ Initialize the option structure superlumt_options using the user-input parameters; Apply perm_c to the columns of original A to form AC. ------------------------------------------------------------*/ pzgstrf_init(nprocs, fact, trans, refact, panel_size, relax, diag_pivot_thresh, usepr, drop_tol, perm_c, perm_r, work, lwork, AA, &AC, &superlumt_options, &Gstat); /* ------------------------------------------------------------ Compute the LU factorization of A. The following routine will create nprocs threads. ------------------------------------------------------------*/ pzgstrf(&superlumt_options, &AC, perm_r, L, U, &Gstat, info); flopcnt = 0; for (i = 0; i < nprocs; ++i) flopcnt += Gstat.procstat[i].fcops; ops[FACT] = flopcnt; #if ( PRNTlevel==1 ) printf("nprocs = %d, flops %e, Mflops %.2f\n", nprocs, flopcnt, flopcnt/utime[FACT]*1e-6); printf("Parameters: w %d, relax %d, maxsuper %d, rowblk %d, colblk %d\n", sp_ienv(1), sp_ienv(2), sp_ienv(3), sp_ienv(4), sp_ienv(5)); fflush(stdout); #endif /* ------------------------------------------------------------ Solve the system A*X=B, overwriting B with X. ------------------------------------------------------------*/ if ( *info == 0 ) { t = SuperLU_timer_(); zgstrs (trans, L, U, perm_r, perm_c, B, &Gstat, info); utime[SOLVE] = SuperLU_timer_() - t; ops[SOLVE] = ops[TRISOLVE]; } /* ------------------------------------------------------------ Deallocate storage after factorization. ------------------------------------------------------------*/ pxgstrf_finalize(&superlumt_options, &AC); if ( A->Stype == SLU_NR ) { Destroy_SuperMatrix_Store(AA); SUPERLU_FREE(AA); } /* ------------------------------------------------------------ Print timings, then deallocate statistic variables. ------------------------------------------------------------*/ #ifdef PROFILE { SCPformat *Lstore = (SCPformat *) L->Store; ParallelProfile(n, Lstore->nsuper+1, Gstat.num_panels, nprocs, &Gstat); } #endif PrintStat(&Gstat); StatFree(&Gstat); }
void dgssvx(char *fact, char *trans, char *refact, SuperMatrix *A, factor_param_t *factor_params, int *perm_c, int *perm_r, int *etree, char *equed, double *R, double *C, SuperMatrix *L, SuperMatrix *U, void *work, int lwork, SuperMatrix *B, SuperMatrix *X, double *recip_pivot_growth, double *rcond, double *ferr, double *berr, mem_usage_t *mem_usage, int *info ) { /* * Purpose * ======= * * DGSSVX solves the system of linear equations A*X=B or A'*X=B, using * the LU factorization from dgstrf(). Error bounds on the solution and * a condition estimate are also provided. It performs the following steps: * * 1. If A is stored column-wise (A->Stype = NC): * * 1.1. If fact = 'E', scaling factors are computed to equilibrate the * system: * trans = 'N': diag(R)*A*diag(C) *inv(diag(C))*X = diag(R)*B * trans = 'T': (diag(R)*A*diag(C))**T *inv(diag(R))*X = diag(C)*B * trans = 'C': (diag(R)*A*diag(C))**H *inv(diag(R))*X = diag(C)*B * Whether or not the system will be equilibrated depends on the * scaling of the matrix A, but if equilibration is used, A is * overwritten by diag(R)*A*diag(C) and B by diag(R)*B (if trans='N') * or diag(C)*B (if trans = 'T' or 'C'). * * 1.2. Permute columns of A, forming A*Pc, where Pc is a permutation * matrix that usually preserves sparsity. * For more details of this step, see sp_preorder.c. * * 1.3. If fact = 'N' or 'E', the LU decomposition is used to factor the * matrix A (after equilibration if fact = 'E') as Pr*A*Pc = L*U, * with Pr determined by partial pivoting. * * 1.4. Compute the reciprocal pivot growth factor. * * 1.5. If some U(i,i) = 0, so that U is exactly singular, then the * routine returns with info = i. Otherwise, the factored form of * A is used to estimate the condition number of the matrix A. If * the reciprocal of the condition number is less than machine * precision, info = A->ncol+1 is returned as a warning, but the * routine still goes on to solve for X and computes error bounds * as described below. * * 1.6. The system of equations is solved for X using the factored form * of A. * * 1.7. Iterative refinement is applied to improve the computed solution * matrix and calculate error bounds and backward error estimates * for it. * * 1.8. If equilibration was used, the matrix X is premultiplied by * diag(C) (if trans = 'N') or diag(R) (if trans = 'T' or 'C') so * that it solves the original system before equilibration. * * 2. If A is stored row-wise (A->Stype = NR), apply the above algorithm * to the transpose of A: * * 2.1. If fact = 'E', scaling factors are computed to equilibrate the * system: * trans = 'N': diag(R)*A'*diag(C) *inv(diag(C))*X = diag(R)*B * trans = 'T': (diag(R)*A'*diag(C))**T *inv(diag(R))*X = diag(C)*B * trans = 'C': (diag(R)*A'*diag(C))**H *inv(diag(R))*X = diag(C)*B * Whether or not the system will be equilibrated depends on the * scaling of the matrix A, but if equilibration is used, A' is * overwritten by diag(R)*A'*diag(C) and B by diag(R)*B * (if trans='N') or diag(C)*B (if trans = 'T' or 'C'). * * 2.2. Permute columns of transpose(A) (rows of A), * forming transpose(A)*Pc, where Pc is a permutation matrix that * usually preserves sparsity. * For more details of this step, see sp_preorder.c. * * 2.3. If fact = 'N' or 'E', the LU decomposition is used to factor the * transpose(A) (after equilibration if fact = 'E') as * Pr*transpose(A)*Pc = L*U with the permutation Pr determined by * partial pivoting. * * 2.4. Compute the reciprocal pivot growth factor. * * 2.5. If some U(i,i) = 0, so that U is exactly singular, then the * routine returns with info = i. Otherwise, the factored form * of transpose(A) is used to estimate the condition number of the * matrix A. If the reciprocal of the condition number * is less than machine precision, info = A->nrow+1 is returned as * a warning, but the routine still goes on to solve for X and * computes error bounds as described below. * * 2.6. The system of equations is solved for X using the factored form * of transpose(A). * * 2.7. Iterative refinement is applied to improve the computed solution * matrix and calculate error bounds and backward error estimates * for it. * * 2.8. If equilibration was used, the matrix X is premultiplied by * diag(C) (if trans = 'N') or diag(R) (if trans = 'T' or 'C') so * that it solves the original system before equilibration. * * See supermatrix.h for the definition of 'SuperMatrix' structure. * * Arguments * ========= * * fact (input) char* * Specifies whether or not the factored form of the matrix * A is supplied on entry, and if not, whether the matrix A should * be equilibrated before it is factored. * = 'F': On entry, L, U, perm_r and perm_c contain the factored * form of A. If equed is not 'N', the matrix A has been * equilibrated with scaling factors R and C. * A, L, U, perm_r are not modified. * = 'N': The matrix A will be factored, and the factors will be * stored in L and U. * = 'E': The matrix A will be equilibrated if necessary, then * factored into L and U. * * trans (input) char* * Specifies the form of the system of equations: * = 'N': A * X = B (No transpose) * = 'T': A**T * X = B (Transpose) * = 'C': A**H * X = B (Transpose) * * refact (input) char* * Specifies whether we want to re-factor the matrix. * = 'N': Factor the matrix A. * = 'Y': Matrix A was factored before, now we want to re-factor * matrix A with perm_r and etree as inputs. Use * the same storage for the L\U factors previously allocated, * expand it if necessary. User should insure to use the same * memory model. In this case, perm_r may be modified due to * different pivoting determined by diagonal threshold. * If fact = 'F', then refact is not accessed. * * A (input/output) SuperMatrix* * Matrix A in A*X=B, of dimension (A->nrow, A->ncol). The number * of the linear equations is A->nrow. Currently, the type of A can be: * Stype = NC or NR, Dtype = _D, Mtype = GE. In the future, * more general A can be handled. * * On entry, If fact = 'F' and equed is not 'N', then A must have * been equilibrated by the scaling factors in R and/or C. * A is not modified if fact = 'F' or 'N', or if fact = 'E' and * equed = 'N' on exit. * * On exit, if fact = 'E' and equed is not 'N', A is scaled as follows: * If A->Stype = NC: * equed = 'R': A := diag(R) * A * equed = 'C': A := A * diag(C) * equed = 'B': A := diag(R) * A * diag(C). * If A->Stype = NR: * equed = 'R': transpose(A) := diag(R) * transpose(A) * equed = 'C': transpose(A) := transpose(A) * diag(C) * equed = 'B': transpose(A) := diag(R) * transpose(A) * diag(C). * * factor_params (input) factor_param_t* * The structure defines the input scalar parameters, consisting of * the following fields. If factor_params = NULL, the default * values are used for all the fields; otherwise, the values * are given by the user. * - panel_size (int): Panel size. A panel consists of at most * panel_size consecutive columns. If panel_size = -1, use * default value 8. * - relax (int): To control degree of relaxing supernodes. If the * number of nodes (columns) in a subtree of the elimination * tree is less than relax, this subtree is considered as one * supernode, regardless of the row structures of those columns. * If relax = -1, use default value 8. * - diag_pivot_thresh (double): Diagonal pivoting threshold. * At step j of the Gaussian elimination, if * abs(A_jj) >= diag_pivot_thresh * (max_(i>=j) abs(A_ij)), * then use A_jj as pivot. 0 <= diag_pivot_thresh <= 1. * If diag_pivot_thresh = -1, use default value 1.0, * which corresponds to standard partial pivoting. * - drop_tol (double): Drop tolerance threshold. (NOT IMPLEMENTED) * At step j of the Gaussian elimination, if * abs(A_ij)/(max_i abs(A_ij)) < drop_tol, * then drop entry A_ij. 0 <= drop_tol <= 1. * If drop_tol = -1, use default value 0.0, which corresponds to * standard Gaussian elimination. * * perm_c (input/output) int* * If A->Stype = NC, Column permutation vector of size A->ncol, * which defines the permutation matrix Pc; perm_c[i] = j means * column i of A is in position j in A*Pc. * On exit, perm_c may be overwritten by the product of the input * perm_c and a permutation that postorders the elimination tree * of Pc'*A'*A*Pc; perm_c is not changed if the elimination tree * is already in postorder. * * If A->Stype = NR, column permutation vector of size A->nrow, * which describes permutation of columns of transpose(A) * (rows of A) as described above. * * perm_r (input/output) int* * If A->Stype = NC, row permutation vector of size A->nrow, * which defines the permutation matrix Pr, and is determined * by partial pivoting. perm_r[i] = j means row i of A is in * position j in Pr*A. * * If A->Stype = NR, permutation vector of size A->ncol, which * determines permutation of rows of transpose(A) * (columns of A) as described above. * * If refact is not 'Y', perm_r is output argument; * If refact = 'Y', the pivoting routine will try to use the input * perm_r, unless a certain threshold criterion is violated. * In that case, perm_r is overwritten by a new permutation * determined by partial pivoting or diagonal threshold pivoting. * * etree (input/output) int*, dimension (A->ncol) * Elimination tree of Pc'*A'*A*Pc. * If fact is not 'F' and refact = 'Y', etree is an input argument, * otherwise it is an output argument. * Note: etree is a vector of parent pointers for a forest whose * vertices are the integers 0 to A->ncol-1; etree[root]==A->ncol. * * equed (input/output) char* * Specifies the form of equilibration that was done. * = 'N': No equilibration. * = 'R': Row equilibration, i.e., A was premultiplied by diag(R). * = 'C': Column equilibration, i.e., A was postmultiplied by diag(C). * = 'B': Both row and column equilibration, i.e., A was replaced * by diag(R)*A*diag(C). * If fact = 'F', equed is an input argument, otherwise it is * an output argument. * * R (input/output) double*, dimension (A->nrow) * The row scale factors for A or transpose(A). * If equed = 'R' or 'B', A (if A->Stype = NC) or transpose(A) (if * A->Stype = NR) is multiplied on the left by diag(R). * If equed = 'N' or 'C', R is not accessed. * If fact = 'F', R is an input argument; otherwise, R is output. * If fact = 'F' and equed = 'R' or 'B', each element of R must * be positive. * * C (input/output) double*, dimension (A->ncol) * The column scale factors for A or transpose(A). * If equed = 'C' or 'B', A (if A->Stype = NC) or transpose(A) (if * A->Stype = NR) is multiplied on the right by diag(C). * If equed = 'N' or 'R', C is not accessed. * If fact = 'F', C is an input argument; otherwise, C is output. * If fact = 'F' and equed = 'C' or 'B', each element of C must * be positive. * * L (output) SuperMatrix* * The factor L from the factorization * Pr*A*Pc=L*U (if A->Stype = NC) or * Pr*transpose(A)*Pc=L*U (if A->Stype = NR). * Uses compressed row subscripts storage for supernodes, i.e., * L has types: Stype = SC, Dtype = _D, Mtype = TRLU. * * U (output) SuperMatrix* * The factor U from the factorization * Pr*A*Pc=L*U (if A->Stype = NC) or * Pr*transpose(A)*Pc=L*U (if A->Stype = NR). * Uses column-wise storage scheme, i.e., U has types: * Stype = NC, Dtype = _D, Mtype = TRU. * * work (workspace/output) void*, size (lwork) (in bytes) * User supplied workspace, should be large enough * to hold data structures for factors L and U. * On exit, if fact is not 'F', L and U point to this array. * * lwork (input) int * Specifies the size of work array in bytes. * = 0: allocate space internally by system malloc; * > 0: use user-supplied work array of length lwork in bytes, * returns error if space runs out. * = -1: the routine guesses the amount of space needed without * performing the factorization, and returns it in * mem_usage->total_needed; no other side effects. * * See argument 'mem_usage' for memory usage statistics. * * B (input/output) SuperMatrix* * B has types: Stype = DN, Dtype = _D, Mtype = GE. * On entry, the right hand side matrix. * On exit, * if equed = 'N', B is not modified; otherwise * if A->Stype = NC: * if trans = 'N' and equed = 'R' or 'B', B is overwritten by * diag(R)*B; * if trans = 'T' or 'C' and equed = 'C' of 'B', B is * overwritten by diag(C)*B; * if A->Stype = NR: * if trans = 'N' and equed = 'C' or 'B', B is overwritten by * diag(C)*B; * if trans = 'T' or 'C' and equed = 'R' of 'B', B is * overwritten by diag(R)*B. * * X (output) SuperMatrix* * X has types: Stype = DN, Dtype = _D, Mtype = GE. * If info = 0 or info = A->ncol+1, X contains the solution matrix * to the original system of equations. Note that A and B are modified * on exit if equed is not 'N', and the solution to the equilibrated * system is inv(diag(C))*X if trans = 'N' and equed = 'C' or 'B', * or inv(diag(R))*X if trans = 'T' or 'C' and equed = 'R' or 'B'. * * recip_pivot_growth (output) double* * The reciprocal pivot growth factor max_j( norm(A_j)/norm(U_j) ). * The infinity norm is used. If recip_pivot_growth is much less * than 1, the stability of the LU factorization could be poor. * * rcond (output) double* * The estimate of the reciprocal condition number of the matrix A * after equilibration (if done). If rcond is less than the machine * precision (in particular, if rcond = 0), the matrix is singular * to working precision. This condition is indicated by a return * code of info > 0. * * FERR (output) double*, dimension (B->ncol) * The estimated forward error bound for each solution vector * X(j) (the j-th column of the solution matrix X). * If XTRUE is the true solution corresponding to X(j), FERR(j) * is an estimated upper bound for the magnitude of the largest * element in (X(j) - XTRUE) divided by the magnitude of the * largest element in X(j). The estimate is as reliable as * the estimate for RCOND, and is almost always a slight * overestimate of the true error. * * BERR (output) double*, dimension (B->ncol) * The componentwise relative backward error of each solution * vector X(j) (i.e., the smallest relative change in * any element of A or B that makes X(j) an exact solution). * * mem_usage (output) mem_usage_t* * Record the memory usage statistics, consisting of following fields: * - for_lu (float) * The amount of space used in bytes for L\U data structures. * - total_needed (float) * The amount of space needed in bytes to perform factorization. * - expansions (int) * The number of memory expansions during the LU factorization. * * info (output) int* * = 0: successful exit * < 0: if info = -i, the i-th argument had an illegal value * > 0: if info = i, and i is * <= A->ncol: U(i,i) is exactly zero. The factorization has * been completed, but the factor U is exactly * singular, so the solution and error bounds * could not be computed. * = A->ncol+1: U is nonsingular, but RCOND is less than machine * precision, meaning that the matrix is singular to * working precision. Nevertheless, the solution and * error bounds are computed because there are a number * of situations where the computed solution can be more * accurate than the value of RCOND would suggest. * > A->ncol+1: number of bytes allocated when memory allocation * failure occurred, plus A->ncol. * */ DNformat *Bstore, *Xstore; double *Bmat, *Xmat; int ldb, ldx, nrhs; SuperMatrix *AA; /* A in NC format used by the factorization routine.*/ SuperMatrix AC; /* Matrix postmultiplied by Pc */ int colequ, equil, nofact, notran, rowequ; char trant[1], norm[1]; int i, j, info1; double amax, anorm, bignum, smlnum, colcnd, rowcnd, rcmax, rcmin; int relax, panel_size; double diag_pivot_thresh, drop_tol; double t0; /* temporary time */ double *utime; extern SuperLUStat_t SuperLUStat; /* External functions */ extern double dlangs(char *, SuperMatrix *); extern double dlamch_(char *); Bstore = B->Store; Xstore = X->Store; Bmat = Bstore->nzval; Xmat = Xstore->nzval; ldb = Bstore->lda; ldx = Xstore->lda; nrhs = B->ncol; #if 0 printf("dgssvx: fact=%c, trans=%c, refact=%c, equed=%c\n", *fact, *trans, *refact, *equed); #endif *info = 0; nofact = lsame_(fact, "N"); equil = lsame_(fact, "E"); notran = lsame_(trans, "N"); if (nofact || equil) { *(unsigned char *)equed = 'N'; rowequ = FALSE; colequ = FALSE; } else { rowequ = lsame_(equed, "R") || lsame_(equed, "B"); colequ = lsame_(equed, "C") || lsame_(equed, "B"); smlnum = dlamch_("Safe minimum"); bignum = 1. / smlnum; } /* Test the input parameters */ if (!nofact && !equil && !lsame_(fact, "F")) *info = -1; else if (!notran && !lsame_(trans, "T") && !lsame_(trans, "C")) *info = -2; else if ( !(lsame_(refact,"Y") || lsame_(refact, "N")) ) *info = -3; else if ( A->nrow != A->ncol || A->nrow < 0 || (A->Stype != NC && A->Stype != NR) || A->Dtype != _D || A->Mtype != GE ) *info = -4; else if (lsame_(fact, "F") && !(rowequ || colequ || lsame_(equed, "N"))) *info = -9; else { if (rowequ) { rcmin = bignum; rcmax = 0.; for (j = 0; j < A->nrow; ++j) { rcmin = MIN(rcmin, R[j]); rcmax = MAX(rcmax, R[j]); } if (rcmin <= 0.) *info = -10; else if ( A->nrow > 0) rowcnd = MAX(rcmin,smlnum) / MIN(rcmax,bignum); else rowcnd = 1.; } if (colequ && *info == 0) { rcmin = bignum; rcmax = 0.; for (j = 0; j < A->nrow; ++j) { rcmin = MIN(rcmin, C[j]); rcmax = MAX(rcmax, C[j]); } if (rcmin <= 0.) *info = -11; else if (A->nrow > 0) colcnd = MAX(rcmin,smlnum) / MIN(rcmax,bignum); else colcnd = 1.; } if (*info == 0) { if ( lwork < -1 ) *info = -15; else if ( B->ncol < 0 || Bstore->lda < MAX(0, A->nrow) || B->Stype != DN || B->Dtype != _D || B->Mtype != GE ) *info = -16; else if ( X->ncol < 0 || Xstore->lda < MAX(0, A->nrow) || B->ncol != X->ncol || X->Stype != DN || X->Dtype != _D || X->Mtype != GE ) *info = -17; } } if (*info != 0) { i = -(*info); xerbla_("dgssvx", &i); return; } /* Default values for factor_params */ panel_size = sp_ienv(1); relax = sp_ienv(2); diag_pivot_thresh = 1.0; drop_tol = 0.0; if ( factor_params != NULL ) { if ( factor_params->panel_size != -1 ) panel_size = factor_params->panel_size; if ( factor_params->relax != -1 ) relax = factor_params->relax; if ( factor_params->diag_pivot_thresh != -1 ) diag_pivot_thresh = factor_params->diag_pivot_thresh; if ( factor_params->drop_tol != -1 ) drop_tol = factor_params->drop_tol; } StatInit(panel_size, relax); utime = SuperLUStat.utime; /* Convert A to NC format when necessary. */ if ( A->Stype == NR ) { NRformat *Astore = A->Store; AA = (SuperMatrix *) SUPERLU_MALLOC( sizeof(SuperMatrix) ); dCreate_CompCol_Matrix(AA, A->ncol, A->nrow, Astore->nnz, Astore->nzval, Astore->colind, Astore->rowptr, NC, A->Dtype, A->Mtype); if ( notran ) { /* Reverse the transpose argument. */ *trant = 'T'; notran = 0; } else { *trant = 'N'; notran = 1; } } else { /* A->Stype == NC */ *trant = *trans; AA = A; } if ( equil ) { t0 = SuperLU_timer_(); /* Compute row and column scalings to equilibrate the matrix A. */ dgsequ(AA, R, C, &rowcnd, &colcnd, &amax, &info1); if ( info1 == 0 ) { /* Equilibrate matrix A. */ dlaqgs(AA, R, C, rowcnd, colcnd, amax, equed); rowequ = lsame_(equed, "R") || lsame_(equed, "B"); colequ = lsame_(equed, "C") || lsame_(equed, "B"); } utime[EQUIL] = SuperLU_timer_() - t0; } /* Scale the right hand side if equilibration was performed. */ if ( notran ) { if ( rowequ ) { for (j = 0; j < nrhs; ++j) for (i = 0; i < A->nrow; ++i) { Bmat[i + j*ldb] *= R[i]; } } } else if ( colequ ) { for (j = 0; j < nrhs; ++j) for (i = 0; i < A->nrow; ++i) { Bmat[i + j*ldb] *= C[i]; } } if ( nofact || equil ) { t0 = SuperLU_timer_(); sp_preorder(refact, AA, perm_c, etree, &AC); utime[ETREE] = SuperLU_timer_() - t0; /* printf("Factor PA = LU ... relax %d\tw %d\tmaxsuper %d\trowblk %d\n", relax, panel_size, sp_ienv(3), sp_ienv(4)); fflush(stdout); */ /* Compute the LU factorization of A*Pc. */ t0 = SuperLU_timer_(); dgstrf(refact, &AC, diag_pivot_thresh, drop_tol, relax, panel_size, etree, work, lwork, perm_r, perm_c, L, U, info); utime[FACT] = SuperLU_timer_() - t0; if ( lwork == -1 ) { mem_usage->total_needed = *info - A->ncol; return; } } if ( *info > 0 ) { if ( *info <= A->ncol ) { /* Compute the reciprocal pivot growth factor of the leading rank-deficient *info columns of A. */ *recip_pivot_growth = dPivotGrowth(*info, AA, perm_c, L, U); } return; } /* Compute the reciprocal pivot growth factor *recip_pivot_growth. */ *recip_pivot_growth = dPivotGrowth(A->ncol, AA, perm_c, L, U); /* Estimate the reciprocal of the condition number of A. */ t0 = SuperLU_timer_(); if ( notran ) { *(unsigned char *)norm = '1'; } else { *(unsigned char *)norm = 'I'; } anorm = dlangs(norm, AA); dgscon(norm, L, U, anorm, rcond, info); utime[RCOND] = SuperLU_timer_() - t0; /* Compute the solution matrix X. */ for (j = 0; j < nrhs; j++) /* Save a copy of the right hand sides */ for (i = 0; i < B->nrow; i++) Xmat[i + j*ldx] = Bmat[i + j*ldb]; t0 = SuperLU_timer_(); dgstrs (trant, L, U, perm_r, perm_c, X, info); utime[SOLVE] = SuperLU_timer_() - t0; /* Use iterative refinement to improve the computed solution and compute error bounds and backward error estimates for it. */ t0 = SuperLU_timer_(); dgsrfs(trant, AA, L, U, perm_r, perm_c, equed, R, C, B, X, ferr, berr, info); utime[REFINE] = SuperLU_timer_() - t0; /* Transform the solution matrix X to a solution of the original system. */ if ( notran ) { if ( colequ ) { for (j = 0; j < nrhs; ++j) for (i = 0; i < A->nrow; ++i) { Xmat[i + j*ldx] *= C[i]; } } } else if ( rowequ ) { for (j = 0; j < nrhs; ++j) for (i = 0; i < A->nrow; ++i) { Xmat[i + j*ldx] *= R[i]; } } /* Set INFO = A->ncol+1 if the matrix is singular to working precision. */ if ( *rcond < dlamch_("E") ) *info = A->ncol + 1; dQuerySpace(L, U, panel_size, mem_usage); if ( nofact || equil ) Destroy_CompCol_Permuted(&AC); if ( A->Stype == NR ) { Destroy_SuperMatrix_Store(AA); SUPERLU_FREE(AA); } PrintStat( &SuperLUStat ); StatFree(); }
void MapMenu() { if(Level == 0) { Pic[sPlayer]->redraw = true; Menu->redraw = true; Hand->redraw = true; Tile2->redraw = true; Map->redraw = true; if(!uButton && P1[UP].v) { MoveUp(); mTick = GetTickCount(); } else if(uButton && P1[UP].v && (GetTickCount() - mTick > mDelay)) { MoveUp(); mTick = GetTickCount(); } else if(uButton && !P1[UP].v ) uButton = false; else if(!dButton && P1[DOWN].v) { MoveDown(); mTick = GetTickCount(); } else if(dButton && P1[DOWN].v && (GetTickCount() - mTick > mDelay)) { MoveDown(); mTick = GetTickCount(); } else if(dButton && !P1[DOWN].v ) dButton = false; else if( !dButton && !uButton && !bButton && P1[B1].v ) { if(mNum == 0) { Level = 1; bButton = true; } else if(mNum == 1) { /* Map->moveable = true; Tile1->moveable = false; Hand->Hide(); Camp->Hide(); Tile1->redraw = true; Menu->redraw = true; Level = 3; */ WalkOnMap = true; Gray->visable = true; for(i = 0; i < nGoo; i++) { Goo[i]->visable = true; Goo[i]->moveable = true; Goo[i]->animate = true; Goo[i]->movement_done = true; } Super->visable = true; Super->moveable = true; Super->animate = true; Super->movement_done = true; Hand->visable = false; bButton = true; } else if(mNum == 2) { gv.ScreenNum = gData->LevelNum; gv.SubScreenNum = gData->SubLevelNum; gv.h = 456; gv.m = 12; gv.s = 56; gData->size = sizeof(gv); gData->data = &gv; Val->Main->LoadLevel = false; gData->SubLevelNum = 1; gData->LevelNum = 1; bButton = true; } else if(mNum == 3) { PostMessage(Val->Main->Get_MainHwnd(), WM_DESTROY, 0, 0); bButton = true; } } else if(!P1[B1].v) bButton = false; } else if(Level == 1) { Tile1->moveable = false; Menu->Hide(); Tile1->redraw = true; Camp->animate = false; Tile2->redraw = true; Map->redraw = true; Stat[sPlayer]->Show(); Stat[sPlayer]->redraw = true; ShowStatus(true); RedrawStat(); PrintStat(sPlayer); Hand->SetPos(25, 227); Level = 2; } else if(Level == 2) { if( !bButton && P1[B1].v ) { Level = 0; Menu->Show(); Pic[sPlayer]->Show(); Pic[sPlayer]->redraw = true; Pic[!sPlayer]->Hide(); Tile1->moveable = true; Hand->SetPos(Pos[mNum].x, Pos[mNum].y ); Hand->redraw = true; Map->redraw = true; Tile2->redraw = true; Camp->animate = true; ShowStatus(false); Stat[0]->Hide(); Stat[1]->Hide(); bButton = true; } else if(!P1[B1].v) bButton = false; } /* else if( (Level == 3) && (Map->movement_done)) { Tile1->moveable = true; Hand->Show(); Hand->SetPos(Pos[mNum].x, Pos[mNum].y ); Menu->redraw = true; Level = 0; } */ if(!lButton && P1[LEFT].v) { if(Level == 0) { Pic[sPlayer]->Hide(); sPlayer = sPlayer ? 0 : 1; Pic[sPlayer]->Show(); Pic[sPlayer]->redraw = true; PrintStat(sPlayer); RedrawStat(); } else if(Level == 2) { Hand->redraw = true; Stat[sPlayer]->Hide(); sPlayer = sPlayer ? 0 : 1; Stat[sPlayer]->Show(); Stat[sPlayer]->redraw = true; PrintStat(sPlayer); RedrawStat(); } lButton = true; } else if(lButton && !P1[LEFT].v ) lButton = false; else if(!rButton && P1[RIGHT].v) { if(Level == 0) { Pic[sPlayer]->Hide(); sPlayer = sPlayer ? 0 : 1; Pic[sPlayer]->Show(); Pic[sPlayer]->redraw = true; PrintStat(sPlayer); RedrawStat(); } else if(Level == 2) { Hand->redraw = true; Stat[sPlayer]->Hide(); sPlayer = sPlayer ? 0 : 1; Stat[sPlayer]->Show(); Stat[sPlayer]->redraw = true; PrintStat(sPlayer); RedrawStat(); } rButton = true; } else if(rButton && !P1[RIGHT].v ) rButton = false; }
void sigusr1_handler(int signal) { fprintf(stderr, "ArchC: Received signal %d. Printing statistics\n", signal); PrintStat(); fprintf(stderr, "ArchC: -------------------- Continuing Simulation ------------------\n"); }
void sigsegv_handler(int signal) { fprintf(stderr, "ArchC Error: Segmentation fault.\n"); PrintStat(); exit(EXIT_FAILURE); }
void sigint_handler(int signal) { fprintf(stderr, "ArchC: INTERUPTED BY THE SIGNAL %d\n", signal); PrintStat(); exit(EXIT_FAILURE); }
void psgssvx(int nprocs, superlumt_options_t *superlumt_options, SuperMatrix *A, int *perm_c, int *perm_r, equed_t *equed, float *R, float *C, SuperMatrix *L, SuperMatrix *U, SuperMatrix *B, SuperMatrix *X, float *recip_pivot_growth, float *rcond, float *ferr, float *berr, superlu_memusage_t *superlu_memusage, int *info) { /* * -- SuperLU MT routine (version 2.0) -- * Lawrence Berkeley National Lab, Univ. of California Berkeley, * and Xerox Palo Alto Research Center. * September 10, 2007 * * Purpose * ======= * * psgssvx() solves the system of linear equations A*X=B or A'*X=B, using * the LU factorization from sgstrf(). Error bounds on the solution and * a condition estimate are also provided. It performs the following steps: * * 1. If A is stored column-wise (A->Stype = NC): * * 1.1. If fact = EQUILIBRATE, scaling factors are computed to equilibrate * the system: * trans = NOTRANS: diag(R)*A*diag(C)*inv(diag(C))*X = diag(R)*B * trans = TRANS: (diag(R)*A*diag(C))**T *inv(diag(R))*X = diag(C)*B * trans = CONJ: (diag(R)*A*diag(C))**H *inv(diag(R))*X = diag(C)*B * Whether or not the system will be equilibrated depends on the * scaling of the matrix A, but if equilibration is used, A is * overwritten by diag(R)*A*diag(C) and B by diag(R)*B * (if trans = NOTRANS) or diag(C)*B (if trans = TRANS or CONJ). * * 1.2. Permute columns of A, forming A*Pc, where Pc is a permutation matrix * that usually preserves sparsity. * For more details of this step, see ssp_colorder.c. * * 1.3. If fact = DOFACT or EQUILIBRATE, the LU decomposition is used to * factor the matrix A (after equilibration if fact = EQUILIBRATE) as * Pr*A*Pc = L*U, with Pr determined by partial pivoting. * * 1.4. Compute the reciprocal pivot growth factor. * * 1.5. If some U(i,i) = 0, so that U is exactly singular, then the routine * returns with info = i. Otherwise, the factored form of A is used to * estimate the condition number of the matrix A. If the reciprocal of * the condition number is less than machine precision, * info = A->ncol+1 is returned as a warning, but the routine still * goes on to solve for X and computes error bounds as described below. * * 1.6. The system of equations is solved for X using the factored form * of A. * * 1.7. Iterative refinement is applied to improve the computed solution * matrix and calculate error bounds and backward error estimates * for it. * * 1.8. If equilibration was used, the matrix X is premultiplied by * diag(C) (if trans = NOTRANS) or diag(R) (if trans = TRANS or CONJ) * so that it solves the original system before equilibration. * * 2. If A is stored row-wise (A->Stype = NR), apply the above algorithm * to the tranpose of A: * * 2.1. If fact = EQUILIBRATE, scaling factors are computed to equilibrate * the system: * trans = NOTRANS:diag(R)*A'*diag(C)*inv(diag(C))*X = diag(R)*B * trans = TRANS: (diag(R)*A'*diag(C))**T *inv(diag(R))*X = diag(C)*B * trans = CONJ: (diag(R)*A'*diag(C))**H *inv(diag(R))*X = diag(C)*B * Whether or not the system will be equilibrated depends on the * scaling of the matrix A, but if equilibration is used, A' is * overwritten by diag(R)*A'*diag(C) and B by diag(R)*B * (if trans = NOTRANS) or diag(C)*B (if trans = TRANS or CONJ). * * 2.2. Permute columns of transpose(A) (rows of A), * forming transpose(A)*Pc, where Pc is a permutation matrix that * usually preserves sparsity. * For more details of this step, see ssp_colorder.c. * * 2.3. If fact = DOFACT or EQUILIBRATE, the LU decomposition is used to * factor the matrix A (after equilibration if fact = EQUILIBRATE) as * Pr*transpose(A)*Pc = L*U, with the permutation Pr determined by * partial pivoting. * * 2.4. Compute the reciprocal pivot growth factor. * * 2.5. If some U(i,i) = 0, so that U is exactly singular, then the routine * returns with info = i. Otherwise, the factored form of transpose(A) * is used to estimate the condition number of the matrix A. * If the reciprocal of the condition number is less than machine * precision, info = A->nrow+1 is returned as a warning, but the * routine still goes on to solve for X and computes error bounds * as described below. * * 2.6. The system of equations is solved for X using the factored form * of transpose(A). * * 2.7. Iterative refinement is applied to improve the computed solution * matrix and calculate error bounds and backward error estimates * for it. * * 2.8. If equilibration was used, the matrix X is premultiplied by * diag(C) (if trans = NOTRANS) or diag(R) (if trans = TRANS or CONJ) * so that it solves the original system before equilibration. * * See supermatrix.h for the definition of 'SuperMatrix' structure. * * Arguments * ========= * * nprocs (input) int * Number of processes (or threads) to be spawned and used to perform * the LU factorization by psgstrf(). There is a single thread of * control to call psgstrf(), and all threads spawned by psgstrf() * are terminated before returning from psgstrf(). * * superlumt_options (input) superlumt_options_t* * The structure defines the input parameters and data structure * to control how the LU factorization will be performed. * The following fields should be defined for this structure: * * o fact (fact_t) * Specifies whether or not the factored form of the matrix * A is supplied on entry, and if not, whether the matrix A should * be equilibrated before it is factored. * = FACTORED: On entry, L, U, perm_r and perm_c contain the * factored form of A. If equed is not NOEQUIL, the matrix A has * been equilibrated with scaling factors R and C. * A, L, U, perm_r are not modified. * = DOFACT: The matrix A will be factored, and the factors will be * stored in L and U. * = EQUILIBRATE: The matrix A will be equilibrated if necessary, * then factored into L and U. * * o trans (trans_t) * Specifies the form of the system of equations: * = NOTRANS: A * X = B (No transpose) * = TRANS: A**T * X = B (Transpose) * = CONJ: A**H * X = B (Transpose) * * o refact (yes_no_t) * Specifies whether this is first time or subsequent factorization. * = NO: this factorization is treated as the first one; * = YES: it means that a factorization was performed prior to this * one. Therefore, this factorization will re-use some * existing data structures, such as L and U storage, column * elimination tree, and the symbolic information of the * Householder matrix. * * o panel_size (int) * A panel consists of at most panel_size consecutive columns. * * o relax (int) * To control degree of relaxing supernodes. If the number * of nodes (columns) in a subtree of the elimination tree is less * than relax, this subtree is considered as one supernode, * regardless of the row structures of those columns. * * o diag_pivot_thresh (float) * Diagonal pivoting threshold. At step j of the Gaussian * elimination, if * abs(A_jj) >= diag_pivot_thresh * (max_(i>=j) abs(A_ij)), * use A_jj as pivot, else use A_ij with maximum magnitude. * 0 <= diag_pivot_thresh <= 1. The default value is 1, * corresponding to partial pivoting. * * o usepr (yes_no_t) * Whether the pivoting will use perm_r specified by the user. * = YES: use perm_r; perm_r is input, unchanged on exit. * = NO: perm_r is determined by partial pivoting, and is output. * * o drop_tol (double) (NOT IMPLEMENTED) * Drop tolerance parameter. At step j of the Gaussian elimination, * if abs(A_ij)/(max_i abs(A_ij)) < drop_tol, drop entry A_ij. * 0 <= drop_tol <= 1. The default value of drop_tol is 0, * corresponding to not dropping any entry. * * o work (void*) of size lwork * User-supplied work space and space for the output data structures. * Not referenced if lwork = 0; * * o lwork (int) * Specifies the length of work array. * = 0: allocate space internally by system malloc; * > 0: use user-supplied work array of length lwork in bytes, * returns error if space runs out. * = -1: the routine guesses the amount of space needed without * performing the factorization, and returns it in * superlu_memusage->total_needed; no other side effects. * * A (input/output) SuperMatrix* * Matrix A in A*X=B, of dimension (A->nrow, A->ncol), where * A->nrow = A->ncol. Currently, the type of A can be: * Stype = NC or NR, Dtype = _D, Mtype = GE. In the future, * more general A will be handled. * * On entry, If superlumt_options->fact = FACTORED and equed is not * NOEQUIL, then A must have been equilibrated by the scaling factors * in R and/or C. On exit, A is not modified * if superlumt_options->fact = FACTORED or DOFACT, or * if superlumt_options->fact = EQUILIBRATE and equed = NOEQUIL. * * On exit, if superlumt_options->fact = EQUILIBRATE and equed is not * NOEQUIL, A is scaled as follows: * If A->Stype = NC: * equed = ROW: A := diag(R) * A * equed = COL: A := A * diag(C) * equed = BOTH: A := diag(R) * A * diag(C). * If A->Stype = NR: * equed = ROW: transpose(A) := diag(R) * transpose(A) * equed = COL: transpose(A) := transpose(A) * diag(C) * equed = BOTH: transpose(A) := diag(R) * transpose(A) * diag(C). * * perm_c (input/output) int* * If A->Stype = NC, Column permutation vector of size A->ncol, * which defines the permutation matrix Pc; perm_c[i] = j means * column i of A is in position j in A*Pc. * On exit, perm_c may be overwritten by the product of the input * perm_c and a permutation that postorders the elimination tree * of Pc'*A'*A*Pc; perm_c is not changed if the elimination tree * is already in postorder. * * If A->Stype = NR, column permutation vector of size A->nrow, * which describes permutation of columns of tranpose(A) * (rows of A) as described above. * * perm_r (input/output) int* * If A->Stype = NC, row permutation vector of size A->nrow, * which defines the permutation matrix Pr, and is determined * by partial pivoting. perm_r[i] = j means row i of A is in * position j in Pr*A. * * If A->Stype = NR, permutation vector of size A->ncol, which * determines permutation of rows of transpose(A) * (columns of A) as described above. * * If superlumt_options->usepr = NO, perm_r is output argument; * If superlumt_options->usepr = YES, the pivoting routine will try * to use the input perm_r, unless a certain threshold criterion * is violated. In that case, perm_r is overwritten by a new * permutation determined by partial pivoting or diagonal * threshold pivoting. * * equed (input/output) equed_t* * Specifies the form of equilibration that was done. * = NOEQUIL: No equilibration. * = ROW: Row equilibration, i.e., A was premultiplied by diag(R). * = COL: Column equilibration, i.e., A was postmultiplied by diag(C). * = BOTH: Both row and column equilibration, i.e., A was replaced * by diag(R)*A*diag(C). * If superlumt_options->fact = FACTORED, equed is an input argument, * otherwise it is an output argument. * * R (input/output) double*, dimension (A->nrow) * The row scale factors for A or transpose(A). * If equed = ROW or BOTH, A (if A->Stype = NC) or transpose(A) * (if A->Stype = NR) is multiplied on the left by diag(R). * If equed = NOEQUIL or COL, R is not accessed. * If fact = FACTORED, R is an input argument; otherwise, R is output. * If fact = FACTORED and equed = ROW or BOTH, each element of R must * be positive. * * C (input/output) double*, dimension (A->ncol) * The column scale factors for A or transpose(A). * If equed = COL or BOTH, A (if A->Stype = NC) or trnspose(A) * (if A->Stype = NR) is multiplied on the right by diag(C). * If equed = NOEQUIL or ROW, C is not accessed. * If fact = FACTORED, C is an input argument; otherwise, C is output. * If fact = FACTORED and equed = COL or BOTH, each element of C must * be positive. * * L (output) SuperMatrix* * The factor L from the factorization * Pr*A*Pc=L*U (if A->Stype = NC) or * Pr*transpose(A)*Pc=L*U (if A->Stype = NR). * Uses compressed row subscripts storage for supernodes, i.e., * L has types: Stype = SCP, Dtype = _D, Mtype = TRLU. * * U (output) SuperMatrix* * The factor U from the factorization * Pr*A*Pc=L*U (if A->Stype = NC) or * Pr*transpose(A)*Pc=L*U (if A->Stype = NR). * Uses column-wise storage scheme, i.e., U has types: * Stype = NCP, Dtype = _D, Mtype = TRU. * * B (input/output) SuperMatrix* * B has types: Stype = DN, Dtype = _D, Mtype = GE. * On entry, the right hand side matrix. * On exit, * if equed = NOEQUIL, B is not modified; otherwise * if A->Stype = NC: * if trans = NOTRANS and equed = ROW or BOTH, B is overwritten * by diag(R)*B; * if trans = TRANS or CONJ and equed = COL of BOTH, B is * overwritten by diag(C)*B; * if A->Stype = NR: * if trans = NOTRANS and equed = COL or BOTH, B is overwritten * by diag(C)*B; * if trans = TRANS or CONJ and equed = ROW of BOTH, B is * overwritten by diag(R)*B. * * X (output) SuperMatrix* * X has types: Stype = DN, Dtype = _D, Mtype = GE. * If info = 0 or info = A->ncol+1, X contains the solution matrix * to the original system of equations. Note that A and B are modified * on exit if equed is not NOEQUIL, and the solution to the * equilibrated system is inv(diag(C))*X if trans = NOTRANS and * equed = COL or BOTH, or inv(diag(R))*X if trans = TRANS or CONJ * and equed = ROW or BOTH. * * recip_pivot_growth (output) float* * The reciprocal pivot growth factor computed as * max_j ( max_i(abs(A_ij)) / max_i(abs(U_ij)) ). * If recip_pivot_growth is much less than 1, the stability of the * LU factorization could be poor. * * rcond (output) float* * The estimate of the reciprocal condition number of the matrix A * after equilibration (if done). If rcond is less than the machine * precision (in particular, if rcond = 0), the matrix is singular * to working precision. This condition is indicated by a return * code of info > 0. * * ferr (output) float*, dimension (B->ncol) * The estimated forward error bound for each solution vector * X(j) (the j-th column of the solution matrix X). * If XTRUE is the true solution corresponding to X(j), FERR(j) * is an estimated upper bound for the magnitude of the largest * element in (X(j) - XTRUE) divided by the magnitude of the * largest element in X(j). The estimate is as reliable as * the estimate for RCOND, and is almost always a slight * overestimate of the true error. * * berr (output) float*, dimension (B->ncol) * The componentwise relative backward error of each solution * vector X(j) (i.e., the smallest relative change in * any element of A or B that makes X(j) an exact solution). * * superlu_memusage (output) superlu_memusage_t* * Record the memory usage statistics, consisting of following fields: * - for_lu (float) * The amount of space used in bytes for L\U data structures. * - total_needed (float) * The amount of space needed in bytes to perform factorization. * - expansions (int) * The number of memory expansions during the LU factorization. * * info (output) int* * = 0: successful exit * < 0: if info = -i, the i-th argument had an illegal value * > 0: if info = i, and i is * <= A->ncol: U(i,i) is exactly zero. The factorization has * been completed, but the factor U is exactly * singular, so the solution and error bounds * could not be computed. * = A->ncol+1: U is nonsingular, but RCOND is less than machine * precision, meaning that the matrix is singular to * working precision. Nevertheless, the solution and * error bounds are computed because there are a number * of situations where the computed solution can be more * accurate than the value of RCOND would suggest. * > A->ncol+1: number of bytes allocated when memory allocation * failure occurred, plus A->ncol. * */ NCformat *Astore; DNformat *Bstore, *Xstore; float *Bmat, *Xmat; int ldb, ldx, nrhs; SuperMatrix *AA; /* A in NC format used by the factorization routine.*/ SuperMatrix AC; /* Matrix postmultiplied by Pc */ int colequ, equil, dofact, notran, rowequ; char norm[1]; trans_t trant; int i, j, info1; float amax, anorm, bignum, smlnum, colcnd, rowcnd, rcmax, rcmin; int n, relax, panel_size; Gstat_t Gstat; double t0; /* temporary time */ double *utime; flops_t *ops, flopcnt; /* External functions */ extern float slangs(char *, SuperMatrix *); extern double slamch_(char *); Astore = A->Store; Bstore = B->Store; Xstore = X->Store; Bmat = Bstore->nzval; Xmat = Xstore->nzval; n = A->ncol; ldb = Bstore->lda; ldx = Xstore->lda; nrhs = B->ncol; superlumt_options->perm_c = perm_c; superlumt_options->perm_r = perm_r; *info = 0; dofact = (superlumt_options->fact == DOFACT); equil = (superlumt_options->fact == EQUILIBRATE); notran = (superlumt_options->trans == NOTRANS); if (dofact || equil) { *equed = NOEQUIL; rowequ = FALSE; colequ = FALSE; } else { rowequ = (*equed == ROW) || (*equed == BOTH); colequ = (*equed == COL) || (*equed == BOTH); smlnum = slamch_("Safe minimum"); bignum = 1. / smlnum; } /* ------------------------------------------------------------ Test the input parameters. ------------------------------------------------------------*/ if ( nprocs <= 0 ) *info = -1; else if ( (!dofact && !equil && (superlumt_options->fact != FACTORED)) || (!notran && (superlumt_options->trans != TRANS) && (superlumt_options->trans != CONJ)) || (superlumt_options->refact != YES && superlumt_options->refact != NO) || (superlumt_options->usepr != YES && superlumt_options->usepr != NO) || superlumt_options->lwork < -1 ) *info = -2; else if ( A->nrow != A->ncol || A->nrow < 0 || (A->Stype != SLU_NC && A->Stype != SLU_NR) || A->Dtype != SLU_S || A->Mtype != SLU_GE ) *info = -3; else if ((superlumt_options->fact == FACTORED) && !(rowequ || colequ || (*equed == NOEQUIL))) *info = -6; else { if (rowequ) { rcmin = bignum; rcmax = 0.; for (j = 0; j < A->nrow; ++j) { rcmin = SUPERLU_MIN(rcmin, R[j]); rcmax = SUPERLU_MAX(rcmax, R[j]); } if (rcmin <= 0.) *info = -7; else if ( A->nrow > 0) rowcnd = SUPERLU_MAX(rcmin,smlnum) / SUPERLU_MIN(rcmax,bignum); else rowcnd = 1.; } if (colequ && *info == 0) { rcmin = bignum; rcmax = 0.; for (j = 0; j < A->nrow; ++j) { rcmin = SUPERLU_MIN(rcmin, C[j]); rcmax = SUPERLU_MAX(rcmax, C[j]); } if (rcmin <= 0.) *info = -8; else if (A->nrow > 0) colcnd = SUPERLU_MAX(rcmin,smlnum) / SUPERLU_MIN(rcmax,bignum); else colcnd = 1.; } if (*info == 0) { if ( B->ncol < 0 || Bstore->lda < SUPERLU_MAX(0, A->nrow) || B->Stype != SLU_DN || B->Dtype != SLU_S || B->Mtype != SLU_GE ) *info = -11; else if ( X->ncol < 0 || Xstore->lda < SUPERLU_MAX(0, A->nrow) || B->ncol != X->ncol || X->Stype != SLU_DN || X->Dtype != SLU_S || X->Mtype != SLU_GE ) *info = -12; } } if (*info != 0) { i = -(*info); xerbla_("psgssvx", &i); return; } /* ------------------------------------------------------------ Allocate storage and initialize statistics variables. ------------------------------------------------------------*/ panel_size = superlumt_options->panel_size; relax = superlumt_options->relax; StatAlloc(n, nprocs, panel_size, relax, &Gstat); StatInit(n, nprocs, &Gstat); utime = Gstat.utime; ops = Gstat.ops; /* ------------------------------------------------------------ Convert A to NC format when necessary. ------------------------------------------------------------*/ if ( A->Stype == SLU_NR ) { NRformat *Astore = A->Store; AA = (SuperMatrix *) SUPERLU_MALLOC( sizeof(SuperMatrix) ); sCreate_CompCol_Matrix(AA, A->ncol, A->nrow, Astore->nnz, Astore->nzval, Astore->colind, Astore->rowptr, SLU_NC, A->Dtype, A->Mtype); if ( notran ) { /* Reverse the transpose argument. */ trant = TRANS; notran = 0; } else { trant = NOTRANS; notran = 1; } } else { /* A->Stype == NC */ trant = superlumt_options->trans; AA = A; } /* ------------------------------------------------------------ Diagonal scaling to equilibrate the matrix. ------------------------------------------------------------*/ if ( equil ) { t0 = SuperLU_timer_(); /* Compute row and column scalings to equilibrate the matrix A. */ sgsequ(AA, R, C, &rowcnd, &colcnd, &amax, &info1); if ( info1 == 0 ) { /* Equilibrate matrix A. */ slaqgs(AA, R, C, rowcnd, colcnd, amax, equed); rowequ = (*equed == ROW) || (*equed == BOTH); colequ = (*equed == COL) || (*equed == BOTH); } utime[EQUIL] = SuperLU_timer_() - t0; } /* ------------------------------------------------------------ Scale the right hand side. ------------------------------------------------------------*/ if ( notran ) { if ( rowequ ) { for (j = 0; j < nrhs; ++j) for (i = 0; i < A->nrow; ++i) { Bmat[i + j*ldb] *= R[i]; } } } else if ( colequ ) { for (j = 0; j < nrhs; ++j) for (i = 0; i < A->nrow; ++i) { Bmat[i + j*ldb] *= C[i]; } } /* ------------------------------------------------------------ Perform the LU factorization. ------------------------------------------------------------*/ if ( dofact || equil ) { /* Obtain column etree, the column count (colcnt_h) and supernode partition (part_super_h) for the Householder matrix. */ t0 = SuperLU_timer_(); sp_colorder(AA, perm_c, superlumt_options, &AC); utime[ETREE] = SuperLU_timer_() - t0; #if ( PRNTlevel >= 2 ) printf("Factor PA = LU ... relax %d\tw %d\tmaxsuper %d\trowblk %d\n", relax, panel_size, sp_ienv(3), sp_ienv(4)); fflush(stdout); #endif /* Compute the LU factorization of A*Pc. */ t0 = SuperLU_timer_(); psgstrf(superlumt_options, &AC, perm_r, L, U, &Gstat, info); utime[FACT] = SuperLU_timer_() - t0; flopcnt = 0; for (i = 0; i < nprocs; ++i) flopcnt += Gstat.procstat[i].fcops; ops[FACT] = flopcnt; if ( superlumt_options->lwork == -1 ) { superlu_memusage->total_needed = *info - A->ncol; return; } } if ( *info > 0 ) { if ( *info <= A->ncol ) { /* Compute the reciprocal pivot growth factor of the leading rank-deficient *info columns of A. */ *recip_pivot_growth = sPivotGrowth(*info, AA, perm_c, L, U); } } else { /* ------------------------------------------------------------ Compute the reciprocal pivot growth factor *recip_pivot_growth. ------------------------------------------------------------*/ *recip_pivot_growth = sPivotGrowth(A->ncol, AA, perm_c, L, U); /* ------------------------------------------------------------ Estimate the reciprocal of the condition number of A. ------------------------------------------------------------*/ t0 = SuperLU_timer_(); if ( notran ) { *(unsigned char *)norm = '1'; } else { *(unsigned char *)norm = 'I'; } anorm = slangs(norm, AA); sgscon(norm, L, U, anorm, rcond, info); utime[RCOND] = SuperLU_timer_() - t0; /* ------------------------------------------------------------ Compute the solution matrix X. ------------------------------------------------------------*/ for (j = 0; j < nrhs; j++) /* Save a copy of the right hand sides */ for (i = 0; i < B->nrow; i++) Xmat[i + j*ldx] = Bmat[i + j*ldb]; t0 = SuperLU_timer_(); sgstrs(trant, L, U, perm_r, perm_c, X, &Gstat, info); utime[SOLVE] = SuperLU_timer_() - t0; ops[SOLVE] = ops[TRISOLVE]; /* ------------------------------------------------------------ Use iterative refinement to improve the computed solution and compute error bounds and backward error estimates for it. ------------------------------------------------------------*/ t0 = SuperLU_timer_(); sgsrfs(trant, AA, L, U, perm_r, perm_c, *equed, R, C, B, X, ferr, berr, &Gstat, info); utime[REFINE] = SuperLU_timer_() - t0; /* ------------------------------------------------------------ Transform the solution matrix X to a solution of the original system. ------------------------------------------------------------*/ if ( notran ) { if ( colequ ) { for (j = 0; j < nrhs; ++j) for (i = 0; i < A->nrow; ++i) { Xmat[i + j*ldx] *= C[i]; } } } else if ( rowequ ) { for (j = 0; j < nrhs; ++j) for (i = 0; i < A->nrow; ++i) { Xmat[i + j*ldx] *= R[i]; } } /* Set INFO = A->ncol+1 if the matrix is singular to working precision.*/ if ( *rcond < slamch_("E") ) *info = A->ncol + 1; } superlu_sQuerySpace(nprocs, L, U, panel_size, superlu_memusage); /* ------------------------------------------------------------ Deallocate storage after factorization. ------------------------------------------------------------*/ if ( superlumt_options->refact == NO ) { SUPERLU_FREE(superlumt_options->etree); SUPERLU_FREE(superlumt_options->colcnt_h); SUPERLU_FREE(superlumt_options->part_super_h); } if ( dofact || equil ) { Destroy_CompCol_Permuted(&AC); } if ( A->Stype == SLU_NR ) { Destroy_SuperMatrix_Store(AA); SUPERLU_FREE(AA); } /* ------------------------------------------------------------ Print timings, then deallocate statistic variables. ------------------------------------------------------------*/ #ifdef PROFILE { SCPformat *Lstore = (SCPformat *) L->Store; ParallelProfile(n, Lstore->nsuper+1, Gstat.num_panels, nprocs, &Gstat); } #endif PrintStat(&Gstat); StatFree(&Gstat); }
void dgssv(SuperMatrix *A, int *perm_c, int *perm_r, SuperMatrix *L, SuperMatrix *U, SuperMatrix *B, int *info ) { /* * Purpose * ======= * * DGSSV solves the system of linear equations A*X=B, using the * LU factorization from DGSTRF. It performs the following steps: * * 1. If A is stored column-wise (A->Stype = NC): * * 1.1. Permute the columns of A, forming A*Pc, where Pc * is a permutation matrix. For more details of this step, * see sp_preorder.c. * * 1.2. Factor A as Pr*A*Pc=L*U with the permutation Pr determined * by Gaussian elimination with partial pivoting. * L is unit lower triangular with offdiagonal entries * bounded by 1 in magnitude, and U is upper triangular. * * 1.3. Solve the system of equations A*X=B using the factored * form of A. * * 2. If A is stored row-wise (A->Stype = NR), apply the * above algorithm to the transpose of A: * * 2.1. Permute columns of transpose(A) (rows of A), * forming transpose(A)*Pc, where Pc is a permutation matrix. * For more details of this step, see sp_preorder.c. * * 2.2. Factor A as Pr*transpose(A)*Pc=L*U with the permutation Pr * determined by Gaussian elimination with partial pivoting. * L is unit lower triangular with offdiagonal entries * bounded by 1 in magnitude, and U is upper triangular. * * 2.3. Solve the system of equations A*X=B using the factored * form of A. * * See supermatrix.h for the definition of 'SuperMatrix' structure. * * Arguments * ========= * * A (input) SuperMatrix* * Matrix A in A*X=B, of dimension (A->nrow, A->ncol). The number * of linear equations is A->nrow. Currently, the type of A can be: * Stype = NC or NR; Dtype = _D; Mtype = GE. In the future, more * general A will be handled. * * perm_c (input/output) int* * If A->Stype = NC, column permutation vector of size A->ncol * which defines the permutation matrix Pc; perm_c[i] = j means * column i of A is in position j in A*Pc. * On exit, perm_c may be overwritten by the product of the input * perm_c and a permutation that postorders the elimination tree * of Pc'*A'*A*Pc; perm_c is not changed if the elimination tree * is already in postorder. * * If A->Stype = NR, column permutation vector of size A->nrow * which describes permutation of columns of transpose(A) * (rows of A) as described above. * * perm_r (output) int* * If A->Stype = NC, row permutation vector of size A->nrow, * which defines the permutation matrix Pr, and is determined * by partial pivoting. perm_r[i] = j means row i of A is in * position j in Pr*A. * * If A->Stype = NR, permutation vector of size A->ncol, which * determines permutation of rows of transpose(A) * (columns of A) as described above. * * L (output) SuperMatrix* * The factor L from the factorization * Pr*A*Pc=L*U (if A->Stype = NC) or * Pr*transpose(A)*Pc=L*U (if A->Stype = NR). * Uses compressed row subscripts storage for supernodes, i.e., * L has types: Stype = SC, Dtype = _D, Mtype = TRLU. * * U (output) SuperMatrix* * The factor U from the factorization * Pr*A*Pc=L*U (if A->Stype = NC) or * Pr*transpose(A)*Pc=L*U (if A->Stype = NR). * Uses column-wise storage scheme, i.e., U has types: * Stype = NC, Dtype = _D, Mtype = TRU. * * B (input/output) SuperMatrix* * B has types: Stype = DN, Dtype = _D, Mtype = GE. * On entry, the right hand side matrix. * On exit, the solution matrix if info = 0; * * info (output) int* * = 0: successful exit * > 0: if info = i, and i is * <= A->ncol: U(i,i) is exactly zero. The factorization has * been completed, but the factor U is exactly singular, * so the solution could not be computed. * > A->ncol: number of bytes allocated when memory allocation * failure occurred, plus A->ncol. * */ double t1; /* Temporary time */ char refact[1], trans[1]; DNformat *Bstore; SuperMatrix *AA; /* A in NC format used by the factorization routine.*/ SuperMatrix AC; /* Matrix postmultiplied by Pc */ int lwork = 0, *etree, i; /* Set default values for some parameters */ double diag_pivot_thresh = 1.0; double drop_tol = 0; int panel_size; /* panel size */ int relax; /* no of columns in a relaxed snodes */ double *utime; extern SuperLUStat_t SuperLUStat; /* Test the input parameters ... */ *info = 0; Bstore = B->Store; if ( A->nrow != A->ncol || A->nrow < 0 || (A->Stype != NC && A->Stype != NR) || A->Dtype != _D || A->Mtype != GE ) *info = -1; else if ( B->ncol < 0 || Bstore->lda < MAX(0, A->nrow) || B->Stype != DN || B->Dtype != _D || B->Mtype != GE ) *info = -6; if ( *info != 0 ) { i = -(*info); xerbla_("dgssv", &i); return; } *refact = 'N'; *trans = 'N'; panel_size = sp_ienv(1); relax = sp_ienv(2); StatInit(panel_size, relax); utime = SuperLUStat.utime; /* Convert A to NC format when necessary. */ if ( A->Stype == NR ) { NRformat *Astore = A->Store; AA = (SuperMatrix *) SUPERLU_MALLOC( sizeof(SuperMatrix) ); dCreate_CompCol_Matrix(AA, A->ncol, A->nrow, Astore->nnz, Astore->nzval, Astore->colind, Astore->rowptr, NC, A->Dtype, A->Mtype); *trans = 'T'; } else if ( A->Stype == NC ) AA = A; etree = intMalloc(A->ncol); t1 = SuperLU_timer_(); sp_preorder(refact, AA, perm_c, etree, &AC); utime[ETREE] = SuperLU_timer_() - t1; /*printf("Factor PA = LU ... relax %d\tw %d\tmaxsuper %d\trowblk %d\n", relax, panel_size, sp_ienv(3), sp_ienv(4));*/ t1 = SuperLU_timer_(); /* Compute the LU factorization of A. */ dgstrf(refact, &AC, diag_pivot_thresh, drop_tol, relax, panel_size, etree, NULL, lwork, perm_r, perm_c, L, U, info); utime[FACT] = SuperLU_timer_() - t1; t1 = SuperLU_timer_(); if ( *info == 0 ) { /* Solve the system A*X=B, overwriting B with X. */ dgstrs (trans, L, U, perm_r, perm_c, B, info); } utime[SOLVE] = SuperLU_timer_() - t1; SUPERLU_FREE (etree); Destroy_CompCol_Permuted(&AC); if ( A->Stype == NR ) { Destroy_SuperMatrix_Store(AA); SUPERLU_FREE(AA); } PrintStat( &SuperLUStat ); StatFree(); }
BOOL CDynamoRIOView::Refresh() { if (m_selected_pid <= 0) { ZeroStrings(); return TRUE; } // We have to grab new stats every refresh dr_statistics_t *new_stats = get_dynamorio_stats(m_selected_pid); if (new_stats == NULL) { if (m_stats != NULL) { // Leave the stats for an exited process in place, for viewing // and copying } else return TRUE; } else { if (m_stats != NULL) free_dynamorio_stats(m_stats); m_stats = new_stats; } uint i; #define MAX_VISIBLE_STATS 75 #define STATS_BUFSZ (MAX_VISIBLE_STATS*(sizeof(single_stat_t)*2/*cover %10u, etc.*/)) TCHAR buf[STATS_BUFSZ]; TCHAR *c = buf; buf[0] = _T('\0'); // If I just use a CString hooked up via DDX, re-setting the // text causes the top of the visible box to show the top of // the stats string; plus the scrollbar goes to the top, // unless held in place; probably any reset of the string // does an auto-reset of the display and scrollbar position. // To have all the text in there do this: // int scroll_pos = m_StatsCtl.GetScrollPos(SB_VERT); // m_StatsCtl.SetWindowText(buf); // m_StatsCtl.LineScroll(scroll_pos); // But then there's a lot of flickering: too much. // We only put visible text lines in the CEdit box, to reduce the // flicker. It's too hard to do it w/ the CEdit's own scrollbar, // which sets itself based on the actual text, so we have a // separate one. // HACK: I don't know how to find out how many lines will // fit w/o putting actual text in there if (m_StatsViewLines == 0) { for (i = 0; i < m_stats->num_stats && i < MAX_VISIBLE_STATS /* can't be more than this */; i++) { if (c >= &buf[STATS_BUFSZ-STAT_NAME_MAX_LEN*2]) break; c += PrintStat(c, i, FALSE/*no filter*/); assert(c < &buf[STATS_BUFSZ-1]); } m_StatsCtl.SetWindowText(buf); UpdateData(FALSE); // write to screen // I tried having only one screenful of string there, and // setting the scrollbar range to be larger, but it doesn't // seem to support that. RECT rect; m_StatsCtl.GetRect(&rect); CPoint pos(rect.right, rect.bottom); m_StatsViewLines = HIWORD(m_StatsCtl.CharFromPos(pos)); assert(m_StatsViewLines > 0); m_StatsSB.SetScrollRange(0, m_stats->num_stats-1, TRUE/*redraw*/); c = buf; SCROLLINFO info; info.cbSize = sizeof(SCROLLINFO); info.fMask = SIF_PAGE; info.nPage = m_StatsViewLines; m_StatsSB.SetScrollInfo(&info); } int scroll_pos = m_StatsSB.GetScrollPos(); DWORD shown = 0; uint printed; for (i = scroll_pos; i < m_stats->num_stats && shown < m_StatsViewLines; i++) { if (c >= &buf[STATS_BUFSZ-STAT_NAME_MAX_LEN*2]) break; printed = PrintStat(c, i, TRUE/*filter*/); c += printed; assert(c < &buf[STATS_BUFSZ-1]); if (printed > 0) shown++; } m_StatsCtl.SetWindowText(buf); // num_stats could have changed so update m_StatsSB.SetScrollRange(0, m_stats->num_stats-1, TRUE/*redraw*/); if (new_stats == NULL) m_Exited = _T(" Exited"); // line right end up with Running else m_Exited = _T("Running"); #ifndef DRSTATS_DEMO m_LogLevel.Format(_T("%d"), m_stats->loglevel); m_LogMask.Format(_T("0x%05X"), m_stats->logmask); m_LogDir.Format(_T("%") ASCII_PRINTF, m_stats->logdir); #endif if (m_clientStats != NULL) { #define CLIENTSTATS_BUFSZ USHRT_MAX TCHAR buf[CLIENTSTATS_BUFSZ]; PrintClientStats(buf, &buf[CLIENTSTATS_BUFSZ-1]); m_ClientStats.Format(_T("%s"), buf); } else m_ClientStats.Format(_T("")); UpdateData(FALSE); // write to screen return TRUE; }
void *tokenThread(void *id) { long sleep_time; int queue2_empty; int token_drop=0; Packet *pkt; My402ListElem *elem; while(1) { if(token_die==1) { token_drop_prob = (double)token_drop/tokencount; pthread_exit(NULL); } ttend=getinstanttime(); sleep_time = tokenarrival - (ttend-ttstart); usleep(sleep_time); ttstart = getinstanttime(); pthread_mutex_lock(&my_mutex); if(token_bucket<B) { token_bucket++; tokencount++; PrintStat(getinstanttime()); fprintf(stdout,"token t%d arrives, token bucket now has %d tokens\n",tokencount,token_bucket); } else { PrintStat(getinstanttime()); tokencount++; token_drop++; fprintf(stdout,"token t%d arrives, token bucket full, token dropped!!\n",tokencount); } if(!My402ListEmpty(&queue1)) { elem = My402ListFirst(&queue1); pkt = (Packet *)elem->obj; if(token_bucket >= pkt->num_tokens) { token_bucket-=pkt->num_tokens; My402ListUnlink(&queue1,elem); pkt->q1_exit = getinstanttime(); PrintStat(getinstanttime()); fprintf(stdout, "p%d leaves Q1, time in Q1 = %.3fms, token bucket now has %d tokens\n", pkt->pkt_id, (double)(pkt->q1_exit - pkt->q1_enter)/1000, token_bucket); avg_pkt_q1 += (pkt->q1_exit - pkt->q1_enter); pkts_left_q1++; queue2_empty = My402ListEmpty(&queue2); My402ListAppend(&queue2,pkt); pkt->q2_enter = getinstanttime(); PrintStat(getinstanttime()); fprintf(stdout,"p%d enters Q2\n", pkt->pkt_id); if(queue2_empty==1) pthread_cond_signal(&queue2_cond); } } pthread_mutex_unlock(&my_mutex); if(pkts_left_q1 == pkts_to_arrive) { token_drop_prob = (double)token_drop/tokencount; pthread_exit(NULL); } } }
int main( int argc, char **argv ) { struct stat stat_buff; stat_record_t sum_stat; printer_t print_header, print_record; nfprof_t profile_data; char *rfile, *Rfile, *Mdirs, *wfile, *ffile, *filter, *tstring, *stat_type; char *byte_limit_string, *packet_limit_string, *print_format, *record_header; char *print_order, *query_file, *UnCompress_file, *nameserver, *aggr_fmt; int c, ffd, ret, element_stat, fdump; int i, user_format, quiet, flow_stat, topN, aggregate, aggregate_mask, bidir; int print_stat, syntax_only, date_sorted, do_tag, compress, do_xstat; int plain_numbers, GuessDir, pipe_output, csv_output; time_t t_start, t_end; uint32_t limitflows; char Ident[IDENTLEN]; rfile = Rfile = Mdirs = wfile = ffile = filter = tstring = stat_type = NULL; byte_limit_string = packet_limit_string = NULL; fdump = aggregate = 0; aggregate_mask = 0; bidir = 0; t_start = t_end = 0; syntax_only = 0; topN = -1; flow_stat = 0; print_stat = 0; element_stat = 0; do_xstat = 0; limitflows = 0; date_sorted = 0; total_bytes = 0; total_flows = 0; skipped_blocks = 0; do_tag = 0; quiet = 0; user_format = 0; compress = 0; plain_numbers = 0; pipe_output = 0; csv_output = 0; is_anonymized = 0; GuessDir = 0; nameserver = NULL; print_format = NULL; print_header = NULL; print_record = NULL; print_order = NULL; query_file = NULL; UnCompress_file = NULL; aggr_fmt = NULL; record_header = NULL; Ident[0] = '\0'; while ((c = getopt(argc, argv, "6aA:Bbc:D:E:s:hHn:i:j:f:qzr:v:w:K:M:NImO:R:XZt:TVv:x:l:L:o:")) != EOF) { switch (c) { case 'h': usage(argv[0]); exit(0); break; case 'a': aggregate = 1; break; case 'A': if ( !ParseAggregateMask(optarg, &aggr_fmt ) ) { exit(255); } aggregate_mask = 1; break; case 'B': GuessDir = 1; case 'b': if ( !SetBidirAggregation() ) { exit(255); } bidir = 1; // implies aggregate = 1; break; case 'D': nameserver = optarg; if ( !set_nameserver(nameserver) ) { exit(255); } break; case 'E': query_file = optarg; if ( !InitExporterList() ) { exit(255); } PrintExporters(query_file); exit(0); break; case 'X': fdump = 1; break; case 'Z': syntax_only = 1; break; case 'q': quiet = 1; break; case 'z': compress = 1; break; case 'c': limitflows = atoi(optarg); if ( !limitflows ) { LogError("Option -c needs a number > 0\n"); exit(255); } break; case 's': stat_type = optarg; if ( !SetStat(stat_type, &element_stat, &flow_stat) ) { exit(255); } break; case 'V': { char *e1, *e2; e1 = ""; e2 = ""; #ifdef NSEL e1 = "NSEL-NEL"; #endif printf("%s: Version: %s%s%s\n",argv[0], e1, e2, nfdump_version); exit(0); } break; case 'l': packet_limit_string = optarg; break; case 'K': LogError("*** Anonymisation moved! Use nfanon to anonymise flows!\n"); exit(255); break; case 'H': do_xstat = 1; break; case 'L': byte_limit_string = optarg; break; case 'N': plain_numbers = 1; break; case 'f': ffile = optarg; break; case 't': tstring = optarg; break; case 'r': rfile = optarg; if ( strcmp(rfile, "-") == 0 ) rfile = NULL; break; case 'm': print_order = "tstart"; Parse_PrintOrder(print_order); date_sorted = 1; LogError("Option -m depricated. Use '-O tstart' instead\n"); break; case 'M': Mdirs = optarg; break; case 'I': print_stat++; break; case 'o': // output mode print_format = optarg; break; case 'O': { // stat order by int ret; print_order = optarg; ret = Parse_PrintOrder(print_order); if ( ret < 0 ) { LogError("Unknown print order '%s'\n", print_order); exit(255); } date_sorted = ret == 6; // index into order_mode } break; case 'R': Rfile = optarg; break; case 'w': wfile = optarg; break; case 'n': topN = atoi(optarg); if ( topN < 0 ) { LogError("TopnN number %i out of range\n", topN); exit(255); } break; case 'T': do_tag = 1; break; case 'i': strncpy(Ident, optarg, IDENT_SIZE); Ident[IDENT_SIZE - 1] = 0; if ( strchr(Ident, ' ') ) { LogError("Ident must not contain spaces\n"); exit(255); } break; case 'j': UnCompress_file = optarg; UnCompressFile(UnCompress_file); exit(0); break; case 'x': query_file = optarg; InitExtensionMaps(NO_EXTENSION_LIST); DumpExMaps(query_file); exit(0); break; case 'v': query_file = optarg; QueryFile(query_file); exit(0); break; case '6': // print long IPv6 addr Setv6Mode(1); break; default: usage(argv[0]); exit(0); } } if (argc - optind > 1) { usage(argv[0]); exit(255); } else { /* user specified a pcap filter */ filter = argv[optind]; FilterFilename = NULL; } // Change Ident only if ( rfile && strlen(Ident) > 0 ) { ChangeIdent(rfile, Ident); exit(0); } if ( (element_stat || flow_stat) && (topN == -1) ) topN = 10; if ( topN < 0 ) topN = 0; if ( (element_stat && !flow_stat) && aggregate_mask ) { LogError("Warning: Aggregation ignored for element statistics\n"); aggregate_mask = 0; } if ( !flow_stat && aggregate_mask ) { aggregate = 1; } if ( rfile && Rfile ) { LogError("-r and -R are mutually exclusive. Plase specify either -r or -R\n"); exit(255); } if ( Mdirs && !(rfile || Rfile) ) { LogError("-M needs either -r or -R to specify the file or file list. Add '-R .' for all files in the directories.\n"); exit(255); } extension_map_list = InitExtensionMaps(NEEDS_EXTENSION_LIST); if ( !InitExporterList() ) { exit(255); } SetupInputFileSequence(Mdirs, rfile, Rfile); if ( print_stat ) { nffile_t *nffile; if ( !rfile && !Rfile && !Mdirs) { LogError("Expect data file(s).\n"); exit(255); } memset((void *)&sum_stat, 0, sizeof(stat_record_t)); sum_stat.first_seen = 0x7fffffff; sum_stat.msec_first = 999; nffile = GetNextFile(NULL, 0, 0); if ( !nffile ) { LogError("Error open file: %s\n", strerror(errno)); exit(250); } while ( nffile && nffile != EMPTY_LIST ) { SumStatRecords(&sum_stat, nffile->stat_record); nffile = GetNextFile(nffile, 0, 0); } PrintStat(&sum_stat); exit(0); } // handle print mode if ( !print_format ) { // automatically select an appropriate output format for custom aggregation // aggr_fmt is compiled by ParseAggregateMask if ( aggr_fmt ) { int len = strlen(AggrPrependFmt) + strlen(aggr_fmt) + strlen(AggrAppendFmt) + 7; // +7 for 'fmt:', 2 spaces and '\0' print_format = malloc(len); if ( !print_format ) { LogError("malloc() error in %s line %d: %s\n", __FILE__, __LINE__, strerror(errno) ); exit(255); } snprintf(print_format, len, "fmt:%s %s %s",AggrPrependFmt, aggr_fmt, AggrAppendFmt ); print_format[len-1] = '\0'; } else if ( bidir ) { print_format = "biline"; } else print_format = DefaultMode; } if ( strncasecmp(print_format, "fmt:", 4) == 0 ) { // special user defined output format char *format = &print_format[4]; if ( strlen(format) ) { if ( !ParseOutputFormat(format, plain_numbers, printmap) ) exit(255); print_record = format_special; record_header = get_record_header(); user_format = 1; } else { LogError("Missing format description for user defined output format!\n"); exit(255); } } else { // predefined output format // Check for long_v6 mode i = strlen(print_format); if ( i > 2 ) { if ( print_format[i-1] == '6' ) { Setv6Mode(1); print_format[i-1] = '\0'; } else Setv6Mode(0); } i = 0; while ( printmap[i].printmode ) { if ( strncasecmp(print_format, printmap[i].printmode, MAXMODELEN) == 0 ) { if ( printmap[i].Format ) { if ( !ParseOutputFormat(printmap[i].Format, plain_numbers, printmap) ) exit(255); // predefined custom format print_record = printmap[i].func; record_header = get_record_header(); user_format = 1; } else { // To support the pipe output format for element stats - check for pipe, and remember this if ( strncasecmp(print_format, "pipe", MAXMODELEN) == 0 ) { pipe_output = 1; } if ( strncasecmp(print_format, "csv", MAXMODELEN) == 0 ) { csv_output = 1; set_record_header(); record_header = get_record_header(); } // predefined static format print_record = printmap[i].func; user_format = 0; } break; } i++; } } if ( !print_record ) { LogError("Unknown output mode '%s'\n", print_format); exit(255); } // this is the only case, where headers are printed. if ( strncasecmp(print_format, "raw", 16) == 0 ) print_header = format_file_block_header; if ( aggregate && (flow_stat || element_stat) ) { aggregate = 0; LogError("Command line switch -s overwrites -a\n"); } if ( !filter && ffile ) { if ( stat(ffile, &stat_buff) ) { LogError("Can't stat filter file '%s': %s\n", ffile, strerror(errno)); exit(255); } filter = (char *)malloc(stat_buff.st_size+1); if ( !filter ) { LogError("malloc() error in %s line %d: %s\n", __FILE__, __LINE__, strerror(errno) ); exit(255); } ffd = open(ffile, O_RDONLY); if ( ffd < 0 ) { LogError("Can't open filter file '%s': %s\n", ffile, strerror(errno)); exit(255); } ret = read(ffd, (void *)filter, stat_buff.st_size); if ( ret < 0 ) { perror("Error reading filter file"); close(ffd); exit(255); } total_bytes += ret; filter[stat_buff.st_size] = 0; close(ffd); FilterFilename = ffile; } // if no filter is given, set the default ip filter which passes through every flow if ( !filter || strlen(filter) == 0 ) filter = "any"; Engine = CompileFilter(filter); if ( !Engine ) exit(254); if ( fdump ) { printf("StartNode: %i Engine: %s\n", Engine->StartNode, Engine->Extended ? "Extended" : "Fast"); DumpList(Engine); exit(0); } if ( syntax_only ) exit(0); if ( print_order && flow_stat ) { printf("-s record and -O (-m) are mutually exclusive options\n"); exit(255); } if ((aggregate || flow_stat || print_order) && !Init_FlowTable() ) exit(250); if (element_stat && !Init_StatTable(HashBits, NumPrealloc) ) exit(250); SetLimits(element_stat || aggregate || flow_stat, packet_limit_string, byte_limit_string); if ( tstring ) { if ( !ScanTimeFrame(tstring, &t_start, &t_end) ) exit(255); } if ( !(flow_stat || element_stat || wfile || quiet ) && record_header ) { if ( user_format ) { printf("%s\n", record_header); } else { // static format - no static format with header any more, but keep code anyway if ( Getv6Mode() ) { printf("%s\n", record_header); } else printf("%s\n", record_header); } } nfprof_start(&profile_data); sum_stat = process_data(wfile, element_stat, aggregate || flow_stat, print_order != NULL, print_header, print_record, t_start, t_end, limitflows, do_tag, compress, do_xstat); nfprof_end(&profile_data, total_flows); if ( total_bytes == 0 ) { printf("No matched flows\n"); exit(0); } if (aggregate || print_order) { if ( wfile ) { nffile_t *nffile = OpenNewFile(wfile, NULL, compress, is_anonymized, NULL); if ( !nffile ) exit(255); if ( ExportFlowTable(nffile, aggregate, bidir, date_sorted, extension_map_list) ) { CloseUpdateFile(nffile, Ident ); } else { CloseFile(nffile); unlink(wfile); } DisposeFile(nffile); } else { PrintFlowTable(print_record, topN, do_tag, GuessDir, extension_map_list); } } if (flow_stat) { PrintFlowStat(record_header, print_record, topN, do_tag, quiet, csv_output, extension_map_list); #ifdef DEVEL printf("Loopcnt: %u\n", loopcnt); #endif } if (element_stat) { PrintElementStat(&sum_stat, plain_numbers, record_header, print_record, topN, do_tag, quiet, pipe_output, csv_output); } if ( !quiet ) { if ( csv_output ) { PrintSummary(&sum_stat, plain_numbers, csv_output); } else if ( !wfile ) { if (is_anonymized) printf("IP addresses anonymised\n"); PrintSummary(&sum_stat, plain_numbers, csv_output); if ( t_last_flow == 0 ) { // in case of a pre 1.6.6 collected and empty flow file printf("Time window: <unknown>\n"); } else { printf("Time window: %s\n", TimeString(t_first_flow, t_last_flow)); } printf("Total flows processed: %u, Blocks skipped: %u, Bytes read: %llu\n", total_flows, skipped_blocks, (unsigned long long)total_bytes); nfprof_print(&profile_data, stdout); } } Dispose_FlowTable(); Dispose_StatTable(); FreeExtensionMaps(extension_map_list); #ifdef DEVEL if ( hash_hit || hash_miss ) printf("Hash hit: %i, miss: %i, skip: %i, ratio: %5.3f\n", hash_hit, hash_miss, hash_skip, (float)hash_hit/((float)(hash_hit+hash_miss))); #endif return 0; }
void *serverThread(void *id) { Packet *pkt; My402ListElem *elem; int i,pkt_processed = 0; long serv_start, serv_end, avg_st = 0, avg_pkst = 0,sys_time; double sys_avg = 0, sys_avg_sq = 0; double var_sys, var_sys_sq; for(i=0;i<pkts_to_arrive;i++) { pthread_mutex_lock(&my_mutex); while(My402ListEmpty(&queue2) && server_die==0) { if(i==pkts_to_arrive) // This is the case when the last packet is dropped. And the break; // server thread is waiting on q2 and no pkt is there to be queued to q2. pthread_cond_wait(&queue2_cond, &my_mutex); } if(i==pkts_to_arrive) server_die=1; if(server_die!=0) { My402ListUnlinkAll(&queue1); My402ListUnlinkAll(&queue2); pthread_mutex_unlock(&my_mutex); break; } elem=My402ListFirst(&queue2); pkt = (Packet *)elem->obj; My402ListUnlink(&queue2,elem); pkt->q2_exit = getinstanttime(); PrintStat(getinstanttime()); fprintf(stdout,"p%d begins service at S, time in Q2 = %.3fms\n", pkt->pkt_id, (double)(pkt->q2_exit - pkt->q2_enter)/1000); pthread_mutex_unlock(&my_mutex); avg_pkt_q2 += (pkt->q2_exit - pkt->q2_enter); serv_start = getinstanttime(); usleep(pkt->service_time); pkt->sys_exit = serv_end = getinstanttime(); pkt->serv_time = serv_end - serv_start; avg_st += pkt->serv_time; avg_pkst += (pkt->sys_exit - pkt->sys_enter); pkt_processed++; PrintStat(getinstanttime()); sys_time = pkt->sys_exit - pkt->sys_enter; fprintf(stdout,"p%d departs from S, service time = %.3fms, time in system = %.3fms\n", pkt->pkt_id, (double)(pkt->serv_time)/1000, (double)(sys_time)/1000); avg_pkt_s += pkt->serv_time; sys_avg += (double)(sys_time)/1000000; sys_avg_sq += ((double)(sys_time)/1000000) * ((double)(sys_time)/1000000); } // Informing token thread to die. if(pkt_processed!=0) { avg_serv_time = (double)((double)avg_st/(double)(pkt_processed*1000000)); avg_pkt_sys_time = (double)((double)avg_pkst/(double)(pkt_processed*1000000)); var_sys = sys_avg/pkt_processed; var_sys_sq = sys_avg_sq/pkt_processed; std_deviation = sqrt(var_sys_sq - var_sys*var_sys); } else { avg_serv_time = 0; avg_pkt_sys_time = 0; var_sys = 0; var_sys_sq = 0; std_deviation = 0; } token_die=1; pthread_exit(NULL); }