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