le
[català] [english]

PHC PARAGLIDING
Paraglider design software

One of the projects of Laboratori d'envol is the creation of an own software for the design of paragliders. This task has already started, with a first module (1) for the generation in plant of paraglides with near attack and near escape in elliptics ways. The idea is to carry out a serie of modules programmed in FORTRAN language, with reading of datum from files of text and obtaining of results in the form of files of text and files of drawing .dxf to visualize and to treat with programs conventional of CAD.

Modules in estude:

1- basic generation of planforms
2- optimization of planforms
3- generation of frontal geometry (lobule)
4- generation of aerodynamic profiles
5- study of the longitudinal equilibrium
6- calculation of the geometry 3D
7- geometry and equilibrium of suspension lines
8- fabric patterns
9- ...

Recently I have modified the code with possibility to generate cells of any measure, with variable thicknesses,
and the generation of the frontal lobule of the wing (modules 2 and 3).

The next improvements will be to generate completely the profiles, to describe the relative torsion, and to calculate the global incidence.

One of the interesting points is to draw the exact form of each panel, taking into account its development in
flat surface, the ovalization, the form of the profiles and their relative incidence.

See a sample of the results from the program at present (V 0.2 1-9-2006):


Dades de generació
Fig 1. Entry data for file para.dat

Planta i alçat
Fig 2.  Resulting drawing from the wing in plant and elevation. The suspension for the time being shows in
simplified form, without optimizing the ramifications.


Resum resultats
Fig 3. Summary parameters of model 002, a paraglide of 43 cells, 29 m2 of surface and 5,22 of aspect ratio. 

Source code program (FORTRAN g77 linux) version 0.2 (1-9-2006):

c***************************************************************
c      PHC PARAGLIDING
c      Pere Hernández Casellas
c      Laboratori d'envol
c      perehc AT geocities DOT com
c      Versió 0.1 experimental 2005-02-13
c      Versió 0.2 2006-09-01
c      FORTRAN g77 (GNU/Linux)
c***************************************************************

        program phcparagliding

        integer ncolor, ct
        integer linecolor,pointcolor
        real sep(100), xperfil(0:100), corda(0:100), gruix(0:100)
        real xf(0:100), yf(0:100),pend(0:100), alfa(0:100)
        real ax(0:100),ay(0:100),bx(0:100),by(0:100)
        real gruixm(0:100), grula(0:100), grulb(0:100)
        character*100 nomdelmodel

        area=0.

c       Aquest programa genera una planta i l'alçat de parapent doblement
c       el·liptic "parapent.dxf", que es pot editar en un programa de CAD
c       Les dades es contenen al fitxer de text "para.dat"

        open(unit=20,file='parapent.dxf')
        open(unit=22,file='parapent.txt')
        open(unit=23, file='para.dat' )

        pi=4.*atan(1.)

c       Definició de paràmetres geomètrics de planta
c       Lectura de fitxer de dades para.dat

        read (23,*) nomdelmodel
        read (23,*) a1 ! semieix major el·lipse vora d'atac
        read (23,*) b1 ! semieix menor el·lipse vora d'atac
        read (23,*) c1 ! centre el·lipse vora d'atac
        read (23,*) a2 ! semieix major el·lipse vora de fuga
        read (23,*) b2 ! semieix menor el·lipse vora de fuga
        read (23,*) c2 ! centre el·lipse vora de fuga

        read (23,*) nperfils ! nombre de perfils a situar
        ample=0. !inicialitza semiample ala
        do i=1,nperfils
        read (23,*) separacio, gruix(i)
        sep(i)=separacio
c        write (*,*) i, sep(i)       
        ample=ample+sep(i)
        end do
        gruix(nperfils+1)=0.

c        write (*,*) "Ample= ", ample ! semiample ala sense estabilitzador

c       Lectura paràmetres estabilitzador
        read (23,*) estab  ! ample estabilitzador
        read (23,*) esta1  ! disminució corda estabilitzador a vora d'atac
        read (23,*) esta2  ! ... a vora de fuga

        write(*,*) "Un moment...estic calculant..."

c       Calcula el nombre de calaixos total
        if(sep(1).ne.0.) then !nombre imparell de calaixos
        ncalaixos=2*nperfils+1
        end if
        if(sep(1).eq.0.) then !nombre parell de calaixos
        ncalaixos=2*nperfils
        end if
c        write (*,*) "Nombre de calaixos = ",ncalaixos

c       Entrades d'aire

        read (23,*) air1  ! cm a l'inici de la corda
        read (23,*) air2  ! llarg entrades d'aire
        read (23,*) ct    ! cel·les tancades a l'extrem


c       Dibuixa els perfils

        ncolor=9
c       Calcula posicio x en planta de cada perfil
        xperfil(0)=0.0
        do i=1,nperfils
        xperfil(i)=xperfil(i-1)+sep(i) ! la posició x del perfil i
c        write (*,*) i,sep(i),xperfil(i)
        end do
        xperfil(nperfils+1)=xperfil(nperfils)+estab

        xini=-xperfil(1)
        xfin=xperfil(nperfils)

c       Calcula i dibuixa la corda del perfil i
        do i=1,nperfils

        x=xperfil(i)

        yva=c1-b1*sqrt(1.-x*x/(a1*a1))
        yvf=c2+b2*sqrt(1.-x*x/(a2*a2))
        corda(i)=yvf-yva

        call line(x,yva,x,yvf,ncolor) !dibuixa la corda del perfil i
        call line(-x,yva,-x,yvf,ncolor) !dibuixa la corda del perfil -i

        end do

        yfinva=c1-b1*sqrt(1.-xfin*xfin/(a1*a1))
        yfinvf=c2+b2*sqrt(1.-xfin*xfin/(a2*a2))


c       call line(xfin,yfinva,xfin,yfinvf,ncolor)
c       call line(-xfin,yfinva,-xfin,yfinvf,ncolor)

c       Dibuixa la vora d'atac i vora de fuga

        ncolor=1

        do i=1,nperfils-1

        x=xperfil(i)

        yva=c1-b1*sqrt(1.-x*x/(a1*a1))
        yvf=c2+b2*sqrt(1.-x*x/(a2*a2))

        xx1=xperfil(i)
        yy1=yva
        zz1=yvf

        if(i.eq.1) then
        call line(-xx1,yy1,xx1,yy1,ncolor) ! vora d'atac c central
        call line(-xx1,zz1,xx1,zz1,ncolor) ! vora de fuga c central
        areacc=(yvf-yva)*2.*xperfil(1)     ! area calaix central
        end if

        xx2=xperfil(i+1)
        yy2=c1-b1*sqrt(1.-xx2*xx2/(a1*a1))
        zz2=c2+b2*sqrt(1.-xx2*xx2/(a2*a2))

        call line(xx1,yy1,xx2,yy2,ncolor) ! vora d'atac L
        call line(xx1,zz1,xx2,zz2,ncolor) ! vora de fuga L

        call line(-xx1,yy1,-xx2,yy2,ncolor) ! vora d'atac R
        call line(-xx1,zz1,-xx2,zz2,ncolor) ! vora de fuga R



c       Calcula l'Àrea, sense estabilitzadors ni calaix central

        corda1=yvf-yva
        corda2=zz2-yy2
        area=area+0.5*(corda1+corda2)*sep(i+1)

        end do

c       Dibuixa l'estabilo

        ncolor=5

        yfinva=c1-b1*sqrt(1.-xfin*xfin/(a1*a1))
        yfinvf=c2+b2*sqrt(1.-xfin*xfin/(a2*a2))

        call line(xfin,yfinva,xfin+estab,yfinva+esta1,ncolor)
        call line(xfin,yfinvf,xfin+estab,yfinvf+esta2,ncolor)
        call line(xfin+estab,yfinva+esta1,xfin+estab,yfinvf+esta2,
     +  ncolor)

        call line(-xfin,yfinva,-xfin-estab,yfinva+esta1,ncolor)
        call line(-xfin,yfinvf,-xfin-estab,yfinvf+esta2,ncolor)
        call line(-xfin-estab,yfinva+esta1,-xfin-estab,yfinvf+esta2,
     +  ncolor)

c       Area estabilo

        corda1e=yfinvf-yfinva
        corda2e=yfinvf+esta2-(yfinva+esta1)
        corda(nperfils+1)=corda2e !corda de l'estabilo
        areae=estab*0.5*(corda1e+corda2e) ! area 1 estabilo

c       Area total, span i allargament

        areat=(2.*area+2.*areae)+areacc
        span=2.*(ample+estab)
        allargament=span*span/areat

c       Dibuixa les entrades d'aire, proporcionals a la corda

        ncolor=11

        do i=1,nperfils-ct-1

        x=xperfil(i)

        yva=c1-b1*sqrt(1.-x*x/(a1*a1))
        yvf=c2+b2*sqrt(1.-x*x/(a2*a2))
        corda1=yvf-yva

        cordamax=b1+b2

        xx1=xperfil(i)
        yy1=yva+air1*corda1/cordamax
        zz1=yva+air2*corda1/cordamax

        xx2=xperfil(i+1)
        yy2=c1-b1*sqrt(1.-xx2*xx2/(a1*a1))
        zz2=c2+b2*sqrt(1.-xx2*xx2/(a2*a2))
        corda2=zz2-yy2

        yy2=yy2+air1*corda2/cordamax
        zz2=(c1-b1*sqrt(1.-xx2*xx2/(a1*a1)))+air2*corda2/cordamax

        if(i.eq.1) then
        call line(-xx1,yy1,xx1,yy1,ncolor) ! inici entrades d'aire
        call line(-xx1,zz1,xx1,zz1,ncolor) ! fi d'entrades d'aire
        end if

        call line(xx1,yy1,xx2,yy2,ncolor) ! inici entrades d'aire
        call line(xx1,zz1,xx2,zz2,ncolor) ! fi d'entrades d'aire

        call line(-xx1,yy1,-xx2,yy2,ncolor) ! inici entrades d'aire
        call line(-xx1,zz1,-xx2,zz2,ncolor) ! fi d'entrades d'aire

        end do

c       Dibuixa lobul de l'ala en vista frontal

        read (23,*) paf
        read (23,*) pbf
        read (23,*) py0
        read (23,*) pyk

c        write(*,*) paf, pbf, py0, pyk
        xllarg=0.

c      do i=1,nperfils+1
        i=1
        xllarg=0.


c       calcul previ de longitud x maxima projectada
        xllarg=0.
        delta=0.
        j=0
        do xi=0.,ample+estab,0.001 !increment x per calcular longituds
        xx1=xi
        xx2=xi+0.001
        yy1=pbf*sqrt(1.-((xx1*xx1)/(paf*paf)))+py0+pyk*xx1
        yy2=pbf*sqrt(1.-((xx2*xx2)/(paf*paf)))+py0+pyk*xx2
        delta=sqrt(((xx2-xx1)*(xx2-xx1))+((yy2-yy1)*(yy2-yy1)))
        xllarg=xllarg+delta
        if(xllarg.ge.xperfil(nperfils+1)) then
        j=j+1
        if(j.eq.1) then
c       write(*,*) xllarg, " ", nperfils+1, " ",xperfil(nperfils+1)
        xmp=xx2 ! longitud maxima projectada
        xllargf=xllarg
        end if
        j=j+1
        end if
        end do
c        write(*,*) "xllarg=",xllargf," ",nperfils," x_maxprojectat=",xmp

c       calcula coordenades frontals xf yf al perfil i

        do i=0,nperfils+1
        xllarg=0.
        delta=0.
        j=0
        do xi=0.,ample+estab,0.001 !increment x per calcular longituds
        xx1=xi
        xx2=xi+0.001
        yy1=pbf*sqrt(1.-((xx1*xx1)/(paf*paf)))+py0+pyk*xx1
        yy2=pbf*sqrt(1.-((xx2*xx2)/(paf*paf)))+py0+pyk*xx2
        delta=sqrt(((xx2-xx1)*(xx2-xx1))+((yy2-yy1)*(yy2-yy1)))
        xllarg=xllarg+delta
        if(xllarg.ge.xperfil(i)) then
        if(j.eq.1) then
        xf(i)=0.5*(xx1+xx2)
        yf(i)=0.5*(yy1+yy2)
        pend(i)=(yy2-yy1)/(xx2-xx1)
        xllargf=xllarg
c        write(*,*) xllargf, i, xf(i), yf(i), pend(i)
        end if
        j=j+1
        end if
        end do
        end do
        write (*,*) "OK"

c       Dibuixa el lòbul frontal de l'ala
        ncolor=11
        do i=0,nperfils

        xx1=xf(i)
        yy1=-yf(i)
        xx2=xf(i+1)
        yy2=-yf(i+1)

        call line(xx1,yy1,xx2,yy2,ncolor)
        call line(-xx1,yy1,-xx2,yy2,ncolor)

        end do

c       Dibuixa la posició dels perfils
c       Criteri perfil perpendicular a linea mitja del lobul

        ax(nperfils+1)=xf(nperfils+1)
        ay(nperfils+1)=yf(nperfils+1)
        bx(nperfils+1)=xf(nperfils+1)
        by(nperfils+1)=yf(nperfils+1)

        do i=1,nperfils

        gruixm(i)=(gruix(i)/100.)*corda(i)
        grula(i)=0.7*gruixm(i)
        grulb(i)=0.3*gruixm(i)

        gruixm(i+1)=(gruix(i+1)/100.)*corda(i+1)
        grula(i+1)=0.7*gruixm(i+1)
        grulb(i+1)=0.3*gruixm(i+1)


c        write(*,*) i,gruix(i),gruixmax, corda(i), xf(i),yf(i)
        alfa(i)=-atan(pend(i))
        alfa(i+1)=-atan(pend(i+1))
        ax(i)=xf(i)+grula(i)*sin(alfa(i))
        ay(i)=yf(i)+grula(i)*cos(alfa(i))
        bx(i)=xf(i)-grulb(i)*sin(alfa(i))
        by(i)=yf(i)-grulb(i)*cos(alfa(i))
       
        ax(i+1)=xf(i+1)+grula(i+1)*sin(alfa(i+1))
        ay(i+1)=yf(i+1)+grula(i+1)*cos(alfa(i+1))
        bx(i+1)=xf(i+1)-grulb(i+1)*sin(alfa(i+1))
        by(i+1)=yf(i+1)-grulb(i+1)*cos(alfa(i+1))

c       Perfils en vista frontal
        ncolor=3
        call line(ax(i),-ay(i),bx(i),-by(i),ncolor)
        call line(-ax(i),-ay(i),-bx(i),-by(i),ncolor)

c       Extrados A i intradós B en vista frontal
        ncolor=10
        call line(ax(i),-ay(i),ax(i+1),-ay(i+1),ncolor)
        call line(bx(i),-by(i),bx(i+1),-by(i+1),ncolor)
        call line(-ax(i),-ay(i),-ax(i+1),-ay(i+1),ncolor)
        call line(-bx(i),-by(i),-bx(i+1),-by(i+1),ncolor)

        end do

c       calaix central
        call line(-ax(1),-ay(1),ax(1),-ay(1),ncolor)
        call line(-bx(1),-by(1),bx(1),-by(1),ncolor)

c       Lectura de dades conus de suspentatge

        read(23,*) conus ! alçada conus de suspentatge
        read(23,*) maillon !distancia entra maillons

        ac1=yf(0)
        ac2=conus-ac1
        arx=-0.5*maillon
        ary=-ac2
        alx=0.5*maillon
        aly=-ac2

c       Dibuixa conus de suspentatge simplificat

        do i=1,nperfils+1

        xx1=alx
        yy1=aly
        xx2=bx(i)
        yy2=by(i)
       
        call line(xx1,-yy1,xx2,-yy2,9)
        call line(xx1,-yy1,xx2,-yy2,9)
        call line(-xx1,-yy1,-xx2,-yy2,9)
        call line(-xx1,-yy1,-xx2,-yy2,9)
       
        end do


c       Escriu resum de paràmetres de l'ala
10      CONTINUE
        write (*,*) "Laboratori d'envol PHC PARAGLIDING"
        write (*,*) "Pere Hernández Casellas"
        write (*,*)
        write (*,*) "Model: " , nomdelmodel
        write (*,*) "Nombre de calaixos=", ncalaixos
        write (*,*) "corda central (cm) =", b1+b2+c2-c1
        write (*,*) "corda extrem (cm) =", corda1e
        write (*,*) "corda estabilitzador (cm) =", corda2e
        write (*,*) "amplada ala (span) (m)=", 2.*(ample+estab)/100.
        write (*,*) "amplada projectada (m)=", 2.*xmp/100.
        write (*,*) "àrea total (m2)=", areat/10000.
        write (*,*) "àrea ccentral =", areacc/10000.
        write (*,*) "A/R allargament en planta=", allargament
        write (*,*) "conus suspentatge=", conus

        write(*,*) "N perfil ","Corda ","Gruix ", "xf "
        do i=1,nperfils+1
        write(*,*) i, corda(i), gruix(i),"% ",xf(i)
        end do



!###########################################################
c     Close the output .dxf file

      write(20,'(/,A,/,I1,/,A)') "ENDSEC",0,"EOF"

c     Close units

      close (20)
      close (22)

      end

!###################################################################

      SUBROUTINE line(p1x,p1y,p2x,p2y,linecolor)
c     line P1-P2
      integer linecolor
      write(20,'(A,/,I1,/,A)') "LINE",8,"default"
      write(20,'(I1,/,A)') 6,"CONTINUOUS"
      write(20,'(I2,/,F6.1,/,I2,/,F6.1)') 10,p1x,20,-p1y
      write(20,'(I2,/,F6.1,/,I2,/,F6.1)') 11,p2x,21,-p2y
      write(20,'(I2,/,I2,/,I2,/,I2,/,I2)') 39,0,62,linecolor,0

      return
      end


El fitxer de dades para.dat:

Laboratori_002
605  ! semieiex major el·lipse vora d'atac
140  ! semieiex menor el·lipse vora d'atac
200  ! centre el·lipse vora d'atac
700  ! semieix major el·lipse vora de fuga
80   ! semieiex menor el·lipse vora de fuga
260  ! centre el·lipse vora de fuga
21   ! nombre de perfils a situar
15   18   ! perfil 1, separacio relativa respecte centre, gruix %
30   18   ! perfil 2, separacio relativa respecte perfil anterior, gruix %
30   18   ! perfil 3
30   18   ! perfil 4
30   17.5 ! perfil 5
30   17.5 ! perfil 6
30   17   ! perfil 7
30   17   ! perfil 8
30   17   ! perfil 9
30   17   ! perfil 10
30   16   ! perfil 11
30   16   ! perfil 12
30   16   ! perfil 13
30   16   ! perfil 14
30   15   ! perfil 15
25   15   ! perfil 16
25   15   ! perfil 17
25   14   ! perfil 18
25   14   ! perfil 19
25   14   ! perfil 20
25   13   ! perfil 21
30   ! ample de l'estabilitzador
38   ! disminució de corda a vora d'atac
-30  ! disminució de corda a vora de fuga
3    ! cm a l'inici entrada aire
15   ! llarg entrada aire
1    ! cel·les tancades a l'extrem
600  ! parametre a elipse frontal
300  ! parametre b elipse frontal
0    ! parametre y0 recta compensacio
-0.01 !parametre pendent recta de compensacio
755  !conus de suspentatge
43   !separació ancoratges arnés


index