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.
 
 
 
 
 
 

1696 lines
60 KiB

C Copyright(C) 1999-2020, 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=======================================================================
*DECK,MAPVAR
PROGRAM MAPVAR
C ******************************************************************
C --MAPVAR--
C A PROGRAM TO MAP FINITE ELEMENT RESULTS
C FROM ONE EXODUS-II RESTART FILE TO ANOTHER
C EXODUS-II RESTART FILE TO SUPPORT REMESHING
C GERALD W. WELLMAN
C SANDIA NATIONAL LABORATORIES
C ALBUQUERQUE, NEW MEXICO
C MAPVAR IS BASED ON MERLIN II,A FINITE ELEMENT INTERPOLATION
C PROGRAM BY DAVID K. GARTLING.
C THE MERLIN PROGRAM IS DESIGNED TO TRANSFER DATA BETWEEN TWO- AND
C THREE-DIMENSIONAL FINITE ELEMENT MESHES. GIVEN A FINITE ELEMENT
C MESH, (MESH-A), AND A SOLUTION FIELD ON THAT MESH, MERLIN
C INTERPOLATES THE GIVEN SOLUTION ONTO A SECOND FINITE ELEMENT MESH,
C (MESH-B). THE INTERPOLATION PROCEDURE IS BASED ON USE OF THE
C ELEMENT SHAPE FUNCTIONS IN MESH-A.
C MAPVAR IS DESIGNED TO SERVE THE SAME GENERAL PURPOSE AS MERLIN
C HOWEVER, MAPVAR IS DESIGNED TO PROVIDE THE TRANSLATION IN TERMS
C OF EXODUS-II-V2 RESTART FILES. MAPVAR ALSO TRANSLATES ELEMENT
C VARIABLES AS WELL AS NODAL VARIABLES AND READS/WRITES GLOBAL
C VARIABLES. MAPVAR IS CURRENTLY SET UP FOR THREE ELEMENT TYPES,
C 2-D QUADS, 3-D HEXES, AND 3-D QUAD SHELLS. ALL THE ELEMENTS
C ORIGINALLY SUPPORTED BY MERLIN CAN BE INCLUDED IN MAPVAR GIVEN
C THE DESIRE AND RESOURCES. THE SEARCH ENGINE OF MAPVAR HAS BEEN
C CHANGED TO A BINARY SEARCH FROM THE BIN OR BUCKET SEARCH OF MERLIN.
C THE INTENT OF MAPVAR IS TO CREATE A RESTART FILE THAT WILL ALLOW
C A FINITE ELEMENT SOLUTION TO PROCEED WITH A DIFFERENT MESH THAN
C THE MESH WITH WHICH THE SOLUTION WAS STARTED. THUS, THERE IS AN
C INHERENT ASSUMPTION THAT MESH-A IS AN EXODUS RESTART FILE.
C NODAL VARIABLE TRANSFER IS STRAIGHT FORWARD. THE MESH-B NODE IS
C FOUND INSIDE THE APPROPRIATE MESH-A ELEMENT. THE ELEMENT SHAPE
C FUNCTIONS ARE USED TO INTERPOLATE RESULTS ONTO THE MESH-B NODE.
C ELEMENT VARIABLE TRANSFER TAKES TWO STEPS. FIRST THE ELEMENT
C VARIABLE IS "SCATTERED" TO THE NODES. THEN THE MESH-B ELEMENT
C CENTROID IS FOUND INSIDE THE MESH-A ELEMENT. TRANSFER TO THE
C MESH-B ELEMENT CENTROID TAKES PLACE USING THE ELEMENT SHAPE
C FUNCTIONS AND THE "SCATTERED" ELEMENT DATA (NOW NODAL DATA).
C ELEMENT DATA IS "SCATTERED" TO THE NODES IN TWO SCHEMES. THE
C FIRST IS SIMPLE AVERAGING. THIS IS ROBUST AND FAST BUT CAN LEAD
C TO SIGNIFICANT DISSIPATION IN THE CASE OF GRADIENTS APPROACHING
C A FREE SURFACE. THE SECOND METHOD EMPLOYS A CONSTRAINED LEAST
C SQUARES FITTING PROCEDURE TO "SCATTER" ELEMENT RESULTS TO THE
C NODES. THE CONSTRAINTS ARE BASED ON THE REQUIREMENTS OF THE
C CONSTITUTIVE MODEL. FINALLY, A DIRECT TRANSFER HAS BEEN IMPLEMENTED
C BUT IS NOT RECOMMENDED.
C Special considerations:
C ELMASS - translated to nodal density, interpolated, translated
C back to ELMASS
C ROTATIONS - magnitude of matrix must be 1, translate, compute
C magnitude, divide each component by magnitude
C EQPS - constrained to be .gt. 0.
C TEARING - constrained to be .gt. 0.
C DECAY - constrained to be .lt. 1.
C Code Tree:
C (SUPES, EXODUSII, and multiple calls to ERROR not included)
C SET-UP
C MAPVAR - OPNFIL
C ERROR - CLSFIL
C RDINPT - BANNER
C ERROR
C RDA1 - LENSTR
C RDB1
C RDA2 - ERROR
C RDB2 - ERROR
C SHELLS
C BLDSRF
C BLDPTN
C SRCHS - MKRNK - INDEXX
C RANK
C - GETBND - SRCHGE
C SRCHGT
C - MKLSTV
C - SHLSRC
C SINTPN - SHAPEF
C BLDPTE - CNTR
C SRCHS -
C SCHEME 0
C SETON0 - VOL
C SINTPE - SHAPEF
C VOL
C SCHEME 1
C SETON1 - CNTR
C VOL
C INVCON
C EXTS - FRGE
C BS
C AVG
C SINTPE -
C SCHEME 2
C STRAN
C SCHEME 3
C INVCON
C ELGRAD - CNTR
C - VOL
C - FLGRAD
C INTRP3
C QUADS
C BLDSRF
C BLDPTN
C SRCHQ - MKRNK - INDEXX
C RANK
C - GETBND - SRCHGE
C SRCHGT
C - MKLSTV
C - QADSRC - NODE
C JACOBN
C INTRPN - SHAPEF
C BLDPTE -
C SRCHQ -
C SCHEME 0
C ELTON0 - VOL
C INTRPE - SHAPEF
C VOL
C SCHEME 1
C ELTON1 - CNTR
C VOL
C INVCON
C EXTQ - FRGE
C BS
C AVG
C EXTH - FRGE
C BS
C INTRPE -
C SCHEME 2
C TRANAB
C SCHEME 3
C INVCON
C ELGRAD - CNTR
C - VOL
C - FLGRAD
C INTRP3
C HEXES
C BLDSRF
C BLDPTN
C SRCHH - MKRNK - INDEXX
C RANK
C - GETBND - SRCHGE
C SRCHGT
C - MKLSTV
C - HEXSRC - NODE
C JACOBN
C INTRPN -
C BLDPTE -
C SRCHH -
C SCHEME 0
C ELTON0 -
C INTRPE -
C SCHEME 1
C ELTON1 -
C INTRPE -
C SCHEME 2
C TRANAB
C SCHEME 3
C INVCON
C ELGRAD - CNTR
C - VOL
C - FLGRAD
C INTRP3
C WRAP-UP
C WRTC
C BANNER
C CLSFIL
C SUPES CALLS:
C EXDATE, EXTIME, FREFLD, MDDEL, MDEROR, MDGET,
C MDINIT, MDRSRV, MDSTAT, STRIPB
C EXODUSII CALLS:
C EXCLOS, EXINQ, (EXOPN)-fcn,
C EXGATM, EXGCON, EXGCOR, EXGEAT, EXGEBI, EXGELB,
C EXGELC, EXGEV, EXGGV, EXGINI, EXGNSI, EXGNP,
C EXGNV, EXGNS, EXGNSD, EXGP, EXGPN, EXGQA,
C EXGSS, EXGSSD, EXGSSI, EXGSP, EXGTIM, EXGVAN,
C EXGVP,
C EXPCON, EXPCOR, EXPEAT, EXPELB, EXPELC, EXPEV,
C EXPGV, EXPINI, EXPNS, EXPNSD, EXPNV, EXPNP,
C EXPP, EXPPN, EXPQA, EXPSP, EXPSS, EXPSSD,
C EXPTIM, EXPVAN,
C ******************************************************************
C THE BASIC REFERENCE DOCUMENT FOR THIS CODE IS SAND 99-0466
C ******************************************************************
C COMPUTER CODE MANAGEMENT SYSTEM INFORMATION --
C CURRENT VERSION DESIGNATOR- 1.12
C ******************************************************************
include 'aexds1.blk'
include 'aexds2.blk'
include 'amesh.blk'
include 'bmesh.blk'
include 'contrl.blk'
include 'ebbyeb.blk'
include 'ex2tp.blk'
include 'header.blk'
include 'ntpdat.blk'
include 'rundat.blk'
include 'steps.blk'
include 'schdat.blk'
include 'tapes.blk'
include 'toldat.blk'
include 'varnpt.blk'
include 'varept.blk'
DIMENSION A(1),IA(1)
EQUIVALENCE (A(1),IA(1))
CHARACTER*(MXSTLN) TYP
CHARACTER*8 MEMDBG
C ******************************************************************
C MAIN PROGRAM FOR MAPVAR
C PROGRAM EXECUTION IS DIRECTED FROM THIS ROUTINE
C ******************************************************************
C NOTE : ALL ELEMENT DATA,NODAL POINT DATA, SOLUTION FIELDS, WORK
C SPACE, ETC. ARE STORED IN THE ARRAY "A". THE MEMORY
C MANAGER REQUESTS THE NEEDED STORAGE SPACE IN "A" DURING
C EXECUTION. THE POINTERS NA1,NA2,....NAM PARTITION THE
C ALLOCATED STORAGE INTO SEPARATE ARRAYS. SEE SAND86-0911,
C "SUPES", FOR DETAILS OF THE MEMORY MANAGER.
C ******************************************************************
C open all disk files
C disable netcdf warning messages
CALL EXOPTS(0,IERR)
call debug('MVOPNFIL')
CALL MVOPNFIL
C get info for QA records
CALL VERSION(QAINFO)
C initialize memory manager
CALL MDINIT (A)
C ... If EXT99 Environment variable set, turn on supes memory debugging
C The numeric value of the variable is used as the unit to write
C debug information to.
CALL EXNAME (-99, MEMDBG, L)
IF (L .GE. 1) THEN
READ(MEMDBG(:L), '(I8)', ERR=20) IUNIT
CALL MDDEBG(IUNIT)
END IF
20 CONTINUE
C ******************************************************************
C read input parameters needed to control the solution from
C the screen (time step(s), bins)
C ******************************************************************
CALL EXINQ(NTP2EX,EXTIMS,NTIMES,RDUM,CDUM,IERR)
CALL EXGINI (NTP2EX,HED,NDIMA,NODESA,NUMELA,NBLKSA,
& NUMNPS,NUMESS,IERR)
CALL EXGINI (NTP3EX,HED,NDIMB,NODESB,NUMELB,NBLKSB,
& NUMNPS,NUMESS,IERR)
C A(NT1) = TIMES(1:NTIMES) - times on Mesh-A database
C IA(NAEB) = IDA(1:NBLKSA) - Donor mesh element block I.D.'s
C IA(NBEB) = IDB(1:NBLKSA) - Recipient mesh element block I.D.'s
C IA(NMAP) = MP(1:3,1:MBLK) - Donor to recipient mesh map
MBLK = NBLKSA * NBLKSB
CALL MDRSRV ('TIMES', NT1, NTIMES)
CALL MDRSRV ('IDA', NAEB, NBLKSA)
CALL MDRSRV ('IDB', NBEB, NBLKSB)
CALL MDRSRV ('MP', NMAP, MBLK*3)
C reserve space for storing the search box size for each map operation
CALL MDRSRV ('MPSEA', NMAPS, MBLK)
CALL MDSTAT (MNERRS, MNUSED)
IF (MNERRS .NE. 0) THEN
CALL MDEROR(NOUT)
CALL ERROR('MAPVAR',
& 'MEMORY MANAGER ERROR',
& 'JUST BEFORE CALL TO RDINPT',0,' ',0,' ',' ',1)
END IF
call debug('RDINPT')
CALL RDINPT (A(NT1),IA(NAEB),IA(NBEB),IA(NMAP),A(NMAPS),IMP,MBLK)
C ******************************************************************
C INITIAL READ OF MESH-A
C ******************************************************************
C read sizing data for mesh A
WRITE (NOUT, 270) fntp2(:lenstr(fntp2)), HED
WRITE (NTPOUT, 270) fntp2(:lenstr(fntp2)), HED
WRITE (NOUT, 280) NDIMA,NODESA,NUMELA,NBLKSA
WRITE (NTPOUT, 280) NDIMA,NODESA,NUMELA,NBLKSA
C allocate storage for initial read of mesh A
C A(NAX) = XA(1:NODESA) - Mesh-A X-coord
C A(NAY) = YA(1:NODESA) - Mesh-A Y-coord
C A(NAZ) = ZA(1:NODESA) - Mesh-A Z-coord
C A(NADX) = DISXA(1:NODESA) - Mesh-A X-displ
C A(NADY) = DISYA(1:NODESA) - Mesh-A Y-displ
C A(NADZ) = DISZA(1:NODESA) - Mesh-A Z-displ
CALL MDRSRV ('XA', NAX, NODESA)
CALL MDRSRV ('DISXA', NADX, NODESA)
CALL MDRSRV ('YA', NAY, NODESA)
CALL MDRSRV ('DISYA', NADY, NODESA)
IF (NDIMA.EQ.3) THEN
CALL MDRSRV ('ZA', NAZ, NODESA)
CALL MDRSRV ('DISZA', NADZ, NODESA)
ELSE
CALL MDRSRV ('ZA', NAZ, 1)
CALL MDRSRV ('DISZA', NADZ, 1)
END IF
CALL MDSTAT (MNERRS, MNUSED)
IF (MNERRS .NE. 0) THEN
CALL MDEROR(NOUT)
CALL ERROR('MAPVAR',
& 'MEMORY MANAGER ERROR',
& 'JUST BEFORE CALL TO RDA1',0,' ',0,' ',' ',1)
END IF
C Copy "GENESIS" from mesh-B to mesh-C
CALL EXCOPY(NTP3EX,NTP4EX,IERR)
IF (IERR .NE. 0)
& CALL ERROR('MAPVAR',
& 'ERROR WITH EXCOPY - GENESIS FILE COPY',
& ' ',0,' ',0,' ',' ',1)
c read mesh A (coords,displ,variable names,QA, INFO records),
c write mesh C, (variable names, QA, INFO records)
call debug('RDA1')
CALL RDA1 (A(NAX),A(NAY),A(NAZ),A(NADX),A(NADY),A(NADZ))
C ... Mapvar is buggy if mesh contains:
C * nodal variable(s)
C * multiple element blocks
C * multiple timesteps
C The interpolated mesh will have invalid values for most of the
C nodes except for those connected to the last element block.
C Since this is not what the user wants. We check this situation
C here and then refuse to run...
if (nvarnp .gt. 0) then
if (ntimes .gt. 1 .and. istep .eq. -1 .and.
* nblksa .gt. 1 .and. nvarnp .gt. 0) then
write (*,500)
500 format(10x,/,
* 'FATAL ERROR: Mapvar is buggy and cannot correctly'
* ' handle interpolating a mesh with nodal variables,',
* /,14x,'multiple timesteps and multiple element blocks.',
* /,14x,'See https://github.com/sandialabs/seacas/packages'
* '/seacas/MAPVAR.md')
stop('INTERNAL ERROR')
end if
C ... Warn if multiple blocks...
if (ntimes .gt. 1 .and. nblksa .gt. 1) then
write (*,600)
600 format(10x,/,
* 'WARNING: Mapvar is buggy and might not correctly'
* ' handle interpolating a mesh with nodal variables',
* /,9x,'and multiple element blocks. Shared nodes',
* ' might be incorrect.',
* /,9x,'See https://github.com/sandialabs/seacas/packages'
* '/seacas/MAPVAR.md')
end if
end if
IF (IACCU .EQ. 1)THEN
IF (IXVEL .NE. 0 .AND. IYVEL .NE. 0 .AND.
& (IELMS .NE. 0 .OR. IDENS .NE. 0))THEN
C velocities and mass are available, compute momenta and k.e.
C 1st set up storage for vel's
C A(NVXA) = VELXA(1:NODESA) - X-velocity in mesh-A
C A(NVYA) = VELYA(1:NODESA) - Y-velocity in mesh-A
C A(NVZA) = VELZA(1:NODESA) - Z-velocity in mesh-A
C A(NNMSA) = RMSNA(1:NODESA) - nodal mass in mesh-A
C A(NVXB) = VELXB(1:NODESB) - X-velocity in mesh-B
C A(NVYB) = VELYB(1:NODESB) - Y-velocity in mesh-B
C A(NVZB) = VELZB(1:NODESB) - Z-velocity in mesh-B
C A(NNMSB) = RMSNB(1:NODESB) - nodal mass in mesh-B
CALL MDRSRV ('VELXA', NVXA, NODESA)
CALL MDRSRV ('VELYA', NVYA, NODESA)
IF (NDIMA .EQ. 3)THEN
CALL MDRSRV ('VELZA', NVZA, NODESA)
ELSE
CALL MDRSRV ('VELZA', NVZA, 1)
END IF
CALL MDRSRV ('RNMSA', NNMSA, NODESA)
CALL MDRSRV ('VELXB', NVXB, NODESB)
CALL MDRSRV ('VELYB', NVYB, NODESB)
IF (NDIMB .EQ. 3)THEN
CALL MDRSRV ('VELZB', NVZB, NODESB)
ELSE
CALL MDRSRV ('VELZB', NVZB, 1)
END IF
CALL MDRSRV ('RNMSB', NNMSB, NODESB)
CALL MDSTAT (MNERRS, MNUSED)
IF (MNERRS .NE. 0) THEN
CALL ERROR ('MAPVAR',
& 'MEMORY MANAGER ERROR',
& 'CHECK ACCURACY - VELOCITY',
& 0,' ',0,' ',' ',1)
END IF
C initialization quantities (6 each for now) that need to be
C summed over the element blocks if doing an accuracy check
IF (ISTEP .EQ. -1)THEN
C need arrays (one slot for each time), else just scalars will do
C A(NTMXA) = TMXA(1:NTIMES) - X-momentum all mesh-A blocks each time
C A(NTMYA) = TMYA(1:NTIMES) - Y-momentum all mesh-A blocks each time
C A(NTMZA) = TMZA(1:NTIMES) - Z-momentum all mesh-A blocks each time
C A(NTKEA) = TKEA(1:NTIMES) - K.E. all mesh-A blocks each time
C A(NTPSQA) = TPSQA(1:NTIMES) - Pressure squared mesh-A each time
C A(NTJ2A) = TJ2A(1:NTIMES) - J2 mesh-A each time
C A(NTMXB) = TMXB(1:NTIMES) - X-momentum all mesh-B blocks each time
C A(NTMYB) = TMYB(1:NTIMES) - Y-momentum all mesh-B blocks each time
C A(NTMZB) = TMZB(1:NTIMES) - Z-momentum all mesh-B blocks each time
C A(NTKEB) = TKEB(1:NTIMES) - K.E. all mesh-B blocks each time
C A(NTPSQB) = TPSQB(1:NTIMES) - Pressure squared mesh-B each time
C A(NTJ2B) = TJ2B(1:NTIMES) - J2 mesh-B each time
CALL MDRSRV('TMXA', NTMXA, NTIMES)
CALL MDRSRV('TMYA', NTMYA, NTIMES)
CALL MDRSRV('TMZA', NTMZA, NTIMES)
CALL MDRSRV('TKEA', NTKEA, NTIMES)
CALL MDRSRV('TPSQA', NTPSQA, NTIMES)
CALL MDRSRV('TJ2A', NTJ2A, NTIMES)
CALL MDRSRV('TMXB', NTMXB, NTIMES)
CALL MDRSRV('TMYB', NTMYB, NTIMES)
CALL MDRSRV('TMZB', NTMZB, NTIMES)
CALL MDRSRV('TKEB', NTKEB, NTIMES)
CALL MDRSRV('TPSQB', NTPSQB, NTIMES)
CALL MDRSRV('TJ2B', NTJ2B, NTIMES)
CALL MDSTAT (MNERRS, MNUSED)
IF (MNERRS .NE. 0) THEN
CALL ERROR ('MAPVAR',
& 'MEMORY MANAGER ERROR',
& 'CHECK ACCURACY - INITIALIZATION',
& 0,' ',0,' ',' ',1)
END IF
ELSE
CALL MDRSRV('TMXA', NTMXA, 1)
CALL MDRSRV('TMYA', NTMYA, 1)
CALL MDRSRV('TMZA', NTMZA, 1)
CALL MDRSRV('TKEA', NTKEA, 1)
CALL MDRSRV('TPSQA', NTPSQA, 1)
CALL MDRSRV('TJ2A', NTJ2A, 1)
CALL MDRSRV('TMXB', NTMXB, 1)
CALL MDRSRV('TMYB', NTMYB, 1)
CALL MDRSRV('TMZB', NTMZB, 1)
CALL MDRSRV('TKEB', NTKEB, 1)
CALL MDRSRV('TPSQB', NTPSQB, 1)
CALL MDRSRV('TJ2B', NTJ2B, 1)
CALL MDSTAT (MNERRS, MNUSED)
IF (MNERRS .NE. 0) THEN
CALL ERROR ('MAPVAR',
& 'MEMORY MANAGER ERROR',
& 'CHECK ACCURACY - INITIALIZATION',
& 0,' ',0,' ',' ',1)
END IF
END IF
END IF
END IF
C ******************************************************************
C INITIAL READ OF MESH-B
C ******************************************************************
C read sizing data for mesh B
WRITE (NOUT, 290) fntp3(:lenstr(fntp3)), HED
WRITE (NTPOUT, 290) fntp3(:lenstr(fntp3)), HED
WRITE (NOUT, 300) NDIMB,NODESB,NUMELB,NBLKSB
WRITE (NTPOUT, 300) NDIMB,NODESB,NUMELB,NBLKSB
c quick initial check of compatibility mesh-A to mesh-B
IF (NDIMB .NE. NDIMA) THEN
CALL ERROR('MAPVAR',
& 'MESH-B INCOMPATIBLE WITH MESH-A',
& 'DIMENSION OF MESH-A',NDIMA,
& 'DIMENSION OF MESH-B',NDIMB,
& ' ',' ',1)
END IF
C allocate storage for mesh B read
C A(NBX) = XB(1:NODESB) - Mesh-B X-coord
C A(NBY) = YB(1:NODESB) - Mesh-B Y-coord
C A(NBZ) = ZB(1:NODESB) - Mesh-B Z-coord
CALL MDRSRV ('XB', NBX, NODESB)
CALL MDRSRV ('YB', NBY, NODESB)
IF (NDIMB.EQ.3) THEN
CALL MDRSRV ('ZB', NBZ, NODESB)
ELSE
CALL MDRSRV ('ZB', NBZ, 1)
END IF
CALL MDSTAT (MNERRS, MNUSED)
IF (MNERRS .NE. 0) THEN
CALL MDEROR(NOUT)
CALL ERROR('MAPVAR',
& 'MEMORY MANAGER ERROR',
& 'JUST BEFORE CALL TO RDB1',
& 0,' ',0,' ',' ',1)
END IF
c read coordinates for mesh B
call debug('RDB1')
CALL RDB1 (A(NBX),A(NBY),A(NBZ))
C *********************************************************
C START INTERPOLATION
C *********************************************************
C set up memory for arrays for nodal results and truth table
C these arrays stay around forever - they don't get deleted
C after each element block is processed like the arrays
C set up within the element block loop
C A(NASOLN) = SOLNA(1:NODESA,1:NVARNP) - Mesh-A nodal data
C A(NBSOLN) = SOLNB(1:NODESB,1:NVARNP) - Mesh-B interpolated
C nodal data
C IA(ITTA) = ITRTA(1:NVAREL,1:NBLKSA) - Mesh-A truth table
C IA(ITTB) = ITRTB(1:NVAREL,1:NBLKSB) - Mesh-B truth table
C A(NSN) = SN(1:NODESB) - storage for nodal vars in ininod
C A(NSE) = SE(1:NODESB) - storage for element vars in ininod
CALL MDRSRV ('SOLNA', NASOLN, NODESA*NVARNP)
CALL MDRSRV ('SOLNB', NBSOLN, NODESB*NVARNP)
CALL MDRSRV ('ITRTA', ITTA, NVAREL*NBLKSA)
CALL MDRSRV ('ITRTB', ITTB, NVAREL*NBLKSB)
CALL MDRSRV ('SN', NSN, NODESB)
CALL MDRSRV ('SE', NSE, NODESB)
CALL MDSTAT (MNERRS, MNUSED)
IF (MNERRS .NE. 0) THEN
CALL MDEROR(NOUT)
CALL ERROR('MAPVAR',
& 'MEMORY MANAGER ERROR',
& 'JUST BEFORE INTERPOLATION LOOP',
& 0,' ',0,' ',' ',1)
END IF
call inirea(nodesb*nvarnp, 0.0, a(nbsoln))
call debug('TRUTBL')
CALL TRUTBL(IA(NMAP),IMP,IA(NAEB),IA(NBEB),IA(ITTA),IA(ITTB))
C *********************************************************************
C START OF ELEMENT BLOCK-BY-ELEMENT BLOCK INTERPOLATION LOOP
C *********************************************************************
C store default values of search box tolerances per element type
TOLSHC = TOLSHL
TOLQAC = TOLQAD
TOLHEC = TOLHEX
TOLTEC = TOLTET
C A(NAGV) = GVAR(1:NVARGP) Global variables
CALL MDRSRV ('GVAR', NAGV, NVARGP)
call debug('WRTC')
CALL WRTC(A(NBX),A(NBY),A(NBZ),A(NAGV),A(NBSOLN))
DO 50 IM = 1, IMP
C... Get values for block mapping
call getval(ia(nmap), im, idblka, idblkb, ischem)
TOLSEA = A(NMAPS+IM-1)
do 15 i=1, nblksa
if (idblka .eq. ia(naeb-1+i)) then
iblka = i
go to 16
endif
15 continue
16 continue
do 25 i=1, nblksb
if (idblkb .eq. ia(nbeb-1+i)) then
iblkb = i
go to 26
endif
25 continue
26 continue
C set up controls for many to 1 map
C if first time recipient mesh element block called, insub = 1
C else insub = 2
C if last time recipient mesh element block called, icompl = 1
C else icompl = 0
INSUB = 1
ICOMPL = 1
IF (IM .GT. 1)THEN
C ... Get the block b id from the previous time through...
C `IA(NMAP)` is the root of the `MP(1:3,1:MBLK)` array.
C ida idb isc ida ida idb isc
C Memory ordering (1,1), (2,1), (3,1), (1,2), (2,2), (3,2), ..., (3,3)-
C +0 +1 +2 +3 +4 +5
C ida = ia(nmap+(3*im-1)+0) = ia(nmap + 3 * im - 3)
C idb = ia(nmap+(3*im-2)+1 = ia(nmap + 3 * im - 2)
C ... This is MP(2,IM-1)...
IDBBM1 = IA(NMAP + 3 * im - 5)
IF (IDBLKB .EQ. IDBBM1)THEN
INSUB = 2
END IF
END IF
IF (IM .LT. IMP)THEN
C ... This is MP(2,IM+1)...
IDBBP1 = IA(NMAP+ 3 * im + 1)
IF (IDBLKB .EQ. IDBBP1)THEN
ICOMPL = 0
END IF
END IF
C **********************************************************
C ELEMENT BLOCK BY ELEMENT BLOCK INTERPOLATION
C REQUIRED FOR ELEMENT DATA BUT ALSO USED FOR NODAL DATA
C **********************************************************
WRITE(NOUT,330)IM,IMP,IDBLKB
WRITE(NOUT,320)IDBLKA
WRITE(NTPOUT,330)IM,IMP,IDBLKB
WRITE(NTPOUT,320)IDBLKA
CALL EXGELB(NTP2EX,IDBLKA,TYP,NUMEBA,NELNDA,NATRIB,
& IERR)
CALL EXGELB(NTP3EX,IDBLKB,TYP,NUMEBB,NELNDB,NATRIB,
& IERR)
IF (NUMEBB .EQ. 0)THEN
GO TO 50
END IF
C set up arrays for element block-by-element block preliminaries
C these arrays will be deleted at the end of the loop
C IA(NACON) = ICONA(1:NELNDA,1:NUMEBA) - Mesh-A connectivity
C IA(NBCON) = ICONB(1:NELNDB,1:NUMEBB) - Mesh-B connectivity
C IA(NANDLST) = NDLSTA(1:NODESA) - Mesh-A nodes in element block
C IA(NBNDLST) = NDLSTB(1:NODESB) - Mesh-A nodes in element block
C A(NASTAT) = STATUS(1:NUMEBA) - Mesh-A element status
CALL MDRSRV ('ICONA', NACON, NELNDA*NUMEBA)
CALL MDRSRV ('ICONB', NBCON, NELNDB*NUMEBB)
CALL MDRSRV ('NDLSTA', NANDLST, NODESA)
CALL MDRSRV ('NDLSTB', NBNDLST, NODESB)
CALL MDRSRV ('STATUS', NASTAT, NUMEBA)
CALL MDSTAT (MNERRS, MNUSED)
IF (MNERRS .NE. 0) THEN
CALL MDEROR(NOUT)
CALL ERROR('MAPVAR',
& 'MEMORY MANAGER ERROR',
& 'BLOCKS LOOP PRELIMINARIES',
& 0,' ',0,' ',' ',1)
END IF
c 2nd read of mesh A
call debug('RDA2')
CALL RDA2 (IDBLKA,IA(NACON),IA(NANDLST),A(NASTAT),
& MAXLN)
C Set the search box tolerance for the current mapping
IF ( ITYPE .EQ. 13) THEN
C shell
IF ( TOLSEA .GT. 0.0) THEN
TOLSHL = TOLSEA
ELSE
TOLSHL = TOLSHC
END IF
WRITE( NOUT, 321) TOLSHL
WRITE( NTPOUT, 321) TOLSHL
ELSE IF ( ( ITYPE .EQ. 3) .OR.
& ( ITYPE .EQ. 4) .OR.
& ( ITYPE .EQ. 5)) THEN
C quad-4
IF ( TOLSEA .GT. 0.0) THEN
TOLQAD = TOLSEA
ELSE
TOLQAD = TOLQAC
END IF
WRITE( NOUT, 321) TOLQAD
WRITE( NTPOUT, 321) TOLQAD
ELSE IF ( ( ITYPE .EQ. 6) .OR.
& ( ITYPE .EQ. 10)) THEN
C hex-8 or tet-8
IF ( TOLSEA .GT. 0.0) THEN
TOLHEX = TOLSEA
TOLTET = TOLSEA
ELSE
TOLHEX = TOLHEC
TOLTET = TOLTEC
END IF
IF ( ITYPE .EQ. 6) THEN
WRITE( NOUT, 321) TOLTET
WRITE( NTPOUT, 321) TOLTET
ELSE
WRITE( NOUT, 321) TOLHEX
WRITE( NTPOUT, 321) TOLHEX
END IF
ELSE
CALL ERROR ('MAPVAR','INCORRECT ELEMENT TYPE',
& 'ELEMENT TYPE =',ITYPE,
& 'NOT YET IMPLEMENTED',0,' ',' ',1)
END IF
c 2nd read of mesh-b
call debug('RDB2')
CALL RDB2(IDBLKB,IDBLKA,IA(NBCON),IA(NBNDLST))
C set up arrays for element block-by-element block processing
C these arrays will be deleted at the end of the loop
C IA(NS1) = ISRCHR(1:1(NISR),1:NUMNDB) Integer search results
C A(NS2) = RSRCHR(1:6(NRSR),1:NUMNDB) Real search results
C IA(NS3) = LIST(1:NUMNDB) Potential contacts
C IA(NS4) = IND(1:NUMNDB,1:3) Index array point order
C IA(NS5) = IRNK(1:NUMNDB,1:3) Rank array
C IA(NS6) = IRNK2(1:NUMNDB,1:3,1:2) Indirect rank array
C IA(NS7) = INDX(1:NUMNDB) Intermediate list potential
C pairs (intersection lists)
C IA(NS8) = ILO(1:LBLK,1:3) Min index search box
C IA(NS9) = IUP(1:LBLK,1:3) Max index search box
C IA(NS10) = IDP(1:LBLK) Points paired with element
C IA(NS11) = IDS(1:LBLK) Elements paired with point
C A(NS12) = XMIN(1:LBLK,1:3) Min dim search box
C A(NS13) = XMAX(1:LBLK,1:3) Max dim search box
C IA(NS14) = ISCR(1:NISS,1:LBLK) Integer scratch
C A(NS15) = RSCR(1:NRSS,1:LBLK) Real scratch
C A(NS16) = XYZSRF(1:NODESA,1:3) Coords defining element
C A(NS17) = XYZPTS(1:NUMNDB,1:3) Coords of points searched
C A(NASOLE) = SOLEA(1:NUMEBA,1:NVAREL) - Mesh-A element data
C A(NBSOLE) = SOLEB(1:NUMEBB,1:NVAREL) - Mesh-B interpolated
C element data
C A(NASOLEN) = SOLENA(1:NODESA,1:NVAREL) - Mesh-A element data
C "scattered" to nodes
C IA(NANELTN) = NELTN(1:NODESA) - Mesh-A number of elements per
C node Used for computing averages
C IA(NAINVLN) = INVLNA(1:NODESA) - Mesh-Anumber of elements per
C node in inverse connectivity
C IA(NAINVC) = INVCN(1:MAXLN,1:NODESA) Inverse connectivity
C IA(NACTR) = CNTRA(1:NUMEBA,1:3) - Mesh-A element centroids
LBLK = 1
IDIM = MAX(NUMNDB, NUMEBB)
CALL MDRSRV ('ISRCHR', NS1, 1*idim)
CALL MDRSRV ('RSRCHR', NS2, 6*idim)
CALL MDRSRV ('LIST', NS3, idim)
CALL MDRSRV ('IND', NS4, idim*3)
CALL MDRSRV ('IRNK', NS5, idim*3)
CALL MDRSRV ('IRNK2', NS6, idim*6)
CALL MDRSRV ('INDX', NS7, idim)
CALL MDRSRV ('ILO', NS8, LBLK*3)
CALL MDRSRV ('IUP', NS9, LBLK*3)
CALL MDRSRV ('IDP', NS10, LBLK)
CALL MDRSRV ('IDS', NS11, LBLK)
CALL MDRSRV ('XMIN', NS12, LBLK*3)
CALL MDRSRV ('XMAX', NS13, LBLK*3)
CALL MDRSRV ('ISCR', NS14, NISS*LBLK)
CALL MDRSRV ('RSCR', NS15, NRSS*LBLK)
CALL MDRSRV ('XYZSRF', NS16, NODESA*3)
CALL MDRSRV ('XYZPTS', NS17, idim*3)
CALL MDRSRV ('SOLEA', NASOLE, NUMEBA*NVAREL)
CALL MDRSRV ('SOLEB', NBSOLE, NUMEBB*NVAREL)
IF (ISCHEM .EQ. 0)THEN
CALL MDRSRV ('SOLENA', NASOLEN, NODESA*NVAREL)
CALL MDRSRV ('NELTN', NANELTN, NODESA)
ELSE IF (ISCHEM .EQ. 1)THEN
CALL MDRSRV ('SOLENA', NASOLEN, NODESA*NVAREL)
CALL MDRSRV ('INVLNA', NAINVLN, NODESA)
CALL MDRSRV('INVCN', NAINVC, MAXLN*NODESA)
CALL MDRSRV ('CNTRA', NACTR, NUMEBA*3)
ELSE IF (ISCHEM .EQ. 2)THEN
CONTINUE
ELSE IF (ISCHEM .EQ. 3)THEN
CALL MDRSRV ('CNTRA', NACTR, NUMEBA*3)
CALL MDRSRV ('INVLNA', NAINVLN, NODESA)
CALL MDRSRV ('INVCN', NAINVC, MAXLN*NODESA)
CALL MDRSRV ('ICHKEL', NICHKE, NUMEBA)
CALL MDRSRV ('SOLGRA', NSOLGR, NDIMA*NUMEBA*NVAREL)
ELSE
CALL ERROR('MAPVAR',' ','ISCHEM',
& ischem,'INCORRECT ARGUMENT',0,' ',' ',1)
END IF
CALL MDSTAT (MNERRS, MNUSED)
IF (MNERRS .NE. 0) THEN
CALL MDEROR(NOUT)
CALL ERROR('MAPVAR',
& 'MEMORY MANAGER ERROR',
& 'JUST AFTER START OF BLOCKS LOOP',
& 0,' ',0,' ',' ',1)
END IF
IF (ITYPE .EQ. 13)THEN
C **********************************************************
C Path through code for shells
C **********************************************************
call debug('BLDSRF')
CALL BLDSRF(A(NAX),A(NAY),A(NAZ),A(NS16))
IF (NVARNP .GT. 0)THEN
call debug('BLDPTN')
CALL BLDPTN(A(NBX),A(NBY),A(NBZ),IA(NBNDLST),A(NS17))
call debug('SRCHS-nodes')
CALL SRCHS (NODESA,NUMEBA,IA(NACON),A(NS16),
1 NUMNDB,A(NS17),TOLSHL,1,6,
2 NISS,NRSS,IA(NS1),A(NS2),LBLK,
3 IA(NS3),IA(NS4),IA(NS5),IA(NS6),IA(NS7),IA(NS8),IA(NS9),
4 IA(NS10),IA(NS11),A(NS12),A(NS13),IA(NS14),A(NS15),IERR)
call debug('SINTPN')
CALL SINTPN(IA(NACON),A(NASOLN),IA(NS1),1,A(NS2),6,
1 A(NBSOLN),IA(NBNDLST),A(NBX),A(NBY),A(NBZ),
2 IDBLKB,A(NT1),INSUB,A(NSN))
END IF
IF (NVAREL .GT. 0)THEN
call debug('BLDPTE')
CALL BLDPTE(A(NBX),A(NBY),A(NBZ),IA(NBCON),A(NS17))
call debug('SRCHS-element centroids')
CALL SRCHS (NODESA,NUMEBA,IA(NACON),A(NS16),
1 NUMEBB,A(NS17),TOLSHL,1,6,
2 NISS,NRSS,IA(NS1),A(NS2),LBLK,
3 IA(NS3),IA(NS4),IA(NS5),IA(NS6),IA(NS7),IA(NS8),IA(NS9),
4 IA(NS10),IA(NS11),A(NS12),A(NS13),IA(NS14),A(NS15),IERR)
c element centroid values to nodes by averaging
IF (ISCHEM .EQ. 0)THEN
C Set up time steps
IF (ISTEP .EQ. -1)THEN
NTM = NTIMES
ELSE
NTM = 1
END IF
DO 610 IST = 1, NTM
IF (ISTEP .EQ. -1)THEN
ISTP = IST
ELSE
ISTP = ISTEP
END IF
call debug('SETON0')
CALL SETON0(IA(NACON),IA(NANELTN),A(NASOLE),
& A(NASOLEN),IDBLKA,A(NAX),A(NAY),A(NAZ),ISTP,
& IA(ITTB),IBLKB)
call debug('SINTPE')
CALL SINTPE(IA(NACON),A(NASOLEN),IA(NS1),1,A(NS2),6,
& A(NBSOLE),IDBLKB,A(NBX),A(NBY),A(NBZ),
& IA(NBCON),IA(ITTB),IBLKB,A(NT1),A(NS17),
& ISTP,IST,INSUB,ICOMPL,A(NSE))
610 CONTINUE
ELSE IF (ISCHEM .EQ. 1) THEN
call debug('INVCON')
CALL INVCON(IA(NAINVLN),MAXLN,IA(NAINVC),IA(NACON))
C Set up time steps
IF (ISTEP .EQ. -1)THEN
NTM = NTIMES
ELSE
NTM = 1
END IF
DO 620 IST = 1, NTM
IF (ISTEP .EQ. -1)THEN
ISTP = IST
ELSE
ISTP = ISTEP
END IF
call debug('SETON1')
CALL SETON1(A(NACTR),A(NASOLE),A(NASOLEN),IDBLKA,
& A(NAX),A(NAY),A(NAZ),IA(NACON),IA(NANDLST),
& IA(NAINVLN),IA(NAINVC),MAXLN,ISTP,
& IA(ITTB),IBLKB)
call debug('SINTPE')
CALL SINTPE(IA(NACON),A(NASOLEN),IA(NS1),1,A(NS2),6,
& A(NBSOLE),IDBLKB,A(NBX),A(NBY),A(NBZ),
& IA(NBCON),IA(ITTB),IBLKB,A(NT1),A(NS17),
& ISTP,IST,INSUB,ICOMPL,A(NSE))
620 CONTINUE
ELSE IF (ISCHEM .EQ. 2) THEN
c direct transfer, does not require scatter to nodes
call debug('STRAN')
CALL STRAN(IA(NS1),1,A(NASOLE),A(NBSOLE),
& IDBLKA,IDBLKB,
& IA(ITTB),IBLKB,A(NT1),A(NS17),
& INSUB,ICOMPL,
& A(NBX),A(NBY),A(NBZ),IA(NBCON),A(NSE))
ELSE IF (ISCHEM .EQ. 3)THEN
call debug('INVCON')
CALL INVCON(IA(NAINVLN),MAXLN,IA(NAINVC),IA(NACON))
C Set up time steps
IF (ISTEP .EQ. -1)THEN
NTM = NTIMES
ELSE
NTM = 1
END IF
DO 630 IST = 1, NTM
IF (ISTEP .EQ. -1)THEN
ISTP = IST
ELSE
ISTP = ISTEP
END IF
call debug('ELGRAD')
CALL ELGRAD(A(NACTR),A(NAX),A(NAY),A(NAZ),
& A(NASOLE),A(NSOLGR),IA(NICHKE),
& IDBLKA,IA(NACON),IA(NAINVLN),IA(NAINVC),
& MAXLN,ISTP,IA(ITTB),IBLKB)
call debug('INTRP3')
CALL INTRP3(A(NACTR),A(NS17),IA(NS1),
& A(NBSOLE),A(NASOLE),A(NSOLGR),
& IDBLKB,IA(ITTB),IBLKB,A(NT1),
& ISTP,IST,INSUB,ICOMPL,
& A(NBX),A(NBY),A(NBZ),IA(NBCON),A(NSE))
630 CONTINUE
ELSE
CALL ERROR('MAPVAR',' ','ISCHEM =',
& ischem,'INCORRECT ARGUMENT',0,' ',' ',1)
END IF
END IF
C ITYPE = 3 - 4 node quad
C ITYPE = 4 - 8 node quad
C ITYPE = 5 - 9 node quad
ELSE IF (ITYPE .EQ. 3 .OR. ITYPE .EQ. 4 .OR.
& ITYPE .EQ. 5) THEN
C *****************************************************
C PATH THROUGH CODE FOR CONTINUUM ELEMENTS
C (QUAD-4)
C *****************************************************
C find and store location of mesh-b nodes within mesh-a
call debug('BLDSRF')
CALL BLDSRF(A(NAX),A(NAY),A(NAZ),A(NS16))
IF (NVARNP .GT. 0)THEN
call debug('BLDPTN')
CALL BLDPTN(A(NBX),A(NBY),A(NBZ),IA(NBNDLST),A(NS17))
call debug('SRCHQ-nodes')
CALL SRCHQ (NODESA,NUMEBA,IA(NACON),A(NS16),
1 NUMNDB,A(NS17),TOLQAD,1,3,
2 NISS,NRSS,IA(NS1),A(NS2),LBLK,
3 IA(NS3),IA(NS4),IA(NS5),IA(NS6),IA(NS7),IA(NS8),IA(NS9),
4 IA(NS10),IA(NS11),A(NS12),A(NS13),IA(NS14),A(NS15),IERR)
c DO 530 I = 1, NUMNDB
c IF (IA(NS1-1+I) .EQ. 0)THEN
c WRITE(NOUT,430)IA(NBNDLST-1+I),IDBLKB
c WRITE(NTPOUT,430)IA(NBNDLST-1+I),IDBLKB
c END IF
c 530 CONTINUE
c interpolate nodal variables
c write(nout,1037)
c write(ntpout,1037)
CALL INTRPN(IA(NACON),A(NASOLN),IA(NS1),A(NS2),
& A(NBSOLN),IA(NBNDLST),A(NBX),A(NBY),A(NBZ),
& IDBLKB,A(NT1),INSUB,A(NSN))
c start element variable interpolation
c locate Mesh-B element centroid in Mesh-A
END IF
IF (NVAREL .GT. 0)THEN
call debug('BLDPTE')
CALL BLDPTE(A(NBX),A(NBY),A(NBZ),IA(NBCON),A(NS17))
call debug('SRCHQ-element centroids')
CALL SRCHQ (NODESA,NUMEBA,IA(NACON),A(NS16),
1 NUMEBB,A(NS17),TOLQAD,1,3,
2 NISS,NRSS,IA(NS1),A(NS2),LBLK,
3 IA(NS3),IA(NS4),IA(NS5),IA(NS6),IA(NS7),IA(NS8),IA(NS9),
4 IA(NS10),IA(NS11),A(NS12),A(NS13),IA(NS14),A(NS15),IERR)
c element centroid variables averaged to nodes
IF (ISCHEM .EQ. 0)THEN
C Set up time steps
IF (ISTEP .EQ. -1)THEN
NTM = NTIMES
ELSE
NTM = 1
END IF
DO 640 IST = 1, NTM
IF (ISTEP .EQ. -1)THEN
ISTP = IST
ELSE
ISTP = ISTEP
END IF
call debug('ELTON0')
CALL ELTON0(IA(NACON),IA(NANELTN),A(NASOLE),
& A(NASOLEN),IDBLKA,A(NAX),A(NAY),A(NAZ),ISTP,
& IA(ITTB),IBLKB)
c interpolate element vars
call debug('INTRPE')
CALL INTRPE(IA(NACON),A(NASOLEN),IA(NS1),A(NS2),
1 A(NBSOLE),IDBLKB,A(NBX),A(NBY),A(NBZ),
2 IA(NBCON),IA(ITTB),IBLKB,A(NT1),
3 A(NS17),ISTP,IST,INSUB,ICOMPL,A(NSE))
640 CONTINUE
c element centroid variables linear least squares to nodes
ELSE IF (ISCHEM .EQ. 1)THEN
call debug('INVCON')
CALL INVCON(IA(NAINVLN),MAXLN,IA(NAINVC),IA(NACON))
C Set up time steps
IF (ISTEP .EQ. -1)THEN
NTM = NTIMES
ELSE
NTM = 1
END IF
DO 650 IST = 1, NTM
IF (ISTEP .EQ. -1)THEN
ISTP = IST
ELSE
ISTP = ISTEP
END IF
call debug('ELTON1')
CALL ELTON1(A(NACTR),A(NASOLE),A(NASOLEN),IDBLKA,
& A(NAX),A(NAY),A(NAZ),IA(NACON),IA(NANDLST),
& IA(NAINVLN),IA(NAINVC),MAXLN,ISTP,
& IA(ITTB),IBLKB)
c interpolate element vars
call debug('INTRPE')
CALL INTRPE(IA(NACON),A(NASOLEN),IA(NS1),A(NS2),
1 A(NBSOLE),IDBLKB,A(NBX),A(NBY),A(NBZ),
2 IA(NBCON),IA(ITTB),IBLKB,A(NT1),
3 A(NS17),ISTP,IST,INSUB,ICOMPL,A(NSE))
650 CONTINUE
ELSE IF (ISCHEM .EQ. 2)THEN
c direct transfer from Mesh-A to Mesh-B
call debug('TRANAB')
CALL TRANAB(IA(NS1),A(NASOLE),A(NBSOLE),
& IDBLKA,IDBLKB,
& IA(ITTB),IBLKB,A(NT1),A(NS17),
& INSUB,ICOMPL,
& A(NBX),A(NBY),A(NBZ),IA(NBCON),A(NSE))
ELSE IF (ISCHEM .EQ. 3)THEN
call debug('INVCON')
CALL INVCON(IA(NAINVLN),MAXLN,IA(NAINVC),IA(NACON))
C Set up time steps
IF (ISTEP .EQ. -1)THEN
NTM = NTIMES
ELSE
NTM = 1
END IF
DO 660 IST = 1, NTM
IF (ISTEP .EQ. -1)THEN
ISTP = IST
ELSE
ISTP = ISTEP
END IF
call debug('ELGRAD')
CALL ELGRAD(A(NACTR),A(NAX),A(NAY),A(NAZ),
& A(NASOLE),A(NSOLGR),IA(NICHKE),
& IDBLKA,IA(NACON),IA(NAINVLN),IA(NAINVC),
& MAXLN,ISTP,IA(ITTB),IBLKB)
call debug('INTRP3')
CALL INTRP3(A(NACTR),A(NS17),IA(NS1),
& A(NBSOLE),A(NASOLE),A(NSOLGR),
& IDBLKB,IA(ITTB),IBLKB,A(NT1),
& ISTP,IST,INSUB,ICOMPL,
& A(NBX),A(NBY),A(NBZ),IA(NBCON),A(NSE))
660 CONTINUE
ELSE
CALL ERROR('MAPVAR',' ','ISCHEM =',
& ischem,'INCORRECT ARGUMENT',0,' ',' ',1)
END IF
END IF
ELSE IF (ITYPE .EQ. 10 .OR. ITYPE .EQ. 6) THEN
C *****************************************************
C PATH THROUGH CODE FOR 3-D CONTINUUM ELEMENTS
C (HEX-8) OR (TET-8)
C *****************************************************
C FIND AND STORE LOCATION OF MESH-B NODES WITHIN MESH-A
call debug('BLDSRF')
CALL BLDSRF(A(NAX),A(NAY),A(NAZ),A(NS16))
IF (NVARNP .GT. 0)THEN
call debug('BLDPTN')
CALL BLDPTN(A(NBX),A(NBY),A(NBZ),IA(NBNDLST),A(NS17))
IF (ITYPE .EQ. 10)THEN
call debug('SRCHH-nodes')
CALL SRCHH (NODESA,NUMEBA,IA(NACON),A(NS16),
1 NUMNDB,A(NS17),TOLHEX,1,3,
2 NISS,NRSS,IA(NS1),A(NS2),LBLK,
3 IA(NS3),IA(NS4),IA(NS5),IA(NS6),IA(NS7),IA(NS8),
4 IA(NS9),
5 IA(NS10),IA(NS11),A(NS12),A(NS13),IA(NS14),A(NS15),
6 IERR)
ELSEIF (ITYPE .EQ. 6)THEN
call debug('SRCHT-nodes')
CALL SRCHT (NODESA,NUMEBA,IA(NACON),A(NS16),
1 NUMNDB,A(NS17),TOLHEX,1,3,
2 NISS,NRSS,IA(NS1),A(NS2),LBLK,
3 IA(NS3),IA(NS4),IA(NS5),IA(NS6),IA(NS7),IA(NS8),
4 IA(NS9),
5 IA(NS10),IA(NS11),A(NS12),A(NS13),IA(NS14),A(NS15),
6 IERR)
END IF
c interpolate nodal variables
call debug('INTRPN')
CALL INTRPN(IA(NACON),A(NASOLN),IA(NS1),A(NS2),
& A(NBSOLN),IA(NBNDLST),A(NBX),A(NBY),A(NBZ),
& IDBLKB,A(NT1),INSUB,A(NSN))
c start element variable interpolation
c locate Mesh-B element centroid in Mesh-A
END IF
IF (NVAREL .GT. 0)THEN
call debug('BLDPTE')
CALL BLDPTE(A(NBX),A(NBY),A(NBZ),IA(NBCON),A(NS17))
IF (ITYPE .EQ. 10)THEN
call debug('SRCHH-element centroids')
CALL SRCHH (NODESA,NUMEBA,IA(NACON),A(NS16),
1 NUMEBB,A(NS17),TOLHEX,1,3,
2 NISS,NRSS,IA(NS1),A(NS2),LBLK,
3 IA(NS3),IA(NS4),IA(NS5),IA(NS6),IA(NS7),IA(NS8),
4 IA(NS9),
5 IA(NS10),IA(NS11),A(NS12),A(NS13),IA(NS14),A(NS15),
6 IERR)
ELSEIF (ITYPE .EQ. 6)THEN
call debug('SRCHT-element centroids')
CALL SRCHT (NODESA,NUMEBA,IA(NACON),A(NS16),
1 NUMEBB,A(NS17),TOLHEX,1,3,
2 NISS,NRSS,IA(NS1),A(NS2),LBLK,
3 IA(NS3),IA(NS4),IA(NS5),IA(NS6),IA(NS7),IA(NS8),
4 IA(NS9),
5 IA(NS10),IA(NS11),A(NS12),A(NS13),IA(NS14),A(NS15),
6 IERR)
END IF
IF (ISCHEM .EQ. 0)THEN
C Set up time steps
IF (ISTEP .EQ. -1)THEN
NTM = NTIMES
ELSE
NTM = 1
END IF
DO 670 IST = 1, NTM
IF (ISTEP .EQ. -1)THEN
ISTP = IST
ELSE
ISTP = ISTEP
END IF
call debug('ELTON0')
CALL ELTON0(IA(NACON),IA(NANELTN),A(NASOLE),
& A(NASOLEN),IDBLKA,A(NAX),A(NAY),A(NAZ),ISTP,
& IA(ITTB),IBLKB)
c interpolate element vars
call debug('INTRPE')
CALL INTRPE(IA(NACON),A(NASOLEN),IA(NS1),A(NS2),
1 A(NBSOLE),IDBLKB,A(NBX),A(NBY),A(NBZ),
2 IA(NBCON),IA(ITTB),IBLKB,A(NT1),
3 A(NS17),ISTP,IST,INSUB,ICOMPL,A(NSE))
670 CONTINUE
ELSE IF (ISCHEM .EQ. 1)THEN
call debug('INVCON')
CALL INVCON(IA(NAINVLN),MAXLN,IA(NAINVC),IA(NACON))
C Set up time steps
IF (ISTEP .EQ. -1)THEN
NTM = NTIMES
ELSE
NTM = 1
END IF
DO 680 IST = 1, NTM
IF (ISTEP .EQ. -1)THEN
ISTP = IST
ELSE
ISTP = ISTEP
END IF
call debug('ELTON1')
CALL ELTON1(A(NACTR),A(NASOLE),A(NASOLEN),IDBLKA,
& A(NAX),A(NAY),A(NAZ),IA(NACON),IA(NANDLST),
& IA(NAINVLN),IA(NAINVC),MAXLN,ISTP,
& IA(ITTB),IBLKB)
c interpolate element vars
call debug('INTRPE')
CALL INTRPE(IA(NACON),A(NASOLEN),IA(NS1),A(NS2),
1 A(NBSOLE),IDBLKB,A(NBX),A(NBY),A(NBZ),
2 IA(NBCON),IA(ITTB),IBLKB,A(NT1),
3 A(NS17),ISTP,IST,INSUB,ICOMPL,A(NSE))
680 CONTINUE
ELSE IF (ISCHEM .EQ. 2)THEN
c direct transfer from Mesh-A to Mesh-B
call debug('TRANAB')
CALL TRANAB(IA(NS1),A(NASOLE),A(NBSOLE),
& IDBLKA,IDBLKB,
& IA(ITTB),IBLKB,A(NT1),A(NS17),
& INSUB,ICOMPL,
& A(NBX),A(NBY),A(NBZ),IA(NBCON),A(NSE))
ELSE IF (ISCHEM .EQ. 3)THEN
call debug('INVCON')
CALL INVCON(IA(NAINVLN),MAXLN,IA(NAINVC),IA(NACON))
C Set up time steps
IF (ISTEP .EQ. -1)THEN
NTM = NTIMES
ELSE
NTM = 1
END IF
DO 690 IST = 1, NTM
IF (ISTEP .EQ. -1)THEN
ISTP = IST
ELSE
ISTP = ISTEP
END IF
call debug('ELGRAD')
CALL ELGRAD(A(NACTR),A(NAX),A(NAY),A(NAZ),
& A(NASOLE),A(NSOLGR),IA(NICHKE),
& IDBLKA,IA(NACON),IA(NAINVLN),IA(NAINVC),
& MAXLN,ISTP,IA(ITTB),IBLKB)
call debug('INTRP3')
CALL INTRP3(A(NACTR),A(NS17),IA(NS1),
& A(NBSOLE),A(NASOLE),A(NSOLGR),
& IDBLKB,IA(ITTB),IBLKB,A(NT1),
& ISTP,IST,INSUB,ICOMPL,
& A(NBX),A(NBY),A(NBZ),IA(NBCON),A(NSE))
690 CONTINUE
ELSE
CALL ERROR('MAPVAR',' ','ISCHEM =',
& ischem,'INCORRECT ARGUMENT',0,' ',' ',1)
END IF
END IF
ELSE
CALL ERROR ('MAPVAR','INCORRECT ELEMENT TYPE',
& 'ELEMENT TYPE =',ITYPE,
& 'NOT YET IMPLEMENTED',0,' ',' ',1)
END IF
IF (IACCU .EQ. 1)THEN
C velocities and mass are available, compute momenta and k.e.
C 1st set up storage for mass
IF (IELMS .NE. 0 .AND. IDENS .EQ. 0)THEN
C A(NEMSA) = EMSSA(1:NODESA) - element mass in mesh-A
C A(NEMSB) = EMSSB(1:NODESB) - element mass in mesh-B
CALL MDRSRV ('EMSSA', NEMSA, NUMEBA)
CALL MDRSRV ('DENSA', NDENA, 1)
CALL MDRSRV ('EMSSB', NEMSB, NUMEBB)
CALL MDRSRV ('DENSB', NDENB, 1)
CALL MDSTAT (MNERRS, MNUSED)
IF (MNERRS .NE. 0) THEN
CALL ERROR ('MAPVAR',
& 'MEMORY MANAGER ERROR',
& 'CHECK ACCURACY - ELEMENT MASS',
& 0,' ',0,' ',' ',1)
END IF
ELSE IF(IDENS .NE. 0)THEN
C A(NEMSA) = EMSSA(1:NUMEBA) - element mass in mesh-A
C A(NEMSB) = EMSSB(1:NUMEBB) - element mass in mesh-B
C A(NDENA) = DENSA(1:NUMEBA) - element density in mesh-A
C A(NDENB) = DENSB(1:NUMEBB) - element density in mesh-B
CALL MDRSRV ('EMSSA', NEMSA, NUMEBA)
CALL MDRSRV ('DENSA', NDENA, NUMEBA)
CALL MDRSRV ('EMSSB', NEMSB, NUMEBB)
CALL MDRSRV ('DENSB', NDENB, NUMEBB)
CALL MDSTAT (MNERRS, MNUSED)
IF (MNERRS .NE. 0) THEN
CALL ERROR ('MAPVAR',
& 'MEMORY MANAGER ERROR',
& 'CHECK ACCURACY - ELEMENT MASS',
& 0,' ',0,' ',' ',1)
END IF
END IF
IF (NDIMA .EQ. 3)THEN
C A(NSXXA) = SIGXXA(1:NUMEBA) - XX component of stress tensor
C A(NSYYA) = SIGYYA(1:NUMEBA) - YY component of stress tensor
C A(NSZZA) = SIGZZA(1:NUMEBA) - ZZ component of stress tensor
C A(NSXYA) = SIGXYA(1:NUMEBA) - XY component of stress tensor
C A(NSYZA) = SIGYZA(1:NUMEBA) - YZ component of stress tensor
C A(NSZXA) = SIGZXA(1:NUMEBA) - ZX component of stress tensor
C A(NSXXB) = SIGXXB(1:NUMEBB) - XX component of stress tensor
C A(NSYYB) = SIGYYB(1:NUMEBB) - YY component of stress tensor
C A(NSZZB) = SIGZZB(1:NUMEBB) - ZZ component of stress tensor
C A(NSXYB) = SIGXYB(1:NUMEBB) - XY component of stress tensor
C A(NSYZB) = SIGYZB(1:NUMEBB) - YZ component of stress tensor
C A(NSZXB) = SIGZXB(1:NUMEBB) - ZX component of stress tensor
CALL MDRSRV ('SIGXXA' , NSXXA, NUMEBA)
CALL MDRSRV ('SIGYYA' , NSYYA, NUMEBA)
CALL MDRSRV ('SIGZZA' , NSZZA, NUMEBA)
CALL MDRSRV ('SIGXYA' , NSXYA, NUMEBA)
CALL MDRSRV ('SIGYZA' , NSYZA, NUMEBA)
CALL MDRSRV ('SIGZXA' , NSZXA, NUMEBA)
CALL MDRSRV ('SIGXXB' , NSXXB, NUMEBB)
CALL MDRSRV ('SIGYYB' , NSYYB, NUMEBB)
CALL MDRSRV ('SIGZZB' , NSZZB, NUMEBB)
CALL MDRSRV ('SIGXYB' , NSXYB, NUMEBB)
CALL MDRSRV ('SIGYZB' , NSYZB, NUMEBB)
CALL MDRSRV ('SIGZXB' , NSZXB, NUMEBB)
CALL MDSTAT (MNERRS, MNUSED)
IF (MNERRS .NE. 0) THEN
CALL ERROR ('MAPVAR',
& 'MEMORY MANAGER ERROR',
& 'CHECK ACCURACY - ELEMENT MASS',
& 0,' ',0,' ',' ',1)
END IF
ELSE IF (NDIMA .EQ. 2)THEN
C A(NSXXA) = SIGXXA(1:NUMEBA) - XX component of stress tensor
C A(NSYYA) = SIGYYA(1:NUMEBA) - YY component of stress tensor
C A(NSZZA) = SIGZZA(1:NUMEBA) - ZZ component of stress tensor
C A(NSXYA) = SIGXYA(1:NUMEBA) - XY component of stress tensor
C A(NSXXB) = SIGXXB(1:NUMEBB) - XX component of stress tensor
C A(NSYYB) = SIGYYB(1:NUMEBB) - YY component of stress tensor
C A(NSZZB) = SIGZZB(1:NUMEBB) - ZZ component of stress tensor
C A(NSXYB) = SIGXYB(1:NUMEBB) - XY component of stress tensor
CALL MDRSRV ('SIGXXA' , NSXXA, NUMEBA)
CALL MDRSRV ('SIGYYA' , NSYYA, NUMEBA)
CALL MDRSRV ('SIGZZA' , NSZZA, NUMEBA)
CALL MDRSRV ('SIGXYA' , NSXYA, NUMEBA)
CALL MDRSRV ('SIGYZA' , NSYZA, 1)
CALL MDRSRV ('SIGZXA' , NSZXA, 1)
CALL MDRSRV ('SIGXXB' , NSXXB, NUMEBB)
CALL MDRSRV ('SIGYYB' , NSYYB, NUMEBB)
CALL MDRSRV ('SIGZZB' , NSZZB, NUMEBB)
CALL MDRSRV ('SIGXYB' , NSXYB, NUMEBB)
CALL MDRSRV ('SIGYZB' , NSYZB, 1)
CALL MDRSRV ('SIGZXB' , NSZXB, 1)
CALL MDSTAT (MNERRS, MNUSED)
IF (MNERRS .NE. 0) THEN
CALL ERROR ('MAPVAR',
& 'MEMORY MANAGER ERROR',
& 'CHECK ACCURACY - ELEMENT MASS',
& 0,' ',0,' ',' ',1)
END IF
END IF
C Set up time steps
IF (ISTEP .EQ. -1)THEN
NTM = NTIMES
ELSE
NTM = 1
END IF
DO 710 IST = 1, NTM
IF (ISTEP .EQ. -1)THEN
ISTP = IST
ELSE
ISTP = ISTEP
END IF
CALL MKEI(IST,ISTP,A(NT1),IDBLKA,IA(NACON),IA(NANDLST),
& A(NAX),A(NAY),A(NAZ),A(NVXA),A(NVYA),A(NVZA),
& A(NEMSA),A(NDENA),A(NNMSA),
& A(NTMXA),A(NTMYA),A(NTMZA),A(NTKEA),A(NTPSQA),
& A(NTJ2A),
& A(NSXXA),A(NSYYA),A(NSZZA),A(NSXYA),A(NSYZA),
& A(NSZXA),
& IDBLKB,IA(NBCON),IA(NBNDLST),
& A(NBX),A(NBY),A(NBZ),A(NVXB),A(NVYB),A(NVZB),
& A(NEMSB),A(NDENB),A(NNMSB),
& A(NTMXB),A(NTMYB),A(NTMZB),A(NTKEB),A(NTPSQB),
& A(NTJ2B),ICOMPL,
& A(NSXXB),A(NSYYB),A(NSZZB),A(NSXYB),A(NSYZB),
& A(NSZXB))
710 CONTINUE
CALL MDDEL ('EMSSA')
CALL MDDEL ('DENSA')
CALL MDDEL ('EMSSB')
CALL MDDEL ('DENSB')
CALL MDDEL ('SIGXXA')
CALL MDDEL ('SIGYYA')
CALL MDDEL ('SIGZZA')
CALL MDDEL ('SIGXYA')
CALL MDDEL ('SIGYZA')
CALL MDDEL ('SIGZXA')
CALL MDDEL ('SIGXXB')
CALL MDDEL ('SIGYYB')
CALL MDDEL ('SIGZZB')
CALL MDDEL ('SIGXYB')
CALL MDDEL ('SIGYZB')
CALL MDDEL ('SIGZXB')
END IF
C *****************************************************************
C CLEAN UP STUFF FOR NEXT ELEMENT BLOCK
C *****************************************************************
CALL MDDEL ('ISRCHR')
CALL MDDEL ('RSRCHR')
CALL MDDEL ('LIST')
CALL MDDEL ('IND')
CALL MDDEL ('IRNK')
CALL MDDEL ('IRNK2')
CALL MDDEL ('INDX')
CALL MDDEL ('ILO')
CALL MDDEL ('IUP')
CALL MDDEL ('IDP')
CALL MDDEL ('IDS')
CALL MDDEL ('XMIN')
CALL MDDEL ('XMAX')
CALL MDDEL ('ISCR')
CALL MDDEL ('RSCR')
CALL MDDEL ('XYZSRF')
CALL MDDEL ('XYZPTS')
CALL MDDEL ('ICONA')
CALL MDDEL ('ICONB')
CALL MDDEL ('NDLSTA')
CALL MDDEL ('NDLSTB')
CALL MDDEL ('SOLEA')
CALL MDDEL ('SOLEB')
IF (ISCHEM .EQ. 0)THEN
CALL MDDEL ('SOLENA')
CALL MDDEL ('NELTN')
ELSE IF (ISCHEM .EQ. 1)THEN
CALL MDDEL ('SOLENA')
CALL MDDEL ('INVLNA')
CALL MDDEL ('INVCN')
CALL MDDEL ('CNTRA')
ELSE IF (ISCHEM .EQ. 2)THEN
CONTINUE
ELSE IF (ISCHEM .EQ. 3)THEN
CALL MDDEL ('CNTRA')
CALL MDDEL ('INVLNA')
CALL MDDEL ('INVCN')
CALL MDDEL ('ICHKEL')
CALL MDDEL ('SOLGRA')
END IF
CALL MDDEL ('STATUS')
CALL MDSTAT (MNERRS, MNUSED)
IF (MNERRS .NE. 0) THEN
CALL MDEROR(NOUT)
END IF
50 CONTINUE
C *****************************************************************
C STOP COMMAND
C *****************************************************************
C CLOSE FILES AND STOP
CALL BANNR2(84,'NORMAL',NTPOUT)
CALL BANNR2(84,'EXIT',NTPOUT)
call debug('CLSFIL')
CALL CLSFIL
call addlog (qainfo(1))
call wrapup(qainfo(1))
call mdfree()
STOP
270 FORMAT (3X,/'DATA FROM MESH "A" (MESH & SOLUTION) FILE - ',A,
* //,10X,'HEADING - ',A,/)
280 FORMAT (10x,I1,'-DIMENSIONAL MODEL',/
& ,10X,'NUMBER OF NODES IN MESH A (nodesa) - ',I9,/
& ,10X,'NUMBER OF ELEMENTS IN MESH A (numela) - ',I9,/
& ,10X,'NUMBER OF ELEMENT BLOCKS IN A (nblksa) - ',I9)
290 FORMAT (3X,/,'DATA FROM MESH "B" (MESH) FILE - ',A,
* //,10X,'HEADING - ',A,/)
300 FORMAT (10x,I1,'-DIMENSIONAL MODEL',/
& ,10X,'NUMBER OF NODES IN MESH B (nodesb) - ',I7,/
& ,10X,'NUMBER OF ELEMENTS IN MESH B (numelb) - ',I7,/
& ,10X,'NUMBER OF ELEMENT BLOCKS IN B (nblksb) - ',I7)
320 FORMAT (10X,'CORRESPONDS TO MESH-A ELEMENT BLOCK ID',I7,/)
321 FORMAT (10X,'USING SEARCH BOX TOLERANCE ',F14.6,/)
330 FORMAT (10X,'WORKING ON MESH-B ELEMENT BLOCK ',I7,/
& ,10X,'ELEMENT BLOCK ID ',I7)
END
BLOCK DATA INITLZ
C ******************************************************************
C BLOCK DATA SUBROUTINE TO INITIALIZE VARIABLES STORED IN
C NAMED COMMON BLOCKS
C ******************************************************************
C...NOTE: Cannot include exodusII.inc in a block data routine.
PARAMETER (MXSTLN=32)
c CHARACTER*10 ELTYPE
include 'header.blk'
include 'ntpdat.blk'
include 'contrl.blk'
include 'amesh.blk'
include 'bmesh.blk'
include 'aexds1.blk'
include 'schdat.blk'
include 'tapes.blk'
include 'toldat.blk'
include 'varnpt.blk'
include 'varept.blk'
include 'debg.blk'
include 'inival.blk'
DATA HED/' '/
DATA NOUT,NTPOUT,NTP2,NTP3,NTP4/
1 6,7,12,13,14/
DATA (IFILES(I),I=1,5)/5*0/
DATA ISCHEM/1/
DATA IDEF/1/
DATA IDEBUG/0/
DATA IACCU/0/
DATA IXDIS,IYDIS,IZDIS,IXVEL,IYVEL,IZVEL/6*0/
DATA ISXX,ISYY,ISZZ,ISXY,ISYZ,ISZX,IELMS,IDENS/8*0/
DATA NUMELA,NODESA,NBLKSA,NDIMA,NELNDA/5*0/
DATA NUMELB,NODESB,NBLKSB,NDIMB,NELNDB/5*0/
DATA NQAREC,NVARGP,NVARNP,NVAREL/4*0/
c DATA (ELTYPE(I),I=1,13)/'TRI3','TRI6','QUAD4','QUAD8','QUAD9',
c 1 'TETRA4','TETRA10','PRISM6','PRISM15','HEX8','HEX20',
c 2 'HEX27','SHELL'/
C DATA (NNELM(I),I=1,13)/3,6,4,8,9,4,10,6,15,8,20,27,4/
DATA VALINI /0.0/
DATA TOLSHL,TOLQAD,TOLHEX,TOLTET,NISS,NRSS
* /0.01,0.01,0.01,0.01, 5,10/
C TOLSHL=extension of box around MESH-A shell element
C TOLQAD=extension of box around MESH-A quad element
C TOLHEX=extension of box around MESH-A hex element
C NISS=number of integer search scratch (=5)
C NRSS=number of real search scratch (=10)
DATA TOL,EPS,STRLMT,ITERMX/0.01,0.01,20.,20/
C TOL=difference in isoparametric coords after newton iteration (don't change)
C EPS=tolerance used in checking if point is within element or coincident
C with a node
C STRLMT=tolerance for isoparametric coords to lie within an element
END
subroutine getval(IMAP, IM, idblka, idblkb, ischem)
integer imap(3,*)
idblka = imap(1,im)
idblkb = imap(2,im)
ischem = imap(3,im)
return
end