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