PlotBasisFunc Subroutine

private subroutine PlotBasisFunc(me, first, last, d, plotRes, title, work, fname, terminal, showPlot)

This subroutine plots the basis functions or their th order derivatives having index from first to last by computing at interpolation points defined by plotRes, and print the image file into "|cwd|/data/work/fname.ext" if the workspace work is presented, "|cwd|/data/img/fname.ext" if else. Plotting requires GNUPlot installed on your computer. The input parameter terminal set the output terminal of GNUPlot.

Arguments

Type IntentOptional AttributesName
class(basis), intent(in) :: me
integer, intent(in), optional :: first

First index to be plotted

integer, intent(in), optional :: last

Last index to be plotted

integer, intent(in), optional :: d

Derivatives degree

integer, intent(in), optional :: plotRes

Resolution of the calculation, Default = 100

character(len=*), intent(in), optional :: title

Title of the graph, Default = "Basis functions"

character(len=*), intent(in), optional :: work

Current work name to create folder

character(len=*), intent(in), optional :: fname

Filename of the *.png output, if GNUPlot terminal is png. Default = "BasisFunctions"

character(len=*), intent(in), optional :: terminal

GNUPlot terminal, Default = wxt

logical, intent(in), optional :: showPlot

Key to open created png files


Contents

Source Code


Source Code

        subroutine PlotBasisFunc(me,first,last,d,plotRes,title,work,fname,terminal,showPlot)
            ! Variables
            class(basis), intent(in)            :: me
            integer, intent(in), optional       :: first    !< First index to be plotted
            integer, intent(in), optional       :: last     !< Last index to be plotted
            integer, intent(in), optional       :: d        !< Derivatives degree
            integer, intent(in), optional       :: plotRes  !< Resolution of the calculation, Default = 100
            character(*), intent(in), optional  :: title    !< Title of the graph, Default = "Basis functions"
            character(*), intent(in), optional  :: work     !< Current work name to create folder
            character(*), intent(in), optional  :: fname    !< Filename of the \*.png output, if *GNUPlot* terminal is `png`. Default = "BasisFunctions"
            character(*), intent(in), optional  :: terminal !< *GNUPlot* terminal, Default = ` wxt `
            logical, intent(in), optional       :: showPlot !< Key to open created ` png ` files
            !locals
            integer :: i, j, k, m, r, f, l, dd, iunit
            character(200) :: fn, ptitle, fmt1, fmt2, yaxis
            character(1024) :: pl 
            real(wp) ::du, u
            real(wp), allocatable :: array(:), bf(:,:)
            logical :: openfile
            type(gpf):: gp
            
            !set gnuplot terminal
            !if(present(terminal)) gp%term_type=trim(terminal)
            openfile    = .false.   ; if(present(showPlot))     openfile    = showPlot
            r = 100; if(present(plotRes)) r=plotRes
            f = 0; if(present(first)) f=first
            l = me%n; if(present(last)) l=last
            dd = 0; if(present(d)) dd=d
            allocate(bf(0:me%p,0:dd))
            allocate(array(0:l-f))

            write(fn, '("_p",i0,"_d",i0,"_idx",i0,"_to_",i0)') me%p,dd,f,l
            if(present(fname)) then
                fn = fname // trim(fn)
            else
                fn = "BasisFunctions" // trim(fn)
            end if
 
            if(present(work)) then
                call gp%setoutput(folder="data/"//trim(work)//"/img/", fname=fn, term=terminal)
            else
                call gp%setoutput(folder="data/img/", fname=fn, term=terminal)
            end if
            
            !set plot title
            ptitle = "Basis functions"; if(present(title)) ptitle=title
            call gp%title(trim(ptitle))
            
            !set headers format
            write(fmt1,'(a,i2.1,a)') '("x-values",', l-f+1, '(1x,"N_{",i0,"}"))'
            !set data format
            write(fmt2,'(a,i2.1,a)') '(', l-f+2, '(2x,e23.15E3))'

            open(newunit=iunit,file='data.txt')
            !write headers
            write(iunit,trim(fmt1)) (j,j=f,l) 
            
            !calculation and writing data
            du = ( me%kv(me%m) - me%kv(0) ) / r
            do i=0,r
                u = i * du
                k = me%FindSpan(u)
                call me%DersBasisFuns(u,dd,bf,k)
                array = 0.0_wp; m = 0
                do j=f,l
                    if(k-me%p <= j .and. j <= k)then
                        array(j) = bf(m,dd)
                        m = m+1
                    end if
                end do
                write(iunit,fmt2) u, (array(j),j=f,l)
            end do
            
            call gp%xlabel('u')
            if(dd>0)then
                write(yaxis,'("N_{i}^{(",i0,")}(u)")') dd
            else
                yaxis = "N_{i}(u)"
            end if
            call gp%add_script('set ylabel "'//trim(yaxis)//'" rotate by 0')


            call gp%add_script('set tics') 
            call gp%add_script('set colorsequence podo') 
            
            !set plotting script
            write(pl,'("plot for [i=2:",i0,"] ",a," using 1:i w lines t columnheader(i) lw 2.5")') l-f+2, '"data.txt"'
            call gp%add_script(pl)
            call gp%run_script()
            call gp%reset()
            if(present(terminal) .and. openfile) then
                if(trim(terminal)=="png") then
                    call execute_command_line(trim(gp%fullpath))
                end if
            end if
            close(iunit,status='delete')
            
        end subroutine PlotBasisFunc