/***********************************************************************
* 
*               *****   ***    ***
*                  *   *   *  *   *
*                 *     ***    ***
*                *     *   *  *   *
*               *****   ***    ***
*
* A FREE Finite Elements Analysis Program in ANSI C for the UNIX OS.
*
* Composed and edited and copyright by 
* Professor Dr.-Ing. Frank Rieg, University of Bayreuth, Germany
*
* eMail: 
* frank.rieg@uni-bayreuth.de
* dr.frank.rieg@t-online.de
* 
* V10.0  December 12, 2001
*
* Z88 should compile and run under any UNIX OS and Motif 2.0.
*
* 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, 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; see the file COPYING.  If not, write to
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
***********************************************************************/ 
/**********************************************************************
* Function g4i188 prueft die 4.Eingabegruppe fuer Z88I1.TXT & Z88NI.TXT
* 29.7.2002 Rieg
**********************************************************************/

/***********************************************************************
* Fuer UNIX
***********************************************************************/
#ifdef FR_UNIX
#include <z88v.h>
#include <stdio.h>   /* FILE,printf */
#include <string.h>  /* strcpy */
#include <math.h>    /* FR_FABS */
#endif

/***********************************************************************
* Functions
***********************************************************************/
void erif88(FR_INT4 izeile);

/***********************************************************************
* Start G4I188
***********************************************************************/
int g4i188(void)
{
extern FILE *fdatei;
        
extern FR_INT4AY jtyp;

extern FR_INT4 ne,neg,ibflag,ipflag,iwarn,izeile,LANG;

FR_DOUBLE emod,rnue,qpara,riyy,eyy,rizz,ezz,rit,wt;
       
FR_INT4 ivon,ibis,ibisalt,intord,i,j;

int ier;

char *cresult;
char cline[256],clina[256];
                
/**********************************************************************
* Checken der 4.Gruppe in Schleife
**********************************************************************/
ibisalt= 0;  /* nur wg. compiler warnings */

for(i = 1;i <= neg;i++)                          /* 40 */
  {
  izeile++;

  if(i > 1)
    ibisalt= ibis;
            
  cresult= fgets(cline,256,fdatei);
  if(!cresult)
    {
    erif88(izeile);
    return(2);
    }

/*----------------------------------------------------------------------
* Schreibfehler ?
*---------------------------------------------------------------------*/
  if(ibflag == 0)
    {
    ier= sscanf(cline,"%ld %ld %lg %lg %ld %lg",
    &ivon,&ibis,&emod,&rnue,&intord,&qpara);
    if(ier != 6) 
      {
      printf("%s\n",cline);
      if(LANG == 1)
        printf(
        "### Schreibfehler oder fehlende Daten in Zeile %ld entdeckt\n",
        izeile);
      if(LANG == 2)
        printf(
        "### typing error or missing entries in line %ld detected\n",
        izeile);
      return(2);
      }
    }

  if(ibflag == 1)
    {
    ier= sscanf(cline,"%ld %ld %lg %lg %ld %lg %lg %lg %lg %lg %lg %lg",
    &ivon,&ibis,&emod,&rnue,&intord,&qpara,&riyy,&eyy,&rizz,&ezz,&rit,&wt);
    if(ier != 12) 
      {
      printf("%s\n",cline);
      if(LANG == 1)
        printf(
        "### Schreibfehler oder fehlende Daten in Zeile %ld entdeckt\n",
        izeile);
      if(LANG == 2)
        printf(
        "### typing error or missing entries in line %ld detected\n",
        izeile);
      return(2);
      }
    }

  if(ipflag != 0)
    {
    ier= sscanf(cline,"%ld %ld %lg %lg %ld %lg %lg",
    &ivon,&ibis,&emod,&rnue,&intord,&qpara,&riyy);
    if(ier != 7) 
      {
      printf("%s\n",cline);
      if(LANG == 1)
        printf(
        "### Schreibfehler oder fehlende Daten in Zeile %ld entdeckt\n",
        izeile);
      if(LANG == 2)
        printf(
        "### typing error or missing entries in line %ld detected\n",
        izeile);
      return(2);
      }
    }

/*---------------------------------------------------------------------
* ivon ?
*--------------------------------------------------------------------*/
/*=====================================================================
* Sonderfall 1. E-Gesetz:
*====================================================================*/
  if(i == 1)
    {
    if(ivon != 1)
      {
      printf("%s\n",cline);
      if(LANG == 1)
        {
        printf("### Startwert im 1. E-Gesetz nicht 1\n");
        printf("### 1.Wert in Zeile %ld ueberpruefen\n",izeile);
        }
      if(LANG == 2)
        {
        printf("### start value in 1st mat line not 1\n");
        printf("### check 1st entry in line %ld\n",izeile);
        }
      return(2);
      }
    }
          
/*=====================================================================
* ivon groesser als ne ?
*====================================================================*/
  if(ivon > ne)
    {
    printf("%s\n",cline);
    if(LANG == 1)
      {
      printf(
      "### Anfangswert im %ld. E-Gesetz groesser als %ld = Anzahl Elemente\n",
      i,ne);
      printf("### 3.Wert in Zeile 1 ueberpruefen\n");
      printf("### 1.Wert in Zeile %ld ueberpruefen\n",izeile);
      }
    if(LANG == 2)
      {
      printf(
      "### start value in %ld. mat line greater %ld=number of elements\n",
      i,ne);
      printf("### check 3rd entry in line 1\n");
      printf("### check 1st entry in line %ld\n",izeile);
      }
    return(2);
    }

/*=====================================================================
* ivon groesser als ibis ?
*====================================================================*/
  if(ivon > ibis)
    {
    printf("%s\n",cline);
    if(LANG == 1)
      {
      printf("### Anfangswert im %ld. E-Gesetz groesser als Endwert\n",i);
      printf("### 1.Wert und 2.Wert in Zeile %ld ueberpruefen\n",izeile);
      }
    if(LANG == 2)
      {
      printf("### start value in %ld. mat line greater than end value\n",i);
      printf("### check 1st entry and 2nd entry in line %ld\n",izeile);
      }
    return(2);
    }

/*---------------------------------------------------------------------
* ibis ?
*--------------------------------------------------------------------*/
/*=====================================================================
* ibis groesser als ne ?
*====================================================================*/
  if(ibis > ne)
    {
    printf("%s\n",cline);
    if(LANG == 1)
      {
      printf(
      "### Endwert im %ld. E-Gesetz groesser als %ld = Anzahl Elemente\n",
      i,ne);
      printf("### 3.Wert in Zeile 1 ueberpruefen\n");
      printf("### 2.Wert in Zeile %ld ueberpruefen\n",izeile);
      }
    if(LANG == 2)
      {
      printf(
      "### end value in %ld. mat line greater %ld=number of elements\n",
      i,ne);
      printf("### check 3rd entry in line 1\n");
      printf("### check 2nd entry in line %ld\n",izeile);
      }
    return(2);
    }
          
/*=====================================================================
* i > 1: ivon nicht ibisalt +1 ?
*====================================================================*/
  if(i > 1)
    {
    if(ivon != ibisalt+1)
      {
      printf("%s\n",clina);
      printf("%s\n",cline);
      if(LANG == 1)
        {
        printf("### Endwert im %ld. E-Gesetz nicht\n",i-1);
        printf("### Anfangswert-1 im %ld. E-Gesetz\n",i);
        printf("### 2.Wert in Zeile %ld ueberpruefen\n",izeile-1);
        printf("### 1.Wert in Zeile %ld ueberpruefen\n",izeile);
        }
      if(LANG == 2)
        {
        printf("### end value in mat line %ld not equal\n",i-1);
        printf("### (start value-1) in mat line %ld\n",i);
        printf("### check 2nd entry in line %ld\n",izeile-1);
        printf("### check 1st entry in line %ld\n",izeile);
        }
      return(2);
      }
    }

/*=====================================================================
* Sonderfall letztes E-Gesetz:
*====================================================================*/
  if(i == neg)
    {
    if(ibis != ne)
      {
      printf("%s\n",cline);
      if(LANG == 1)
        {
        printf("### Endwert im letzten E-Gesetz nicht %ld\n",ne);
        printf("### 3.Wert in Zeile 1 ueberpruefen\n");
        printf("### 2.Wert in Zeile %ld ueberpruefen\n",izeile);
        }
      if(LANG == 2)
        {
        printf("### end value in last mat line not equal %ld\n",ne);
        printf("### check 3rd entry in line 1\n");
        printf("### check 2nd entry in line %ld\n",izeile);
        }
      return(2);
      }
    }

/*----------------------------------------------------------------------
* emod nicht zu klein ?
*---------------------------------------------------------------------*/
  if(FR_FABS(emod) < 1e-13)
    {
    printf("%s\n",cline);
    if(LANG == 1)
      {
      printf("### E-Modul fuer %ld. E-Gesetz nahe 0\n",i);
      printf("### 3.Wert in Zeile %ld ueberpruefen\n",izeile);
      }
    if(LANG == 2)
      {
      printf("### Young's Modulus for mat line %ld about 0\n",i);
      printf("### check 3rd entry in line %ld\n",izeile);
      }
    return(2);
    }
    
/*----------------------------------------------------------------------
* rnue nicht zu klein ?
*---------------------------------------------------------------------*/
  if(FR_FABS(rnue) < 1e-13)
    {
    printf("%s\n",cline);
    if(LANG == 1)
      {
      printf("### Querkontraktionszahl fuer %ld. E-Gesetz nahe 0\n",i);
      printf("### 4.Wert in Zeile %ld ueberpruefen\n",izeile);
      }
    if(LANG == 2)
      {
      printf("### Poisson's Ratio for mat line %ld about 0\n",i);
      printf("### check 4th entry in line %ld\n",izeile);
      }
    return(2);
    }

/*----------------------------------------------------------------------
* intord ?
*---------------------------------------------------------------------*/
if(!(intord == 0 || intord == 1 || intord == 2 || intord == 3 ||
     intord == 4 || intord == 5 || intord == 7 || intord == 13))
    {
    printf("%s\n",cline);
    if(LANG == 1)
      {
      printf("### Falsche Integrationsordnung im E-Gesetz %ld\n",i);
      printf("### Zulaessige Werte sind:\n");
      printf("### Element-Typen 2,3,4,5,6,9,13      : 0\n");
      printf("### Element-Typen 1,7,8,10,11,12,19,20: 1,2,3,4\n");
      printf("### Element-Typen 14,15,18            : 3,7,13\n");
      printf("### Element-Typen 16,17               : 1,4,5\n");
      printf("### 5.Wert in Zeile %ld ueberpruefen\n",izeile);
      }
    if(LANG == 2)
      {
      printf("### wrong integration value in mat line %ld\n",i);
      printf("### allowed values are the following:\n");
      printf("### element types 2,3,4,5,6,9,13      : 0\n");
      printf("### element types 1,7,8,10,11,12,19,20: 1,2,3,4\n");
      printf("### element types 14,15,18            : 3,7,13\n");
      printf("### element types 16,17               : 1,4,5\n");
      printf("### check 5th entry in line %ld\n",izeile);
      }
    return(2);
    }

/*---------------------------------------------------------------------
* qpara nicht zu klein ?
*--------------------------------------------------------------------*/ 
  for(j= ivon; j <= ibis; j++)
    {
    if(jtyp[j] == 3 || jtyp[j] == 4 || jtyp[j] == 5 ||
       jtyp[j] == 7 || jtyp[j] == 9 || jtyp[j] ==11 ||
       jtyp[j] ==14 || jtyp[j] ==18 || jtyp[j] ==19 ||
       jtyp[j] ==20)
      { 
      if(FR_FABS(qpara) < 1e-13)
        {
        printf("%s\n",cline);
        if(LANG == 1)
          {
          printf("? Querschnittsparameter sehr klein\n");
          printf("? Muss fuer Elementtypen 3,4,5,7,9,11,14,18,19,20\
 ungleich 0 sein\n");
          printf("? 6.Wert in Zeile %ld ueberpruefen\n",izeile);
          printf("? Vielleicht beabsichtigt .. kein Stop\n");
          }
        if(LANG == 2)
          {
          printf("? cross section value very small\n");
          printf("? must be greater than 0 for element types\
 3,4,5,7,9,11,14,18,19,20\n");
          printf("? check 6th entry in line %ld\n",izeile);
          printf("? possibly intended .. no halt\n");
          }
        iwarn++;
        }
      }
    }

/*---------------------------------------------------------------------
* Balkenparameter
*--------------------------------------------------------------------*/ 
/*====================================================================*
* rizz
*=====================================================================*/
  for(j= ivon; j <= ibis; j++)
    {
    if(jtyp[j] == 2 || jtyp[j] == 13)
      { 
      if(FR_FABS(rizz) < 1e-13)
        {
        printf("%s\n",cline);
        if(LANG == 1)
          {
          printf("? Biege- Traegheitsmoment ZZ sehr klein\n");
          printf("? Muss fuer Elementtypen 2 bzw. 13 ungleich 0 sein\n");
          printf("? 9.Wert in Zeile %ld ueberpruefen\n",izeile);
          printf("? Vielleicht beabsichtigt .. kein Stop\n");
          }
        if(LANG == 2)
          {
          printf("? second moment of area ZZ (bending) very small\n");
          printf("? must be greater than 0 for element types 2 and 13\n");
          printf("? check 9th entry in line %ld\n",izeile);
          printf("? possibly intended .. no halt\n");
          }
        iwarn++;
        }
      }
    }

/*====================================================================*
* ezz
*=====================================================================*/
  for(j= ivon; j <= ibis; j++)
    {
    if(jtyp[j] == 2 || jtyp[j] == 13)
      { 
      if(FR_FABS(ezz) < 1e-13)
        {
        printf("%s\n",cline);
        if(LANG == 1)
          {
        printf("? max.Randfaserabstand ZZ sehr klein\n");
        printf("? Muss fuer Elementtypen 2 bzw. 13 ungleich 0 sein\n");
        printf("? 10.Wert in Zeile %ld ueberpruefen\n",izeile);
        printf("? Vielleicht beabsichtigt .. kein Stop\n");
          }
        if(LANG == 2)
          {
          printf("? max. distance from neutral axis ZZ very small\n");
          printf("? must be greater than 0 for element types 2 and 13\n");
          printf("? check 10th entry in line %ld\n",izeile);
          printf("? possibly intended .. no halt\n");
          }
        iwarn++;
        }
      }
    }

/*====================================================================*
* riyy
*=====================================================================*/
  for(j= ivon; j <= ibis; j++)
    {
    if(jtyp[j] == 2)
      { 
      if(FR_FABS(riyy) < 1e-13)
        {
        printf("%s\n",cline);
        if(LANG == 1)
          {
          printf("? Biege- Traegheitsmoment YY sehr klein\n");
          printf("? Muss fuer Elementtypen 2 ungleich 0 sein\n");
          printf("? 7.Wert in Zeile %ld ueberpruefen\n",izeile);
          printf("? Vielleicht beabsichtigt .. kein Stop\n");
          }
        if(LANG == 2)
          {
          printf("? second moment of area YY (bending) very small\n");
          printf("? must be greater than 0 for element type 2\n");
          printf("? check 7th entry in line %ld\n",izeile);
          printf("? possibly intended .. no halt\n");
          }
        iwarn++;
        }
      }
    }

  for(j= ivon; j <= ibis; j++)
    {
    if(jtyp[j] == 18 || jtyp[j] == 19 || jtyp[j] == 20)
      { 
      if(FR_FABS(riyy) < 1e-13)
        {
        printf("%s\n",cline);
        if(LANG == 1)
          {
          printf("? Flaechenlast sehr klein\n");
          printf("? 7.Wert in Zeile %ld ueberpruefen\n",izeile);
          printf("? Vielleicht beabsichtigt .. kein Stop\n");
          }
        if(LANG == 2)
          {
          printf("? area load very small\n");
          printf("? check 7th entry in line %ld\n",izeile);
          printf("? possibly intended .. no halt\n");
          }
        iwarn++;
        }
      }
    }
/*====================================================================*
* eyy
*=====================================================================*/
  for(j= ivon; j <= ibis; j++)
    {
    if(jtyp[j] == 2)
      { 
      if(FR_FABS(eyy) < 1e-13)
        {
        printf("%s\n",cline);
        if(LANG == 1)
          {
        printf("? max.Randfaserabstand YY sehr klein\n");
        printf("? Muss fuer Elementtyp 2 ungleich 0 sein\n");
        printf("? 8.Wert in Zeile %ld ueberpruefen\n",izeile);
        printf("? Vielleicht beabsichtigt .. kein Stop\n");
          }
        if(LANG == 2)
          {
          printf("? max. distance from neutral axis YY very small\n");
          printf("? must be greater than 0 for element type 2\n");
          printf("? check 8th entry in line %ld\n",izeile);
          printf("? possibly intended .. no halt\n");
          }
        iwarn++;
        }
      }
    }

/*====================================================================*
* rit
*=====================================================================*/
  for(j= ivon; j <= ibis; j++)
    {
    if(jtyp[j] == 2)
      { 
      if(FR_FABS(rit) < 1e-13)
        {
        printf("%s\n",cline);
        if(LANG == 1)
          {
        printf("? Torsion-Traegheitsmoment sehr klein\n");
        printf("? Muss fuer Elementtyp 2 ungleich 0 sein\n");
        printf("? 11.Wert in Zeile %ld ueberpruefen\n",izeile);
        printf("? Vielleicht beabsichtigt .. kein Stop\n");
          }
        if(LANG == 2)
          {
          printf("? second moment of area (torsion) very small\n");
          printf("? must be greater than 0 for element type 2\n");
          printf("? check 11th entry in line %ld\n",izeile);
          printf("? possibly intended .. no halt\n");
          }
        iwarn++;
        }
      }
    }

/*====================================================================*
* wt
*=====================================================================*/
  for(j= ivon; j <= ibis; j++)
    {
    if(jtyp[j] == 2)
      { 
      if(FR_FABS(wt) < 1e-13)
        {
        printf("%s\n",cline);
        if(LANG == 1)
          {
          printf("? Torsion-Widerstandsmoment sehr klein\n");
          printf("? Muss fuer Elementtyp 2 ungleich 0 sein\n");
          printf("? 12.Wert in Zeile %ld ueberpruefen\n",izeile);
          printf("? Vielleicht beabsichtigt .. kein Stop\n");
          }
        if(LANG == 2)
          {
          printf("? section modulus (torsion) very small\n");
          printf("? must be greater than 0 for element type 2\n");
          printf("? check 12th entry in line %ld\n",izeile);
          printf("? possibly intended .. no halt\n");
          }
        iwarn++;
        }
      }
    }

  strcpy(clina,cline);
  }                                              /* e40 */


/***********************************************************************
* Ende grp4: keine Fehler
***********************************************************************/
return(0);
}
