NAG Library Manual, Mark 29
Interfaces:  FL   CL   CPP   AD 

NAG FL Interface Introduction
Example description
    Program d06abfe

!     D06ABF Example Program Text

!     Mark 29.0 Release. NAG Copyright 2023.

!     .. Use Statements ..
      Use nag_library, Only: d06abf, f06epf, nag_wp, x01aaf
!     .. Implicit None Statement ..
      Implicit None
!     .. Parameters ..
      Integer, Parameter               :: meshout = 7, nin = 5, nout = 6
!     .. Local Scalars ..
      Real (Kind=nag_wp)               :: c, d, dnvint, r, s, theta, theta_i
      Integer                          :: i, i1, ic, ifail, itrace, j, liwork, &
                                          lrwork, nearest, nedge, nelt,        &
                                          nelt_near, npropa, nrae, nv, nvb,    &
                                          nvint, nvmax, nv_near
      Character (1)                    :: pmesh
!     .. Local Arrays ..
      Real (Kind=nag_wp), Allocatable  :: coor(:,:), rwork(:), weight(:)
      Real (Kind=nag_wp)               :: t(2)
      Integer, Allocatable             :: conn(:,:), edge(:,:), iwork(:)
!     .. Intrinsic Procedures ..
      Intrinsic                        :: cos, real, sin, tan
!     .. Executable Statements ..
      Write (nout,*) 'D06ABF Example Program Results'

!     Skip heading in data file
      Read (nin,*)

!     Reading of the geometry:
!          number of points on RAE aerofoil data;
!          number of points on circular boundary;
!          maximum number of vertices.

      Read (nin,*) nrae, nvint, nvmax
      Read (nin,*) pmesh

      nvb = nvint + 2*nrae
      nedge = nvb

      lrwork = 12*nvmax + 15
      liwork = 6*nedge + 32*nvmax + 2*nvb + 78
      Allocate (coor(2,nvmax),rwork(lrwork),weight(nvint),conn(3,2*nvmax+5),   &
        edge(3,nedge),iwork(liwork))

!     Circular outer boundary, radius 3 and centre (1,0)
      theta = 2.0_nag_wp*x01aaf(r)/real(nvint,kind=nag_wp)
      r = 3.0_nag_wp
      t(1) = 1.0_nag_wp
      Do i = 1, nvint
        theta_i = theta*real(i-1,kind=nag_wp)
        coor(1,i) = r*cos(theta_i) + t(1)
        coor(2,i) = r*sin(theta_i)
      End Do

!     Read data for aerofoil RAE 2822
      Do i = 1, nrae
        Read (nin,*) i1, coor(1,nvint+i), coor(2,nvint+i)
      End Do

!     Transform RAE 2822 for secondary foil
      theta = x01aaf(theta)/12.0_nag_wp
      c = cos(theta)
      s = sin(theta)
      ic = nvint + nrae
!     Copy and rotate coordinates by theta = pi/12
      coor(1:2,ic+1:ic+nrae) = coor(1:2,nvint+1:ic)
      Call f06epf(nrae,coor(1,ic+1),2,coor(2,ic+1),2,c,s)
!     Reduce by 0.4 and translate to distance 0.25 from intercept at (0.75,0)
      d = 0.4_nag_wp
      t(1) = 0.75_nag_wp + 0.25_nag_wp*c
      t(2) = -0.25_nag_wp*s
      Do i = 1, nrae
        coor(1:2,ic+i) = d*coor(1:2,ic+i) + t(1:2)
      End Do

!     Boundary edges
      Do i = 1, nedge
        edge(1,i) = i
        edge(2,i) = i + 1
        edge(3,i) = 0
      End Do
!     Tie up end of three boundary edges
      edge(2,nvint) = 1
      edge(2,nvint+nrae) = nvint + 1
      edge(2,nedge) = nvint + nrae + 1

!     Initialize mesh control parameters

      itrace = 0

!     Generation of interior vertices on the
!     RAE airfoil's wake

      dnvint = 2.5E0_nag_wp/real(nvint+1,kind=nag_wp)

      Do i = 1, nvint
        i1 = nvb + i
        coor(1,i1) = 1.38E0_nag_wp + real(i,kind=nag_wp)*dnvint
        coor(2,i1) = -tan(theta)*(coor(1,i1)-0.75_nag_wp)
      End Do

      weight(1:nvint) = 0.01E0_nag_wp

      Write (nout,*)

!      Loop on the propagation coef

pcoef: Do j = 1, 4

        nearest = 250
        Select Case (j)
        Case (1)
          npropa = -5
        Case (2)
          npropa = -1
        Case (3)
          npropa = 1
        Case Default
          npropa = 5
        End Select

!       Call to the 2D Delaunay-Voronoi mesh generator

        ifail = 0
        Call d06abf(nvb,nvint,nvmax,nedge,edge,nv,nelt,coor,conn,weight,       &
          npropa,itrace,rwork,lrwork,iwork,liwork,ifail)

        Write (nout,99999) 'Mesh characteristics with NPROPA =', npropa
        nv_near = ((nv+nearest/2)/nearest)*nearest
        nelt_near = ((nelt+nearest/2)/nearest)*nearest
        Write (nout,99998) 'NV  ', nv_near, nearest
        Write (nout,99998) 'NELT', nelt_near, nearest

        If (pmesh=='Y') Then
!         Output the mesh in a form suitable for printing

          If (j==1) Then
            Write (meshout,*) '# D06ABF Example Program Mesh results'
          End If
          Write (meshout,99999) '# Mesh line segments for NPROPA =', npropa
          Do i = 1, nelt
            Write (meshout,99997) coor(1,conn(1,i)), coor(2,conn(1,i))
            Write (meshout,99997) coor(1,conn(2,i)), coor(2,conn(2,i))
            Write (meshout,99997) coor(1,conn(3,i)), coor(2,conn(3,i))
            Write (meshout,99997) coor(1,conn(1,i)), coor(2,conn(1,i))
            Write (meshout,*)
          End Do
          Write (meshout,*)
        End If

      End Do pcoef

99999 Format (1X,A,I6)
99998 Format (1X,A5,' = ',I10,' to the nearest ',I3)
99997 Format (2(2X,E13.6))
    End Program d06abfe