Solution Microlab 2

integer function how_many_extra_history_columns(id)
   integer, intent(in) :: id
   integer :: ierr
   type (star_info), pointer :: s
   ierr = 0
   call star_ptr(id, s, ierr)
   if (ierr /= 0) return
   how_many_extra_history_columns = 1
end function how_many_extra_history_columns

subroutine data_for_extra_history_columns(id, n, names, vals, ierr)
   integer, intent(in) :: id, n
   character (len=maxlen_history_column_name) :: names(n)
   real(dp) :: vals(n), max_residuals
   integer, intent(out) :: ierr
   real(dp), allocatable :: residuals(:)
   integer :: k
   real(dp) :: lhs, rhs
   type (star_info), pointer :: s
   ierr = 0
   call star_ptr(id, s, ierr)
   if (ierr /= 0) return


   allocate(residuals(s% nz))
   do k = 2, s% nz
       ! (dP/dm)
       lhs = (s% Peos(k-1) - s% Peos(k)) / ((s% dm(k-1) + s% dm(k)) / 2.0_dp)
       ! -((G m) / (4 Pi r^4))
       rhs = -standard_cgrav * s% m(k) / (4.0_dp * pi* pow4(s% r(k)))
       residuals(k) =  abs(lhs-rhs)/abs(lhs)

   end do
   max_residuals = MAXVAL(residuals)
   names(1) = 'max_residuals'
   vals(1)  = max_residuals


end subroutine data_for_extra_history_columns