aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorallen <allen@b589c3ab-70e8-4b4d-a09f-cba2dd200880>1999-09-21 11:27:32 +0000
committerallen <allen@b589c3ab-70e8-4b4d-a09f-cba2dd200880>1999-09-21 11:27:32 +0000
commit1940d71782b4cc3519972ebf4504bbe4486cf7d0 (patch)
treebc11dc4e95891c19d3e88c0b15bb4ebf068d1d45
parentac667e93729515249ec4d81961d1c83e2a0e217d (diff)
This commit was generated by cvs2svn to compensate for changes in r2, which
included commits to RCS files with non-trunk default branches. git-svn-id: http://svn.cactuscode.org/arrangements/CactusBase/IOBasic/trunk@3 b589c3ab-70e8-4b4d-a09f-cba2dd200880
-rw-r--r--COPYRIGHT377
-rw-r--r--README23
-rw-r--r--interface.ccl6
-rw-r--r--param.ccl84
-rw-r--r--schedule.ccl10
-rw-r--r--src/GHExtension.c101
-rw-r--r--src/Output.c238
-rw-r--r--src/OutputInfo.c226
-rw-r--r--src/Startup.c80
-rw-r--r--src/Write.c88
-rw-r--r--src/WriteGF.c121
-rw-r--r--src/WriteInfo.c48
-rw-r--r--src/iobasicGH.h42
-rw-r--r--src/make.code.defn15
14 files changed, 1459 insertions, 0 deletions
diff --git a/COPYRIGHT b/COPYRIGHT
new file mode 100644
index 0000000..45b8425
--- /dev/null
+++ b/COPYRIGHT
@@ -0,0 +1,377 @@
+ ********************************
+ Welcome to the Cactus Code
+ Version 4.0
+ ********************************
+
+All Cactus source code is (c) Copyright by the Authors listed in the
+respective README and source files that you will find scattered thru
+the directory structure of all the thorns. This is a truly
+collaborative development project that benefits from input of many
+people worldwide and we try our best to give credit to every
+contribution. The cactus code web page at
+ http://www.cactuscode.org
+contains an extensive list of authors to all the thorns that are
+part of the Cactus Code project.
+
+The flesh of the Cactus Code and the design of the project is (c)
+Copyright 1997-99 by Gabrielle Allen, Tom Goodale, Joan Masso and Paul
+Walker from the Numerical Relativity group of the Max-Planck-Institut
+fuer Gravitationphysik / Albert Einstein Institute
+(http://www.aei-potsdam.mpg.de).
+
+The Cactus Code is distributed under the GNU general public license
+version 2 which is available below. All thorns distributed with Cactus
+follow this license unless it is explicitly stated otherwise in the
+corresponding README files.
+
+Please, take a look at the documentation in the main doc directory or
+check the cactus web page for instructions on how to run the code,
+report bugs, give feedback, etc.
+
+Thanks for using cactus. We hope you find it useful. Love it or hate
+it, please let us know what you think.
+- The Cactus Team <cactus@cactuscode.org>
+
+**************************************************************************
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ Appendix: How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program 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.
+
+ This program 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 this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
+
diff --git a/README b/README
new file mode 100644
index 0000000..3ec9d6d
--- /dev/null
+++ b/README
@@ -0,0 +1,23 @@
+Cactus Code Thorn IOScalar
+Authors : Gabrielle Allen
+CVS info : $Header$
+--------------------------------------------------------------------------
+
+1. Purpose of the thorn
+
+This thorn outputs grid variables as scalars as a function on time
+
+Scalars:
+Output straight forwardly
+
+Grid functions:
+Output the minimum, maximum, L1, and L2 norm versus time.
+
+Ouput files can be processed with either gnuplot or xgraph.
+
+The IO method "IOScalar" is registered which can be called
+by other thorns via CCTK_OutputVarAsByMethod() to output a
+variable without specifying it in the parameter file.
+
+
+2. Additional information
diff --git a/interface.ccl b/interface.ccl
new file mode 100644
index 0000000..4359316
--- /dev/null
+++ b/interface.ccl
@@ -0,0 +1,6 @@
+# Interface definition for thorn IOBasic
+# $Header$
+
+implements: IOBasic
+inherits: IO
+
diff --git a/param.ccl b/param.ccl
new file mode 100644
index 0000000..9610395
--- /dev/null
+++ b/param.ccl
@@ -0,0 +1,84 @@
+# Parameter definitions for thorn IOBasic
+# $Header$
+
+
+#############################################################################
+### declare IOBasic parameters
+#############################################################################
+private:
+
+##########################
+# Directory to output to (overriden by outdir)
+##########################
+
+STRING outdirScalar "Name of IO Scalar output directory, overrides outdir"
+{
+ .* :: A regex which matches everything
+} "outdir"
+
+##########################
+# What variables to output
+##########################
+STRING outInfo_vars "Variables to output as Info to screen"
+{
+ .* :: A regex which matches everything
+} ""
+STRING outScalar_vars "Variables to output as Info to screen"
+{
+ .* :: A regex which matches everything
+} ""
+
+
+########################
+# How often to do output
+########################
+INT outInfo_every "How often to do Info output"
+{
+ -1:* ::
+} -1
+INT outScalar_every "How often to do Info output"
+{
+ -1:* ::
+} -1
+
+
+#################
+# 1D output style
+#################
+KEYWORD outScalar_style "Which style for Scalar output"
+{
+ "gnuplot" :: "1D output readable by gnuplot"
+ "xgraph" :: "1D output readable by xgraph"
+} "xgraph"
+
+
+#############################################################################
+### import IOUtil parameters
+#############################################################################
+shares: IO
+
+####################
+# Output directories
+####################
+USES STRING outdir "Name of IO output directory"
+{
+} "."
+
+
+########################
+# How often to do output
+########################
+USES INT out_every "How often to do IO output"
+{
+ -1: ::
+}
+
+
+################
+# various things
+################
+USES BOOLEAN verbose ""
+{
+} ""
+
+
diff --git a/schedule.ccl b/schedule.ccl
new file mode 100644
index 0000000..3f6537b
--- /dev/null
+++ b/schedule.ccl
@@ -0,0 +1,10 @@
+# Schedule definitions for thorn IOBasic
+# $Header$
+
+########################################################################
+### register IOBasic routines
+########################################################################
+schedule IOBasic_Startup at STARTUP
+{
+ LANG:C
+} "Startup routine"
diff --git a/src/GHExtension.c b/src/GHExtension.c
new file mode 100644
index 0000000..9e754e1
--- /dev/null
+++ b/src/GHExtension.c
@@ -0,0 +1,101 @@
+ /*@@
+ @file GHExtension.c
+ @date Friday 18th September
+ @author Gabrielle Allen
+ @desc
+ IO GH extension stuff.
+ @enddesc
+ @@*/
+
+/* #define DEBUG_IO */
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "config.h"
+#include "cctk_Flesh.h"
+#include "cctk_Comm.h"
+#include "cctk_Groups.h"
+#include "cctk_Misc.h"
+#include "cctk_GHExtensions.h"
+#include "cctk_parameters.h"
+#include "CactusBase/IOUtil/src/ioGH.h"
+#include "iobasicGH.h"
+
+
+void *IOBasic_SetupGH (tFleshConfig *config, int convergence_level, cGH *GH)
+{
+ int i;
+ iobasicGH *newGH;
+
+ newGH = (iobasicGH *) malloc (sizeof (iobasicGH));
+ newGH->infovals = (CCTK_REAL **) malloc (CCTK_NumVars () * sizeof (CCTK_REAL *));
+ for (i=0;i<CCTK_NumVars ();i++)
+ newGH->infovals[i] = (CCTK_REAL *) malloc (2 * sizeof (CCTK_REAL));
+
+ newGH->Scalarnum = (int *) malloc (CCTK_NumVars () * sizeof (int));
+ newGH->Scalarlast = (int *) malloc (CCTK_NumVars () * sizeof (int));
+
+ newGH->infonum = (int *) malloc (CCTK_NumVars () * sizeof (int));
+ newGH->infolast = (int *) malloc (CCTK_NumVars () * sizeof (int));
+
+ return newGH;
+}
+
+int IOBasic_InitGH (cGH *GH)
+{
+ DECLARE_CCTK_PARAMETERS
+ int i;
+ iobasicGH *myGH;
+
+ /* get the handles for IOBasic extensions */
+ myGH = (iobasicGH *) GH->extensions [CCTK_GHExtensionHandle ("IOBasic")];
+ myGH->filenameListScalar = NULL;
+
+ /* How often to output */
+ myGH->infoevery = out_every;
+ if (outInfo_every > 0)
+ myGH->infoevery = outInfo_every;
+
+ myGH->Scalarevery = out_every;
+ if (outScalar_every > 0)
+ myGH->Scalarevery = outScalar_every;
+
+ InitIONum(myGH->infonum,outInfo_vars);
+ InitIONum(myGH->Scalarnum,outScalar_vars);
+
+ /* Deal with the output directories */
+ myGH->outpfx_Scalar = outdir;
+ if (!CCTK_Equals(outdirScalar,"outdir"))
+ myGH->outpfx_Scalar = outdirScalar;
+
+ /* Create the output directories */
+ if (myGH->Scalarevery > 0) {
+ if (CCTK_MyProc (GH) == 0) {
+ CCTK_mkdir(myGH->outpfx_Scalar);
+ }
+ }
+
+ for (i=0; i<CCTK_NumVars(); i++)
+ myGH->Scalarlast[i] = -1;
+ for (i=0; i<CCTK_NumVars(); i++)
+ myGH->infolast [i] = -1;
+
+ for (i=0; i<CCTK_NumVars(); i++)
+ {
+ myGH->infovals[i][0] = 0.0;
+ myGH->infovals[i][1] = 0.0;
+ }
+
+ myGH->filenameListScalar = NULL;
+
+ return 0;
+}
+
+int IOBasic_rfrTraverseGH(cGH *GH, int rfrpoint)
+{
+ return 0;
+}
+
+
diff --git a/src/Output.c b/src/Output.c
new file mode 100644
index 0000000..dd757e7
--- /dev/null
+++ b/src/Output.c
@@ -0,0 +1,238 @@
+ /*@@
+ @file Output.c
+ @date Mon 21 September
+ @author Gabrielle Allen
+ @desc
+ Functions to deal with scalar output of grid variables
+ @enddesc
+ @@*/
+
+/*#define IO_DEBUG*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "cctk_Flesh.h"
+#include "cctk_Groups.h"
+#include "cctk_Comm.h"
+#include "cctk_GHExtensions.h"
+#include "cctk_WarnLevel.h"
+#include "cctk_Misc.h"
+#include "cctk_parameters.h"
+#include "CactusBase/IOUtil/src/ioGH.h"
+#include "iobasicGH.h"
+
+
+int IOBasic_OutputGH (cGH *GH)
+{
+ DECLARE_CCTK_PARAMETERS
+ int i;
+ int grouptype;
+ char *name=NULL;
+ iobasicGH *myGH;
+
+ /* Get the GH extensions for IOBasic */
+ myGH = (iobasicGH *) GH->extensions [CCTK_GHExtensionHandle ("IOBasic")];
+
+ /* Return if no output is required */
+ if (myGH->Scalarevery < 0)
+ return 0;
+
+ /* Loop over all variables */
+ for (i = 0; i < CCTK_NumVars (); i++) {
+
+ grouptype = CCTK_GroupTypeFromVarI (i);
+
+ /* Check this GF should be output */
+ if ((grouptype == GROUP_GF||grouptype == GROUP_SCALAR)
+ && myGH->Scalarnum [i] != 0
+ && (GH->cctk_iteration % myGH->Scalarevery == 0)) {
+
+ /* Check GF not already output this iteration */
+ if (myGH->Scalarlast [i] == GH->cctk_iteration) {
+ char *msg, *varname;
+
+ varname = CCTK_VarName (i);
+ msg = (char *) malloc (200 * sizeof (char) + strlen (varname));
+ sprintf (msg, "Already done Scalar output for '%s' on this timestep",
+ varname);
+ CCTK_WARN (2, msg);
+ free (msg);
+ }
+ /* Check GF has storage */
+ else if (grouptype == GROUP_GF &&
+ ! CCTK_QueryGroupStorageI (GH, CCTK_GroupIndexFromVarI (i)))
+ {
+ char *msg, *varname;
+
+ varname = CCTK_VarName(i);
+ msg = (char *) malloc (200 * sizeof (char) + strlen (varname));
+ sprintf (msg, "No 0D output in IOBasic_OutputGH for '%s' "
+ "(no storage)", varname);
+ CCTK_WARN (2, msg);
+ free (msg);
+ }
+ else
+ {
+
+ /* Get the variable name for this index (for filename) */
+ name = CCTK_VarName(i);
+
+#ifdef IO_DEBUG
+ printf("\nIn IOBasic_OutputGH\n----------------\n");
+ printf(" Index = %d\n",i);
+ printf(" Variable = -%s-\n",name);
+ printf(" Last output iteration was = %d\n",myGH->Scalarlast[i]);
+ printf(" Output iteration number = %d\n",myGH->Scalarnum[i]);
+#endif
+
+ /* Make the IO call */
+ if (grouptype == GROUP_SCALAR)
+ {
+ IOBasic_Write (GH, i, name);
+ }
+ else
+ {
+ IOBasic_WriteGF (GH, i, name);
+ }
+
+ /* Register another 0D output for this GF */
+ myGH->Scalarnum [i]++;
+
+ /* Register GF as having 0D output this iteration */
+ myGH->Scalarlast [i] = GH->cctk_iteration;
+ }
+ }
+ }
+
+ return 0;
+}
+
+
+int IOBasic_OutputVarAs (cGH *GH, const char *fullname, const char *alias)
+{
+ int index;
+ int grouptype;
+ index = CCTK_VarIndex (fullname);
+
+#ifdef IO_DEBUG
+ printf("\nIn IOBasic_OutputVarAs\n-------------------\n");
+ printf(" Fullname = -%s-\n",fullname);
+ printf(" Alias = -%s-\n",alias);
+ printf(" Index = %d\n",index);
+#endif
+
+ grouptype = CCTK_GroupTypeFromVarI (index);
+
+ if (grouptype == GROUP_SCALAR)
+ {
+ IOBasic_Write (GH, index, alias);
+ }
+ else
+ {
+ IOBasic_WriteGF (GH, index, alias);
+ }
+
+ return 0;
+}
+
+
+ /*@@
+ @routine IOBasic_TimeForOutput
+ @date Sat March 6 1999
+ @author Gabrielle Allen
+ @desc
+ Decides if it is time to output a variable using Scalar output
+ method
+ @enddesc
+ @calls CCTK_GHExtensionHandle
+ CCTK_GroupTypeFromVar
+ CCTK_WARN
+ CCTK_QueryGroupStorage
+ CCTK_GroupFromVar
+ @calledby
+ @history
+
+ @endhistory
+ @var GH
+ @vdesc Pointer to CCTK GH
+ @vtype cGH
+ @vio in
+ @vcomment
+ @endvar
+ @var var
+ @vdesc index of variable
+ @vtype int
+ @vio in
+ @vcomment
+ @endvar
+@@*/
+
+int IOBasic_TimeForOutput (cGH *GH, int var)
+{
+ int return_type;
+ int grouptype;
+ iobasicGH *myGH;
+
+ /* Default is do not do output */
+ return_type = 0;
+
+ /* Get the GH extension for IOBasic */
+ myGH = (iobasicGH *) GH->extensions [CCTK_GHExtensionHandle ("IOBasic")];
+
+ grouptype = CCTK_GroupTypeFromVarI (var);
+
+ /* Check this GF should be output */
+ if ((grouptype == GROUP_GF || grouptype == GROUP_SCALAR)
+ && myGH->Scalarnum [var] != 0
+ && (GH->cctk_iteration % myGH->Scalarevery == 0)) {
+
+ /* Check GF not already output this iteration */
+ if (myGH->Scalarlast [var] == GH->cctk_iteration)
+ CCTK_WARN (2, "Already done Scalar output in IO");
+ else
+ return_type = 1;
+ }
+
+ return return_type;
+}
+
+int IOBasic_TriggerOutput (cGH *GH, int variable)
+{
+ char *var;
+ int grouptype;
+ iobasicGH *myGH;
+
+ /* Get the GH extension for IOBasic */
+ myGH = (iobasicGH *) GH->extensions [CCTK_GHExtensionHandle ("IOBasic")];
+
+ var = CCTK_VarName (variable);
+
+#ifdef IO_DEBUG
+ printf("\nIn IOBasic_TriggerOutput\n---------------------\n");
+ printf(" Index = %d\n",variable);
+ printf(" Variable = -%s-\n",var);
+#endif
+
+ /* Do the Scalar output */
+
+ grouptype = CCTK_GroupTypeFromVarI (variable);
+
+ if (grouptype == GROUP_SCALAR)
+ {
+ IOBasic_Write (GH, variable, var);
+ }
+ else
+ {
+ IOBasic_WriteGF (GH, variable, var);
+ }
+
+ /* Register another Scalar output for this GF */
+ myGH->Scalarnum [variable]++;
+
+ /* Register variable as having Scalar output this iteration */
+ myGH->Scalarlast [variable] = GH->cctk_iteration;
+
+ return 0;
+}
diff --git a/src/OutputInfo.c b/src/OutputInfo.c
new file mode 100644
index 0000000..220104f
--- /dev/null
+++ b/src/OutputInfo.c
@@ -0,0 +1,226 @@
+ /*@@
+ @file OutputInfo.c
+ @date June 31 1999
+ @author Gabrielle Allen
+ @desc
+ Functions to deal with Info output of Variables
+ @enddesc
+ @@*/
+
+/*#define IO_DEBUG*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "cctk_Flesh.h"
+#include "cctk_Groups.h"
+#include "cctk_Comm.h"
+#include "cctk_GHExtensions.h"
+#include "cctk_WarnLevel.h"
+#include "cctk_Misc.h"
+#include "cctk_parameters.h"
+#include "iobasicGH.h"
+
+CCTK_REAL IOBasic_WriteInfo (cGH *GH, int index, const char *operator, const char *alias);
+
+static int first = 1;
+
+int IOBasic_OutputInfoGH (cGH *GH)
+{
+ DECLARE_CCTK_PARAMETERS
+ int i;
+ int grouptype;
+ char *name=NULL;
+ iobasicGH *myGH;
+
+ /* Get the GH extensions for IOBasic */
+ myGH = (iobasicGH *) GH->extensions [CCTK_GHExtensionHandle ("IOBasic")];
+
+ /* Return if no output is required (should use do_1dio parameter) */
+ if (myGH->infoevery < 1 ||
+ GH->cctk_iteration % myGH->infoevery != 0)
+ return 0;
+
+ /* Print a header the first time through */
+ if (first == 1)
+ {
+ char l1[1024],l2[1024],l3[1024];
+
+ sprintf (l1," it | |");
+ sprintf (l2," | t |");
+ sprintf (l3,"--------------");
+
+ for (i = 0; i < CCTK_NumVars (); i++)
+ {
+ char ll[80];
+ if(myGH->infonum[i] != 0)
+ {
+ sprintf (ll," ");
+ ll[25-strlen(CCTK_VarName(i))] = '\0';
+ sprintf (l1,"%s %s%s |",l1,CCTK_VarName(i),ll);
+ sprintf (l2,"%s Min Max |",l2);
+ sprintf (l3,"%s----------------------------",l3);
+ }
+ }
+ printf ("%s\n%s\n%s\n%s\n",l3,l1,l2,l3);
+ fflush(stdout);
+ first = 0;
+ }
+
+ /* Print the timestep information for all variables */
+ printf("%4d |%7.3f|",GH->cctk_iteration,GH->cctk_time);
+
+
+ /* Loop over all variables */
+ for (i = 0; i < CCTK_NumVars (); i++) {
+
+ grouptype = CCTK_GroupTypeFromVarI (i);
+
+ /* Check this Variable should be output */
+ if (myGH->infonum [i] != 0) {
+
+ /* Check variable not already output this iteration */
+ if (myGH->infolast [i] == GH->cctk_iteration) {
+
+ printf("%12.8f |%12.8f |",myGH->infovals[i][0],myGH->infovals[i][1]);
+
+ }
+ /* Check GF has storage */
+ else if (grouptype == GROUP_GF && ! CCTK_QueryGroupStorageI (GH,
+ CCTK_GroupIndexFromVarI (i))){
+ char *msg, *varname;
+
+ varname = CCTK_VarName(i);
+ msg = (char *) malloc (200 * sizeof (char) + strlen (varname));
+ sprintf (msg, "No info output in IOBasic_OutputInfoGH for '%s' "
+ "(no storage)", varname);
+ CCTK_WARN (2, msg);
+ free (msg);
+ } else {
+
+ /* Get the variable name for this index (for filename) */
+ name = CCTK_VarName(i);
+
+#ifdef IO_DEBUG
+ printf("\nIn IO OutputInfoGH\n----------------\n");
+ printf(" Index = %d\n",i);
+ printf(" Variable = -%s-\n",name);
+ printf(" Last output iteration was = %d\n",myGH->infolast[i]);
+ printf(" Output iteration number = %d\n",myGH->infonum[i]);
+#endif
+
+ /* Make the IO call */
+ myGH->infovals[i][0]=IOBasic_WriteInfo (GH, i, "minimum", name);
+ myGH->infovals[i][1]=IOBasic_WriteInfo (GH, i, "maximum", name);
+
+ printf("%12.8f |%12.8f |",myGH->infovals[i][0],myGH->infovals[i][1]);
+
+ /* Register another info output for this variable */
+ myGH->infonum [i]++;
+
+ /* Register GF as having info output this iteration */
+ myGH->infolast [i] = GH->cctk_iteration;
+ }
+ }
+ }
+
+ /* Add the new line */
+ if (CCTK_MyProc(GH) == 0)
+ printf("\n");
+
+ return 0;
+}
+
+
+ /*@@
+ @routine IOBasic_TimeForInfo
+ @date June 31 1999
+ @author Gabrielle Allen
+ @desc
+ Decides if it is time to output a variable using info output
+ method
+ @enddesc
+ @calls CCTK_GHExtensionHandle
+ CCTK_GroupTypeFromVarI
+ CCTK_WARN
+ CCTK_QueryGroupStorageI
+ CCTK_GroupFromVar
+ @calledby
+ @history
+
+ @endhistory
+ @var GH
+ @vdesc Pointer to CCTK GH
+ @vtype cGH
+ @vio in
+ @vcomment
+ @endvar
+ @var var
+ @vdesc index of variable
+ @vtype int
+ @vio in
+ @vcomment
+ @endvar
+@@*/
+
+int IOBasic_TimeForInfo (cGH *GH, int var)
+{
+ int return_type;
+ int grouptype;
+ iobasicGH *myGH;
+
+ /* Default is do not do output */
+ return_type = 0;
+
+ /* Get the GH extensions for IOBasic */
+ myGH = (iobasicGH *) GH->extensions [CCTK_GHExtensionHandle ("IOBasic")];
+
+ grouptype = CCTK_GroupTypeFromVarI (var);
+
+ /* Check this GF should be output */
+ if (myGH->infonum [var] != 0
+ && (GH->cctk_iteration % myGH->infoevery == 0)) {
+
+ /* Check GF not already output this iteration */
+ if (myGH->infolast [var] == GH->cctk_iteration)
+ CCTK_WARN (2, "Already done info output in IO");
+ else
+ return_type = 1;
+ }
+
+ return return_type;
+}
+
+int IOBasic_TriggerOutputInfo (cGH *GH, int variable)
+{
+ char *var;
+ iobasicGH *myGH;
+
+
+ /* Get the GH extension for IOBasic */
+ myGH = (iobasicGH *) GH->extensions [CCTK_GHExtensionHandle ("IOBasic")];
+
+ var = CCTK_VarName (variable);
+
+ /* Do the Info output */
+#ifdef IO_DEBUG
+ printf("\nIn IO TriggerOutputInfo\n---------------------\n");
+ printf(" Index = %d\n",variable);
+ printf(" Variable = -%s-\n",var);
+#endif
+
+ myGH->infovals[variable][0]=IOBasic_WriteInfo (GH, variable, "minimum",var);
+ myGH->infovals[variable][1]=IOBasic_WriteInfo (GH, variable, "maximum",var);
+
+ /* Register another Info output for this GF */
+ myGH->infonum [variable]++;
+
+ /* Register GF as having Info output this iteration */
+ myGH->infolast [variable] = GH->cctk_iteration;
+
+ return 0;
+}
+
+
+
diff --git a/src/Startup.c b/src/Startup.c
new file mode 100644
index 0000000..bf23e32
--- /dev/null
+++ b/src/Startup.c
@@ -0,0 +1,80 @@
+ /*@@
+ @file Startup.c
+ @date Friday 18th September 1999
+ @author Gabrielle Allen
+ @desc
+ Startup routines for IOBasic.
+ @enddesc
+ @@*/
+
+
+#include <stdio.h>
+#include <string.h>
+
+#include "cctk_Flesh.h"
+#include "cctk_GHExtensions.h"
+#include "cctk_IOMethods.h"
+#include "cctk_parameters.h"
+
+/* prototypes of functions to be registered */
+int IOBasic_OutputGH (cGH *GH);
+int IOBasic_TriggerOutput (cGH *GH, int);
+int IOBasic_TimeForOutput (cGH *GH, int);
+int IOBasic_OutputVarAs (cGH *GH, const char *var, const char *alias);
+void *IOBasic_SetupGH (tFleshConfig *config, int convergence_level, cGH *GH);
+int IOBasic_InitGH (cGH *GH);
+int IOBasic_rfrTraverseGH (cGH *GH, int rfrpoint);
+
+int IOBasic_OutputInfoGH (cGH *GH);
+int IOBasic_TriggerOutputInfo (cGH *GH, int);
+int IOBasic_TimeForInfo (cGH *GH, int);
+
+
+ /*@@
+ @routine IOBasic_Startup
+ @date Friday 18th September 1999
+ @author Gabrielle Allen
+ @desc
+ The startup registration routine for Basic IO.
+ Registers the GH extensions needed for IO and
+ the registerable routines used for each method of IO.
+ IO does not overload any functions.
+ @enddesc
+ @calls
+ @calledby
+ @history
+
+ @endhistory
+
+@@*/
+void IOBasic_Startup (void)
+{
+ DECLARE_CCTK_PARAMETERS
+ int IOMethod;
+ int IO_GHExtension;
+
+ IO_GHExtension = CCTK_RegisterGHExtension ("IOBasic");
+ CCTK_RegisterGHExtensionSetupGH (IO_GHExtension, IOBasic_SetupGH);
+ CCTK_RegisterGHExtensionInitGH (IO_GHExtension, IOBasic_InitGH);
+ CCTK_RegisterGHExtensionrfrTraverseGH (IO_GHExtension, IOBasic_rfrTraverseGH);
+
+ /* Register the IOBasic routines as output methods */
+ IOMethod = CCTK_RegisterIOMethod ("Scalar");
+ CCTK_RegisterIOMethodOutputGH (IOMethod, IOBasic_OutputGH);
+ CCTK_RegisterIOMethodOutputVarAs (IOMethod, IOBasic_OutputVarAs);
+ CCTK_RegisterIOMethodTimeToOutput (IOMethod, IOBasic_TimeForOutput);
+ CCTK_RegisterIOMethodTriggerOutput (IOMethod, IOBasic_TriggerOutput);
+
+ IOMethod = CCTK_RegisterIOMethod ("Info");
+ CCTK_RegisterIOMethodOutputGH (IOMethod, IOBasic_OutputInfoGH);
+ CCTK_RegisterIOMethodTimeToOutput (IOMethod, IOBasic_TimeForInfo);
+ CCTK_RegisterIOMethodTriggerOutput (IOMethod, IOBasic_TriggerOutputInfo);
+
+}
+
+
+
+
+
+
+
diff --git a/src/Write.c b/src/Write.c
new file mode 100644
index 0000000..d315610
--- /dev/null
+++ b/src/Write.c
@@ -0,0 +1,88 @@
+/*@@
+ @routine Write.c
+ @date 18th September 1999
+ @author Gabrielle Allen
+ @desc
+ Writes scalar grid variable data.
+ @enddesc
+ @calls
+ @calledby
+ @history
+ @hauthor @hdate
+ @hdesc
+ @hendhistory
+@@*/
+
+#include <stdio.h>
+
+#include "cctk.h"
+#include "cctk_parameters.h"
+#include "cctk_Flesh.h"
+#include "cctk_GHExtensions.h"
+#include "cctk_Comm.h"
+#include "cctk_Misc.h"
+#include "cctk_WarnLevel.h"
+#include "iobasicGH.h"
+
+void IOBasic_Write (cGH *GH, int index, const char *alias)
+{
+ DECLARE_CCTK_PARAMETERS
+ int reduce_handle;
+ char *openmode;
+ FILE *file;
+ CCTK_REAL *data_real;
+ CCTK_INT *data_int;
+
+ /* Open the file (we write only on proc0) */
+ if (CCTK_MyProc (GH) == 0)
+ {
+ char fname[256];
+ int handle;
+ iobasicGH *myGH;
+
+ myGH = (iobasicGH *) GH->extensions [CCTK_GHExtensionHandle ("IOBasic")];
+
+ /* see if output files for this alias name were already created */
+ if (GetNamedData (myGH->filenameListScalar, alias) == NULL) {
+ /* just store a non-NULL pointer in database */
+ StoreNamedData (&myGH->filenameListScalar, alias, (void *) 1);
+ openmode = "w";
+ } else
+ openmode = "a";
+
+ sprintf (fname, "%s/%s.tl", myGH->outpfx_Scalar, alias);
+ file = fopen(fname,openmode);
+
+ if (*openmode == 'w') {
+ char title_start_char;
+
+ if (CCTK_Equals(outScalar_style,"gnuplot"))
+ title_start_char = '#';
+ else {
+ if (! CCTK_Equals(outScalar_style,"xgraph"))
+ CCTK_WARN(3,"Don't understand outScalar_style ... using xgraph");
+ title_start_char = 34;
+ }
+
+ fprintf (file,"%c%s v time\n",title_start_char,alias);
+ }
+
+ switch (CCTK_VarTypeI(index)) {
+ case CCTK_VARIABLE_REAL:
+ data_real = ((CCTK_REAL ***) GH->data) [index][0];
+ fprintf(file,"%f %25.13f\n",GH->cctk_time,*data_real);
+ break;
+ case CCTK_VARIABLE_INT:
+ data_int = ((CCTK_INT ***) GH->data) [index][0];
+ fprintf(file,"%f %d\n",GH->cctk_time,*data_int);
+ break;
+ default:
+ CCTK_WARN (3, "Unsupported data type");
+ return;
+ }
+
+ fclose(file);
+
+ }
+}
+
diff --git a/src/WriteGF.c b/src/WriteGF.c
new file mode 100644
index 0000000..4580947
--- /dev/null
+++ b/src/WriteGF.c
@@ -0,0 +1,121 @@
+/*@@
+ @routine WriteGF
+ @date Tue Apr 1 16:45:35 1997
+ @author Paul Walker
+ @desc
+ Dumps the "0D" data.
+ @enddesc
+ @calls
+ @calledby
+ @history
+ @hauthor Thomas Radke @hdate 17 Mar 1999
+ @hdesc included "cctk_Comm.h" to overload CCTK_GetMyProc() properly
+ @hendhistory
+@@*/
+
+#include <stdio.h>
+
+#include "cctk.h"
+#include "cctk_Flesh.h"
+#include "cctk_parameters.h"
+#include "cctk_GHExtensions.h"
+#include "cctk_Misc.h"
+#include "cctk_Comm.h"
+#include "cctk_WarnLevel.h"
+#include "cctk_Reduction.h"
+#include "iobasicGH.h"
+
+void IOBasic_WriteGF (cGH *GH, int index, const char *alias)
+{
+ DECLARE_CCTK_PARAMETERS
+ CCTK_REAL tt[1];
+ int i;
+ int reduce_handle;
+ char *openmode;
+ FILE *file[4];
+
+ /* Open the file (we write only on proc0) */
+ if (CCTK_MyProc (GH) == 0) {
+
+ char fname[256];
+ int handle;
+ iobasicGH *myGH;
+
+ myGH = (iobasicGH *) GH->extensions [CCTK_GHExtensionHandle ("IOBasic")];
+
+ /* see if output files for this alias name were already created */
+ if (GetNamedData (myGH->filenameListScalar, alias) == NULL) {
+ /* just store a non-NULL pointer in database */
+ StoreNamedData (&myGH->filenameListScalar, alias, (void *) 1);
+ openmode = "w";
+ } else
+ openmode = "a";
+
+ sprintf (fname, "%s/%s_max.tl", myGH->outpfx_Scalar, alias);
+ file[0] = fopen(fname,openmode);
+
+ sprintf(fname,"%s/%s_min.tl", myGH->outpfx_Scalar, alias);
+ file[1] = fopen(fname,openmode);
+
+ sprintf(fname,"%s/%s_nm1.tl", myGH->outpfx_Scalar, alias);
+ file[2] = fopen(fname,openmode);
+
+ sprintf(fname,"%s/%s_nm2.tl", myGH->outpfx_Scalar, alias);
+ file[3] = fopen(fname,openmode);
+
+ if (*openmode == 'w') {
+ char title_start_char;
+
+ if (CCTK_Equals(outScalar_style,"gnuplot"))
+ title_start_char = '#';
+ else {
+ if (! CCTK_Equals(outScalar_style,"xgraph"))
+ CCTK_WARN(3,"Don't understand outScalar_style ... using xgraph");
+ title_start_char = 34;
+ }
+
+ fprintf (file[0],"%c%s max v time\n",title_start_char,alias);
+ fprintf (file[1],"%c%s min v time\n",title_start_char,alias);
+ fprintf (file[2],"%c%s norm1 v time\n",title_start_char,alias);
+ fprintf (file[3],"%c%s norm2 v time\n",title_start_char,alias);
+ }
+
+ }
+
+ reduce_handle = CCTK_ReductionHandle("maximum");
+ if (reduce_handle > -1)
+ {
+ CCTK_Reduce(GH,-1,reduce_handle,1,CCTK_VARIABLE_REAL,tt,1,index);
+ if (CCTK_MyProc(GH) == 0)
+ fprintf(file[0],"%f %25.13f\n",GH->cctk_time,tt[0]);
+ }
+
+ reduce_handle = CCTK_ReductionHandle("minimum");
+ if (reduce_handle > -1)
+ {
+ CCTK_Reduce(GH,-1,reduce_handle,1,CCTK_VARIABLE_REAL,tt,1,index);
+ if (CCTK_MyProc(GH) == 0)
+ fprintf(file[1],"%f %25.13f\n",GH->cctk_time,tt[0]);
+ }
+
+ reduce_handle = CCTK_ReductionHandle("norm1");
+ if (reduce_handle > -1)
+ {
+ CCTK_Reduce(GH,-1,reduce_handle,1,CCTK_VARIABLE_REAL,tt,1,index);
+ if (CCTK_MyProc(GH) == 0)
+ fprintf(file[2],"%f %25.13f\n",GH->cctk_time,tt[0]);
+ }
+
+ reduce_handle = CCTK_ReductionHandle("norm2");
+ if (reduce_handle > -1)
+ {
+ CCTK_Reduce(GH,-1,reduce_handle,1,CCTK_VARIABLE_REAL,tt,1,index);
+ if (CCTK_MyProc(GH) == 0)
+ fprintf(file[3],"%f %25.13f\n",GH->cctk_time,tt[0]);
+ }
+
+ if (CCTK_MyProc (GH) == 0)
+ for (i=0;i<4;i++)
+ fclose(file[i]);
+}
+
diff --git a/src/WriteInfo.c b/src/WriteInfo.c
new file mode 100644
index 0000000..c49d53f
--- /dev/null
+++ b/src/WriteInfo.c
@@ -0,0 +1,48 @@
+/*@@
+ @routine WriteInfo
+ @date June 31 1999
+ @author Gabrielle Allen, Paul Walker
+ @desc
+ Dumps the Info data.
+ @enddesc
+ @calls
+ @calledby
+ @history
+ @hauthor Thomas Radke @hdate 17 Mar 1999
+ @hdesc included "cctk_Comm.h" to overload CCTK_MyProc() properly
+ @hendhistory
+@@*/
+
+#include <stdio.h>
+
+#include "cctk.h"
+#include "cctk_Flesh.h"
+#include "cctk_parameters.h"
+#include "cctk_GHExtensions.h"
+#include "cctk_Misc.h"
+#include "cctk_Comm.h"
+#include "cctk_Reduction.h"
+#include "CactusBase/IOUtil/src/ioGH.h"
+
+CCTK_REAL IOBasic_WriteInfo (cGH *GH, int index, const char *operator, const char *alias)
+{
+ DECLARE_CCTK_PARAMETERS
+ CCTK_REAL tt[1];
+ int reduce_handle;
+ CCTK_REAL retval;
+
+ reduce_handle = CCTK_ReductionHandle(operator);
+ if (reduce_handle > -1)
+ {
+ CCTK_Reduce(GH,-1,reduce_handle,1,CCTK_VARIABLE_REAL,tt,1,index);
+ retval = tt[0];
+ }
+
+ return retval;
+
+}
+
+
+
+
+
diff --git a/src/iobasicGH.h b/src/iobasicGH.h
new file mode 100644
index 0000000..a61fdb4
--- /dev/null
+++ b/src/iobasicGH.h
@@ -0,0 +1,42 @@
+ /*@@
+ @header iobasic.h
+ @date Friday 18th September 1999
+ @author Gabrielle Allen
+ @desc
+ The extensions to the GH structure from IOBasic.
+ @enddesc
+ @version $Header$
+ @@*/
+
+#include "StoreNamedData.h"
+
+
+typedef struct IOBASICGH {
+
+ /* The number of times output */
+ int *infonum;
+ int *Scalarnum;
+
+ int Scalarevery;
+ int infoevery;
+
+ /* Directory in which to output */
+ char *outpfx_Scalar;
+
+ /* The last iteration output */
+ int *infolast;
+ int *Scalarlast;
+
+ /* The values for info */
+ CCTK_REAL **infovals;
+
+ pNamedData *filenameListScalar;
+
+} iobasicGH;
+
+
+/* function prototypes */
+void IOBasic_Write (cGH *GH, int index, const char *alias);
+void IOBasic_WriteGF (cGH *GH, int index, const char *alias);
+CCTK_REAL IOBasic_WriteInfo (cGH *GH, int index, const char *operator, const char *alias);
+
diff --git a/src/make.code.defn b/src/make.code.defn
new file mode 100644
index 0000000..bf9e62d
--- /dev/null
+++ b/src/make.code.defn
@@ -0,0 +1,15 @@
+# Main make.code.defn file for thorn IOBasic
+# $Header$
+
+# Source files in this directory
+SRCS = Startup.c \
+ GHExtension.c \
+ Output.c \
+ OutputInfo.c \
+ Write.c \
+ WriteGF.c \
+ WriteInfo.c
+
+# Subdirectories containing source files
+SUBDIRS =
+