/* DFT++ is a density functional package developed by the research group of Professor Tomas Arias Copyright 1996-2003 Sohrab Ismail-Beigi This file is part of DFT++. DFT++ is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. DFT++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with DFT++; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Please see the file CREDITS for a list of authors. For academic users, we request that publications using results obtained with this software reference "New algebraic formulation of density functional calculation," by Sohrab Ismail-Beigi and T.A. Arias, Computer Physics Communications 128:1-2, 1-45 (June 2000). and, if using the wavelet basis, further reference "Multiresolution analysis of electronic structure: semicardinal and wavelet bases," T.A. Arias, Reviews of Modern Physics 71:1, 267-311 (January 1999). and "Robust ab initio calculation of condensed matter: transparent convergence through semicardinal multiresolution analysis,'' I.P. Daykov, T.A. Arias, and Torkel D. Engeness, Physical Review Letters, 90:21, 216402 (May 2003). For your convenience, preprints of the above articles may be obtained from http://arXiv.org/abs/cond-mat/9909130, 9805262, and 0204411, respectively. */ /* * Tairan Wang April 7, 1999 * * Output.c -- define the operation of member functions of Output class * */ #include "header.h" // // This defines a class that does output to a file based on a report level. // This can be used mainly for logging and printing misc. text data // to files. // // One creates such an object with a report_level and filename. The // object then opens the file and sets the report level. The default // values for these are file=stdout and report_level=DFT_BASIC_LOG. // // The file is opened in append mode. // // If the filename=="" then stdout is opened. // // The printf(...) member will send data to the file if the report_level is // above DFT_SILENCE. // // The printf(level,...) member function prints when // level <= Output::report_level. // /* Constructor/Destructor */ Output::Output() { fp = stdout; report_level = DFT_BASIC_LOG; strcpy(filename, "stdout"); } Output::Output(int level) { report_level = level; fp = stdout; strcpy(filename, "stdout"); } Output::Output(char *fname) { report_level = DFT_BASIC_LOG; // if given a null name if (strcmp(fname,"") == 0){ fp = stdout; strcpy(filename, "stdout"); } else{ fp = dft_fopen(fname,"a"); strcpy(filename, fname); } } Output::Output(char *fname, char *mode) { report_level = DFT_BASIC_LOG; // if given a null name if (strcmp(fname,"") == 0){ fp = stdout; strcpy(filename, "stdout"); } else{ fp = dft_fopen(fname,mode); strcpy(filename, fname); } } Output::Output(int level,char *fname) { report_level = level; // if given a null name if (strcmp(fname,"") == 0){ fp = stdout; strcpy(filename, "stdout"); } else{ fp = dft_fopen(fname,"a"); strcpy(filename, fname); } } Output::Output(int level,char *fname,char *mode) { report_level = level; // if given a null name if (strcmp(fname,"") == 0){ fp = stdout; strcpy(filename, "stdout"); } else{ fp = dft_fopen(fname,mode); strcpy(filename, fname); } } Output::~Output() { if (fp != stdout) dft_fclose(fp); } // Flush the file int Output::flush() { if (report_level > DFT_SILENCE) return dft_fflush(fp); else return 0; } /* * A customized fprintf, * such that it only prints if report is no smaller than DFT_REPORT_LEVEL */ int Output::printf(const char *format, ...) const { // exit if report level not hight enough if (report_level <= DFT_SILENCE) return 0; /* Variable argument list pointer */ va_list ap; /* Initialize variable argument list to proper point in the stack */ va_start(ap, format); return dft_vfprintf(fp, (char *)format, ap); } int Output::printf(int level, const char *format, ...) const { if (level > report_level) return 0; /* Variable argument list pointer */ va_list ap; /* Initialize variable argument list to proper point in the stack */ va_start(ap, format); return dft_vfprintf(fp, (char *)format, ap); } int Output::vprintf(int level, const char *format, va_list ap) const { if (level > report_level) return 0; return dft_vfprintf(fp, (char *)format, ap); }