110167291SKenneth E. Jansen !-------------------------------------------------------- 210167291SKenneth E. Jansen ! Initialize the Probe Point Arrays and write the Header 310167291SKenneth E. Jansen ! ------------------------------------------------------- 410167291SKenneth E. Jansen subroutine initProbePoints() 510167291SKenneth E. Jansen !Tests if the probe point file xyzts.dat exists, loads probe 610167291SKenneth E. Jansen !point locations, initializes a number of arrays used by 7*0d32f9a8SKenneth E. Jansen !timedataC, and writes the initial header for the output file. 810167291SKenneth E. Jansen ! 910167291SKenneth E. Jansen ! Rewritten by: Nicholas Mati 2014-04-18 1010167291SKenneth E. Jansen ! Revision history: 1110167291SKenneth E. Jansen ! 2014-04-18 Code moved from itrdrv to here 1210167291SKenneth E. Jansen 13*0d32f9a8SKenneth E. Jansen use timedataC 1410167291SKenneth E. Jansen include "common.h" 1510167291SKenneth E. Jansen include "mpif.h" 1610167291SKenneth E. Jansen 1710167291SKenneth E. Jansen logical :: exVarts 1810167291SKenneth E. Jansen 1910167291SKenneth E. Jansen !Test if xyzts.dat exists and broadcast the result. 2010167291SKenneth E. Jansen if(myrank.eq.master) inquire(file='xyzts.dat',exist=exts) 2110167291SKenneth E. Jansen if(numpe .gt. 1) then 2210167291SKenneth E. Jansen call MPI_BARRIER(MPI_COMM_WORLD, ierr) 2310167291SKenneth E. Jansen call MPI_BCAST(exts,1,MPI_INTEGER,master,MPI_COMM_WORLD,ierr) 2410167291SKenneth E. Jansen endif 2510167291SKenneth E. Jansen 2610167291SKenneth E. Jansen if(.not. exts) return 2710167291SKenneth E. Jansen call readProbePoints 2810167291SKenneth E. Jansen 2910167291SKenneth E. Jansen allocate (statptts(ntspts,2)) 3010167291SKenneth E. Jansen allocate (parptts( ntspts,nsd)) 3110167291SKenneth E. Jansen allocate (varts( ntspts,ndof)) 3210167291SKenneth E. Jansen 3310167291SKenneth E. Jansen statptts(:,:) = 0 3410167291SKenneth E. Jansen parptts(:,:) = zero 3510167291SKenneth E. Jansen varts(:,:) = zero 3610167291SKenneth E. Jansen ivartsbuff = 0 3710167291SKenneth E. Jansen vartsResetbuffer = .false. 3810167291SKenneth E. Jansen 3910167291SKenneth E. Jansen allocate (ivarts( ntspts*ndof)) 4010167291SKenneth E. Jansen allocate (ivartsg( ntspts*ndof)) 4110167291SKenneth E. Jansen allocate (vartssoln( ntspts*ndof)) 4210167291SKenneth E. Jansen allocate (vartssolng(ntspts*ndof)) 4310167291SKenneth E. Jansen allocate (vartsbuff( ntspts,ndof,nbuff)) 4410167291SKenneth E. Jansen allocate (vartsbuffstep(nbuff)) 4510167291SKenneth E. Jansen 4610167291SKenneth E. Jansen !test if the varts folder exists. If it doesn't create it. 4710167291SKenneth E. Jansen if(myrank .eq. master) then 4810167291SKenneth E. Jansen inquire(file="./varts/.", exist=exVarts) 4910167291SKenneth E. Jansen if(.not. exVarts) then 5010167291SKenneth E. Jansen call system("mkdir varts") !Only works on *nix, but we 5110167291SKenneth E. Jansen !never really run on Windows 5210167291SKenneth E. Jansen !anymore so... 5310167291SKenneth E. Jansen endif 5410167291SKenneth E. Jansen endif 5510167291SKenneth E. Jansen 5610167291SKenneth E. Jansen! initProbePoints = exts 5710167291SKenneth E. Jansen! end function 5810167291SKenneth E. Jansen end subroutine 5910167291SKenneth E. Jansen 6010167291SKenneth E. Jansen 6110167291SKenneth E. Jansen !------------------------ 6210167291SKenneth E. Jansen ! Read Probe Point Input 6310167291SKenneth E. Jansen !------------------------ 6410167291SKenneth E. Jansen subroutine readProbePoints 6510167291SKenneth E. Jansen ! Original Code written by: ?? ????-??-?? 6610167291SKenneth E. Jansen ! Rewritten by: Nicholas Mati 2014-04-18 6710167291SKenneth E. Jansen ! Revision history: 6810167291SKenneth E. Jansen ! 2014-04-18 Rewritten code moved from itrdrv to here. 6910167291SKenneth E. Jansen ! 7010167291SKenneth E. Jansen !Reads the file xyzts.dat for probe point locations, write 7110167291SKenneth E. Jansen !frequency, tolerance, ... The file is expected to have the 7210167291SKenneth E. Jansen !form: 7310167291SKenneth E. Jansen ! ntspts freq tolpt iterat nbuff 7410167291SKenneth E. Jansen ! x1 y1 z1 7510167291SKenneth E. Jansen ! x2 y2 z2 7610167291SKenneth E. Jansen ! ... 7710167291SKenneth E. Jansen ! xN yN zN 7810167291SKenneth E. Jansen ! 7910167291SKenneth E. Jansen ! ... where ntspts is the number of probe points and freq is the 8010167291SKenneth E. Jansen ! number of steps to take before flushing data. If nbuff is 8110167291SKenneth E. Jansen ! zero, the number of time steps between restarts, ntout, is 8210167291SKenneth E. Jansen ! used. 8310167291SKenneth E. Jansen 84*0d32f9a8SKenneth E. Jansen use timedataC 8510167291SKenneth E. Jansen include "common.h" 8610167291SKenneth E. Jansen include "mpif.h" 8710167291SKenneth E. Jansen 8810167291SKenneth E. Jansen if(myrank.eq.master) then 8910167291SKenneth E. Jansen open(unit=626,file='xyzts.dat',status='old') 9010167291SKenneth E. Jansen read(626,*) ntspts, freq, tolpt, iterat, nbuff 9110167291SKenneth E. Jansen endif 9210167291SKenneth E. Jansen 9310167291SKenneth E. Jansen !Broadcase out the header of xyzts.dat. These should probably 9410167291SKenneth E. Jansen !be combined into two calls, but this is quick and dirty. 9510167291SKenneth E. Jansen if(numpe .gt. 1) then 9610167291SKenneth E. Jansen call MPI_BARRIER(MPI_COMM_WORLD, ierr) 9710167291SKenneth E. Jansen call MPI_Bcast(ntspts, 1, MPI_INTEGER, master, 9810167291SKenneth E. Jansen & MPI_COMM_WORLD, ierr) 9910167291SKenneth E. Jansen call MPI_Bcast(freq, 1, MPI_INTEGER, master, 10010167291SKenneth E. Jansen & MPI_COMM_WORLD, ierr) 10110167291SKenneth E. Jansen call MPI_Bcast(tolpt, 1, MPI_DOUBLE_PRECISION, master, 10210167291SKenneth E. Jansen & MPI_COMM_WORLD, ierr) 10310167291SKenneth E. Jansen call MPI_Bcast(iterat, 1, MPI_INTEGER, master, 10410167291SKenneth E. Jansen & MPI_COMM_WORLD, ierr) 10510167291SKenneth E. Jansen call MPI_Bcast(nbuff, 1, MPI_INTEGER, master, 10610167291SKenneth E. Jansen & MPI_COMM_WORLD, ierr) 10710167291SKenneth E. Jansen endif 10810167291SKenneth E. Jansen 10910167291SKenneth E. Jansen allocate (ptts( ntspts,nsd)) 11010167291SKenneth E. Jansen 11110167291SKenneth E. Jansen !Read probe point coordinates and broadcast to the rest of the 11210167291SKenneth E. Jansen !processors 11310167291SKenneth E. Jansen if(myrank .eq. master) then 11410167291SKenneth E. Jansen do jj=1,ntspts ! read coordinate data where solution desired 11510167291SKenneth E. Jansen read(626,*) ptts(jj,1), ptts(jj,2), ptts(jj,3) 11610167291SKenneth E. Jansen enddo 11710167291SKenneth E. Jansen close(626) 11810167291SKenneth E. Jansen endif 11910167291SKenneth E. Jansen 12010167291SKenneth E. Jansen if(numpe .gt. 1) then 12110167291SKenneth E. Jansen call MPI_BARRIER(MPI_COMM_WORLD, ierr) 12210167291SKenneth E. Jansen call MPI_Bcast(ptts, ntspts*nsd, MPI_DOUBLE_PRECISION, 12310167291SKenneth E. Jansen & master, MPI_COMM_WORLD, ierr) 12410167291SKenneth E. Jansen endif 12510167291SKenneth E. Jansen 12610167291SKenneth E. Jansen if (nbuff .eq. 0) 12710167291SKenneth E. Jansen & nbuff=ntout 12810167291SKenneth E. Jansen end subroutine 12910167291SKenneth E. Jansen 13010167291SKenneth E. Jansen 13110167291SKenneth E. Jansen !----------------------------- 13210167291SKenneth E. Jansen ! Write the Header varts file 13310167291SKenneth E. Jansen !----------------------------- 13410167291SKenneth E. Jansen subroutine TD_writeHeader(fvarts) 13510167291SKenneth E. Jansen !Creates the file fvarts and writes the data header. 13610167291SKenneth E. Jansen !fvarts: Name The file to create 13710167291SKenneth E. Jansen 138*0d32f9a8SKenneth E. Jansen use timedataC 13910167291SKenneth E. Jansen include "common.h" 14010167291SKenneth E. Jansen 14110167291SKenneth E. Jansen character(len=*) fvarts 14210167291SKenneth E. Jansen 14310167291SKenneth E. Jansen !Open the output varts file and write the header 14410167291SKenneth E. Jansen if (myrank .eq. master) then 14510167291SKenneth E. Jansen 14610167291SKenneth E. Jansen !fvarts='varts/varts' 14710167291SKenneth E. Jansen !fvarts=trim(fvarts)//trim(cname2(lstep)) 14810167291SKenneth E. Jansen !fvarts=trim(fvarts)//'.dat' 14910167291SKenneth E. Jansen open(unit=1001, file=fvarts, status='unknown') 15010167291SKenneth E. Jansen 15110167291SKenneth E. Jansen !Write the time step 15210167291SKenneth E. Jansen write(1001, *) "Time Step: ", Delt(1) 15310167291SKenneth E. Jansen write(1001, *) 15410167291SKenneth E. Jansen 15510167291SKenneth E. Jansen !Write the probe locations to varts.ts.dat so that post 15610167291SKenneth E. Jansen !processing tools actually know what point goes where. 15710167291SKenneth E. Jansen !From experience, it's difficult to keep this straight. 15810167291SKenneth E. Jansen write(1001, *) 15910167291SKenneth E. Jansen & "Probe ID x y z" 16010167291SKenneth E. Jansen do jj = 1, ntspts 16110167291SKenneth E. Jansen write(1001, "(I5, T12, 3(F16.12))") jj, ptts(jj,1:3) 16210167291SKenneth E. Jansen enddo 16310167291SKenneth E. Jansen write(1001, *) 16410167291SKenneth E. Jansen 16510167291SKenneth E. Jansen !write the output format string. This can't be hard 16610167291SKenneth E. Jansen !coded because ntspts is not known in advance. 16710167291SKenneth E. Jansen write(vartsIOFrmtStr, '("(I8, ", I4, "(E15.7e2))")') 16810167291SKenneth E. Jansen & ndof*ntspts 16910167291SKenneth E. Jansen 17010167291SKenneth E. Jansen !Header to delinieate the probe locations with the data. 17110167291SKenneth E. Jansen write(1001, *) "Probe Data:" 17210167291SKenneth E. Jansen close(unit=1001) 17310167291SKenneth E. Jansen endif ! if(myrank .eq. master) 17410167291SKenneth E. Jansen end subroutine 17510167291SKenneth E. Jansen 17610167291SKenneth E. Jansen 17710167291SKenneth E. Jansen 17810167291SKenneth E. Jansen !------------------------ 17910167291SKenneth E. Jansen ! Accumulate Probe Data 18010167291SKenneth E. Jansen !------------------------ 18110167291SKenneth E. Jansen subroutine TD_bufferData() 18210167291SKenneth E. Jansen 183*0d32f9a8SKenneth E. Jansen use timedataC 18410167291SKenneth E. Jansen include "common.h" 18510167291SKenneth E. Jansen include "mpif.h" 18610167291SKenneth E. Jansen 18710167291SKenneth E. Jansen integer :: icheck, istp, nstp 18810167291SKenneth E. Jansen 18910167291SKenneth E. Jansen if (mod(lstep,freq).eq.0) then 19010167291SKenneth E. Jansen if(vartsResetBuffer) then 19110167291SKenneth E. Jansen ivartsBuff = 0 19210167291SKenneth E. Jansen vartsResetBuffer = .false. 19310167291SKenneth E. Jansen endif 19410167291SKenneth E. Jansen 19510167291SKenneth E. Jansen !------------------------ 19610167291SKenneth E. Jansen !Merge Data across parts 19710167291SKenneth E. Jansen !------------------------ 19810167291SKenneth E. Jansen if (numpe > 1) then 19910167291SKenneth E. Jansen !load the contents of varts into vartssoln 20010167291SKenneth E. Jansen do jj = 1, ntspts 20110167291SKenneth E. Jansen vartssoln((jj-1)*ndof+1:jj*ndof)=varts(jj,:) 20210167291SKenneth E. Jansen ivarts=zero 20310167291SKenneth E. Jansen enddo 20410167291SKenneth E. Jansen 20510167291SKenneth E. Jansen !mark which points have been computed on this processor 20610167291SKenneth E. Jansen do k=1,ndof*ntspts 20710167291SKenneth E. Jansen if(vartssoln(k).ne.zero) ivarts(k)=1 20810167291SKenneth E. Jansen enddo 20910167291SKenneth E. Jansen 21010167291SKenneth E. Jansen !merge the solution 21110167291SKenneth E. Jansen call MPI_REDUCE(vartssoln, vartssolng, ndof*ntspts, 21210167291SKenneth E. Jansen & MPI_DOUBLE_PRECISION, MPI_SUM, master, 21310167291SKenneth E. Jansen & MPI_COMM_WORLD, ierr) 21410167291SKenneth E. Jansen 21510167291SKenneth E. Jansen call MPI_REDUCE(ivarts, ivartsg, ndof*ntspts, 21610167291SKenneth E. Jansen & MPI_INTEGER, MPI_SUM, master, 21710167291SKenneth E. Jansen & MPI_COMM_WORLD, ierr) 21810167291SKenneth E. Jansen 21910167291SKenneth E. Jansen !if the probe point happened to span multiple partitions, 22010167291SKenneth E. Jansen !divide the sum by the number of contributing partitions. 22110167291SKenneth E. Jansen if (myrank.eq.master) then 22210167291SKenneth E. Jansen do jj = 1, ntspts 22310167291SKenneth E. Jansen indxvarts = (jj-1)*ndof 22410167291SKenneth E. Jansen do k=1,ndof 22510167291SKenneth E. Jansen if(ivartsg(indxvarts+k).ne.0) then ! none of the vartssoln(parts) were non zero 22610167291SKenneth E. Jansen varts(jj,k) = 22710167291SKenneth E. Jansen & vartssolng(indxvarts+k) / ivartsg(indxvarts+k) 22810167291SKenneth E. Jansen endif 22910167291SKenneth E. Jansen enddo !loop over states / DoF 23010167291SKenneth E. Jansen enddo !loop over probe points 23110167291SKenneth E. Jansen endif !only on master 23210167291SKenneth E. Jansen endif !only if numpe > 1 23310167291SKenneth E. Jansen 23410167291SKenneth E. Jansen ivartsBuff = ivartsBuff + 1 23510167291SKenneth E. Jansen if (myrank.eq.master) then 23610167291SKenneth E. Jansen if(ivartsBuff .gt. nbuff) then 23710167291SKenneth E. Jansen write(*,*) "WARNING: vartsbuff has overflowed" 23810167291SKenneth E. Jansen ivartsBuff = nbuff 23910167291SKenneth E. Jansen endif 24010167291SKenneth E. Jansen 24110167291SKenneth E. Jansen vartsBuffStep(ivartsBuff) = lstep 24210167291SKenneth E. Jansen do jj = 1, ntspts 24310167291SKenneth E. Jansen vartsbuff(jj,1:ndof, ivartsBuff) = varts(jj,1:ndof) 24410167291SKenneth E. Jansen enddo 24510167291SKenneth E. Jansen endif 24610167291SKenneth E. Jansen endif 24710167291SKenneth E. Jansen 24810167291SKenneth E. Jansen varts(:,:) = zero 24910167291SKenneth E. Jansen 25010167291SKenneth E. Jansen end subroutine 25110167291SKenneth E. Jansen 25210167291SKenneth E. Jansen 25310167291SKenneth E. Jansen !------------ 25410167291SKenneth E. Jansen ! Write Data 25510167291SKenneth E. Jansen !------------ 25610167291SKenneth E. Jansen subroutine TD_writeData(fvarts, forceFlush) 25710167291SKenneth E. Jansen !writes the probe point data accumulated durring calls to 25810167291SKenneth E. Jansen !TD_bufferData(). Note that actual file IO only occurs when the 25910167291SKenneth E. Jansen !buffer is full or when DT_writeData is called with forceFlush 26010167291SKenneth E. Jansen !set to true. Also note that TD_writeHeader must be called prior 26110167291SKenneth E. Jansen !to calling DT_writeData. 262*0d32f9a8SKenneth E. Jansen use timedataC 26310167291SKenneth E. Jansen include "common.h" 26410167291SKenneth E. Jansen 26510167291SKenneth E. Jansen character(len=*) :: fvarts 26610167291SKenneth E. Jansen logical :: forceFlush 26710167291SKenneth E. Jansen! logical, optional :: forceflush 26810167291SKenneth E. Jansen logical :: flush 26910167291SKenneth E. Jansen integer :: k, ibuf 27010167291SKenneth E. Jansen 27110167291SKenneth E. Jansen if (myrank.eq.master) then 27210167291SKenneth E. Jansen 27310167291SKenneth E. Jansen !if provided, use the default value passed in to determine 27410167291SKenneth E. Jansen !wheather to flush the buffer 27510167291SKenneth E. Jansen! if(present(forceFlush)) then !optional version breaks the 27610167291SKenneth E. Jansen flush = forceFlush !compiler on Bluegene? 27710167291SKenneth E. Jansen! else 27810167291SKenneth E. Jansen! flush = .false. !set the default value 27910167291SKenneth E. Jansen! endif 28010167291SKenneth E. Jansen 28110167291SKenneth E. Jansen !make sure incomplete buffers get purged at the end of a run 28210167291SKenneth E. Jansen !regardless of the default. 28310167291SKenneth E. Jansen! if(ivartsBuff .eq. nbuff) flush = .true. 28410167291SKenneth E. Jansen if(mod(lstep, nbuff) .eq. 0) flush = .true. 28510167291SKenneth E. Jansen if(vartsResetBuffer) flush = .false. !Prevent repeated calls without updating 28610167291SKenneth E. Jansen !the buffer from writting multiple times. 28710167291SKenneth E. Jansen 28810167291SKenneth E. Jansen if(flush) then !flush the buffer to disc 28910167291SKenneth E. Jansen open(unit=1001, file = fvarts, status = "old", 29010167291SKenneth E. Jansen & position = "append", action = "write") 29110167291SKenneth E. Jansen do ibuf = 1,ivartsBuff 29210167291SKenneth E. Jansen write(1001, vartsIOFrmtStr) 29310167291SKenneth E. Jansen & vartsBuffStep(ibuf), !write the time step in the first column. 29410167291SKenneth E. Jansen & ((vartsbuff(jj,k,ibuf), k=1, ndof) !loop over the variables that you actually want to output. 29510167291SKenneth E. Jansen & , jj=1, ntspts) !loop over probe points 29610167291SKenneth E. Jansen enddo 29710167291SKenneth E. Jansen 29810167291SKenneth E. Jansen close(1001) 29910167291SKenneth E. Jansen 30010167291SKenneth E. Jansen vartsResetBuffer = .true. 30110167291SKenneth E. Jansen! ivartsBuff = 0 !need to reset ivartsBuff because 30210167291SKenneth E. Jansen! !writeDate can be called consecutively 30310167291SKenneth E. Jansen endif !only dump when buffer full 30410167291SKenneth E. Jansen endif !only on master 30510167291SKenneth E. Jansen 30610167291SKenneth E. Jansen! call flush(1001) 30710167291SKenneth E. Jansen! call fsync(1001) 30810167291SKenneth E. Jansen 30910167291SKenneth E. Jansen !Code for writting one file per probe point 31010167291SKenneth E. Jansen! do jj = 1, ntspts !loop through probe points 31110167291SKenneth E. Jansen! ifile = 1000+jj 31210167291SKenneth E. Jansen! do ibuf=1,nbuff 31310167291SKenneth E. Jansen! write(ifile,555) lstep-1 -nbuff+ibuf, 31410167291SKenneth E. Jansen! & (vartsbuff(jj,k,ibuf) , k=1, ndof) 31510167291SKenneth E. Jansen!! & vartsbuff(jj,:,ibuf) 31610167291SKenneth E. Jansen! 31710167291SKenneth E. Jansen! enddo ! buff empty 31810167291SKenneth E. Jansen! 31910167291SKenneth E. Jansen! call flush(ifile) 32010167291SKenneth E. Jansen! enddo ! jj ntspts 32110167291SKenneth E. Jansen 32210167291SKenneth E. Jansen 32310167291SKenneth E. Jansen! varts(:,:) = zero ! reset the array for next step !MOVED FOR Mach Control 32410167291SKenneth E. Jansen! 555 format(i6,6(2x,E12.5e2)) 32510167291SKenneth E. Jansen 32610167291SKenneth E. Jansen end subroutine 32710167291SKenneth E. Jansen 32810167291SKenneth E. Jansen 32910167291SKenneth E. Jansen subroutine TD_finalize() 330*0d32f9a8SKenneth E. Jansen use timedataC 33110167291SKenneth E. Jansen 33210167291SKenneth E. Jansen deallocate(ivarts) 33310167291SKenneth E. Jansen deallocate(ivartsg) 33410167291SKenneth E. Jansen deallocate(vartssoln) 33510167291SKenneth E. Jansen deallocate(vartssolng) 33610167291SKenneth E. Jansen deallocate(vartsbuff) 33710167291SKenneth E. Jansen deallocate(vartsbuffstep) 33810167291SKenneth E. Jansen 33910167291SKenneth E. Jansen deallocate(ptts) 34010167291SKenneth E. Jansen deallocate(varts) 34110167291SKenneth E. Jansen end subroutine 34210167291SKenneth E. Jansen 34310167291SKenneth E. Jansen 34410167291SKenneth E. Jansen !--------------------- 34510167291SKenneth E. Jansen ! allocate the arrays 34610167291SKenneth E. Jansen !--------------------- 34710167291SKenneth E. Jansen subroutine sTD 34810167291SKenneth E. Jansen !Allocates the arrays statptts, ptts, parptts, and varts for use 34910167291SKenneth E. Jansen !in itrdrv and ?? 35010167291SKenneth E. Jansen !Subroutine is Depricated. 35110167291SKenneth E. Jansen 352*0d32f9a8SKenneth E. Jansen use timedataC 35310167291SKenneth E. Jansen include "common.h" 35410167291SKenneth E. Jansen 35510167291SKenneth E. Jansen allocate (statptts(ntspts,2)) 35610167291SKenneth E. Jansen allocate (ptts(ntspts,nsd)) 35710167291SKenneth E. Jansen allocate (parptts(ntspts,nsd)) 35810167291SKenneth E. Jansen allocate (varts(ntspts,ndof)) 35910167291SKenneth E. Jansen 36010167291SKenneth E. Jansen return 36110167291SKenneth E. Jansen end 36210167291SKenneth E. Jansen 36310167291SKenneth E. Jansen !------------------- 36410167291SKenneth E. Jansen ! delete the arrays 36510167291SKenneth E. Jansen !------------------- 36610167291SKenneth E. Jansen subroutine dTD 36710167291SKenneth E. Jansen !Deallocates ptts and varts 368*0d32f9a8SKenneth E. Jansen use timedataC 36910167291SKenneth E. Jansen 37010167291SKenneth E. Jansen deallocate (ptts) 37110167291SKenneth E. Jansen deallocate (varts) 37210167291SKenneth E. Jansen 37310167291SKenneth E. Jansen return 37410167291SKenneth E. Jansen end 375