subroutine da_trace_init 2,2

   implicit none

   !--------------------------------------------------------------------
   ! Purpose: Initialise tracing
   !--------------------------------------------------------------------

   integer :: IOStatus             ! I/O return code
   integer :: Loop1
   character (len=200) :: TraceFile
   character(len=200) :: csvname
   character (len=10)  :: temp

   IOStatus = 0

   if (trace_all_pes .OR. myproc == trace_pe) then
     trace_write = .true.  
   end if

   !-----------------------------------------------------------------
   ! Open trace output file. 
   !-----------------------------------------------------------------

   if (trace_write .AND. trace_unit /= 0) then
      if (use_html) then
         write(unit=temp,fmt='(I10)') myproc
         TraceFile="trace/"//trim(adjustl(temp))//".html"
         open (&
            unit=trace_unit, &   ! i:
            file=trim(tracefile), &   ! i:
            status="replace", & ! i:
            action="write", &   ! i:
            iostat=iostatus)    ! o:
      else   
         write(unit=temp,fmt='(i10)') myproc
         tracefile="trace/"//trim(adjustl(temp))//".txt"
         open (&
            unit=trace_unit, &   ! i:
            file=trim(tracefile), &   ! i:
            status="replace", & ! i:
            action="write", &   ! i:
            iostat=IOStatus)    ! O:
      end if

      if (IOStatus /= 0) then
         call da_error(__FILE__,__LINE__, &
            (/"Cannot open trace file "//TraceFile/))
      end if
   end if

   if (trace_csv .and. rootproc) then
         write(unit=csvname,fmt='(I10,A)') myproc,'.csv'
      open(unit=trace_csv_unit,file="trace/"//trim(adjustl(csvname)), &
         status="replace",iostat=IOStatus)
      if (IOStatus /= 0) then
         call da_error(__FILE__,__LINE__,(/"Cannot open "//csvname/))
      end if
   end if

   !-----------------------------------------------------------------
   ! Find out whether to trace memory usage. The Cray routine to check
   ! memory usage is very slow, so it is best to only switch on memory
   ! checking if actively required.
   !-----------------------------------------------------------------

   !-----------------------------------------------------------------
   ! Set up timing and memory usage
   !-----------------------------------------------------------------

   do Loop1=1,MaxNoRoutines
      CPUTimeStart(Loop1)     = 0.0
      ElapsedTimeStart(Loop1) = 0.0
      ElapsedTime(Loop1)      = 0.0
      ElapsedTimeLocal(Loop1) = 0.0
      CPUTime(Loop1)          = 0.0
      CPUTimeLocal(Loop1)     = 0.0
      NoCalls(Loop1)          = 0
      NoCallsBody(Loop1)      = 0
      CalledBy(Loop1)         = 0
      MaxHeap(Loop1)          = 0
      TimerNames(Loop1)       = ""
   end do

   Pointer     = 0
   NoRoutines  = 0

   call system_clock(&
      COUNT=BaseElapsedTime)

   call cpu_time(BaseCPUTime)

   ! start trace output here so memory calculations are not distorted
   ! by IO buffer being grabbed later

   TraceDepth = 0

   if (trace_write) then
      if (use_html) then
         write (unit=trace_unit,fmt='(A)') "<html><head><title>Tracing</title></head>"
         write (unit=trace_unit,fmt='(A)') "<body><h1>Trace Output</h1>"
         write (unit=trace_unit,fmt='(A)') "<ul>"
         write (unit=trace_unit,fmt='(A)') "<li><a href=#tree>Calling Tree</a>"
         write (unit=trace_unit,fmt='(A)') "<li><a href=#local>Local routine timings</a>"
         write (unit=trace_unit,fmt='(A)') "<li><a href=#overall>Overall routine timings</a>"
         write (unit=trace_unit,fmt='(A)') "<li><a href=#memory>Memory usage</a>"
         write (unit=trace_unit,fmt='(A)') "</ul>"
         write (unit=trace_unit,fmt='(A)') "<a name=tree><h2>Calling Tree</h2></a><pre>"
      else
         write (unit=trace_unit,fmt='(A)') "Trace Output"
         write (unit=trace_unit,fmt='(A)') ""
      end if
   end if

end subroutine da_trace_init