xref: /phasta/M2N/src/readnblk.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen!  readnblk.f (pronounce "Reed and Block Dot Eff") contains:
2*59599516SKenneth E. Jansen!
3*59599516SKenneth E. Jansen!    module readarrays ("Red Arrays") -- contains the arrays that
4*59599516SKenneth E. Jansen!     are read in from binary files but not immediately blocked
5*59599516SKenneth E. Jansen!     through pointers.
6*59599516SKenneth E. Jansen!
7*59599516SKenneth E. Jansen!    subroutine readnblk ("Reed and Block") -- allocates space for
8*59599516SKenneth E. Jansen!     and reads data to be contained in module readarrays.  Reads
9*59599516SKenneth E. Jansen!     all remaining data and blocks them with pointers.
10*59599516SKenneth E. Jansen!
11*59599516SKenneth E. Jansen
12*59599516SKenneth E. Jansen
13*59599516SKenneth E. Jansen      module readarrays
14*59599516SKenneth E. Jansen
15*59599516SKenneth E. Jansen      real*8, allocatable :: point2x(:,:)
16*59599516SKenneth E. Jansen      real*8, allocatable :: qold(:,:)
17*59599516SKenneth E. Jansen      real*8, allocatable :: dwal(:)
18*59599516SKenneth E. Jansen      real*8, allocatable :: errors(:,:)
19*59599516SKenneth E. Jansen      real*8, allocatable :: ybar(:,:)
20*59599516SKenneth E. Jansen      real*8, allocatable :: yphbar(:,:,:)
21*59599516SKenneth E. Jansen      real*8, allocatable :: vort(:,:)
22*59599516SKenneth E. Jansen      real*8, allocatable :: uold(:,:)
23*59599516SKenneth E. Jansen      real*8, allocatable :: acold(:,:)
24*59599516SKenneth E. Jansen      integer, allocatable :: iBCtmp(:)
25*59599516SKenneth E. Jansen      real*8, allocatable :: BCinp(:,:)
26*59599516SKenneth E. Jansen
27*59599516SKenneth E. Jansen      integer, allocatable :: point2ilwork(:)
28*59599516SKenneth E. Jansen      integer, allocatable :: nBC(:)
29*59599516SKenneth E. Jansen      integer, allocatable :: point2iper(:)
30*59599516SKenneth E. Jansen      integer, allocatable :: point2ifath(:)
31*59599516SKenneth E. Jansen      integer, allocatable :: point2nsons(:)
32*59599516SKenneth E. Jansen
33*59599516SKenneth E. Jansen      end module
34*59599516SKenneth E. Jansen
35*59599516SKenneth E. Jansen
36*59599516SKenneth E. Jansen
37*59599516SKenneth E. Jansen      subroutine readnblk
38*59599516SKenneth E. Jansen!
39*59599516SKenneth E. Jansen      use readarrays
40*59599516SKenneth E. Jansen      include "commonM2N.h"
41*59599516SKenneth E. Jansen      include "mpif.h"
42*59599516SKenneth E. Jansen
43*59599516SKenneth E. Jansen!
44*59599516SKenneth E. Jansen      real*8, allocatable :: xread(:,:), qread(:,:), acread(:,:)
45*59599516SKenneth E. Jansen      real*8, allocatable ::  qreadN(:), qoldN(:,:)
46*59599516SKenneth E. Jansen      real*8, allocatable :: pID(:), vID(:), dwalN(:), ybarN(:,:)
47*59599516SKenneth E. Jansen      real*8, allocatable :: errorsN(:,:), yphbarN(:,:,:), vortN(:,:)
48*59599516SKenneth E. Jansen      real*8, allocatable :: qTota2as(:,:), qTota2ar(:,:)
49*59599516SKenneth E. Jansen      real*8, allocatable :: qrecv(:), qsend(:)
50*59599516SKenneth E. Jansen      real*8 :: qreadN1
51*59599516SKenneth E. Jansen      integer, allocatable :: iperread(:), iBCtmpread(:)
52*59599516SKenneth E. Jansen      integer, allocatable :: ilworkread(:), nBCread(:)
53*59599516SKenneth E. Jansen      integer, allocatable :: indexpart(:)
54*59599516SKenneth E. Jansen      integer, allocatable :: getinfo(:)
55*59599516SKenneth E. Jansen      character*10 cname2
56*59599516SKenneth E. Jansen      character*8 mach2
57*59599516SKenneth E. Jansen      character*30 fmt1
58*59599516SKenneth E. Jansen      character*255 fname1,fnamer, fnamelr
59*59599516SKenneth E. Jansen      character*255 warning
60*59599516SKenneth E. Jansen      integer :: igeomBAK, ibndc, irstin, ierr
61*59599516SKenneth E. Jansen      integer ::  icountN(numpe) ! integers read from headers
62*59599516SKenneth E. Jansen      integer :: intfromfile(50) ! integers read from headers
63*59599516SKenneth E. Jansen      integer :: maxvID(numpe),maxvIDout(numpe)
64*59599516SKenneth E. Jansen      integer :: nmap, ndim
65*59599516SKenneth E. Jansen      integer :: maxicountN, maxicountNglob, numvar, sumvar
66*59599516SKenneth E. Jansen      integer :: ncount, ifill, tag
67*59599516SKenneth E. Jansen      integer :: stat (MPI_STATUS_SIZE)
68*59599516SKenneth E. Jansen      integer :: ndofdwal,ndofybar,ndoferrors,ndofyphbar,ndofvort
69*59599516SKenneth E. Jansen      logical :: exmap, exinput
70*59599516SKenneth E. Jansen      integer ::  my_local_comm, my_local_size, my_local_rank
71*59599516SKenneth E. Jansen!ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
72*59599516SKenneth E. Jansen!cccccccccccccccccccccccccccccccccccccccc New PhastaIO Definition Part ccccccccccccccccccccccccccccccccccccccccc
73*59599516SKenneth E. Jansen
74*59599516SKenneth E. Jansen      integer :: descriptor, descriptorG, GPID, color, nfiles, nfields
75*59599516SKenneth E. Jansen      integer :: numparts, nppf, islesseqN
76*59599516SKenneth E. Jansen      integer :: ierr_io, numprocs, itmp, itmp2
77*59599516SKenneth E. Jansen      integer :: i, nonzero
78*59599516SKenneth E. Jansen      integer :: ireducemethod, isbinary, irstart, irstartmap, iybar
79*59599516SKenneth E. Jansen      integer :: ierror, numphavg, ivort, idwal, idebug, iphavg, irankN
80*59599516SKenneth E. Jansen      character*255 fname2, temp2
81*59599516SKenneth E. Jansen      character*64 temp1
82*59599516SKenneth E. Jansen
83*59599516SKenneth E. Jansen!ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
84*59599516SKenneth E. Jansen!ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
85*59599516SKenneth E. Jansen
86*59599516SKenneth E. Jansen!
87*59599516SKenneth E. Jansen!  Set some parameters for the reduce operation
88*59599516SKenneth E. Jansen!
89*59599516SKenneth E. Jansen!     0 for communication based approach with mpi_send and mpi_recv (recommended), 1 for file based approach (not maintained any more)
90*59599516SKenneth E. Jansen      ireducemethod = 0
91*59599516SKenneth E. Jansen
92*59599516SKenneth E. Jansen!     1 to write the restartMap* files in binary format, 0 in ascii (in conjunction with ireducemethod = 1)
93*59599516SKenneth E. Jansen      isbinary = 1
94*59599516SKenneth E. Jansen!
95*59599516SKenneth E. Jansen!     Read the input parameter for the the M2N reduction
96*59599516SKenneth E. Jansen!
97*59599516SKenneth E. Jansen!      open(unit=72,file='numstart.dat',status='old')
98*59599516SKenneth E. Jansen!      read(72,*) irstart
99*59599516SKenneth E. Jansen!      close(72)
100*59599516SKenneth E. Jansen
101*59599516SKenneth E. Jansen      if(myrank == 0) then
102*59599516SKenneth E. Jansen        write(*,*) 'Reading M2N_input.dat'
103*59599516SKenneth E. Jansen        fnamer='M2N_input.dat'
104*59599516SKenneth E. Jansen        inquire(file=fnamer,exist=exinput)
105*59599516SKenneth E. Jansen        if(exinput) then
106*59599516SKenneth E. Jansen          open(unit=72,file=fnamer,status='old')
107*59599516SKenneth E. Jansen          read(72,*) irstart
108*59599516SKenneth E. Jansen          read(72,*) irstartmap
109*59599516SKenneth E. Jansen          read(72,*) iybar
110*59599516SKenneth E. Jansen          read(72,*) ierror
111*59599516SKenneth E. Jansen          read(72,*) numphavg
112*59599516SKenneth E. Jansen          read(72,*) ivort
113*59599516SKenneth E. Jansen          read(72,*) idwal
114*59599516SKenneth E. Jansen          read(72,*) idebug
115*59599516SKenneth E. Jansen          close(72)
116*59599516SKenneth E. Jansen        else
117*59599516SKenneth E. Jansen           write(*,*) 'ERROR: Input file ',
118*59599516SKenneth E. Jansen     &                 trim(fnamer),' does not exist!'
119*59599516SKenneth E. Jansen        endif
120*59599516SKenneth E. Jansen
121*59599516SKenneth E. Jansen      endif
122*59599516SKenneth E. Jansen
123*59599516SKenneth E. Jansen      call mpi_barrier(mpi_comm_world, ierr)
124*59599516SKenneth E. Jansen      call mpi_bcast(exinput,1,MPI_LOGICAL,0,mpi_comm_world,ierr)
125*59599516SKenneth E. Jansen      if(.not. exinput) then ! M2N_input.dat does not exist. Quit
126*59599516SKenneth E. Jansen        return
127*59599516SKenneth E. Jansen      else ! broadcast the information read by rank 0
128*59599516SKenneth E. Jansen        call mpi_bcast(irstart,1,MPI_INTEGER,0,mpi_comm_world,ierr)
129*59599516SKenneth E. Jansen        call mpi_bcast(irstartmap,1,MPI_INTEGER,0,mpi_comm_world,ierr)
130*59599516SKenneth E. Jansen        call mpi_bcast(iybar,1,MPI_INTEGER,0,mpi_comm_world,ierr)
131*59599516SKenneth E. Jansen        call mpi_bcast(ierror,1,MPI_INTEGER,0,mpi_comm_world,ierr)
132*59599516SKenneth E. Jansen        call mpi_bcast(numphavg,1,MPI_INTEGER,0,mpi_comm_world,ierr)
133*59599516SKenneth E. Jansen        call mpi_bcast(ivort,1,MPI_INTEGER,0,mpi_comm_world,ierr)
134*59599516SKenneth E. Jansen        call mpi_bcast(idwal,1,MPI_INTEGER,0,mpi_comm_world,ierr)
135*59599516SKenneth E. Jansen        call mpi_bcast(idebug,1,MPI_INTEGER,0,mpi_comm_world,ierr)
136*59599516SKenneth E. Jansen      endif
137*59599516SKenneth E. Jansen
138*59599516SKenneth E. Jansen      if(myrank == 0 ) then
139*59599516SKenneth E. Jansen      ! Print some info
140*59599516SKenneth E. Jansen        write(*,*) 'The solution field is reduced by default'
141*59599516SKenneth E. Jansen
142*59599516SKenneth E. Jansen        if(iybar .gt. 0) then
143*59599516SKenneth E. Jansen          write(*,*) 'The ybar field will also be reduced'
144*59599516SKenneth E. Jansen          iybar = 1 ! security
145*59599516SKenneth E. Jansen        else
146*59599516SKenneth E. Jansen          write(*,*) 'The ybar field will NOT be reduced'
147*59599516SKenneth E. Jansen        endif
148*59599516SKenneth E. Jansen
149*59599516SKenneth E. Jansen        if(ierror .gt. 0) then
150*59599516SKenneth E. Jansen          write(*,*) 'The error field will also be reduced'
151*59599516SKenneth E. Jansen          ierror = 1 ! security
152*59599516SKenneth E. Jansen        else
153*59599516SKenneth E. Jansen          write(*,*) 'The error field will NOT be reduced'
154*59599516SKenneth E. Jansen        endif
155*59599516SKenneth E. Jansen
156*59599516SKenneth E. Jansen        if(numphavg .gt. 0) then
157*59599516SKenneth E. Jansen          write(*,*) 'The phase average fields (',numphavg,
158*59599516SKenneth E. Jansen     &                ') will also be reduced'
159*59599516SKenneth E. Jansen        else
160*59599516SKenneth E. Jansen          write(*,*) 'The phase average fields will NOT be reduced'
161*59599516SKenneth E. Jansen        endif
162*59599516SKenneth E. Jansen
163*59599516SKenneth E. Jansen        if(ivort .gt. 0) then
164*59599516SKenneth E. Jansen          write(*,*) 'The vorticity field will also be reduced'
165*59599516SKenneth E. Jansen          ivort = 1 ! security
166*59599516SKenneth E. Jansen        else
167*59599516SKenneth E. Jansen          write(*,*) 'The vorticity field will NOT be reduced'
168*59599516SKenneth E. Jansen        endif
169*59599516SKenneth E. Jansen
170*59599516SKenneth E. Jansen        if(idwal .gt. 0) then
171*59599516SKenneth E. Jansen          write(*,*) 'The dwal field will also be reduced'
172*59599516SKenneth E. Jansen          idwal = 1 ! security
173*59599516SKenneth E. Jansen        else
174*59599516SKenneth E. Jansen          write(*,*) 'The dwal field will NOT be reduced'
175*59599516SKenneth E. Jansen        endif
176*59599516SKenneth E. Jansen        write(*,*) ''
177*59599516SKenneth E. Jansen      endif
178*59599516SKenneth E. Jansen
179*59599516SKenneth E. Jansen      call mpi_barrier(mpi_comm_world, ierr)
180*59599516SKenneth E. Jansen      if(myrank == 0) then
181*59599516SKenneth E. Jansen        write(*,*) 'Reading the geombc-dat files'
182*59599516SKenneth E. Jansen      endif
183*59599516SKenneth E. Jansen
184*59599516SKenneth E. Jansen      lstep=irstart ! in case restart files have no fields
185*59599516SKenneth E. Jansen
186*59599516SKenneth E. Jansen      nfiles = nsynciofiles
187*59599516SKenneth E. Jansen      numparts = numpe !This is the common settings. Beware if you try to compute several parts per process
188*59599516SKenneth E. Jansen
189*59599516SKenneth E. Jansen      color = int(myrank/(numparts/nfiles)) !Should call the color routine in SyncIO here
190*59599516SKenneth E. Jansen      itmp2 = int(log10(float(color+1)))+1
191*59599516SKenneth E. Jansen      write (temp2,"('(''geombc-dat.'',i',i1,')')") itmp2
192*59599516SKenneth E. Jansen      write (fnamer,temp2) (color+1)
193*59599516SKenneth E. Jansen      fnamer = trim(fnamer)//char(0)
194*59599516SKenneth E. Jansen
195*59599516SKenneth E. Jansen      itwo=2
196*59599516SKenneth E. Jansen      ione=1
197*59599516SKenneth E. Jansen      ieleven=11
198*59599516SKenneth E. Jansen      itmp = int(log10(float(myrank+1)))+1
199*59599516SKenneth E. Jansen
200*59599516SKenneth E. Jansen      call queryphmpiio(fnamer, nfields, nppf);
201*59599516SKenneth E. Jansen      if (myrank == 0) then
202*59599516SKenneth E. Jansen        write(*,*) 'Number of fields in geombc-dat: ',nfields
203*59599516SKenneth E. Jansen        write(*,*) 'Number of parts per file geombc-dat: ',nppf
204*59599516SKenneth E. Jansen      endif
205*59599516SKenneth E. Jansen      call initphmpiio( nfields, nppf, nfiles, igeom,
206*59599516SKenneth E. Jansen     & 'read'//char(0))
207*59599516SKenneth E. Jansen      call openfile( fnamer, 'read'//char(0), igeom )
208*59599516SKenneth E. Jansen
209*59599516SKenneth E. Jansen      write (temp1,"('(''number of nodes@'',i',i1,',A1)')") itmp
210*59599516SKenneth E. Jansen      write (fname2,temp1) (myrank+1),'?'
211*59599516SKenneth E. Jansen      call readheader(igeom,fname2//char(0),numnp,ione,
212*59599516SKenneth E. Jansen     & 'integer'//char(0), iotype)
213*59599516SKenneth E. Jansen
214*59599516SKenneth E. Jansen      write (temp1,"('(''number of modes@'',i',i1,',A1)')") itmp
215*59599516SKenneth E. Jansen      write (fname2,temp1) (myrank+1),'?'
216*59599516SKenneth E. Jansen      call readheader(igeom,fname2//char(0),nshg,ione,
217*59599516SKenneth E. Jansen     & 'integer'//char(0), iotype)
218*59599516SKenneth E. Jansen
219*59599516SKenneth E. Jansen      write (temp1,"('(''number of interior elements@'',i',i1,',A1)')")
220*59599516SKenneth E. Jansen     &       itmp
221*59599516SKenneth E. Jansen      write (fname2,temp1) (myrank+1),'?'
222*59599516SKenneth E. Jansen      call readheader(igeom,fname2//char(0),numel,ione,
223*59599516SKenneth E. Jansen     & 'integer'//char(0), iotype)
224*59599516SKenneth E. Jansen
225*59599516SKenneth E. Jansen      write (temp1,"('(''number of boundary elements@'',i',i1,',A1)')")
226*59599516SKenneth E. Jansen     &       itmp
227*59599516SKenneth E. Jansen      write (fname2,temp1) (myrank+1),'?'
228*59599516SKenneth E. Jansen      call readheader(igeom,fname2//char(0),numelb,ione,
229*59599516SKenneth E. Jansen     & 'integer'//char(0),iotype)
230*59599516SKenneth E. Jansen
231*59599516SKenneth E. Jansen      write (temp1,
232*59599516SKenneth E. Jansen     & "('(''maximum number of element nodes@'',i',i1,',A1)')") itmp
233*59599516SKenneth E. Jansen      write (fname2,temp1) (myrank+1),'?'
234*59599516SKenneth E. Jansen      call readheader(igeom,fname2//char(0),nen,ione,
235*59599516SKenneth E. Jansen     &'integer'//char(0),iotype)
236*59599516SKenneth E. Jansen
237*59599516SKenneth E. Jansen      write (temp1,"('(''number of interior tpblocks@'',i',i1,',A1)')")
238*59599516SKenneth E. Jansen     &       itmp
239*59599516SKenneth E. Jansen      write (fname2,temp1) (myrank+1),'?'
240*59599516SKenneth E. Jansen      call readheader(igeom,fname2//char(0),nelblk,ione,
241*59599516SKenneth E. Jansen     & 'integer'//char(0) ,iotype)
242*59599516SKenneth E. Jansen
243*59599516SKenneth E. Jansen      write (temp1,"('(''number of boundary tpblocks@'',i',i1,',A1)')")
244*59599516SKenneth E. Jansen     &       itmp
245*59599516SKenneth E. Jansen      write (fname2,temp1) (myrank+1),'?'
246*59599516SKenneth E. Jansen      call readheader(igeom,fname2//char(0),nelblb,ione,
247*59599516SKenneth E. Jansen     & 'integer'//char(0), iotype)
248*59599516SKenneth E. Jansen
249*59599516SKenneth E. Jansen      write (temp1,
250*59599516SKenneth E. Jansen     & "('(''number of nodes with Dirichlet BCs@'',i',i1,',A1)')") itmp
251*59599516SKenneth E. Jansen      write (fname2,temp1) (myrank+1),'?'
252*59599516SKenneth E. Jansen      call readheader(igeom,fname2//char(0),numpbc,ione,
253*59599516SKenneth E. Jansen     & 'integer'//char(0),iotype)
254*59599516SKenneth E. Jansen
255*59599516SKenneth E. Jansen      write (temp1,"('(''number of shape functions@'',i',i1,',A1)')")
256*59599516SKenneth E. Jansen     &       itmp
257*59599516SKenneth E. Jansen      write (fname2,temp1) (myrank+1),'?'
258*59599516SKenneth E. Jansen      call readheader(igeom,fname2//char(0),ntopsh,ione,
259*59599516SKenneth E. Jansen     & 'integer'//char(0),iotype)
260*59599516SKenneth E. Jansen
261*59599516SKenneth E. Jansen!cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
262*59599516SKenneth E. Jansen!
263*59599516SKenneth E. Jansen!.... calculate the maximum number of boundary element nodes
264*59599516SKenneth E. Jansen!
265*59599516SKenneth E. Jansen      nenb = 0
266*59599516SKenneth E. Jansen      do i = 1, melCat
267*59599516SKenneth E. Jansen         if (nen .eq. nenCat(i,nsd)) nenb = max(nenCat(i,nsd-1), nenb)
268*59599516SKenneth E. Jansen      enddo
269*59599516SKenneth E. Jansen!
270*59599516SKenneth E. Jansen!
271*59599516SKenneth E. Jansen!.... setup some useful constants
272*59599516SKenneth E. Jansen!
273*59599516SKenneth E. Jansen      I3nsd  = nsd / 3          ! nsd=3 integer flag
274*59599516SKenneth E. Jansen      E3nsd  = float(I3nsd)     ! nsd=3 real    flag
275*59599516SKenneth E. Jansen!
276*59599516SKenneth E. Jansen      if(matflg(1,1).lt.0) then
277*59599516SKenneth E. Jansen         nflow = nsd + 1
278*59599516SKenneth E. Jansen      else
279*59599516SKenneth E. Jansen         nflow = nsd + 2
280*59599516SKenneth E. Jansen      endif
281*59599516SKenneth E. Jansen      ndof   = nsd + 2
282*59599516SKenneth E. Jansen      nsclr=impl(1)/100
283*59599516SKenneth E. Jansen      ndof=ndof+nsclr           ! number of sclr transport equations to solve
284*59599516SKenneth E. Jansen
285*59599516SKenneth E. Jansen      ndofBC = ndof + I3nsd     ! dimension of BC array
286*59599516SKenneth E. Jansen      ndiBCB = 2                ! dimension of iBCB array
287*59599516SKenneth E. Jansen      ndBCB  = ndof + 1         ! dimension of BCB array
288*59599516SKenneth E. Jansen!
289*59599516SKenneth E. Jansen      nsymdf = (ndof*(ndof + 1)) / 2 ! symm. d.o.f.'s
290*59599516SKenneth E. Jansen!
291*59599516SKenneth E. Jansen!.... ----------------------> Communication tasks <--------------------
292*59599516SKenneth E. Jansen!
293*59599516SKenneth E. Jansen      call closefile( igeom, "read"//char(0) )
294*59599516SKenneth E. Jansen      call finalizephmpiio( igeom )
295*59599516SKenneth E. Jansen
296*59599516SKenneth E. Jansen!
297*59599516SKenneth E. Jansen!.... Read restart files for the solution, dwal, error and ybar
298*59599516SKenneth E. Jansen!
299*59599516SKenneth E. Jansen      call mpi_barrier(mpi_comm_world, ierr)
300*59599516SKenneth E. Jansen      if(myrank == 0) then
301*59599516SKenneth E. Jansen        write(*,*)'Reading the restart-dat files for the s-d-e-y fields'
302*59599516SKenneth E. Jansen      endif
303*59599516SKenneth E. Jansen
304*59599516SKenneth E. Jansen      itmp=1
305*59599516SKenneth E. Jansen      if (irstart .gt. 0) itmp = int(log10(float(irstart+1)))+1
306*59599516SKenneth E. Jansen
307*59599516SKenneth E. Jansen      write (fmt1,"('(''restart-dat.'',i',i1,',1x)')") itmp
308*59599516SKenneth E. Jansen
309*59599516SKenneth E. Jansen      write (fnamer,fmt1) irstart
310*59599516SKenneth E. Jansen      fnamer = trim(fnamer) // cname2(color+1)
311*59599516SKenneth E. Jansen
312*59599516SKenneth E. Jansen      call queryphmpiio(fnamer//char(0), nfields, nppf);
313*59599516SKenneth E. Jansen      if (myrank == 0) then
314*59599516SKenneth E. Jansen        write(*,*) 'Number of fields in restart-dat: ',nfields
315*59599516SKenneth E. Jansen        write(*,*) 'Number of parts per file restart-dat: ',nppf
316*59599516SKenneth E. Jansen      endif
317*59599516SKenneth E. Jansen      call initphmpiio(nfields,nppf,nfiles,descriptor,
318*59599516SKenneth E. Jansen     & 'read'//char(0))
319*59599516SKenneth E. Jansen      call openfile( fnamer//char(0) ,
320*59599516SKenneth E. Jansen     & 'read'//char(0), descriptor )
321*59599516SKenneth E. Jansen
322*59599516SKenneth E. Jansen      ithree=3
323*59599516SKenneth E. Jansen!      call creadlist(irstin,ithree,nshg2,ndof2,lstep)
324*59599516SKenneth E. Jansen
325*59599516SKenneth E. Jansen      itmp = int(log10(float(myrank+1)))+1
326*59599516SKenneth E. Jansen      write (temp1,"('(''solution@'',i',i1,',A1)')") itmp
327*59599516SKenneth E. Jansen      write (fname1,temp1) (myrank+1),'?'
328*59599516SKenneth E. Jansen      fname1 = trim(fname1)
329*59599516SKenneth E. Jansen
330*59599516SKenneth E. Jansen!      print *, "Solution is : ", fname1
331*59599516SKenneth E. Jansen
332*59599516SKenneth E. Jansen      intfromfile=0
333*59599516SKenneth E. Jansen      call readheader(descriptor,fname1//char(0) ,intfromfile,
334*59599516SKenneth E. Jansen     & ithree,'integer'//char(0), iotype)
335*59599516SKenneth E. Jansen!
336*59599516SKenneth E. Jansen!.... read the values of primitive variables into q
337*59599516SKenneth E. Jansen!
338*59599516SKenneth E. Jansen
339*59599516SKenneth E. Jansen!      print *, "intfromfile(1) is ", intfromfile(1)
340*59599516SKenneth E. Jansen!      print *, "intfromfile(2) is ", intfromfile(2)
341*59599516SKenneth E. Jansen!      print *, "intfromfile(3) is ", intfromfile(3)
342*59599516SKenneth E. Jansen
343*59599516SKenneth E. Jansen      if(intfromfile(1).ne.0) then
344*59599516SKenneth E. Jansen         nshg2=intfromfile(1)
345*59599516SKenneth E. Jansen         ndof2=intfromfile(2)
346*59599516SKenneth E. Jansen         lstep=intfromfile(3)
347*59599516SKenneth E. Jansen         if(nshg2.ne.nshg) then
348*59599516SKenneth E. Jansen           write(*,*) 'ERROR: mistmatch between nshg '//
349*59599516SKenneth E. Jansen     &      'from the geombc and restart files',nshg,nshg2
350*59599516SKenneth E. Jansen         endif
351*59599516SKenneth E. Jansen
352*59599516SKenneth E. Jansen         ndof=ndof2
353*59599516SKenneth E. Jansen         allocate( qold(nshg,ndof2) )
354*59599516SKenneth E. Jansen         allocate( qread(nshg,ndof2) )
355*59599516SKenneth E. Jansen         iqsiz=nshg*ndof2
356*59599516SKenneth E. Jansen         call readdatablock(descriptor,fname1//char(0),qread,iqsiz,
357*59599516SKenneth E. Jansen     &                         'double'//char(0),iotype)
358*59599516SKenneth E. Jansen         qold(:,1:ndof)=qread(:,1:ndof)
359*59599516SKenneth E. Jansen         deallocate(qread)
360*59599516SKenneth E. Jansen      else
361*59599516SKenneth E. Jansen         if (myrank.eq.master) then
362*59599516SKenneth E. Jansen            if (matflg(1,1).eq.0) then ! compressible
363*59599516SKenneth E. Jansen               warning='WARNING: Solution is set to zero '//
364*59599516SKenneth E. Jansen     &                   '(with p and T to one)'
365*59599516SKenneth E. Jansen            else
366*59599516SKenneth E. Jansen               warning='WARNING: Solution is set to zero'
367*59599516SKenneth E. Jansen            endif
368*59599516SKenneth E. Jansen            write(*,*) warning
369*59599516SKenneth E. Jansen         endif
370*59599516SKenneth E. Jansen         qold=zero
371*59599516SKenneth E. Jansen         if (matflg(1,1).eq.0) then ! compressible
372*59599516SKenneth E. Jansen            qold(:,1)=one ! avoid zero pressure
373*59599516SKenneth E. Jansen            qold(:,nflow)=one ! avoid zero temperature
374*59599516SKenneth E. Jansen         endif
375*59599516SKenneth E. Jansen      endif
376*59599516SKenneth E. Jansen
377*59599516SKenneth E. Jansen!
378*59599516SKenneth E. Jansen!  Above this line is the usual loading of fields in readnblk.  Quite a bit of stuff has been removed.
379*59599516SKenneth E. Jansen!
380*59599516SKenneth E. Jansen
381*59599516SKenneth E. Jansen
382*59599516SKenneth E. Jansen!
383*59599516SKenneth E. Jansen! follow the usual convention for loading the ybar
384*59599516SKenneth E. Jansen!
385*59599516SKenneth E. Jansen      ndofybar=0
386*59599516SKenneth E. Jansen      if(iybar == 1) then
387*59599516SKenneth E. Jansen        itmp = int(log10(float(myrank+1)))+1
388*59599516SKenneth E. Jansen        write (temp1,"('(''ybar@'',i',i1,',a1)')") itmp
389*59599516SKenneth E. Jansen        write (fname1,temp1) (myrank+1),'?'
390*59599516SKenneth E. Jansen        fname1 = trim(fname1)
391*59599516SKenneth E. Jansen        intfromfile=0
392*59599516SKenneth E. Jansen        call readheader(descriptor,fname1//char(0),intfromfile,
393*59599516SKenneth E. Jansen     &     ithree,'integer'//char(0),iotype)
394*59599516SKenneth E. Jansen
395*59599516SKenneth E. Jansen        !nshg2=intfromfile(1)
396*59599516SKenneth E. Jansen        ndofybar=intfromfile(2)
397*59599516SKenneth E. Jansen        !lstep=intfromfile(3)
398*59599516SKenneth E. Jansen
399*59599516SKenneth E. Jansen        if(ndofybar .ne. 0) then
400*59599516SKenneth E. Jansen          allocate( ybar(nshg,ndofybar) )
401*59599516SKenneth E. Jansen          iqsiz=nshg*ndofybar
402*59599516SKenneth E. Jansen          call readdatablock(descriptor,fname1//char(0) ,ybar,iqsiz,
403*59599516SKenneth E. Jansen     &                   'double'//char(0),iotype)
404*59599516SKenneth E. Jansen        else
405*59599516SKenneth E. Jansen          if(myrank==0) then
406*59599516SKenneth E. Jansen            write(*,*) 'WARNING: ybar is missing in the restart files'
407*59599516SKenneth E. Jansen          endif
408*59599516SKenneth E. Jansen          iybar = 0
409*59599516SKenneth E. Jansen        endif
410*59599516SKenneth E. Jansen      endif
411*59599516SKenneth E. Jansen
412*59599516SKenneth E. Jansen!
413*59599516SKenneth E. Jansen! follow the usual convention for loading the error
414*59599516SKenneth E. Jansen!
415*59599516SKenneth E. Jansen      ndoferrors=0
416*59599516SKenneth E. Jansen      if(ierror == 1) then
417*59599516SKenneth E. Jansen        itmp = int(log10(float(myrank+1)))+1
418*59599516SKenneth E. Jansen        write (temp1,"('(''errors@'',i',i1,',a1)')") itmp
419*59599516SKenneth E. Jansen        write (fname1,temp1) (myrank+1),'?'
420*59599516SKenneth E. Jansen        fname1 = trim(fname1)
421*59599516SKenneth E. Jansen        intfromfile=0
422*59599516SKenneth E. Jansen        call readheader(descriptor,fname1//char(0),intfromfile,
423*59599516SKenneth E. Jansen     &     ithree,'integer'//char(0),iotype)
424*59599516SKenneth E. Jansen
425*59599516SKenneth E. Jansen        !nshg2=intfromfile(1)
426*59599516SKenneth E. Jansen        ndoferrors=intfromfile(2)
427*59599516SKenneth E. Jansen        !lstep=intfromfile(3)
428*59599516SKenneth E. Jansen
429*59599516SKenneth E. Jansen        if(ndoferrors .ne. 0) then
430*59599516SKenneth E. Jansen          allocate( errors(nshg,ndoferrors) )
431*59599516SKenneth E. Jansen          iqsiz=nshg*ndoferrors
432*59599516SKenneth E. Jansen          call readdatablock(descriptor,fname1//char(0),errors,iqsiz,
433*59599516SKenneth E. Jansen     &                   'double'//char(0),iotype)
434*59599516SKenneth E. Jansen        else
435*59599516SKenneth E. Jansen          if(myrank==0) then
436*59599516SKenneth E. Jansen            write(*,*) 'WARNING: errors is missing in the restart files'
437*59599516SKenneth E. Jansen          endif
438*59599516SKenneth E. Jansen          ierror = 0
439*59599516SKenneth E. Jansen        endif
440*59599516SKenneth E. Jansen      endif
441*59599516SKenneth E. Jansen
442*59599516SKenneth E. Jansen!
443*59599516SKenneth E. Jansen!     Read the phase_average fields
444*59599516SKenneth E. Jansen!
445*59599516SKenneth E. Jansen      ndofyphbar=0
446*59599516SKenneth E. Jansen      if(numphavg .gt. 0) then
447*59599516SKenneth E. Jansen        do iphavg = 1,numphavg
448*59599516SKenneth E. Jansen          itmp = int(log10(float(myrank+1)))+1
449*59599516SKenneth E. Jansen          itmp2 = int(log10(float(iphavg)))+1
450*59599516SKenneth E. Jansen          write (temp1,
451*59599516SKenneth E. Jansen     &            "('(''phase_average'',i',i1,',''@'',i',i1,',A1)')")
452*59599516SKenneth E. Jansen     &             itmp2, itmp
453*59599516SKenneth E. Jansen          write (fname1,temp1) iphavg,(myrank+1),'?'
454*59599516SKenneth E. Jansen          fname1 = trim(fname1)
455*59599516SKenneth E. Jansen          intfromfile=0
456*59599516SKenneth E. Jansen          call readheader(descriptor,fname1//char(0),intfromfile,
457*59599516SKenneth E. Jansen     &                  ithree,'integer'//char(0),iotype)
458*59599516SKenneth E. Jansen
459*59599516SKenneth E. Jansen          !nshg=intfromfile(1) !Do not use nshg and ndof from common.h here!
460*59599516SKenneth E. Jansen          ndofyphbar=intfromfile(2)
461*59599516SKenneth E. Jansen          !lstep=intfromfile(3)
462*59599516SKenneth E. Jansen
463*59599516SKenneth E. Jansen          if(ndofyphbar.ne.0) then
464*59599516SKenneth E. Jansen            ! Allocate some memory for the first ts only
465*59599516SKenneth E. Jansen            if(iphavg==1) then
466*59599516SKenneth E. Jansen              allocate( yphbar(nshg,ndofyphbar,numphavg) )
467*59599516SKenneth E. Jansen            endif
468*59599516SKenneth E. Jansen
469*59599516SKenneth E. Jansen            allocate( qread(nshg,ndofyphbar)  ) ; qread = 0.d0
470*59599516SKenneth E. Jansen            iqsiz = nshg*ndofyphbar
471*59599516SKenneth E. Jansen            call readdatablock(descriptor,fname1//char(0),qread,iqsiz,
472*59599516SKenneth E. Jansen     &                     'double'//char(0),iotype)
473*59599516SKenneth E. Jansen            yphbar(:,:,iphavg) = qread(:,:)
474*59599516SKenneth E. Jansen            deallocate(qread)
475*59599516SKenneth E. Jansen          else
476*59599516SKenneth E. Jansen            if(myrank==0) then
477*59599516SKenneth E. Jansen              write(*,*)'WARNING: phase_average is missing '//
478*59599516SKenneth E. Jansen     &            'in the restart files'
479*59599516SKenneth E. Jansen            endif
480*59599516SKenneth E. Jansen            numphavg = 0
481*59599516SKenneth E. Jansen            if(iphavg > 1) then
482*59599516SKenneth E. Jansen              deallocate(yphbar)
483*59599516SKenneth E. Jansen            endif
484*59599516SKenneth E. Jansen            exit
485*59599516SKenneth E. Jansen          endif
486*59599516SKenneth E. Jansen        enddo
487*59599516SKenneth E. Jansen      endif
488*59599516SKenneth E. Jansen
489*59599516SKenneth E. Jansen!
490*59599516SKenneth E. Jansen! follow the usual convention for loading the vorticity field
491*59599516SKenneth E. Jansen!
492*59599516SKenneth E. Jansen      ndofvort=0
493*59599516SKenneth E. Jansen      if(ivort == 1) then
494*59599516SKenneth E. Jansen        itmp = int(log10(float(myrank+1)))+1
495*59599516SKenneth E. Jansen        write (temp1,"('(''vorticity@'',i',i1,',a1)')") itmp
496*59599516SKenneth E. Jansen        write (fname1,temp1) (myrank+1),'?'
497*59599516SKenneth E. Jansen        fname1 = trim(fname1)
498*59599516SKenneth E. Jansen        intfromfile=0
499*59599516SKenneth E. Jansen        call readheader(descriptor,fname1//char(0),intfromfile,
500*59599516SKenneth E. Jansen     &     ithree,'integer'//char(0),iotype)
501*59599516SKenneth E. Jansen
502*59599516SKenneth E. Jansen        !nshg2=intfromfile(1)
503*59599516SKenneth E. Jansen        ndofvort=intfromfile(2)
504*59599516SKenneth E. Jansen        !lstep=intfromfile(3)
505*59599516SKenneth E. Jansen
506*59599516SKenneth E. Jansen        if(ndofvort .ne. 0) then
507*59599516SKenneth E. Jansen          allocate( vort(nshg,ndofvort) )
508*59599516SKenneth E. Jansen          iqsiz=nshg*ndofvort
509*59599516SKenneth E. Jansen          call readdatablock(descriptor,fname1//char(0) ,vort ,iqsiz,
510*59599516SKenneth E. Jansen     &                   'double'//char(0),iotype)
511*59599516SKenneth E. Jansen        else
512*59599516SKenneth E. Jansen          if(myrank==0) then
513*59599516SKenneth E. Jansen            write(*,*) 'WARNING: vorticity is missing '//
514*59599516SKenneth E. Jansen     &                 'in the restart files'
515*59599516SKenneth E. Jansen          endif
516*59599516SKenneth E. Jansen          ivort = 0
517*59599516SKenneth E. Jansen        endif
518*59599516SKenneth E. Jansen      endif
519*59599516SKenneth E. Jansen
520*59599516SKenneth E. Jansen
521*59599516SKenneth E. Jansen!
522*59599516SKenneth E. Jansen! follow the usual convention for loading the d2wal
523*59599516SKenneth E. Jansen!
524*59599516SKenneth E. Jansen      ndofdwal=0
525*59599516SKenneth E. Jansen      if(idwal == 1 ) then
526*59599516SKenneth E. Jansen        write (temp1,"('(''dwal@'',i',i1,',a1)')")
527*59599516SKenneth E. Jansen     &       itmp
528*59599516SKenneth E. Jansen        write (fname1,temp1) (myrank+1),'?'
529*59599516SKenneth E. Jansen        fname1 = trim(fname1)
530*59599516SKenneth E. Jansen        intfromfile=0
531*59599516SKenneth E. Jansen        call readheader(descriptor,fname1//char(0),intfromfile,
532*59599516SKenneth E. Jansen     &     ithree,'integer'//char(0),iotype)
533*59599516SKenneth E. Jansen
534*59599516SKenneth E. Jansen         !nshg2=intfromfile(1)
535*59599516SKenneth E. Jansen         ndofdwal=intfromfile(2)
536*59599516SKenneth E. Jansen         !lstep=intfromfile(3)
537*59599516SKenneth E. Jansen
538*59599516SKenneth E. Jansen        if(ndofdwal .ne. 0) then
539*59599516SKenneth E. Jansen          if(ndofdwal.ne.1) then
540*59599516SKenneth E. Jansen            warning='WARNING: ndofdwal not equal 1'
541*59599516SKenneth E. Jansen            write(*,*) warning, ndofdwal
542*59599516SKenneth E. Jansen          endif
543*59599516SKenneth E. Jansen          allocate( dwal(nshg) )
544*59599516SKenneth E. Jansen          iqsiz=nshg
545*59599516SKenneth E. Jansen          call readdatablock(descriptor,fname1//char(0), dwal, iqsiz,
546*59599516SKenneth E. Jansen     &                   'double'//char(0),iotype)
547*59599516SKenneth E. Jansen        else
548*59599516SKenneth E. Jansen          if(myrank==0) then
549*59599516SKenneth E. Jansen            write(*,*) 'WARNING: dwal is missing in the restart files'
550*59599516SKenneth E. Jansen          endif
551*59599516SKenneth E. Jansen          idwal = 0
552*59599516SKenneth E. Jansen        endif
553*59599516SKenneth E. Jansen      endif
554*59599516SKenneth E. Jansen
555*59599516SKenneth E. Jansen!
556*59599516SKenneth E. Jansen!.... close c-binary files
557*59599516SKenneth E. Jansen!
558*59599516SKenneth E. Jansen      call closefile( descriptor, "read"//char(0) )
559*59599516SKenneth E. Jansen      call finalizephmpiio( descriptor )
560*59599516SKenneth E. Jansen
561*59599516SKenneth E. Jansen!
562*59599516SKenneth E. Jansen!.... Read restart files for the vtx mapping between M and N parts
563*59599516SKenneth E. Jansen!
564*59599516SKenneth E. Jansen      call mpi_barrier(mpi_comm_world, ierr)
565*59599516SKenneth E. Jansen      if(myrank == 0) then
566*59599516SKenneth E. Jansen        write(*,*) 'Reading the restart-dat files for vtx mapping'
567*59599516SKenneth E. Jansen      endif
568*59599516SKenneth E. Jansen
569*59599516SKenneth E. Jansen      itmp=1
570*59599516SKenneth E. Jansen      if (irstartmap .gt. 0) itmp = int(log10(float(irstartmap+1)))+1
571*59599516SKenneth E. Jansen
572*59599516SKenneth E. Jansen      write (fmt1,"('(''restart-dat.'',i',i1,',1x)')") itmp
573*59599516SKenneth E. Jansen
574*59599516SKenneth E. Jansen      write (fnamer,fmt1) irstartmap
575*59599516SKenneth E. Jansen      fnamer = trim(fnamer) // cname2(color+1)
576*59599516SKenneth E. Jansen
577*59599516SKenneth E. Jansen      call queryphmpiio(fnamer//char(0), nfields, nppf);
578*59599516SKenneth E. Jansen      if (myrank == 0) then
579*59599516SKenneth E. Jansen        write(*,*) 'Number of fields in restart-dat: ',nfields
580*59599516SKenneth E. Jansen        write(*,*) 'Number of parts per file restart-dat: ',nppf
581*59599516SKenneth E. Jansen      endif
582*59599516SKenneth E. Jansen      call initphmpiio(nfields,nppf,nfiles,descriptor,
583*59599516SKenneth E. Jansen     & 'read'//char(0))
584*59599516SKenneth E. Jansen      call openfile( fnamer//char(0) ,
585*59599516SKenneth E. Jansen     & 'read'//char(0), descriptor )
586*59599516SKenneth E. Jansen
587*59599516SKenneth E. Jansen!
588*59599516SKenneth E. Jansen! follow the usual convention for loading the partid
589*59599516SKenneth E. Jansen!
590*59599516SKenneth E. Jansen      itmp = int(log10(float(myrank+1)))+1
591*59599516SKenneth E. Jansen       write (temp1,"('(''mapping_partid@'',i',i1,',A1)')")
592*59599516SKenneth E. Jansen     &          itmp
593*59599516SKenneth E. Jansen       write (fname1,temp1) (myrank+1),'?'
594*59599516SKenneth E. Jansen       fname1 = trim(fname1)
595*59599516SKenneth E. Jansen       intfromfile=0
596*59599516SKenneth E. Jansen       call readheader(descriptor,fname1//char(0),intfromfile,
597*59599516SKenneth E. Jansen     &        ithree,'integer'//char(0),iotype)
598*59599516SKenneth E. Jansen
599*59599516SKenneth E. Jansen       nshg2=intfromfile(1)
600*59599516SKenneth E. Jansen       nmap=intfromfile(2)
601*59599516SKenneth E. Jansen       !lstep=intfromfile(3) !lstep comes from another restart file
602*59599516SKenneth E. Jansen       if(nmap.ne.1) then
603*59599516SKenneth E. Jansen          warning='WARNING mapping_partid not equal 1'
604*59599516SKenneth E. Jansen          write(*,*) warning , nmap, intfromfile(1), intfromfile(2)
605*59599516SKenneth E. Jansen       endif
606*59599516SKenneth E. Jansen
607*59599516SKenneth E. Jansen       allocate( pID(nshg) )
608*59599516SKenneth E. Jansen       iqsiz=nshg
609*59599516SKenneth E. Jansen       call readdatablock(descriptor,fname1//char(0) ,pID,iqsiz,
610*59599516SKenneth E. Jansen     &                   'double'//char(0),iotype)
611*59599516SKenneth E. Jansen
612*59599516SKenneth E. Jansen!
613*59599516SKenneth E. Jansen! follow the usual convention for loading the vtxid
614*59599516SKenneth E. Jansen!
615*59599516SKenneth E. Jansen        write (temp1,"('(''mapping_vtxid@'',i',i1,',a1)')")
616*59599516SKenneth E. Jansen     &           itmp
617*59599516SKenneth E. Jansen        write (fname1,temp1) (myrank+1),'?'
618*59599516SKenneth E. Jansen        fname1 = trim(fname1)
619*59599516SKenneth E. Jansen        intfromfile=0
620*59599516SKenneth E. Jansen        call readheader(descriptor,fname1//char(0),intfromfile,
621*59599516SKenneth E. Jansen     &     ithree,'integer'//char(0),iotype)
622*59599516SKenneth E. Jansen
623*59599516SKenneth E. Jansen       nshg2=intfromfile(1)
624*59599516SKenneth E. Jansen       nmap=intfromfile(2)
625*59599516SKenneth E. Jansen       !lstep=intfromfile(3) !lstep comes from another restart file
626*59599516SKenneth E. Jansen       if(nmap.ne.1) then
627*59599516SKenneth E. Jansen          warning='warning mapping_partid not equal 1'
628*59599516SKenneth E. Jansen          write(*,*) warning , nmap
629*59599516SKenneth E. Jansen       endif
630*59599516SKenneth E. Jansen
631*59599516SKenneth E. Jansen       allocate( vid(nshg) )
632*59599516SKenneth E. Jansen       iqsiz=nshg
633*59599516SKenneth E. Jansen       call readdatablock(descriptor,fname1//char(0) ,vid,iqsiz,
634*59599516SKenneth E. Jansen     &                   'double'//char(0),iotype)
635*59599516SKenneth E. Jansen
636*59599516SKenneth E. Jansen!
637*59599516SKenneth E. Jansen!.... close c-binary files
638*59599516SKenneth E. Jansen!
639*59599516SKenneth E. Jansen      call closefile( descriptor, "read"//char(0) )
640*59599516SKenneth E. Jansen      call finalizephmpiio( descriptor )
641*59599516SKenneth E. Jansen
642*59599516SKenneth E. Jansen!
643*59599516SKenneth E. Jansen!  Debugging information
644*59599516SKenneth E. Jansen!
645*59599516SKenneth E. Jansen!      minvid=minval(vid)
646*59599516SKenneth E. Jansen!      write(*,*) minvid,myrank
647*59599516SKenneth E. Jansen!      do i=1,nshg
648*59599516SKenneth E. Jansen!      write(800+myrank,*) pID(i),vID(i),qold(i,1), qold(i,2)
649*59599516SKenneth E. Jansen!      ivID=vID(i)+0.1
650*59599516SKenneth E. Jansen!      ipID=pID(i)+0.1
651*59599516SKenneth E. Jansen!      write(900+myrank,*) ipID,ivID,qold(i,1), qold(i,2)
652*59599516SKenneth E. Jansen!      enddo
653*59599516SKenneth E. Jansen
654*59599516SKenneth E. Jansen!
655*59599516SKenneth E. Jansen! here starts the mapping code
656*59599516SKenneth E. Jansen!
657*59599516SKenneth E. Jansen
658*59599516SKenneth E. Jansen!  first, on each of the M parts, count the number of vertices on each of the
659*59599516SKenneth E. Jansen!  N parts and put the result in icountN for each of the M parts
660*59599516SKenneth E. Jansen!
661*59599516SKenneth E. Jansen      call mpi_barrier(mpi_comm_world, ierr)
662*59599516SKenneth E. Jansen      if(myrank == 0) then
663*59599516SKenneth E. Jansen        write(*,*) 'Computing the size of the mapped partition'
664*59599516SKenneth E. Jansen      endif
665*59599516SKenneth E. Jansen
666*59599516SKenneth E. Jansen      maxPID=0
667*59599516SKenneth E. Jansen      icountN=0
668*59599516SKenneth E. Jansen      do i=1,nshg
669*59599516SKenneth E. Jansen          ifileN=pID(i)+1.1
670*59599516SKenneth E. Jansen          icountN(ifileN)=icountN(ifileN)+1
671*59599516SKenneth E. Jansen          maxPID=max(maxPID,ifileN)
672*59599516SKenneth E. Jansen      enddo
673*59599516SKenneth E. Jansen!
674*59599516SKenneth E. Jansen!     ALLREDUCE so that every processor knows N the size of the mapped partition
675*59599516SKenneth E. Jansen!
676*59599516SKenneth E. Jansen      call MPI_ALLREDUCE (maxPID, maxPIDout, 1,
677*59599516SKenneth E. Jansen     &          MPI_INT, MPI_MAX, mpi_comm_world, ierr)
678*59599516SKenneth E. Jansen
679*59599516SKenneth E. Jansen      irankN=maxPIDout
680*59599516SKenneth E. Jansen
681*59599516SKenneth E. Jansen      call mpi_barrier(mpi_comm_world, ierr)
682*59599516SKenneth E. Jansen      if(myrank.eq.0) then
683*59599516SKenneth E. Jansen        write (*,*) 'M2N reduction with M =',
684*59599516SKenneth E. Jansen     &                        numpe, 'and N =',irankN
685*59599516SKenneth E. Jansen      endif
686*59599516SKenneth E. Jansen!
687*59599516SKenneth E. Jansen!     DEBUG echo to the screen the number of number of vtx that will be mapped to
688*59599516SKenneth E. Jansen!     each of the N for each of the M parts
689*59599516SKenneth E. Jansen!
690*59599516SKenneth E. Jansen      if (idebug == 1) then
691*59599516SKenneth E. Jansen        call mpi_barrier(mpi_comm_world, ierr)
692*59599516SKenneth E. Jansen        do i=1,numpe
693*59599516SKenneth E. Jansen          if(myrank == i) then
694*59599516SKenneth E. Jansen            write(*,926) myrank, (icountN(j),j=1,irankN)
695*59599516SKenneth E. Jansen          endif
696*59599516SKenneth E. Jansen          call mpi_barrier(mpi_comm_world, ierr)
697*59599516SKenneth E. Jansen        enddo
698*59599516SKenneth E. Jansen      endif
699*59599516SKenneth E. Jansen
700*59599516SKenneth E. Jansen!
701*59599516SKenneth E. Jansen!     Compute the max vertex ID for every N part
702*59599516SKenneth E. Jansen!
703*59599516SKenneth E. Jansen      call mpi_barrier(mpi_comm_world, ierr)
704*59599516SKenneth E. Jansen      if(myrank == 0) then
705*59599516SKenneth E. Jansen        write(*,*) 'Computing the max vertex ID for every N part'
706*59599516SKenneth E. Jansen      endif
707*59599516SKenneth E. Jansen
708*59599516SKenneth E. Jansen      maxvID(:)=0 !only maxvID(1:irankN) should have non-zero entries at the end of the program
709*59599516SKenneth E. Jansen      do i=1,nshg
710*59599516SKenneth E. Jansen        ifileN=pID(i)+1.1    !shift pID to start from 1
711*59599516SKenneth E. Jansen        intvID=(vID(i)+1.1)  !shift vID to start from 1
712*59599516SKenneth E. Jansen        maxvID(ifileN)=max(maxvID(ifileN),intvID)
713*59599516SKenneth E. Jansen      enddo
714*59599516SKenneth E. Jansen
715*59599516SKenneth E. Jansen!
716*59599516SKenneth E. Jansen!     Sanity check for maxvID
717*59599516SKenneth E. Jansen!
718*59599516SKenneth E. Jansen      do i=irankN+1,numpe
719*59599516SKenneth E. Jansen        if (maxvID(i) .ne. 0) then
720*59599516SKenneth E. Jansen           write(*,*) 'ERROR: maxvID(',i,') not equal to 0 on rank',
721*59599516SKenneth E. Jansen     &                 myrank
722*59599516SKenneth E. Jansen        endif
723*59599516SKenneth E. Jansen      enddo
724*59599516SKenneth E. Jansen!
725*59599516SKenneth E. Jansen!     ALLREDUCE so that every processor knows the number of vtx on each of the N
726*59599516SKenneth E. Jansen!     parts in the reduced partition. No need to reduce maxvID(irankN+1:numpe), as it should be 0
727*59599516SKenneth E. Jansen!
728*59599516SKenneth E. Jansen      call MPI_ALLREDUCE (maxvID, maxvIDout, irankN,
729*59599516SKenneth E. Jansen     &          MPI_INT, MPI_MAX, mpi_comm_world, ierr)
730*59599516SKenneth E. Jansen
731*59599516SKenneth E. Jansen!
732*59599516SKenneth E. Jansen!    echo debug information to the screen
733*59599516SKenneth E. Jansen!
734*59599516SKenneth E. Jansen      if (idebug == 1) then
735*59599516SKenneth E. Jansen        if(myrank.eq.0) write(*,*) 'Writing maxvID on each of N ranks'
736*59599516SKenneth E. Jansen        if(myrank.eq.0) write(*,926) (maxvIDout(j),j=1,irankN)
737*59599516SKenneth E. Jansen      endif
738*59599516SKenneth E. Jansen
739*59599516SKenneth E. Jansen!     Beware! maxvIDout does not represent the largest vID present in the parts
740*59599516SKenneth E. Jansen!     but the largest vID referenced in the parts through the mapping.
741*59599516SKenneth E. Jansen!     On part boundaries, it is possible to have unreferenced vID that will need
742*59599516SKenneth E. Jansen!     to be fixed through P2P communication.
743*59599516SKenneth E. Jansen
744*59599516SKenneth E. Jansen!
745*59599516SKenneth E. Jansen!     Allocate the memory for qoldN on N parts handled by ranks 1..N.
746*59599516SKenneth E. Jansen!     Memory available per comupte node could be improved by chosing others ranks
747*59599516SKenneth E. Jansen!
748*59599516SKenneth E. Jansen      call mpi_barrier(mpi_comm_world, ierr)
749*59599516SKenneth E. Jansen      if(myrank == 0) then
750*59599516SKenneth E. Jansen        write(*,*) 'Allocating memory for the reduced s-d-e-y vectors'
751*59599516SKenneth E. Jansen      endif
752*59599516SKenneth E. Jansen
753*59599516SKenneth E. Jansen      if(myrank.lt.irankN) then
754*59599516SKenneth E. Jansen        nshgN=maxvIDout(myrank+1) ! number of vtx on my part computed above
755*59599516SKenneth E. Jansen
756*59599516SKenneth E. Jansen        allocate(qoldN(nshgN,ndof))! size of my final mapped field array
757*59599516SKenneth E. Jansen        qoldN=-9.87654321e32       ! set to absurd, easily recognized value to find holes
758*59599516SKenneth E. Jansen
759*59599516SKenneth E. Jansen        if(iybar == 1) then
760*59599516SKenneth E. Jansen          allocate(ybarN(nshgN,ndofybar))   ! size of my final mapped field array
761*59599516SKenneth E. Jansen          ybarN=-9.87654321e32       ! set to absurd, easily recognized value to find holes
762*59599516SKenneth E. Jansen        endif
763*59599516SKenneth E. Jansen
764*59599516SKenneth E. Jansen        if(ierror == 1) then
765*59599516SKenneth E. Jansen          allocate(errorsN(nshgN,ndoferrors))   ! size of my final mapped field array
766*59599516SKenneth E. Jansen          errorsN=-9.87654321e32       ! set to absurd, easily recognized value to find holes
767*59599516SKenneth E. Jansen        endif
768*59599516SKenneth E. Jansen
769*59599516SKenneth E. Jansen        if(numphavg .gt. 0) then
770*59599516SKenneth E. Jansen          allocate(yphbarN(nshgN,ndofyphbar,numphavg))   ! size of my final mapped field array
771*59599516SKenneth E. Jansen          yphbarN=-9.87654321e32       ! set to absurd, easily recognized value to find holes
772*59599516SKenneth E. Jansen        endif
773*59599516SKenneth E. Jansen
774*59599516SKenneth E. Jansen        if(ivort == 1) then
775*59599516SKenneth E. Jansen          allocate( vortN(nshgN,ndofvort))
776*59599516SKenneth E. Jansen          vortN=-9.87654321e32
777*59599516SKenneth E. Jansen        endif
778*59599516SKenneth E. Jansen
779*59599516SKenneth E. Jansen        if(idwal == 1) then
780*59599516SKenneth E. Jansen          allocate(dwalN(nshgN))   ! size of my final mapped field array
781*59599516SKenneth E. Jansen          dwalN=-9.87654321e32       ! set to absurd, easily recognized value to find holes
782*59599516SKenneth E. Jansen        endif
783*59599516SKenneth E. Jansen
784*59599516SKenneth E. Jansen
785*59599516SKenneth E. Jansen      else ! Not used but sane, as passed to write_M2N
786*59599516SKenneth E. Jansen        allocate(qoldN(1,1))
787*59599516SKenneth E. Jansen        if(iybar == 1) then
788*59599516SKenneth E. Jansen          allocate(ybarN(1,1))
789*59599516SKenneth E. Jansen        endif
790*59599516SKenneth E. Jansen        if(ierror == 1) then
791*59599516SKenneth E. Jansen          allocate(errorsN(1,1))
792*59599516SKenneth E. Jansen        endif
793*59599516SKenneth E. Jansen        if(numphavg .gt. 0) then
794*59599516SKenneth E. Jansen          allocate(yphbarN(1,1,1))
795*59599516SKenneth E. Jansen        endif
796*59599516SKenneth E. Jansen        if(ivort == 1) then
797*59599516SKenneth E. Jansen          allocate(vortN(1,1))
798*59599516SKenneth E. Jansen        endif
799*59599516SKenneth E. Jansen        if(idwal == 1) then
800*59599516SKenneth E. Jansen          allocate(dwalN(1))
801*59599516SKenneth E. Jansen        endif
802*59599516SKenneth E. Jansen      endif
803*59599516SKenneth E. Jansen
804*59599516SKenneth E. Jansen!
805*59599516SKenneth E. Jansen!     Most important routine: build the qoldN array for the reduction of the solution from M to N
806*59599516SKenneth E. Jansen!
807*59599516SKenneth E. Jansen      call mpi_barrier(mpi_comm_world, ierr)
808*59599516SKenneth E. Jansen      if(myrank == 0) then
809*59599516SKenneth E. Jansen        write(*,*) 'Building the reduced field vectors'
810*59599516SKenneth E. Jansen      endif
811*59599516SKenneth E. Jansen
812*59599516SKenneth E. Jansen      if (ireducemethod  == 0) then
813*59599516SKenneth E. Jansen!
814*59599516SKenneth E. Jansen!       Communication approach through mpi_isend and mpi_irecv to limit memory consumption
815*59599516SKenneth E. Jansen!       and avoid disk access
816*59599516SKenneth E. Jansen!
817*59599516SKenneth E. Jansen        numvar = 1+ndof+ndofybar+ndoferrors
818*59599516SKenneth E. Jansen     &           +(numphavg*ndofyphbar)+ndofvort+ndofdwal
819*59599516SKenneth E. Jansen!        write(*,*) numvar,ndof,ndofybar,ndoferrors,numphavg,ndofyphbar,
820*59599516SKenneth E. Jansen!     &             ndofvort
821*59599516SKenneth E. Jansen        call mpi_barrier(mpi_comm_world, ierr)
822*59599516SKenneth E. Jansen        !1 for vtxid, ndof for solution, ndofdwal for dwal, ndoferrors for error, ndofybar for ybar
823*59599516SKenneth E. Jansen
824*59599516SKenneth E. Jansen        do irN = 0,irankN-1  ! every irN rank 1..N receives information from
825*59599516SKenneth E. Jansen
826*59599516SKenneth E. Jansen
827*59599516SKenneth E. Jansen          ! Get which of the numpe-1 ranks have some information to communicate to rank irN
828*59599516SKenneth E. Jansen          if (myrank == irN) then
829*59599516SKenneth E. Jansen            allocate(getinfo(numpe))
830*59599516SKenneth E. Jansen            getinfo(:) = 0
831*59599516SKenneth E. Jansen          endif
832*59599516SKenneth E. Jansen
833*59599516SKenneth E. Jansen          ifill = icountN(irN+1)
834*59599516SKenneth E. Jansen          call mpi_gather(ifill, 1, MPI_INT, getinfo, 1, MPI_INT,
835*59599516SKenneth E. Jansen     &                   irN, mpi_comm_world, ierr)
836*59599516SKenneth E. Jansen
837*59599516SKenneth E. Jansen!          if (myrank == irN) then
838*59599516SKenneth E. Jansen!            write(*,*) getinfo(:)
839*59599516SKenneth E. Jansen!          endif
840*59599516SKenneth E. Jansen
841*59599516SKenneth E. Jansen          do irM = 0,numpe-1 ! all the irM ranks 1..M
842*59599516SKenneth E. Jansen
843*59599516SKenneth E. Jansen! DEBUG
844*59599516SKenneth E. Jansen!            if (myrank == 0) then
845*59599516SKenneth E. Jansen!              write(*,*) 'NEW data exchange between irN:',
846*59599516SKenneth E. Jansen!     &                  irN,'and irM:',irM
847*59599516SKenneth E. Jansen!            endif
848*59599516SKenneth E. Jansen!            call mpi_barrier(mpi_comm_world, ierr)
849*59599516SKenneth E. Jansen!DEBUG
850*59599516SKenneth E. Jansen
851*59599516SKenneth E. Jansen            if (myrank == irN .and. myrank == irM) then ! no need to send the data. Already there so get them
852*59599516SKenneth E. Jansen!             write(*,*) '  myrank=irN=irM=',irN,' so treat data locally'
853*59599516SKenneth E. Jansen              do i=1,nshg
854*59599516SKenneth E. Jansen                ifileN = pID(i)+1.1 !shift to start from 1
855*59599516SKenneth E. Jansen                if(ifileN == irN+1) then ! these data need to be packed because rank irN is expecting them
856*59599516SKenneth E. Jansen                  intvID = vID(i)+1.1 ! shift to start from 1
857*59599516SKenneth E. Jansen                  ! Solution qoldN
858*59599516SKenneth E. Jansen                  do idof=1,ndof
859*59599516SKenneth E. Jansen                    qoldN(intvID,idof) = qold(i,idof)
860*59599516SKenneth E. Jansen                  enddo
861*59599516SKenneth E. Jansen                  ! ybarN
862*59599516SKenneth E. Jansen                  if(iybar==1) then
863*59599516SKenneth E. Jansen                    do idof=1,ndofybar
864*59599516SKenneth E. Jansen                      ybarN(intvID,idof) = ybar(i,idof)
865*59599516SKenneth E. Jansen                    enddo
866*59599516SKenneth E. Jansen                  endif
867*59599516SKenneth E. Jansen                  ! errorsN
868*59599516SKenneth E. Jansen                  if(ierror==1) then
869*59599516SKenneth E. Jansen                    do idof=1,ndoferrors
870*59599516SKenneth E. Jansen                      errorsN(intvID,idof) = errors(i,idof)
871*59599516SKenneth E. Jansen                    enddo
872*59599516SKenneth E. Jansen                  endif
873*59599516SKenneth E. Jansen                  ! phase average
874*59599516SKenneth E. Jansen                  if(numphavg .gt. 0) then
875*59599516SKenneth E. Jansen                    do iphavg = 1,numphavg
876*59599516SKenneth E. Jansen                      do idof=1,ndofyphbar
877*59599516SKenneth E. Jansen                        yphbarN(intvID,idof,iphavg) =
878*59599516SKenneth E. Jansen     &                        yphbar(i,idof,iphavg)
879*59599516SKenneth E. Jansen                      enddo
880*59599516SKenneth E. Jansen                    enddo
881*59599516SKenneth E. Jansen                  endif
882*59599516SKenneth E. Jansen                  ! vortN
883*59599516SKenneth E. Jansen                  if(ivort==1) then
884*59599516SKenneth E. Jansen                    do idof=1,ndofvort
885*59599516SKenneth E. Jansen                      vortN(intvID,idof) = vort(i,idof)
886*59599516SKenneth E. Jansen                    enddo
887*59599516SKenneth E. Jansen                  endif
888*59599516SKenneth E. Jansen                 ! Distance to the wall dwalN
889*59599516SKenneth E. Jansen                  if(idwal==1) then
890*59599516SKenneth E. Jansen                    dwalN(intvID) = dwal(i)
891*59599516SKenneth E. Jansen                  endif
892*59599516SKenneth E. Jansen               endif
893*59599516SKenneth E. Jansen              enddo
894*59599516SKenneth E. Jansen
895*59599516SKenneth E. Jansen            else !myrank ne to irN and irM
896*59599516SKenneth E. Jansen              tag=irN
897*59599516SKenneth E. Jansen              if(myrank == irN) then
898*59599516SKenneth E. Jansen                ! rank irN receives data from rank j and update qoldN.
899*59599516SKenneth E. Jansen!                call mpi_recv(ifill, 1, MPI_INTEGER, irM, tag,
900*59599516SKenneth E. Jansen!     &                                    mpi_comm_world, stat, ierr)
901*59599516SKenneth E. Jansen!                write(*,*) '  ', irN,'receives',ifill,getinfo(irM+1),
902*59599516SKenneth E. Jansen!     &                     'data from',irM
903*59599516SKenneth E. Jansen                ifill = getinfo(irM+1)
904*59599516SKenneth E. Jansen                if(ifill .gt. 0) then
905*59599516SKenneth E. Jansen                  ! there are really data to receive
906*59599516SKenneth E. Jansen!                  write(*,*) '  ', irN,'receives',ifill,'data from',irM
907*59599516SKenneth E. Jansen                  allocate(qrecv(ifill*numvar))
908*59599516SKenneth E. Jansen                  qrecv = -9.87654321e32
909*59599516SKenneth E. Jansen                  call mpi_recv(qrecv, ifill*numvar, MPI_DOUBLE, irM,
910*59599516SKenneth E. Jansen     &                                tag, mpi_comm_world, stat, ierr)
911*59599516SKenneth E. Jansen                  do i=1,ifill
912*59599516SKenneth E. Jansen                    intvID = qrecv( (i-1)*numvar+1 )+1.1 ! shift to start from 1
913*59599516SKenneth E. Jansen                    ! Solution qold
914*59599516SKenneth E. Jansen                    do idof=1,ndof
915*59599516SKenneth E. Jansen                      sumvar = 1+idof
916*59599516SKenneth E. Jansen                      qoldN(intvID,idof) = qrecv( (i-1)*numvar+sumvar )
917*59599516SKenneth E. Jansen                    enddo
918*59599516SKenneth E. Jansen                    ! ybarN
919*59599516SKenneth E. Jansen                    if(iybar==1) then
920*59599516SKenneth E. Jansen                      do idof=1,ndofybar
921*59599516SKenneth E. Jansen                        sumvar = 1+ndof+idof
922*59599516SKenneth E. Jansen                        ybarN(intvID,idof) = qrecv( (i-1)*numvar+sumvar)
923*59599516SKenneth E. Jansen                      enddo
924*59599516SKenneth E. Jansen                    endif
925*59599516SKenneth E. Jansen                    ! errorN
926*59599516SKenneth E. Jansen                    if(ierror==1) then
927*59599516SKenneth E. Jansen                      do idof=1,ndoferrors
928*59599516SKenneth E. Jansen                        sumvar = 1+ndof+ndofybar+idof
929*59599516SKenneth E. Jansen                        errorsN(intvID,idof) =
930*59599516SKenneth E. Jansen     &                            qrecv( (i-1)*numvar+sumvar)
931*59599516SKenneth E. Jansen                      enddo
932*59599516SKenneth E. Jansen                    endif
933*59599516SKenneth E. Jansen                    ! yphbarN
934*59599516SKenneth E. Jansen                    if(numphavg .gt. 0) then
935*59599516SKenneth E. Jansen                      do iphavg = 1,numphavg
936*59599516SKenneth E. Jansen                        do idof=1,ndofyphbar
937*59599516SKenneth E. Jansen                          sumvar = 1+ndof+ndofybar+ndoferrors+
938*59599516SKenneth E. Jansen     &                                    (iphavg-1)*ndofyphbar+idof
939*59599516SKenneth E. Jansen                          yphbarN(intvID,idof,iphavg) =
940*59599516SKenneth E. Jansen     &                                     qrecv( (i-1)*numvar+sumvar)
941*59599516SKenneth E. Jansen                        enddo
942*59599516SKenneth E. Jansen                      enddo
943*59599516SKenneth E. Jansen                    endif
944*59599516SKenneth E. Jansen                    ! vortN
945*59599516SKenneth E. Jansen                    if(ivort==1) then
946*59599516SKenneth E. Jansen                      do idof=1,ndofvort
947*59599516SKenneth E. Jansen                        sumvar = 1+ndof+ndofybar+ndoferrors+
948*59599516SKenneth E. Jansen     &                                    numphavg*ndofyphbar+idof
949*59599516SKenneth E. Jansen                        vortN(intvID,idof) =
950*59599516SKenneth E. Jansen     &                            qrecv( (i-1)*numvar+sumvar)
951*59599516SKenneth E. Jansen                      enddo
952*59599516SKenneth E. Jansen                    endif
953*59599516SKenneth E. Jansen                    ! Distance to the wall dwalN
954*59599516SKenneth E. Jansen                    if(idwal==1) then
955*59599516SKenneth E. Jansen                      sumvar = 1+ndof+ndofybar+ndoferrors+
956*59599516SKenneth E. Jansen     &                         numphavg*ndofyphbar+ndofvort+1
957*59599516SKenneth E. Jansen                      dwalN(intvID) = qrecv ( (i-1)*numvar+sumvar)
958*59599516SKenneth E. Jansen                    endif
959*59599516SKenneth E. Jansen                  enddo
960*59599516SKenneth E. Jansen                  deallocate(qrecv)
961*59599516SKenneth E. Jansen                endif
962*59599516SKenneth E. Jansen
963*59599516SKenneth E. Jansen              elseif(myrank == irM) then ! rank irM sends data to rank irN
964*59599516SKenneth E. Jansen                ! First build the data to send to rank i for qoldN
965*59599516SKenneth E. Jansen                ifill = 0
966*59599516SKenneth E. Jansen                if (icountN(irN+1) .gt. 0) then !there are data to transfer
967*59599516SKenneth E. Jansen                  allocate(qsend(icountN(irN+1)*numvar))
968*59599516SKenneth E. Jansen                  qsend(:) = -9.87654321e32
969*59599516SKenneth E. Jansen                  do i=1,nshg
970*59599516SKenneth E. Jansen                    ifileN = pID(i)+1.1 !shift to start from 1
971*59599516SKenneth E. Jansen                    if(ifileN == irN+1) then
972*59599516SKenneth E. Jansen                      ! these data need to be packed because rank irN is expecting them
973*59599516SKenneth E. Jansen                      ifill = ifill+1
974*59599516SKenneth E. Jansen                      ! vtx ID
975*59599516SKenneth E. Jansen                      qsend( (ifill-1)*numvar+1) = vID(i) ! no shift to start from 1 yet
976*59599516SKenneth E. Jansen                      ! Solution qold
977*59599516SKenneth E. Jansen                      do idof=1,ndof
978*59599516SKenneth E. Jansen                        sumvar = 1+idof
979*59599516SKenneth E. Jansen                        qsend( (ifill-1)*numvar+sumvar) = qold(i,idof)
980*59599516SKenneth E. Jansen                      enddo
981*59599516SKenneth E. Jansen                      ! ybar
982*59599516SKenneth E. Jansen                      if(iybar==1) then
983*59599516SKenneth E. Jansen                        do idof=1,ndofybar
984*59599516SKenneth E. Jansen                          sumvar = 1+ndof+idof
985*59599516SKenneth E. Jansen                          qsend( (ifill-1)*numvar+sumvar) = ybar(i,idof)
986*59599516SKenneth E. Jansen                        enddo
987*59599516SKenneth E. Jansen                      endif
988*59599516SKenneth E. Jansen                     ! errors
989*59599516SKenneth E. Jansen                      if(ierror==1) then
990*59599516SKenneth E. Jansen                        do idof=1,ndoferrors
991*59599516SKenneth E. Jansen                          sumvar = 1+ndof+ndofybar+idof
992*59599516SKenneth E. Jansen                          qsend( (ifill-1)*numvar+sumvar) =
993*59599516SKenneth E. Jansen     &                                                 errors(i,idof)
994*59599516SKenneth E. Jansen                        enddo
995*59599516SKenneth E. Jansen                      endif
996*59599516SKenneth E. Jansen                      ! yphbarN
997*59599516SKenneth E. Jansen                      if(numphavg .gt. 0) then
998*59599516SKenneth E. Jansen                        do iphavg = 1,numphavg
999*59599516SKenneth E. Jansen                          do idof=1,ndofyphbar
1000*59599516SKenneth E. Jansen                            sumvar = 1+ndof+ndofybar+ndoferrors+
1001*59599516SKenneth E. Jansen     &                                    (iphavg-1)*ndofyphbar+idof
1002*59599516SKenneth E. Jansen                            qsend( (ifill-1)*numvar+sumvar) =
1003*59599516SKenneth E. Jansen     &                                            yphbar(i,idof,iphavg)
1004*59599516SKenneth E. Jansen                          enddo
1005*59599516SKenneth E. Jansen                        enddo
1006*59599516SKenneth E. Jansen                      endif
1007*59599516SKenneth E. Jansen                      ! vortN
1008*59599516SKenneth E. Jansen                      if(ivort==1) then
1009*59599516SKenneth E. Jansen                        do idof=1,ndofvort
1010*59599516SKenneth E. Jansen                          sumvar = 1+ndof+ndofybar+ndoferrors+
1011*59599516SKenneth E. Jansen     &                                    numphavg*ndofyphbar+idof
1012*59599516SKenneth E. Jansen                          qsend( (ifill-1)*numvar+sumvar) =
1013*59599516SKenneth E. Jansen     &                                          vort(i,idof)
1014*59599516SKenneth E. Jansen                        enddo
1015*59599516SKenneth E. Jansen                      endif
1016*59599516SKenneth E. Jansen                      ! Distance to the wall dwal
1017*59599516SKenneth E. Jansen                      if(idwal==1) then
1018*59599516SKenneth E. Jansen                        sumvar = 1+ndof+ndofybar+ndoferrors+
1019*59599516SKenneth E. Jansen     &                           numphavg*ndofyphbar+ndofvort+1
1020*59599516SKenneth E. Jansen                        qsend( (ifill-1)*numvar+sumvar) = dwal(i)
1021*59599516SKenneth E. Jansen                      endif
1022*59599516SKenneth E. Jansen                    endif
1023*59599516SKenneth E. Jansen                  enddo
1024*59599516SKenneth E. Jansen                endif
1025*59599516SKenneth E. Jansen                if(ifill .ne. icountN(irN+1)) then
1026*59599516SKenneth E. Jansen                  write(*,*) 'ERROR with data set:', irM, irN,
1027*59599516SKenneth E. Jansen     &                                   ifill, icountN(irN+1)
1028*59599516SKenneth E. Jansen                endif
1029*59599516SKenneth E. Jansen!                write(*,*) '  ', irM,'sends', ifill,'data to',irN
1030*59599516SKenneth E. Jansen!                call mpi_send(ifill, 1 ,MPI_INTEGER, irN, tag,
1031*59599516SKenneth E. Jansen!     &                                          mpi_comm_world, ierr) ! Send the size of the data
1032*59599516SKenneth E. Jansen                if(ifill .gt. 0) then !if the size of the data is >0, send it for good
1033*59599516SKenneth E. Jansen!                  write(*,*) '  ', irM,'sends', ifill,'data to',irN
1034*59599516SKenneth E. Jansen                  call mpi_send(qsend(1), ifill*numvar, MPI_DOUBLE, irN,
1035*59599516SKenneth E. Jansen     &                                      tag, mpi_comm_world, ierr)
1036*59599516SKenneth E. Jansen                  deallocate(qsend)
1037*59599516SKenneth E. Jansen                endif
1038*59599516SKenneth E. Jansen
1039*59599516SKenneth E. Jansen              endif !if(myrank==irN)
1040*59599516SKenneth E. Jansen            endif !if (myrank == irN = irM)
1041*59599516SKenneth E. Jansen
1042*59599516SKenneth E. Jansen          enddo !loop over irM
1043*59599516SKenneth E. Jansen
1044*59599516SKenneth E. Jansen          call mpi_barrier(mpi_comm_world,ierr)
1045*59599516SKenneth E. Jansen          if (myrank == irN) then
1046*59599516SKenneth E. Jansen            nonzero = 0
1047*59599516SKenneth E. Jansen            do i = 1,numpe
1048*59599516SKenneth E. Jansen              if (getinfo(i) .gt. 0) then
1049*59599516SKenneth E. Jansen                nonzero = nonzero +1
1050*59599516SKenneth E. Jansen              endif
1051*59599516SKenneth E. Jansen            enddo
1052*59599516SKenneth E. Jansen            write(*,*)"Part ",irN,"out of N = ",irankN," updated from",
1053*59599516SKenneth E. Jansen     &                nonzero, "parts"
1054*59599516SKenneth E. Jansen            deallocate(getinfo)
1055*59599516SKenneth E. Jansen          endif
1056*59599516SKenneth E. Jansen        enddo !loop over irN
1057*59599516SKenneth E. Jansen
1058*59599516SKenneth E. Jansen!
1059*59599516SKenneth E. Jansen!       Do it without files through mpialltoall
1060*59599516SKenneth E. Jansen!
1061*59599516SKenneth E. Jansen!      maxicountN=maxval(icountN(:))
1062*59599516SKenneth E. Jansen!      call MPI_ALLREDUCE (maxicountN, maxicountNglob, 1,
1063*59599516SKenneth E. Jansen!     &          MPI_INT, MPI_MAX, mpi_comm_world, ierr)
1064*59599516SKenneth E. Jansen!
1065*59599516SKenneth E. Jansen!      numvar = 1+ndof ! vID + ndof from solution
1066*59599516SKenneth E. Jansen!      write(*,*) 'maxicountN:',myrank, maxicountN, maxicountNglob, nshg
1067*59599516SKenneth E. Jansen!      call mpi_barrier(mpi_comm_world, ierr)
1068*59599516SKenneth E. Jansen!      allocate(qTota2as(numvar*maxicountNglob,numpe))
1069*59599516SKenneth E. Jansen!      qTota2as(:,:) = -9.87654321e32
1070*59599516SKenneth E. Jansen
1071*59599516SKenneth E. Jansen!      allocate(indexpart(numpe)); indexpart(:)=0
1072*59599516SKenneth E. Jansen!      do i=1,nshg
1073*59599516SKenneth E. Jansen!        ifileN = pID(i)+1.1                              !shift pID to start from 1
1074*59599516SKenneth E. Jansen!        indexpart(ifileN) = indexpart(ifileN)+1
1075*59599516SKenneth E. Jansen!        qTota2as( (indexpart(ifileN)-1)*numvar+1 , ifileN ) = vID(i)   ! vID not yet shifted to start from 1 here
1076*59599516SKenneth E. Jansen!        do j=1,ndof
1077*59599516SKenneth E. Jansen!
1078*59599516SKenneth E. Jansen!         if((indexpart(ifileN)-1)*numvar+1+j>numvar*maxicountNglob) then
1079*59599516SKenneth E. Jansen!            write(*,*) 'ERROR DIMENSION1:',myrank,
1080*59599516SKenneth E. Jansen!     &       ifileN, indexpart(ifileN),
1081*59599516SKenneth E. Jansen!     &       (indexpart(ifileN)-1)*numvar+1+j, numvar*maxicountNglob
1082*59599516SKenneth E. Jansen!          endif
1083*59599516SKenneth E. Jansen!          if (ifileN > numpe ) then
1084*59599516SKenneth E. Jansen!              write(*,*) 'ERROR DIMENSION2:',myrank, ifileN, numpe
1085*59599516SKenneth E. Jansen!          endif
1086*59599516SKenneth E. Jansen!          qTota2as( (indexpart(ifileN)-1)*numvar+1+j, ifileN )=qold(i,j)
1087*59599516SKenneth E. Jansen!        enddo
1088*59599516SKenneth E. Jansen!      enddo
1089*59599516SKenneth E. Jansen
1090*59599516SKenneth E. Jansen!      allocate(qTota2ar(numvar*maxicountNglob,numpe))
1091*59599516SKenneth E. Jansen!      qTota2ar(:,:) = -9.87654321e32
1092*59599516SKenneth E. Jansen
1093*59599516SKenneth E. Jansen!      ncount = numvar*maxicountNglob
1094*59599516SKenneth E. Jansen!      call mpi_alltoall(qTota2as(1,1), ncount, MPI_DOUBLE,
1095*59599516SKenneth E. Jansen!     &                  qTota2ar(1,1), ncount, MPI_DOUBLE,
1096*59599516SKenneth E. Jansen!     &                  mpi_comm_world, ierr)
1097*59599516SKenneth E. Jansen!      if (ierr .ne. 0) then
1098*59599516SKenneth E. Jansen!        write(*,*) 'Error with mpi_alltoall:', myrank, ierr
1099*59599516SKenneth E. Jansen!      endif
1100*59599516SKenneth E. Jansen!      deallocate(qTota2as)
1101*59599516SKenneth E. Jansen
1102*59599516SKenneth E. Jansen
1103*59599516SKenneth E. Jansen      elseif (ireducemethod == 1) then ! file based approach
1104*59599516SKenneth E. Jansen!
1105*59599516SKenneth E. Jansen!       Now for each process on M parts push the fields into an i,j pair named
1106*59599516SKenneth E. Jansen!       ascii file  restartMap.i.j   1<=i<=N  1<=j<=M.  This is embarassingly
1107*59599516SKenneth E. Jansen!       parallel with no data collision but writes a lot of files
1108*59599516SKenneth E. Jansen!
1109*59599516SKenneth E. Jansen        do l=1,irankN
1110*59599516SKenneth E. Jansen          if(icountN(l).gt.0) then  !  I have data to write for rank l
1111*59599516SKenneth E. Jansen!
1112*59599516SKenneth E. Jansen!           generate the filename since this is a file we have to write
1113*59599516SKenneth E. Jansen!           note this avoids opening files we don't need but each rank does open
1114*59599516SKenneth E. Jansen!           all the files it will need to write to....lots of files=weakness
1115*59599516SKenneth E. Jansen!
1116*59599516SKenneth E. Jansen!
1117*59599516SKenneth E. Jansen!           write the number of vtx being mapped from part j to part i
1118*59599516SKenneth E. Jansen!           note ndof will need to change to the total size of vector field being mapped
1119*59599516SKenneth E. Jansen!           and this also should be computed in some routine above for allocation
1120*59599516SKenneth E. Jansen!           purposes.  currently it is at risk of being confused with ndof
1121*59599516SKenneth E. Jansen!
1122*59599516SKenneth E. Jansen            itmp=1
1123*59599516SKenneth E. Jansen            if (l .gt. 0) itmp = int(log10(float(l)))+1
1124*59599516SKenneth E. Jansen            write (fmt1,"('(''restartMap.'',i',i1,',1x)')") itmp
1125*59599516SKenneth E. Jansen            write (fnamer,fmt1) l
1126*59599516SKenneth E. Jansen            fnamer = trim(fnamer) // cname2(myrank+1)
1127*59599516SKenneth E. Jansen            if (isbinary == 1) then
1128*59599516SKenneth E. Jansen              open(unit=700+l,file=fnamer,status='unknown',
1129*59599516SKenneth E. Jansen     &                              form='unformatted')
1130*59599516SKenneth E. Jansen            else
1131*59599516SKenneth E. Jansen              open(unit=700+l,file=fnamer,status='unknown')
1132*59599516SKenneth E. Jansen            endif
1133*59599516SKenneth E. Jansen          endif
1134*59599516SKenneth E. Jansen        enddo
1135*59599516SKenneth E. Jansen!
1136*59599516SKenneth E. Jansen!       so that we can read directly into the mapped array later, it is helpful to
1137*59599516SKenneth E. Jansen!       find the number of verts on each part in the N partition which is easily
1138*59599516SKenneth E. Jansen!       obtained  by looking at the max of each vtx id going to each N rank
1139*59599516SKenneth E. Jansen!       and then doing an allReduce to find global maximum
1140*59599516SKenneth E. Jansen!
1141*59599516SKenneth E. Jansen!       Write solution
1142*59599516SKenneth E. Jansen!
1143*59599516SKenneth E. Jansen        do l=1,irankN
1144*59599516SKenneth E. Jansen          if(icountN(l).gt.0) then  !  I have data to write for rank l
1145*59599516SKenneth E. Jansen            if (isbinary == 1) then
1146*59599516SKenneth E. Jansen               write(700+l) icountN(l), ndof
1147*59599516SKenneth E. Jansen            else
1148*59599516SKenneth E. Jansen               write(700+l,*) icountN(l), ndof
1149*59599516SKenneth E. Jansen            endif
1150*59599516SKenneth E. Jansen          endif
1151*59599516SKenneth E. Jansen        enddo
1152*59599516SKenneth E. Jansen
1153*59599516SKenneth E. Jansen        do i=1,nshg
1154*59599516SKenneth E. Jansen          ifileN=pID(i)+1.1    !shift pID to start from 1
1155*59599516SKenneth E. Jansen          intvID=(vID(i)+1.1)  !shift vID to start from 1
1156*59599516SKenneth E. Jansen          if (isbinary == 1) then
1157*59599516SKenneth E. Jansen            write(700+ifileN) intvID,(qold(i,j),j=1,ndof)
1158*59599516SKenneth E. Jansen          else
1159*59599516SKenneth E. Jansen            write(700+ifileN,925) intvID,(qold(i,j),j=1,ndof)
1160*59599516SKenneth E. Jansen          endif
1161*59599516SKenneth E. Jansen!         the above "dealing" of records to files based on pID is safe because each
1162*59599516SKenneth E. Jansen!         process 1..M has a unique set of files to write to
1163*59599516SKenneth E. Jansen        enddo
1164*59599516SKenneth E. Jansen
1165*59599516SKenneth E. Jansen!
1166*59599516SKenneth E. Jansen!       Write dwal
1167*59599516SKenneth E. Jansen!
1168*59599516SKenneth E. Jansen        ione = 1
1169*59599516SKenneth E. Jansen        do l=1,irankN
1170*59599516SKenneth E. Jansen          if(icountN(l).gt.0) then  !  I have data to write for rank l
1171*59599516SKenneth E. Jansen            if (isbinary == 1) then
1172*59599516SKenneth E. Jansen               write(700+l) icountN(l), ione
1173*59599516SKenneth E. Jansen            else
1174*59599516SKenneth E. Jansen               write(700+l,*) icountN(l), ione
1175*59599516SKenneth E. Jansen            endif
1176*59599516SKenneth E. Jansen          endif
1177*59599516SKenneth E. Jansen        enddo
1178*59599516SKenneth E. Jansen
1179*59599516SKenneth E. Jansen        do i=1,nshg
1180*59599516SKenneth E. Jansen          ifileN=pID(i)+1.1    !shift pID to start from 1
1181*59599516SKenneth E. Jansen          intvID=(vID(i)+1.1)  !shift vID to start from 1
1182*59599516SKenneth E. Jansen          if (isbinary == 1) then
1183*59599516SKenneth E. Jansen            write(700+ifileN) intvID, dwal(i)
1184*59599516SKenneth E. Jansen          else
1185*59599516SKenneth E. Jansen            write(700+ifileN,925) intvID, dwal(i)
1186*59599516SKenneth E. Jansen          endif
1187*59599516SKenneth E. Jansen!         the above "dealing" of records to files based on pID is safe because each
1188*59599516SKenneth E. Jansen!         process 1..M has a unique set of files to write to
1189*59599516SKenneth E. Jansen        enddo
1190*59599516SKenneth E. Jansen!
1191*59599516SKenneth E. Jansen!       close all the files on each of the M ranks and deallocate as we are done
1192*59599516SKenneth E. Jansen!       with the ascii file creation step
1193*59599516SKenneth E. Jansen!
1194*59599516SKenneth E. Jansen        do l=1,irankN
1195*59599516SKenneth E. Jansen          if(icountN(l).gt.0) close(700+l)
1196*59599516SKenneth E. Jansen        enddo
1197*59599516SKenneth E. Jansen
1198*59599516SKenneth E. Jansen      endif ! ireducemethod
1199*59599516SKenneth E. Jansen
1200*59599516SKenneth E. Jansen!
1201*59599516SKenneth E. Jansen!  Deallocate some memory
1202*59599516SKenneth E. Jansen!
1203*59599516SKenneth E. Jansen      call mpi_barrier(mpi_comm_world, ierr)
1204*59599516SKenneth E. Jansen      if(myrank == 0) then
1205*59599516SKenneth E. Jansen        write(*,*) 'Deallocating some memory'
1206*59599516SKenneth E. Jansen      endif
1207*59599516SKenneth E. Jansen      deallocate(vID)
1208*59599516SKenneth E. Jansen      deallocate(pID)
1209*59599516SKenneth E. Jansen      deallocate(qold)
1210*59599516SKenneth E. Jansen      if(iybar == 1) then
1211*59599516SKenneth E. Jansen        deallocate(ybar)
1212*59599516SKenneth E. Jansen      endif
1213*59599516SKenneth E. Jansen      if(ierror == 1) then
1214*59599516SKenneth E. Jansen        deallocate(errors)
1215*59599516SKenneth E. Jansen      endif
1216*59599516SKenneth E. Jansen      if(numphavg .gt. 0) then
1217*59599516SKenneth E. Jansen        deallocate(yphbar)
1218*59599516SKenneth E. Jansen      endif
1219*59599516SKenneth E. Jansen      if(ivort == 1) then
1220*59599516SKenneth E. Jansen        deallocate(vort)
1221*59599516SKenneth E. Jansen      endif
1222*59599516SKenneth E. Jansen      if(idwal == 1) then
1223*59599516SKenneth E. Jansen        deallocate(dwal)
1224*59599516SKenneth E. Jansen      endif
1225*59599516SKenneth E. Jansen!
1226*59599516SKenneth E. Jansen!  Make sure all the ranks are done with their restartMap files before
1227*59599516SKenneth E. Jansen!  trying to read them for ireducemethod = 1
1228*59599516SKenneth E. Jansen!
1229*59599516SKenneth E. Jansen      call mpi_barrier(mpi_comm_world, ierr)
1230*59599516SKenneth E. Jansen
1231*59599516SKenneth E. Jansen!
1232*59599516SKenneth E. Jansen!  Create a subcommunicator for the first N ranks
1233*59599516SKenneth E. Jansen!
1234*59599516SKenneth E. Jansen
1235*59599516SKenneth E. Jansen!      islesseqN = 0
1236*59599516SKenneth E. Jansen!      if(myrank.lt.irankN) then
1237*59599516SKenneth E. Jansen!        islesseqN = 1
1238*59599516SKenneth E. Jansen!      endif
1239*59599516SKenneth E. Jansen!      call mpi_comm_split(mpi_comm_world, islesseqN, myrank,
1240*59599516SKenneth E. Jansen!     &                    my_local_comm, ierr)
1241*59599516SKenneth E. Jansen
1242*59599516SKenneth E. Jansen!      my_local_size = -1
1243*59599516SKenneth E. Jansen!      call mpi_comm_size(my_local_comm, my_local_size, ierr)
1244*59599516SKenneth E. Jansen!      my_local_rank = -1
1245*59599516SKenneth E. Jansen!      call mpi_comm_rank(my_local_comm, my_local_rank, ierr)
1246*59599516SKenneth E. Jansen!      write(*,*) "RANKS:", myrank, my_local_rank, my_local_size, irankN
1247*59599516SKenneth E. Jansen
1248*59599516SKenneth E. Jansen!
1249*59599516SKenneth E. Jansen!     Now for all N ranks, load the partial files written above and merge them
1250*59599516SKenneth E. Jansen!
1251*59599516SKenneth E. Jansen!      if(myrank.lt.irankN) then   ! only parts 1..N do work in this phase
1252*59599516SKenneth E. Jansen
1253*59599516SKenneth E. Jansen        if(ireducemethod == 1) then ! Read the files back for the file based approach.
1254*59599516SKenneth E. Jansen                                    ! Beware, this method is not maintained any more
1255*59599516SKenneth E. Jansen
1256*59599516SKenneth E. Jansen          l=myrank+1                ! help me find my mapped files
1257*59599516SKenneth E. Jansen          do j=1,numpe              ! potentially all M have a map for me
1258*59599516SKenneth E. Jansen!
1259*59599516SKenneth E. Jansen!           create the filename for all M of my potential Maps
1260*59599516SKenneth E. Jansen!
1261*59599516SKenneth E. Jansen            itmp=1
1262*59599516SKenneth E. Jansen            if (l .gt. 0) itmp = int(log10(float(l)))+1
1263*59599516SKenneth E. Jansen            write (fmt1,"('(''restartMap.'',i',i1,',1x)')") itmp
1264*59599516SKenneth E. Jansen            write (fnamer,fmt1) l
1265*59599516SKenneth E. Jansen            fnamer = trim(fnamer) // cname2(j)
1266*59599516SKenneth E. Jansen!
1267*59599516SKenneth E. Jansen!           most won't exist so inquire for existance
1268*59599516SKenneth E. Jansen!
1269*59599516SKenneth E. Jansen            inquire(file=fnamer,exist=exmap)
1270*59599516SKenneth E. Jansen            if(exmap) then  ! so this map does exist so we open the Map files
1271*59599516SKenneth E. Jansen
1272*59599516SKenneth E. Jansen              if(isbinary == 1) then
1273*59599516SKenneth E. Jansen                open(unit=700+l,file=fnamer,status='unknown',
1274*59599516SKenneth E. Jansen     &                                    form='unformatted')
1275*59599516SKenneth E. Jansen              else
1276*59599516SKenneth E. Jansen                open(unit=700+l,file=fnamer,status='unknown')
1277*59599516SKenneth E. Jansen              endif
1278*59599516SKenneth E. Jansen!
1279*59599516SKenneth E. Jansen!             Read solution first
1280*59599516SKenneth E. Jansen!
1281*59599516SKenneth E. Jansen              if(isbinary == 1) then
1282*59599516SKenneth E. Jansen                read(700+l) icountRead, ndofRead  ! read it's header
1283*59599516SKenneth E. Jansen              else
1284*59599516SKenneth E. Jansen                read(700+l,*) icountRead, ndofRead  ! read it's header
1285*59599516SKenneth E. Jansen              endif
1286*59599516SKenneth E. Jansen              allocate(qreadN(ndofRead))
1287*59599516SKenneth E. Jansen              do i=1, icountRead                  ! loop over its contents
1288*59599516SKenneth E. Jansen                if(isbinary == 1) then
1289*59599516SKenneth E. Jansen                  read(700+l) intvID,(qreadN(k),k=1,ndofRead) ! read a line in binary format
1290*59599516SKenneth E. Jansen                else
1291*59599516SKenneth E. Jansen                  read(700+l,925) intvID,(qreadN(k),k=1,ndofRead) ! read a line in ascii format
1292*59599516SKenneth E. Jansen                endif
1293*59599516SKenneth E. Jansen! DEBUG
1294*59599516SKenneth E. Jansen!              if((i.eq.1).and.(myrank.eq.0))
1295*59599516SKenneth E. Jansen!     &          write(*,*) vidRead, ndofRead, (qreadN(k),k=1,ndofRead)
1296*59599516SKenneth E. Jansen! DEBUG
1297*59599516SKenneth E. Jansen                qoldN(intvID,1:ndof)=qreadN(1:ndof) ! fill directly into qoldN
1298*59599516SKenneth E. Jansen!
1299*59599516SKenneth E. Jansen!               the above avoids sorting and sifting as duplicated vtx values just overwrite
1300*59599516SKenneth E. Jansen!               and you get the last one as a final value.  Assuming the field was commu-ed
1301*59599516SKenneth E. Jansen!               all duplicat values are the same so this is safe.  For error fields this
1302*59599516SKenneth E. Jansen!               might not be true but it should be o.k.
1303*59599516SKenneth E. Jansen!
1304*59599516SKenneth E. Jansen! DEBUG
1305*59599516SKenneth E. Jansen!              if((i.eq.1).and.(myrank.eq.0))
1306*59599516SKenneth E. Jansen!     &        write(*,*) intvID,(qoldN(intvID,k),k=1,ndofRead)
1307*59599516SKenneth E. Jansen! DEBUG
1308*59599516SKenneth E. Jansen              enddo ! end of this map file so close the file and look for more
1309*59599516SKenneth E. Jansen              deallocate(qreadN)
1310*59599516SKenneth E. Jansen!
1311*59599516SKenneth E. Jansen!             Read dwalN second
1312*59599516SKenneth E. Jansen!
1313*59599516SKenneth E. Jansen              if(isbinary == 1) then
1314*59599516SKenneth E. Jansen                read(700+l) icountRead, ndofRead  ! read it's header
1315*59599516SKenneth E. Jansen              else
1316*59599516SKenneth E. Jansen                read(700+l,*) icountRead, ndofRead  ! read it's header
1317*59599516SKenneth E. Jansen              endif
1318*59599516SKenneth E. Jansen              do i=1, icountRead
1319*59599516SKenneth E. Jansen                if(isbinary == 1) then
1320*59599516SKenneth E. Jansen                  read(700+l) intvID,qreadN1
1321*59599516SKenneth E. Jansen                else
1322*59599516SKenneth E. Jansen                  read(700+l,925) intvID,qreadN1
1323*59599516SKenneth E. Jansen                endif
1324*59599516SKenneth E. Jansen                dwalN(intvID)=qreadN1 ! fill directly into dwalN
1325*59599516SKenneth E. Jansen              enddo ! end of this map file so close the file and look for more
1326*59599516SKenneth E. Jansen
1327*59599516SKenneth E. Jansen              close(700+l)
1328*59599516SKenneth E. Jansen            endif ! map existed
1329*59599516SKenneth E. Jansen          enddo ! loop over all M ranks
1330*59599516SKenneth E. Jansen
1331*59599516SKenneth E. Jansen        endif ! ireducemethod = 1
1332*59599516SKenneth E. Jansen!
1333*59599516SKenneth E. Jansen!       At this point I should have a complete field for my part so I write the
1334*59599516SKenneth E. Jansen!       mapped file
1335*59599516SKenneth E. Jansen!
1336*59599516SKenneth E. Jansen
1337*59599516SKenneth E. Jansen! DEBUG
1338*59599516SKenneth E. Jansen!        itmp=1
1339*59599516SKenneth E. Jansen!        if (lstep .gt. 0) itmp = int(log10(float(lstep)))+1
1340*59599516SKenneth E. Jansen!        write (fmt1,"('(''restartMapped.'',i',i1,',1x)')") itmp
1341*59599516SKenneth E. Jansen!        write (fnamer,fmt1) lstep
1342*59599516SKenneth E. Jansen!        fnamer = trim(fnamer) // cname2(myrank+1)
1343*59599516SKenneth E. Jansen!        open(unit=700,file=fnamer,status='unknown') !,
1344*59599516SKenneth E. Jansen!        write(700,*) maxvIDout(myrank+1),ndof
1345*59599516SKenneth E. Jansen!        do i=1,maxVIDout(myrank+1)+1
1346*59599516SKenneth E. Jansen!          write(700,927) i, (qoldN(i,j),j=1,ndof)
1347*59599516SKenneth E. Jansen!          enddo
1348*59599516SKenneth E. Jansen!        close(700)
1349*59599516SKenneth E. Jansen! DEBUG
1350*59599516SKenneth E. Jansen
1351*59599516SKenneth E. Jansen!
1352*59599516SKenneth E. Jansen!      Write the N posix files. Note that the nodes on the part boundaries still need to be updated
1353*59599516SKenneth E. Jansen!
1354*59599516SKenneth E. Jansen!      Posix format
1355*59599516SKenneth E. Jansen!        call write_restartonly(myrank, lstep, nshgN, ndof, qoldN)
1356*59599516SKenneth E. Jansen!        call write_field (myrank,'a','dwal',4,dwalN,'d',nshgN,1,lstep)
1357*59599516SKenneth E. Jansen!        call write_field (myrank,'a','errors',6,errorsN,'d',
1358*59599516SKenneth E. Jansen!     &                                        nshgN,ndoferrors,lstep)
1359*59599516SKenneth E. Jansen!        call write_field (myrank,'a','ybar',4,ybarN,'d',
1360*59599516SKenneth E. Jansen!     &                                           nshgN,ndofybar,lstep)
1361*59599516SKenneth E. Jansen
1362*59599516SKenneth E. Jansen!        SyncIO format
1363*59599516SKenneth E. Jansen
1364*59599516SKenneth E. Jansen
1365*59599516SKenneth E. Jansen!
1366*59599516SKenneth E. Jansen!      Test the result from mpi_alltoall
1367*59599516SKenneth E. Jansen!
1368*59599516SKenneth E. Jansen!      qoldN=-9.87654321e32
1369*59599516SKenneth E. Jansen!      l=myrank+1
1370*59599516SKenneth E. Jansen!      do j=1,numpe ! should really go to irankN
1371*59599516SKenneth E. Jansen!        do i=1,maxicountNglob
1372*59599516SKenneth E. Jansen!          intvID = qTota2ar( (i-1)*numvar+1 , j) + 1.1
1373*59599516SKenneth E. Jansen!          if (intvID > 0) then
1374*59599516SKenneth E. Jansen!            do idof=1,ndof
1375*59599516SKenneth E. Jansen!              qoldN(intvID,idof) = qTota2ar( (i-1)*numvar+1+idof, j)
1376*59599516SKenneth E. Jansen!            enddo
1377*59599516SKenneth E. Jansen!          endif
1378*59599516SKenneth E. Jansen!        enddo
1379*59599516SKenneth E. Jansen!      enddo
1380*59599516SKenneth E. Jansen
1381*59599516SKenneth E. Jansen!      itmp=1
1382*59599516SKenneth E. Jansen!      if (lstep .gt. 0) itmp = int(log10(float(lstep)))+1
1383*59599516SKenneth E. Jansen!      write (fmt1,"('(''restartMapped2.'',i',i1,',1x)')") itmp
1384*59599516SKenneth E. Jansen!      write (fnamer,fmt1) lstep
1385*59599516SKenneth E. Jansen!      fnamer = trim(fnamer) // cname2(myrank+1)
1386*59599516SKenneth E. Jansen!      open(unit=700,file=fnamer,status='unknown') !,
1387*59599516SKenneth E. Jansen!      write(700,*) maxvIDout(myrank+1),ndof
1388*59599516SKenneth E. Jansen!      do i=1,maxVIDout(myrank+1)+1
1389*59599516SKenneth E. Jansen!        write(700,927) i, (qoldN(i,j),j=1,ndof)
1390*59599516SKenneth E. Jansen!      enddo
1391*59599516SKenneth E. Jansen!      close(700)
1392*59599516SKenneth E. Jansen
1393*59599516SKenneth E. Jansen!      endif ! my rank is within range 1..N
1394*59599516SKenneth E. Jansen
1395*59599516SKenneth E. Jansen      call mpi_barrier(mpi_comm_world, ierr)
1396*59599516SKenneth E. Jansen      if(myrank == 0) then
1397*59599516SKenneth E. Jansen        write(*,*) 'Writing the reduced restartRedTmp-dat files'
1398*59599516SKenneth E. Jansen      endif
1399*59599516SKenneth E. Jansen
1400*59599516SKenneth E. Jansen!      call Write_M2N(myrank, irankN, lstep, nshgN,
1401*59599516SKenneth E. Jansen!     &          ndof, ndofybar, ndoferrors,
1402*59599516SKenneth E. Jansen!     &          qoldN, ybarN, errorsN, dwalN)
1403*59599516SKenneth E. Jansen
1404*59599516SKenneth E. Jansen
1405*59599516SKenneth E. Jansen      nsynciofieldswriterestart = 1+iybar+ierror+numphavg+ivort+idwal
1406*59599516SKenneth E. Jansen
1407*59599516SKenneth E. Jansen!     We check here how many geombcRed files have been red.
1408*59599516SKenneth E. Jansen!     If 0, then two possibilities:
1409*59599516SKenneth E. Jansen!       - Reduction to 1 part so geombcRed are not required. Set nsynciofilesred to 1
1410*59599516SKenneth E. Jansen!       - User forgot to create the link to geombcRed.
1411*59599516SKenneth E. Jansen!         Then, assumes the number of geombc and geombcRed files ia the same
1412*59599516SKenneth E. Jansen
1413*59599516SKenneth E. Jansen      if(nsynciofilesred == 0) then
1414*59599516SKenneth E. Jansen        if(irankN == 1) then ! 1 part reduction -> set to 1
1415*59599516SKenneth E. Jansen          nsynciofilesred = 1
1416*59599516SKenneth E. Jansen        else ! Links are missing
1417*59599516SKenneth E. Jansen          nsynciofilesred = nsynciofiles
1418*59599516SKenneth E. Jansen        endif
1419*59599516SKenneth E. Jansen      endif
1420*59599516SKenneth E. Jansen
1421*59599516SKenneth E. Jansen      call Write_M2N_SolOnly(myrank,irankN,lstep,nshgN,ndof,qoldN)
1422*59599516SKenneth E. Jansen      deallocate(qoldN)
1423*59599516SKenneth E. Jansen
1424*59599516SKenneth E. Jansen      if(iybar == 1) then
1425*59599516SKenneth E. Jansen        call Write_M2N_Field(myrank,irankN,'a','ybar',4,ybarN,'d',
1426*59599516SKenneth E. Jansen     &                    nshgN,ndofybar,lstep)
1427*59599516SKenneth E. Jansen        deallocate(ybarN)
1428*59599516SKenneth E. Jansen      endif
1429*59599516SKenneth E. Jansen
1430*59599516SKenneth E. Jansen      if(ierror == 1) then
1431*59599516SKenneth E. Jansen        call Write_M2N_Field(myrank,irankN,'a','errors',6,errorsN,'d',
1432*59599516SKenneth E. Jansen     &                    nshgN,ndoferrors,lstep)
1433*59599516SKenneth E. Jansen        deallocate(errorsN)
1434*59599516SKenneth E. Jansen      endif
1435*59599516SKenneth E. Jansen
1436*59599516SKenneth E. Jansen      if(numphavg .gt. 0) then
1437*59599516SKenneth E. Jansen        do iphavg=1,numphavg
1438*59599516SKenneth E. Jansen          call write_M2N_phavg2(myrank,irankN,'a','phase_average',13,
1439*59599516SKenneth E. Jansen     &             iphavg,numphavg,yphbarN(:,:,iphavg),'d',
1440*59599516SKenneth E. Jansen     &             nshgN,ndofyphbar,lstep)
1441*59599516SKenneth E. Jansen        enddo
1442*59599516SKenneth E. Jansen        deallocate(yphbarN)
1443*59599516SKenneth E. Jansen      endif
1444*59599516SKenneth E. Jansen
1445*59599516SKenneth E. Jansen      if(ivort == 1) then
1446*59599516SKenneth E. Jansen        call Write_M2N_Field(myrank,irankN,'a','vorticity',9,
1447*59599516SKenneth E. Jansen     &                    vortN,'d',nshgN,ndofvort,lstep)
1448*59599516SKenneth E. Jansen        deallocate(vortN)
1449*59599516SKenneth E. Jansen      endif
1450*59599516SKenneth E. Jansen
1451*59599516SKenneth E. Jansen      if(idwal == 1) then
1452*59599516SKenneth E. Jansen        call Write_M2N_Field(myrank,irankN,'a','dwal',4,dwalN,'d',
1453*59599516SKenneth E. Jansen     &                    nshgN,1,lstep)
1454*59599516SKenneth E. Jansen        deallocate(dwalN)
1455*59599516SKenneth E. Jansen      endif
1456*59599516SKenneth E. Jansen
1457*59599516SKenneth E. Jansen
1458*59599516SKenneth E. Jansen!
1459*59599516SKenneth E. Jansen!     Below is debug stuff trying to figure out why the code crashes on exit
1460*59599516SKenneth E. Jansen!
1461*59599516SKenneth E. Jansen
1462*59599516SKenneth E. Jansen!       call mpi_barrier(mpi_comm_world, ierr)
1463*59599516SKenneth E. Jansen!       write(*,*) myrank,'leaving readnblk'
1464*59599516SKenneth E. Jansen
1465*59599516SKenneth E. Jansen!925   format(i5,2x,6(e14.7,2x))
1466*59599516SKenneth E. Jansen925   format(i9,1x,6(e24.17,1x)) ! used for file based approach
1467*59599516SKenneth E. Jansen
1468*59599516SKenneth E. Jansen926   format(9(i5,2x))  !used for debugging
1469*59599516SKenneth E. Jansen927   format(i5,2x,6(e14.7,2x))  !used for debugging
1470*59599516SKenneth E. Jansen
1471*59599516SKenneth E. Jansen      return
1472*59599516SKenneth E. Jansen!
1473*59599516SKenneth E. Jansen!
1474*59599516SKenneth E. Jansen      end
1475*59599516SKenneth E. Jansen
1476