void benchmark( int n, int *a, int (*computeSum)(int,int*), char *name ) { /* warm up */ int sum = computeSum( n, a ); /* measure */ unsigned long long cycles = RDTSC(); sum += computeSum( n, a ); cycles = RDTSC()-cycles; double microseconds = cycles/CLOCK_RATE_GHZ*1e6; /* report */ printf( "%20s: ", name ); if( sum == 2*sum_naive(n,a) ) printf( "%.2f microseconds\n", microseconds ); else printf( "ERROR!\n" ); }
double computeAverage(int n, double y[]) { printf("Average: "); if (n != 0) return computeSum(n, y) / n; else { printf("Warning: Division by 0!"); return 0.0; } }
int main(int argc, char *argv[]) { int i; int n; // loop {number of iterations} [number of threads] if(argc<2) { printf("Usage: sumcomp {array size} [number of threads]\n"); exit(1); } n = atoll(argv[1]); printf("Debug: array size = %d \n",n); if(argc==3) { p = atoi(argv[2]); assert(p>=1); printf("Debug: number of requested threads = %d\n",p); } omp_set_num_threads(p); #pragma omp parallel { assert(p==omp_get_num_threads()); //printf("Debug: number of threads set = %d\n",omp_get_num_threads()); int rank = omp_get_thread_num(); printf("Rank=%d: my world has %d threads\n",rank,p); } // end of my omp parallel region double time = omp_get_wtime(); // 1. generate the array // // int *a=NULL; a = generateArray(n); //dispArray(a,n); // 2. compute sum using reduce computeSum(a,n); time = omp_get_wtime() - time; printf("Total time = %f seconds \n ", time); return 0; }
int computeSum(int **matrix, int startX, int startY, int stopX, int stopY, std::unordered_map<Submatrix, int> &submatrixSums) { Submatrix currSubmatrix(startX, startY, stopX, stopY); if (submatrixSums.find(currSubmatrix) != submatrixSums.end()) { return (submatrixSums[currSubmatrix]); } else { int sum = matrix[startX][startY]; if (startX < stopX) { sum += computeSum(matrix, startX + 1, startY, stopX, stopY, submatrixSums); } if (startY < stopY) { sum += computeSum(matrix, startX, startY + 1, startX, stopY, submatrixSums); } submatrixSums[currSubmatrix] = sum; return sum; } }
void benchmark(int n, int *a, int(*computeSum)(int, int*), char *name) { // warm up cache int sum = computeSum(n, a); // measure uint64_t beginCycle = RDTSC(); sum += computeSum(n, a); uint64_t cycles = RDTSC() - beginCycle; double microseconds = cycles/CLOCK_RATE_GHZ*1e6; // print results printf("%20s: ", name); if (sum == 2 * sum_naive(n, a)) { printf("%.2f microseconds\n", microseconds); } else { printf("ERROR!\n"); } }
void computeLargestSumSubmatrix(int ** matrix, int startX, int startY, int stopX, int stopY, Submatrix &largestSumSubmatrix, int &largestSum, std::unordered_map<Submatrix, int> &submatrixSums) { int currentSum = 0; if ((startX == stopX) && (startY == stopY)) { currentSum = matrix[startX][startY]; } else { currentSum = computeSum(matrix, startX, startY, stopX, stopY, submatrixSums); if (startX < stopX) { computeLargestSumSubmatrix( matrix, startX + 1, startY, stopX, stopY, largestSumSubmatrix, largestSum, submatrixSums ); computeLargestSumSubmatrix( matrix, startX, startY, stopX - 1, stopY, largestSumSubmatrix, largestSum, submatrixSums ); } if (startY < stopY) { computeLargestSumSubmatrix( matrix, startX, startY + 1, stopX, stopY, largestSumSubmatrix, largestSum, submatrixSums ); computeLargestSumSubmatrix( matrix, startX, startY, stopX, stopY - 1, largestSumSubmatrix, largestSum, submatrixSums ); } } if (currentSum > largestSum) { largestSum = currentSum; largestSumSubmatrix.startX = startX; largestSumSubmatrix.startY = startY; largestSumSubmatrix.stopX = stopX; largestSumSubmatrix.stopY = stopY; } }
TransactionView::TransactionView(const PlatformStyle *platformStyle, QWidget *parent) : QWidget(parent), model(0), transactionProxyModel(0), transactionView(0), abandonAction(0), columnResizingFixer(0) { QSettings settings; // Build filter row setContentsMargins(0,0,0,0); QHBoxLayout *hlayout = new QHBoxLayout(); hlayout->setContentsMargins(0,0,0,0); if (platformStyle->getUseExtraSpacing()) { hlayout->setSpacing(0); hlayout->addSpacing(6); } else { hlayout->setSpacing(1); hlayout->addSpacing(5); } QString theme = GUIUtil::getThemeName(); watchOnlyWidget = new QComboBox(this); watchOnlyWidget->setFixedWidth(24); watchOnlyWidget->addItem("", TransactionFilterProxy::WatchOnlyFilter_All); watchOnlyWidget->addItem(QIcon(":/icons/" + theme + "/eye_plus"), "", TransactionFilterProxy::WatchOnlyFilter_Yes); watchOnlyWidget->addItem(QIcon(":/icons/" + theme + "/eye_minus"), "", TransactionFilterProxy::WatchOnlyFilter_No); hlayout->addWidget(watchOnlyWidget); dateWidget = new QComboBox(this); if (platformStyle->getUseExtraSpacing()) { dateWidget->setFixedWidth(120); } else { dateWidget->setFixedWidth(120); } dateWidget->addItem(tr("All"), All); dateWidget->addItem(tr("Today"), Today); dateWidget->addItem(tr("This week"), ThisWeek); dateWidget->addItem(tr("This month"), ThisMonth); dateWidget->addItem(tr("Last month"), LastMonth); dateWidget->addItem(tr("This year"), ThisYear); dateWidget->addItem(tr("Range..."), Range); dateWidget->setCurrentIndex(settings.value("transactionDate").toInt()); hlayout->addWidget(dateWidget); typeWidget = new QComboBox(this); if (platformStyle->getUseExtraSpacing()) { typeWidget->setFixedWidth(TYPE_COLUMN_WIDTH); } else { typeWidget->setFixedWidth(TYPE_COLUMN_WIDTH-1); } typeWidget->addItem(tr("All"), TransactionFilterProxy::ALL_TYPES); typeWidget->addItem(tr("Most Common"), TransactionFilterProxy::COMMON_TYPES); typeWidget->addItem(tr("Received with"), TransactionFilterProxy::TYPE(TransactionRecord::RecvWithAddress) | TransactionFilterProxy::TYPE(TransactionRecord::RecvFromOther)); typeWidget->addItem(tr("Sent to"), TransactionFilterProxy::TYPE(TransactionRecord::SendToAddress) | TransactionFilterProxy::TYPE(TransactionRecord::SendToOther)); typeWidget->addItem(tr("PrivateSend"), TransactionFilterProxy::TYPE(TransactionRecord::PrivateSend)); typeWidget->addItem(tr("PrivateSend Make Collateral Inputs"), TransactionFilterProxy::TYPE(TransactionRecord::PrivateSendMakeCollaterals)); typeWidget->addItem(tr("PrivateSend Create Denominations"), TransactionFilterProxy::TYPE(TransactionRecord::PrivateSendCreateDenominations)); typeWidget->addItem(tr("PrivateSend Denominate"), TransactionFilterProxy::TYPE(TransactionRecord::PrivateSendDenominate)); typeWidget->addItem(tr("PrivateSend Collateral Payment"), TransactionFilterProxy::TYPE(TransactionRecord::PrivateSendCollateralPayment)); typeWidget->addItem(tr("To yourself"), TransactionFilterProxy::TYPE(TransactionRecord::SendToSelf)); typeWidget->addItem(tr("Mined"), TransactionFilterProxy::TYPE(TransactionRecord::Generated)); typeWidget->addItem(tr("Other"), TransactionFilterProxy::TYPE(TransactionRecord::Other)); typeWidget->setCurrentIndex(settings.value("transactionType").toInt()); hlayout->addWidget(typeWidget); addressWidget = new QLineEdit(this); #if QT_VERSION >= 0x040700 addressWidget->setPlaceholderText(tr("Enter address or label to search")); #endif addressWidget->setObjectName("addressWidget"); hlayout->addWidget(addressWidget); amountWidget = new QLineEdit(this); #if QT_VERSION >= 0x040700 amountWidget->setPlaceholderText(tr("Min amount")); #endif if (platformStyle->getUseExtraSpacing()) { amountWidget->setFixedWidth(118); } else { amountWidget->setFixedWidth(125); } amountWidget->setValidator(new QDoubleValidator(0, 1e20, 8, this)); amountWidget->setObjectName("amountWidget"); hlayout->addWidget(amountWidget); QVBoxLayout *vlayout = new QVBoxLayout(this); vlayout->setContentsMargins(0,0,0,0); vlayout->setSpacing(0); QTableView *view = new QTableView(this); vlayout->addLayout(hlayout); vlayout->addWidget(createDateRangeWidget()); vlayout->addWidget(view); vlayout->setSpacing(0); int width = view->verticalScrollBar()->sizeHint().width(); // Cover scroll bar width with spacing if (platformStyle->getUseExtraSpacing()) { hlayout->addSpacing(width+2); } else { hlayout->addSpacing(width); } // Always show scroll bar view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); view->setTabKeyNavigation(false); view->setContextMenuPolicy(Qt::CustomContextMenu); view->installEventFilter(this); transactionView = view; // Actions abandonAction = new QAction(tr("Abandon transaction"), this); QAction *copyAddressAction = new QAction(tr("Copy address"), this); QAction *copyLabelAction = new QAction(tr("Copy label"), this); QAction *copyAmountAction = new QAction(tr("Copy amount"), this); QAction *copyTxIDAction = new QAction(tr("Copy transaction ID"), this); QAction *copyTxHexAction = new QAction(tr("Copy raw transaction"), this); QAction *copyTxPlainText = new QAction(tr("Copy full transaction details"), this); QAction *editLabelAction = new QAction(tr("Edit label"), this); QAction *showDetailsAction = new QAction(tr("Show transaction details"), this); contextMenu = new QMenu(this); contextMenu->addAction(copyAddressAction); contextMenu->addAction(copyLabelAction); contextMenu->addAction(copyAmountAction); contextMenu->addAction(copyTxIDAction); contextMenu->addAction(copyTxHexAction); contextMenu->addAction(copyTxPlainText); contextMenu->addAction(showDetailsAction); contextMenu->addSeparator(); contextMenu->addAction(abandonAction); contextMenu->addAction(editLabelAction); mapperThirdPartyTxUrls = new QSignalMapper(this); // Connect actions connect(mapperThirdPartyTxUrls, SIGNAL(mapped(QString)), this, SLOT(openThirdPartyTxUrl(QString))); connect(dateWidget, SIGNAL(activated(int)), this, SLOT(chooseDate(int))); connect(typeWidget, SIGNAL(activated(int)), this, SLOT(chooseType(int))); connect(watchOnlyWidget, SIGNAL(activated(int)), this, SLOT(chooseWatchonly(int))); connect(addressWidget, SIGNAL(textChanged(QString)), this, SLOT(changedPrefix(QString))); connect(amountWidget, SIGNAL(textChanged(QString)), this, SLOT(changedAmount(QString))); connect(view, SIGNAL(doubleClicked(QModelIndex)), this, SIGNAL(doubleClicked(QModelIndex))); connect(view, SIGNAL(clicked(QModelIndex)), this, SLOT(computeSum())); connect(view, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(contextualMenu(QPoint))); connect(abandonAction, SIGNAL(triggered()), this, SLOT(abandonTx())); connect(copyAddressAction, SIGNAL(triggered()), this, SLOT(copyAddress())); connect(copyLabelAction, SIGNAL(triggered()), this, SLOT(copyLabel())); connect(copyAmountAction, SIGNAL(triggered()), this, SLOT(copyAmount())); connect(copyTxIDAction, SIGNAL(triggered()), this, SLOT(copyTxID())); connect(copyTxHexAction, SIGNAL(triggered()), this, SLOT(copyTxHex())); connect(copyTxPlainText, SIGNAL(triggered()), this, SLOT(copyTxPlainText())); connect(editLabelAction, SIGNAL(triggered()), this, SLOT(editLabel())); connect(showDetailsAction, SIGNAL(triggered()), this, SLOT(showDetails())); }
void TransactionView::setModel(WalletModel *model) { QSettings settings; this->model = model; if(model) { transactionProxyModel = new TransactionFilterProxy(this); transactionProxyModel->setSourceModel(model->getTransactionTableModel()); transactionProxyModel->setDynamicSortFilter(true); transactionProxyModel->setSortCaseSensitivity(Qt::CaseInsensitive); transactionProxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive); transactionProxyModel->setSortRole(Qt::EditRole); transactionView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); transactionView->setModel(transactionProxyModel); transactionView->setAlternatingRowColors(true); transactionView->setSelectionBehavior(QAbstractItemView::SelectRows); transactionView->setSelectionMode(QAbstractItemView::ExtendedSelection); transactionView->setSortingEnabled(true); transactionView->sortByColumn(TransactionTableModel::Status, Qt::DescendingOrder); transactionView->verticalHeader()->hide(); transactionView->setColumnWidth(TransactionTableModel::Status, STATUS_COLUMN_WIDTH); transactionView->setColumnWidth(TransactionTableModel::Watchonly, WATCHONLY_COLUMN_WIDTH); transactionView->setColumnWidth(TransactionTableModel::Date, DATE_COLUMN_WIDTH); transactionView->setColumnWidth(TransactionTableModel::Type, TYPE_COLUMN_WIDTH); transactionView->setColumnWidth(TransactionTableModel::Amount, AMOUNT_MINIMUM_COLUMN_WIDTH); // Note: it's a good idea to connect this signal AFTER the model is set connect(transactionView->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), this, SLOT(computeSum())); columnResizingFixer = new GUIUtil::TableViewLastColumnResizingFixer(transactionView, AMOUNT_MINIMUM_COLUMN_WIDTH, MINIMUM_COLUMN_WIDTH, this); if (model->getOptionsModel()) { // Add third party transaction URLs to context menu QStringList listUrls = model->getOptionsModel()->getThirdPartyTxUrls().split("|", QString::SkipEmptyParts); for (int i = 0; i < listUrls.size(); ++i) { QString host = QUrl(listUrls[i].trimmed(), QUrl::StrictMode).host(); if (!host.isEmpty()) { QAction *thirdPartyTxUrlAction = new QAction(host, this); // use host as menu item label if (i == 0) contextMenu->addSeparator(); contextMenu->addAction(thirdPartyTxUrlAction); connect(thirdPartyTxUrlAction, SIGNAL(triggered()), mapperThirdPartyTxUrls, SLOT(map())); mapperThirdPartyTxUrls->setMapping(thirdPartyTxUrlAction, listUrls[i].trimmed()); } } } // show/hide column Watch-only updateWatchOnlyColumn(model->haveWatchOnly()); // Watch-only signal connect(model, SIGNAL(notifyWatchonlyChanged(bool)), this, SLOT(updateWatchOnlyColumn(bool))); // Update transaction list with persisted settings chooseType(settings.value("transactionType").toInt()); chooseDate(settings.value("transactionDate").toInt()); } }
TransactionView::TransactionView(QWidget* parent) : QWidget(parent), model(0), transactionProxyModel(0), transactionView(0) { QSettings settings; // Build filter row setContentsMargins(0, 0, 0, 0); QHBoxLayout* hlayout = new QHBoxLayout(); hlayout->setContentsMargins(0, 0, 0, 0); #ifdef Q_OS_MAC hlayout->setSpacing(5); hlayout->addSpacing(26); #else hlayout->setSpacing(0); hlayout->addSpacing(23); #endif watchOnlyWidget = new QComboBox(this); watchOnlyWidget->setFixedWidth(24); watchOnlyWidget->addItem("", TransactionFilterProxy::WatchOnlyFilter_All); watchOnlyWidget->addItem(QIcon(":/icons/eye_plus"), "", TransactionFilterProxy::WatchOnlyFilter_Yes); watchOnlyWidget->addItem(QIcon(":/icons/eye_minus"), "", TransactionFilterProxy::WatchOnlyFilter_No); hlayout->addWidget(watchOnlyWidget); dateWidget = new QComboBox(this); #ifdef Q_OS_MAC dateWidget->setFixedWidth(121); #else dateWidget->setFixedWidth(120); #endif dateWidget->addItem(tr("All"), All); dateWidget->addItem(tr("Today"), Today); dateWidget->addItem(tr("This week"), ThisWeek); dateWidget->addItem(tr("This month"), ThisMonth); dateWidget->addItem(tr("Last month"), LastMonth); dateWidget->addItem(tr("This year"), ThisYear); dateWidget->addItem(tr("Range..."), Range); dateWidget->setCurrentIndex(settings.value("transactionDate").toInt()); hlayout->addWidget(dateWidget); typeWidget = new QComboBox(this); #ifdef Q_OS_MAC typeWidget->setFixedWidth(TYPE_COLUMN_WIDTH + 1); #else typeWidget->setFixedWidth(TYPE_COLUMN_WIDTH); #endif typeWidget->addItem(tr("All"), TransactionFilterProxy::ALL_TYPES); typeWidget->addItem(tr("Most Common"), TransactionFilterProxy::COMMON_TYPES); typeWidget->addItem(tr("Received with"), TransactionFilterProxy::TYPE(TransactionRecord::RecvWithAddress) | TransactionFilterProxy::TYPE(TransactionRecord::RecvFromOther)); typeWidget->addItem(tr("Sent to"), TransactionFilterProxy::TYPE(TransactionRecord::SendToAddress) | TransactionFilterProxy::TYPE(TransactionRecord::SendToOther)); typeWidget->addItem(tr("Obfuscated"), TransactionFilterProxy::TYPE(TransactionRecord::Obfuscated)); typeWidget->addItem(tr("Obfuscation Make Collateral Inputs"), TransactionFilterProxy::TYPE(TransactionRecord::ObfuscationMakeCollaterals)); typeWidget->addItem(tr("Obfuscation Create Denominations"), TransactionFilterProxy::TYPE(TransactionRecord::ObfuscationCreateDenominations)); typeWidget->addItem(tr("Obfuscation Denominate"), TransactionFilterProxy::TYPE(TransactionRecord::ObfuscationDenominate)); typeWidget->addItem(tr("Obfuscation Collateral Payment"), TransactionFilterProxy::TYPE(TransactionRecord::ObfuscationCollateralPayment)); typeWidget->addItem(tr("To yourself"), TransactionFilterProxy::TYPE(TransactionRecord::SendToSelf)); typeWidget->addItem(tr("Mined"), TransactionFilterProxy::TYPE(TransactionRecord::Generated)); typeWidget->addItem(tr("Minted"), TransactionFilterProxy::TYPE(TransactionRecord::StakeMint)); typeWidget->addItem(tr("Masternode Reward"), TransactionFilterProxy::TYPE(TransactionRecord::MNReward)); typeWidget->addItem(tr("Other"), TransactionFilterProxy::TYPE(TransactionRecord::Other)); typeWidget->setCurrentIndex(settings.value("transactionType").toInt()); hlayout->addWidget(typeWidget); addressWidget = new QLineEdit(this); #if QT_VERSION >= 0x040700 addressWidget->setPlaceholderText(tr("Enter address or label to search")); #endif hlayout->addWidget(addressWidget); amountWidget = new QLineEdit(this); #if QT_VERSION >= 0x040700 amountWidget->setPlaceholderText(tr("Min amount")); #endif #ifdef Q_OS_MAC amountWidget->setFixedWidth(97); #else amountWidget->setFixedWidth(100); #endif amountWidget->setValidator(new QDoubleValidator(0, 1e20, 8, this)); hlayout->addWidget(amountWidget); QVBoxLayout* vlayout = new QVBoxLayout(this); vlayout->setContentsMargins(0, 0, 0, 0); vlayout->setSpacing(0); QTableView* view = new QTableView(this); vlayout->addLayout(hlayout); vlayout->addWidget(createDateRangeWidget()); vlayout->addWidget(view); vlayout->setSpacing(0); int width = view->verticalScrollBar()->sizeHint().width(); // Cover scroll bar width with spacing #ifdef Q_OS_MAC hlayout->addSpacing(width + 2); #else hlayout->addSpacing(width); #endif // Always show scroll bar view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); view->setTabKeyNavigation(false); view->setContextMenuPolicy(Qt::CustomContextMenu); view->installEventFilter(this); transactionView = view; // Actions QAction* copyAddressAction = new QAction(tr("Copy address"), this); QAction* copyLabelAction = new QAction(tr("Copy label"), this); QAction* copyAmountAction = new QAction(tr("Copy amount"), this); QAction* copyTxIDAction = new QAction(tr("Copy transaction ID"), this); QAction* editLabelAction = new QAction(tr("Edit label"), this); QAction* showDetailsAction = new QAction(tr("Show transaction details"), this); contextMenu = new QMenu(); contextMenu->addAction(copyAddressAction); contextMenu->addAction(copyLabelAction); contextMenu->addAction(copyAmountAction); contextMenu->addAction(copyTxIDAction); contextMenu->addAction(editLabelAction); contextMenu->addAction(showDetailsAction); mapperThirdPartyTxUrls = new QSignalMapper(this); // Connect actions connect(mapperThirdPartyTxUrls, SIGNAL(mapped(QString)), this, SLOT(openThirdPartyTxUrl(QString))); connect(dateWidget, SIGNAL(activated(int)), this, SLOT(chooseDate(int))); connect(typeWidget, SIGNAL(activated(int)), this, SLOT(chooseType(int))); connect(watchOnlyWidget, SIGNAL(activated(int)), this, SLOT(chooseWatchonly(int))); connect(addressWidget, SIGNAL(textChanged(QString)), this, SLOT(changedPrefix(QString))); connect(amountWidget, SIGNAL(textChanged(QString)), this, SLOT(changedAmount(QString))); connect(view, SIGNAL(doubleClicked(QModelIndex)), this, SIGNAL(doubleClicked(QModelIndex))); connect(view, SIGNAL(clicked(QModelIndex)), this, SLOT(computeSum())); connect(view, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(contextualMenu(QPoint))); connect(copyAddressAction, SIGNAL(triggered()), this, SLOT(copyAddress())); connect(copyLabelAction, SIGNAL(triggered()), this, SLOT(copyLabel())); connect(copyAmountAction, SIGNAL(triggered()), this, SLOT(copyAmount())); connect(copyTxIDAction, SIGNAL(triggered()), this, SLOT(copyTxID())); connect(editLabelAction, SIGNAL(triggered()), this, SLOT(editLabel())); connect(showDetailsAction, SIGNAL(triggered()), this, SLOT(showDetails())); }
//!!!!!! void MainWindow::computeEF_TU() { double E,EFT0,EFT1,EFT2 ; double dE=0.1; double sum, sum1, Area, sum10, sum11, sum12; double Ucur=this->U;//!!!!!!!!!!! this->U=Vg0; double Vd0=Vdot(); this->U=Ucur; double aa=(sqrt(1250.)-350)/Delta_r; aa=aa*aa; aa=4*this->U/(1+aa); // aa=0; if(this->T==0) { EFT1=aa+EF0+Vdot()-Vd0+Cg0*(Ucur-Vg0);//!!!!!!!!!! } else { //T!=0 double Vd=Vdot(); this->EF=aa+EF0+Vd-Vd0+Cg0*(Ucur-Vg0); int NE=int((this->EF+40*this->T-Vd)/dE); this->AreaEf.resize(NE,0.0); sum=0; EFT1=this->EF-1;//!!!!!!!!!!!!!!!!!!!!!!!! for (int i=0; i< NE; ++i) { E=dE*(i+1)+Vd; Area=AreaE(E)/10000; this->AreaEf[i]=Area; if(E<=this->EF) sum=sum+Area; } // this->density=sum; if(sum!=0) { EFT0=EFT1;//this->EF-1.;//!!!!!!!!!!!!!!!!! sum1=computeSum(NE, dE, Vd, EFT0); while(sum1>sum) { EFT0=EFT0-1; sum1=computeSum(NE, dE, Vd, EFT0); } sum10=sum1; EFT1=EFT0+1; sum11=computeSum(NE, dE, Vd, EFT1); // int j=0; while(fabs(sum11-sum)>0.001*sum) { EFT2=EFT1-(sum11-sum)*(EFT1-EFT0)/(sum11-sum10); sum12=computeSum(NE, dE, Vd, EFT2); // j++; if(sum12>sum&&sum11<sum||sum12<sum&& sum11>sum) { sum10=sum11; EFT0=EFT1; } sum11=sum12; EFT1=EFT2; } } } this->EFT=EFT1; }
void MainWindow::computeEFU() { double E,EFT0,EFT1,EFT2 ; double dE=0.1; double sum, sum1, Area, sum10, sum11, sum12; int NU=1+int( (this->Umax-this->Umin)/this->dU ); this->EFUarray.resize(NU,0.0); // double Ucur=this->U; this->U=Vg0; double Vd0=Vdot(); double aa1=(sqrt(1250.)-350)/Delta_r; aa1=aa1*aa1; aa1=4/(1+aa1); // double EF00this->EF0; if(this->T==0) { int j=0; for(double x=this->Umin; x<=this->Umax; x+=this->dU) { this->U=x; double aa=aa1*this->U; // aa=0; EFT1=aa+EF0+Vdot()-Vd0+Cg0*(this->U-Vg0); if(j<this->EFUarray.size()) { this->EFUarray[j]=EFT1; j++; this->EFT=EFT1; } } return; } int j=0; for(double x=this->Umin; x<=this->Umax; x+=this->dU) { this->U=x; double Vd=Vdot(); double aa=aa1*this->U; this->EF=aa+EF0+Vd-Vd0+Cg0*(this->U-Vg0); int NE = int( (this->EF+40*this->T-Vd)/dE ); this->AreaEf.resize(NE,0.0); sum=0; EFT1=this->EF-1; for (int i=0; i< NE; ++i) { E=dE*(i+1)+Vd; Area=AreaE(E)/10000; this->AreaEf[i]=Area; if(E<=this->EF) sum=sum+Area; } if(sum==0) { j++; } else { EFT0=EFT1; sum1=computeSum(NE, dE, Vd, EFT0); while(sum1>sum) { EFT0=EFT0-1; sum1=computeSum(NE, dE, Vd, EFT0); } sum10=sum1; EFT1=EFT0+1; sum11=computeSum(NE, dE, Vd, EFT1); while(fabs(sum11-sum)>0.001*sum) { EFT2=EFT1-(sum11-sum)*(EFT1-EFT0)/(sum11-sum10); sum12=computeSum(NE, dE, Vd, EFT2); if(sum12>sum&&sum11<sum||sum12<sum&& sum11>sum) { sum10=sum11; EFT0=EFT1; } sum11=sum12; EFT1=EFT2; } if(j<this->EFUarray.size()) { this->EFUarray[j]=EFT1; j++; this->EFT=EFT1; } else break; } } }
//!!!!!!! void MainWindow::computeEFT() { double E,EFT0,EFT1,EFT2 ; int NT=1+int( (this->Tmax-this->Tmin)/this->dT ); this->EFTarray.resize(NT,0.0); // printf("EFTarray has %i points",NT); /* for(int j=0; j<NT; j++) { this->EFTarray[j]=EF0; } */ double dE=0.1; double Ucur=this->U; this->U=Vg0; double Vd0=Vdot(); this->U=Ucur; double Vd=Vdot(); double aa1=(sqrt(1250.)-350)/Delta_r; aa1=aa1*aa1; aa1=4/(1+aa1); double aa=aa1*this->U; // double EF00=this->EF0; this->EF=aa+EF0+Vd-Vd0+Cg0*(this->U-Vg0); // return; int NE = 1+int( (this->EF+40*this->Tmax-Vdot())/dE ); if(NE<0) return; printf("AreaEf has %i points",NE); this->AreaEf.resize(NE,0.0); double sum, sum1, Area, sum10, sum11, sum12; sum=0; for (int i=0; i< NE; ++i) { E=dE*(i+1)+Vd; Area=AreaE(E)/10000; this->AreaEf[i]=Area; if(E<=this->EF) sum=sum+Area; } if(sum==0) return; else { EFT1=this->EF-1.; for(int j=0; j<NT; j++) { this->T=this->Tmax-this->dT*j; EFT0=EFT1; sum1=computeSum(NE, dE, Vd, EFT0); while(sum1>sum) { EFT0=EFT0-1; sum1=computeSum(NE, dE, Vd, EFT0); } sum10=sum1; EFT1=EFT0+1; sum11=computeSum(NE, dE, Vd, EFT1); while(fabs(sum11-sum)>0.001*sum) { EFT2=EFT1-(sum11-sum)*(EFT1-EFT0)/(sum11-sum10); sum12=computeSum(NE, dE, Vd, EFT2); if(sum12>sum&&sum11<sum||sum12<sum&& sum11>sum) { sum10=sum11; EFT0=EFT1; } sum11=sum12; EFT1=EFT2; } this->EFTarray[j]=EFT1; } } }
// Compute mean double computeMean(double data[], int length){ return computeSum(data, length)/length; }
int testComputeSum() { int status = 0; int numCells = 32; Real domainSize = 2.0; IntVect loVect = IntVect::Zero; IntVect hiVect = (numCells-1)*IntVect::Unit; Box domainBox(loVect, hiVect); ProblemDomain baseDomain(domainBox); int maxBoxSize = numCells/2; Vector<Box> vectBoxes; domainSplit(baseDomain, vectBoxes, maxBoxSize, 1); Vector<int> procAssign(vectBoxes.size(), 0); LoadBalance(procAssign, vectBoxes); DisjointBoxLayout level0Grids(vectBoxes, procAssign, baseDomain); Real dx0 = domainSize/numCells; // first test -- single level { int numLevels = 1; Vector<LevelData<FArrayBox>* > phi(numLevels, NULL); IntVect ghostVect = IntVect::Unit; phi[0] = new LevelData<FArrayBox>(level0Grids, 1, ghostVect); initData(*phi[0], dx0); Vector<int> nRef(numLevels, 4); Real sum = computeSum(phi, nRef, dx0); Real exactVal = D_TERM6(domainSize, *domainSize, *domainSize, *domainSize, *domainSize, *domainSize); if (abs(sum - exactVal) > tolerance) { if (verbose) { pout() << "Single-level computeSum: expected" << exactVal << ", computed sum = " << sum << endl; } status += 1; } // clean up storage delete phi[0]; phi[0] = NULL; } // second test -- single level with maxLevel > 0 { int numLevels = 3; Vector<LevelData<FArrayBox>* > phi(numLevels, NULL); IntVect ghostVect = IntVect::Unit; // levels 1 and 2 are undefined phi[0] = new LevelData<FArrayBox>(level0Grids, 1, ghostVect); initData(*phi[0], dx0); Vector<int> nRef(numLevels, 4); Real sum = computeSum(phi, nRef, dx0); Real exactVal = D_TERM6(domainSize, *domainSize, *domainSize, *domainSize, *domainSize, *domainSize); if (abs(sum - exactVal) > tolerance) { if (verbose) { pout() << "single level, maxLevel > 0 computeSum: expected" << exactVal << ", computed sum = " << sum << endl; } status += 10; } // clean up storage delete phi[0]; phi[0] = NULL; } // third test -- multiple levels { int numLevels = 3; Vector<int> nRef(numLevels, 4); Vector<LevelData<FArrayBox>* > phi(numLevels, NULL); IntVect ghostVect = IntVect::Unit; // level 0 phi[0] = new LevelData<FArrayBox>(level0Grids, 1, ghostVect); initData(*phi[0], dx0); // level 1: { Vector<Box> level1Boxes; // do this in a bit of a silly way int quarterDomain = numCells / 4; int threeQuarterDomain = 3*numCells/4; IntVect loVect(quarterDomain); IntVect hiVect(IntVect::Unit*threeQuarterDomain); hiVect -= IntVect::Unit; Box spanBox(loVect, hiVect); int maxBox1 = quarterDomain; ProblemDomain level1Domain(baseDomain); level1Domain.refine(nRef[0]); ProblemDomain spanDomain(spanBox); domainSplit(spanDomain, level1Boxes, maxBox1, 1); Vector<int> level1ProcAssign(level1Boxes.size(), 0); LoadBalance(level1ProcAssign, level1Boxes); DisjointBoxLayout level1Grids(level1Boxes, level1ProcAssign, level1Domain); phi[1] = new LevelData<FArrayBox>(level1Grids, 1, IntVect::Unit); Real dx1 = dx0/nRef[0]; initData(*phi[1], dx1); } Real sum = computeSum(phi, nRef, dx0); Real exactVal = D_TERM6(domainSize, *domainSize, *domainSize, *domainSize, *domainSize, *domainSize); if (abs(sum - exactVal) > tolerance) { if (verbose) { pout() << "single level, maxLevel > 0 computeSum: expected" << exactVal << ", computed sum = " << sum << endl; } status += 10; } // clean up storage delete phi[0]; phi[0] = NULL; delete phi[1]; phi[1] = NULL; } return status; }
// Things to do after a timestep void AMRLevelPluto::postTimeStep() { CH_assert(allDefined()); // Used for conservation tests static Real orig_integral = 0.0; static Real last_integral = 0.0; static bool first = true; if (s_verbosity >= 3) { pout() << "AMRLevelPluto::postTimeStep " << m_level << endl; } if (m_hasFiner) { // Reflux Real scale = -1.0/m_dx; m_fluxRegister.reflux(m_UNew,scale); // Average from finer level data AMRLevelPluto* amrGodFinerPtr = getFinerLevel(); amrGodFinerPtr->m_coarseAverage.averageToCoarse(m_UNew, amrGodFinerPtr->m_UNew); } if (s_verbosity >= 2 && m_level == 0) { int nRefFine = 1; pout() << "AMRLevelPluto::postTimeStep:" << endl; pout() << " Sums:" << endl; for (int comp = 0; comp < m_numStates; comp++) { Interval curComp(comp,comp); Real integral = computeSum(m_UNew,NULL,nRefFine,m_dx,curComp); pout() << " " << setw(23) << setprecision(16) << setiosflags(ios::showpoint) << setiosflags(ios::scientific) << integral << " --- " << m_ConsStateNames[comp]; if (comp == 0 && !first) { pout() << " (" << setw(23) << setprecision(16) << setiosflags(ios::showpoint) << setiosflags(ios::scientific) << (integral-last_integral)/last_integral << " " << setw(23) << setprecision(16) << setiosflags(ios::showpoint) << setiosflags(ios::scientific) << (integral-orig_integral)/orig_integral << ")"; } pout() << endl; if (comp == 0) { if (first) { orig_integral = integral; first = false; } last_integral = integral; } } } if (s_verbosity >= 3) { pout() << "AMRLevelPluto::postTimeStep " << m_level << " finished" << endl; } }