Cloned SEACAS for EXODUS library with extra build files for internal package management.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

338 lines
10 KiB

2 years ago
C Copyright(C) 1999-2022 National Technology & Engineering Solutions
C of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with
C NTESS, the U.S. Government retains certain rights in this software.
C
C See packages/seacas/LICENSE for details
C=======================================================================
PROGRAM TXTEXO
C=======================================================================
#if defined(__INTEL_COMPILER)
cDEC$ OPTIMIZE:0
#endif
C --*** TXTEXO *** (TXTEXO) TEXT to EXODUS translator
C --TXTEXO reads a text file and writes an EXODUS database file.
C --Expects the input text file on unit 20, the output database on unit 12.
include 'exodusII.inc'
INCLUDE 'argparse.inc'
CHARACTER*(MXSTLN) QAINFO(6)
CHARACTER*80 TITLE
CHARACTER*2048 FILNAM, SCRATCH
LOGICAL EXODUS
DIMENSION A(1)
INTEGER IA(1)
EQUIVALENCE (A(1), IA(1))
CHARACTER*1 C(1)
C --A - the dynamic memory base array
CHARACTER*32 STRA, STRB
CHARACTER*8 STR8
C Program Information
C.
QAINFO(1) = 'txtexo '
QAINFO(2) = '2021/01/28 '
QAINFO(3) = ' 2.02 '
QAINFO(4) = ' '
QAINFO(5) = ' '
QAINFO(6) = ' '
CALL STRTUP (QAINFO)
CALL BANNER (0, QAINFO,
& 'TEXT FILE TO EXODUSII DATABASE TRANSLATOR',
& ' ', ' ')
CALL PRTERR ('CMDSPEC',
$ 'Please use ncdump/ncgen instead of exotxt/txtexo.')
CALL MDINIT (A)
CALL MCINIT (C)
CALL MDSTAT (NERR, MEM)
IF (NERR .GT. 0) GOTO 130
C --Open the database and write the initial variables
NTXT = 20
NDB = 12
NARG = argument_count()
if (narg .lt. 2) then
CALL PRTERR ('FATAL', 'Filename not specified.')
CALL PRTERR ('CMDSPEC', 'Syntax is: "txtexo text_file db_file"')
CALL PRTERR ('CMDSPEC',
* 'Documentation: https://sandialabs.github.io' //
$ '/seacas-docs/sphinx/html/index.html#txtexo')
GOTO 140
else if (narg .gt. 2) then
CALL PRTERR ('FATAL', 'Too many arguments specified.')
CALL PRTERR ('CMDSPEC', 'Syntax is: "txtexo text_file db_file"')
CALL PRTERR ('CMDSPEC',
* 'Documentation: https://sandialabs.github.io' //
$ '/seacas-docs/sphinx/html/index.html#txtexo')
GOTO 140
end if
CALL get_argument(1,FILNAM, LFIL)
open(unit=ntxt, file=filnam(:lfil), status='old', iostat=ierr)
IF (IERR .NE. 0) THEN
SCRATCH = 'Text file "'//FILNAM(:LFIL)//'" does not exist.'
CALL PRTERR ('FATAL', SCRATCH(:LENSTR(SCRATCH)))
GOTO 140
END IF
EXODUS = .FALSE.
CALL get_argument(2,FILNAM, LFIL)
CMPSIZ = 0
IOWS = iowdsz()
ndb = excre(filnam(:lfil), EXCLOB, CMPSIZ, IOWS, IERR)
if (ierr .lt. 0) then
SCRATCH = 'Could not create "'//FILNAM(:LFIL)//'"'
CALL PRTERR ('FATAL', SCRATCH(:LENSTR(SCRATCH)))
call exopts (EXVRBS, ierr)
call exerr('txtexo', 'Error from excre', ierr)
go to 140
endif
C --Read the initial variables
CALL RDINIT (NTXT, VERS, TITLE, NDIM, NUMNP, NUMEL, NELBLK,
& NUMNPS, LNPSNL, LNPSDF, NUMESS, LESSEL, LESSNL, LESSDF,
* NAMLEN, *140)
call exmxnm(ndb, namlen, ierr)
call expini (ndb, title, ndim, numnp, numel, nelblk, numnps,
& numess, ierr)
CALL DBPINI ('TIS', NDB, TITLE, NDIM, NUMNP, NUMEL, NELBLK,
& NUMNPS, LNPSNL, NUMESS, LESSEL, LESSNL,
& IDUM, IDUM, IDUM, IDUM)
C --Read the coordinates
CALL MDRSRV ('XN', KXN, NUMNP)
IF (NDIM .GE. 2) CALL MDRSRV ('YN', KYN, NUMNP)
IF (NDIM .GE. 3) CALL MDRSRV ('ZN', KZN, NUMNP)
CALL MCRSRV ('NAMECO', KNACOR, NAMLEN*NDIM)
CALL MDSTAT (NERR, MEM)
IF (NERR .GT. 0) GOTO 130
CALL RWXYZ (NTXT, NDB, NDIM, NUMNP, A(KXN), A(KYN), A(KZN),
* C(KNACOR), NAMLEN, *140)
CALL MDDEL ('XN')
IF (NDIM .GE. 2) CALL MDDEL ('YN')
IF (NDIM .GE. 3) CALL MDDEL ('ZN')
CALL MCDEL ('NAMECO')
C --Read the element and node maps
CALL MDRSRV ('MAP', KMAP, MAX(NUMEL,NUMNP))
CALL MDSTAT (NERR, MEM)
IF (NERR .GT. 0) GOTO 130
C ... Node number map
CALL RDMAP (NTXT, NUMNP, IA(KMAP), *140)
call expnnm (ndb, ia(kmap), ierr)
C ... Element number map
CALL RDMAP (NTXT, NUMEL, IA(KMAP), *140)
call expenm (ndb, ia(kmap), ierr)
C ... Element order map
CALL RDMAP (NTXT, NUMEL, IA(KMAP), *140)
call expmap (ndb, ia(kmap), ierr)
CALL MDDEL ('MAP')
C --Read the element blocks
CALL MDRSRV ('NUMELB', KNELB, NELBLK)
CALL MDRSRV ('IDELB', KIDLB, NELBLK)
CALL MDRSRV ('LINK', KLINK, 0)
CALL MDRSRV ('ATRIB', KATRIB, 0)
call mcrsrv ('NAMELB', KNMLB, mxstln*nelblk)
CALL MDSTAT (NERR, MEM)
IF (NERR .GT. 0) GOTO 130
DO 100 IELB = 1, NELBLK
CALL RDELB (NTXT, IELB, ia(KIDLB+IELB-1), iA(KNELB+IELB-1),
& NUMLNK, NUMATR, c(knmlb), A, KLINK, KATRIB, *140)
CALL MDSTAT (NERR, MEM)
IF (NERR .GT. 0) GOTO 130
CALL DBOELB (NDB, IELB, IELB,
& IA(KIDLB+IELB-1), iA(KNELB+IELB-1), NUMLNK, NUMATR,
& iA(KLINK), c(knmlb), A(KATRIB))
CALL MDLONG ('LINK', KLINK, 0)
CALL MDLONG ('ATRIB', KATRIB, 0)
100 CONTINUE
CALL MDDEL ('LINK')
CALL MDDEL ('ATRIB')
call mcdel ('NAMELB')
NEL = INTADD (NELBLK, iA(KNELB))
IF (NEL .NE. NUMEL) THEN
CALL INTSTR (1, 0, NEL, STRA, LSTRA)
CALL INTSTR (1, 0, NUMEL, STRB, LSTRB)
CALL PRTERR ('WARNING',
& 'NUMBER OF ELEMENTS IN BLOCK = ' // STRA(:LSTRA)
& // ' does not match TOTAL = ' // STRB(:LSTRB))
END IF
C --Read the node sets
if (numnps .gt. 0) then
CALL MDRSRV ('IDNPS', KIDNS, NUMNPS)
CALL MDRSRV ('NNNPS', KNNNS, NUMNPS)
CALL MDRSRV ('NDNPS', KNDNPS, NUMNPS)
CALL MDRSRV ('IXNNPS', KIXNNS, NUMNPS)
CALL MDRSRV ('IXDNPS', KIXDNS, NUMNPS)
CALL MDRSRV ('LSTNPS', KLSTNS, LNPSNL)
CALL MDRSRV ('FACNPS', KFACNS, LNPSNL)
CALL MDSTAT (NERR, MEM)
IF (NERR .GT. 0) GOTO 130
CALL RDNPS (NTXT, NUMNPS, LNPSNL, LNPSDF,
& iA(KIDNS), iA(KNNNS), iA(KNDNPS), iA(KIXNNS), iA(KIXDNS),
& iA(KLSTNS), A(KFACNS), *140)
call expcns (ndb, ia(kidns), ia(knnns), ia(kndnps),
& ia(kixnns), ia(kixdns), ia(klstns), a(kfacns), ierr)
CALL MDDEL ('NNNPS')
CALL MDDEL ('NDNPS')
CALL MDDEL ('IXNNPS')
CALL MDDEL ('IXDNPS')
CALL MDDEL ('LSTNPS')
CALL MDDEL ('FACNPS')
end if
C --Read the side sets
if (numess .gt. 0) then
CALL MDRSRV ('IDESS', KIDSS, NUMESS)
CALL MDRSRV ('NEESS', KNESS, NUMESS)
CALL MDRSRV ('NNESS', KNNSS, NUMESS)
CALL MDRSRV ('NDESS', KNDSS, NUMESS)
CALL MDRSRV ('IXEESS', KIXESS, NUMESS)
CALL MDRSRV ('IXNESS', KIXNSS, NUMESS)
CALL MDRSRV ('IXDESS', KIXDSS, NUMESS)
CALL MDRSRV ('LTEESS', KLTESS, LESSEL)
CALL MDRSRV ('LTNESS', KLTNSS, LESSNL)
CALL MDRSRV ('LTSESS', KLTSSS, LESSEL)
CALL MDRSRV ('FACESS', KFACSS, LESSNL)
CALL MDSTAT (NERR, MEM)
IF (NERR .GT. 0) GOTO 130
CALL RDESS (NTXT, NUMESS, LESSEL, LESSNL, LESSDF,
& iA(KIDSS), iA(KNESS), ia(knnss), iA(KNDSS), iA(KIXESS),
* iA(KIXDSS), iA(KLTESS), iA(KLTSSS), A(KFACSS), *140)
call expcss (ndb, ia(kidss), ia(kness), ia(kndss), ia(kixess),
& ia(kixdss), ia(kltess), ia(kltsss), a(kfacss), ierr)
CALL MDDEL ('NEESS')
CALL MDDEL ('NNESS')
CALL MDDEL ('NDESS')
CALL MDDEL ('IXEESS')
CALL MDDEL ('IXNESS')
CALL MDDEL ('IXDESS')
CALL MDDEL ('LTEESS')
CALL MDDEL ('LTNESS')
CALL MDDEL ('LTSESS')
CALL MDDEL ('FACESS')
end if
C --Read the properties
call rwpval(ntxt, ndb, a, ia, c, nelblk, numnps, numess,
& ia(kidlb), ia(kidns), ia(kidss), *140)
if (numnps .gt. 0) CALL MDDEL ('IDNPS')
if (numess .gt. 0) CALL MDDEL ('IDESS')
C --Read the QA records
CALL RWQA (NTXT, NDB, C, QAINFO, *140)
C --Read the database names
CALL RWNAME (NTXT, NDB, NELBLK, NVARGL, NVARNP, NVAREL,
& A, C, KIEVOK, EXODUS, NAMLEN, *140)
CALL MDSTAT (NERR, MEM)
IF (NERR .GT. 0) GOTO 130
IF (EXODUS) THEN
CALL DBPINI ('V', NTXT, TITLE, NDIM, NUMNP, NUMEL, NELBLK,
& NUMNPS, LNPSNL, NUMESS, LESSEL, LESSNL,
& 0, NVARGL, NVARNP, NVAREL)
END IF
C Put truth table
IF (.NOT. EXODUS) GOTO 140
C --Read the database time steps
NSTEPS = 0
maxvar = max(nvargl, nvarnp*numnp, nvarel*numel)
CALL MDRSRV ('VAR', KVAR, maxvar)
CALL MDSTAT (NERR, MEM)
IF (NERR .GT. 0) GOTO 130
WRITE (*, *)
WRITE (*, *) !#VAX
110 CONTINUE
IF (.TRUE.) THEN
NSTEPS = NSTEPS + 1
CALL RWSTEP (NTXT, NDB, NSTEPS, ia(kidlb),
& NVARGL, NVARNP, NUMNP, NVAREL, NELBLK, iA(KNELB), iA(KIEVOK),
& TIME, A(KVAR), *120)
WRITE (*, 10000) NSTEPS
10000 FORMAT (I8, ' time steps processed')
GOTO 110
END IF
120 CONTINUE
call mddel('IDELB')
call mddel('NUMELB')
call mddel('ISEVOK')
call mddel('VAR')
NSTEPS = NSTEPS-1
CALL INTSTR (1, 0, NSTEPS, STR8, LSTR)
WRITE (*, 10010) STR8(:LSTR)
10010 FORMAT (/, 4X, A,
& ' time steps have been written to the database')
GOTO 140
130 CONTINUE
CALL MEMERR
GOTO 140
140 CONTINUE
CLOSE (NTXT, IOSTAT=IDUM)
if (ndb .ne. 12 .and. ndb .gt. 0) call exclos(ndb, ierr)
call addlog (QAINFO(1)(:lenstr(QAINFO(1))))
CALL PRTERR ('CMDSPEC',
$ 'Please use ncdump/ncgen instead of exotxt/txtexo.')
CALL WRAPUP (QAINFO(1))
END
C.
subroutine wrcon (ndb, cornam, ierr, namlen)
character*(namlen) cornam(*)
call expcon (ndb, cornam, ierr)
return
end