Quantcast
Channel: Intel® oneAPI Math Kernel Library & Intel® Math Kernel Library
Viewing all articles
Browse latest Browse all 2652

MKL Cookbook Example 1 -- a Critique

$
0
0

The MKL Cookbook at https://software.intel.com/en-us/mkl_cookbook has a set of interesting and useful examples of solving physics problems using MKL. After reading the first of the cookbook examples, which is nicely described at https://software.intel.com/en-us/node/507039, and trying to verify the results given by the cookbook code at https://software.intel.com/en-us/mkl_cookbook_samples, I have some critical comments. I hope someone will view these comments as constructive criticism.

1. The brief description given at https://software.intel.com/en-us/mkl_cookbook says "Finding an approximate solution to a nonlinear equation", which would suggest to most people that the example concerns solving a nonlinear equation in one variable. The example, in fact, is about solving a nonlinear PDE using finite-difference discretization, and solving the resulting system of nonlinear algebraic equations using Pardiso.

2. The nonlinearity is introduced through the temperature dependence of thermal conductivity, as described on https://software.intel.com/en-us/node/507039 under "Discussion" (two different but similar symbols are used for temperature -- v and the Greek letter 'nu' -- please fix this). To treat this nonlinearity, the discretized equations are solved iteratively, using the solution of each iteration to recompute the coefficients to be used in the next iteration. In principle, this is fine, and there are many applications where such iterations are necessary. However, in the specific problem chosen this iteration is unnecessary. Gustav Kirchoff showed in 1894 that using w = \int \mu dv as the dependent variable reduces the variable conductivity problem to an equivalent constant conductivity problem.

3. I added 'printf' statements to the code in file pardiso_nonlinear.c to print out the final solution for temperature. The solution is not only incorrect in the interior of the unit cube domain, but shows values of 1 at the faces of the cube instead of the specified value of 0. I have not debugged the 300-line code to find out what is wrong. Instead, I give below two different ways of solving the problem and the results, so that you (Intel/MKL group) can debug the C code in the cookbook.

4. The example code employs a mesh with 63 nodes, of which 43 are interior nodes with unknown values of the dependent variable, and solves for these unknowns by calling Pardiso with n = 216. Exploiting the symmetry of the problem enables us to recognize that there are only four distinct temperature values! Let us name these four values as follows:

      x     y     z     w

   0.2  0.2  0.2     p

   0.2  0.4  0.2     q

   0.4  0.4  0.2     r

   0.4  0.4  0.4     s

Then, the heat equation is represented by A w = b, where A =

     6    -3     0     0
    -1     5    -2     0
     0    -2     4    -1
     0     0    -3     3

and b = h2, with h = 0.2 being the mesh size, and w = [p q r s]T. The solution is w = [   0.0196 ,   0.0260,    0.0351,     0.0484]T. By reversing the Kirchoff transformation, we recover the solution for temperature as T =   [  0.0180,    0.0233,    0.0305,    0.0403]T.

5. Here is simple Fortran code to solve the problem using Gauss-Seidel iteration to solve the linear equations for w (denoted T in the code). To keep the code short, I have not exploited symmetry, using which would have reduced the number of variables. The output values agree with those given above in Item 4.

! Poisson equation in unit cube, with T = zero at faces.
program lapl3d
implicit none
integer, parameter :: nx=5, ny=5, nz=5       ! number of segments
real, dimension (0:nx,0:ny,0:nz) :: T = 0.0  ! Kirchoff flow temperature
real :: h=1.0/nx, dT, Tn
integer :: i,j,k,iter=0
do
   dT=0
   do i=1,nx-1
      do j=1,ny-1
         do k=1,nz-1
            Tn = (T(i-1,j,k)+T(i+1,j,k)+ &
                  T(i,j-1,k)+T(i,j+1,k)+ &
                  T(i,j,k-1)+T(i,j,k+1) + h*h)/6.0 ! discrete Poisson eq.
            dT = max(dT,abs(T(i,j,k)-Tn))
            T(i,j,k) = Tn                          ! Gauss-Seidel
         end do
      end do
   end do
   iter=iter+1
   if(mod(iter,10).eq.0)write(*,'(1x,I4,2x,E10.3)')iter,dT
   if(iter.gt.500.or.dT.lt.1e-8)exit
end do
! recover temperatures from Kirchoff flow temperatures
do i=1,nx-1
   do j=1,ny-1
      write(*,10)i,j,(sqrt(0.2*T(i,j,k)+0.01)-0.1,k=1,nz-1)
   end do
end do
10 format(1x,2I3,<nx-1>F10.5)
end program

 

 

 


Viewing all articles
Browse latest Browse all 2652

Latest Images

Trending Articles



Latest Images

<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>