1c ---------------------------------------------------------------------------
2c
3c   Gmsh Fortran tutorial 6
4c
5c   Transfinite meshes
6c
7c ---------------------------------------------------------------------------
8
9      include "gmshf.h"
10
11      program main
12      use, intrinsic :: iso_c_binding
13      use gmsh_fortran
14
15      implicit none
16      integer(c_int) :: ierr, argc, itmp, i, status, len
17      integer(c_int) :: p1, p2, l1, l2, l3
18      real(c_double) :: lc
19
20      integer(c_int) :: cl1(4) = (/4, 1, -2, 3/)
21      integer(c_int) :: cl2(6) = (/2, -1, 0, 0, 0, -3/)
22      integer(c_int) :: cl3(4) = (/13, 10, 11, 12/)
23      integer(c_int) :: s1(1) = (/1/)
24      integer(c_int) :: s2(1) = (/-2/)
25      integer(c_int) :: s3(1) = (/14/)
26
27      integer(c_int) :: r4(4) = (/2, 1, 1, 4/)
28      integer(c_int) :: ts(4) = (/1, 2, 3, 4/)
29
30      type(c_ptr), allocatable :: argv(:)
31
32      type string
33        character(len = :, kind = c_char), allocatable :: item
34      end type string
35      type(string), allocatable, target :: tmp(:)
36
37      character(80) :: buf
38
39      lc = 1d - 2
40
41      argc = command_argument_count()
42      allocate(argv(argc + 2))
43      allocate(tmp(argc + 1))
44
45      do i = 0, argc
46        call get_command_argument(i, buf, len)
47        tmp(i + 1) % item = buf(1 : len) // c_null_char
48        argv(i + 1) = c_loc(tmp(i + 1) % item)
49      enddo
50      argv(argc + 2) = c_null_ptr
51
52      call gmshInitialize(argc + 1, argv, 1, 0, ierr)
53
54      call gmshModelAdd("t6" // c_null_char, ierr)
55
56      itmp = gmshModelGeoAddPoint(0d0, 0d0, 0d0, lc, 1, ierr)
57      itmp = gmshModelGeoAddPoint(0.1d0, 0d0, 0d0, lc, 2, ierr)
58      itmp = gmshModelGeoAddPoint(0.1d0, 0.3d0, 0d0, lc, 3, ierr)
59      itmp = gmshModelGeoAddPoint(0d0, 0.3d0, 0d0, lc, 4, ierr)
60
61      itmp = gmshModelGeoAddLine(1, 2, 1, ierr)
62      itmp = gmshModelGeoAddLine(3, 2, 2, ierr)
63      itmp = gmshModelGeoAddLine(3, 4, 3, ierr)
64      itmp = gmshModelGeoAddLine(4, 1, 4, ierr)
65
66      itmp = gmshModelGeoAddCurveLoop(cl1, 4_8, 1, 0, ierr)
67      itmp = gmshModelGeoAddPlaneSurface(s1, 1_8, 1, ierr)
68
69      call gmshModelGeoRemove(r4, 4_8, 0, ierr)
70
71      p1 = gmshModelGeoAddPoint(-0.05d0, 0.05d0, 0d0, lc, -1, ierr)
72      p2 = gmshModelGeoAddPoint(-0.05d0, 0.1d0, 0d0, lc, -1, ierr)
73
74      l1 = gmshModelGeoAddLine(1, p1, -1, ierr)
75      l2 = gmshModelGeoAddLine(p1, p2, -1, ierr)
76      l3 = gmshModelGeoAddLine(p2, 4, -1, ierr)
77
78      cl2(3) = l1
79      cl2(4) = l2
80      cl2(5) = l3
81      itmp = gmshModelGeoAddCurveLoop(cl2, 6_8, 2, 0, ierr)
82      itmp = gmshModelGeoAddPlaneSurface(s2, 1_8, 1, ierr)
83
84      call gmshModelGeoMeshSetTransfiniteCurve(2, 20,
85     &     "Progression" // c_null_char, 1d0, ierr)
86      call gmshModelGeoMeshSetTransfiniteCurve(l1, 6,
87     &     "Progression" // c_null_char, 1d0, ierr)
88      call gmshModelGeoMeshSetTransfiniteCurve(l2, 6,
89     &     "Progression" // c_null_char, 1d0, ierr)
90      call gmshModelGeoMeshSetTransfiniteCurve(l3, 10,
91     &     "Progression" // c_null_char, 1d0, ierr)
92      call gmshModelGeoMeshSetTransfiniteCurve(1, 30,
93     &     "Progression" // c_null_char, -1.2d0, ierr)
94      call gmshModelGeoMeshSetTransfiniteCurve(3, 30,
95     &     "Progression" // c_null_char, 1.2d0, ierr)
96
97      call gmshModelGeoMeshSetTransfiniteSurface(1,
98     &     "Left" // c_null_char, ts, 4_8, ierr)
99      call gmshModelGeoMeshSetRecombine(2, 1, 45d0, ierr)
100
101      itmp = gmshModelGeoAddPoint(0.2d0, 0.2d0, 0d0, 1d0, 7, ierr)
102      itmp = gmshModelGeoAddPoint(0.2d0, 0.1d0, 0d0, 1d0, 8, ierr)
103      itmp = gmshModelGeoAddPoint(0d0, 0.3d0, 0d0, 1d0, 9, ierr)
104      itmp = gmshModelGeoAddPoint(0.25d0, 0.2d0, 0d0, 1d0, 10, ierr)
105      itmp = gmshModelGeoAddPoint(0.3d0, 0.1d0, 0d0, 1d0, 11, ierr)
106
107      itmp = gmshModelGeoAddLine(8, 11, 10, ierr)
108      itmp = gmshModelGeoAddLine(11, 10, 11, ierr)
109      itmp = gmshModelGeoAddLine(10, 7, 12, ierr)
110      itmp = gmshModelGeoAddLine(7, 8, 13, ierr)
111
112      itmp = gmshModelGeoAddCurveLoop(cl3, 4_8, 14, 0, ierr)
113      itmp = gmshModelGeoAddPlaneSurface(s3, 1_8, 15, ierr)
114
115      do i = 10, 13
116         call gmshModelGeoMeshSetTransfiniteCurve(i, 10,
117     &        "Progression" // c_null_char, 1d0, ierr)
118      enddo
119
120      call gmshModelGeoMeshSetTransfiniteSurface(15,
121     &     "Left" // c_null_char, ts, 0_8, ierr)
122
123      call gmshOptionSetNumber("Mesh.Smoothing" // c_null_char,
124     &     100d0, ierr)
125
126      call gmshModelGeoSynchronize(ierr)
127
128      call gmshModelMeshGenerate(2, ierr)
129      call gmshWrite("t6.msh" // c_null_char, ierr)
130
131c     call gmshFltkRun(ierr)
132
133      call gmshFinalize(ierr)
134
135      deallocate(tmp)
136      deallocate(argv)
137
138      stop
139      end
140