/*
    This file is part of the FElt finite element analysis package.
    Copyright (C) 1993-2000 Jason I. Gobat and Darren C. Atkinson

    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.
*/

/************************************************************************
 * File:	graph.c							*
 *									*
 * Description:	This file contains the function definitions for 	*
 *		writing line graph data files				*
 ************************************************************************/

# include <stdio.h>

# include "fe.h"

# include "error.h"

# include "problem.h"

# include "allocate.h"


void WriteLineGraph (d, alt_title, xlabel, ylabel, output)
   Matrix	d;
   char		*alt_title;
   char		*xlabel;
   char		*ylabel;
   char		*output;
{
   static char *symbols [ ] = {"", "Tx", "Ty", "Tz", "Rx", "Ry", "Rz"};
   unsigned	i,j;
   unsigned	numcurves;
   unsigned	numpoints;
   FILE		*fp;

   fp = fopen(output, "w");
   if (fp == NULL)
      Fatal("temporary file error -> line graph");

   numcurves = analysis.numdofs * analysis.numnodes;
   numpoints = Mrows(d);

   if (problem.title == NULL || strcmp(problem.title, "") == 0)
      fprintf(fp, "%s\n", alt_title);
   else
      fprintf(fp, "%s\n", problem.title);

   fprintf(fp, "%s\n", xlabel);
   fprintf(fp, "%s\n", ylabel);
   fprintf(fp, "%d\n", numcurves);
   fprintf(fp, "%d\n", numpoints);
   for (i = 1 ; i <= analysis.numnodes ; i++) 
      for (j = 1 ; j <= analysis.numdofs ; j++) 
         fprintf (fp, "%s (%d)\n", symbols [(int) analysis.dofs [j]], analysis.nodes [i] -> number);

   for (j = 1 ; j <= numpoints ; j++) {
      fprintf (fp, "%g ", (j - 1)*analysis.step + analysis.start);

      for (i = 1 ; i <= numcurves ; i++) 
         fprintf (fp, "%g ", mdata(d, j, i));

      fprintf (fp, "\n");
   }

   fclose (fp);

   return;
}

void WriteLineGraphTransferFunctions (H, forced, numforced, output)
   Matrix	*H;
   unsigned	*forced;
   unsigned	numforced;
   char		*output;
{
   static char *symbols [ ] = {"", "Tx", "Ty", "Tz", "Rx", "Ry", "Rz"};
   unsigned	i,j,l;
   unsigned	nn;
   unsigned	numcurves;
   unsigned	numpoints;
   FILE		*fp;
   unsigned	inode, idof;

   fp = fopen(output, "w");
   if (fp == NULL)
      Fatal("temporary file error -> line graph transfer function");

   nn = analysis.numdofs * analysis.numnodes;
   numcurves = nn * numforced;
   numpoints = Mrows(H [1]);

   if (problem.title == NULL || strcmp(problem.title, "") == 0)
      fprintf(fp, "Spectral Transfer Functions\n");
   else
      fprintf(fp, "%s\n", problem.title);

   fprintf(fp, "frequency\n");
   fprintf(fp, "H\n");
   fprintf(fp, "%d\n", numcurves);
   fprintf(fp, "%d\n", numpoints);
   for (i = 1 ; i <= numforced ; i++) {
      LocalDOF (forced [i], &inode, &idof);
      for (j = 1 ; j <= nn ; j++) 
         fprintf (fp, "%s(%d)->%s(%d)\n",
                  symbols[idof], inode, 
                  symbols[(int) analysis.dofs[(j-1) % analysis.numdofs + 1]],
                  analysis.nodes [(j-1) % analysis.numnodes + 1] -> number);
   }

   for (j = 1 ; j <= numpoints ; j++) {
      fprintf (fp, "%g ", (j - 1)*analysis.step + analysis.start);

      for (i = 1 ; i <= numforced ; i++) 
         for (l = 1 ; l <= nn ; l++) 
            fprintf (fp, "%g ", mdata(H [i], j, l));

      fprintf (fp, "\n");
   }

   fclose (fp);

   return;
}


syntax highlighted by Code2HTML, v. 0.9.1